summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 17:25:40 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 17:25:40 +0000
commitcf7da1843c45a4c2df7a749f7886a2d2ba0ee92a (patch)
tree18dcde1a8d1f5570a77cd0c361de3b490d02c789
parentInitial commit. (diff)
downloadsphinx-cf7da1843c45a4c2df7a749f7886a2d2ba0ee92a.tar.xz
sphinx-cf7da1843c45a4c2df7a749f7886a2d2ba0ee92a.zip
Adding upstream version 7.2.6.upstream/7.2.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--AUTHORS95
-rw-r--r--CHANGES9019
-rw-r--r--CODE_OF_CONDUCT78
-rw-r--r--EXAMPLES479
-rw-r--r--LICENSE67
-rw-r--r--PKG-INFO147
-rw-r--r--README.rst63
-rw-r--r--doc/Makefile20
-rw-r--r--doc/_static/Makefile6
-rw-r--r--doc/_static/bookcover.pngbin0 -> 27523 bytes
-rw-r--r--doc/_static/conf.py.txt346
-rw-r--r--doc/_static/favicon.svg8
-rw-r--r--doc/_static/more.pngbin0 -> 1351 bytes
-rw-r--r--doc/_static/sphinx.pngbin0 -> 34213 bytes
-rw-r--r--doc/_static/themes/agogo.pngbin0 -> 25792 bytes
-rw-r--r--doc/_static/themes/alabaster.pngbin0 -> 32356 bytes
-rw-r--r--doc/_static/themes/bizstyle.pngbin0 -> 27139 bytes
-rw-r--r--doc/_static/themes/classic.pngbin0 -> 39927 bytes
-rw-r--r--doc/_static/themes/fullsize/agogo.pngbin0 -> 56954 bytes
-rw-r--r--doc/_static/themes/fullsize/alabaster.pngbin0 -> 40248 bytes
-rw-r--r--doc/_static/themes/fullsize/bizstyle.pngbin0 -> 75192 bytes
-rw-r--r--doc/_static/themes/fullsize/classic.pngbin0 -> 72597 bytes
-rw-r--r--doc/_static/themes/fullsize/haiku.pngbin0 -> 84200 bytes
-rw-r--r--doc/_static/themes/fullsize/nature.pngbin0 -> 32266 bytes
-rw-r--r--doc/_static/themes/fullsize/pyramid.pngbin0 -> 102717 bytes
-rw-r--r--doc/_static/themes/fullsize/scrolls.pngbin0 -> 88111 bytes
-rw-r--r--doc/_static/themes/fullsize/sphinx_rtd_theme.pngbin0 -> 39411 bytes
-rw-r--r--doc/_static/themes/fullsize/sphinxdoc.pngbin0 -> 84439 bytes
-rw-r--r--doc/_static/themes/fullsize/traditional.pngbin0 -> 91744 bytes
-rw-r--r--doc/_static/themes/haiku.pngbin0 -> 43184 bytes
-rw-r--r--doc/_static/themes/nature.pngbin0 -> 28536 bytes
-rw-r--r--doc/_static/themes/pyramid.pngbin0 -> 38805 bytes
-rw-r--r--doc/_static/themes/scrolls.pngbin0 -> 27800 bytes
-rw-r--r--doc/_static/themes/sphinx_rtd_theme.pngbin0 -> 29138 bytes
-rw-r--r--doc/_static/themes/sphinxdoc.pngbin0 -> 30225 bytes
-rw-r--r--doc/_static/themes/traditional.pngbin0 -> 32258 bytes
-rw-r--r--doc/_static/translation.pngbin0 -> 16371 bytes
-rw-r--r--doc/_static/translation.puml16
-rw-r--r--doc/_static/translation.svg42
-rw-r--r--doc/_static/tutorial/lumache-autosummary.pngbin0 -> 26500 bytes
-rw-r--r--doc/_static/tutorial/lumache-first-light.pngbin0 -> 52126 bytes
-rw-r--r--doc/_static/tutorial/lumache-furo.pngbin0 -> 51223 bytes
-rw-r--r--doc/_static/tutorial/lumache-py-function-full.pngbin0 -> 71741 bytes
-rw-r--r--doc/_static/tutorial/lumache-py-function.pngbin0 -> 41828 bytes
-rw-r--r--doc/_templates/contents.html8
-rw-r--r--doc/_themes/sphinx13/layout.html60
-rw-r--r--doc/_themes/sphinx13/static/sphinx13.css362
-rw-r--r--doc/_themes/sphinx13/static/sphinxheader.pngbin0 -> 11719 bytes
-rw-r--r--doc/_themes/sphinx13/theme.conf4
-rw-r--r--doc/authors.rst9
-rw-r--r--doc/changes.rst22
-rw-r--r--doc/conf.py244
-rw-r--r--doc/development/builders.rst34
-rw-r--r--doc/development/index.rst24
-rw-r--r--doc/development/overview.rst32
-rw-r--r--doc/development/templating.rst478
-rw-r--r--doc/development/theming.rst342
-rw-r--r--doc/development/tutorials/autodoc_ext.rst141
-rw-r--r--doc/development/tutorials/examples/README.rst11
-rw-r--r--doc/development/tutorials/examples/autodoc_intenum.py58
-rw-r--r--doc/development/tutorials/examples/helloworld.py19
-rw-r--r--doc/development/tutorials/examples/recipe.py159
-rw-r--r--doc/development/tutorials/examples/todo.py135
-rw-r--r--doc/development/tutorials/helloworld.rst189
-rw-r--r--doc/development/tutorials/index.rst17
-rw-r--r--doc/development/tutorials/recipe.rst227
-rw-r--r--doc/development/tutorials/todo.rst367
-rw-r--r--doc/examples.rst5
-rw-r--r--doc/extdev/appapi.rst473
-rw-r--r--doc/extdev/builderapi.rst46
-rw-r--r--doc/extdev/collectorapi.rst9
-rw-r--r--doc/extdev/deprecated.rst1911
-rw-r--r--doc/extdev/domainapi.rst32
-rw-r--r--doc/extdev/envapi.rst58
-rw-r--r--doc/extdev/i18n.rst97
-rw-r--r--doc/extdev/index.rst218
-rw-r--r--doc/extdev/logging.rst66
-rw-r--r--doc/extdev/markupapi.rst152
-rw-r--r--doc/extdev/nodes.rst103
-rw-r--r--doc/extdev/parserapi.rst38
-rw-r--r--doc/extdev/projectapi.rst9
-rw-r--r--doc/extdev/utils.rst37
-rw-r--r--doc/faq.rst354
-rw-r--r--doc/glossary.rst103
-rw-r--r--doc/index.rst117
-rw-r--r--doc/internals/code-of-conduct.rst5
-rw-r--r--doc/internals/contributing.rst332
-rw-r--r--doc/internals/index.rst15
-rw-r--r--doc/internals/organization.rst56
-rw-r--r--doc/internals/release-process.rst125
-rw-r--r--doc/latex.rst1841
-rw-r--r--doc/make.bat32
-rw-r--r--doc/man/index.rst22
-rw-r--r--doc/man/sphinx-apidoc.rst171
-rw-r--r--doc/man/sphinx-autogen.rst97
-rw-r--r--doc/man/sphinx-build.rst355
-rw-r--r--doc/man/sphinx-quickstart.rst169
-rw-r--r--doc/support.rst20
-rw-r--r--doc/tutorial/automatic-doc-generation.rst165
-rw-r--r--doc/tutorial/deploying.rst281
-rw-r--r--doc/tutorial/describing-code.rst276
-rw-r--r--doc/tutorial/end.rst6
-rw-r--r--doc/tutorial/first-steps.rst92
-rw-r--r--doc/tutorial/getting-started.rst120
-rw-r--r--doc/tutorial/index.rst39
-rw-r--r--doc/tutorial/more-sphinx-customization.rst78
-rw-r--r--doc/tutorial/narrative-documentation.rst130
-rw-r--r--doc/usage/advanced/intl.rst372
-rw-r--r--doc/usage/advanced/websupport/api.rst80
-rw-r--r--doc/usage/advanced/websupport/index.rst16
-rw-r--r--doc/usage/advanced/websupport/quickstart.rst255
-rw-r--r--doc/usage/advanced/websupport/searchadapters.rst49
-rw-r--r--doc/usage/advanced/websupport/storagebackends.rst49
-rw-r--r--doc/usage/builders/index.rst565
-rw-r--r--doc/usage/configuration.rst3094
-rw-r--r--doc/usage/extensions/autodoc.rst853
-rw-r--r--doc/usage/extensions/autosectionlabel.rst56
-rw-r--r--doc/usage/extensions/autosummary.rst364
-rw-r--r--doc/usage/extensions/coverage.rst99
-rw-r--r--doc/usage/extensions/doctest.rst385
-rw-r--r--doc/usage/extensions/duration.rst11
-rw-r--r--doc/usage/extensions/example_google.py309
-rw-r--r--doc/usage/extensions/example_google.rst17
-rw-r--r--doc/usage/extensions/example_numpy.py350
-rw-r--r--doc/usage/extensions/example_numpy.rst17
-rw-r--r--doc/usage/extensions/extlinks.rst69
-rw-r--r--doc/usage/extensions/githubpages.rst16
-rw-r--r--doc/usage/extensions/graphviz.rst239
-rw-r--r--doc/usage/extensions/ifconfig.rst38
-rw-r--r--doc/usage/extensions/imgconverter.rst55
-rw-r--r--doc/usage/extensions/index.rst81
-rw-r--r--doc/usage/extensions/inheritance.rst174
-rw-r--r--doc/usage/extensions/intersphinx.rst250
-rw-r--r--doc/usage/extensions/linkcode.rst51
-rw-r--r--doc/usage/extensions/math.rst320
-rw-r--r--doc/usage/extensions/napoleon.rst574
-rw-r--r--doc/usage/extensions/todo.rst62
-rw-r--r--doc/usage/extensions/viewcode.rst106
-rw-r--r--doc/usage/index.rst20
-rw-r--r--doc/usage/installation.rst282
-rw-r--r--doc/usage/markdown.rst52
-rw-r--r--doc/usage/quickstart.rst348
-rw-r--r--doc/usage/restructuredtext/basics.rst631
-rw-r--r--doc/usage/restructuredtext/directives.rst1311
-rw-r--r--doc/usage/restructuredtext/domains.rst2303
-rw-r--r--doc/usage/restructuredtext/field-lists.rst78
-rw-r--r--doc/usage/restructuredtext/index.rst24
-rw-r--r--doc/usage/restructuredtext/roles.rst536
-rw-r--r--doc/usage/theming.rst364
-rw-r--r--pyproject.toml463
-rw-r--r--sphinx/__init__.py54
-rw-r--r--sphinx/__main__.py7
-rw-r--r--sphinx/addnodes.py605
-rw-r--r--sphinx/application.py1371
-rw-r--r--sphinx/builders/__init__.py667
-rw-r--r--sphinx/builders/_epub_base.py710
-rw-r--r--sphinx/builders/changes.py161
-rw-r--r--sphinx/builders/dirhtml.py53
-rw-r--r--sphinx/builders/dummy.py48
-rw-r--r--sphinx/builders/epub3.py301
-rw-r--r--sphinx/builders/gettext.py306
-rw-r--r--sphinx/builders/html/__init__.py1399
-rw-r--r--sphinx/builders/html/_assets.py146
-rw-r--r--sphinx/builders/html/transforms.py86
-rw-r--r--sphinx/builders/latex/__init__.py551
-rw-r--r--sphinx/builders/latex/constants.py210
-rw-r--r--sphinx/builders/latex/nodes.py37
-rw-r--r--sphinx/builders/latex/theming.py135
-rw-r--r--sphinx/builders/latex/transforms.py642
-rw-r--r--sphinx/builders/latex/util.py48
-rw-r--r--sphinx/builders/linkcheck.py641
-rw-r--r--sphinx/builders/manpage.py127
-rw-r--r--sphinx/builders/singlehtml.py202
-rw-r--r--sphinx/builders/texinfo.py229
-rw-r--r--sphinx/builders/text.py94
-rw-r--r--sphinx/builders/xml.py123
-rw-r--r--sphinx/cmd/__init__.py1
-rw-r--r--sphinx/cmd/build.py345
-rw-r--r--sphinx/cmd/make_mode.py181
-rw-r--r--sphinx/cmd/quickstart.py617
-rw-r--r--sphinx/config.py561
-rw-r--r--sphinx/deprecation.py66
-rw-r--r--sphinx/directives/__init__.py373
-rw-r--r--sphinx/directives/code.py482
-rw-r--r--sphinx/directives/other.py443
-rw-r--r--sphinx/directives/patches.py189
-rw-r--r--sphinx/domains/__init__.py406
-rw-r--r--sphinx/domains/c.py3906
-rw-r--r--sphinx/domains/changeset.py161
-rw-r--r--sphinx/domains/citation.py154
-rw-r--r--sphinx/domains/cpp.py8233
-rw-r--r--sphinx/domains/index.py126
-rw-r--r--sphinx/domains/javascript.py508
-rw-r--r--sphinx/domains/math.py152
-rw-r--r--sphinx/domains/python.py1769
-rw-r--r--sphinx/domains/rst.py299
-rw-r--r--sphinx/domains/std.py1123
-rw-r--r--sphinx/environment/__init__.py779
-rw-r--r--sphinx/environment/adapters/__init__.py1
-rw-r--r--sphinx/environment/adapters/asset.py15
-rw-r--r--sphinx/environment/adapters/indexentries.py187
-rw-r--r--sphinx/environment/adapters/toctree.py520
-rw-r--r--sphinx/environment/collectors/__init__.py72
-rw-r--r--sphinx/environment/collectors/asset.py147
-rw-r--r--sphinx/environment/collectors/dependencies.py57
-rw-r--r--sphinx/environment/collectors/metadata.py70
-rw-r--r--sphinx/environment/collectors/title.py61
-rw-r--r--sphinx/environment/collectors/toctree.py355
-rw-r--r--sphinx/errors.py127
-rw-r--r--sphinx/events.py121
-rw-r--r--sphinx/ext/__init__.py1
-rw-r--r--sphinx/ext/apidoc.py492
-rw-r--r--sphinx/ext/autodoc/__init__.py2850
-rw-r--r--sphinx/ext/autodoc/directive.py151
-rw-r--r--sphinx/ext/autodoc/importer.py342
-rw-r--r--sphinx/ext/autodoc/mock.py198
-rw-r--r--sphinx/ext/autodoc/preserve_defaults.py199
-rw-r--r--sphinx/ext/autodoc/type_comment.py140
-rw-r--r--sphinx/ext/autodoc/typehints.py219
-rw-r--r--sphinx/ext/autosectionlabel.py69
-rw-r--r--sphinx/ext/autosummary/__init__.py847
-rw-r--r--sphinx/ext/autosummary/generate.py754
-rw-r--r--sphinx/ext/autosummary/templates/autosummary/base.rst5
-rw-r--r--sphinx/ext/autosummary/templates/autosummary/class.rst29
-rw-r--r--sphinx/ext/autosummary/templates/autosummary/module.rst60
-rw-r--r--sphinx/ext/coverage.py400
-rw-r--r--sphinx/ext/doctest.py575
-rw-r--r--sphinx/ext/duration.py92
-rw-r--r--sphinx/ext/extlinks.py125
-rw-r--r--sphinx/ext/githubpages.py57
-rw-r--r--sphinx/ext/graphviz.py467
-rw-r--r--sphinx/ext/ifconfig.py81
-rw-r--r--sphinx/ext/imgconverter.py94
-rw-r--r--sphinx/ext/imgmath.py407
-rw-r--r--sphinx/ext/inheritance_diagram.py494
-rw-r--r--sphinx/ext/intersphinx.py742
-rw-r--r--sphinx/ext/linkcode.py77
-rw-r--r--sphinx/ext/mathjax.py126
-rw-r--r--sphinx/ext/napoleon/__init__.py474
-rw-r--r--sphinx/ext/napoleon/docstring.py1363
-rw-r--r--sphinx/ext/todo.py246
-rw-r--r--sphinx/ext/viewcode.py361
-rw-r--r--sphinx/extension.py82
-rw-r--r--sphinx/highlighting.py199
-rw-r--r--sphinx/io.py189
-rw-r--r--sphinx/jinja2glue.py221
-rw-r--r--sphinx/locale/.tx/config7
-rw-r--r--sphinx/locale/__init__.py231
-rw-r--r--sphinx/locale/ar/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ar/LC_MESSAGES/sphinx.mobin0 -> 7494 bytes
-rw-r--r--sphinx/locale/ar/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/bg/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/bg/LC_MESSAGES/sphinx.mobin0 -> 492 bytes
-rw-r--r--sphinx/locale/bg/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/bn/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/bn/LC_MESSAGES/sphinx.mobin0 -> 7591 bytes
-rw-r--r--sphinx/locale/bn/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/ca/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ca/LC_MESSAGES/sphinx.mobin0 -> 84364 bytes
-rw-r--r--sphinx/locale/ca/LC_MESSAGES/sphinx.po3698
-rw-r--r--sphinx/locale/cak/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/cak/LC_MESSAGES/sphinx.mobin0 -> 2391 bytes
-rw-r--r--sphinx/locale/cak/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/cs/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/cs/LC_MESSAGES/sphinx.mobin0 -> 7797 bytes
-rw-r--r--sphinx/locale/cs/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/cy/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/cy/LC_MESSAGES/sphinx.mobin0 -> 5686 bytes
-rw-r--r--sphinx/locale/cy/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/da/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/da/LC_MESSAGES/sphinx.mobin0 -> 12266 bytes
-rw-r--r--sphinx/locale/da/LC_MESSAGES/sphinx.po3698
-rw-r--r--sphinx/locale/de/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/de/LC_MESSAGES/sphinx.mobin0 -> 10680 bytes
-rw-r--r--sphinx/locale/de/LC_MESSAGES/sphinx.po3698
-rw-r--r--sphinx/locale/de_DE/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/de_DE/LC_MESSAGES/sphinx.mobin0 -> 505 bytes
-rw-r--r--sphinx/locale/de_DE/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/el/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/el/LC_MESSAGES/sphinx.mobin0 -> 80411 bytes
-rw-r--r--sphinx/locale/el/LC_MESSAGES/sphinx.po3697
-rw-r--r--sphinx/locale/en_DE/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/en_DE/LC_MESSAGES/sphinx.mobin0 -> 506 bytes
-rw-r--r--sphinx/locale/en_DE/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/en_FR/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/en_FR/LC_MESSAGES/sphinx.mobin0 -> 462 bytes
-rw-r--r--sphinx/locale/en_FR/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/en_GB/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/en_GB/LC_MESSAGES/sphinx.mobin0 -> 75590 bytes
-rw-r--r--sphinx/locale/en_GB/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/en_HK/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/en_HK/LC_MESSAGES/sphinx.mobin0 -> 508 bytes
-rw-r--r--sphinx/locale/en_HK/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/eo/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/eo/LC_MESSAGES/sphinx.mobin0 -> 1864 bytes
-rw-r--r--sphinx/locale/eo/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/es/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/es/LC_MESSAGES/sphinx.mobin0 -> 80907 bytes
-rw-r--r--sphinx/locale/es/LC_MESSAGES/sphinx.po3703
-rw-r--r--sphinx/locale/es_CO/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/es_CO/LC_MESSAGES/sphinx.mobin0 -> 546 bytes
-rw-r--r--sphinx/locale/es_CO/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/et/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/et/LC_MESSAGES/sphinx.mobin0 -> 32776 bytes
-rw-r--r--sphinx/locale/et/LC_MESSAGES/sphinx.po3698
-rw-r--r--sphinx/locale/eu/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/eu/LC_MESSAGES/sphinx.mobin0 -> 6505 bytes
-rw-r--r--sphinx/locale/eu/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/fa/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/fa/LC_MESSAGES/sphinx.mobin0 -> 97001 bytes
-rw-r--r--sphinx/locale/fa/LC_MESSAGES/sphinx.po3698
-rw-r--r--sphinx/locale/fi/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/fi/LC_MESSAGES/sphinx.mobin0 -> 2912 bytes
-rw-r--r--sphinx/locale/fi/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/fr/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/fr/LC_MESSAGES/sphinx.mobin0 -> 83168 bytes
-rw-r--r--sphinx/locale/fr/LC_MESSAGES/sphinx.po3722
-rw-r--r--sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mobin0 -> 555 bytes
-rw-r--r--sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/gl/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/gl/LC_MESSAGES/sphinx.mobin0 -> 4716 bytes
-rw-r--r--sphinx/locale/gl/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/he/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/he/LC_MESSAGES/sphinx.mobin0 -> 4822 bytes
-rw-r--r--sphinx/locale/he/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/hi/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/hi/LC_MESSAGES/sphinx.mobin0 -> 96953 bytes
-rw-r--r--sphinx/locale/hi/LC_MESSAGES/sphinx.po3698
-rw-r--r--sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mobin0 -> 502 bytes
-rw-r--r--sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/hr/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/hr/LC_MESSAGES/sphinx.mobin0 -> 16384 bytes
-rw-r--r--sphinx/locale/hr/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/hu/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/hu/LC_MESSAGES/sphinx.mobin0 -> 10971 bytes
-rw-r--r--sphinx/locale/hu/LC_MESSAGES/sphinx.po3700
-rw-r--r--sphinx/locale/id/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/id/LC_MESSAGES/sphinx.mobin0 -> 60268 bytes
-rw-r--r--sphinx/locale/id/LC_MESSAGES/sphinx.po3700
-rw-r--r--sphinx/locale/is/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/is/LC_MESSAGES/sphinx.mobin0 -> 2614 bytes
-rw-r--r--sphinx/locale/is/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/it/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/it/LC_MESSAGES/sphinx.mobin0 -> 10036 bytes
-rw-r--r--sphinx/locale/it/LC_MESSAGES/sphinx.po3700
-rw-r--r--sphinx/locale/ja/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ja/LC_MESSAGES/sphinx.mobin0 -> 85691 bytes
-rw-r--r--sphinx/locale/ja/LC_MESSAGES/sphinx.po3711
-rw-r--r--sphinx/locale/ka/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ka/LC_MESSAGES/sphinx.mobin0 -> 74059 bytes
-rw-r--r--sphinx/locale/ka/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/ko/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ko/LC_MESSAGES/sphinx.mobin0 -> 82285 bytes
-rw-r--r--sphinx/locale/ko/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/lt/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/lt/LC_MESSAGES/sphinx.mobin0 -> 6832 bytes
-rw-r--r--sphinx/locale/lt/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/lv/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/lv/LC_MESSAGES/sphinx.mobin0 -> 6501 bytes
-rw-r--r--sphinx/locale/lv/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/mk/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/mk/LC_MESSAGES/sphinx.mobin0 -> 2011 bytes
-rw-r--r--sphinx/locale/mk/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mobin0 -> 6500 bytes
-rw-r--r--sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/ne/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ne/LC_MESSAGES/sphinx.mobin0 -> 8520 bytes
-rw-r--r--sphinx/locale/ne/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/nl/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/nl/LC_MESSAGES/sphinx.mobin0 -> 18611 bytes
-rw-r--r--sphinx/locale/nl/LC_MESSAGES/sphinx.po3701
-rw-r--r--sphinx/locale/pl/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/pl/LC_MESSAGES/sphinx.mobin0 -> 28827 bytes
-rw-r--r--sphinx/locale/pl/LC_MESSAGES/sphinx.po3700
-rw-r--r--sphinx/locale/pt/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/pt/LC_MESSAGES/sphinx.mobin0 -> 544 bytes
-rw-r--r--sphinx/locale/pt/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mobin0 -> 81014 bytes
-rw-r--r--sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po3700
-rw-r--r--sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mobin0 -> 7764 bytes
-rw-r--r--sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/ro/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ro/LC_MESSAGES/sphinx.mobin0 -> 8259 bytes
-rw-r--r--sphinx/locale/ro/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/ru/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ru/LC_MESSAGES/sphinx.mobin0 -> 15343 bytes
-rw-r--r--sphinx/locale/ru/LC_MESSAGES/sphinx.po3701
-rw-r--r--sphinx/locale/si/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/si/LC_MESSAGES/sphinx.mobin0 -> 3560 bytes
-rw-r--r--sphinx/locale/si/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/sk/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/sk/LC_MESSAGES/sphinx.mobin0 -> 66206 bytes
-rw-r--r--sphinx/locale/sk/LC_MESSAGES/sphinx.po3697
-rw-r--r--sphinx/locale/sl/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/sl/LC_MESSAGES/sphinx.mobin0 -> 5157 bytes
-rw-r--r--sphinx/locale/sl/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/sphinx.pot3714
-rw-r--r--sphinx/locale/sq/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/sq/LC_MESSAGES/sphinx.mobin0 -> 79459 bytes
-rw-r--r--sphinx/locale/sq/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/sr/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/sr/LC_MESSAGES/sphinx.mobin0 -> 9193 bytes
-rw-r--r--sphinx/locale/sr/LC_MESSAGES/sphinx.po3696
-rw-r--r--sphinx/locale/sr@latin/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mobin0 -> 584 bytes
-rw-r--r--sphinx/locale/sr@latin/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/sr_RS/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mobin0 -> 579 bytes
-rw-r--r--sphinx/locale/sr_RS/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/sv/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/sv/LC_MESSAGES/sphinx.mobin0 -> 6491 bytes
-rw-r--r--sphinx/locale/sv/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/ta/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ta/LC_MESSAGES/sphinx.mobin0 -> 647 bytes
-rw-r--r--sphinx/locale/ta/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/te/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/te/LC_MESSAGES/sphinx.mobin0 -> 489 bytes
-rw-r--r--sphinx/locale/te/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/tr/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/tr/LC_MESSAGES/sphinx.mobin0 -> 56773 bytes
-rw-r--r--sphinx/locale/tr/LC_MESSAGES/sphinx.po3698
-rw-r--r--sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mobin0 -> 6349 bytes
-rw-r--r--sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/ur/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/ur/LC_MESSAGES/sphinx.mobin0 -> 487 bytes
-rw-r--r--sphinx/locale/ur/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/vi/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/vi/LC_MESSAGES/sphinx.mobin0 -> 5771 bytes
-rw-r--r--sphinx/locale/vi/LC_MESSAGES/sphinx.po3695
-rw-r--r--sphinx/locale/yue/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/yue/LC_MESSAGES/sphinx.mobin0 -> 487 bytes
-rw-r--r--sphinx/locale/yue/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/zh_CN/LC_MESSAGES/sphinx.mobin0 -> 75427 bytes
-rw-r--r--sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po3712
-rw-r--r--sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mobin0 -> 501 bytes
-rw-r--r--sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mobin0 -> 516 bytes
-rw-r--r--sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po3694
-rw-r--r--sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js60
-rw-r--r--sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mobin0 -> 74037 bytes
-rw-r--r--sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po3702
-rw-r--r--sphinx/parsers.py97
-rw-r--r--sphinx/project.py112
-rw-r--r--sphinx/py.typed0
-rw-r--r--sphinx/pycode/__init__.py152
-rw-r--r--sphinx/pycode/ast.py188
-rw-r--r--sphinx/pycode/parser.py577
-rw-r--r--sphinx/pygments_styles.py96
-rw-r--r--sphinx/registry.py517
-rw-r--r--sphinx/roles.py433
-rw-r--r--sphinx/search/__init__.py556
-rw-r--r--sphinx/search/da.py120
-rw-r--r--sphinx/search/de.py303
-rw-r--r--sphinx/search/en.py220
-rw-r--r--sphinx/search/es.py363
-rw-r--r--sphinx/search/fi.py113
-rw-r--r--sphinx/search/fr.py199
-rw-r--r--sphinx/search/hu.py226
-rw-r--r--sphinx/search/it.py316
-rw-r--r--sphinx/search/ja.py531
-rw-r--r--sphinx/search/minified-js/base-stemmer.js1
-rw-r--r--sphinx/search/minified-js/danish-stemmer.js1
-rw-r--r--sphinx/search/minified-js/dutch-stemmer.js1
-rw-r--r--sphinx/search/minified-js/finnish-stemmer.js1
-rw-r--r--sphinx/search/minified-js/french-stemmer.js1
-rw-r--r--sphinx/search/minified-js/german-stemmer.js1
-rw-r--r--sphinx/search/minified-js/hungarian-stemmer.js1
-rw-r--r--sphinx/search/minified-js/italian-stemmer.js1
-rw-r--r--sphinx/search/minified-js/norwegian-stemmer.js1
-rw-r--r--sphinx/search/minified-js/porter-stemmer.js1
-rw-r--r--sphinx/search/minified-js/portuguese-stemmer.js1
-rw-r--r--sphinx/search/minified-js/romanian-stemmer.js1
-rw-r--r--sphinx/search/minified-js/russian-stemmer.js1
-rw-r--r--sphinx/search/minified-js/spanish-stemmer.js1
-rw-r--r--sphinx/search/minified-js/swedish-stemmer.js1
-rw-r--r--sphinx/search/minified-js/turkish-stemmer.js1
-rw-r--r--sphinx/search/nl.py127
-rw-r--r--sphinx/search/no.py202
-rw-r--r--sphinx/search/non-minified-js/base-stemmer.js294
-rw-r--r--sphinx/search/non-minified-js/danish-stemmer.js310
-rw-r--r--sphinx/search/non-minified-js/dutch-stemmer.js685
-rw-r--r--sphinx/search/non-minified-js/finnish-stemmer.js790
-rw-r--r--sphinx/search/non-minified-js/french-stemmer.js1325
-rw-r--r--sphinx/search/non-minified-js/german-stemmer.js577
-rw-r--r--sphinx/search/non-minified-js/hungarian-stemmer.js711
-rw-r--r--sphinx/search/non-minified-js/italian-stemmer.js996
-rw-r--r--sphinx/search/non-minified-js/norwegian-stemmer.js261
-rw-r--r--sphinx/search/non-minified-js/porter-stemmer.js749
-rw-r--r--sphinx/search/non-minified-js/portuguese-stemmer.js914
-rw-r--r--sphinx/search/non-minified-js/romanian-stemmer.js872
-rw-r--r--sphinx/search/non-minified-js/russian-stemmer.js624
-rw-r--r--sphinx/search/non-minified-js/spanish-stemmer.js990
-rw-r--r--sphinx/search/non-minified-js/swedish-stemmer.js265
-rw-r--r--sphinx/search/non-minified-js/turkish-stemmer.js2439
-rw-r--r--sphinx/search/pt.py261
-rw-r--r--sphinx/search/ro.py22
-rw-r--r--sphinx/search/ru.py251
-rw-r--r--sphinx/search/sv.py140
-rw-r--r--sphinx/search/tr.py22
-rw-r--r--sphinx/search/zh.py262
-rw-r--r--sphinx/templates/apidoc/module.rst_t9
-rw-r--r--sphinx/templates/apidoc/package.rst_t57
-rw-r--r--sphinx/templates/apidoc/toc.rst_t8
-rw-r--r--sphinx/templates/epub3/container.xml6
-rw-r--r--sphinx/templates/epub3/content.opf_t50
-rw-r--r--sphinx/templates/epub3/mimetype1
-rw-r--r--sphinx/templates/epub3/nav.xhtml_t26
-rw-r--r--sphinx/templates/epub3/toc.ncx_t24
-rw-r--r--sphinx/templates/gettext/message.pot_t33
-rw-r--r--sphinx/templates/graphviz/graphviz.css19
-rw-r--r--sphinx/templates/htmlhelp/project.hhc31
-rw-r--r--sphinx/templates/htmlhelp/project.hhp21
-rw-r--r--sphinx/templates/htmlhelp/project.stp33
-rw-r--r--sphinx/templates/imgmath/preview.tex_t18
-rw-r--r--sphinx/templates/imgmath/template.tex_t14
-rw-r--r--sphinx/templates/latex/latex.tex_t108
-rw-r--r--sphinx/templates/latex/longtable.tex_t74
-rw-r--r--sphinx/templates/latex/sphinxmessages.sty_t21
-rw-r--r--sphinx/templates/latex/tabular.tex_t54
-rw-r--r--sphinx/templates/latex/tabulary.tex_t54
-rw-r--r--sphinx/templates/quickstart/Makefile.new_t21
-rw-r--r--sphinx/templates/quickstart/Makefile_t98
-rw-r--r--sphinx/templates/quickstart/conf.py_t71
-rw-r--r--sphinx/templates/quickstart/make.bat.new_t36
-rw-r--r--sphinx/templates/quickstart/make.bat_t110
-rw-r--r--sphinx/templates/quickstart/root_doc.rst_t21
-rw-r--r--sphinx/templates/texinfo/Makefile57
-rw-r--r--sphinx/testing/__init__.py7
-rw-r--r--sphinx/testing/fixtures.py243
-rw-r--r--sphinx/testing/path.py221
-rw-r--r--sphinx/testing/restructuredtext.py35
-rw-r--r--sphinx/testing/util.py171
-rw-r--r--sphinx/texinputs/LICRcyr2utf8.xdy101
-rw-r--r--sphinx/texinputs/LICRlatin2utf8.xdy239
-rw-r--r--sphinx/texinputs/LatinRules.xdy611
-rw-r--r--sphinx/texinputs/Makefile_t92
-rw-r--r--sphinx/texinputs/latexmkjarc_t22
-rw-r--r--sphinx/texinputs/latexmkrc_t32
-rw-r--r--sphinx/texinputs/make.bat_t50
-rw-r--r--sphinx/texinputs/python.ist16
-rw-r--r--sphinx/texinputs/sphinx.sty1013
-rw-r--r--sphinx/texinputs/sphinx.xdy230
-rw-r--r--sphinx/texinputs/sphinxhowto.cls102
-rw-r--r--sphinx/texinputs/sphinxlatexadmonitions.sty242
-rw-r--r--sphinx/texinputs/sphinxlatexcontainers.sty22
-rw-r--r--sphinx/texinputs/sphinxlatexgraphics.sty122
-rw-r--r--sphinx/texinputs/sphinxlatexindbibtoc.sty69
-rw-r--r--sphinx/texinputs/sphinxlatexlists.sty131
-rw-r--r--sphinx/texinputs/sphinxlatexliterals.sty1004
-rw-r--r--sphinx/texinputs/sphinxlatexnumfig.sty122
-rw-r--r--sphinx/texinputs/sphinxlatexobjects.sty365
-rw-r--r--sphinx/texinputs/sphinxlatexshadowbox.sty116
-rw-r--r--sphinx/texinputs/sphinxlatexstyleheadings.sty86
-rw-r--r--sphinx/texinputs/sphinxlatexstylepage.sty79
-rw-r--r--sphinx/texinputs/sphinxlatexstyletext.sty181
-rw-r--r--sphinx/texinputs/sphinxlatextables.sty1246
-rw-r--r--sphinx/texinputs/sphinxmanual.cls128
-rw-r--r--sphinx/texinputs/sphinxoptionsgeometry.sty54
-rw-r--r--sphinx/texinputs/sphinxoptionshyperref.sty35
-rw-r--r--sphinx/texinputs/sphinxpackageboxes.sty854
-rw-r--r--sphinx/texinputs/sphinxpackagecyrillic.sty55
-rw-r--r--sphinx/texinputs/sphinxpackagefootnote.sty433
-rw-r--r--sphinx/texinputs_win/Makefile_t86
-rw-r--r--sphinx/themes/agogo/layout.html104
-rw-r--r--sphinx/themes/agogo/static/agogo.css_t563
-rw-r--r--sphinx/themes/agogo/static/bgfooter.pngbin0 -> 276 bytes
-rw-r--r--sphinx/themes/agogo/static/bgtop.pngbin0 -> 266 bytes
-rw-r--r--sphinx/themes/agogo/theme.conf20
-rw-r--r--sphinx/themes/basic/changes/frameset.html11
-rw-r--r--sphinx/themes/basic/changes/rstsource.html15
-rw-r--r--sphinx/themes/basic/changes/versionchanges.html33
-rw-r--r--sphinx/themes/basic/defindex.html35
-rw-r--r--sphinx/themes/basic/domainindex.html56
-rw-r--r--sphinx/themes/basic/genindex-single.html63
-rw-r--r--sphinx/themes/basic/genindex-split.html41
-rw-r--r--sphinx/themes/basic/genindex.html76
-rw-r--r--sphinx/themes/basic/globaltoc.html11
-rw-r--r--sphinx/themes/basic/layout.html220
-rw-r--r--sphinx/themes/basic/localtoc.html15
-rw-r--r--sphinx/themes/basic/opensearch.xml13
-rw-r--r--sphinx/themes/basic/page.html13
-rw-r--r--sphinx/themes/basic/relations.html23
-rw-r--r--sphinx/themes/basic/search.html65
-rw-r--r--sphinx/themes/basic/searchbox.html21
-rw-r--r--sphinx/themes/basic/searchfield.html23
-rw-r--r--sphinx/themes/basic/sourcelink.html18
-rw-r--r--sphinx/themes/basic/static/basic.css_t925
-rw-r--r--sphinx/themes/basic/static/doctools.js156
-rw-r--r--sphinx/themes/basic/static/documentation_options.js_t13
-rw-r--r--sphinx/themes/basic/static/file.pngbin0 -> 286 bytes
-rw-r--r--sphinx/themes/basic/static/language_data.js_t26
-rw-r--r--sphinx/themes/basic/static/minus.pngbin0 -> 90 bytes
-rw-r--r--sphinx/themes/basic/static/plus.pngbin0 -> 90 bytes
-rw-r--r--sphinx/themes/basic/static/searchtools.js574
-rw-r--r--sphinx/themes/basic/static/sphinx_highlight.js154
-rw-r--r--sphinx/themes/basic/theme.conf16
-rw-r--r--sphinx/themes/bizstyle/layout.html27
-rw-r--r--sphinx/themes/bizstyle/static/background_b01.pngbin0 -> 78 bytes
-rw-r--r--sphinx/themes/bizstyle/static/bizstyle.css_t523
-rw-r--r--sphinx/themes/bizstyle/static/bizstyle.js_t30
-rw-r--r--sphinx/themes/bizstyle/static/css3-mediaqueries.js1
-rw-r--r--sphinx/themes/bizstyle/static/css3-mediaqueries_src.js1104
-rw-r--r--sphinx/themes/bizstyle/theme.conf10
-rw-r--r--sphinx/themes/classic/layout.html23
-rw-r--r--sphinx/themes/classic/static/classic.css_t353
-rw-r--r--sphinx/themes/classic/static/sidebar.js_t72
-rw-r--r--sphinx/themes/classic/theme.conf32
-rw-r--r--sphinx/themes/default/static/default.css1
-rw-r--r--sphinx/themes/default/theme.conf2
-rw-r--r--sphinx/themes/epub/epub-cover.html25
-rw-r--r--sphinx/themes/epub/layout.html21
-rw-r--r--sphinx/themes/epub/static/epub.css_t734
-rw-r--r--sphinx/themes/epub/theme.conf8
-rw-r--r--sphinx/themes/haiku/layout.html66
-rw-r--r--sphinx/themes/haiku/static/alert_info_32.pngbin0 -> 1128 bytes
-rw-r--r--sphinx/themes/haiku/static/alert_warning_32.pngbin0 -> 944 bytes
-rw-r--r--sphinx/themes/haiku/static/bg-page.pngbin0 -> 82 bytes
-rw-r--r--sphinx/themes/haiku/static/bullet_orange.pngbin0 -> 165 bytes
-rw-r--r--sphinx/themes/haiku/static/haiku.css_t375
-rw-r--r--sphinx/themes/haiku/theme.conf14
-rw-r--r--sphinx/themes/nature/static/nature.css_t252
-rw-r--r--sphinx/themes/nature/theme.conf4
-rw-r--r--sphinx/themes/nonav/layout.html23
-rw-r--r--sphinx/themes/nonav/static/nonav.css_t589
-rw-r--r--sphinx/themes/nonav/theme.conf8
-rw-r--r--sphinx/themes/pyramid/layout.html24
-rw-r--r--sphinx/themes/pyramid/static/dialog-note.pngbin0 -> 1394 bytes
-rw-r--r--sphinx/themes/pyramid/static/dialog-seealso.pngbin0 -> 1351 bytes
-rw-r--r--sphinx/themes/pyramid/static/dialog-todo.pngbin0 -> 1186 bytes
-rw-r--r--sphinx/themes/pyramid/static/dialog-topic.pngbin0 -> 1798 bytes
-rw-r--r--sphinx/themes/pyramid/static/dialog-warning.pngbin0 -> 1280 bytes
-rw-r--r--sphinx/themes/pyramid/static/epub.css_t312
-rw-r--r--sphinx/themes/pyramid/static/footerbg.pngbin0 -> 333 bytes
-rw-r--r--sphinx/themes/pyramid/static/headerbg.pngbin0 -> 190 bytes
-rw-r--r--sphinx/themes/pyramid/static/ie6.css7
-rw-r--r--sphinx/themes/pyramid/static/middlebg.pngbin0 -> 101 bytes
-rw-r--r--sphinx/themes/pyramid/static/pyramid.css_t348
-rw-r--r--sphinx/themes/pyramid/static/transparent.gifbin0 -> 49 bytes
-rw-r--r--sphinx/themes/pyramid/theme.conf4
-rw-r--r--sphinx/themes/scrolls/artwork/logo.svg107
-rw-r--r--sphinx/themes/scrolls/layout.html50
-rw-r--r--sphinx/themes/scrolls/static/darkmetal.pngbin0 -> 25238 bytes
-rw-r--r--sphinx/themes/scrolls/static/headerbg.pngbin0 -> 172 bytes
-rw-r--r--sphinx/themes/scrolls/static/logo.pngbin0 -> 8305 bytes
-rw-r--r--sphinx/themes/scrolls/static/metal.pngbin0 -> 7547 bytes
-rw-r--r--sphinx/themes/scrolls/static/navigation.pngbin0 -> 124 bytes
-rw-r--r--sphinx/themes/scrolls/static/print.css7
-rw-r--r--sphinx/themes/scrolls/static/scrolls.css_t502
-rw-r--r--sphinx/themes/scrolls/static/theme_extras.js12
-rw-r--r--sphinx/themes/scrolls/static/watermark.pngbin0 -> 44483 bytes
-rw-r--r--sphinx/themes/scrolls/static/watermark_blur.pngbin0 -> 8049 bytes
-rw-r--r--sphinx/themes/scrolls/theme.conf13
-rw-r--r--sphinx/themes/sphinxdoc/static/contents.pngbin0 -> 107 bytes
-rw-r--r--sphinx/themes/sphinxdoc/static/navigation.pngbin0 -> 120 bytes
-rw-r--r--sphinx/themes/sphinxdoc/static/sphinxdoc.css_t354
-rw-r--r--sphinx/themes/sphinxdoc/theme.conf4
-rw-r--r--sphinx/themes/traditional/static/traditional.css_t765
-rw-r--r--sphinx/themes/traditional/theme.conf7
-rw-r--r--sphinx/theming.py232
-rw-r--r--sphinx/transforms/__init__.py516
-rw-r--r--sphinx/transforms/compact_bullet_list.py91
-rw-r--r--sphinx/transforms/i18n.py624
-rw-r--r--sphinx/transforms/post_transforms/__init__.py297
-rw-r--r--sphinx/transforms/post_transforms/code.py139
-rw-r--r--sphinx/transforms/post_transforms/images.py280
-rw-r--r--sphinx/transforms/references.py47
-rw-r--r--sphinx/util/__init__.py297
-rw-r--r--sphinx/util/_pathlib.py115
-rw-r--r--sphinx/util/build_phase.py12
-rw-r--r--sphinx/util/cfamily.py464
-rw-r--r--sphinx/util/console.py129
-rw-r--r--sphinx/util/display.py94
-rw-r--r--sphinx/util/docfields.py408
-rw-r--r--sphinx/util/docstrings.py88
-rw-r--r--sphinx/util/docutils.py635
-rw-r--r--sphinx/util/exceptions.py67
-rw-r--r--sphinx/util/fileutil.py100
-rw-r--r--sphinx/util/http_date.py39
-rw-r--r--sphinx/util/i18n.py253
-rw-r--r--sphinx/util/images.py146
-rw-r--r--sphinx/util/index_entries.py27
-rw-r--r--sphinx/util/inspect.py833
-rw-r--r--sphinx/util/inventory.py172
-rw-r--r--sphinx/util/logging.py602
-rw-r--r--sphinx/util/matching.py169
-rw-r--r--sphinx/util/math.py61
-rw-r--r--sphinx/util/nodes.py672
-rw-r--r--sphinx/util/osutil.py217
-rw-r--r--sphinx/util/parallel.py154
-rw-r--r--sphinx/util/png.py43
-rw-r--r--sphinx/util/requests.py73
-rw-r--r--sphinx/util/rst.py110
-rw-r--r--sphinx/util/tags.py88
-rw-r--r--sphinx/util/template.py135
-rw-r--r--sphinx/util/texescape.py153
-rw-r--r--sphinx/util/typing.py402
-rw-r--r--sphinx/versioning.py178
-rw-r--r--sphinx/writers/__init__.py1
-rw-r--r--sphinx/writers/html.py44
-rw-r--r--sphinx/writers/html5.py936
-rw-r--r--sphinx/writers/latex.py2266
-rw-r--r--sphinx/writers/manpage.py473
-rw-r--r--sphinx/writers/texinfo.py1572
-rw-r--r--sphinx/writers/text.py1305
-rw-r--r--sphinx/writers/xml.py52
-rw-r--r--tests/__init__.py0
-rw-r--r--tests/certs/cert.pem50
-rw-r--r--tests/conftest.py40
-rw-r--r--tests/ext_napoleon_pep526_data_google.py16
-rw-r--r--tests/ext_napoleon_pep526_data_numpy.py20
-rw-r--r--tests/js/documentation_options.js1
-rw-r--r--tests/js/searchtools.js62
-rw-r--r--tests/js/sphinx_highlight.js39
-rw-r--r--tests/roots/test-add_enumerable_node/conf.py7
-rw-r--r--tests/roots/test-add_enumerable_node/enumerable_node.py62
-rw-r--r--tests/roots/test-add_enumerable_node/index.rst48
-rw-r--r--tests/roots/test-add_enumerable_node/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py17
-rw-r--r--tests/roots/test-add_source_parser-conflicts-with-users-setting/source_parser.py10
-rw-r--r--tests/roots/test-add_source_parser/conf.py8
-rw-r--r--tests/roots/test-add_source_parser/source_parser.py10
-rw-r--r--tests/roots/test-api-set-translator/conf.py72
-rw-r--r--tests/roots/test-api-set-translator/index.rst3
-rw-r--r--tests/roots/test-api-set-translator/nonext/conf.py6
-rw-r--r--tests/roots/test-api-set-translator/translator.py5
-rw-r--r--tests/roots/test-apidoc-duplicates/fish_licence/halibut.cpython-38-x86_64-linux-gnu.so0
-rw-r--r--tests/roots/test-apidoc-duplicates/fish_licence/halibut.pyx0
-rw-r--r--tests/roots/test-apidoc-pep420/a/b/c/__init__.py1
-rw-r--r--tests/roots/test-apidoc-pep420/a/b/c/d.py1
-rw-r--r--tests/roots/test-apidoc-pep420/a/b/e/__init__.py0
-rw-r--r--tests/roots/test-apidoc-pep420/a/b/e/f.py1
-rw-r--r--tests/roots/test-apidoc-pep420/a/b/x/y.py1
-rw-r--r--tests/roots/test-apidoc-subpackage-in-toc/parent/__init__.py0
-rw-r--r--tests/roots/test-apidoc-subpackage-in-toc/parent/child/__init__.py0
-rw-r--r--tests/roots/test-apidoc-subpackage-in-toc/parent/child/foo.py1
-rw-r--r--tests/roots/test-apidoc-toc/mypackage/__init__.py0
-rwxr-xr-xtests/roots/test-apidoc-toc/mypackage/main.py15
-rw-r--r--tests/roots/test-apidoc-toc/mypackage/no_init/foo.py1
-rw-r--r--tests/roots/test-apidoc-toc/mypackage/resource/__init__.py0
-rw-r--r--tests/roots/test-apidoc-toc/mypackage/resource/resource.txt1
-rw-r--r--tests/roots/test-apidoc-toc/mypackage/something/__init__.py1
-rw-r--r--tests/roots/test-apidoc-trailing-underscore/package_/__init__.py1
-rw-r--r--tests/roots/test-apidoc-trailing-underscore/package_/module_.py9
-rw-r--r--tests/roots/test-autosummary/conf.py12
-rw-r--r--tests/roots/test-autosummary/dummy_module.py85
-rw-r--r--tests/roots/test-autosummary/index.rst8
-rw-r--r--tests/roots/test-autosummary/sphinx.rst31
-rw-r--r--tests/roots/test-autosummary/underscore_module_.py15
-rw-r--r--tests/roots/test-basic/conf.py3
-rw-r--r--tests/roots/test-basic/index.rst31
-rw-r--r--tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/extra.css0
-rw-r--r--tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/mytheme.css0
-rw-r--r--tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/theme.conf3
-rw-r--r--tests/roots/test-build-html-theme-having-multiple-stylesheets/conf.py2
-rw-r--r--tests/roots/test-build-html-theme-having-multiple-stylesheets/index.rst2
-rw-r--r--tests/roots/test-build-html-translator/conf.py16
-rw-r--r--tests/roots/test-build-html-translator/index.rst24
-rw-r--r--tests/roots/test-build-text/conf.py2
-rw-r--r--tests/roots/test-build-text/doc1.txt2
-rw-r--r--tests/roots/test-build-text/doc2.txt9
-rw-r--r--tests/roots/test-build-text/index.txt11
-rw-r--r--tests/roots/test-build-text/lineblock.txt6
-rw-r--r--tests/roots/test-build-text/listitems.txt4
-rw-r--r--tests/roots/test-build-text/maxwidth.txt6
-rw-r--r--tests/roots/test-build-text/nonascii_maxwidth.txt5
-rw-r--r--tests/roots/test-build-text/nonascii_table.txt7
-rw-r--r--tests/roots/test-build-text/nonascii_title.txt2
-rw-r--r--tests/roots/test-build-text/table.txt7
-rw-r--r--tests/roots/test-build-text/table_colspan.txt7
-rw-r--r--tests/roots/test-build-text/table_colspan_and_rowspan.txt7
-rw-r--r--tests/roots/test-build-text/table_colspan_left.txt7
-rw-r--r--tests/roots/test-build-text/table_rowspan.txt7
-rw-r--r--tests/roots/test-builder-dirhtml/bar.rst4
-rw-r--r--tests/roots/test-builder-dirhtml/conf.py0
-rw-r--r--tests/roots/test-builder-dirhtml/foo/foo_1.rst4
-rw-r--r--tests/roots/test-builder-dirhtml/foo/foo_2.rst4
-rw-r--r--tests/roots/test-builder-dirhtml/foo/index.rst9
-rw-r--r--tests/roots/test-builder-dirhtml/index.rst9
-rw-r--r--tests/roots/test-builder-gettext-dont-rebuild-mo/bom.rst5
-rw-r--r--tests/roots/test-builder-gettext-dont-rebuild-mo/conf.py1
-rw-r--r--tests/roots/test-builder-gettext-dont-rebuild-mo/index.rst6
-rw-r--r--tests/roots/test-builder-gettext-dont-rebuild-mo/xx/LC_MESSAGES/bom.po12
-rw-r--r--tests/roots/test-changes/base.rst20
-rw-r--r--tests/roots/test-changes/c-api.rst24
-rw-r--r--tests/roots/test-changes/conf.py4
-rw-r--r--tests/roots/test-changes/contents.rst13
-rw-r--r--tests/roots/test-changes/library/utils.rst25
-rw-r--r--tests/roots/test-circular/conf.py1
-rw-r--r--tests/roots/test-circular/index.rst4
-rw-r--r--tests/roots/test-circular/sub.rst3
-rw-r--r--tests/roots/test-config/conf.py3
-rw-r--r--tests/roots/test-copyright-multiline/conf.py9
-rw-r--r--tests/roots/test-copyright-multiline/index.rst3
-rw-r--r--tests/roots/test-correct-year/conf.py1
-rw-r--r--tests/roots/test-correct-year/index.rst4
-rw-r--r--tests/roots/test-default_role/conf.py0
-rw-r--r--tests/roots/test-default_role/foo.rst4
-rw-r--r--tests/roots/test-default_role/index.rst6
-rw-r--r--tests/roots/test-directive-code/caption.rst52
-rw-r--r--tests/roots/test-directive-code/classes.rst21
-rw-r--r--tests/roots/test-directive-code/conf.py2
-rw-r--r--tests/roots/test-directive-code/dedent.rst64
-rw-r--r--tests/roots/test-directive-code/emphasize.rst7
-rw-r--r--tests/roots/test-directive-code/empty.inc3
-rw-r--r--tests/roots/test-directive-code/error.inc1
-rw-r--r--tests/roots/test-directive-code/force.rst16
-rw-r--r--tests/roots/test-directive-code/highlight.rst20
-rw-r--r--tests/roots/test-directive-code/index.rst25
-rw-r--r--tests/roots/test-directive-code/linenos.rst18
-rw-r--r--tests/roots/test-directive-code/linenothreshold.rst23
-rw-r--r--tests/roots/test-directive-code/literal-diff.inc13
-rw-r--r--tests/roots/test-directive-code/literal-short.inc3
-rw-r--r--tests/roots/test-directive-code/literal.inc13
-rw-r--r--tests/roots/test-directive-code/namedblocks.rst28
-rw-r--r--tests/roots/test-directive-code/py-decorators.inc15
-rw-r--r--tests/roots/test-directive-code/py-decorators.rst17
-rw-r--r--tests/roots/test-directive-code/python.rst13
-rw-r--r--tests/roots/test-directive-code/target.py26
-rw-r--r--tests/roots/test-directive-csv-table/conf.py0
-rw-r--r--tests/roots/test-directive-csv-table/example.csv1
-rw-r--r--tests/roots/test-directive-csv-table/subdir/example.csv1
-rw-r--r--tests/roots/test-directive-include/bar.txt1
-rw-r--r--tests/roots/test-directive-include/baz/baz.rst6
-rw-r--r--tests/roots/test-directive-include/conf.py2
-rw-r--r--tests/roots/test-directive-include/foo.rst1
-rw-r--r--tests/roots/test-directive-include/text.txt1
-rw-r--r--tests/roots/test-directive-only/conf.py2
-rw-r--r--tests/roots/test-directive-only/index.rst6
-rw-r--r--tests/roots/test-directive-only/only.rst203
-rw-r--r--tests/roots/test-directives-raw/conf.py0
-rw-r--r--tests/roots/test-directives-raw/index.rst40
-rw-r--r--tests/roots/test-docutilsconf/conf.py0
-rw-r--r--tests/roots/test-docutilsconf/docutils.conf0
-rw-r--r--tests/roots/test-docutilsconf/index.rst6
-rw-r--r--tests/roots/test-domain-c-c_maximum_signature_line_length/conf.py1
-rw-r--r--tests/roots/test-domain-c-c_maximum_signature_line_length/index.rst4
-rw-r--r--tests/roots/test-domain-c-intersphinx/conf.py4
-rw-r--r--tests/roots/test-domain-c-intersphinx/index.rst62
-rw-r--r--tests/roots/test-domain-c/anon-dup-decl.rst7
-rw-r--r--tests/roots/test-domain-c/conf.py1
-rw-r--r--tests/roots/test-domain-c/field-role.rst4
-rw-r--r--tests/roots/test-domain-c/function_param_target.rst7
-rw-r--r--tests/roots/test-domain-c/index.rst54
-rw-r--r--tests/roots/test-domain-c/namespace.rst21
-rw-r--r--tests/roots/test-domain-c/ns_lookup.rst13
-rw-r--r--tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/conf.py1
-rw-r--r--tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/index.rst4
-rw-r--r--tests/roots/test-domain-cpp-intersphinx/conf.py4
-rw-r--r--tests/roots/test-domain-cpp-intersphinx/index.rst112
-rw-r--r--tests/roots/test-domain-cpp/anon-dup-decl.rst4
-rw-r--r--tests/roots/test-domain-cpp/any-role.rst17
-rw-r--r--tests/roots/test-domain-cpp/backslash.rst1
-rw-r--r--tests/roots/test-domain-cpp/conf.py1
-rw-r--r--tests/roots/test-domain-cpp/field-role.rst5
-rw-r--r--tests/roots/test-domain-cpp/index.rst53
-rw-r--r--tests/roots/test-domain-cpp/lookup-key-overload.rst8
-rw-r--r--tests/roots/test-domain-cpp/multi-decl-lookup.rst24
-rw-r--r--tests/roots/test-domain-cpp/roles-targets-ok.rst170
-rw-r--r--tests/roots/test-domain-cpp/roles-targets-warn.rst158
-rw-r--r--tests/roots/test-domain-cpp/roles.rst17
-rw-r--r--tests/roots/test-domain-cpp/roles2.rst5
-rw-r--r--tests/roots/test-domain-cpp/semicolon.rst14
-rw-r--r--tests/roots/test-domain-cpp/warn-template-param-qualified-name.rst11
-rw-r--r--tests/roots/test-domain-cpp/xref_consistency.rst12
-rw-r--r--tests/roots/test-domain-js-javascript_maximum_signature_line_length/conf.py1
-rw-r--r--tests/roots/test-domain-js-javascript_maximum_signature_line_length/index.rst6
-rw-r--r--tests/roots/test-domain-js/conf.py1
-rw-r--r--tests/roots/test-domain-js/index.rst7
-rw-r--r--tests/roots/test-domain-js/module.rst27
-rw-r--r--tests/roots/test-domain-js/roles.rst48
-rw-r--r--tests/roots/test-domain-py-python_maximum_signature_line_length/conf.py1
-rw-r--r--tests/roots/test-domain-py-python_maximum_signature_line_length/index.rst6
-rw-r--r--tests/roots/test-domain-py-python_use_unqualified_type_names/conf.py1
-rw-r--r--tests/roots/test-domain-py-python_use_unqualified_type_names/index.rst12
-rw-r--r--tests/roots/test-domain-py-xref-warning/conf.py0
-rw-r--r--tests/roots/test-domain-py-xref-warning/index.rst7
-rw-r--r--tests/roots/test-domain-py/abbr.rst10
-rw-r--r--tests/roots/test-domain-py/canonical.rst12
-rw-r--r--tests/roots/test-domain-py/conf.py1
-rw-r--r--tests/roots/test-domain-py/index.rst10
-rw-r--r--tests/roots/test-domain-py/module.rst60
-rw-r--r--tests/roots/test-domain-py/module_option.rst25
-rw-r--r--tests/roots/test-domain-py/roles.rst48
-rw-r--r--tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme1/theme.conf2
-rw-r--r--tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme2/theme.conf2
-rw-r--r--tests/roots/test-double-inheriting-theme/conf.py4
-rw-r--r--tests/roots/test-double-inheriting-theme/index.rst3
-rw-r--r--tests/roots/test-environment-record-dependencies/api.rst4
-rw-r--r--tests/roots/test-environment-record-dependencies/conf.py5
-rw-r--r--tests/roots/test-environment-record-dependencies/example_module.py2
-rw-r--r--tests/roots/test-environment-record-dependencies/index.rst3
-rw-r--r--tests/roots/test-epub-anchor-id/conf.py2
-rw-r--r--tests/roots/test-epub-anchor-id/index.rst13
-rw-r--r--tests/roots/test-ext-autodoc/autodoc_dummy_bar.py6
-rw-r--r--tests/roots/test-ext-autodoc/autodoc_dummy_module.py6
-rw-r--r--tests/roots/test-ext-autodoc/bug2437/__init__.py0
-rw-r--r--tests/roots/test-ext-autodoc/bug2437/autodoc_dummy_foo.py3
-rw-r--r--tests/roots/test-ext-autodoc/circular_import/__init__.py1
-rw-r--r--tests/roots/test-ext-autodoc/circular_import/a.py1
-rw-r--r--tests/roots/test-ext-autodoc/circular_import/b.py4
-rw-r--r--tests/roots/test-ext-autodoc/circular_import/c.py6
-rw-r--r--tests/roots/test-ext-autodoc/conf.py15
-rw-r--r--tests/roots/test-ext-autodoc/index.rst15
-rw-r--r--tests/roots/test-ext-autodoc/target/TYPE_CHECKING.py16
-rw-r--r--tests/roots/test-ext-autodoc/target/__init__.py204
-rw-r--r--tests/roots/test-ext-autodoc/target/_functions_to_import.py8
-rw-r--r--tests/roots/test-ext-autodoc/target/abstractmethods.py29
-rw-r--r--tests/roots/test-ext-autodoc/target/annotated.py8
-rw-r--r--tests/roots/test-ext-autodoc/target/autoclass_content.py47
-rw-r--r--tests/roots/test-ext-autodoc/target/autodoc_type_aliases.py49
-rw-r--r--tests/roots/test-ext-autodoc/target/bound_method.py7
-rw-r--r--tests/roots/test-ext-autodoc/target/cached_property.py12
-rw-r--r--tests/roots/test-ext-autodoc/target/callable.py13
-rw-r--r--tests/roots/test-ext-autodoc/target/canonical/__init__.py1
-rw-r--r--tests/roots/test-ext-autodoc/target/canonical/original.py15
-rw-r--r--tests/roots/test-ext-autodoc/target/classes.py44
-rw-r--r--tests/roots/test-ext-autodoc/target/coroutine.py37
-rw-r--r--tests/roots/test-ext-autodoc/target/cython.pyx13
-rw-r--r--tests/roots/test-ext-autodoc/target/decorator.py53
-rw-r--r--tests/roots/test-ext-autodoc/target/descriptor.py31
-rw-r--r--tests/roots/test-ext-autodoc/target/docstring_signature.py33
-rw-r--r--tests/roots/test-ext-autodoc/target/empty_all.py16
-rw-r--r--tests/roots/test-ext-autodoc/target/enums.py23
-rw-r--r--tests/roots/test-ext-autodoc/target/final.py16
-rw-r--r--tests/roots/test-ext-autodoc/target/functions.py19
-rw-r--r--tests/roots/test-ext-autodoc/target/generic_class.py13
-rw-r--r--tests/roots/test-ext-autodoc/target/genericalias.py16
-rw-r--r--tests/roots/test-ext-autodoc/target/hide_value.py19
-rw-r--r--tests/roots/test-ext-autodoc/target/imported_members.py1
-rw-r--r--tests/roots/test-ext-autodoc/target/inheritance.py25
-rw-r--r--tests/roots/test-ext-autodoc/target/instance_variable.py11
-rw-r--r--tests/roots/test-ext-autodoc/target/literal.py24
-rw-r--r--tests/roots/test-ext-autodoc/target/metadata.py2
-rw-r--r--tests/roots/test-ext-autodoc/target/methods.py29
-rw-r--r--tests/roots/test-ext-autodoc/target/module.py14
-rw-r--r--tests/roots/test-ext-autodoc/target/name_conflict/__init__.py6
-rw-r--r--tests/roots/test-ext-autodoc/target/name_conflict/foo.py2
-rw-r--r--tests/roots/test-ext-autodoc/target/name_mangling.py11
-rw-r--r--tests/roots/test-ext-autodoc/target/need_mocks.py42
-rw-r--r--tests/roots/test-ext-autodoc/target/overload.py90
-rw-r--r--tests/roots/test-ext-autodoc/target/overload2.py5
-rw-r--r--tests/roots/test-ext-autodoc/target/partialfunction.py12
-rw-r--r--tests/roots/test-ext-autodoc/target/partialmethod.py17
-rw-r--r--tests/roots/test-ext-autodoc/target/pep570.py0
-rw-r--r--tests/roots/test-ext-autodoc/target/pep604.py16
-rw-r--r--tests/roots/test-ext-autodoc/target/preserve_defaults.py60
-rw-r--r--tests/roots/test-ext-autodoc/target/preserve_defaults_special_constructs.py50
-rw-r--r--tests/roots/test-ext-autodoc/target/private.py27
-rw-r--r--tests/roots/test-ext-autodoc/target/process_docstring.py8
-rw-r--r--tests/roots/test-ext-autodoc/target/properties.py22
-rw-r--r--tests/roots/test-ext-autodoc/target/singledispatch.py36
-rw-r--r--tests/roots/test-ext-autodoc/target/singledispatchmethod.py27
-rw-r--r--tests/roots/test-ext-autodoc/target/slots.py22
-rw-r--r--tests/roots/test-ext-autodoc/target/sort_by_all.py25
-rw-r--r--tests/roots/test-ext-autodoc/target/typed_vars.py34
-rw-r--r--tests/roots/test-ext-autodoc/target/typehints.py105
-rw-r--r--tests/roots/test-ext-autodoc/target/typevar.py32
-rw-r--r--tests/roots/test-ext-autodoc/target/uninitialized_attributes.py8
-rw-r--r--tests/roots/test-ext-autodoc/target/wrappedfunction.py17
-rw-r--r--tests/roots/test-ext-autosectionlabel-prefix-document/conf.py2
-rw-r--r--tests/roots/test-ext-autosectionlabel-prefix-document/index.rst37
-rw-r--r--tests/roots/test-ext-autosectionlabel/conf.py1
-rw-r--r--tests/roots/test-ext-autosectionlabel/index.rst37
-rw-r--r--tests/roots/test-ext-autosummary-filename-map/autosummary_dummy_module.py23
-rw-r--r--tests/roots/test-ext-autosummary-filename-map/conf.py11
-rw-r--r--tests/roots/test-ext-autosummary-filename-map/index.rst9
-rw-r--r--tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/__init__.py1
-rw-r--r--tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/autosummary_dummy_module.py8
-rw-r--r--tests/roots/test-ext-autosummary-imported_members/conf.py8
-rw-r--r--tests/roots/test-ext-autosummary-imported_members/index.rst7
-rw-r--r--tests/roots/test-ext-autosummary-mock_imports/conf.py8
-rw-r--r--tests/roots/test-ext-autosummary-mock_imports/foo.py6
-rw-r--r--tests/roots/test-ext-autosummary-mock_imports/index.rst7
-rw-r--r--tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/__init__.py13
-rw-r--r--tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/autosummary_dummy_module.py20
-rw-r--r--tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/extra_dummy_module.py20
-rw-r--r--tests/roots/test-ext-autosummary-module_all/conf.py8
-rw-r--r--tests/roots/test-ext-autosummary-module_all/index.rst8
-rw-r--r--tests/roots/test-ext-autosummary-recursive/conf.py7
-rw-r--r--tests/roots/test-ext-autosummary-recursive/index.rst15
-rw-r--r--tests/roots/test-ext-autosummary-recursive/package/__init__.py0
-rw-r--r--tests/roots/test-ext-autosummary-recursive/package/module.py13
-rw-r--r--tests/roots/test-ext-autosummary-recursive/package/module_importfail.py2
-rw-r--r--tests/roots/test-ext-autosummary-recursive/package/package/__init__.py0
-rw-r--r--tests/roots/test-ext-autosummary-recursive/package/package/module.py13
-rw-r--r--tests/roots/test-ext-autosummary-recursive/package2/__init__.py0
-rw-r--r--tests/roots/test-ext-autosummary-recursive/package2/module.py13
-rw-r--r--tests/roots/test-ext-autosummary-skip-member/conf.py20
-rw-r--r--tests/roots/test-ext-autosummary-skip-member/index.rst4
-rw-r--r--tests/roots/test-ext-autosummary-skip-member/target.py14
-rw-r--r--tests/roots/test-ext-autosummary-template/_templates/empty.rst1
-rw-r--r--tests/roots/test-ext-autosummary-template/conf.py10
-rw-r--r--tests/roots/test-ext-autosummary-template/index.rst5
-rw-r--r--tests/roots/test-ext-autosummary-template/target.py2
-rw-r--r--tests/roots/test-ext-autosummary/autosummary_class_module.py2
-rw-r--r--tests/roots/test-ext-autosummary/autosummary_dummy_inherited_module.py13
-rw-r--r--tests/roots/test-ext-autosummary/autosummary_dummy_module.py68
-rw-r--r--tests/roots/test-ext-autosummary/autosummary_importfail.py2
-rw-r--r--tests/roots/test-ext-autosummary/conf.py10
-rw-r--r--tests/roots/test-ext-autosummary/index.rst18
-rw-r--r--tests/roots/test-ext-coverage/conf.py12
-rw-r--r--tests/roots/test-ext-coverage/coverage_ignored.py22
-rw-r--r--tests/roots/test-ext-coverage/coverage_not_ignored.py22
-rw-r--r--tests/roots/test-ext-coverage/index.rst6
-rw-r--r--tests/roots/test-ext-doctest-skipif/conf.py16
-rw-r--r--tests/roots/test-ext-doctest-skipif/skipif.txt81
-rw-r--r--tests/roots/test-ext-doctest-with-autodoc/conf.py7
-rw-r--r--tests/roots/test-ext-doctest-with-autodoc/dir/__init__.py0
-rw-r--r--tests/roots/test-ext-doctest-with-autodoc/dir/bar.py4
-rw-r--r--tests/roots/test-ext-doctest-with-autodoc/dir/inner.rst4
-rw-r--r--tests/roots/test-ext-doctest-with-autodoc/foo.py5
-rw-r--r--tests/roots/test-ext-doctest-with-autodoc/index.rst4
-rw-r--r--tests/roots/test-ext-doctest/conf.py6
-rw-r--r--tests/roots/test-ext-doctest/doctest.txt163
-rw-r--r--tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/conf.py6
-rw-r--r--tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/index.rst24
-rw-r--r--tests/roots/test-ext-extlinks-hardcoded-urls/conf.py3
-rw-r--r--tests/roots/test-ext-extlinks-hardcoded-urls/index.rst28
-rw-r--r--tests/roots/test-ext-githubpages/conf.py1
-rw-r--r--tests/roots/test-ext-githubpages/index.rst3
-rw-r--r--tests/roots/test-ext-graphviz/_static/images/test.svg8
-rw-r--r--tests/roots/test-ext-graphviz/conf.py3
-rw-r--r--tests/roots/test-ext-graphviz/graph.dot3
-rw-r--r--tests/roots/test-ext-graphviz/graph.xx.dot3
-rw-r--r--tests/roots/test-ext-graphviz/index.rst43
-rw-r--r--tests/roots/test-ext-ifconfig/conf.py10
-rw-r--r--tests/roots/test-ext-ifconfig/index.rst21
-rw-r--r--tests/roots/test-ext-imgconverter/conf.py1
-rw-r--r--tests/roots/test-ext-imgconverter/img.pdfbin0 -> 141783 bytes
-rw-r--r--tests/roots/test-ext-imgconverter/index.rst5
-rw-r--r--tests/roots/test-ext-imgconverter/svgimg.svg4
-rw-r--r--tests/roots/test-ext-imgmockconverter/1/svgimg.svg3
-rw-r--r--tests/roots/test-ext-imgmockconverter/2/svgimg.svg4
-rw-r--r--tests/roots/test-ext-imgmockconverter/conf.py5
-rw-r--r--tests/roots/test-ext-imgmockconverter/index.rst6
-rw-r--r--tests/roots/test-ext-imgmockconverter/mocksvgconverter.py39
-rw-r--r--tests/roots/test-ext-inheritance_diagram/conf.py6
-rw-r--r--tests/roots/test-ext-inheritance_diagram/example/__init__.py1
-rw-r--r--tests/roots/test-ext-inheritance_diagram/example/sphinx.py5
-rw-r--r--tests/roots/test-ext-inheritance_diagram/external/other.py5
-rw-r--r--tests/roots/test-ext-inheritance_diagram/index.rst18
-rw-r--r--tests/roots/test-ext-inheritance_diagram/subdir/page1.rst9
-rw-r--r--tests/roots/test-ext-inheritance_diagram/subdir/page2.rst5
-rw-r--r--tests/roots/test-ext-inheritance_diagram/test.py22
-rw-r--r--tests/roots/test-ext-intersphinx-cppdomain/conf.py1
-rw-r--r--tests/roots/test-ext-intersphinx-cppdomain/index.rst8
-rw-r--r--tests/roots/test-ext-intersphinx-role/conf.py3
-rw-r--r--tests/roots/test-ext-intersphinx-role/index.rst44
-rw-r--r--tests/roots/test-ext-math-compat/conf.py20
-rw-r--r--tests/roots/test-ext-math-compat/index.rst21
-rw-r--r--tests/roots/test-ext-math-simple/conf.py0
-rw-r--r--tests/roots/test-ext-math-simple/index.rst4
-rw-r--r--tests/roots/test-ext-math/conf.py0
-rw-r--r--tests/roots/test-ext-math/index.rst25
-rw-r--r--tests/roots/test-ext-math/math.rst31
-rw-r--r--tests/roots/test-ext-math/nomath.rst0
-rw-r--r--tests/roots/test-ext-math/page.rst9
-rw-r--r--tests/roots/test-ext-napoleon/conf.py5
-rw-r--r--tests/roots/test-ext-napoleon/index.rst6
-rw-r--r--tests/roots/test-ext-napoleon/mypackage/__init__.py0
-rw-r--r--tests/roots/test-ext-napoleon/mypackage/typehints.py11
-rw-r--r--tests/roots/test-ext-napoleon/typehints.rst5
-rw-r--r--tests/roots/test-ext-todo/bar.rst4
-rw-r--r--tests/roots/test-ext-todo/conf.py1
-rw-r--r--tests/roots/test-ext-todo/foo.rst10
-rw-r--r--tests/roots/test-ext-todo/index.rst11
-rw-r--r--tests/roots/test-ext-viewcode-find/conf.py3
-rw-r--r--tests/roots/test-ext-viewcode-find/index.rst38
-rw-r--r--tests/roots/test-ext-viewcode-find/not_a_package/__init__.py1
-rw-r--r--tests/roots/test-ext-viewcode-find/not_a_package/submodule.py31
-rw-r--r--tests/roots/test-ext-viewcode/conf.py24
-rw-r--r--tests/roots/test-ext-viewcode/index.rst39
-rw-r--r--tests/roots/test-ext-viewcode/objects.rst169
-rw-r--r--tests/roots/test-ext-viewcode/spam/__init__.py2
-rw-r--r--tests/roots/test-ext-viewcode/spam/mod1.py30
-rw-r--r--tests/roots/test-ext-viewcode/spam/mod2.py22
-rw-r--r--tests/roots/test-ext-viewcode/spam/mod3.py3
-rw-r--r--tests/roots/test-extensions/conf.py4
-rw-r--r--tests/roots/test-extensions/read_parallel.py4
-rw-r--r--tests/roots/test-extensions/read_serial.py4
-rw-r--r--tests/roots/test-extensions/write_parallel.py4
-rw-r--r--tests/roots/test-extensions/write_serial.py4
-rw-r--r--tests/roots/test-footnotes/bar.rst6
-rw-r--r--tests/roots/test-footnotes/baz.rst6
-rw-r--r--tests/roots/test-footnotes/conf.py1
-rw-r--r--tests/roots/test-footnotes/index.rst188
-rw-r--r--tests/roots/test-footnotes/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-gettext-template/_templates/template1.html5
-rw-r--r--tests/roots/test-gettext-template/_templates/template2.html5
-rw-r--r--tests/roots/test-gettext-template/conf.py1
-rw-r--r--tests/roots/test-gettext-template/index.rst0
-rw-r--r--tests/roots/test-glossary/conf.py0
-rw-r--r--tests/roots/test-glossary/index.rst22
-rw-r--r--tests/roots/test-highlight_options/conf.py4
-rw-r--r--tests/roots/test-highlight_options/index.rst14
-rw-r--r--tests/roots/test-html_assets/conf.py12
-rw-r--r--tests/roots/test-html_assets/extra/.htaccess0
-rw-r--r--tests/roots/test-html_assets/extra/.htpasswd0
-rw-r--r--tests/roots/test-html_assets/extra/API.html_t1
-rw-r--r--tests/roots/test-html_assets/extra/css/style.css0
-rw-r--r--tests/roots/test-html_assets/extra/index.rst0
-rw-r--r--tests/roots/test-html_assets/extra/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-html_assets/extra/subdir/.htaccess0
-rw-r--r--tests/roots/test-html_assets/extra/subdir/.htpasswd0
-rw-r--r--tests/roots/test-html_assets/index.rst3
-rw-r--r--tests/roots/test-html_assets/static/.htaccess0
-rw-r--r--tests/roots/test-html_assets/static/.htpasswd0
-rw-r--r--tests/roots/test-html_assets/static/API.html_t1
-rw-r--r--tests/roots/test-html_assets/static/css/style.css0
-rw-r--r--tests/roots/test-html_assets/static/index.rst0
-rw-r--r--tests/roots/test-html_assets/static/js/custom.js0
-rw-r--r--tests/roots/test-html_assets/static/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-html_assets/static/subdir/.htaccess0
-rw-r--r--tests/roots/test-html_assets/static/subdir/.htpasswd0
-rw-r--r--tests/roots/test-html_assets/subdir/_build/index.html0
-rw-r--r--tests/roots/test-html_assets/subdir/background.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-html_entity/conf.py2
-rw-r--r--tests/roots/test-html_entity/index.rst31
-rw-r--r--tests/roots/test-html_file_checksum/conf.py1
-rw-r--r--tests/roots/test-html_file_checksum/index.rst0
-rw-r--r--tests/roots/test-html_file_checksum/static/empty.js0
-rw-r--r--tests/roots/test-html_file_checksum/static/script.js1
-rw-r--r--tests/roots/test-html_file_checksum/static/stylesheet-a.css1
-rw-r--r--tests/roots/test-html_file_checksum/static/stylesheet-b.css1
-rw-r--r--tests/roots/test-html_scaled_image_link/conf.py0
-rw-r--r--tests/roots/test-html_scaled_image_link/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-html_scaled_image_link/index.rst11
-rw-r--r--tests/roots/test-html_signaturereturn_icon/conf.py1
-rw-r--r--tests/roots/test-html_signaturereturn_icon/index.rst4
-rw-r--r--tests/roots/test-html_style/_static/default.css0
-rw-r--r--tests/roots/test-html_style/conf.py2
-rw-r--r--tests/roots/test-html_style/index.rst2
-rw-r--r--tests/roots/test-image-escape/conf.py0
-rw-r--r--tests/roots/test-image-escape/img_#1.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-image-escape/index.rst5
-rw-r--r--tests/roots/test-image-in-parsed-literal/conf.py9
-rw-r--r--tests/roots/test-image-in-parsed-literal/index.rst9
-rw-r--r--tests/roots/test-image-in-parsed-literal/pic.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-image-in-section/conf.py8
-rw-r--r--tests/roots/test-image-in-section/index.rst22
-rw-r--r--tests/roots/test-image-in-section/pic.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-images/conf.py0
-rw-r--r--tests/roots/test-images/img.gifbin0 -> 24976 bytes
-rw-r--r--tests/roots/test-images/img.ja.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-images/img.pdfbin0 -> 141783 bytes
-rw-r--r--tests/roots/test-images/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-images/img.zh.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-images/index.rst29
-rw-r--r--tests/roots/test-images/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-images/rimg.png.xxbin0 -> 218 bytes
-rw-r--r--tests/roots/test-images/rimg.xx.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-images/subdir/index.rst10
-rw-r--r--tests/roots/test-images/subdir/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-images/subdir/rimg.xx.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-images/subdir/svgimg.pdfbin0 -> 141783 bytes
-rw-r--r--tests/roots/test-images/subdir/svgimg.svg4
-rw-r--r--tests/roots/test-images/subdir/svgimg.xx.svg4
-rw-r--r--tests/roots/test-images/testimäge.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-index_on_title/conf.py0
-rw-r--r--tests/roots/test-index_on_title/contents.rst5
-rw-r--r--tests/roots/test-inheritance/basic_diagram.rst5
-rw-r--r--tests/roots/test-inheritance/conf.py7
-rw-r--r--tests/roots/test-inheritance/diagram_module_w_2_top_classes.rst6
-rw-r--r--tests/roots/test-inheritance/diagram_w_1_top_class.rst7
-rw-r--r--tests/roots/test-inheritance/diagram_w_2_top_classes.rst9
-rw-r--r--tests/roots/test-inheritance/diagram_w_nested_classes.rst5
-rw-r--r--tests/roots/test-inheritance/diagram_w_parts.rst7
-rw-r--r--tests/roots/test-inheritance/dummy/__init__.py0
-rw-r--r--tests/roots/test-inheritance/dummy/test.py35
-rw-r--r--tests/roots/test-inheritance/dummy/test_nested.py11
-rw-r--r--tests/roots/test-inheritance/index.rst4
-rw-r--r--tests/roots/test-intl/_templates/contents.html10
-rw-r--r--tests/roots/test-intl/admonitions.txt50
-rw-r--r--tests/roots/test-intl/bom.txt5
-rw-r--r--tests/roots/test-intl/conf.py8
-rw-r--r--tests/roots/test-intl/definition_terms.txt16
-rw-r--r--tests/roots/test-intl/docfields.txt46
-rw-r--r--tests/roots/test-intl/external_links.txt35
-rw-r--r--tests/roots/test-intl/figure.txt53
-rw-r--r--tests/roots/test-intl/footnote.txt14
-rw-r--r--tests/roots/test-intl/glossary_terms.txt29
-rw-r--r--tests/roots/test-intl/glossary_terms_inconsistency.txt6
-rw-r--r--tests/roots/test-intl/i18n.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-intl/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-intl/index.txt40
-rw-r--r--tests/roots/test-intl/index_entries.txt24
-rw-r--r--tests/roots/test-intl/label_target.txt67
-rw-r--r--tests/roots/test-intl/literalblock.txt71
-rw-r--r--tests/roots/test-intl/noqa.txt16
-rw-r--r--tests/roots/test-intl/only.txt14
-rw-r--r--tests/roots/test-intl/raw.txt8
-rw-r--r--tests/roots/test-intl/refs.txt48
-rw-r--r--tests/roots/test-intl/refs_inconsistency.txt13
-rw-r--r--tests/roots/test-intl/refs_python_domain.txt15
-rw-r--r--tests/roots/test-intl/role_xref.txt40
-rw-r--r--tests/roots/test-intl/rubric.txt14
-rw-r--r--tests/roots/test-intl/section.txt8
-rw-r--r--tests/roots/test-intl/seealso.txt15
-rw-r--r--tests/roots/test-intl/subdir/index.txt2
-rw-r--r--tests/roots/test-intl/table.txt20
-rw-r--r--tests/roots/test-intl/toctree.txt10
-rw-r--r--tests/roots/test-intl/topic.txt13
-rw-r--r--tests/roots/test-intl/translation_progress.txt40
-rw-r--r--tests/roots/test-intl/versionchange.txt16
-rw-r--r--tests/roots/test-intl/warnings.txt5
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/admonitions.po84
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/bom.po12
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/definition_terms.po47
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/docfields.po39
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/external_links.po47
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/figure.po57
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/footnote.po40
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms.po59
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms_inconsistency.po23
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/index.po29
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/index_entries.po77
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/label_target.po66
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/literalblock.po103
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/noqa.po46
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/only.po29
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/raw.po21
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/refs.po85
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/refs_inconsistency.po39
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/refs_python_domain.po25
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/role_xref.po47
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/rubric.po29
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/section.po28
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/seealso.po33
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/sphinx.po23
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/table.po54
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/toctree.po31
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/topic.po31
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/translation_progress.po57
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/versionchange.po33
-rw-r--r--tests/roots/test-intl/xx/LC_MESSAGES/warnings.po23
-rw-r--r--tests/roots/test-intl_substitution_definitions/conf.py13
-rw-r--r--tests/roots/test-intl_substitution_definitions/i18n.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-intl_substitution_definitions/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-intl_substitution_definitions/index.rst10
-rw-r--r--tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution.rst12
-rw-r--r--tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution_excluded.rst6
-rw-r--r--tests/roots/test-intl_substitution_definitions/xx/LC_MESSAGES/prolog_epilog_substitution.po38
-rw-r--r--tests/roots/test-keep_warnings/conf.py1
-rw-r--r--tests/roots/test-keep_warnings/index.rst2
-rw-r--r--tests/roots/test-latex-babel/bar.rst4
-rw-r--r--tests/roots/test-latex-babel/conf.py5
-rw-r--r--tests/roots/test-latex-babel/foo.rst4
-rw-r--r--tests/roots/test-latex-babel/index.rst8
-rw-r--r--tests/roots/test-latex-container/conf.py0
-rw-r--r--tests/roots/test-latex-container/index.rst4
-rw-r--r--tests/roots/test-latex-equations/conf.py2
-rw-r--r--tests/roots/test-latex-equations/equations.rst21
-rw-r--r--tests/roots/test-latex-equations/expects/latex-equations.tex18
-rw-r--r--tests/roots/test-latex-figure-in-admonition/conf.py1
-rw-r--r--tests/roots/test-latex-figure-in-admonition/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-latex-figure-in-admonition/index.rst9
-rw-r--r--tests/roots/test-latex-includegraphics/conf.py47
-rw-r--r--tests/roots/test-latex-includegraphics/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-latex-includegraphics/index.rst37
-rw-r--r--tests/roots/test-latex-includegraphics/sphinx.pngbin0 -> 34213 bytes
-rw-r--r--tests/roots/test-latex-includegraphics/tall.pngbin0 -> 38192 bytes
-rw-r--r--tests/roots/test-latex-index/conf.py0
-rw-r--r--tests/roots/test-latex-index/index.rst16
-rw-r--r--tests/roots/test-latex-labels-before-module/automodule1.py2
-rw-r--r--tests/roots/test-latex-labels-before-module/automodule2a.py2
-rw-r--r--tests/roots/test-latex-labels-before-module/automodule2b.py2
-rw-r--r--tests/roots/test-latex-labels-before-module/automodule3.py2
-rw-r--r--tests/roots/test-latex-labels-before-module/conf.py8
-rw-r--r--tests/roots/test-latex-labels-before-module/index.rst48
-rw-r--r--tests/roots/test-latex-labels/conf.py0
-rw-r--r--tests/roots/test-latex-labels/index.rst72
-rw-r--r--tests/roots/test-latex-labels/otherdoc.rst2
-rw-r--r--tests/roots/test-latex-numfig/conf.py8
-rw-r--r--tests/roots/test-latex-numfig/index.rst9
-rw-r--r--tests/roots/test-latex-numfig/indexhowto.rst10
-rw-r--r--tests/roots/test-latex-numfig/indexmanual.rst13
-rw-r--r--tests/roots/test-latex-table/_mytemplates/latex/longtable.tex_t1
-rw-r--r--tests/roots/test-latex-table/complex.rst58
-rw-r--r--tests/roots/test-latex-table/conf.py0
-rw-r--r--tests/roots/test-latex-table/expects/complex_spanning_cell.tex69
-rw-r--r--tests/roots/test-latex-table/expects/gridtable.tex73
-rw-r--r--tests/roots/test-latex-table/expects/gridtable_with_tabularcolumn.tex73
-rw-r--r--tests/roots/test-latex-table/expects/longtable.tex70
-rw-r--r--tests/roots/test-latex-table/expects/longtable_having_align.tex69
-rw-r--r--tests/roots/test-latex-table/expects/longtable_having_caption.tex71
-rw-r--r--tests/roots/test-latex-table/expects/longtable_having_problematic_cell.tex76
-rw-r--r--tests/roots/test-latex-table/expects/longtable_having_stub_columns_and_problematic_cell.tex81
-rw-r--r--tests/roots/test-latex-table/expects/longtable_having_verbatim.tex70
-rw-r--r--tests/roots/test-latex-table/expects/longtable_having_widths.tex73
-rw-r--r--tests/roots/test-latex-table/expects/longtable_having_widths_and_problematic_cell.tex76
-rw-r--r--tests/roots/test-latex-table/expects/longtable_with_tabularcolumn.tex70
-rw-r--r--tests/roots/test-latex-table/expects/simple_table.tex40
-rw-r--r--tests/roots/test-latex-table/expects/table_having_caption.tex44
-rw-r--r--tests/roots/test-latex-table/expects/table_having_problematic_cell.tex47
-rw-r--r--tests/roots/test-latex-table/expects/table_having_stub_columns_and_problematic_cell.tex49
-rw-r--r--tests/roots/test-latex-table/expects/table_having_threeparagraphs_cell_in_first_col.tex26
-rw-r--r--tests/roots/test-latex-table/expects/table_having_verbatim.tex41
-rw-r--r--tests/roots/test-latex-table/expects/table_having_widths.tex46
-rw-r--r--tests/roots/test-latex-table/expects/table_having_widths_and_problematic_cell.tex47
-rw-r--r--tests/roots/test-latex-table/expects/tabular_having_widths.tex40
-rw-r--r--tests/roots/test-latex-table/expects/tabularcolumn.tex41
-rw-r--r--tests/roots/test-latex-table/expects/tabulary_having_widths.tex40
-rw-r--r--tests/roots/test-latex-table/index.rst8
-rw-r--r--tests/roots/test-latex-table/longtable.rst156
-rw-r--r--tests/roots/test-latex-table/tabular.rst173
-rw-r--r--tests/roots/test-latex-theme/conf.py2
-rw-r--r--tests/roots/test-latex-theme/index.rst2
-rw-r--r--tests/roots/test-latex-theme/theme/custom/theme.conf6
-rw-r--r--tests/roots/test-latex-title/conf.py4
-rw-r--r--tests/roots/test-latex-title/index.rst12
-rw-r--r--tests/roots/test-latex-unicode/conf.py0
-rw-r--r--tests/roots/test-latex-unicode/index.rst7
-rw-r--r--tests/roots/test-linkcheck-anchors-ignore-for-url/conf.py3
-rw-r--r--tests/roots/test-linkcheck-anchors-ignore-for-url/index.rst7
-rw-r--r--tests/roots/test-linkcheck-anchors-ignore/conf.py3
-rw-r--r--tests/roots/test-linkcheck-anchors-ignore/index.rst2
-rw-r--r--tests/roots/test-linkcheck-documents_exclude/br0ken_link.rst5
-rw-r--r--tests/roots/test-linkcheck-documents_exclude/broken_link.rst5
-rw-r--r--tests/roots/test-linkcheck-documents_exclude/conf.py6
-rw-r--r--tests/roots/test-linkcheck-documents_exclude/index.rst3
-rw-r--r--tests/roots/test-linkcheck-localserver-anchor/conf.py3
-rw-r--r--tests/roots/test-linkcheck-localserver-anchor/index.rst1
-rw-r--r--tests/roots/test-linkcheck-localserver-https/conf.py2
-rw-r--r--tests/roots/test-linkcheck-localserver-https/index.rst1
-rw-r--r--tests/roots/test-linkcheck-localserver-warn-redirects/conf.py2
-rw-r--r--tests/roots/test-linkcheck-localserver-warn-redirects/index.rst3
-rw-r--r--tests/roots/test-linkcheck-localserver/conf.py2
-rw-r--r--tests/roots/test-linkcheck-localserver/index.rst1
-rw-r--r--tests/roots/test-linkcheck-raw-node/conf.py2
-rw-r--r--tests/roots/test-linkcheck-raw-node/index.rst2
-rw-r--r--tests/roots/test-linkcheck-too-many-retries/conf.py3
-rw-r--r--tests/roots/test-linkcheck-too-many-retries/index.rst1
-rw-r--r--tests/roots/test-linkcheck/conf.py4
-rw-r--r--tests/roots/test-linkcheck/links.rst14
-rw-r--r--tests/roots/test-local-logo/conf.py4
-rw-r--r--tests/roots/test-local-logo/images/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-local-logo/index.rst31
-rw-r--r--tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.mobin0 -> 80 bytes
-rw-r--r--tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.po2
-rw-r--r--tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.mobin0 -> 80 bytes
-rw-r--r--tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.po2
-rw-r--r--tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.mobin0 -> 82 bytes
-rw-r--r--tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.po2
-rw-r--r--tests/roots/test-manpage_url/conf.py1
-rw-r--r--tests/roots/test-manpage_url/index.rst3
-rw-r--r--tests/roots/test-markup-citation/conf.py3
-rw-r--r--tests/roots/test-markup-citation/index.rst9
-rw-r--r--tests/roots/test-markup-rubric/conf.py3
-rw-r--r--tests/roots/test-markup-rubric/index.rst7
-rw-r--r--tests/roots/test-maxlistdepth/conf.py5
-rw-r--r--tests/roots/test-maxlistdepth/index.rst57
-rw-r--r--tests/roots/test-metadata/conf.py0
-rw-r--r--tests/roots/test-metadata/index.rst46
-rw-r--r--tests/roots/test-need-escaped/bar.rst2
-rw-r--r--tests/roots/test-need-escaped/baz.rst2
-rw-r--r--tests/roots/test-need-escaped/conf.py2
-rw-r--r--tests/roots/test-need-escaped/foo.rst15
-rw-r--r--tests/roots/test-need-escaped/index.rst30
-rw-r--r--tests/roots/test-need-escaped/quux.rst2
-rw-r--r--tests/roots/test-need-escaped/qux.rst1
-rw-r--r--tests/roots/test-nested-enumerated-list/conf.py0
-rw-r--r--tests/roots/test-nested-enumerated-list/index.rst21
-rw-r--r--tests/roots/test-nested-tables/conf.py0
-rw-r--r--tests/roots/test-nested-tables/index.rst16
-rw-r--r--tests/roots/test-nitpicky-warnings/conf.py1
-rw-r--r--tests/roots/test-nitpicky-warnings/index.rst7
-rw-r--r--tests/roots/test-numbered-circular/conf.py1
-rw-r--r--tests/roots/test-numbered-circular/index.rst5
-rw-r--r--tests/roots/test-numbered-circular/sub.rst3
-rw-r--r--tests/roots/test-numfig/bar.rst66
-rw-r--r--tests/roots/test-numfig/baz.rst24
-rw-r--r--tests/roots/test-numfig/conf.py1
-rw-r--r--tests/roots/test-numfig/foo.rst81
-rw-r--r--tests/roots/test-numfig/index.rst59
-rw-r--r--tests/roots/test-numfig/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-object-description-sections/conf.py0
-rw-r--r--tests/roots/test-object-description-sections/index.rst6
-rw-r--r--tests/roots/test-productionlist/Bare.rst6
-rw-r--r--tests/roots/test-productionlist/Dup1.rst5
-rw-r--r--tests/roots/test-productionlist/Dup2.rst5
-rw-r--r--tests/roots/test-productionlist/LineContinuation.rst6
-rw-r--r--tests/roots/test-productionlist/P1.rst6
-rw-r--r--tests/roots/test-productionlist/P2.rst6
-rw-r--r--tests/roots/test-productionlist/conf.py1
-rw-r--r--tests/roots/test-productionlist/firstLineRule.rst5
-rw-r--r--tests/roots/test-productionlist/index.rst27
-rw-r--r--tests/roots/test-prolog/conf.py10
-rw-r--r--tests/roots/test-prolog/index.rst7
-rw-r--r--tests/roots/test-prolog/markdown.md3
-rw-r--r--tests/roots/test-prolog/prolog_markdown_parser.py13
-rw-r--r--tests/roots/test-prolog/restructuredtext.rst4
-rw-r--r--tests/roots/test-pycode/cp_1251_coded.py4
-rw-r--r--tests/roots/test-reST-code-block/conf.py0
-rw-r--r--tests/roots/test-reST-code-block/index.rst7
-rw-r--r--tests/roots/test-reST-code-role/conf.py0
-rw-r--r--tests/roots/test-reST-code-role/index.rst9
-rw-r--r--tests/roots/test-refonly_bullet_list/conf.py1
-rw-r--r--tests/roots/test-refonly_bullet_list/index.rst14
-rw-r--r--tests/roots/test-remote-logo/conf.py5
-rw-r--r--tests/roots/test-remote-logo/index.rst31
-rw-r--r--tests/roots/test-roles-download/another/dummy.dat1
-rw-r--r--tests/roots/test-roles-download/conf.py3
-rw-r--r--tests/roots/test-roles-download/dummy.dat0
-rw-r--r--tests/roots/test-roles-download/index.rst7
-rw-r--r--tests/roots/test-root/Makefile67
-rw-r--r--tests/roots/test-root/_templates/contentssb.html2
-rw-r--r--tests/roots/test-root/_templates/customsb.html4
-rw-r--r--tests/roots/test-root/_templates/layout.html15
-rw-r--r--tests/roots/test-root/autodoc.txt39
-rw-r--r--tests/roots/test-root/autodoc_target.py221
-rw-r--r--tests/roots/test-root/bom.txt5
-rw-r--r--tests/roots/test-root/conf.py148
-rw-r--r--tests/roots/test-root/extapi.txt7
-rw-r--r--tests/roots/test-root/extensions.txt28
-rw-r--r--tests/roots/test-root/file_with_special_#_chars.xyz0
-rw-r--r--tests/roots/test-root/footnote.txt60
-rw-r--r--tests/roots/test-root/images.txt25
-rw-r--r--tests/roots/test-root/img.foo.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-root/img.gifbin0 -> 24976 bytes
-rw-r--r--tests/roots/test-root/img.pdfbin0 -> 141783 bytes
-rw-r--r--tests/roots/test-root/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-root/includes.txt102
-rw-r--r--tests/roots/test-root/index.txt65
-rw-r--r--tests/roots/test-root/lists.txt70
-rw-r--r--tests/roots/test-root/literal.inc13
-rw-r--r--tests/roots/test-root/literal_orig.inc12
-rw-r--r--tests/roots/test-root/markup.txt455
-rw-r--r--tests/roots/test-root/math.txt31
-rw-r--r--tests/roots/test-root/objects.txt262
-rw-r--r--tests/roots/test-root/otherext.foo2
-rw-r--r--tests/roots/test-root/parsermod.py14
-rw-r--r--tests/roots/test-root/quotes.inc1
-rw-r--r--tests/roots/test-root/rimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-root/special/api.h2
-rw-r--r--tests/roots/test-root/special/code.py2
-rw-r--r--tests/roots/test-root/subdir/excluded.txt2
-rw-r--r--tests/roots/test-root/subdir/images.txt6
-rw-r--r--tests/roots/test-root/subdir/img.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-root/subdir/include.inc5
-rw-r--r--tests/roots/test-root/subdir/includes.txt18
-rw-r--r--tests/roots/test-root/subdir/simg.pngbin0 -> 66247 bytes
-rw-r--r--tests/roots/test-root/svgimg.pdfbin0 -> 141783 bytes
-rw-r--r--tests/roots/test-root/svgimg.svg4
-rw-r--r--tests/roots/test-root/tabs.inc5
-rw-r--r--tests/roots/test-root/test.inc3
-rw-r--r--tests/roots/test-root/wrongenc.inc3
-rw-r--r--tests/roots/test-search/conf.py2
-rw-r--r--tests/roots/test-search/index.rst30
-rw-r--r--tests/roots/test-search/nosearch.rst7
-rw-r--r--tests/roots/test-search/tocitem.rst17
-rw-r--r--tests/roots/test-smartquotes/conf.py0
-rw-r--r--tests/roots/test-smartquotes/index.rst8
-rw-r--r--tests/roots/test-smartquotes/literals.rst12
-rw-r--r--tests/roots/test-stylesheets/_templates/layout.html8
-rw-r--r--tests/roots/test-stylesheets/conf.py9
-rw-r--r--tests/roots/test-stylesheets/index.rst4
-rw-r--r--tests/roots/test-templating/_templates/autosummary/class.rst9
-rw-r--r--tests/roots/test-templating/_templates/layout.html6
-rw-r--r--tests/roots/test-templating/autosummary_templating.txt7
-rw-r--r--tests/roots/test-templating/conf.py9
-rw-r--r--tests/roots/test-templating/index.txt7
-rw-r--r--tests/roots/test-theming/child.zipbin0 -> 661 bytes
-rw-r--r--tests/roots/test-theming/conf.py3
-rw-r--r--tests/roots/test-theming/index.rst5
-rw-r--r--tests/roots/test-theming/parent.zipbin0 -> 1039 bytes
-rw-r--r--tests/roots/test-theming/test_theme/__init__.py5
-rw-r--r--tests/roots/test-theming/test_theme/staticfiles/layout.html5
-rw-r--r--tests/roots/test-theming/test_theme/staticfiles/static/staticimg.pngbin0 -> 120 bytes
-rw-r--r--tests/roots/test-theming/test_theme/staticfiles/static/statictmpl.html_t2
-rw-r--r--tests/roots/test-theming/test_theme/staticfiles/theme.conf7
-rw-r--r--tests/roots/test-theming/test_theme/test-theme/theme.conf4
-rw-r--r--tests/roots/test-theming/ziptheme.zipbin0 -> 1039 bytes
-rw-r--r--tests/roots/test-tocdepth/bar.rst27
-rw-r--r--tests/roots/test-tocdepth/baz.rst5
-rw-r--r--tests/roots/test-tocdepth/conf.py2
-rw-r--r--tests/roots/test-tocdepth/foo.rst26
-rw-r--r--tests/roots/test-tocdepth/index.rst8
-rw-r--r--tests/roots/test-toctree-domain-objects/conf.py0
-rw-r--r--tests/roots/test-toctree-domain-objects/domains.rst39
-rw-r--r--tests/roots/test-toctree-domain-objects/index.rst6
-rw-r--r--tests/roots/test-toctree-duplicated/conf.py0
-rw-r--r--tests/roots/test-toctree-duplicated/foo.rst2
-rw-r--r--tests/roots/test-toctree-duplicated/index.rst7
-rw-r--r--tests/roots/test-toctree-empty/_templates/localtoc.html2
-rw-r--r--tests/roots/test-toctree-empty/conf.py2
-rw-r--r--tests/roots/test-toctree-empty/index.rst4
-rw-r--r--tests/roots/test-toctree-glob/bar/bar_1.rst4
-rw-r--r--tests/roots/test-toctree-glob/bar/bar_2.rst4
-rw-r--r--tests/roots/test-toctree-glob/bar/bar_3.rst4
-rw-r--r--tests/roots/test-toctree-glob/bar/bar_4/index.rst4
-rw-r--r--tests/roots/test-toctree-glob/bar/index.rst8
-rw-r--r--tests/roots/test-toctree-glob/baz.rst4
-rw-r--r--tests/roots/test-toctree-glob/conf.py1
-rw-r--r--tests/roots/test-toctree-glob/foo.rst4
-rw-r--r--tests/roots/test-toctree-glob/index.rst28
-rw-r--r--tests/roots/test-toctree-glob/quux.rst4
-rw-r--r--tests/roots/test-toctree-glob/qux/index.rst8
-rw-r--r--tests/roots/test-toctree-glob/qux/qux_1.rst4
-rw-r--r--tests/roots/test-toctree-glob/qux/qux_2.rst4
-rw-r--r--tests/roots/test-toctree-index/conf.py0
-rw-r--r--tests/roots/test-toctree-index/foo.rst8
-rw-r--r--tests/roots/test-toctree-index/index.rst15
-rw-r--r--tests/roots/test-toctree-maxdepth/bar.rst27
-rw-r--r--tests/roots/test-toctree-maxdepth/baz.rst5
-rw-r--r--tests/roots/test-toctree-maxdepth/conf.py1
-rw-r--r--tests/roots/test-toctree-maxdepth/foo.rst26
-rw-r--r--tests/roots/test-toctree-maxdepth/index.rst9
-rw-r--r--tests/roots/test-toctree-maxdepth/qux.rst9
-rw-r--r--tests/roots/test-toctree/bar.rst2
-rw-r--r--tests/roots/test-toctree/baz.rst2
-rw-r--r--tests/roots/test-toctree/conf.py0
-rw-r--r--tests/roots/test-toctree/foo.rst15
-rw-r--r--tests/roots/test-toctree/index.rst55
-rw-r--r--tests/roots/test-toctree/quux.rst2
-rw-r--r--tests/roots/test-toctree/qux.rst1
-rw-r--r--tests/roots/test-toctree/tocdepth.rst15
-rw-r--r--tests/roots/test-transforms-post_transforms-keyboard/conf.py0
-rw-r--r--tests/roots/test-transforms-post_transforms-keyboard/index.rst4
-rw-r--r--tests/roots/test-transforms-post_transforms-missing-reference/conf.py1
-rw-r--r--tests/roots/test-transforms-post_transforms-missing-reference/index.rst5
-rw-r--r--tests/roots/test-trim_doctest_flags/conf.py1
-rw-r--r--tests/roots/test-trim_doctest_flags/index.rst40
-rw-r--r--tests/roots/test-versioning/added.txt20
-rw-r--r--tests/roots/test-versioning/conf.py3
-rw-r--r--tests/roots/test-versioning/deleted.txt12
-rw-r--r--tests/roots/test-versioning/deleted_end.txt11
-rw-r--r--tests/roots/test-versioning/index.txt13
-rw-r--r--tests/roots/test-versioning/insert.txt18
-rw-r--r--tests/roots/test-versioning/insert_beginning.txt18
-rw-r--r--tests/roots/test-versioning/insert_similar.txt17
-rw-r--r--tests/roots/test-versioning/modified.txt17
-rw-r--r--tests/roots/test-versioning/original.txt15
-rw-r--r--tests/roots/test-warnings/autodoc_fodder.py6
-rw-r--r--tests/roots/test-warnings/conf.py6
-rw-r--r--tests/roots/test-warnings/index.rst45
-rw-r--r--tests/roots/test-warnings/svgimg.pdfbin0 -> 141783 bytes
-rw-r--r--tests/roots/test-warnings/svgimg.svg4
-rw-r--r--tests/roots/test-warnings/undecodable.rst3
-rw-r--r--tests/roots/test-warnings/wrongenc.inc3
-rw-r--r--tests/test_addnodes.py51
-rw-r--r--tests/test_api_translator.py92
-rw-r--r--tests/test_application.py152
-rw-r--r--tests/test_build.py135
-rw-r--r--tests/test_build_changes.py34
-rw-r--r--tests/test_build_dirhtml.py40
-rw-r--r--tests/test_build_epub.py411
-rw-r--r--tests/test_build_gettext.py235
-rw-r--r--tests/test_build_html.py1841
-rw-r--r--tests/test_build_latex.py1755
-rw-r--r--tests/test_build_linkcheck.py989
-rw-r--r--tests/test_build_manpage.py105
-rw-r--r--tests/test_build_texinfo.py155
-rw-r--r--tests/test_build_text.py278
-rw-r--r--tests/test_builder.py39
-rw-r--r--tests/test_catalogs.py74
-rw-r--r--tests/test_config.py517
-rw-r--r--tests/test_correct_year.py29
-rw-r--r--tests/test_directive_code.py595
-rw-r--r--tests/test_directive_object_description.py59
-rw-r--r--tests/test_directive_only.py46
-rw-r--r--tests/test_directive_other.py195
-rw-r--r--tests/test_directive_patch.py110
-rw-r--r--tests/test_directives_no_typesetting.py108
-rw-r--r--tests/test_docutilsconf.py29
-rw-r--r--tests/test_domain_c.py1076
-rw-r--r--tests/test_domain_cpp.py1744
-rw-r--r--tests/test_domain_js.py505
-rw-r--r--tests/test_domain_py.py2123
-rw-r--r--tests/test_domain_rst.py137
-rw-r--r--tests/test_domain_std.py495
-rw-r--r--tests/test_environment.py145
-rw-r--r--tests/test_environment_indexentries.py166
-rw-r--r--tests/test_environment_record_dependencies.py10
-rw-r--r--tests/test_environment_toctree.py396
-rw-r--r--tests/test_errors.py11
-rw-r--r--tests/test_events.py56
-rw-r--r--tests/test_ext_apidoc.py665
-rw-r--r--tests/test_ext_autodoc.py2537
-rw-r--r--tests/test_ext_autodoc_autoattribute.py176
-rw-r--r--tests/test_ext_autodoc_autoclass.py517
-rw-r--r--tests/test_ext_autodoc_autodata.py106
-rw-r--r--tests/test_ext_autodoc_autofunction.py201
-rw-r--r--tests/test_ext_autodoc_automodule.py192
-rw-r--r--tests/test_ext_autodoc_autoproperty.py91
-rw-r--r--tests/test_ext_autodoc_configs.py1727
-rw-r--r--tests/test_ext_autodoc_events.py118
-rw-r--r--tests/test_ext_autodoc_mock.py152
-rw-r--r--tests/test_ext_autodoc_preserve_defaults.py192
-rw-r--r--tests/test_ext_autodoc_private_members.py158
-rw-r--r--tests/test_ext_autosectionlabel.py77
-rw-r--r--tests/test_ext_autosummary.py686
-rw-r--r--tests/test_ext_coverage.py101
-rw-r--r--tests/test_ext_doctest.py136
-rw-r--r--tests/test_ext_duration.py14
-rw-r--r--tests/test_ext_extlinks.py45
-rw-r--r--tests/test_ext_githubpages.py26
-rw-r--r--tests/test_ext_graphviz.py196
-rw-r--r--tests/test_ext_ifconfig.py28
-rw-r--r--tests/test_ext_imgconverter.py34
-rw-r--r--tests/test_ext_imgmockconverter.py17
-rw-r--r--tests/test_ext_inheritance_diagram.py342
-rw-r--r--tests/test_ext_intersphinx.py568
-rw-r--r--tests/test_ext_math.py345
-rw-r--r--tests/test_ext_napoleon.py218
-rw-r--r--tests/test_ext_napoleon_docstring.py2660
-rw-r--r--tests/test_ext_todo.py109
-rw-r--r--tests/test_ext_viewcode.py137
-rw-r--r--tests/test_extension.py23
-rw-r--r--tests/test_highlighting.py104
-rw-r--r--tests/test_intl.py1527
-rw-r--r--tests/test_locale.py76
-rw-r--r--tests/test_markup.py619
-rw-r--r--tests/test_metadata.py43
-rw-r--r--tests/test_parser.py57
-rw-r--r--tests/test_project.py78
-rw-r--r--tests/test_pycode.py173
-rw-r--r--tests/test_pycode_ast.py62
-rw-r--r--tests/test_pycode_parser.py511
-rw-r--r--tests/test_quickstart.py260
-rw-r--r--tests/test_roles.py75
-rw-r--r--tests/test_search.py306
-rw-r--r--tests/test_smartquotes.py99
-rw-r--r--tests/test_templating.py41
-rw-r--r--tests/test_theming.py131
-rw-r--r--tests/test_toctree.py39
-rw-r--r--tests/test_transforms_move_module_targets.py77
-rw-r--r--tests/test_transforms_post_transforms.py268
-rw-r--r--tests/test_transforms_post_transforms_code.py44
-rw-r--r--tests/test_transforms_reorder_nodes.py96
-rw-r--r--tests/test_util.py73
-rw-r--r--tests/test_util_display.py103
-rw-r--r--tests/test_util_docstrings.py88
-rw-r--r--tests/test_util_docutils.py92
-rw-r--r--tests/test_util_fileutil.py103
-rw-r--r--tests/test_util_i18n.py190
-rw-r--r--tests/test_util_images.py74
-rw-r--r--tests/test_util_inspect.py869
-rw-r--r--tests/test_util_inventory.py116
-rw-r--r--tests/test_util_logging.py398
-rw-r--r--tests/test_util_matching.py174
-rw-r--r--tests/test_util_nodes.py254
-rw-r--r--tests/test_util_rst.py164
-rw-r--r--tests/test_util_template.py29
-rw-r--r--tests/test_util_typing.py536
-rw-r--r--tests/test_versioning.py120
-rw-r--r--tests/test_writer_latex.py28
-rw-r--r--tests/typing_test_data.py129
-rw-r--r--tests/utils.py55
-rw-r--r--tox.ini55
-rw-r--r--utils/CHANGES_template20
-rw-r--r--utils/__init__.py0
-rw-r--r--utils/babel_runner.py250
-rw-r--r--utils/bump_docker.py52
-rwxr-xr-xutils/bump_version.py183
-rw-r--r--utils/release-checklist70
1664 files changed, 442900 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..786d28c
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,95 @@
+Maintainers
+===========
+
+*Listed alphabetically in forename, surname order*
+
+* Adam Turner <@AA-Turner>
+* Armin Ronacher <armin.ronacher@active-4.com>
+* Daniel Neuhäuser <@DasIch>
+* François Freitag <@francoisfreitag>
+* Georg Brandl <georg@python.org>
+* Jakob Lykke Andersen <@jakobandersen>
+* Jean-François Burnol <@jfbu>
+* Rob Ruana <@RobRuana>
+* Robert Lehmann <@lehmannro>
+* Stephen Finucane <@stephenfin>
+* Takayuki Shimizukawa <shimizukawa@gmail.com>
+* Takeshi Komiya <@tk0miya>
+* Timotheus Kampik <@TimKam>
+* Yoshiki Shibukawa <@shibukawa>
+
+Contributors
+============
+
+*Listed alphabetically in forename, surname order*
+
+* Adrián Chaves (Gallaecio) -- coverage builder improvements
+* Alastair Houghton -- Apple Help builder
+* Alexander Todorov -- inheritance_diagram tests and improvements
+* Andi Albrecht -- agogo theme
+* Antonio Valentino -- qthelp builder, docstring inheritance
+* Antti Kaihola -- doctest extension (skipif option)
+* Barry Warsaw -- setup command improvements
+* Ben Egan -- Napoleon improvements
+* Benjamin Peterson -- unittests
+* Blaise Laflamme -- pyramid theme
+* Bruce Mitchener -- Minor epub improvement
+* Buck Evan -- dummy builder
+* Charles Duffy -- original graphviz extension
+* Chris Lamb -- reproducibility fixes
+* Christopher Perkins -- autosummary integration
+* Dan MacKinlay -- metadata fixes
+* Daniel Bültmann -- todo extension
+* Daniel Neuhäuser -- JavaScript domain, Python 3 support (GSOC)
+* Daniel Pizetta -- inheritance diagram improvements
+* Dave Kuhlman -- original LaTeX writer
+* Doug Hellmann -- graphviz improvements
+* Eric N. Vander Weele -- autodoc improvements
+* Etienne Desautels -- apidoc module
+* Ezio Melotti -- collapsible sidebar JavaScript
+* Filip Vavera -- napoleon todo directive
+* Glenn Matthews -- python domain signature improvements
+* Gregory Szorc -- performance improvements
+* Henrique Bastos -- SVG support for graphviz extension
+* Hernan Grecco -- search improvements
+* Hong Xu -- svg support in imgmath extension and various bug fixes
+* Horst Gutmann -- internationalization support
+* Hugo van Kemenade -- support FORCE_COLOR and NO_COLOR
+* Ian Lee -- quickstart improvements
+* Jacob Mason -- websupport library (GSOC project)
+* Jeppe Pihl -- literalinclude improvements
+* Joel Wurtz -- cellspanning support in LaTeX
+* John Waltman -- Texinfo builder
+* Josip Dzolonga -- coverage builder
+* Julien Palard -- Colspan and rowspan in text builder
+* Kevin Dunn -- MathJax extension
+* KINEBUCHI Tomohiko -- typing Sphinx as well as docutils
+* Kurt McKee -- documentation updates
+* Lars Hupfeldt Nielsen - OpenSSL FIPS mode md5 bug fix
+* Åukasz Langa -- partial support for autodoc
+* Marco Buttu -- doctest extension (pyversion option)
+* Martin Hans -- autodoc improvements
+* Martin Larralde -- additional napoleon admonitions
+* Martin Mahner -- nature theme
+* Matthew Fernandez -- todo extension fix
+* Matthew Woodcraft -- text output improvements
+* Michael Droettboom -- inheritance_diagram extension
+* Michael Wilson -- Intersphinx HTTP basic auth support
+* Nathan Damon -- bugfix in validation of static paths in html builders
+* Pauli Virtanen -- autodoc improvements, autosummary extension
+* Rob Ruana -- napoleon extension
+* Robert Lehmann -- gettext builder (GSOC project)
+* Roland Meister -- epub builder
+* Sebastian Wiesner -- image handling, distutils support
+* Stefan Seefeld -- toctree improvements
+* Stefan van der Walt -- autosummary extension
+* T. Powers -- HTML output improvements
+* Taku Shimizu -- epub3 builder
+* Thomas Lamb -- linkcheck builder
+* Thomas Waldmann -- apidoc module fixes
+* Tim Hoffmann -- theme improvements
+* Vince Salvino -- JavaScript search improvements
+* Will Maier -- directory HTML builder
+* Zac Hatfield-Dodds -- doctest reporting improvements, intersphinx performance
+
+Many thanks for all contributions!
diff --git a/CHANGES b/CHANGES
new file mode 100644
index 0000000..84c7abf
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,9019 @@
+Release 7.2.6 (released Sep 13, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11679: Add the :envvar:`!SPHINX_AUTODOC_RELOAD_MODULES` environment variable,
+ which if set reloads modules when using autodoc with ``TYPE_CHECKING = True``.
+ Patch by Matt Wozniski and Adam Turner.
+* #11679: Use :py:func:`importlib.reload` to reload modules in autodoc.
+ Patch by Matt Wozniski and Adam Turner.
+
+Release 7.2.5 (released Aug 30, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11645: Fix a regression preventing autodoc from importing modules within
+ packages that make use of ``if typing.TYPE_CHECKING:`` to guard circular
+ imports needed by type checkers.
+ Patch by Matt Wozniski.
+* #11634: Fixed inheritance diagram relative link resolution
+ for sibling files in a subdirectory.
+ Patch by Albert Shih.
+* #11659: Allow ``?config=...`` in :confval:`mathjax_path`.
+* #11654: autodoc: Fail with a more descriptive error message
+ when an object claims to be an instance of ``type``,
+ but is not a class.
+ Patch by James Braza.
+* 11620: Cease emitting :event:`source-read` events for files read via
+ the :dudir:`include` directive.
+* 11620: Add a new :event:`include-read` for observing and transforming
+ the content of included files via the :dudir:`include` directive.
+* #11627: Restore support for copyright lines of the form ``YYYY``
+ when ``SOURCE_DATE_EPOCH`` is set.
+
+Release 7.2.4 (released Aug 28, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11618: Fix a regression in the MoveModuleTargets transform,
+ introduced in #10478 (#9662).
+* #11649: linkcheck: Resolve hanging tests for timezones west of London
+ and incorrect conversion from UTC to offsets from the UNIX epoch.
+ Patch by Dmitry Shachnev and Adam Turner.
+
+Release 7.2.3 (released Aug 23, 2023)
+=====================================
+
+Dependencies
+------------
+
+* #11576: Require sphinxcontrib-serializinghtml 1.1.9.
+
+Bugs fixed
+----------
+
+* Fix regression in ``autodoc.Documenter.parse_name()``.
+* Fix regression in JSON serialisation.
+* #11543: autodoc: Support positional-only parameters in ``classmethod`` methods
+ when ``autodoc_preserve_defaults`` is ``True``.
+* Restore support string methods on path objects.
+ This is deprecated and will be removed in Sphinx 8.
+ Use :py:func:`os.fspath` to convert :py:class:`~pathlib.Path` objects to strings,
+ or :py:class:`~pathlib.Path`'s methods to work with path objects.
+
+Release 7.2.2 (released Aug 17, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* Fix the signature of the ``StateMachine.insert_input()`` patch,
+ for when calling with keyword arguments.
+* Fixed membership testing (``in``) for the :py:class:`str` interface
+ of the asset classes (``_CascadingStyleSheet`` and ``_JavaScript``),
+ which several extensions relied upon.
+* Fixed a type error in ``SingleFileHTMLBuilder._get_local_toctree``,
+ ``includehidden`` may be passed as a string or a boolean.
+* Fix ``:noindex:`` for ``PyModule`` and ``JSModule``.
+
+Release 7.2.1 (released Aug 17, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* Restored the the :py:class:`str` interface of the asset classes
+ (``_CascadingStyleSheet`` and ``_JavaScript``), which several extensions relied upon.
+ This will be removed in Sphinx 9.
+* Restored calls to ``Builder.add_{css,js}_file()``,
+ which several extensions relied upon.
+* Restored the private API ``TocTree.get_toctree_ancestors()``,
+ which several extensions relied upon.
+
+Release 7.2.0 (released Aug 17, 2023)
+=====================================
+
+Dependencies
+------------
+
+* #11511: Drop Python 3.8 support.
+* #11576: Require Pygments 2.14 or later.
+
+Deprecated
+----------
+
+* #11512: Deprecate ``sphinx.util.md5`` and ``sphinx.util.sha1``.
+ Use ``hashlib`` instead.
+* #11526: Deprecate ``sphinx.testing.path``.
+ Use ``os.path`` or ``pathlib`` instead.
+* #11528: Deprecate ``sphinx.util.split_index_msg`` and ``sphinx.util.split_into``.
+ Use ``sphinx.util.index_entries.split_index_msg`` instead.
+* Deprecate ``sphinx.builders.html.Stylesheet``
+ and ``sphinx.builders.html.Javascript``.
+ Use ``sphinx.application.Sphinx.add_css_file()``
+ and ``sphinx.application.Sphinx.add_js_file()`` instead.
+* #11582: Deprecate ``sphinx.builders.html.StandaloneHTMLBuilder.css_files`` and
+ ``sphinx.builders.html.StandaloneHTMLBuilder.script_files``.
+ Use ``sphinx.application.Sphinx.add_css_file()``
+ and ``sphinx.application.Sphinx.add_js_file()`` instead.
+* #11459: Deprecate ``sphinx.ext.autodoc.preserve_defaults.get_function_def()``.
+ Patch by Bénédikt Tran.
+
+Features added
+--------------
+
+* #11526: Support ``os.PathLike`` types and ``pathlib.Path`` objects
+ in many more places.
+* #5474: coverage: Print summary statistics tables.
+ Patch by Jorge Leitao.
+* #6319: viewcode: Add :confval:`viewcode_line_numbers` to control
+ whether line numbers are added to rendered source code.
+ Patch by Ben Krikler.
+* #9662: Add the ``:no-typesetting:`` option to suppress textual output
+ and only create a linkable anchor.
+ Patch by Latosha Maltba.
+* #11221: C++: Support domain objects in the table of contents.
+ Patch by Rouslan Korneychuk.
+* #10938: doctest: Add :confval:`doctest_show_successes` option.
+ Patch by Trey Hunner.
+* #11533: Add ``:no-index:``, ``:no-index-entry:``, and ``:no-contents-entry:``.
+* #11572: Improve ``debug`` logging of reasons why files are detected as out of
+ date.
+ Patch by Eric Larson.
+* #10678: Emit :event:`source-read` events for files read via
+ the :dudir:`include` directive.
+ Patch by Halldor Fannar.
+* #11570: Use short names when using :pep:`585` built-in generics.
+ Patch by Riccardo Mori.
+* #11300: Improve ``SigElementFallbackTransform`` fallback logic and signature
+ text elements nodes. See :doc:`the documentation </extdev/nodes>` for more
+ details.
+ Patch by Bénédikt Tran.
+* Allow running Sphinx with ``python -m sphinx build ...``.
+
+Bugs fixed
+----------
+
+* #11077: graphviz: Fix relative links from within the graph.
+ Patch by Ralf Grubenmann.
+* #11529: Line Block in LaTeX builder outputs spurious empty token.
+ Patch by Adrian Vollmer.
+* #11196: autosummary: Summary line extraction failed with "e.g."
+* #10614: Fixed a number of bugs in inheritance diagrams that resulted in
+ missing or broken links.
+ Patch by Albert Shih.
+* #9428: Exclude substitution definitions when running the ``gettext`` builder.
+ Patch by Alvin Wong.
+* #10795: Raise a descriptive error if ``graphviz_dot`` is falsy.
+* #11546: Translated nodes identical to their original text are now marked
+ with the ``translated=True`` attribute.
+* #10049: html: Change "Permalink" to "Link" for title text in link anchors.
+* #4225: Relax Pygments parsing on lexing failures.
+* #11246: Allow inline links in the first line of a docstring and one-line
+ type comments ``#: :meta ...:`` when using :mod:`sphinx.ext.napoleon`.
+ Patch by Bénédikt Tran.
+* #10930: Highlight all search terms on the search results page.
+ Patch by Dmitry Shachnev.
+* #11473: Type annotations containing :py:data:`~typing.Literal` enumeration
+ values now render correctly.
+ Patch by Bénédikt Tran.
+* #11591: Fix support for C coverage in ``sphinx.ext.coverage`` extension.
+ Patch by Stephen Finucane.
+* #11594: HTML Theme: Enhancements to horizontal scrolling on smaller
+ devices in the ``agogo`` theme.
+ Patch by Lukas Engelter.
+* #11459: Fix support for async and lambda functions in
+ ``sphinx.ext.autodoc.preserve_defaults``.
+ Patch by Bénédikt Tran.
+
+Testing
+-------
+
+* #11577: pytest: Fail tests on "XPASS".
+* #11577: pytest: Use "importlib" import mode.
+* #11577: pytest: Set PYTHONWARNINGS=error.
+* #11577: pytest: Set strict config and strict markers.
+
+Release 7.1.2 (released Aug 02, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11542: linkcheck: Properly respect :confval:`linkcheck_anchors`
+ and do not spuriously report failures to validate anchors.
+ Patch by James Addison.
+
+Release 7.1.1 (released Jul 27, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11514: Fix ``SOURCE_DATE_EPOCH`` in multi-line copyright footer.
+ Patch by Bénédikt Tran.
+
+Release 7.1.0 (released Jul 24, 2023)
+=====================================
+
+Incompatible changes
+--------------------
+
+* Releases are no longer signed, given the `change in PyPI policy`_.
+
+ .. _change in PyPI policy: https://blog.pypi.org/posts/2023-05-23-removing-pgp/
+
+Deprecated
+----------
+
+* #11412: Emit warnings on using a deprecated Python-specific index entry type
+ (namely, ``module``, ``keyword``, ``operator``, ``object``, ``exception``,
+ ``statement``, and ``builtin``) in the :rst:dir:`index` directive, and
+ set the removal version to Sphinx 9. Patch by Adam Turner.
+
+Features added
+--------------
+
+* #11415: Add a checksum to JavaScript and CSS asset URIs included within
+ generated HTML, using the CRC32 algorithm.
+* :meth:`~sphinx.application.Sphinx.require_sphinx` now allows the version
+ requirement to be specified as ``(major, minor)``.
+* #11011: Allow configuring a line-length limit for object signatures, via
+ :confval:`maximum_signature_line_length` and the domain-specific variants.
+ If the length of the signature (in characters) is greater than the configured
+ limit, each parameter in the signature will be split to its own logical line.
+ This behaviour may also be controlled by options on object description
+ directives, for example :rst:dir:`py:function:single-line-parameter-list`.
+ Patch by Thomas Louf, Adam Turner, and Jean-François B.
+* #10983: Support for multiline copyright statements in the footer block.
+ Patch by Stefanie Molin
+* ``sphinx.util.display.status_iterator`` now clears the current line
+ with ANSI control codes, rather than overprinting with space characters.
+* #11431: linkcheck: Treat SSL failures as broken links.
+ Patch by James Addison.
+* #11157: Keep the ``translated`` attribute on translated nodes.
+* #11451: Improve the traceback displayed when using :option:`sphinx-build -T`
+ in parallel builds. Patch by Bénédikt Tran
+* #11324: linkcheck: Use session-basd HTTP requests.
+* #11438: Add support for the :rst:dir:`py:class` and :rst:dir:`py:function`
+ directives for PEP 695 (generic classes and functions declarations) and
+ PEP 696 (default type parameters). Multi-line support (#11011) is enabled
+ for type parameters list and can be locally controlled on object description
+ directives, e.g., :rst:dir:`py:function:single-line-type-parameter-list`.
+ Patch by Bénédikt Tran.
+* #11484: linkcheck: Allow HTML anchors to be ignored on a per-URL basis
+ via :confval:`linkcheck_anchors_ignore_for_url` while
+ still checking the validity of the page itself.
+ Patch by Bénédikt Tran
+* #1246: Add translation progress statistics and inspection support,
+ via a new substitution (``|translation progress|``) and a new
+ configuration variable (:confval:`translation_progress_classes`).
+ These enable determining the percentage of translated elements within
+ a document, and the remaining translated and untranslated elements.
+
+Bugs fixed
+----------
+
+* Restored the ``footnote-reference`` class that has been removed in
+ the latest (unreleased) version of Docutils.
+* #11486: Use :rfc:`8081` font file MIME types in the EPUB builder.
+ Using the correct MIME type will prevent warnings from ``epubcheck``
+ and will generate a valid EPUB.
+* #11435: Use microsecond-resolution timestamps for outdated file detection
+ in ``BuildEnvironment.get_outdated_files``.
+* #11437: Top-level headings starting with a reStructuredText role
+ now render properly when :confval:`rst_prolog` is set.
+ Previously, a file starting with the below would have
+ improperly rendered due to where the prologue text
+ was inserted into the document.
+
+ .. code:: rst
+
+ :mod:`lobster` -- The lobster module
+ ====================================
+
+ ...
+
+ Patch by Bénédikt Tran.
+* #11337: Fix a ``MemoryError`` in ``sphinx.ext.intersphinx`` when using ``None``
+ or ``typing.*`` as inline type references. Patch by Bénédikt Tran (picnixz)
+
+Testing
+-------
+
+* #11345: Always delete ``docutils.conf`` in test directories when running
+ ``SphinxTestApp.cleanup()``.
+
+Release 7.0.1 (released May 12, 2023)
+=====================================
+
+Dependencies
+------------
+
+* #11411: Support `Docutils 0.20`_. Patch by Adam Turner.
+
+.. _Docutils 0.20: https://docutils.sourceforge.io/RELEASE-NOTES.html#release-0-20-2023-05-04
+
+Bugs fixed
+----------
+
+* #11418: Clean up remaining references to ``sphinx.setup_command``
+ following the removal of support for setuptools.
+ Patch by Willem Mulder.
+
+Release 7.0.0 (released Apr 29, 2023)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #11359: Remove long-deprecated aliases for ``MecabSplitter`` and
+ ``DefaultSplitter`` in ``sphinx.search.ja``.
+* #11360: Remove deprecated ``make_old_id`` functions in domain object
+ description classes.
+* #11363: Remove the Setuptools integration (``build_sphinx`` hook in
+ ``setup.py``).
+* #11364: Remove deprecated ``sphinx.ext.napoleon.iterators`` module.
+* #11365: Remove support for the ``jsdump`` format in ``sphinx.search``.
+* #11366: Make ``locale`` a required argument to
+ ``sphinx.util.i18n.format_date()``.
+* #11370: Remove deprecated ``sphinx.util.stemmer`` module.
+* #11371: Remove deprecated ``sphinx.pycode.ast.parse()`` function.
+* #11372: Remove deprecated ``sphinx.io.read_doc()`` function.
+* #11373: Removed deprecated ``sphinx.util.get_matching_files()`` function.
+* #11378: Remove deprecated ``sphinx.util.docutils.is_html5_writer_available()``
+ function.
+* #11379: Make the ``env`` argument to ``Builder`` subclasses required.
+* #11380: autosummary: Always emit grouped import exceptions.
+* #11381: Remove deprecated ``style`` key for HTML templates.
+* #11382: Remove deprecated ``sphinx.writers.latex.LaTeXTranslator.docclasses``
+ attribute.
+* #11383: Remove deprecated ``sphinx.builders.html.html5_ready`` and
+ ``sphinx.builders.html.HTMLTranslator`` attributes.
+* #11385: Remove support for HTML 4 output.
+
+Release 6.2.1 (released Apr 25, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11355: Revert the default type of :confval:`nitpick_ignore` and
+ :confval:`nitpick_ignore_regex` to ``list``.
+
+Release 6.2.0 (released Apr 23, 2023)
+=====================================
+
+Dependencies
+------------
+
+* Require Docutils 0.18.1 or greater.
+
+Incompatible changes
+--------------------
+
+* LaTeX: removal of some internal TeX ``\dimen`` registers (not previously
+ publicly documented) as per 5.1.0 code comments in ``sphinx.sty``:
+ ``\sphinxverbatimsep``, ``\sphinxverbatimborder``, ``\sphinxshadowsep``,
+ ``\sphinxshadowsize``, and ``\sphinxshadowrule``. (refs: #11105)
+* Remove ``.egg`` support from pycode ``ModuleAnalyser``; Python eggs are a
+ now-obsolete binary distribution format
+* #11089: Remove deprecated code in ``sphinx.builders.linkcheck``.
+ Patch by Daniel Eades
+* Remove internal-only ``sphinx.locale.setlocale``
+
+Deprecated
+----------
+
+* #11247: Deprecate the legacy ``intersphinx_mapping`` format
+* ``sphinx.util.osutil.cd`` is deprecated in favour of ``contextlib.chdir``.
+
+Features added
+--------------
+
+* #11277: :rst:dir:`autoproperty` allows the return type to be specified as
+ a type comment (e.g., ``# type: () -> int``). Patch by Bénédikt Tran
+* #10811: Autosummary: extend ``__all__`` to imported members for template rendering
+ when option ``autosummary_ignore_module_all`` is set to ``False``. Patch by
+ Clement Pinard
+* #11147: Add a ``content_offset`` parameter to ``nested_parse_with_titles()``,
+ allowing for correct line numbers during nested parsing.
+ Patch by Jeremy Maitin-Shepard
+* Update to Unicode CLDR 42
+* Add a ``--jobs`` synonym for ``-j``. Patch by Hugo van Kemenade
+* LaTeX: a command ``\sphinxbox`` for styling text elements with a (possibly
+ rounded) box, optional background color and shadow, has been added.
+ See :ref:`sphinxbox`. (refs: #11224)
+* LaTeX: add ``\sphinxstylenotetitle``, ..., ``\sphinxstylewarningtitle``, ...,
+ for an extra layer of mark-up freeing up ``\sphinxstrong`` for other uses.
+ See :ref:`latex-macros`. (refs: #11267)
+* LaTeX: :dudir:`note`, :dudir:`hint`, :dudir:`important` and :dudir:`tip` can
+ now each be styled as the other admonitions, i.e. possibly with a background
+ color, individual border widths and paddings, possibly rounded corners, and
+ optional shadow. See :ref:`additionalcss`. (refs: #11234)
+* LaTeX: admonitions and :dudir:`topic` (and
+ :dudir:`contents <table-of-contents>`) directives, and not only
+ :rst:dir:`code-block`, support ``box-decoration-break=slice``.
+* LaTeX: let rounded boxes support up to 4 distinct border-widths (refs: #11243)
+* LaTeX: new options ``noteTextColor``, ``noteTeXextras`` et al.
+ See :ref:`additionalcss`.
+* LaTeX: support elliptical corners in rounded boxes. (refs: #11254)
+* #11150: Include source location in highlighting warnings, when lexing fails.
+ Patch by Jeremy Maitin-Shepard
+* #11281: Support for :confval:`imgmath_latex` ``= 'tectonic'`` or
+ ``= 'xelatex'``. Patch by Dimitar Dimitrov
+* #11109, #9643: Add :confval:`python_display_short_literal_types` option for
+ condensed rendering of ``Literal`` types.
+
+Bugs fixed
+----------
+
+* #11079: LaTeX: figures with align attribute may disappear and strangely impact
+ following lists
+* #11093: LaTeX: fix "multiply-defined references" PDF build warnings when one or
+ more reST labels directly precede an :rst:dir:`py:module` or :rst:dir:`automodule`
+ directive. Patch by Bénédikt Tran (picnixz)
+* #11110: LaTeX: Figures go missing from latex pdf if their files have the same
+ base name and they use a post transform. Patch by aaron-cooper
+* LaTeX: fix potential color leak from shadow to border of rounded boxes, if
+ shadow color is set but border color is not
+* LaTeX: fix unintended 1pt upwards vertical shift of code blocks frames
+ respective to contents (when using rounded corners)
+* #11235: LaTeX: added ``\color`` in topic (or admonition) contents may cause color
+ leak to the shadow and border at a page break
+* #11264: LaTeX: missing space before colon after "Voir aussi" for :rst:dir:`seealso`
+ directive in French
+* #11268: LaTeX: longtable with left alignment breaks out of current list
+ indentation context in PDF. Thanks to picnixz.
+* #11274: LaTeX: external links are not properly escaped for ``\sphinxupquote``
+ compatibility
+* #11147: Fix source file/line number info in object description content and in
+ other uses of ``nested_parse_with_titles``. Patch by Jeremy Maitin-Shepard.
+* #11192: Restore correct parallel search index building.
+ Patch by Jeremy Maitin-Shepard
+* Use the new Transifex ``tx`` client
+
+Testing
+-------
+
+* Fail testing when any Python warnings are emitted
+* Migrate remaining ``unittest.TestCase`` style test functions to pytest style
+* Remove tests that rely on setuptools
+
+Release 6.1.3 (released Jan 10, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11116: Reverted to previous Sphinx 5 node copying method
+* #11117: Reverted changes to parallel image processing from Sphinx 6.1.0
+* #11119: Supress ``ValueError`` in the ``linkcheck`` builder
+
+Release 6.1.2 (released Jan 07, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11101: LaTeX: ``div.topic_padding`` key of sphinxsetup documented at 5.1.0 was
+ implemented with name ``topic_padding``
+* #11099: LaTeX: ``shadowrule`` key of sphinxsetup causes PDF build to crash
+ since Sphinx 5.1.0
+* #11096: LaTeX: ``shadowsize`` key of sphinxsetup causes PDF build to crash
+ since Sphinx 5.1.0
+* #11095: LaTeX: shadow of :dudir:`topic` and :dudir:`contents <table-of-contents>`
+ boxes not in page margin since Sphinx 5.1.0
+* #11100: Fix copying images when running under parallel mode.
+
+Release 6.1.1 (released Jan 05, 2023)
+=====================================
+
+Bugs fixed
+----------
+
+* #11091: Fix ``util.nodes.apply_source_workaround`` for ``literal_block`` nodes
+ with no source information in the node or the node's parents.
+
+Release 6.1.0 (released Jan 05, 2023)
+=====================================
+
+Dependencies
+------------
+
+* Adopted the `Ruff`_ code linter.
+
+ .. _Ruff: https://github.com/charliermarsh/ruff
+
+Incompatible changes
+--------------------
+
+* #10979: gettext: Removed support for pluralisation in ``get_translation``.
+ This was unused and complicated other changes to ``sphinx.locale``.
+
+Deprecated
+----------
+
+* ``sphinx.util`` functions:
+
+ * Renamed ``sphinx.util.typing.stringify()``
+ to ``sphinx.util.typing.stringify_annotation()``
+ * Moved ``sphinx.util.xmlname_checker()``
+ to ``sphinx.builders.epub3._XML_NAME_PATTERN``
+
+ Moved to ``sphinx.util.display``:
+
+ * ``sphinx.util.status_iterator``
+ * ``sphinx.util.display_chunk``
+ * ``sphinx.util.SkipProgressMessage``
+ * ``sphinx.util.progress_message``
+
+ Moved to ``sphinx.util.http_date``:
+
+ * ``sphinx.util.epoch_to_rfc1123``
+ * ``sphinx.util.rfc1123_to_epoch``
+
+ Moved to ``sphinx.util.exceptions``:
+
+ * ``sphinx.util.save_traceback``
+ * ``sphinx.util.format_exception_cut_frames``
+
+Features added
+--------------
+
+* Cache doctrees in the build environment during the writing phase.
+* Make all writing phase tasks support parallel execution.
+* #11072: Use PEP 604 (``X | Y``) display conventions for ``typing.Optional``
+ and ``typing.Optional`` types within the Python domain and autodoc.
+* #10700: autodoc: Document ``typing.NewType()`` types as classes rather than
+ 'data'.
+* Cache doctrees between the reading and writing phases.
+
+Bugs fixed
+----------
+
+* #10962: HTML: Fix the multi-word key name lookup table.
+* Fixed support for Python 3.12 alpha 3 (changes in the ``enum`` module).
+* #11069: HTML Theme: Removed outdated "shortcut" link relation keyword.
+* #10952: Properly terminate parallel processes on programme interuption.
+* #10988: Speed up ``TocTree.resolve()`` through more efficient copying.
+* #6744: LaTeX: support for seealso directive should be via an environment
+ to allow styling.
+* #11074: LaTeX: Can't change sphinxnote to use sphinxheavybox starting with
+ 5.1.0
+
+Release 6.0.1 (released Jan 05, 2023)
+=====================================
+
+Dependencies
+------------
+
+* Require Pygments 2.13 or later.
+
+Bugs fixed
+----------
+
+* #10944: imgmath: Fix resolving image paths for files in nested folders.
+
+Release 6.0.0 (released Dec 29, 2022)
+=====================================
+
+Dependencies
+------------
+
+* #10468: Drop Python 3.6 support
+* #10470: Drop Python 3.7, Docutils 0.14, Docutils 0.15, Docutils 0.16, and
+ Docutils 0.17 support. Patch by Adam Turner
+
+Incompatible changes
+--------------------
+
+* #7405: Removed the jQuery and underscore.js JavaScript frameworks.
+
+ These frameworks are no longer be automatically injected into themes from
+ Sphinx 6.0. If you develop a theme or extension that uses the
+ ``jQuery``, ``$``, or ``$u`` global objects, you need to update your
+ JavaScript to modern standards, or use the mitigation below.
+
+ The first option is to use the sphinxcontrib.jquery_ extension, which has been
+ developed by the Sphinx team and contributors. To use this, add
+ ``sphinxcontrib.jquery`` to the ``extensions`` list in ``conf.py``, or call
+ ``app.setup_extension("sphinxcontrib.jquery")`` if you develop a Sphinx theme
+ or extension.
+
+ The second option is to manually ensure that the frameworks are present.
+ To re-add jQuery and underscore.js, you will need to copy ``jquery.js`` and
+ ``underscore.js`` from `the Sphinx repository`_ to your ``static`` directory,
+ and add the following to your ``layout.html``:
+
+ .. code-block:: html+jinja
+
+ {%- block scripts %}
+ <script src="{{ pathto('_static/jquery.js', resource=True) }}"></script>
+ <script src="{{ pathto('_static/underscore.js', resource=True) }}"></script>
+ {{ super() }}
+ {%- endblock %}
+
+ .. _sphinxcontrib.jquery: https://github.com/sphinx-contrib/jquery/
+
+ Patch by Adam Turner.
+* #10471, #10565: Removed deprecated APIs scheduled for removal in Sphinx 6.0. See
+ :ref:`dev-deprecated-apis` for details. Patch by Adam Turner.
+* #10901: C Domain: Remove support for parsing pre-v3 style type directives and
+ roles. Also remove associated configuration variables ``c_allow_pre_v3`` and
+ ``c_warn_on_allowed_pre_v3``. Patch by Adam Turner.
+
+Features added
+--------------
+
+* #10924: LaTeX: adopt better looking defaults for tables and code-blocks.
+ See :confval:`latex_table_style` and the ``pre_border-radius`` and
+ ``pre_background-TeXcolor`` :ref:`additionalcss` for the former defaults
+ and how to re-enact them if desired.
+
+Bugs fixed
+----------
+
+* #10984: LaTeX: Document :confval:`latex_additional_files` behavior for files
+ with ``.tex`` extension.
+
+Release 5.3.0 (released Oct 16, 2022)
+=====================================
+
+* #10759: LaTeX: add :confval:`latex_table_style` and support the
+ ``'booktabs'``, ``'borderless'``, and ``'colorrows'`` styles.
+ (thanks to Stefan Wiehler for initial pull requests #6666, #6671)
+* #10840: One can cross-reference including an option value like ``:option:`--module=foobar```,
+ ``:option:`--module[=foobar]``` or ``:option:`--module foobar```.
+ Patch by Martin Liska.
+* #10881: autosectionlabel: Record the generated section label to the debug log.
+* #10268: Correctly URI-escape image filenames.
+* #10887: domains: Allow sections in all the content of all object description
+ directives (e.g. :rst:dir:`py:function`). Patch by Adam Turner
+
+Release 5.2.3 (released Sep 30, 2022)
+=====================================
+
+* #10878: Fix base64 image embedding in ``sphinx.ext.imgmath``
+* #10886: Add ``:nocontentsentry:`` flag and global domain table of contents
+ entry control option. Patch by Adam Turner
+
+Release 5.2.2 (released Sep 27, 2022)
+=====================================
+
+* #10872: Restore link targets for autodoc modules to the top of content.
+ Patch by Dominic Davis-Foster.
+
+Release 5.2.1 (released Sep 25, 2022)
+=====================================
+
+Bugs fixed
+----------
+
+* #10861: Always normalise the ``pycon3`` lexer to ``pycon``.
+* Fix using ``sphinx.ext.autosummary`` with modules containing titles in the
+ module-level docstring.
+
+Release 5.2.0.post0 (released Sep 24, 2022)
+===========================================
+
+* Recreated source tarballs for Debian maintainers.
+
+Release 5.2.0 (released Sep 24, 2022)
+=====================================
+
+Dependencies
+------------
+
+* #10356: Sphinx now uses declarative metadata with ``pyproject.toml`` to
+ create packages, using PyPA's ``flit`` project as a build backend. Patch by
+ Adam Turner.
+
+Deprecated
+----------
+
+* #10843: Support for HTML 4 output. Patch by Adam Turner.
+
+Features added
+--------------
+
+* #10738: napoleon: Add support for docstring types using 'of', like
+ ``type of type``. Example: ``tuple of int``.
+* #10286: C++, support requires clauses not just between the template
+ parameter lists and the declaration.
+* #10755: linkcheck: Check the source URL of raw directives that use the ``url``
+ option.
+* #10781: Allow :rst:role:`ref` role to be used with definitions and fields.
+* #10717: HTML Search: Increase priority for full title and
+ subtitle matches in search results
+* #10718: HTML Search: Save search result score to the HTML element for debugging
+* #10673: Make toctree accept 'genindex', 'modindex' and 'search' docnames
+* #6316, #10804: Add domain objects to the table of contents. Patch by Adam Turner
+* #6692: HTML Search: Include explicit :rst:dir:`index` directive index entries
+ in the search index and search results. Patch by Adam Turner
+* #10816: imgmath: Allow embedding images in HTML as base64
+* #10854: HTML Search: Use browser localstorage for highlight control, stop
+ storing highlight parameters in URL query strings. Patch by Adam Turner.
+
+Bugs fixed
+----------
+
+* #10723: LaTeX: 5.1.0 has made the 'sphinxsetup' ``verbatimwithframe=false``
+ become without effect.
+* #10257: C++, ensure consistent non-specialization template argument
+ representation.
+* #10729: C++, fix parsing of certain non-type template parameter packs.
+* #10715: Revert #10520: "Fix" use of sidebar classes in ``agogo.css_t``
+
+Release 5.1.1 (released Jul 26, 2022)
+=====================================
+
+Bugs fixed
+----------
+
+* #10701: Fix ValueError in the new ``deque`` based ``sphinx.ext.napolean``
+ iterator implementation.
+* #10702: Restore compatability with third-party builders.
+
+Release 5.1.0 (released Jul 24, 2022)
+=====================================
+
+Dependencies
+------------
+
+* #10656: Support `Docutils 0.19`_. Patch by Adam Turner.
+
+.. _Docutils 0.19: https://docutils.sourceforge.io/RELEASE-NOTES.html#release-0-19-2022-07-05
+
+Deprecated
+----------
+
+* #10467: Deprecated ``sphinx.util.stemmer`` in favour of ``snowballstemmer``.
+ Patch by Adam Turner.
+* #9856: Deprecated ``sphinx.ext.napoleon.iterators``.
+
+Features added
+--------------
+
+* #10444: html theme: Allow specifying multiple CSS files through the ``stylesheet``
+ setting in ``theme.conf`` or by setting ``html_style`` to an iterable of strings.
+* #10366: std domain: Add support for emphasising placeholders in :rst:dir:`option`
+ directives through a new :confval:`option_emphasise_placeholders` configuration
+ option.
+* #10439: std domain: Use the repr of some variables when displaying warnings,
+ making whitespace issues easier to identify.
+* #10571: quickstart: Reduce content in the generated ``conf.py`` file. Patch by
+ Pradyun Gedam.
+* #10648: LaTeX: CSS-named-alike additional :ref:`'sphinxsetup' <latexsphinxsetup>`
+ keys allow to configure four separate border-widths, four paddings, four
+ corner radii, a shadow (possibly inset), colours for border, background, shadow
+ for each of the code-block, topic, attention, caution, danger, error and warning
+ directives.
+* #10655: LaTeX: Explain non-standard encoding in LatinRules.xdy
+* #10599: HTML Theme: Wrap consecutive footnotes in an ``<aside>`` element when
+ using Docutils 0.18 or later, to allow for easier styling. This matches the
+ behaviour introduced in Docutils 0.19. Patch by Adam Turner.
+* #10518: config: Add ``include_patterns`` as the opposite of ``exclude_patterns``.
+ Patch by Adam Turner.
+
+Bugs fixed
+----------
+
+* #10594: HTML Theme: field term colons are doubled if using Docutils 0.18+
+* #10596: Build failure if Docutils version is 0.18 (not 0.18.1) due
+ to missing ``Node.findall()``
+* #10506: LaTeX: build error if highlighting inline code role in figure caption
+ (refs: #10251)
+* #10634: Make -P (pdb) option work better with exceptions triggered from events
+* #10550: py domain: Fix spurious whitespace in unparsing various operators (``+``,
+ ``-``, ``~``, and ``**``). Patch by Adam Turner (refs: #10551).
+* #10460: logging: Always show node source locations as absolute paths.
+* HTML Search: HTML tags are displayed as a part of object name
+* HTML Search: search snipets should not be folded
+* HTML Search: Minor errors are emitted on fetching search snipets
+* HTML Search: The markers for header links are shown in the search result
+* #10520: HTML Theme: Fix use of sidebar classes in ``agogo.css_t``.
+* #6679: HTML Theme: Fix inclusion of hidden toctrees in the agogo theme.
+* #10566: HTML Theme: Fix enable_search_shortcuts does not work
+* #8686: LaTeX: Text can fall out of code-block at end of page and leave artifact
+ on next page
+* #10633: LaTeX: user injected ``\color`` commands in topic or admonition boxes may
+ cause color leaks in PDF due to upstream `framed.sty <https://ctan.org/pkg/framed>`_
+ bug
+* #10638: LaTeX: framed coloured boxes in highlighted code (e.g. highlighted
+ diffs using Pygments style ``'manni'``) inherit thickness of code-block frame
+* #10647: LaTeX: Only one ``\label`` is generated for ``desc_signature`` node
+ even if it has multiple node IDs
+* #10579: i18n: UnboundLocalError is raised on translating raw directive
+* #9577, #10088: py domain: Fix warning for duplicate Python references when
+ using ``:any:`` and autodoc.
+* #10548: HTML Search: fix minor summary issues.
+
+Release 5.0.2 (released Jun 17, 2022)
+=====================================
+
+Features added
+--------------
+
+* #10523: HTML Theme: Expose the Docutils's version info tuple as a template
+ variable, ``docutils_version_info``. Patch by Adam Turner.
+
+Bugs fixed
+----------
+
+* #10538: autodoc: Inherited class attribute having docstring is documented even
+ if :confval:`autodoc_inherit_docstring` is disabled
+* #10509: autosummary: autosummary fails with a shared library
+* #10497: py domain: Failed to resolve strings in Literal. Patch by Adam Turner.
+* #10523: HTML Theme: Fix double brackets on citation references in Docutils 0.18+.
+ Patch by Adam Turner.
+* #10534: Missing CSS for nav.contents in Docutils 0.18+. Patch by Adam Turner.
+
+Release 5.0.1 (released Jun 03, 2022)
+=====================================
+
+Bugs fixed
+----------
+
+* #10498: gettext: TypeError is raised when sorting warning messages if a node
+ has no line number. Patch by Adam Turner.
+* #10493: HTML Theme: :dudir:`topic` directive is rendered incorrectly with
+ Docutils 0.18. Patch by Adam Turner.
+* #10495: IndexError is raised for a :rst:role:`kbd` role having a separator.
+ Patch by Adam Turner.
+
+Release 5.0.0 (released May 30, 2022)
+=====================================
+
+Dependencies
+------------
+
+5.0.0 b1
+
+* #10164: Support `Docutils 0.18`_. Patch by Adam Turner.
+
+.. _Docutils 0.18: https://docutils.sourceforge.io/RELEASE-NOTES.html#release-0-18-2021-10-26
+
+Incompatible changes
+--------------------
+
+5.0.0 b1
+
+* #10031: autosummary: ``sphinx.ext.autosummary.import_by_name()`` now raises
+ ``ImportExceptionGroup`` instead of ``ImportError`` when it failed to import
+ target object. Please handle the exception if your extension uses the
+ function to import Python object. As a workaround, you can disable the
+ behavior via ``grouped_exception=False`` keyword argument until v7.0.
+* #9962: texinfo: Customizing styles of emphasized text via ``@definfoenclose``
+ command was not supported because the command was deprecated since texinfo 6.8
+* #2068: :confval:`intersphinx_disabled_reftypes` has changed default value
+ from an empty list to ``['std:doc']`` as avoid too surprising silent
+ intersphinx resolutions.
+ To migrate: either add an explicit inventory name to the references
+ intersphinx should resolve, or explicitly set the value of this configuration
+ variable to an empty list.
+* #10197: html theme: Reduce ``body_min_width`` setting in basic theme to 360px
+* #9999: LaTeX: separate terms from their definitions by a CR (refs: #9985)
+* #10062: Change the default language to ``'en'`` if any language is not set in
+ ``conf.py``
+
+5.0.0 final
+
+* #10474: :confval:`language` does not accept ``None`` as it value. The default
+ value of ``language`` becomes to ``'en'`` now.
+ Patch by Adam Turner and Takeshi KOMIYA.
+
+Deprecated
+----------
+
+5.0.0 b1
+
+* #10028: jQuery and underscore.js will no longer be automatically injected into
+ themes from Sphinx 6.0. If you develop a theme or extension that uses the
+ ``jQuery``, ``$``, or ``$u`` global objects, you need to update your
+ JavaScript or use the mitigation below.
+
+ To re-add jQuery and underscore.js, you will need to copy ``jquery.js`` and
+ ``underscore.js`` from `the Sphinx repository`_ to your ``static`` directory,
+ and add the following to your ``layout.html``:
+
+ .. _the Sphinx repository: https://github.com/sphinx-doc/sphinx/tree/v5.3.0/sphinx/themes/basic/static
+ .. code-block:: html+jinja
+
+ {%- block scripts %}
+ <script src="{{ pathto('_static/jquery.js', resource=True) }}"></script>
+ <script src="{{ pathto('_static/underscore.js', resource=True) }}"></script>
+ {{ super() }}
+ {%- endblock %}
+
+ Patch by Adam Turner.
+* setuptools integration. The ``build_sphinx`` sub-command for setup.py is
+ marked as deprecated to follow the policy of setuptools team.
+* The ``locale`` argument of ``sphinx.util.i18n:babel_format_date()`` becomes
+ required
+* The ``language`` argument of ``sphinx.util.i18n:format_date()`` becomes
+ required
+* ``sphinx.builders.html.html5_ready``
+* ``sphinx.io.read_doc()``
+* ``sphinx.util.docutils.__version_info__``
+* ``sphinx.util.docutils.is_html5_writer_available()``
+* ``sphinx.writers.latex.LaTeXWriter.docclasses``
+
+Features added
+--------------
+
+5.0.0 b1
+
+* #9075: autodoc: The default value of :confval:`autodoc_typehints_format` is
+ changed to ``'smart'``. It will suppress the leading module names of
+ typehints (ex. ``io.StringIO`` -> ``StringIO``).
+* #8417: autodoc: ``:inherited-members:`` option now takes multiple classes. It
+ allows to suppress inherited members of several classes on the module at once
+ by specifying the option to :rst:dir:`automodule` directive
+* #9792: autodoc: Add new option for ``autodoc_typehints_description_target`` to
+ include undocumented return values but not undocumented parameters.
+* #10285: autodoc: singledispatch functions having typehints are not documented
+* autodoc: :confval:`autodoc_typehints_format` now also applies to attributes,
+ data, properties, and type variable bounds.
+* #10258: autosummary: Recognize a documented attribute of a module as
+ non-imported
+* #10028: Removed internal usages of JavaScript frameworks (jQuery and
+ underscore.js) and modernised ``doctools.js`` and ``searchtools.js`` to
+ EMCAScript 2018. Patch by Adam Turner.
+* #10302: C++, add support for conditional expressions (``?:``).
+* #5157, #10251: Inline code is able to be highlighted via :dudir:`role`
+ directive
+* #10337: Make sphinx-build faster by caching Publisher object during build.
+ Patch by Adam Turner.
+
+Bugs fixed
+----------
+
+5.0.0 b1
+
+* #10200: apidoc: Duplicated submodules are shown for modules having both .pyx
+ and .so files. Patch by Adam Turner and Takeshi KOMIYA.
+* #10279: autodoc: Default values for keyword only arguments in overloaded
+ functions are rendered as a string literal
+* #10280: autodoc: :confval:`autodoc_docstring_signature` unexpectedly generates
+ return value typehint for constructors if docstring has multiple signatures
+* #10266: autodoc: :confval:`autodoc_preserve_defaults` does not work for
+ mixture of keyword only arguments with/without defaults
+* #10310: autodoc: class methods are not documented when decorated with mocked
+ function
+* #10305: autodoc: Failed to extract optional forward-ref'ed typehints correctly
+ via :confval:`autodoc_type_aliases`
+* #10421: autodoc: :confval:`autodoc_preserve_defaults` doesn't work on class
+ methods
+* #10214: html: invalid language tag was generated if :confval:`language`
+ contains a country code (ex. zh_CN)
+* #9974: html: Updated jQuery version from 3.5.1 to 3.6.0
+* #10236: html search: objects are duplicated in search result
+* #9962: texinfo: Deprecation message for ``@definfoenclose`` command on
+ bulding texinfo document
+* #10000: LaTeX: glossary terms with common definition are rendered with
+ too much vertical whitespace
+* #10188: LaTeX: alternating multiply referred footnotes produce a ``?`` in
+ pdf output
+* #10363: LaTeX: make ``'howto'`` title page rule use ``\linewidth`` for
+ compatibility with usage of a ``twocolumn`` class option
+* #10318: ``:prepend:`` option of :rst:dir:`literalinclude` directive does not
+ work with ``:dedent:`` option
+
+5.0.0 final
+
+* #9575: autodoc: The annotation of return value should not be shown when
+ ``autodoc_typehints="description"``
+* #9648: autodoc: ``*args`` and ``**kwargs`` entries are duplicated when
+ ``autodoc_typehints="description"``
+* #8180: autodoc: Docstring metadata ignored for attributes
+* #10443: epub: EPUB builder can't detect the mimetype of .webp file
+* #10104: gettext: Duplicated locations are shown if 3rd party extension does
+ not provide correct information
+* #10456: py domain: ``:meta:`` fields are displayed if docstring contains two
+ or more meta-field
+* #9096: sphinx-build: the value of progress bar for paralle build is wrong
+* #10110: sphinx-build: exit code is not changed when error is raised on
+ builder-finished event
+
+Release 4.5.0 (released Mar 28, 2022)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #10112: extlinks: Disable hardcoded links detector by default
+* #9993, #10177: std domain: Disallow to refer an inline target via
+ :rst:role:`ref` role
+
+Deprecated
+----------
+
+* ``sphinx.ext.napoleon.docstring.GoogleDocstring._qualify_name()``
+
+Features added
+--------------
+
+* #10260: Enable ``FORCE_COLOR`` and ``NO_COLOR`` for terminal colouring
+* #10234: autosummary: Add "autosummary" CSS class to summary tables
+* #10125: extlinks: Improve suggestion message for a reference having title
+* #10112: extlinks: Add :confval:`extlinks_detect_hardcoded_links` to enable
+ hardcoded links detector feature
+* #9494, #9456: html search: Add a config variable
+ :confval:`html_show_search_summary` to enable/disable the search summaries
+* #9337: HTML theme, add option ``enable_search_shortcuts`` that enables :kbd:`/` as
+ a Quick search shortcut and :kbd:`Esc` shortcut that
+ removes search highlighting.
+* #10107: i18n: Allow to suppress translation warnings by adding ``#noqa``
+ comment to the tail of each translation message
+* #10252: C++, support attributes on classes, unions, and enums.
+* #10253: :rst:role:`pep` role now generates URLs based on `peps.python.org
+ <https://peps.python.org>`_
+
+Bugs fixed
+----------
+
+* #9876: autodoc: Failed to document an imported class that is built from native
+ binary module
+* #10133: autodoc: Crashed when mocked module is used for type annotation
+* #10146: autodoc: :confval:`autodoc_default_options` does not support
+ ``no-value`` option
+* #9971: autodoc: TypeError is raised when the target object is annotated by
+ unhashable object
+* #10205: extlinks: Failed to compile regexp on checking hardcoded links
+* #10277: html search: Could not search short words (ex. "use")
+* #9529: LaTeX: named auto numbered footnote (ex. ``[#named]``) that is referred
+ multiple times was rendered to a question mark
+* #9924: LaTeX: multi-line :rst:dir:`cpp:function` directive has big vertical
+ spacing in Latexpdf
+* #10158: LaTeX: excessive whitespace since v4.4.0 for undocumented
+ variables/structure members
+* #10175: LaTeX: named footnote reference is linked to an incorrect footnote if
+ the name is also used in the different document
+* #10269: manpage: Failed to resolve the title of :rst:role:`ref` cross references
+* #10179: i18n: suppress "rST localization" warning
+* #10118: imgconverter: Unnecessary availablity check is called for remote URIs
+* #10181: napoleon: attributes are displayed like class attributes for google
+ style docstrings when :confval:`napoleon_use_ivar` is enabled
+* #10122: sphinx-build: make.bat does not check the installation of sphinx-build
+ command before showing help
+
+Release 4.4.0 (released Jan 17, 2022)
+=====================================
+
+Dependencies
+------------
+
+* #10007: Use ``importlib_metadata`` for python-3.9 or older
+* #10007: Drop ``setuptools``
+
+Features added
+--------------
+
+* #9075: autodoc: Add a config variable :confval:`autodoc_typehints_format`
+ to suppress the leading module names of typehints of function signatures (ex.
+ ``io.StringIO`` -> ``StringIO``)
+* #9831: Autosummary now documents only the members specified in a module's
+ ``__all__`` attribute if :confval:`autosummary_ignore_module_all` is set to
+ ``False``. The default behaviour is unchanged. Autogen also now supports
+ this behavior with the ``--respect-module-all`` switch.
+* #9555: autosummary: Improve error messages on failure to load target object
+* #9800: extlinks: Emit warning if a hardcoded link is replaceable
+ by an extlink, suggesting a replacement.
+* #9961: html: Support nested <kbd> HTML elements in other HTML builders
+* #10013: html: Allow to change the loading method of JS via ``loading_method``
+ parameter for :meth:`.Sphinx.add_js_file()`
+* #9551: html search: "Hide Search Matches" link removes "highlight" parameter
+ from URL
+* #9815: html theme: Wrap sidebar components in div to allow customizing their
+ layout via CSS
+* #9827: i18n: Sort items in glossary by translated terms
+* #9899: py domain: Allows to specify cross-reference specifier (``.`` and
+ ``~``) as ``:type:`` option
+* #9894: linkcheck: add option ``linkcheck_exclude_documents`` to disable link
+ checking in matched documents.
+* #9793: sphinx-build: Allow to use the parallel build feature in macOS on macOS
+ and Python3.8+
+* #10055: sphinx-build: Create directories when ``-w`` option given
+* #9993: std domain: Allow to refer an inline target (ex. ``_`target name```)
+ via :rst:role:`ref` role
+* #9981: std domain: Strip value part of the option directive from general index
+* #9391: texinfo: improve variable in ``samp`` role
+* #9578: texinfo: Add :confval:`texinfo_cross_references` to disable cross
+ references for readability with standalone readers
+* #9822 (and #9062), add new Intersphinx role :rst:role:`external` for explict
+ lookup in the external projects, without resolving to the local project.
+
+Bugs fixed
+----------
+
+* #9866: autodoc: doccomment for the imported class was ignored
+* #9883: autodoc: doccomment for the alias to mocked object was ignored
+* #9908: autodoc: debug message is shown on building document using NewTypes
+ with Python 3.10
+* #9968: autodoc: instance variables are not shown if __init__ method has
+ position-only-arguments
+* #9194: autodoc: types under the "typing" module are not hyperlinked
+* #10009: autodoc: Crashes if target object raises an error on getting docstring
+* #10058: autosummary: Imported members are not shown when
+ ``autodoc_class_signature = 'separated'``
+* #9947: i18n: topic directive having a bullet list can't be translatable
+* #9878: mathjax: MathJax configuration is placed after loading MathJax itself
+* #9932: napoleon: empty "returns" section is generated even if no description
+* #9857: Generated RFC links use outdated base url
+* #9909: HTML, prevent line-wrapping in literal text.
+* #10061: html theme: Configuration values added by themes are not be able to
+ override from conf.py
+* #10073: imgconverter: Unnecessary availablity check is called for "data" URIs
+* #9925: LaTeX: prohibit also with ``'xelatex'`` line splitting at dashes of
+ inline and parsed literals
+* #9944: LaTeX: extra vertical whitespace for some nested declarations
+* #9940: LaTeX: Multi-function declaration in Python domain has cramped
+ vertical spacing in latexpdf output
+* #10015: py domain: types under the "typing" module are not hyperlinked defined
+ at info-field-list
+* #9390: texinfo: Do not emit labels inside footnotes
+* #9413: xml: Invalid XML was generated when cross referencing python objects
+* #9979: Error level messages were displayed as warning messages
+* #10057: Failed to scan documents if the project is placed onto the root
+ directory
+* #9636: code-block: ``:dedent:`` without argument did strip newlines
+
+Release 4.3.2 (released Dec 19, 2021)
+=====================================
+
+Bugs fixed
+----------
+
+* #9917: C and C++, parse fundamental types no matter the order of simple type
+ specifiers.
+
+Release 4.3.1 (released Nov 28, 2021)
+=====================================
+
+Features added
+--------------
+
+* #9864: mathjax: Support chnaging the loading method of MathJax to "defer" via
+ :confval:`mathjax_options`
+
+Bugs fixed
+----------
+
+* #9838: autodoc: AttributeError is raised on building document for functions
+ decorated by functools.lru_cache
+* #9879: autodoc: AttributeError is raised on building document for an object
+ having invalid __doc__ attribute
+* #9844: autodoc: Failed to process a function wrapped with functools.partial if
+ :confval:`autodoc_preserve_defaults` enabled
+* #9872: html: Class namespace collision between autodoc signatures and
+ docutils-0.17
+* #9868: imgmath: Crashed if the dvisvgm command failed to convert equation
+* #9864: mathjax: Failed to render equations via MathJax v2. The loading method
+ of MathJax is back to "async" method again
+
+Release 4.3.0 (released Nov 11, 2021)
+=====================================
+
+Dependencies
+------------
+
+* Support Python 3.10
+
+Incompatible changes
+--------------------
+
+* #9649: ``searchindex.js``: the embedded data has changed format to allow
+ objects with the same name in different domains.
+* #9672: The rendering of Python domain declarations is implemented
+ with more docutils nodes to allow better CSS styling.
+ It may break existing styling.
+* #9672: the signature of
+ ``domains.python.PyObject.get_signature_prefix`` has changed to
+ return a list of nodes instead of a plain string.
+* #9695: ``domains.js.JSObject.display_prefix`` has been changed into a method
+ ``get_display_prefix`` which now returns a list of nodes
+ instead of a plain string.
+* #9695: The rendering of Javascript domain declarations is implemented
+ with more docutils nodes to allow better CSS styling.
+ It may break existing styling.
+* #9450: mathjax: Load MathJax via "defer" strategy
+
+Deprecated
+----------
+
+* ``sphinx.ext.autodoc.AttributeDocumenter._datadescriptor``
+* ``sphinx.writers.html.HTMLTranslator._fieldlist_row_index``
+* ``sphinx.writers.html.HTMLTranslator._table_row_index``
+* ``sphinx.writers.html5.HTML5Translator._fieldlist_row_index``
+* ``sphinx.writers.html5.HTML5Translator._table_row_index``
+
+Features added
+--------------
+
+* #9639: autodoc: Support asynchronous generator functions
+* #9664: autodoc: ``autodoc-process-bases`` supports to inject reST snippet as a
+ base class
+* #9691: C, added new info-field ``retval``
+ for :rst:dir:`c:function` and :rst:dir:`c:macro`.
+* C++, added new info-field ``retval`` for :rst:dir:`cpp:function`.
+* #9618: i18n: Add :confval:`gettext_allow_fuzzy_translations` to allow "fuzzy"
+ messages for translation
+* #9672: More CSS classes on Python domain descriptions
+* #9695: More CSS classes on Javascript domain descriptions
+* #9683: Revert the removal of ``add_stylesheet()`` API. It will be kept until
+ the Sphinx 6.0 release
+* #2068, add :confval:`intersphinx_disabled_reftypes` for disabling
+ interphinx resolution of cross-references that do not have an explicit
+ inventory specification. Specific types of cross-references can be disabled,
+ e.g., ``std:doc`` or all cross-references in a specific domain,
+ e.g., ``std:*``.
+* #9623: Allow to suppress "toctree contains reference to excluded document"
+ warnings using :confval:`suppress_warnings`
+
+Bugs fixed
+----------
+
+* #9630: autodoc: Failed to build cross references if :confval:`primary_domain`
+ is not 'py'
+* #9644: autodoc: Crashed on getting source info from problematic object
+* #9655: autodoc: mocked object having doc comment is warned unexpectedly
+* #9651: autodoc: return type field is not generated even if
+ :confval:`autodoc_typehints_description_target` is set to "documented" when
+ its info-field-list contains ``:returns:`` field
+* #9657: autodoc: The base class for a subclass of mocked object is incorrect
+* #9607: autodoc: Incorrect base class detection for the subclasses of the
+ generic class
+* #9755: autodoc: memory addresses are shown for aliases
+* #9752: autodoc: Failed to detect type annotation for slots attribute
+* #9756: autodoc: Crashed if classmethod does not have __func__ attribute
+* #9757: autodoc: :confval:`autodoc_inherit_docstrings` does not effect to
+ overridden classmethods
+* #9781: autodoc: :confval:`autodoc_preserve_defaults` does not support
+ hexadecimal numeric
+* #9630: autosummary: Failed to build summary table if :confval:`primary_domain`
+ is not 'py'
+* #9670: html: Fix download file with special characters
+* #9710: html: Wrong styles for even/odd rows in nested tables
+* #9763: html: parameter name and its type annotation are not separated in HTML
+* #9649: HTML search: when objects have the same name but in different domains,
+ return all of them as result instead of just one.
+* #7634: intersphinx: references on the file in sub directory are broken
+* #9737: LaTeX: hlist is rendered as a list containing "aggedright" text
+* #9678: linkcheck: file extension was shown twice in warnings
+* #9697: py domain: An index entry with parens was registered for ``py:method``
+ directive with ``:property:`` option
+* #9775: py domain: Literal typehint was converted to a cross reference when
+ :confval:`autodoc_typehints`\ ``='description'``
+* #9708: needs_extension failed to check double-digit version correctly
+* #9688: Fix Sphinx patched :dudir:`code` does not recognize ``:class:`` option
+* #9733: Fix for logging handler flushing warnings in the middle of the docs
+ build
+* #9656: Fix warnings without subtype being incorrectly suppressed
+* Intersphinx, for unresolved references with an explicit inventory,
+ e.g., ``proj:myFunc``, leave the inventory prefix in the unresolved text.
+
+Release 4.2.0 (released Sep 12, 2021)
+=====================================
+
+Features added
+--------------
+
+* #9445: autodoc: Support class properties
+* #9479: autodoc: Emit a warning if target is a mocked object
+* #9560: autodoc: Allow to refer NewType instances with module name in Python
+ 3.10 or above
+* #9447: html theme: Expose the version of Sphinx in the form of tuple as a
+ template variable ``sphinx_version_tuple``
+* #9594: manpage: Suppress the title of man page if description is empty
+* #9445: py domain: :rst:dir:`py:property` directive supports ``:classmethod:``
+ option to describe the class property
+* #9524: test: SphinxTestApp can take ``builddir`` as an argument
+* #9535: C and C++, support more fundamental types, including GNU extensions.
+
+Bugs fixed
+----------
+
+* #9608: apidoc: apidoc does not generate a module definition for implicit
+ namespace package
+* #9504: autodoc: generate incorrect reference to the parent class if the target
+ class inherites the class having ``_name`` attribute
+* #9537, #9589: autodoc: Some objects under ``typing`` module are not displayed
+ well with the HEAD of 3.10
+* #9487: autodoc: typehint for cached_property is not shown
+* #9509: autodoc: AttributeError is raised on failed resolving typehints
+* #9518: autodoc: autodoc_docstring_signature does not effect to ``__init__()``
+ and ``__new__()``
+* #9522: autodoc: PEP 585 style typehints having arguments (ex. ``list[int]``)
+ are not displayed well
+* #9481: autosummary: some warnings contain non-existing filenames
+* #9568: autosummary: summarise overlined sectioned headings correctly
+* #9600: autosummary: Type annotations which contain commas in autosummary table
+ are not removed completely
+* #9481: c domain: some warnings contain non-existing filenames
+* #9481: cpp domain: some warnings contain non-existing filenames
+* #9456: html search: abbreation marks are inserted to the search result if
+ failed to fetch the content of the page
+* #9617: html search: The JS requirement warning is shown if browser is slow
+* #9267: html theme: CSS and JS files added by theme were loaded twice
+* #9585: py domain: ``:type:`` option for :rst:dir:`py:property` directive does
+ not create a hyperlink
+* #9576: py domain: Literal typehint was converted to a cross reference
+* #9535 comment: C++, fix parsing of defaulted function parameters that are
+ function pointers.
+* #9564: smartquotes: don't adjust typography for text with
+ language-highlighted ``:code:`` role.
+* #9512: sphinx-build: crashed with the HEAD of Python 3.10
+
+Release 4.1.2 (released Jul 27, 2021)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #9435: linkcheck: Disable checking automatically generated anchors on
+ github.com (ex. anchors in reST/Markdown documents)
+
+Bugs fixed
+----------
+
+* #9489: autodoc: Custom types using ``typing.NewType`` are not displayed well
+ with the HEAD of 3.10
+* #9490: autodoc: Some objects under ``typing`` module are not displayed well
+ with the HEAD of 3.10
+* #9436, #9471: autodoc: crashed if ``autodoc_class_signature = "separated"``
+* #9456: html search: html_copy_source can't control the search summaries
+* #9500: LaTeX: Failed to build Japanese document on Windows
+* #9435: linkcheck: Failed to check anchors in github.com
+
+Release 4.1.1 (released Jul 15, 2021)
+=====================================
+
+Dependencies
+------------
+
+* #9434: sphinxcontrib-htmlhelp-2.0.0 or above
+* #9434: sphinxcontrib-serializinghtml-1.1.5 or above
+
+Bugs fixed
+----------
+
+* #9438: html: HTML logo or Favicon specified as file not being found on output
+
+Release 4.1.0 (released Jul 12, 2021)
+=====================================
+
+Dependencies
+------------
+
+* Support jinja2-3.0
+
+Deprecated
+----------
+
+* The ``app`` argument of ``sphinx.environment.BuildEnvironment`` becomes
+ required
+* ``sphinx.application.Sphinx.html_theme``
+* ``sphinx.ext.autosummary._app``
+* ``sphinx.util.docstrings.extract_metadata()``
+
+Features added
+--------------
+
+* #8107: autodoc: Add ``class-doc-from`` option to :rst:dir:`autoclass`
+ directive to control the content of the specific class like
+ :confval:`autoclass_content`
+* #8588: autodoc: :confval:`autodoc_type_aliases` now supports dotted name. It
+ allows you to define an alias for a class with module name like
+ ``foo.bar.BazClass``
+* #9175: autodoc: Special member is not documented in the module
+* #9195: autodoc: The arguments of ``typing.Literal`` are wrongly rendered
+* #9185: autodoc: :confval:`autodoc_typehints` allows ``'both'`` setting to
+ allow typehints to be included both in the signature and description
+* #4257: autodoc: Add :confval:`autodoc_class_signature` to separate the class
+ entry and the definition of ``__init__()`` method
+* #8061, #9218: autodoc: Support variable comment for alias classes
+* #3014: autodoc: Add :event:`autodoc-process-bases` to modify the base classes
+ of the class definitions
+* #9272: autodoc: Render enum values for the default argument value better
+* #9384: autodoc: ``autodoc_typehints='none'`` now erases typehints for
+ variables, attributes and properties
+* #3257: autosummary: Support instance attributes for classes
+* #9358: html: Add "heading" role to the toctree items
+* #9225: html: Add span tag to the return typehint of method/function
+* #9129: html search: Show search summaries when html_copy_source = False
+* #9307: html search: Prevent corrections and completions in search field
+* #9120: html theme: Eliminate prompt characters of code-block from copyable
+ text
+* #9176: i18n: Emit a debug message if message catalog file not found under
+ :confval:`locale_dirs`
+* #9414: LaTeX: Add xeCJKVerbAddon to default fvset config for Chinese documents
+* #9016: linkcheck: Support checking anchors on github.com
+* #9016: linkcheck: Add a new event :event:`linkcheck-process-uri` to modify
+ URIs before checking hyperlinks
+* #6525: linkcheck: Add :confval:`linkcheck_allowed_redirects` to mark
+ hyperlinks that are redirected to expected URLs as "working"
+* #1874: py domain: Support union types using ``|`` in info-field-list
+* #9268: py domain: :confval:`python_use_unqualified_type_names` supports type
+ field in info-field-list
+* #9097: Optimize the parallel build
+* #9131: Add :confval:`nitpick_ignore_regex` to ignore nitpicky warnings using
+ regular expressions
+* #9174: Add ``Sphinx.set_html_assets_policy`` to tell extensions to include
+ HTML assets in all the pages. Extensions can check this via
+ ``Sphinx.registry.html_assets_policy``
+* C++, add support for
+
+ - ``inline`` variables,
+ - ``consteval`` functions,
+ - ``constinit`` variables,
+ - ``char8_t``,
+ - ``explicit(<constant expression>)`` specifier,
+ - digit separators in literals, and
+ - constraints in placeholder type specifiers, aka. adjective syntax
+ (e.g., ``Sortable auto &v``).
+
+* C, add support for digit separators in literals.
+* #9166: LaTeX: support containers in LaTeX output
+
+
+Bugs fixed
+----------
+
+* #8872: autodoc: stacked singledispatches are wrongly rendered
+* #8597: autodoc: a docsting having metadata only should be treated as
+ undocumented
+* #9185: autodoc: typehints for overloaded functions and methods are inaccurate
+* #9250: autodoc: The inherited method not having docstring is wrongly parsed
+* #9283: autodoc: autoattribute directive failed to generate document for an
+ attribute not having any comment
+* #9364: autodoc: single element tuple on the default argument value is wrongly
+ rendered
+* #9362: autodoc: AttributeError is raised on processing a subclass of Tuple[()]
+* #9404: autodoc: TypeError is raised on processing dict-like object (not a
+ class) via autoclass directive
+* #9317: html: Pushing left key causes visiting the next page at the first page
+* #9381: html: URL for html_favicon and html_log does not work
+* #9270: html theme : pyramid theme generates incorrect logo links
+* #9217: manpage: The name of manpage directory that is generated by
+ :confval:`man_make_section_directory` is not correct
+* #9350: manpage: Fix font isn't reset after keyword at the top of samp role
+* #9306: Linkcheck reports broken link when remote server closes the connection
+ on HEAD request
+* #9280: py domain: "exceptions" module is not displayed
+* #9418: py domain: a Callable annotation with no parameters
+ (e.g. ``Callable[[], None])`` will be rendered with a bracket missing
+ (``Callable[], None]``)
+* #9319: quickstart: Make sphinx-quickstart exit when conf.py already exists
+* #9387: xml: XML Builder ignores custom visitors
+* #9224: ``:param:`` and ``:type:`` fields does not support a type containing
+ whitespace (ex. ``Dict[str, str]``)
+* #8945: when transforming typed fields, call the specified role instead of
+ making an single xref. For C and C++, use the ``expr`` role for typed fields.
+
+Release 4.0.3 (released Jul 05, 2021)
+=====================================
+
+Features added
+--------------
+
+* C, add C23 keywords ``_Decimal32``, ``_Decimal64``, and ``_Decimal128``.
+* #9354: C, add :confval:`c_extra_keywords` to allow user-defined keywords
+ during parsing.
+* Revert the removal of ``sphinx.util:force_decode()`` to become some 3rd party
+ extensions available again during 5.0
+
+Bugs fixed
+----------
+
+* #9330: changeset domain: :rst:dir:`versionchanged` with contents being a list
+ will cause error during pdf build
+* #9313: LaTeX: complex table with merged cells broken since 4.0
+* #9305: LaTeX: backslash may cause Improper discretionary list pdf build error
+ with Japanese engines
+* #9354: C, remove special macro names from the keyword list.
+ See also :confval:`c_extra_keywords`.
+* #9322: KeyError is raised on PropagateDescDomain transform
+
+Release 4.0.2 (released May 20, 2021)
+=====================================
+
+Dependencies
+------------
+
+* #9216: Support jinja2-3.0
+
+Incompatible changes
+--------------------
+
+* #9222: Update Underscore.js to 1.13.1
+* #9217: manpage: Stop creating a section directory on build manpage by default
+ (see :confval:`man_make_section_directory`)
+
+Bugs fixed
+----------
+
+* #9210: viewcode: crashed if non importable modules found on parallel build
+* #9240: Unknown node error for pending_xref_condition is raised if an extension
+ that does not support the node installs a missing-reference handler
+
+Release 4.0.1 (released May 11, 2021)
+=====================================
+
+Bugs fixed
+----------
+
+* #9189: autodoc: crashed when ValueError is raised on generating signature
+ from a property of the class
+* #9188: autosummary: warning is emitted if list value is set to
+ autosummary_generate
+* #8380: html search: tags for search result are broken
+* #9198: i18n: Babel emits errors when running compile_catalog
+* #9205: py domain: The :canonical: option causes "more than one target for
+ cross-reference" warning
+* #9201: websupport: UndefinedError is raised: 'css_tag' is undefined
+
+Release 4.0.0 (released May 09, 2021)
+=====================================
+
+Dependencies
+------------
+
+4.0.0b1
+
+* Drop python 3.5 support
+* Drop docutils 0.12 and 0.13 support
+* LaTeX: add ``tex-gyre`` font dependency
+
+4.0.0b2
+
+* Support docutils-0.17. Please notice it changes the output of HTML builder.
+ Some themes do not support it, and you need to update your custom CSS to
+ upgrade it.
+
+Incompatible changes
+--------------------
+
+4.0.0b1
+
+* #8539: autodoc: info-field-list is generated into the class description when
+ :confval:`autodoc_typehints`\ ``='description'`` and
+ :confval:`autoclass_content`\ ``='class'`` set
+* #8898: extlinks: "%s" becomes required keyword in the link caption string
+* domain: The ``Index`` class becomes subclasses of ``abc.ABC`` to indicate
+ methods that must be overridden in the concrete classes
+* #4826: py domain: The structure of python objects is changed. A boolean value
+ is added to indicate that the python object is canonical one
+* #7425: MathJax: The MathJax was changed from 2 to 3. Users using a custom
+ MathJax configuration may have to set the old MathJax path or update their
+ configuration for version 3. See :mod:`sphinx.ext.mathjax`.
+* #7784: i18n: The msgid for alt text of image is changed
+* #5560: napoleon: :confval:`napoleon_use_param` also affect "other parameters"
+ section
+* #7996: manpage: Make a section directory on build manpage by default (see
+ :confval:`man_make_section_directory`)
+* #7849: html: Change the default setting of
+ :confval:`html_codeblock_linenos_style` to ``'inline'``
+* #8380: html search: search results are wrapped with ``<p>`` instead of
+ ``<div>``
+* html theme: Move a script tag for documentation_options.js in
+ basic/layout.html to ``script_files`` variable
+* html theme: Move CSS tags in basic/layout.html to ``css_files`` variable
+* #8915: html theme: Emit a warning for sphinx_rtd_theme-0.2.4 or older
+* #8508: LaTeX: uplatex becomes a default setting of latex_engine for Japanese
+ documents
+* #5977: py domain: ``:var:``, ``:cvar:`` and ``:ivar:`` fields do not create
+ cross-references
+* #4550: The ``align`` attribute of ``figure`` and ``table`` nodes becomes
+ ``None`` by default instead of ``'default'``
+* #8769: LaTeX refactoring: split sphinx.sty into multiple files and rename
+ some auxiliary files created in ``latex`` build output repertory
+* #8937: Use explicit title instead of <no title>
+* #8487: The :file: option for csv-table directive now recognizes an absolute
+ path as a relative path from source directory
+
+4.0.0b2
+
+* #9023: Change the CSS classes on :rst:role:`cpp:expr` and
+ :rst:role:`cpp:texpr`.
+
+Deprecated
+----------
+
+* :confval:`html_codeblock_linenos_style`
+* ``favicon`` and ``logo`` variable in HTML templates
+* ``sphinx.directives.patches.CSVTable``
+* ``sphinx.directives.patches.ListTable``
+* ``sphinx.directives.patches.RSTTable``
+* ``sphinx.ext.autodoc.directive.DocumenterBridge.filename_set``
+* ``sphinx.ext.autodoc.directive.DocumenterBridge.warn()``
+* ``sphinx.registry.SphinxComponentRegistry.get_source_input()``
+* ``sphinx.registry.SphinxComponentRegistry.source_inputs``
+* ``sphinx.transforms.FigureAligner``
+* ``sphinx.util.pycompat.convert_with_2to3()``
+* ``sphinx.util.pycompat.execfile_()``
+* ``sphinx.util.smartypants``
+* ``sphinx.util.typing.DirectiveOption``
+
+Features added
+--------------
+
+4.0.0b1
+
+* #8924: autodoc: Support ``bound`` argument for TypeVar
+* #7383: autodoc: Support typehints for properties
+* #5603: autodoc: Allow to refer to a python class using its canonical name
+ when the class has two different names; a canonical name and an alias name
+* #8539: autodoc: Add :confval:`autodoc_typehints_description_target` to control
+ the behavior of ``autodoc_typehints=description``
+* #8841: autodoc: :confval:`autodoc_docstring_signature` will continue to look
+ for multiple signature lines without backslash character
+* #7549: autosummary: Enable :confval:`autosummary_generate` by default
+* #8898: extlinks: Allow %s in link caption string
+* #4826: py domain: Add ``:canonical:`` option to python directives to describe
+ the location where the object is defined
+* #7199: py domain: Add :confval:`python_use_unqualified_type_names` to suppress
+ the module name of the python reference if it can be resolved (experimental)
+* #7068: py domain: Add :rst:dir:`py:property` directive to describe a property
+* #7784: i18n: The alt text for image is translated by default (without
+ :confval:`gettext_additional_targets` setting)
+* #2018: html: :confval:`html_favicon` and :confval:`html_logo` now accept URL
+ for the image
+* #8070: html search: Support searching for 2characters word
+* #9036: html theme: Allow to inherite the search page
+* #8938: imgconverter: Show the error of the command availability check
+* #7830: Add debug logs for change detection of sources and templates
+* #8201: Emit a warning if toctree contains duplicated entries
+* #8326: ``master_doc`` is now renamed to :confval:`root_doc`
+* #8942: C++, add support for the C++20 spaceship operator, ``<=>``.
+* #7199: A new node, ``sphinx.addnodes.pending_xref_condition`` has been added.
+ It can be used to choose appropriate content of the reference by conditions.
+
+4.0.0b2
+
+* #8818: autodoc: Super class having ``Any`` arguments causes nit-picky warning
+* #9095: autodoc: TypeError is raised on processing broken metaclass
+* #9110: autodoc: metadata of GenericAlias is not rendered as a reference in
+ py37+
+* #9098: html: copy-range protection for doctests doesn't work in Safari
+* #9103: LaTeX: imgconverter: conversion runs even if not needed
+* #8127: py domain: Ellipsis in info-field-list causes nit-picky warning
+* #9121: py domain: duplicated warning is emitted when both canonical and its
+ alias objects are defined on the document
+* #9023: More CSS classes on domain descriptions, see :ref:`nodes` for details.
+* #8195: mathjax: Rename :confval:`mathjax_config` to
+ :confval:`mathjax2_config` and add :confval:`mathjax3_config`
+
+Bugs fixed
+----------
+
+4.0.0b1
+
+* #8917: autodoc: Raises a warning if function has wrong __globals__ value
+* #8415: autodoc: a TypeVar imported from other module is not resolved (in
+ Python 3.7 or above)
+* #8992: autodoc: Failed to resolve types.TracebackType type annotation
+* #8905: html: html_add_permalinks=None and html_add_permalinks="" are ignored
+* #8380: html search: Paragraphs in search results are not identified as ``<p>``
+* #8915: html theme: The translation of sphinx_rtd_theme does not work
+* #8342: Emit a warning if a unknown domain is given for directive or role (ex.
+ ``:unknown:doc:``)
+* #7241: LaTeX: No wrapping for ``cpp:enumerator``
+* #8711: LaTeX: backticks in code-blocks trigger latexpdf build warning (and font
+ change) with late TeXLive 2019
+* #8253: LaTeX: Figures with no size defined get overscaled (compared to images
+ with size explicitly set in pixels) (fixed for ``'pdflatex'/'lualatex'`` only)
+* #8881: LaTeX: The depth of bookmarks panel in PDF is not enough for navigation
+* #8874: LaTeX: the fix to two minor Pygments LaTeXFormatter output issues ignore
+ Pygments style
+* #8925: LaTeX: 3.5.0 ``verbatimmaxunderfull`` setting does not work as
+ expected
+* #8980: LaTeX: missing line break in ``\pysigline``
+* #8995: LaTeX: legacy ``\pysiglinewithargsret`` does not compute correctly
+ available horizontal space and should use a ragged right style
+* #9009: LaTeX: "release" value with underscore leads to invalid LaTeX
+* #8911: C++: remove the longest matching prefix in
+ :confval:`cpp_index_common_prefix` instead of the first that matches.
+* C, properly reject function declarations when a keyword is used
+ as parameter name.
+* #8933: viewcode: Failed to create back-links on parallel build
+* #8960: C and C++, fix rendering of (member) function pointer types in
+ function parameter lists.
+* C++, fix linking of names in array declarators, pointer to member
+ (function) declarators, and in the argument to ``sizeof...``.
+* C, fix linking of names in array declarators.
+
+4.0.0b2
+
+* C, C++, fix ``KeyError`` when an ``alias`` directive is the first C/C++
+ directive in a file with another C/C++ directive later.
+
+4.0.0b3
+
+* #9167: html: Failed to add CSS files to the specific page
+
+Release 3.5.5 (in development)
+==============================
+
+Release 3.5.4 (released Apr 11, 2021)
+=====================================
+
+Dependencies
+------------
+
+* #9071: Restrict docutils to 0.16
+
+Bugs fixed
+----------
+
+* #9078: autodoc: Async staticmethods and classmethods are considered as non
+ async coroutine-functions with Python3.10
+* #8870, #9001, #9051: html theme: The style are not applied with docutils-0.17
+
+ - toctree captions
+ - The content of ``sidebar`` directive
+ - figures
+
+Release 3.5.3 (released Mar 20, 2021)
+=====================================
+
+Features added
+--------------
+
+* #8959: using UNIX path separator in image directive confuses Sphinx on Windows
+
+Release 3.5.2 (released Mar 06, 2021)
+=====================================
+
+Bugs fixed
+----------
+
+* #8943: i18n: Crashed by broken translation messages in ES, EL and HR
+* #8936: LaTeX: A custom LaTeX builder fails with unknown node error
+* #8952: Exceptions raised in a Directive cause parallel builds to hang
+
+Release 3.5.1 (released Feb 16, 2021)
+=====================================
+
+Bugs fixed
+----------
+
+* #8883: autodoc: AttributeError is raised on assigning __annotations__ on
+ read-only class
+* #8884: html: minified js stemmers not included in the distributed package
+* #8885: html: AttributeError is raised if CSS/JS files are installed via
+ :confval:`html_context`
+* #8880: viewcode: ExtensionError is raised on incremental build after
+ unparsable python module found
+
+Release 3.5.0 (released Feb 14, 2021)
+=====================================
+
+Dependencies
+------------
+
+* LaTeX: ``multicol`` (it is anyhow a required part of the official latex2e
+ base distribution)
+
+Incompatible changes
+--------------------
+
+* Update Underscore.js to 1.12.0
+* #6550: html: The config variable ``html_add_permalinks`` is replaced by
+ :confval:`html_permalinks` and :confval:`html_permalinks_icon`
+
+Deprecated
+----------
+
+* pending_xref node for viewcode extension
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.anchors_ignore``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.auth``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.broken``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.good``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.redirected``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.rqueue``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.to_ignore``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.workers``
+* ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.wqueue``
+* ``sphinx.builders.linkcheck.node_line_or_0()``
+* ``sphinx.ext.autodoc.AttributeDocumenter.isinstanceattribute()``
+* ``sphinx.ext.autodoc.directive.DocumenterBridge.reporter``
+* ``sphinx.ext.autodoc.importer.get_module_members()``
+* ``sphinx.ext.autosummary.generate._simple_info()``
+* ``sphinx.ext.autosummary.generate._simple_warn()``
+* ``sphinx.writers.html.HTMLTranslator.permalink_text``
+* ``sphinx.writers.html5.HTML5Translator.permalink_text``
+
+Features added
+--------------
+
+* #8022: autodoc: autodata and autoattribute directives does not show right-hand
+ value of the variable if docstring contains ``:meta hide-value:`` in
+ info-field-list
+* #8514: autodoc: Default values of overloaded functions are taken from actual
+ implementation if they're ellipsis
+* #8775: autodoc: Support type union operator (PEP-604) in Python 3.10 or above
+* #8297: autodoc: Allow to extend :confval:`autodoc_default_options` via
+ directive options
+* #759: autodoc: Add a new configuration :confval:`autodoc_preserve_defaults` as
+ an experimental feature. It preserves the default argument values of
+ functions in source code and keep them not evaluated for readability.
+* #8619: html: kbd role generates customizable HTML tags for compound keys
+* #8634: html: Allow to change the order of JS/CSS via ``priority`` parameter
+ for :meth:`.Sphinx.add_js_file()` and :meth:`.Sphinx.add_css_file()`
+* #6241: html: Allow to add JS/CSS files to the specific page when an extension
+ calls ``app.add_js_file()`` or ``app.add_css_file()`` on
+ :event:`html-page-context` event
+* #6550: html: Allow to use HTML permalink texts via
+ :confval:`html_permalinks_icon`
+* #1638: html: Add permalink icons to glossary terms
+* #8868: html search: performance issue with massive lists
+* #8867: html search: Update JavaScript stemmer code to the latest version of
+ Snowball (v2.1.0)
+* #8852: i18n: Allow to translate heading syntax in MyST-Parser
+* #8649: imgconverter: Skip availability check if builder supports the image
+ type
+* #8573: napoleon: Allow to change the style of custom sections using
+ :confval:`napoleon_custom_sections`
+* #8004: napoleon: Type definitions in Google style docstrings are rendered as
+ references when :confval:`napoleon_preprocess_types` enabled
+* #6241: mathjax: Include mathjax.js only on the document using equations
+* #8775: py domain: Support type union operator (PEP-604)
+* #8651: std domain: cross-reference for a rubric having inline item is broken
+* #7642: std domain: Optimize case-insensitive match of term
+* #8681: viewcode: Support incremental build
+* #8132: Add :confval:`project_copyright` as an alias of :confval:`copyright`
+* #207: Now :confval:`highlight_language` supports multiple languages
+* #2030: :rst:dir:`code-block` and :rst:dir:`literalinclude` supports automatic
+ dedent via no-argument ``:dedent:`` option
+* C++, also hyperlink operator overloads in expressions and alias declarations.
+* #8247: Allow production lists to refer to tokens from other production groups
+* #8813: Show what extension (or module) caused it on errors on event handler
+* #8213: C++: add ``maxdepth`` option to :rst:dir:`cpp:alias` to insert nested
+ declarations.
+* C, add ``noroot`` option to :rst:dir:`c:alias` to render only nested
+ declarations.
+* C++, add ``noroot`` option to :rst:dir:`cpp:alias` to render only nested
+ declarations.
+
+Bugs fixed
+----------
+
+* #8727: apidoc: namespace module file is not generated if no submodules there
+* #741: autodoc: inherited-members doesn't work for instance attributes on super
+ class
+* #8592: autodoc: ``:meta public:`` does not effect to variables
+* #8594: autodoc: empty __all__ attribute is ignored
+* #8315: autodoc: Failed to resolve struct.Struct type annotation
+* #8652: autodoc: All variable comments in the module are ignored if the module
+ contains invalid type comments
+* #8693: autodoc: Default values for overloaded functions are rendered as string
+* #8134: autodoc: crashes when mocked decorator takes arguments
+* #8800: autodoc: Uninitialized attributes in superclass are recognized as
+ undocumented
+* #8655: autodoc: Failed to generate document if target module contains an
+ object that raises an exception on ``hasattr()``
+* #8306: autosummary: mocked modules are documented as empty page when using
+ :recursive: option
+* #8232: graphviz: Image node is not rendered if graph file is in subdirectory
+* #8618: html: kbd role produces incorrect HTML when compound-key separators (-,
+ + or ^) are used as keystrokes
+* #8629: html: A type warning for html_use_opensearch is shown twice
+* #8714: html: kbd role with "Caps Lock" rendered incorrectly
+* #8123: html search: fix searching for terms containing + (Requires a custom
+ search language that does not split on +)
+* #8665: html theme: Could not override globaltoc_maxdepth in theme.conf
+* #8446: html: consecutive spaces are displayed as single space
+* #8745: i18n: crashes with KeyError when translation message adds a new auto
+ footnote reference
+* #4304: linkcheck: Fix race condition that could lead to checking the
+ availability of the same URL twice
+* #8791: linkcheck: The docname for each hyperlink is not displayed
+* #7118: sphinx-quickstart: questionare got Mojibake if libreadline unavailable
+* #8094: texinfo: image files on the different directory with document are not
+ copied
+* #8782: todo: Cross references in todolist get broken
+* #8720: viewcode: module pages are generated for epub on incremental build
+* #8704: viewcode: anchors are generated in incremental build after singlehtml
+* #8756: viewcode: highlighted code is generated even if not referenced
+* #8671: :confval:`highlight_options` is not working
+* #8341: C, fix intersphinx lookup types for names in declarations.
+* C, C++: in general fix intersphinx and role lookup types.
+* #8683: :confval:`html_last_updated_fmt` does not support UTC offset (%z)
+* #8683: :confval:`html_last_updated_fmt` generates wrong time zone for %Z
+* #1112: ``download`` role creates duplicated copies when relative path is
+ specified
+* #2616 (fifth item): LaTeX: footnotes from captions are not clickable,
+ and for manually numbered footnotes only first one with same number is
+ an hyperlink
+* #7576: LaTeX with French babel and memoir crash: "Illegal parameter number
+ in definition of ``\FNH@prefntext``"
+* #8055: LaTeX (docs): A potential display bug with the LaTeX generation step
+ in Sphinx (how to generate one-column index)
+* #8072: LaTeX: Directive :rst:dir:`hlist` not implemented in LaTeX
+* #8214: LaTeX: The :rst:role:`index` role and the glossary generate duplicate
+ entries in the LaTeX index (if both used for same term)
+* #8735: LaTeX: wrong internal links in pdf to captioned code-blocks when
+ :confval:`numfig` is not True
+* #8442: LaTeX: some indexed terms are ignored when using xelatex engine
+ (or pdflatex and :confval:`latex_use_xindy` set to True) with memoir class
+* #8750: LaTeX: URLs as footnotes fail to show in PDF if originating from
+ inside function type signatures
+* #8780: LaTeX: long words in narrow columns may not be hyphenated
+* #8788: LaTeX: ``\titleformat`` last argument in sphinx.sty should be
+ bracketed, not braced (and is anyhow not needed)
+* #8849: LaTex: code-block printed out of margin (see the opt-in LaTeX syntax
+ boolean :ref:`verbatimforcewraps <latexsphinxsetupforcewraps>` for use via
+ the :ref:`'sphinxsetup' <latexsphinxsetup>` key of ``latex_elements``)
+* #8183: LaTeX: Remove substitution_reference nodes from doctree only on LaTeX
+ builds
+* #8865: LaTeX: Restructure the index nodes inside title nodes only on LaTeX
+ builds
+* #8796: LaTeX: potentially critical low level TeX coding mistake has gone
+ unnoticed so far
+* C, :rst:dir:`c:alias` skip symbols without explicit declarations
+ instead of crashing.
+* C, :rst:dir:`c:alias` give a warning when the root symbol is not declared.
+* C, ``expr`` role should start symbol lookup in the current scope.
+
+Release 3.4.3 (released Jan 08, 2021)
+=====================================
+
+Bugs fixed
+----------
+
+* #8655: autodoc: Failed to generate document if target module contains an
+ object that raises an exception on ``hasattr()``
+
+Release 3.4.2 (released Jan 04, 2021)
+=====================================
+
+Bugs fixed
+----------
+
+* #8164: autodoc: Classes that inherit mocked class are not documented
+* #8602: autodoc: The ``autodoc-process-docstring`` event is emitted to the
+ non-datadescriptors unexpectedly
+* #8616: autodoc: AttributeError is raised on non-class object is passed to
+ autoclass directive
+
+Release 3.4.1 (released Dec 25, 2020)
+=====================================
+
+Bugs fixed
+----------
+
+* #8559: autodoc: AttributeError is raised when using forward-reference type
+ annotations
+* #8568: autodoc: TypeError is raised on checking slots attribute
+* #8567: autodoc: Instance attributes are incorrectly added to Parent class
+* #8566: autodoc: The ``autodoc-process-docstring`` event is emitted to the
+ alias classes unexpectedly
+* #8583: autodoc: Unnecessary object comparison via ``__eq__`` method
+* #8565: linkcheck: Fix PriorityQueue crash when link tuples are not
+ comparable
+
+Release 3.4.0 (released Dec 20, 2020)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #8105: autodoc: the signature of class constructor will be shown for decorated
+ classes, not a signature of decorator
+
+Deprecated
+----------
+
+* The ``follow_wrapped`` argument of ``sphinx.util.inspect.signature()``
+* The ``no_docstring`` argument of
+ ``sphinx.ext.autodoc.Documenter.add_content()``
+* ``sphinx.ext.autodoc.Documenter.get_object_members()``
+* ``sphinx.ext.autodoc.DataDeclarationDocumenter``
+* ``sphinx.ext.autodoc.GenericAliasDocumenter``
+* ``sphinx.ext.autodoc.InstanceAttributeDocumenter``
+* ``sphinx.ext.autodoc.SlotsAttributeDocumenter``
+* ``sphinx.ext.autodoc.TypeVarDocumenter``
+* ``sphinx.ext.autodoc.importer._getannotations()``
+* ``sphinx.ext.autodoc.importer._getmro()``
+* ``sphinx.pycode.ModuleAnalyzer.parse()``
+* ``sphinx.util.osutil.movefile()``
+* ``sphinx.util.requests.is_ssl_error()``
+
+Features added
+--------------
+
+* #8119: autodoc: Allow to determine whether a member not included in
+ ``__all__`` attribute of the module should be documented or not via
+ :event:`autodoc-skip-member` event
+* #8219: autodoc: Parameters for generic class are not shown when super class is
+ a generic class and show-inheritance option is given (in Python 3.7 or above)
+* autodoc: Add ``Documenter.config`` as a shortcut to access the config object
+* autodoc: Add Optional[t] to annotation of function and method if a default
+ value equal to None is set.
+* #8209: autodoc: Add ``:no-value:`` option to :rst:dir:`autoattribute` and
+ :rst:dir:`autodata` directive to suppress the default value of the variable
+* #8460: autodoc: Support custom types defined by typing.NewType
+* #8285: napoleon: Add :confval:`napoleon_attr_annotations` to merge type hints
+ on source code automatically if any type is specified in docstring
+* #8236: napoleon: Support numpydoc's "Receives" section
+* #6914: Add a new event :event:`warn-missing-reference` to custom warning
+ messages when failed to resolve a cross-reference
+* #6914: Emit a detailed warning when failed to resolve a ``:ref:`` reference
+* #6629: linkcheck: The builder now handles rate limits. See
+ :confval:`linkcheck_rate_limit_timeout` for details.
+
+Bugs fixed
+----------
+
+* #7613: autodoc: autodoc does not respect __signature__ of the class
+* #4606: autodoc: the location of the warning is incorrect for inherited method
+* #8105: autodoc: the signature of class constructor is incorrect if the class
+ is decorated
+* #8434: autodoc: :confval:`autodoc_type_aliases` does not effect to variables
+ and attributes
+* #8443: autodoc: autodata directive can't create document for PEP-526 based
+ type annotated variables
+* #8443: autodoc: autoattribute directive can't create document for PEP-526
+ based uninitialized variables
+* #8480: autodoc: autoattribute could not create document for __slots__
+ attributes
+* #8503: autodoc: autoattribute could not create document for a GenericAlias as
+ class attributes correctly
+* #8534: autodoc: autoattribute could not create document for a commented
+ attribute in alias class
+* #8452: autodoc: autodoc_type_aliases doesn't work when autodoc_typehints is
+ set to "description"
+* #8541: autodoc: autodoc_type_aliases doesn't work for the type annotation to
+ instance attributes
+* #8460: autodoc: autodata and autoattribute directives do not display type
+ information of TypeVars
+* #8493: autodoc: references to builtins not working in class aliases
+* #8522: autodoc: ``__bool__`` method could be called
+* #8067: autodoc: A typehint for the instance variable having type_comment on
+ super class is not displayed
+* #8545: autodoc: a __slots__ attribute is not documented even having docstring
+* #741: autodoc: inherited-members doesn't work for instance attributes on super
+ class
+* #8477: autosummary: non utf-8 reST files are generated when template contains
+ multibyte characters
+* #8501: autosummary: summary extraction splits text after "el at." unexpectedly
+* #8524: html: Wrong url_root has been generated on a document named "index"
+* #8419: html search: Do not load ``language_data.js`` in non-search pages
+* #8549: i18n: ``-D gettext_compact=0`` is no longer working
+* #8454: graphviz: The layout option for graph and digraph directives don't work
+* #8131: linkcheck: Use GET when HEAD requests cause Too Many Redirects, to
+ accommodate infinite redirect loops on HEAD
+* #8437: Makefile: ``make clean`` with empty BUILDDIR is dangerous
+* #8365: py domain: ``:type:`` and ``:rtype:`` gives false ambiguous class
+ lookup warnings
+* #8352: std domain: Failed to parse an option that starts with bracket
+* #8519: LaTeX: Prevent page brake in the middle of a seealso
+* #8520: C, fix copying of AliasNode.
+
+Release 3.3.1 (released Nov 12, 2020)
+=====================================
+
+Bugs fixed
+----------
+
+* #8372: autodoc: autoclass directive became slower than Sphinx 3.2
+* #7727: autosummary: raise PycodeError when documenting python package
+ without __init__.py
+* #8350: autosummary: autosummary_mock_imports causes slow down builds
+* #8364: C, properly initialize attributes in empty symbols.
+* #8399: i18n: Put system locale path after the paths specified by configuration
+
+Release 3.3.0 (released Nov 02, 2020)
+=====================================
+
+Deprecated
+----------
+
+* ``sphinx.builders.latex.LaTeXBuilder.usepackages``
+* ``sphinx.builders.latex.LaTeXBuilder.usepackages_afger_hyperref``
+* ``sphinx.ext.autodoc.SingledispatchFunctionDocumenter``
+* ``sphinx.ext.autodoc.SingledispatchMethodDocumenter``
+
+Features added
+--------------
+
+* #8100: html: Show a better error message for failures on copying
+ html_static_files
+* #8141: C: added a ``maxdepth`` option to :rst:dir:`c:alias` to insert
+ nested declarations.
+* #8081: LaTeX: Allow to add LaTeX package via ``app.add_latex_package()`` until
+ just before writing .tex file
+* #7996: manpage: Add :confval:`man_make_section_directory` to make a section
+ directory on build man page
+* #8289: epub: Allow to suppress "duplicated ToC entry found" warnings from epub
+ builder using :confval:`suppress_warnings`.
+* #8298: sphinx-quickstart: Add :option:`sphinx-quickstart --no-sep` option
+* #8304: sphinx.testing: Register public markers in sphinx.testing.fixtures
+* #8051: napoleon: use the obj role for all See Also items
+* #8050: napoleon: Apply :confval:`napoleon_preprocess_types` to every field
+* C and C++, show line numbers for previous declarations when duplicates are
+ detected.
+* #8183: Remove substitution_reference nodes from doctree only on LaTeX builds
+
+Bugs fixed
+----------
+
+* #8085: i18n: Add support for having single text domain
+* #6640: i18n: Failed to override system message translation
+* #8143: autodoc: AttributeError is raised when False value is passed to
+ autodoc_default_options
+* #8103: autodoc: functools.cached_property is not considered as a property
+* #8190: autodoc: parsing error is raised if some extension replaces docstring
+ by string not ending with blank lines
+* #8142: autodoc: Wrong constructor signature for the class derived from
+ typing.Generic
+* #8157: autodoc: TypeError is raised when annotation has invalid __args__
+* #7964: autodoc: Tuple in default value is wrongly rendered
+* #8200: autodoc: type aliases break type formatting of autoattribute
+* #7786: autodoc: can't detect overloaded methods defined in other file
+* #8294: autodoc: single-string __slots__ is not handled correctly
+* #7785: autodoc: autodoc_typehints='none' does not effect to overloaded functions
+* #8192: napoleon: description is disappeared when it contains inline literals
+* #8142: napoleon: Potential of regex denial of service in google style docs
+* #8169: LaTeX: pxjahyper loaded even when latex_engine is not platex
+* #8215: LaTeX: 'oneside' classoption causes build warning
+* #8175: intersphinx: Potential of regex denial of service by broken inventory
+* #8277: sphinx-build: missing and redundant spacing (and etc) for console
+ output on building
+* #7973: imgconverter: Check availability of imagemagick many times
+* #8255: py domain: number in default argument value is changed from hexadecimal
+ to decimal
+* #8316: html: Prevent arrow keys changing page when button elements are focused
+* #8343: html search: Fix unnecessary load of images when parsing the document
+* #8254: html theme: Line numbers misalign with code lines
+* #8093: The highlight warning has wrong location in some builders (LaTeX,
+ singlehtml and so on)
+* #8215: Eliminate Fancyhdr build warnings for oneside documents
+* #8239: Failed to refer a token in productionlist if it is indented
+* #8268: linkcheck: Report HTTP errors when ``linkcheck_anchors`` is ``True``
+* #8245: linkcheck: take source directory into account for local files
+* #8321: linkcheck: ``tel:`` schema hyperlinks are detected as errors
+* #8323: linkcheck: An exit status is incorrect when links having unsupported
+ schema found
+* #8188: C, add missing items to internal object types dictionary,
+ e.g., preventing intersphinx from resolving them.
+* C, fix anon objects in intersphinx.
+* #8270, C++, properly reject functions as duplicate declarations if a
+ non-function declaration of the same name already exists.
+* C, fix references to function parameters.
+ Link to the function instead of a non-existing anchor.
+* #6914: figure numbers are unexpectedly assigned to uncaptioned items
+* #8320: make "inline" line numbers un-selectable
+
+Testing
+-------
+
+* #8257: Support parallel build in sphinx.testing
+
+Release 3.2.1 (released Aug 14, 2020)
+=====================================
+
+Features added
+--------------
+
+* #8095: napoleon: Add :confval:`napoleon_preprocess_types` to enable the type
+ preprocessor for numpy style docstrings
+* #8114: C and C++, parse function attributes after parameters and qualifiers.
+
+Bugs fixed
+----------
+
+* #8074: napoleon: Crashes during processing C-ext module
+* #8088: napoleon: "Inline literal start-string without end-string" warning in
+ Numpy style Parameters section
+* #8084: autodoc: KeyError is raised on documenting an attribute of the broken
+ class
+* #8091: autodoc: AttributeError is raised on documenting an attribute on Python
+ 3.5.2
+* #8099: autodoc: NameError is raised when target code uses ``TYPE_CHECKING``
+* C++, fix parsing of template template parameters, broken by the fix of #7944
+
+Release 3.2.0 (released Aug 08, 2020)
+=====================================
+
+Deprecated
+----------
+
+* ``sphinx.ext.autodoc.members_set_option()``
+* ``sphinx.ext.autodoc.merge_special_members_option()``
+* ``sphinx.writers.texinfo.TexinfoWriter.desc``
+* C, parsing of pre-v3 style type directives and roles, along with the options
+ :confval:`!c_allow_pre_v3` and :confval:`!c_warn_on_allowed_pre_v3`.
+
+Features added
+--------------
+
+* #2076: autodoc: Allow overriding of exclude-members in skip-member function
+* #8034: autodoc: ``:private-member:`` can take an explicit list of member names
+ to be documented
+* #2024: autosummary: Add :confval:`autosummary_filename_map` to avoid conflict
+ of filenames between two object with different case
+* #8011: autosummary: Support instance attributes as a target of autosummary
+ directive
+* #7849: html: Add :confval:`html_codeblock_linenos_style` to change the style
+ of line numbers for code-blocks
+* #7853: C and C++, support parameterized GNU style attributes.
+* #7888: napoleon: Add aliases Warn and Raise.
+* #7690: napoleon: parse type strings and make them hyperlinks as possible. The
+ conversion rule can be updated via :confval:`napoleon_type_aliases`
+* #8049: napoleon: Create a hyperlink for each the type of parameter when
+ :confval:`napoleon_use_param` is False
+* C, added :rst:dir:`c:alias` directive for inserting copies
+ of existing declarations.
+* #7745: html: inventory is broken if the docname contains a space
+* #7991: html search: Allow searching for numbers
+* #7902: html theme: Add a new option :confval:`globaltoc_maxdepth` to control
+ the behavior of globaltoc in sidebar
+* #7840: i18n: Optimize the dependencies check on bootstrap
+* #7768: i18n: :confval:`figure_language_filename` supports ``docpath`` token
+* #5208: linkcheck: Support checks for local links
+* #5090: setuptools: Link verbosity to distutils' -v and -q option
+* #6698: doctest: Add ``:trim-doctest-flags:`` and ``:no-trim-doctest-flags:``
+ options to doctest, testcode and testoutput directives
+* #7052: add ``:noindexentry:`` to the Python, C, C++, and Javascript domains.
+ Update the documentation to better reflect the relationship between this option
+ and the ``:noindex:`` option.
+* #7899: C, add possibility of parsing of some pre-v3 style type directives and
+ roles and try to convert them to equivalent v3 directives/roles.
+ Set the new option :confval:`!c_allow_pre_v3` to ``True`` to enable this.
+ The warnings printed from this functionality can be suppressed by setting
+ :confval:`!c_warn_on_allowed_pre_v3` to ``True``.
+ The functionality is immediately deprecated.
+* #7999: C, add support for named variadic macro arguments.
+* #8071: Allow to suppress "self referenced toctrees" warning
+
+Bugs fixed
+----------
+
+* #7886: autodoc: TypeError is raised on mocking generic-typed classes
+* #7935: autodoc: function signature is not shown when the function has a
+ parameter having ``inspect._empty`` as its default value
+* #7901: autodoc: type annotations for overloaded functions are not resolved
+* #904: autodoc: An instance attribute cause a crash of autofunction directive
+* #1362: autodoc: ``private-members`` option does not work for class attributes
+* #7983: autodoc: Generator type annotation is wrongly rendered in py36
+* #8030: autodoc: An uninitialized annotated instance variable is not documented
+ when ``:inherited-members:`` option given
+* #8032: autodoc: A type hint for the instance variable defined at parent class
+ is not shown in the document of the derived class
+* #8041: autodoc: An annotated instance variable on super class is not
+ documented when derived class has other annotated instance variables
+* #7839: autosummary: cannot handle umlauts in function names
+* #7865: autosummary: Failed to extract summary line when abbreviations found
+* #7866: autosummary: Failed to extract correct summary line when docstring
+ contains a hyperlink target
+* #7469: autosummary: "Module attributes" header is not translatable
+* #7940: apidoc: An extra newline is generated at the end of the rst file if a
+ module has submodules
+* #4258: napoleon: decorated special methods are not shown
+* #7799: napoleon: parameters are not escaped for combined params in numpydoc
+* #7780: napoleon: multiple parameters declaration in numpydoc was wrongly
+ recognized when ``napoleon_use_param=True``
+* #7715: LaTeX: ``numfig_secnum_depth > 1`` leads to wrong figure links
+* #7846: html theme: XML-invalid files were generated
+* #7894: gettext: Wrong source info is shown when using rst_epilog
+* #7691: linkcheck: HEAD requests are not used for checking
+* #4888: i18n: Failed to add an explicit title to ``:ref:`` role on translation
+* #7928: py domain: failed to resolve a type annotation for the attribute
+* #8008: py domain: failed to parse a type annotation containing ellipsis
+* #7994: std domain: option directive does not generate old node_id compatible
+ with 2.x or older
+* #7968: i18n: The content of ``math`` directive is interpreted as reST on
+ translation
+* #7768: i18n: The ``root`` element for :confval:`figure_language_filename` is
+ not a path that user specifies in the document
+* #7993: texinfo: TypeError is raised for nested object descriptions
+* #7993: texinfo: a warning not supporting desc_signature_line node is shown
+* #7869: :rst:role:`abbr` role without an explanation will show the explanation
+ from the previous abbr role
+* #8048: graphviz: graphviz.css was copied on building non-HTML document
+* C and C++, removed ``noindex`` directive option as it did
+ nothing.
+* #7619: Duplicated node IDs are generated if node has multiple IDs
+* #2050: Symbols sections are appeared twice in the index page
+* #8017: Fix circular import in sphinx.addnodes
+* #7986: CSS: make "highlight" selector more robust
+* #7944: C++, parse non-type template parameters starting with
+ a dependent qualified name.
+* C, don't deepcopy the entire symbol table and make a mess every time an
+ enumerator is handled.
+
+Release 3.1.2 (released Jul 05, 2020)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #7650: autodoc: the signature of base function will be shown for decorated
+ functions, not a signature of decorator
+
+Bugs fixed
+----------
+
+* #7844: autodoc: Failed to detect module when relative module name given
+* #7856: autodoc: AttributeError is raised when non-class object is given to
+ the autoclass directive
+* #7850: autodoc: KeyError is raised for invalid mark up when autodoc_typehints
+ is 'description'
+* #7812: autodoc: crashed if the target name matches to both an attribute and
+ module that are same name
+* #7650: autodoc: function signature becomes ``(*args, **kwargs)`` if the
+ function is decorated by generic decorator
+* #7812: autosummary: generates broken stub files if the target code contains
+ an attribute and module that are same name
+* #7806: viewcode: Failed to resolve viewcode references on 3rd party builders
+* #7838: html theme: List items have extra vertical space
+* #7878: html theme: Undesired interaction between "overflow" and "float"
+
+Release 3.1.1 (released Jun 14, 2020)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #7808: napoleon: a type for attribute are represented as typed field
+
+Features added
+--------------
+
+* #7807: autodoc: Show detailed warning when type_comment is mismatched with its
+ signature
+
+Bugs fixed
+----------
+
+* #7808: autodoc: Warnings raised on variable and attribute type annotations
+* #7802: autodoc: EOFError is raised on parallel build
+* #7821: autodoc: TypeError is raised for overloaded C-ext function
+* #7805: autodoc: an object which descriptors returns is unexpectedly documented
+* #7807: autodoc: wrong signature is shown for the function using contextmanager
+* #7812: autosummary: generates broken stub files if the target code contains
+ an attribute and module that are same name
+* #7808: napoleon: Warnings raised on variable and attribute type annotations
+* #7811: sphinx.util.inspect causes circular import problem
+
+Release 3.1.0 (released Jun 08, 2020)
+=====================================
+
+Dependencies
+------------
+
+* #7746: mathjax: Update to 2.7.5
+
+Incompatible changes
+--------------------
+
+* #7477: imgconverter: Invoke "magick convert" command by default on Windows
+
+Deprecated
+----------
+
+* The first argument for sphinx.ext.autosummary.generate.AutosummaryRenderer has
+ been changed to Sphinx object
+* ``sphinx.ext.autosummary.generate.AutosummaryRenderer`` takes an object type
+ as an argument
+* The ``ignore`` argument of ``sphinx.ext.autodoc.Documenter.get_doc()``
+* The ``template_dir`` argument of ``sphinx.ext.autosummary.generate.
+ AutosummaryRenderer``
+* The ``module`` argument of ``sphinx.ext.autosummary.generate.
+ find_autosummary_in_docstring()``
+* The ``builder`` argument of ``sphinx.ext.autosummary.generate.
+ generate_autosummary_docs()``
+* The ``template_dir`` argument of ``sphinx.ext.autosummary.generate.
+ generate_autosummary_docs()``
+* The ``ignore`` argument of ``sphinx.util.docstring.prepare_docstring()``
+* ``sphinx.ext.autosummary.generate.AutosummaryRenderer.exists()``
+* ``sphinx.util.rpartition()``
+
+Features added
+--------------
+
+* LaTeX: Make the ``toplevel_sectioning`` setting optional in LaTeX theme
+* LaTeX: Allow to override papersize and pointsize from LaTeX themes
+* LaTeX: Add :confval:`latex_theme_options` to override theme options
+* #7410: Allow to suppress "circular toctree references detected" warnings using
+ :confval:`suppress_warnings`
+* C, added scope control directives, :rst:dir:`c:namespace`,
+ :rst:dir:`c:namespace-push`, and :rst:dir:`c:namespace-pop`.
+* #2044: autodoc: Suppress default value for instance attributes
+* #7473: autodoc: consider a member public if docstring contains
+ ``:meta public:`` in info-field-list
+* #7487: autodoc: Allow to generate docs for singledispatch functions by
+ py:autofunction
+* #7143: autodoc: Support final classes and methods
+* #7384: autodoc: Support signatures defined by ``__new__()``, metaclasses and
+ builtin base classes
+* #2106: autodoc: Support multiple signatures on docstring
+* #4422: autodoc: Support GenericAlias in Python 3.7 or above
+* #3610: autodoc: Support overloaded functions
+* #7722: autodoc: Support TypeVar
+* #7466: autosummary: headings in generated documents are not translated
+* #7490: autosummary: Add ``:caption:`` option to autosummary directive to set a
+ caption to the toctree
+* #7469: autosummary: Support module attributes
+* #248, #6040: autosummary: Add ``:recursive:`` option to autosummary directive
+ to generate stub files recursively
+* #4030: autosummary: Add :confval:`autosummary_context` to add template
+ variables for custom templates
+* #7530: html: Support nested <kbd> elements
+* #7481: html theme: Add right margin to footnote/citation labels
+* #7482, #7717: html theme: CSS spacing for code blocks with captions and line
+ numbers
+* #7443: html theme: Add new options :confval:`globaltoc_collapse` and
+ :confval:`globaltoc_includehidden` to control the behavior of globaltoc in
+ sidebar
+* #7484: html theme: Avoid clashes between sidebar and other blocks
+* #7476: html theme: Relbar breadcrumb should contain current page
+* #7506: html theme: A canonical URL is not escaped
+* #7533: html theme: Avoid whitespace at the beginning of genindex.html
+* #7541: html theme: Add a "clearer" at the end of the "body"
+* #7542: html theme: Make admonition/topic/sidebar scrollable
+* #7543: html theme: Add top and bottom margins to tables
+* #7695: html theme: Add viewport meta tag for basic theme
+* #7721: html theme: classic: default codetextcolor/codebgcolor doesn't override
+ Pygments
+* C and C++: allow semicolon in the end of declarations.
+* C++, parse parameterized noexcept specifiers.
+* #7294: C++, parse expressions with user-defined literals.
+* C++, parse trailing return types.
+* #7143: py domain: Add ``:final:`` option to :rst:dir:`py:class`,
+ :rst:dir:`py:exception` and :rst:dir:`py:method` directives
+* #7596: py domain: Change a type annotation for variables to a hyperlink
+* #7770: std domain: :rst:dir:`option` directive support arguments in the form
+ of ``foo[=bar]``
+* #7582: napoleon: a type for attribute are represented like type annotation
+* #7734: napoleon: overescaped trailing underscore on attribute
+* #7247: linkcheck: Add :confval:`linkcheck_request_headers` to send custom HTTP
+ headers for specific host
+* #7792: setuptools: Support ``--verbosity`` option
+* #7683: Add ``allowed_exceptions`` parameter to ``Sphinx.emit()`` to allow
+ handlers to raise specified exceptions
+* #7295: C++, parse (trailing) requires clauses.
+
+Bugs fixed
+----------
+
+* #6703: autodoc: incremental build does not work for imported objects
+* #7564: autodoc: annotations not to be shown for descriptors
+* #6588: autodoc: Decorated inherited method has no documentation
+* #7469: autodoc: The change of autodoc-process-docstring for variables is
+ cached unexpectedly
+* #7559: autodoc: misdetects a sync function is async
+* #6857: autodoc: failed to detect a classmethod on Enum class
+* #7562: autodoc: a typehint contains spaces is wrongly rendered under
+ :confval:`autodoc_typehints`\ ``='description'`` mode
+* #7551: autodoc: failed to import nested class
+* #7362: autodoc: does not render correct signatures for built-in functions
+* #7654: autodoc: ``Optional[Union[foo, bar]]`` is presented as
+ ``Union[foo, bar, None]``
+* #7629: autodoc: autofunction emits an unfriendly warning if an invalid object
+ specified
+* #7650: autodoc: undecorated signature is shown for decorated functions
+* #7676: autodoc: typo in the default value of autodoc_member_order
+* #7676: autodoc: wrong value for :member-order: option is ignored silently
+* #7676: autodoc: member-order="bysource" does not work for C module
+* #3673: autodoc: member-order="bysource" does not work for a module having
+ __all__
+* #7668: autodoc: wrong retann value is passed to a handler of
+ autodoc-process-signature
+* #7711: autodoc: fails with ValueError when processing numpy objects
+* #7791: autodoc: TypeError is raised on documenting singledispatch function
+* #7551: autosummary: a nested class is indexed as non-nested class
+* #7661: autosummary: autosummary directive emits warnings twices if failed to
+ import the target module
+* #7685: autosummary: The template variable "members" contains imported members
+ even if :confval:`autossummary_imported_members` is False
+* #7671: autosummary: The location of import failure warning is missing
+* #7535: sphinx-autogen: crashes when custom template uses inheritance
+* #7536: sphinx-autogen: crashes when template uses i18n feature
+* #7781: sphinx-build: Wrong error message when outdir is not directory
+* #7653: sphinx-quickstart: Fix multiple directory creation for nested relpath
+* #2785: html: Bad alignment of equation links
+* #7718: html theme: some themes does not respect background color of Pygments
+ style (agogo, haiku, nature, pyramid, scrolls, sphinxdoc and traditional)
+* #7544: html theme: inconsistent padding in admonitions
+* #7581: napoleon: bad parsing of inline code in attribute docstrings
+* #7628: imgconverter: runs imagemagick once unnecessary for builders not
+ supporting images
+* #7610: incorrectly renders consecutive backslashes for docutils-0.16
+* #7646: handle errors on event handlers
+* #4187: LaTeX: EN DASH disappears from PDF bookmarks in Japanese documents
+* #7701: LaTeX: Anonymous indirect hyperlink target causes duplicated labels
+* #7723: LaTeX: pdflatex crashed when URL contains a single quote
+* #7756: py domain: The default value for positional only argument is not shown
+* #7760: coverage: Add :confval:`coverage_show_missing_items` to show coverage
+ result to console
+* C++, fix rendering and xrefs in nested names explicitly starting
+ in global scope, e.g., ``::A::B``.
+* C, fix rendering and xrefs in nested names explicitly starting
+ in global scope, e.g., ``.A.B``.
+* #7763: C and C++, don't crash during display stringification of unary
+ expressions and fold expressions.
+
+Release 3.0.4 (released May 27, 2020)
+=====================================
+
+Bugs fixed
+----------
+
+* #7567: autodoc: parametrized types are shown twice for generic types
+* #7637: autodoc: system defined TypeVars are shown in Python 3.9
+* #7696: html: Updated jQuery version from 3.4.1 to 3.5.1 for security reasons
+* #7611: md5 fails when OpenSSL FIPS is enabled
+* #7626: release package does not contain ``CODE_OF_CONDUCT``
+
+Release 3.0.3 (released Apr 26, 2020)
+=====================================
+
+Features added
+--------------
+
+* C, parse array declarators with static, qualifiers, and VLA specification.
+
+Bugs fixed
+----------
+
+* #7516: autodoc: crashes if target object raises an error on accessing
+ its attributes
+
+Release 3.0.2 (released Apr 19, 2020)
+=====================================
+
+Features added
+--------------
+
+* C, parse attributes and add :confval:`c_id_attributes`
+ and :confval:`c_paren_attributes` to support user-defined attributes.
+
+Bugs fixed
+----------
+
+* #7461: py domain: fails with IndexError for empty tuple in type annotation
+* #7510: py domain: keyword-only arguments are documented as having a default of
+ None
+* #7418: std domain: :rst:role:`term` role could not match case-insensitively
+* #7461: autodoc: empty tuple in type annotation is not shown correctly
+* #7479: autodoc: Sphinx builds has been slower since 3.0.0 on mocking
+* C++, fix spacing issue in east-const declarations.
+* #7414: LaTeX: Xindy language options were incorrect
+* sphinx crashes with ImportError on python3.5.1
+
+Release 3.0.1 (released Apr 11, 2020)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #7418: std domain: :rst:role:`term` role becomes case sensitive
+
+Bugs fixed
+----------
+
+* #7428: py domain: a reference to class ``None`` emits a nitpicky warning
+* #7445: py domain: a return annotation ``None`` in the function signature is
+ not converted to a hyperlink when using intersphinx
+* #7418: std domain: duplication warning for glossary terms is case insensitive
+* #7438: C++, fix merging overloaded functions in parallel builds.
+* #7422: autodoc: fails with ValueError when using autodoc_mock_imports
+* #7435: autodoc: :confval:`autodoc_typehints`\ ``='description'`` doesn't
+ suppress typehints in signature for classes/methods
+* #7451: autodoc: fails with AttributeError when an object returns non-string
+ object as a ``__doc__`` member
+* #7423: crashed when giving a non-string object to logger
+* #7479: html theme: Do not include xmlns attribute with HTML 5 doctype
+* #7426: html theme: Escape some links in HTML templates
+
+Release 3.0.0 (released Apr 06, 2020)
+=====================================
+
+Dependencies
+------------
+
+3.0.0b1
+
+* LaTeX: drop dependency on :program:`extractbb` for image inclusion in
+ Japanese documents as ``.xbb`` files are unneeded by :program:`dvipdfmx`
+ since TeXLive2015 (refs: #6189)
+* babel-2.0 or above is available (Unpinned)
+
+Incompatible changes
+--------------------
+
+3.0.0b1
+
+* Drop features and APIs deprecated in 1.8.x
+* #247: autosummary: stub files are overwritten automatically by default. see
+ :confval:`autosummary_generate_overwrite` to change the behavior
+* #5923: autodoc: the members of ``object`` class are not documented by default
+ when ``:inherited-members:`` and ``:special-members:`` are given.
+* #6830: py domain: ``meta`` fields in info-field-list becomes reserved. They
+ are not displayed on output document now
+* #6417: py domain: doctree of desc_parameterlist has been changed. The
+ argument names, annotations and default values are wrapped with inline node
+* The structure of ``sphinx.events.EventManager.listeners`` has changed
+* Due to the scoping changes for :rst:dir:`productionlist` some uses of
+ :rst:role:`token` must be modified to include the scope which was previously
+ ignored.
+* #6903: Internal data structure of Python, reST and standard domains have
+ changed. The node_id is added to the index of objects and modules. Now they
+ contains a pair of docname and node_id for cross reference.
+* #7276: C++ domain: Non intended behavior is removed such as ``say_hello_``
+ links to ``.. cpp:function:: say_hello()``
+* #7210: js domain: Non intended behavior is removed such as ``parseInt_`` links
+ to ``.. js:function:: parseInt``
+* #7229: rst domain: Non intended behavior is removed such as ``numref_`` links
+ to ``.. rst:role:: numref``
+* #6903: py domain: Non intended behavior is removed such as ``say_hello_``
+ links to ``.. py:function:: say_hello()``
+* #7246: py domain: Drop special cross reference helper for exceptions,
+ functions and methods
+* The C domain has been rewritten, with additional directives and roles.
+ The existing ones are now more strict, resulting in new warnings.
+* The attribute ``sphinx_cpp_tagname`` in the ``desc_signature_line`` node
+ has been renamed to ``sphinx_line_type``.
+* #6462: double backslashes in domain directives are no longer replaced by
+ single backslashes as default. A new configuration value
+ :confval:`strip_signature_backslash` can be used by users to re-enable it.
+
+3.0.0 final
+
+* #7222: ``sphinx.util.inspect.unwrap()`` is renamed to ``unwrap_all()``
+
+Deprecated
+----------
+
+3.0.0b1
+
+* ``desc_signature['first']``
+* ``sphinx.directives.DescDirective``
+* ``sphinx.domains.std.StandardDomain.add_object()``
+* ``sphinx.domains.python.PyDecoratorMixin``
+* ``sphinx.ext.autodoc.get_documenters()``
+* ``sphinx.ext.autosummary.process_autosummary_toc()``
+* ``sphinx.parsers.Parser.app``
+* ``sphinx.testing.path.Path.text()``
+* ``sphinx.testing.path.Path.bytes()``
+* ``sphinx.util.inspect.getargspec()``
+* ``sphinx.writers.latex.LaTeXWriter.format_docclass()``
+
+Features added
+--------------
+
+3.0.0b1
+
+* #247: autosummary: Add :confval:`autosummary_generate_overwrite` to overwrite
+ old stub file
+* #5923: autodoc: ``:inherited-members:`` option takes a name of anchestor class
+ not to document inherited members of the class and uppers
+* #6830: autodoc: consider a member private if docstring contains
+ ``:meta private:`` in info-field-list
+* #7165: autodoc: Support Annotated type (PEP-593)
+* #2815: autodoc: Support singledispatch functions and methods
+* #7079: autodoc: :confval:`autodoc_typehints` accepts ``"description"``
+ configuration. It shows typehints as object description
+* #7314: apidoc: Propagate ``--maxdepth`` option through package documents
+* #6558: glossary: emit a warning for duplicated glossary entry
+* #3106: domain: Register hyperlink target for index page automatically
+* #6558: std domain: emit a warning for duplicated generic objects
+* #6830: py domain: Add new event: :event:`object-description-transform`
+* #6895: py domain: Do not emit nitpicky warnings for built-in types
+* py domain: Support lambda functions in function signature
+* #6417: py domain: Allow to make a style for arguments of functions and methods
+* #7238, #7239: py domain: Emit a warning on describing a python object if the
+ entry is already added as the same name
+* #7341: py domain: type annotations in signature are converted to cross refs
+* Support priority of event handlers. For more detail, see
+ :py:meth:`.Sphinx.connect()`
+* #3077: Implement the scoping for :rst:dir:`productionlist` as indicated
+ in the documentation.
+* #1027: Support backslash line continuation in :rst:dir:`productionlist`.
+* #7108: config: Allow to show an error message from conf.py via ``ConfigError``
+* #7032: html: :confval:`html_scaled_image_link` will be disabled for images having
+ ``no-scaled-link`` class
+* #7144: Add CSS class indicating its domain for each desc node
+* #7211: latex: Use babel for Chinese document when using XeLaTeX
+* #6672: LaTeX: Support LaTeX Theming (experimental)
+* #7005: LaTeX: Add LaTeX styling macro for :rst:role:`kbd` role
+* #7220: genindex: Show "main" index entries at first
+* #7103: linkcheck: writes all links to ``output.json``
+* #7025: html search: full text search can be disabled for individual document
+ using ``:nosearch:`` file-wide metadata
+* #7293: html search: Allow to override JavaScript splitter via
+ ``SearchLanguage.js_splitter_code``
+* #7142: html theme: Add a theme option: ``pygments_dark_style`` to switch the
+ style of code-blocks in dark mode
+* The C domain has been rewritten adding for example:
+
+ - Cross-referencing respecting the current scope.
+ - Possible to document anonymous entities.
+ - More specific directives and roles for each type of entity,
+ e.g., handling scoping of enumerators.
+ - New role :rst:role:`c:expr` for rendering expressions and types
+ in text.
+
+* Added ``SphinxDirective.get_source_info()``
+ and ``SphinxRole.get_source_info()``.
+* #7324: sphinx-build: Emit a warning if multiple files having different file
+ extensions for same document found
+
+3.0.0 final
+
+* Added ``ObjectDescription.transform_content()``.
+
+Bugs fixed
+----------
+
+3.0.0b1
+
+* C++, fix cross reference lookup in certain cases involving
+ function overloads.
+* #5078: C++, fix cross reference lookup when a directive contains multiple
+ declarations.
+* C++, suppress warnings for directly dependent typenames in cross references
+ generated automatically in signatures.
+* #5637: autodoc: Incorrect handling of nested class names on show-inheritance
+* #7267: autodoc: error message for invalid directive options has wrong location
+* #7329: autodoc: info-field-list is wrongly generated from type hints into the
+ class description even if ``autoclass_content='class'`` set
+* #7331: autodoc: a cython-function is not recognized as a function
+* #5637: inheritance_diagram: Incorrect handling of nested class names
+* #7139: ``code-block:: guess`` does not work
+* #7325: html: source_suffix containing dot leads to wrong source link
+* #7357: html: Resizing SVG image fails with ValueError
+* #7278: html search: Fix use of ``html_file_suffix`` instead of
+ ``html_link_suffix`` in search results
+* #7297: html theme: ``bizstyle`` does not support ``sidebarwidth``
+* #3842: singlehtml: Path to images broken when master doc is not in source root
+* #7179: std domain: Fix whitespaces are suppressed on referring GenericObject
+* #7289: console: use bright colors instead of bold
+* #1539: C, parse array types.
+* #2377: C, parse function pointers even in complex types.
+* #7345: sphinx-build: Sphinx crashes if output directory exists as a file
+* #7290: sphinx-build: Ignore bdb.BdbQuit when handling exceptions
+* #6240: napoleon: Attributes and Methods sections ignore :noindex: option
+
+3.0.0 final
+
+* #7364: autosummary: crashed when :confval:`autosummary_generate` is False
+* #7370: autosummary: raises UnboundLocalError when unknown module given
+* #7367: C++, alternate operator spellings are now supported.
+* C, alternate operator spellings are now supported.
+* #7368: C++, comma operator in expressions, pack expansion in template
+ argument lists, and more comprehensive error messages in some cases.
+* C, C++, fix crash and wrong duplicate warnings related to anon symbols.
+* #6477: Escape first "!" in a cross reference linking no longer possible
+* #7219: py domain: The index entry generated by ``py:function`` directive is
+ different with one from ``index`` directive with "builtin" type
+* #7301: capital characters are not allowed for node_id
+* #7301: epub: duplicated node_ids are generated
+* #6564: html: a width of table was ignored on HTML builder
+* #7401: Incorrect argument is passed for :event:`env-get-outdated` handlers
+* #7355: autodoc: a signature of cython-function is not recognized well
+* #7222: autodoc: ``__wrapped__`` functions are not documented correctly
+* #7409: intersphinx: ValueError is raised when an extension sets up
+ :confval:`intersphinx_mapping` on :event:`config-inited` event
+* #7343: Sphinx builds has been slower since 2.4.0 on debug mode
+
+Release 2.4.5 (released Nov 18, 2021)
+=====================================
+
+Dependencies
+------------
+
+* #9807: Restrict docutils to 0.17.x or older
+
+Release 2.4.4 (released Mar 05, 2020)
+=====================================
+
+Bugs fixed
+----------
+
+* #7197: LaTeX: platex cause error to build image directive with target url
+* #7223: Sphinx builds has been slower since 2.4.0
+
+Release 2.4.3 (released Feb 22, 2020)
+=====================================
+
+Bugs fixed
+----------
+
+* #7184: autodoc: ``*args`` and ``**kwarg`` in type comments are not handled
+ properly
+* #7189: autodoc: classmethod coroutines are not detected
+* #7183: intersphinx: ``:attr:`` reference to property is broken
+* #6244, #6387: html search: Search breaks/hangs when built with dirhtml builder
+* #7195: todo: emit doctree-resolved event with non-document node incorrectly
+
+Release 2.4.2 (released Feb 19, 2020)
+=====================================
+
+Bugs fixed
+----------
+
+* #7138: autodoc: ``autodoc.typehints`` crashed when variable has unbound object
+ as a value
+* #7156: autodoc: separator for keyword only arguments is not shown
+* #7146: autodoc: IndexError is raised on suppressed type_comment found
+* #7161: autodoc: typehints extension does not support parallel build
+* #7178: autodoc: TypeError is raised on fetching type annotations
+* #7151: crashed when extension assigns a value to ``env.indexentries``
+* #7170: text: Remove debug print
+* #7137: viewcode: Avoid to crash when non-python code given
+
+Release 2.4.1 (released Feb 11, 2020)
+=====================================
+
+Bugs fixed
+----------
+
+* #7120: html: crashed when on scaling SVG images which have float dimensions
+* #7126: autodoc: TypeError: 'getset_descriptor' object is not iterable
+
+Release 2.4.0 (released Feb 09, 2020)
+=====================================
+
+Deprecated
+----------
+
+* The ``decode`` argument of ``sphinx.pycode.ModuleAnalyzer()``
+* ``sphinx.directives.other.Index``
+* ``sphinx.environment.temp_data['gloss_entries']``
+* ``sphinx.environment.BuildEnvironment.indexentries``
+* ``sphinx.environment.collectors.indexentries.IndexEntriesCollector``
+* ``sphinx.ext.apidoc.INITPY``
+* ``sphinx.ext.apidoc.shall_skip()``
+* ``sphinx.io.FiletypeNotFoundError``
+* ``sphinx.io.get_filetype()``
+* ``sphinx.pycode.ModuleAnalyzer.encoding``
+* ``sphinx.roles.Index``
+* ``sphinx.util.detect_encoding()``
+* ``sphinx.util.get_module_source()``
+* ``sphinx.util.inspect.Signature``
+* ``sphinx.util.inspect.safe_getmembers()``
+* ``sphinx.writers.latex.LaTeXTranslator.settings.author``
+* ``sphinx.writers.latex.LaTeXTranslator.settings.contentsname``
+* ``sphinx.writers.latex.LaTeXTranslator.settings.docclass``
+* ``sphinx.writers.latex.LaTeXTranslator.settings.docname``
+* ``sphinx.writers.latex.LaTeXTranslator.settings.title``
+* ``sphinx.writers.latex.ADDITIONAL_SETTINGS``
+* ``sphinx.writers.latex.DEFAULT_SETTINGS``
+* ``sphinx.writers.latex.LUALATEX_DEFAULT_FONTPKG``
+* ``sphinx.writers.latex.PDFLATEX_DEFAULT_FONTPKG``
+* ``sphinx.writers.latex.XELATEX_DEFAULT_FONTPKG``
+* ``sphinx.writers.latex.XELATEX_GREEK_DEFAULT_FONTPKG``
+
+Features added
+--------------
+
+* #6910: inheritance_diagram: Make the background of diagrams transparent
+* #6446: duration: Add ``sphinx.ext.durations`` to inspect which documents slow
+ down the build
+* #6837: LaTeX: Support a nested table
+* #7115: LaTeX: Allow to override LATEXOPTS and LATEXMKOPTS via environment
+ variable
+* #6966: graphviz: Support ``:class:`` option
+* #6696: html: ``:scale:`` option of image/figure directive not working for SVG
+ images (imagesize-1.2.0 or above is required)
+* #6994: imgconverter: Support illustrator file (.ai) to .png conversion
+* autodoc: Support Positional-Only Argument separator (PEP-570 compliant)
+* autodoc: Support type annotations for variables
+* #2755: autodoc: Add new event: :event:`autodoc-before-process-signature`
+* #2755: autodoc: Support type_comment style (ex. ``# type: (str) -> str``)
+ annotation (python3.8+ or `typed_ast <https://github.com/python/typed_ast>`_
+ is required)
+* #7051: autodoc: Support instance variables without defaults (PEP-526)
+* #6418: autodoc: Add a new extension ``sphinx.ext.autodoc.typehints``. It shows
+ typehints as object description if ``autodoc_typehints = "description"`` set.
+ This is an experimental extension and it will be integrated into autodoc core
+ in Sphinx 3.0
+* SphinxTranslator now calls visitor/departure method for super node class if
+ visitor/departure method for original node class not found
+* #6418: Add new event: :event:`object-description-transform`
+* py domain: :rst:dir:`py:data` and :rst:dir:`py:attribute` take new options
+ named ``:type:`` and ``:value:`` to describe its type and initial value
+* #6785: py domain: ``:py:attr:`` is able to refer properties again
+* #6772: apidoc: Add ``-q`` option for quiet mode
+
+Bugs fixed
+----------
+
+* #6925: html: Remove redundant type="text/javascript" from <script> elements
+* #7112: html: SVG image is not layouted as float even if aligned
+* #6906, #6907: autodoc: failed to read the source codes encoeded in cp1251
+* #6961: latex: warning for babel shown twice
+* #7059: latex: LaTeX compilation falls into infinite loop (wrapfig issue)
+* #6581: latex: ``:reversed:`` option for toctree does not effect to LaTeX build
+* #6559: Wrong node-ids are generated in glossary directive
+* #6986: apidoc: misdetects module name for .so file inside module
+* #6899: apidoc: private members are not shown even if ``--private`` given
+* #6327: apidoc: Support a python package consisted of __init__.so file
+* #6999: napoleon: fails to parse tilde in :exc: role
+* #7019: gettext: Absolute path used in message catalogs
+* #7023: autodoc: nested partial functions are not listed
+* #7023: autodoc: partial functions imported from other modules are listed as
+ module members without :impoprted-members: option
+* #6889: autodoc: Trailing comma in ``:members::`` option causes cryptic warning
+* #6568: autosummary: ``autosummary_imported_members`` is ignored on generating
+ a stub file for submodule
+* #7055: linkcheck: redirect is treated as an error
+* #7088: HTML template: If ``navigation_with_keys`` option is activated,
+ modifier keys are ignored, which means the feature can interfere with browser
+ features
+* #7090: std domain: Can't assign numfig-numbers for custom container nodes
+* #7106: std domain: enumerated nodes are marked as duplicated when extensions
+ call ``note_explicit_target()``
+* #7095: dirhtml: Cross references are broken via intersphinx and ``:doc:`` role
+* C++:
+
+ - Don't crash when using the ``struct`` role in some cases.
+ - Don't warn when using the ``var``/``member`` role for function
+ parameters.
+ - Render call and braced-init expressions correctly.
+* #7097: Filenames of images generated by
+ ``sphinx.transforms.post_transforms.images.ImageConverter``
+ or its subclasses (used for latex build) are now sanitized,
+ to prevent broken paths
+
+Release 2.3.1 (released Dec 22, 2019)
+=====================================
+
+Bugs fixed
+----------
+
+* #6936: sphinx-autogen: raises AttributeError
+
+Release 2.3.0 (released Dec 15, 2019)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #6742: ``end-before`` option of :rst:dir:`literalinclude` directive does not
+ match the first line of the code block.
+* #1331: Change default User-Agent header to ``"Sphinx/X.Y.Z requests/X.Y.Z
+ python/X.Y.Z"``. It can be changed via :confval:`user_agent`.
+* #6867: text: content of admonitions starts after a blank line
+
+Deprecated
+----------
+
+* ``sphinx.builders.gettext.POHEADER``
+* ``sphinx.io.SphinxStandaloneReader.app``
+* ``sphinx.io.SphinxStandaloneReader.env``
+* ``sphinx.util.texescape.tex_escape_map``
+* ``sphinx.util.texescape.tex_hl_escape_map_new``
+* ``sphinx.writers.latex.LaTeXTranslator.no_contractions``
+
+Features added
+--------------
+
+* #6707: C++, support bit-fields.
+* #267: html: Eliminate prompt characters of doctest block from copyable text
+* #6548: html: Use favicon for OpenSearch if available
+* #6729: html theme: agogo theme now supports ``rightsidebar`` option
+* #6780: Add PEP-561 Support
+* #6762: latex: Allow to load additional LaTeX packages via ``extrapackages`` key
+ of :confval:`latex_elements`
+* #1331: Add new config variable: :confval:`user_agent`
+* #6000: LaTeX: have backslash also be an inline literal word wrap break
+ character
+* #4186: LaTeX: Support upLaTeX as a new :confval:`latex_engine` (experimental)
+* #6812: Improve a warning message when extensions are not parallel safe
+* #6818: Improve Intersphinx performance for multiple remote inventories.
+* #2546: apidoc: .so file support
+* #6798: autosummary: emit ``autodoc-skip-member`` event on generating stub file
+* #6483: i18n: make explicit titles in toctree translatable
+* #6816: linkcheck: Add :confval:`linkcheck_auth` option to provide
+ authentication information when doing ``linkcheck`` builds
+* #6872: linkcheck: Handles HTTP 308 Permanent Redirect
+* #6613: html: Wrap section number in span tag
+* #6781: gettext: Add :confval:`gettext_last_translator` and
+ :confval:`gettext_language_team` to customize headers of POT file
+
+Bugs fixed
+----------
+
+* #6668: LaTeX: Longtable before header has incorrect distance
+ (refs: `latex3/latex2e#173`_)
+
+ .. _latex3/latex2e#173: https://github.com/latex3/latex2e/issues/173
+* #6618: LaTeX: Avoid section names at the end of a page
+* #6738: LaTeX: Do not replace unicode characters by LaTeX macros on unicode
+ supported LaTeX engines: ¶, §, €, ∞, ±, →, ‣, –, superscript and subscript
+ digits go through "as is" (as default OpenType font supports them)
+* #6704: linkcheck: Be defensive and handle newly defined HTTP error code
+* #6806: linkcheck: Failure on parsing content
+* #6655: image URLs containing ``data:`` causes gettext builder crashed
+* #6584: i18n: Error when compiling message catalogs on Hindi
+* #6718: i18n: KeyError is raised if section title and table title are same
+* #6743: i18n: :confval:`rst_prolog` breaks the translation
+* #6708: mathbase: Some deprecated functions have removed
+* #6709: autodoc: mock object does not work as a class decorator
+* #5070: epub: Wrong internal href fragment links
+* #6712: Allow not to install sphinx.testing as runtime (mainly for ALT Linux)
+* #6741: html: search result was broken with empty :confval:`html_file_suffix`
+* #6001: LaTeX does not wrap long code lines at backslash character
+* #6804: LaTeX: PDF build breaks if admonition of danger type contains
+ code-block long enough not to fit on one page
+* #6809: LaTeX: code-block in a danger type admonition can easily spill over
+ bottom of page
+* #6793: texinfo: Code examples broken following "sidebar"
+* #6813: An orphan warning is emitted for included document on Windows. Thanks
+ to @drillan
+* #6850: Fix smartypants module calls re.sub() with wrong options
+* #6824: HTML search: If a search term is partially matched in the title and
+ fully matched in a text paragraph on the same page, the search does not
+ include this match.
+* #6848: config.py shouldn't pop extensions from overrides
+* #6867: text: extra spaces are inserted to hyphenated words on folding lines
+* #6886: LaTeX: xelatex converts straight double quotes into right curly ones
+ (shows when :confval:`smartquotes` is ``False``)
+* #6890: LaTeX: even with smartquotes off, PDF output transforms straight
+ quotes and consecutive hyphens into curly quotes and dashes
+* #6876: LaTeX: multi-line display of authors on title page has ragged edges
+* #6887: Sphinx crashes with docutils-0.16b0
+* #6920: sphinx-build: A console message is wrongly highlighted
+* #6900: sphinx-build: ``-D`` option does not considers ``0`` and ``1`` as a
+ boolean value
+
+Release 2.2.2 (released Dec 03, 2019)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #6803: For security reason of python, parallel mode is disabled on macOS and
+ Python3.8+
+
+Bugs fixed
+----------
+
+* #6776: LaTeX: 2019-10-01 LaTeX release breaks :file:`sphinxcyrillic.sty`
+* #6815: i18n: French, Hindi, Chinese, Japanese and Korean translation messages
+ has been broken
+* #6803: parallel build causes AttributeError on macOS and Python3.8
+
+Release 2.2.1 (released Oct 26, 2019)
+=====================================
+
+Bugs fixed
+----------
+
+* #6641: LaTeX: Undefined control sequence ``\sphinxmaketitle``
+* #6710: LaTeX not well configured for Greek language as main language
+* #6759: validation of html static paths and extra paths no longer throws
+ an error if the paths are in different directories
+
+Release 2.2.0 (released Aug 19, 2019)
+=====================================
+
+Incompatible changes
+--------------------
+
+* apidoc: template files are renamed to ``.rst_t``
+* html: Field lists will be styled by grid layout
+
+Deprecated
+----------
+
+* ``sphinx.domains.math.MathDomain.add_equation()``
+* ``sphinx.domains.math.MathDomain.get_next_equation_number()``
+* The ``info`` and ``warn`` arguments of
+ ``sphinx.ext.autosummary.generate.generate_autosummary_docs()``
+* ``sphinx.ext.autosummary.generate._simple_info()``
+* ``sphinx.ext.autosummary.generate._simple_warn()``
+* ``sphinx.ext.todo.merge_info()``
+* ``sphinx.ext.todo.process_todo_nodes()``
+* ``sphinx.ext.todo.process_todos()``
+* ``sphinx.ext.todo.purge_todos()``
+
+Features added
+--------------
+
+* #5124: graphviz: ``:graphviz_dot:`` option is renamed to ``:layout:``
+* #1464: html: emit a warning if :confval:`html_static_path` and
+ :confval:`html_extra_path` directories are inside output directory
+* #6514: html: Add a label to search input for accessability purposes
+* #5602: apidoc: Add ``--templatedir`` option
+* #6475: Add ``override`` argument to ``app.add_autodocumenter()``
+* #6310: imgmath: let :confval:`imgmath_use_preview` work also with the SVG
+ format for images rendering inline math
+* #6533: LaTeX: refactor visit_enumerated_list() to use ``\sphinxsetlistlabels``
+* #6628: quickstart: Use ``https://docs.python.org/3/`` for default setting of
+ :confval:`intersphinx_mapping`
+* #6419: sphinx-build: give reasons why rebuilt
+
+Bugs fixed
+----------
+
+* py domain: duplicated warning does not point the location of source code
+* #6499: html: Sphinx never updates a copy of :confval:`html_logo` even if
+ original file has changed
+* #1125: html theme: scrollbar is hard to see on classic theme and macOS
+* #5502: linkcheck: Consider HTTP 503 response as not an error
+* #6439: Make generated download links reproducible
+* #6486: UnboundLocalError is raised if broken extension installed
+* #6567: autodoc: :confval:`autodoc_inherit_docstrings` does not effect to
+ ``__init__()`` and ``__new__()``
+* #6574: autodoc: :confval:`autodoc_member_order` does not refer order of
+ imports when ``'bysource'`` order
+* #6574: autodoc: missing type annotation for variadic and keyword parameters
+* #6589: autodoc: Formatting issues with autodoc_typehints='none'
+* #6605: autodoc: crashed when target code contains custom method-like objects
+* #6498: autosummary: crashed with wrong autosummary_generate setting
+* #6507: autosummary: crashes without no autosummary_generate setting
+* #6511: LaTeX: autonumbered list can not be customized in LaTeX
+ since Sphinx 1.8.0 (refs: #6533)
+* #6531: Failed to load last environment object when extension added
+* #736: Invalid sort in pair index
+* #6527: :data:`last_updated` wrongly assumes timezone as UTC
+* #5592: std domain: :rst:dir:`option` directive registers an index entry for
+ each comma separated option
+* #6549: sphinx-build: Escaped characters in error messages
+* #6545: doctest comments not getting trimmed since Sphinx 1.8.0
+* #6561: glossary: Wrong hyperlinks are generated for non alphanumeric terms
+* #6620: i18n: classifiers of definition list are not translated with
+ docutils-0.15
+* #6474: ``DocFieldTransformer`` raises AttributeError when given directive is
+ not a subclass of ObjectDescription
+
+Release 2.1.2 (released Jun 19, 2019)
+=====================================
+
+Bugs fixed
+----------
+
+* #6497: custom lexers fails highlighting when syntax error
+* #6478, #6488: info field lists are incorrectly recognized
+
+Release 2.1.1 (released Jun 10, 2019)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #6447: autodoc: Stop to generate document for undocumented module variables
+
+Bugs fixed
+----------
+
+* #6442: LaTeX: admonitions of :rst:dir:`note` type can get separated from
+ immediately preceding section title by pagebreak
+* #6448: autodoc: crashed when autodocumenting classes with ``__slots__ = None``
+* #6451: autodoc: generates docs for "optional import"ed modules as variables
+* #6452: autosummary: crashed when generating document of properties
+* #6455: napoleon: docstrings for properties are not processed
+* #6436: napoleon: "Unknown target name" error if variable name ends with
+ underscore
+* #6440: apidoc: missing blank lines between modules
+
+Release 2.1.0 (released Jun 02, 2019)
+=====================================
+
+Incompatible changes
+--------------------
+
+* Ignore filenames without file extension given to ``Builder.build_specific()``
+ API directly
+* #6230: The anchor of term in glossary directive is changed if it is consisted
+ by non-ASCII characters
+* #4550: html: Centering tables by default using CSS
+* #6239: latex: xelatex and xeCJK are used for Chinese documents by default
+* ``Sphinx.add_lexer()`` now takes a Lexer class instead of instance. An
+ instance of lexers are still supported until Sphinx 3.x.
+
+Deprecated
+----------
+
+* ``sphinx.builders.latex.LaTeXBuilder.apply_transforms()``
+* ``sphinx.builders._epub_base.EpubBuilder.esc()``
+* ``sphinx.directives.Acks``
+* ``sphinx.directives.Author``
+* ``sphinx.directives.Centered``
+* ``sphinx.directives.Class``
+* ``sphinx.directives.CodeBlock``
+* ``sphinx.directives.Figure``
+* ``sphinx.directives.HList``
+* ``sphinx.directives.Highlight``
+* ``sphinx.directives.Include``
+* ``sphinx.directives.Index``
+* ``sphinx.directives.LiteralInclude``
+* ``sphinx.directives.Meta``
+* ``sphinx.directives.Only``
+* ``sphinx.directives.SeeAlso``
+* ``sphinx.directives.TabularColumns``
+* ``sphinx.directives.TocTree``
+* ``sphinx.directives.VersionChange``
+* ``sphinx.domains.python.PyClassmember``
+* ``sphinx.domains.python.PyModulelevel``
+* ``sphinx.domains.std.StandardDomain._resolve_citation_xref()``
+* ``sphinx.domains.std.StandardDomain.note_citations()``
+* ``sphinx.domains.std.StandardDomain.note_citation_refs()``
+* ``sphinx.domains.std.StandardDomain.note_labels()``
+* ``sphinx.environment.NoUri``
+* ``sphinx.ext.apidoc.format_directive()``
+* ``sphinx.ext.apidoc.format_heading()``
+* ``sphinx.ext.apidoc.makename()``
+* ``sphinx.ext.autodoc.importer.MockFinder``
+* ``sphinx.ext.autodoc.importer.MockLoader``
+* ``sphinx.ext.autodoc.importer.mock()``
+* ``sphinx.ext.autosummary.autolink_role()``
+* ``sphinx.ext.imgmath.DOC_BODY``
+* ``sphinx.ext.imgmath.DOC_BODY_PREVIEW``
+* ``sphinx.ext.imgmath.DOC_HEAD``
+* ``sphinx.transforms.CitationReferences``
+* ``sphinx.transforms.SmartQuotesSkipper``
+* ``sphinx.util.docfields.DocFieldTransformer.preprocess_fieldtypes()``
+* ``sphinx.util.node.find_source_node()``
+* ``sphinx.util.i18n.find_catalog()``
+* ``sphinx.util.i18n.find_catalog_files()``
+* ``sphinx.util.i18n.find_catalog_source_files()``
+
+For more details, see :ref:`deprecation APIs list <dev-deprecated-apis>`.
+
+Features added
+--------------
+
+* Add a helper class ``sphinx.transforms.post_transforms.SphinxPostTransform``
+* Add helper methods
+
+ - ``PythonDomain.note_module()``
+ - ``PythonDomain.note_object()``
+ - ``SphinxDirective.set_source_info()``
+
+* #6180: Support ``--keep-going`` with ``BuildDoc`` setup command
+* ``math`` directive now supports ``:class:`` option
+* todo: ``todo`` directive now supports ``:name:`` option
+* Enable override via environment of ``SPHINXOPTS`` and ``SPHINXBUILD`` Makefile
+ variables (refs: #6232, #6303)
+* #6287: autodoc: Unable to document bound instance methods exported as module
+ functions
+* #6289: autodoc: :confval:`autodoc_default_options` now supports
+ ``imported-members`` option
+* #4777: autodoc: Support coroutine
+* #744: autodoc: Support abstractmethod
+* #6325: autodoc: Support attributes in __slots__. For dict-style __slots__,
+ autodoc considers values as a docstring of the attribute
+* #6361: autodoc: Add :confval:`autodoc_typehints` to suppress typehints from
+ signature
+* #1063: autodoc: ``automodule`` directive now handles undocumented module level
+ variables
+* #6212 autosummary: Add :confval:`autosummary_imported_members` to display
+ imported members on autosummary
+* #6271: ``make clean`` is catastrophically broken if building into '.'
+* #6363: Support ``%O%`` environment variable in make.bat
+* #4777: py domain: Add ``:async:`` option to :rst:dir:`py:function` directive
+* py domain: Add new options to :rst:dir:`py:method` directive
+
+ - ``:abstractmethod:``
+ - ``:async:``
+ - ``:classmethod:``
+ - ``:property:``
+ - ``:staticmethod:``
+
+* rst domain: Add :rst:dir:`rst:directive:option` directive to describe the option
+ for directive
+* #6306: html: Add a label to search form for accessability purposes
+* #4390: html: Consistent and semantic CSS for signatures
+* #6358: The ``rawsource`` property of ``production`` nodes now contains the
+ full production rule
+* #6373: autosectionlabel: Allow suppression of warnings
+* coverage: Support a new ``coverage_ignore_pyobjects`` option
+* #6239: latex: Support to build Chinese documents
+
+Bugs fixed
+----------
+
+* #6230: Inappropriate node_id has been generated by glossary directive if term
+ is consisted by non-ASCII characters
+* #6213: ifconfig: contents after headings are not shown
+* commented term in glossary directive is wrongly recognized
+* #6299: rst domain: rst:directive directive generates waste space
+* #6379: py domain: Module index (py-modindex.html) has duplicate titles
+* #6331: man: invalid output when doctest follows rubric
+* #6351: "Hyperlink target is not referenced" message is shown even if
+ referenced
+* #6165: autodoc: ``tab_width`` setting of docutils has been ignored
+* #6347: autodoc: crashes with a plain Tuple on Python 3.6 and 3.5
+* #6311: autosummary: autosummary table gets confused by complex type hints
+* #6350: autosummary: confused by an argument having some kind of default value
+* Generated Makefiles lack a final EOL (refs: #6232)
+* #6375: extlinks: Cannot escape angle brackets in link caption
+* #6378: linkcheck: Send commonly used User-Agent
+* #6387: html search: failed to search document with haiku and scrolls themes
+* #6408: html search: Fix the ranking of search results
+* #6406: Wrong year is returned for ``SOURCE_DATE_EPOCH``
+* #6402: image directive crashes by unknown image format
+* #6286: C++, allow 8 and 9 in hexadecimal integer literals.
+* #6305: Fix the string in quickstart for 'path' argument of parser
+* LaTeX: Figures in admonitions produced errors (refs: #6364)
+
+Release 2.0.1 (released Apr 08, 2019)
+=====================================
+
+Bugs fixed
+----------
+
+* LaTeX: some system labels are not translated
+* RemovedInSphinx30Warning is marked as pending
+* deprecation warnings are not emitted
+
+ - ``sphinx.application.CONFIG_FILENAME``
+ - ``sphinx.builders.htmlhelp``
+ - :confval:`!viewcode_import`
+
+* #6208: C++, properly parse full xrefs that happen to have a short xref as
+ prefix
+* #6220, #6225: napoleon: AttributeError is raised for raised section having
+ references
+* #6245: circular import error on importing SerializingHTMLBuilder
+* #6243: LaTeX: 'releasename' setting for latex_elements is ignored
+* #6244: html: Search function is broken with 3rd party themes
+* #6263: html: HTML5Translator crashed with invalid field node
+* #6262: html theme: The style of field lists has changed in bizstyle theme
+
+Release 2.0.0 (released Mar 29, 2019)
+=====================================
+
+Dependencies
+------------
+
+2.0.0b1
+
+* LaTeX builder now depends on TeX Live 2015 or above.
+* LaTeX builder (with ``'pdflatex'`` :confval:`latex_engine`) will process
+ Unicode Greek letters in text (not in math mark-up) via the text font and
+ will not escape them to math mark-up. See the discussion of the
+ ``'fontenc'`` key of :confval:`latex_elements`; such (optional) support for
+ Greek adds, for example on Ubuntu xenial, the ``texlive-lang-greek`` and (if
+ default font set-up is not modified) ``cm-super(-minimal)`` as additional
+ Sphinx LaTeX requirements.
+* LaTeX builder with :confval:`latex_engine` set to ``'xelatex'`` or to
+ ``'lualatex'`` requires (by default) the ``FreeFont`` fonts,
+ which in Ubuntu xenial are provided by package ``fonts-freefont-otf``, and
+ e.g. in Fedora 29 via package ``texlive-gnu-freefont``.
+* requests 2.5.0 or above
+* The six package is no longer a dependency
+* The sphinxcontrib-websupport package is no longer a dependency
+* Some packages are separated to sub packages:
+
+ - sphinxcontrib.applehelp
+ - sphinxcontrib.devhelp
+ - sphinxcontrib.htmlhelp
+ - sphinxcontrib.jsmath
+ - sphinxcontrib.serializinghtml
+ - sphinxcontrib.qthelp
+
+Incompatible changes
+--------------------
+
+2.0.0b1
+
+* Drop python 2.7 and 3.4 support
+* Drop docutils 0.11 support
+* Drop features and APIs deprecated in 1.7.x
+* The default setting for :confval:`master_doc` is changed to ``'index'`` which
+ has been longly used as default of sphinx-quickstart.
+* LaTeX: Move message resources to ``sphinxmessage.sty``
+* LaTeX: Stop using ``\captions<lang>`` macro for some labels
+* LaTeX: for ``'xelatex'`` and ``'lualatex'``, use the ``FreeFont`` OpenType
+ fonts as default choice (refs: #5645)
+* LaTeX: ``'xelatex'`` and ``'lualatex'`` now use ``\small`` in code-blocks
+ (due to ``FreeMono`` character width) like ``'pdflatex'`` already did (due
+ to ``Courier`` character width). You may need to adjust this via
+ :confval:`latex_elements` ``'fvset'`` key, in case of usage of some other
+ OpenType fonts (refs: #5768)
+* LaTeX: Greek letters in text are not escaped to math mode mark-up, and they
+ will use the text font not the math font. The ``LGR`` font encoding must be
+ added to the ``'fontenc'`` key of :confval:`latex_elements` for this to work
+ (only if it is needed by the document, of course).
+* LaTeX: setting the :confval:`language` to ``'en'`` triggered ``Sonny`` option
+ of ``fncychap``, now it is ``Bjarne`` to match case of no language specified.
+ (refs: #5772)
+* #5770: doctest: Follow :confval:`highlight_language` on highlighting doctest
+ block. As a result, they are highlighted as python3 by default.
+* The order of argument for ``HTMLTranslator``, ``HTML5Translator`` and
+ ``ManualPageTranslator`` are changed
+* LaTeX: hard-coded redefinitions of ``\l@section`` and ``\l@subsection``
+ formerly done during loading of ``'manual'`` docclass get executed later, at
+ time of ``\sphinxtableofcontents``. This means that custom user definitions
+ from LaTeX preamble now get overwritten. Use ``\sphinxtableofcontentshook``
+ to insert custom user definitions. See :ref:`latex-macros`.
+* quickstart: Simplify generated ``conf.py``
+* #4148: quickstart: some questions are removed. They are still able to specify
+ via command line options
+* websupport: unbundled from sphinx core. Please use sphinxcontrib-websupport
+* C++, the visibility of base classes is now always rendered as present in the
+ input. That is, ``private`` is now shown, where it was ellided before.
+* LaTeX: graphics inclusion of oversized images rescales to not exceed
+ the text width and height, even if width and/or height option were used.
+ (refs: #5956)
+* epub: ``epub_title`` defaults to the :confval:`project` option
+* #4550: All tables and figures without ``align`` option are displayed to center
+* #4587: html: Output HTML5 by default
+
+2.0.0b2
+
+* texinfo: image files are copied into ``name-figure`` directory
+
+Deprecated
+----------
+
+2.0.0b1
+
+* Support for evaluating Python 2 syntax is deprecated. This includes
+ configuration files which should be converted to Python 3.
+* The arguments of ``EpubBuilder.build_mimetype()``,
+ ``EpubBuilder.build_container()``, ``EpubBuilder.bulid_content()``,
+ ``EpubBuilder.build_toc()`` and ``EpubBuilder.build_epub()``
+* The arguments of ``Epub3Builder.build_navigation_doc()``
+* The config variables
+
+ - :confval:`html_experimental_html5_writer`
+
+* The ``encoding`` argument of ``autodoc.Documenter.get_doc()``,
+ ``autodoc.DocstringSignatureMixin.get_doc()``,
+ ``autodoc.DocstringSignatureMixin._find_signature()``, and
+ ``autodoc.ClassDocumenter.get_doc()`` are deprecated.
+* The ``importer`` argument of ``sphinx.ext.autodoc.importer._MockModule``
+* The ``nodetype`` argument of ``sphinx.search.WordCollector.
+ is_meta_keywords()``
+* The ``suffix`` argument of ``env.doc2path()`` is deprecated.
+* The string style ``base`` argument of ``env.doc2path()`` is deprecated.
+* The fallback to allow omitting the ``filename`` argument from an overridden
+ ``IndexBuilder.feed()`` method is deprecated.
+* ``sphinx.addnodes.abbreviation``
+* ``sphinx.application.Sphinx._setting_up_extension``
+* ``sphinx.builders.epub3.Epub3Builder.validate_config_value()``
+* ``sphinx.builders.html.SingleFileHTMLBuilder``
+* ``sphinx.builders.htmlhelp.HTMLHelpBuilder.open_file()``
+* ``sphinx.cmd.quickstart.term_decode()``
+* ``sphinx.cmd.quickstart.TERM_ENCODING``
+* ``sphinx.config.check_unicode()``
+* ``sphinx.config.string_classes``
+* ``sphinx.domains.cpp.DefinitionError.description``
+* ``sphinx.domains.cpp.NoOldIdError.description``
+* ``sphinx.domains.cpp.UnsupportedMultiCharacterCharLiteral.decoded``
+* ``sphinx.ext.autodoc.importer._MockImporter``
+* ``sphinx.ext.autosummary.Autosummary.warn()``
+* ``sphinx.ext.autosummary.Autosummary.genopt``
+* ``sphinx.ext.autosummary.Autosummary.warnings``
+* ``sphinx.ext.autosummary.Autosummary.result``
+* ``sphinx.ext.doctest.doctest_encode()``
+* ``sphinx.io.SphinxBaseFileInput``
+* ``sphinx.io.SphinxFileInput.supported``
+* ``sphinx.io.SphinxRSTFileInput``
+* ``sphinx.registry.SphinxComponentRegistry.add_source_input()``
+* ``sphinx.roles.abbr_role()``
+* ``sphinx.roles.emph_literal_role()``
+* ``sphinx.roles.menusel_role()``
+* ``sphinx.roles.index_role()``
+* ``sphinx.roles.indexmarkup_role()``
+* ``sphinx.testing.util.remove_unicode_literal()``
+* ``sphinx.util.attrdict``
+* ``sphinx.util.force_decode()``
+* ``sphinx.util.get_matching_docs()``
+* ``sphinx.util.inspect.Parameter``
+* ``sphinx.util.jsonimpl``
+* ``sphinx.util.osutil.EEXIST``
+* ``sphinx.util.osutil.EINVAL``
+* ``sphinx.util.osutil.ENOENT``
+* ``sphinx.util.osutil.EPIPE``
+* ``sphinx.util.osutil.walk()``
+* ``sphinx.util.PeekableIterator``
+* ``sphinx.util.pycompat.NoneType``
+* ``sphinx.util.pycompat.TextIOWrapper``
+* ``sphinx.util.pycompat.UnicodeMixin``
+* ``sphinx.util.pycompat.htmlescape``
+* ``sphinx.util.pycompat.indent``
+* ``sphinx.util.pycompat.sys_encoding``
+* ``sphinx.util.pycompat.terminal_safe()``
+* ``sphinx.util.pycompat.u``
+* ``sphinx.writers.latex.ExtBabel``
+* ``sphinx.writers.latex.LaTeXTranslator._make_visit_admonition()``
+* ``sphinx.writers.latex.LaTeXTranslator.babel_defmacro()``
+* ``sphinx.writers.latex.LaTeXTranslator.collect_footnotes()``
+* ``sphinx.writers.latex.LaTeXTranslator.generate_numfig_format()``
+* ``sphinx.writers.texinfo.TexinfoTranslator._make_visit_admonition()``
+* ``sphinx.writers.text.TextTranslator._make_depart_admonition()``
+* template variables for LaTeX template
+
+ - ``logo``
+ - ``numfig_format``
+ - ``pageautorefname``
+ - ``translatablestrings``
+
+For more details, see :ref:`deprecation APIs list <dev-deprecated-apis>`.
+
+Features added
+--------------
+
+2.0.0b1
+
+* #1618: The search results preview of generated HTML documentation is
+ reader-friendlier: instead of showing the snippets as raw reStructuredText
+ markup, Sphinx now renders the corresponding HTML. This means the Sphinx
+ extension `Sphinx: pretty search results`__ is no longer necessary. Note that
+ changes to the search function of your custom or 3rd-party HTML template might
+ overwrite this improvement.
+
+ __ https://github.com/sphinx-contrib/sphinx-pretty-searchresults
+
+* #4182: autodoc: Support :confval:`suppress_warnings`
+* #5533: autodoc: :confval:`autodoc_default_options` supports ``member-order``
+* #5394: autodoc: Display readable names in type annotations for mocked objects
+* #5459: autodoc: :confval:`autodoc_default_options` accepts ``True`` as a value
+* #1148: autodoc: Add :rst:dir:`autodecorator` directive for decorators
+* #5635: autosummary: Add :confval:`autosummary_mock_imports` to mock external
+ libraries on importing targets
+* #4018: htmlhelp: Add :confval:`htmlhelp_file_suffix` and
+ :confval:`htmlhelp_link_suffix`
+* #5559: text: Support complex tables (colspan and rowspan)
+* LaTeX: support rendering (not in math, yet) of Greek and Cyrillic Unicode
+ letters in non-Cyrillic document even with ``'pdflatex'`` as
+ :confval:`latex_engine` (refs: #5645)
+* #5660: The ``versionadded``, ``versionchanged`` and ``deprecated`` directives
+ are now generated with their own specific CSS classes
+ (``added``, ``changed`` and ``deprecated``, respectively) in addition to the
+ generic ``versionmodified`` class.
+* #5841: apidoc: Add --extensions option to sphinx-apidoc
+* #4981: C++, added an alias directive for inserting lists of declarations,
+ that references existing declarations (e.g., for making a synopsis).
+* C++: add ``cpp:struct`` to complement ``cpp:class``.
+* #1341 the HTML search considers words that contain a search term of length
+ three or longer a match.
+* #4611: epub: Show warning for duplicated ToC entries
+* #1851: Allow to omit an argument for :rst:dir:`code-block` directive. If
+ omitted, it follows :rst:dir:`highlight` or :confval:`highlight_language`
+* #4587: html: Add :confval:`html4_writer` to use old HTML4 writer
+* #6016: HTML search: A placeholder for the search summary prevents search
+ result links from changing their position when the search terminates. This
+ makes navigating search results easier.
+* #5196: linkcheck also checks remote images exist
+* #5924: githubpages: create CNAME file for custom domains when
+ :confval:`html_baseurl` set
+* #4261: autosectionlabel: restrict the labeled sections by new config value;
+ :confval:`autosectionlabel_maxdepth`
+
+
+Bugs fixed
+----------
+
+2.0.0b1
+
+* #1682: LaTeX: writer should not translate Greek unicode, but use textgreek
+ package
+* #5247: LaTeX: PDF does not build with default font config for Russian
+ language and ``'xelatex'`` or ``'lualatex'`` as :confval:`latex_engine`
+ (refs: #5251)
+* #5248: LaTeX: Greek letters in section titles disappear from PDF bookmarks
+* #5249: LaTeX: Unicode Greek letters in math directive break PDF build
+ (fix requires extra set-up, see :confval:`latex_elements` ``'textgreek'`` key
+ and/or :confval:`latex_engine` setting)
+* #5772: LaTeX: should the Bjarne style of fncychap be used for English also
+ if passed as language option?
+* #5179: LaTeX: (lualatex only) escaping of ``>`` by ``\textgreater{}`` is not
+ enough as ``\textgreater{}\textgreater{}`` applies TeX-ligature
+* LaTeX: project name is not escaped if :confval:`latex_documents` omitted
+* LaTeX: authors are not shown if :confval:`latex_documents` omitted
+* HTML: Invalid HTML5 file is generated for a glossary having multiple terms for
+ one description (refs: #4611)
+* QtHelp: OS dependent path separator is used in .qhp file
+* HTML search: search always returns nothing when multiple search terms are
+ used and one term is shorter than three characters
+
+2.0.0b2
+
+* #6096: html: Anchor links are not added to figures
+* #3620: html: Defer searchindex.js rather than loading it via ajax
+* #6113: html: Table cells and list items have large margins
+* #5508: ``linenothreshold`` option for ``highlight`` directive was ignored
+* texinfo: ``make install-info`` causes syntax error
+* texinfo: ``make install-info`` fails on macOS
+* #3079: texinfo: image files are not copied on ``make install-info``
+* #5391: A cross reference in heading is rendered as literal
+* #5946: C++, fix ``cpp:alias`` problems in LaTeX (and singlehtml)
+* #6147: classes attribute of ``citation_reference`` node is lost
+* AssertionError is raised when custom ``citation_reference`` node having
+ classes attribute refers missing citation (refs: #6147)
+* #2155: Support ``code`` directive
+* C++, fix parsing of braced initializers.
+* #6172: AttributeError is raised for old styled index nodes
+* #4872: inheritance_diagram: correctly describe behavior of ``parts`` option in
+ docs, allow negative values.
+* #6178: i18n: Captions missing in translations for hidden TOCs
+
+2.0.0 final
+
+* #6196: py domain: unexpected prefix is generated
+
+Testing
+-------
+
+2.0.0b1
+
+* Stop to use ``SPHINX_TEST_TEMPDIR`` envvar
+
+2.0.0b2
+
+* Add a helper function: ``sphinx.testing.restructuredtext.parse()``
+
+Release 1.8.6 (released Nov 18, 2021)
+=====================================
+
+Dependencies
+------------
+
+* #9807: Restrict docutils to 0.17.x or older
+
+Release 1.8.5 (released Mar 10, 2019)
+=====================================
+
+Bugs fixed
+----------
+
+* LaTeX: Remove extraneous space after author names on PDF title page (refs:
+ #6004)
+* #6026: LaTeX: A cross reference to definition list does not work
+* #6046: LaTeX: ``TypeError`` is raised when invalid latex_elements given
+* #6067: LaTeX: images having a target are concatenated to next line
+* #6067: LaTeX: images having a target are not aligned even if specified
+* #6149: LaTeX: ``:index:`` role in titles causes ``Use of \@icentercr doesn't
+ match its definition`` error on latexpdf build
+* #6019: imgconverter: Including multipage PDF fails
+* #6047: autodoc: ``autofunction`` emits a warning for method objects
+* #6028: graphviz: Ensure the graphviz filenames are reproducible
+* #6068: doctest: ``skipif`` option may remove the code block from documentation
+* #6136: ``:name:`` option for ``math`` directive causes a crash
+* #6139: intersphinx: ValueError on failure reporting
+* #6135: changes: Fix UnboundLocalError when any module found
+* #3859: manpage: code-block captions are not displayed correctly
+
+Release 1.8.4 (released Feb 03, 2019)
+=====================================
+
+Bugs fixed
+----------
+
+* #3707: latex: no bold checkmark (✔) available.
+* #5605: with the documentation language set to Chinese, English words could not
+ be searched.
+* #5889: LaTeX: user ``numfig_format`` is stripped of spaces and may cause
+ build failure
+* C++, fix hyperlinks for declarations involving east cv-qualifiers.
+* #5755: C++, fix duplicate declaration error on function templates with
+ constraints in the return type.
+* C++, parse unary right fold expressions and binary fold expressions.
+* pycode could not handle egg files on windows
+* #5928: KeyError: 'DOCUTILSCONFIG' when running build
+* #5936: LaTeX: PDF build broken by inclusion of image taller than page height
+ in an admonition
+* #5231: "make html" does not read and build "po" files in "locale" dir
+* #5954: ``:scale:`` image option may break PDF build if image in an admonition
+* #5966: mathjax has not been loaded on incremental build
+* #5960: LaTeX: modified PDF layout since September 2018 TeXLive update of
+ :file:`parskip.sty`
+* #5948: LaTeX: duplicated labels are generated for sections
+* #5958: versionadded directive causes crash with Python 3.5.0
+* #5995: autodoc: autodoc_mock_imports conflict with metaclass on Python 3.7
+* #5871: texinfo: a section title ``.`` is not allowed
+
+Release 1.8.3 (released Dec 26, 2018)
+=====================================
+
+Features added
+--------------
+
+* LaTeX: it is possible to insert custom material to appear on back of title
+ page, see discussion of ``'maketitle'`` key of :confval:`latex_elements`
+ (``'manual'`` docclass only)
+
+Bugs fixed
+----------
+
+* #5725: mathjax: Use CDN URL for "latest" version by default
+* #5460: html search does not work with some 3rd party themes
+* #5520: LaTeX, caption package incompatibility since Sphinx 1.6
+* #5614: autodoc: incremental build is broken when builtin modules are imported
+* #5627: qthelp: index.html missing in QtHelp
+* #5659: linkcheck: crashes for a hyperlink containing multibyte character
+* #5754: DOC: Fix some mistakes in :doc:`/latex`
+* #5810: LaTeX: sphinxVerbatim requires explicit "hllines" set-up since 1.6.6
+ (refs: #1238)
+* #5636: C++, fix parsing of floating point literals.
+* #5496 (again): C++, fix assertion in partial builds with duplicates.
+* #5724: quickstart: sphinx-quickstart fails when $LC_ALL is empty
+* #1956: Default conf.py is not PEP8-compliant
+* #5849: LaTeX: document class ``\maketitle`` is overwritten with no
+ possibility to use original meaning in place of Sphinx custom one
+* #5834: apidoc: wrong help for ``--tocfile``
+* #5800: todo: crashed if todo is defined in TextElement
+* #5846: htmlhelp: convert hex escaping to decimal escaping in .hhc/.hhk files
+* htmlhelp: broken .hhk file generated when title contains a double quote
+
+Release 1.8.2 (released Nov 11, 2018)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #5497: Do not include MathJax.js and jsmath.js unless it is really needed
+
+Features added
+--------------
+
+* #5471: Show appropriate deprecation warnings
+
+Bugs fixed
+----------
+
+* #5490: latex: enumerated list causes a crash with recommonmark
+* #5492: sphinx-build fails to build docs w/ Python < 3.5.2
+* #3704: latex: wrong ``\label`` positioning for figures with a legend
+* #5496: C++, fix assertion when a symbol is declared more than twice.
+* #5493: gettext: crashed with broken template
+* #5495: csv-table directive with file option in included file is broken (refs:
+ #4821)
+* #5498: autodoc: unable to find type hints for a ``functools.partial``
+* #5480: autodoc: unable to find type hints for unresolvable Forward references
+* #5419: incompatible math_block node has been generated
+* #5548: Fix ensuredir() in case of pre-existing file
+* #5549: graphviz Correctly deal with non-existing static dir
+* #3002: i18n: multiple footnote_references referring same footnote cause
+ duplicated node_ids
+* #5563: latex: footnote_references generated by extension causes a LaTeX
+ builder crash
+* #5561: make all-pdf fails with old xindy version
+* #5557: quickstart: --no-batchfile isn't honored
+* #3080: texinfo: multiline rubrics are broken
+* #3080: texinfo: multiline citations are broken
+
+Release 1.8.1 (released Sep 22, 2018)
+=====================================
+
+Incompatible changes
+--------------------
+
+* LaTeX ``\pagestyle`` commands have been moved to the LaTeX template. No
+ changes in PDF, except possibly if ``\sphinxtableofcontents``, which
+ contained them, had been customized in :file:`conf.py`. (refs: #5455)
+
+Bugs fixed
+----------
+
+* #5418: Incorrect default path for sphinx-build -d/doctrees files
+* #5421: autodoc emits deprecation warning for :confval:`autodoc_default_flags`
+* #5422: lambda object causes PicklingError on storing environment
+* #5417: Sphinx fails to build with syntax error in Python 2.7.5
+* #4911: add latexpdf to make.bat for non make-mode
+* #5436: Autodoc does not work with enum subclasses with properties/methods
+* #5437: autodoc: crashed on modules importing eggs
+* #5433: latex: ImportError: cannot import name 'DEFAULT_SETTINGS'
+* #5431: autodoc: ``autofunction`` emits a warning for callable objects
+* #5457: Fix TypeError in error message when override is prohibited
+* #5453: PDF builds of 'howto' documents have no page numbers
+* #5463: mathbase: math_role and MathDirective was disappeared in 1.8.0
+* #5454: latex: Index has disappeared from PDF for Japanese documents
+* #5432: py domain: ``:type:`` field can't process ``:term:`` references
+* #5426: py domain: TypeError has been raised for class attribute
+
+Release 1.8.0 (released Sep 13, 2018)
+=====================================
+
+Dependencies
+------------
+
+1.8.0b1
+
+* LaTeX: :confval:`latex_use_xindy`, if ``True`` (default for
+ ``xelatex/lualatex``), instructs ``make latexpdf`` to use :program:`xindy`
+ for general index. Make sure your LaTeX distribution includes it.
+ (refs: #5134)
+* LaTeX: ``latexmk`` is required for ``make latexpdf`` on Windows
+
+Incompatible changes
+--------------------
+
+1.8.0b2
+
+* #5282: html theme: refer ``pygments_style`` settings of HTML themes
+ preferentially
+* The URL of download files are changed
+* #5127: quickstart: ``Makefile`` and ``make.bat`` are not overwritten if exists
+
+1.8.0b1
+
+* #5156: the :py:mod:`sphinx.ext.graphviz` extension runs ``dot`` in the
+ directory of the document being built instead of in the root directory of
+ the documentation.
+* #4460: extensions which stores any data to environment should return the
+ version of its env data structure as metadata. In detail, please see
+ :ref:`ext-metadata`.
+* Sphinx expects source parser modules to have supported file formats as
+ ``Parser.supported`` attribute
+* The default value of :confval:`epub_author` and :confval:`epub_publisher` are
+ changed from ``'unknown'`` to the value of :confval:`author`. This is same as
+ a ``conf.py`` file sphinx-build generates.
+* The ``gettext_compact`` attribute is removed from ``document.settings``
+ object. Please use ``config.gettext_compact`` instead.
+* The processing order on reading phase is changed. smart_quotes, sphinx
+ domains, :event:`doctree-read` event and versioning doctrees are invoked
+ earlier than so far. For more details, please read a description of
+ :py:meth:`.Sphinx.add_transform()`
+* #4827: All ``substitution_definition`` nodes are removed from doctree on
+ reading phase
+* ``docutils.conf`` in ``$HOME`` or ``/etc`` directories are ignored. Only
+ ``docutils.conf`` from confdir is obeyed.
+* #789: ``:samp:`` role supports to escape curly braces with backslash
+* #4811: The files under :confval:`html_static_path` are excluded from source
+ files.
+* latex: Use ``\sphinxcite`` for citation references instead ``\hyperref``
+* The config value :confval:`!viewcode_import` is renamed to
+ :confval:`viewcode_follow_imported_members` (refs: #4035)
+* #1857: latex: :confval:`latex_show_pagerefs` does not add pagerefs for
+ citations
+* #4648: latex: Now "rubric" elements are rendered as unnumbered section title
+* #4983: html: The anchor for productionlist tokens has been changed
+* Modifying a template variable ``script_files`` in templates is allowed now.
+ Please use ``app.add_js_file()`` instead.
+* #5072: Save environment object also with only new documents
+* #5035: qthelp builder allows dashes in :confval:`qthelp_namespace`
+* LaTeX: with lualatex or xelatex use by default :program:`xindy` as
+ UTF-8 able replacement of :program:`makeindex` (refs: #5134). After
+ upgrading Sphinx, please clean latex build repertory of existing project
+ before new build.
+* #5163: html: hlist items are now aligned to top
+* ``highlightlang`` directive is processed on resolving phase
+* #4000: LaTeX: template changed. Following elements moved to it:
+
+ - ``\begin{document}``
+ - ``shorthandoff`` variable
+ - ``maketitle`` variable
+ - ``tableofcontents`` variable
+
+Deprecated
+----------
+
+1.8.0b2
+
+* ``sphinx.io.SphinxI18nReader.set_lineno_for_reporter()`` is deprecated
+* ``sphinx.io.SphinxI18nReader.line`` is deprecated
+* ``sphinx.util.i18n.find_catalog_source_file()`` has changed; the
+ *gettext_compact* argument has been deprecated
+* #5403: ``sphinx.util.images.guess_mimetype()`` has changed; the *content*
+ argument has been deprecated
+
+1.8.0b1
+
+* :confval:`source_parsers` is deprecated
+* :confval:`autodoc_default_flags` is deprecated
+* quickstart: ``--epub`` option becomes default, so it is deprecated
+* Drop function based directive support. For now, Sphinx only supports class
+ based directives (see :class:`~docutils.parsers.rst.Directive`)
+* ``sphinx.util.docutils.directive_helper()`` is deprecated
+* ``sphinx.cmdline`` is deprecated
+* ``sphinx.make_mode`` is deprecated
+* ``sphinx.locale.l_()`` is deprecated
+* #2157: helper function ``warn()`` for HTML themes is deprecated
+* ``app.override_domain()`` is deprecated
+* ``app.add_stylesheet()`` is deprecated
+* ``app.add_javascript()`` is deprecated
+* ``app.import_object()`` is deprecated
+* ``app.add_source_parser()`` has changed; the *suffix* argument has been
+ deprecated
+* ``sphinx.versioning.prepare()`` is deprecated
+* ``Config.__init__()`` has changed; the *dirname*, *filename* and *tags*
+ argument has been deprecated
+* ``Config.check_types()`` is deprecated
+* ``Config.check_unicode()`` is deprecated
+* ``sphinx.application.CONFIG_FILENAME`` is deprecated
+* ``highlightlang`` directive is deprecated
+* ``BuildEnvironment.load()`` is deprecated
+* ``BuildEnvironment.loads()`` is deprecated
+* ``BuildEnvironment.frompickle()`` is deprecated
+* ``env.read_doc()`` is deprecated
+* ``env.update()`` is deprecated
+* ``env._read_serial()`` is deprecated
+* ``env._read_parallel()`` is deprecated
+* ``env.write_doctree()`` is deprecated
+* ``env._nitpick_ignore`` is deprecated
+* ``env.versionchanges`` is deprecated
+* ``env.dump()`` is deprecated
+* ``env.dumps()`` is deprecated
+* ``env.topickle()`` is deprecated
+* ``env.note_versionchange()`` is deprecated
+* ``sphinx.writers.latex.Table.caption_footnotetexts`` is deprecated
+* ``sphinx.writers.latex.Table.header_footnotetexts`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.footnotestack`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.in_container_literal_block`` is
+ deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.next_section_ids`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.next_hyperlink_ids`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.restrict_footnote()`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.unrestrict_footnote()`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.push_hyperlink_ids()`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.pop_hyperlink_ids()`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.check_latex_elements()`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.bibitems`` is deprecated
+* ``sphinx.writers.latex.LaTeXTranslator.hlsettingstack`` is deprecated
+* ``sphinx.writers.latex.ExtBabel.get_shorthandoff()`` is deprecated
+* ``sphinx.writers.html.HTMLTranslator.highlightlang`` is deprecated
+* ``sphinx.writers.html.HTMLTranslator.highlightlang_base`` is deprecated
+* ``sphinx.writers.html.HTMLTranslator.highlightlangopts`` is deprecated
+* ``sphinx.writers.html.HTMLTranslator.highlightlinenothreshold`` is deprecated
+* ``sphinx.writers.html5.HTMLTranslator.highlightlang`` is deprecated
+* ``sphinx.writers.html5.HTMLTranslator.highlightlang_base`` is deprecated
+* ``sphinx.writers.html5.HTMLTranslator.highlightlangopts`` is deprecated
+* ``sphinx.writers.html5.HTMLTranslator.highlightlinenothreshold`` is deprecated
+* ``sphinx.ext.mathbase`` extension is deprecated
+* ``sphinx.ext.mathbase.math`` node is deprecated
+* ``sphinx.ext.mathbase.displaymath`` node is deprecated
+* ``sphinx.ext.mathbase.eqref`` node is deprecated
+* ``sphinx.ext.mathbase.is_in_section_title()`` is deprecated
+* ``sphinx.ext.mathbase.MathDomain`` is deprecated
+* ``sphinx.ext.mathbase.MathDirective`` is deprecated
+* ``sphinx.ext.mathbase.math_role`` is deprecated
+* ``sphinx.ext.mathbase.setup_math()`` is deprecated
+* ``sphinx.directives.other.VersionChanges`` is deprecated
+* ``sphinx.highlighting.PygmentsBridge.unhighlight()`` is deprecated
+* ``sphinx.ext.mathbase.get_node_equation_number()`` is deprecated
+* ``sphinx.ext.mathbase.wrap_displaymath()`` is deprecated
+* The ``trim_doctest_flags`` argument of ``sphinx.highlighting.PygmentsBridge``
+ is deprecated
+
+For more details, see :ref:`deprecation APIs list <dev-deprecated-apis>`.
+
+Features added
+--------------
+
+1.8.0b2
+
+* #5388: Ensure frozen object descriptions are reproducible
+* #5362: apidoc: Add ``--tocfile`` option to change the filename of ToC
+
+1.8.0b1
+
+* Add :event:`config-inited` event
+* Add ``sphinx.config.Any`` to represent the config value accepts any type of
+ value
+* :confval:`source_suffix` allows a mapping fileext to file types
+* Add :confval:`author` as a configuration value
+* #2852: imgconverter: Support to convert GIF to PNG
+* ``sphinx-build`` command supports i18n console output
+* Add ``app.add_message_catalog()`` and ``sphinx.locale.get_translations()`` to
+ support translation for 3rd party extensions
+* helper function ``warning()`` for HTML themes is added
+* Add ``Domain.enumerable_nodes`` to manage own enumerable nodes for domains
+ (experimental)
+* Add a new keyword argument ``override`` to Application APIs
+* LaTeX: new key ``'fvset'`` for :confval:`latex_elements`. For
+ XeLaTeX/LuaLaTeX its default sets ``fanvyvrb`` to use normal, not small,
+ fontsize in code-blocks (refs: #4793)
+* Add :confval:`html_css_files` and :confval:`epub_css_files` for adding CSS
+ files from configuration
+* Add :confval:`html_js_files` for adding JS files from configuration
+* #4834: Ensure set object descriptions are reproducible.
+* #4828: Allow to override :confval:`numfig_format` partially. Full definition
+ is not needed.
+* Improve warning messages during including (refs: #4818)
+* LaTeX: separate customizability of :rst:role:`guilabel` and
+ :rst:role:`menuselection` (refs: #4830)
+* Add ``Config.read()`` classmethod to create a new config object from
+ configuration file
+* #4866: Wrap graphviz diagrams in ``<div>`` tag
+* viewcode: Add :event:`viewcode-find-source` and
+ :event:`viewcode-follow-imported` to load source code without loading
+* #4785: napoleon: Add strings to translation file for localisation
+* #4927: Display a warning when invalid values are passed to linenothreshold
+ option of highlight directive
+* C++:
+
+ - Add a ``cpp:texpr`` role as a sibling to ``cpp:expr``.
+ - Add support for unions.
+ - #3593, #2683: add support for anonymous entities using names staring with
+ ``@``.
+ - #5147: add support for (most) character literals.
+ - Cross-referencing entities inside primary templates is supported,
+ and now properly documented.
+ - #1552: add new cross-referencing format for ``cpp:any`` and ``cpp:func``
+ roles, for referencing specific function overloads.
+
+* #3606: MathJax should be loaded with async attribute
+* html: Output ``canonical_url`` metadata if :confval:`html_baseurl` set (refs:
+ #4193)
+* #5029: autosummary: expose ``inherited_members`` to template
+* #3784: mathjax: Add :confval:`mathjax_options` to give options to script tag
+ for mathjax
+* #726, #969: mathjax: Add :confval:`mathjax_config` to give in-line
+ configurations for mathjax
+* #4362: latex: Don't overwrite .tex file if document not changed
+* #1431: latex: Add alphanumeric enumerated list support
+* Add :confval:`latex_use_xindy` for UTF-8 savvy indexing, defaults to ``True``
+ if :confval:`latex_engine` is ``'xelatex'`` or ``'lualatex'``. (refs: #5134,
+ #5192, #5212)
+* #4976: ``SphinxLoggerAdapter.info()`` now supports ``location`` parameter
+* #5122: setuptools: support nitpicky option
+* #2820: autoclass directive supports nested class
+* Add ``app.add_html_math_renderer()`` to register a math renderer for HTML
+* Apply :confval:`trim_doctest_flags` to all builders (cf. text, manpages)
+* #5140: linkcheck: Add better Accept header to HTTP client
+* #4614: sphinx-build: Add ``--keep-going`` option to show all warnings
+* Add :rst:role:`math:numref` role to refer equations (Same as :rst:role:`eq`)
+* quickstart: epub builder is enabled by default
+* #5246: Add :confval:`singlehtml_sidebars` to configure sidebars for singlehtml
+ builder
+* #5273: doctest: Skip doctest conditionally
+* #5306: autodoc: emit a warning for invalid typehints
+* #4075, #5215: autodoc: Add :confval:`autodoc_default_options` which accepts
+ option values as dict
+
+Bugs fixed
+----------
+
+1.8.0b2
+
+* html: search box overrides to other elements if scrolled
+* i18n: warnings for translation catalogs have wrong line numbers (refs: #5321)
+* #5325: latex: cross references has been broken by multiply labeled objects
+* C++, fixes for symbol addition and lookup. Lookup should no longer break
+ in partial builds. See also #5337.
+* #5348: download reference to remote file is not displayed
+* #5282: html theme: ``pygments_style`` of theme was overridden by ``conf.py``
+ by default
+* #4379: toctree shows confusing warning when document is excluded
+* #2401: autodoc: ``:members:`` causes ``:special-members:`` not to be shown
+* autodoc: ImportError is replaced by AttributeError for deeper module
+* #2720, #4034: Incorrect links with ``:download:``, duplicate names, and
+ parallel builds
+* #5290: autodoc: failed to analyze source code in egg package
+* #5399: Sphinx crashes if unknown po file exists
+
+1.8.0b1
+
+* i18n: message catalogs were reset on each initialization
+* #4850: latex: footnote inside footnote was not rendered
+* #4945: i18n: fix lang_COUNTRY not fallback correctly for IndexBuilder. Thanks
+ to Shengjing Zhu.
+* #4983: productionlist directive generates invalid IDs for the tokens
+* #5132: lualatex: PDF build fails if indexed word starts with Unicode character
+* #5133: latex: index headings "Symbols" and "Numbers" not internationalized
+* #5114: sphinx-build: Handle errors on scanning documents
+* epub: spine has been broken when "self" is listed on toctree (refs: #4611)
+* #344: autosummary does not understand docstring of module level attributes
+* #5191: C++, prevent nested declarations in functions to avoid lookup problems.
+* #5126: C++, add missing isPack method for certain template parameter types.
+* #5187: C++, parse attributes on declarators as well.
+* C++, parse delete expressions and basic new expressions as well.
+* #5002: graphviz: SVGs do not adapt to the column width
+
+Features removed
+----------------
+
+1.8.0b1
+
+* ``sphinx.ext.pngmath`` extension
+
+Documentation
+-------------
+
+1.8.0b1
+
+* #5083: Fix wrong make.bat option for internationalization.
+* #5115: napoleon: add admonitions added by #4613 to the docs.
+
+Release 1.7.9 (released Sep 05, 2018)
+=====================================
+
+Features added
+--------------
+
+* #5359: Make generated texinfo files reproducible by sorting the anchors
+
+Bugs fixed
+----------
+
+* #5361: crashed on incremental build if document uses include directive
+
+Release 1.7.8 (released Aug 29, 2018)
+=====================================
+
+Incompatible changes
+--------------------
+
+* The type of ``env.included`` has been changed to dict of set
+
+Bugs fixed
+----------
+
+* #5320: intersphinx: crashed if invalid url given
+* #5326: manpage: crashed when invalid docname is specified as ``man_pages``
+* #5322: autodoc: ``Any`` typehint causes formatting error
+* #5327: "document isn't included in any toctree" warning on rebuild with
+ generated files
+* #5335: quickstart: escape sequence has been displayed with MacPorts' python
+
+Release 1.7.7 (released Aug 19, 2018)
+=====================================
+
+Bugs fixed
+----------
+
+* #5198: document not in toctree warning when including files only for parallel
+ builds
+* LaTeX: reduce "Token not allowed in a PDF string" hyperref warnings in latex
+ console output (refs: #5236)
+* LaTeX: suppress "remreset Warning: The remreset package is obsolete" in latex
+ console output with recent LaTeX (refs: #5237)
+* #5234: PDF output: usage of PAPER environment variable is broken since Sphinx
+ 1.5
+* LaTeX: fix the :confval:`latex_engine` documentation regarding Latin Modern
+ font with XeLaTeX/LuaLateX (refs: #5251)
+* #5280: autodoc: Fix wrong type annotations for complex typing
+* autodoc: Optional types are wrongly rendered
+* #5291: autodoc crashed by ForwardRef types
+* #5211: autodoc: No docs generated for functools.partial functions
+* #5306: autodoc: ``getargspec()`` raises NameError for invalid typehints
+* #5298: imgmath: math_number_all causes equations to have two numbers in html
+* #5294: sphinx-quickstart blank prompts in PowerShell
+
+Release 1.7.6 (released Jul 17, 2018)
+=====================================
+
+Bugs fixed
+----------
+
+* #5037: LaTeX ``\sphinxupquote{}`` breaks in Russian
+* sphinx.testing uses deprecated pytest API; ``Node.get_marker(name)``
+* #5016: crashed when recommonmark.AutoStrictify is enabled
+* #5022: latex: crashed with docutils package provided by Debian/Ubuntu
+* #5009: latex: a label for table is vanished if table does not have a caption
+* #5048: crashed with numbered toctree
+* #2410: C, render empty argument lists for macros.
+* C++, fix lookup of full template specializations with no template arguments.
+* #4667: C++, fix assertion on missing references in global scope when using
+ intersphinx. Thanks to Alan M. Carroll.
+* #5019: autodoc: crashed by Form Feed Character
+* #5032: autodoc: loses the first staticmethod parameter for old styled classes
+* #5036: quickstart: Typing Ctrl-U clears the whole of line
+* #5066: html: "relations" sidebar is not shown by default
+* #5091: latex: curly braces in index entries are not handled correctly
+* #5070: epub: Wrong internal href fragment links
+* #5104: apidoc: Interface of ``sphinx.apidoc:main()`` has changed
+* #4272: PDF builds of French projects have issues with XeTeX
+* #5076: napoleon raises RuntimeError with python 3.7
+* #5125: sphinx-build: Interface of ``sphinx:main()`` has changed
+* sphinx-build: ``sphinx.cmd.build.main()`` refers ``sys.argv`` instead of given
+ argument
+* #5146: autosummary: warning is emitted when the first line of docstring ends
+ with literal notation
+* autosummary: warnings of autosummary indicates wrong location (refs: #5146)
+* #5143: autodoc: crashed on inspecting dict like object which does not support
+ sorting
+* #5139: autodoc: Enum argument missing if it shares value with another
+* #4946: py domain: rtype field could not handle "None" as a type
+* #5176: LaTeX: indexing of terms containing ``@``, ``!``, or ``"`` fails
+* #5161: html: crashes if copying static files are failed
+* #5167: autodoc: Fix formatting type annotations for tuples with more than two
+ arguments
+* #3329: i18n: crashed by auto-symbol footnote references
+* #5158: autosummary: module summary has been broken when it starts with heading
+
+Release 1.7.5 (released May 29, 2018)
+=====================================
+
+Bugs fixed
+----------
+
+* #4924: html search: Upper characters problem in any other languages
+* #4932: apidoc: some subpackage is ignored if sibling subpackage contains a
+ module starting with underscore
+* #4863, #4938, #4939: i18n doesn't handle correctly node.title as used for
+ contents, topic, admonition, table and section.
+* #4913: i18n: literal blocks in bullet list are not translated
+* #4962: C++, raised TypeError on duplicate declaration.
+* #4825: C++, properly parse expr roles and give better error messages when
+ (escaped) line breaks are present.
+* C++, properly use ``desc_addname`` nodes for prefixes of names.
+* C++, parse pack expansions in function calls.
+* #4915, #4916: links on search page are broken when using dirhtml builder
+* #4969: autodoc: constructor method should not have return annotation
+* latex: deeply nested enumerated list which is beginning with non-1 causes
+ LaTeX engine crashed
+* #4978: latex: shorthandoff is not set up for Brazil locale
+* #4928: i18n: Ignore dot-directories like .git/ in LC_MESSAGES/
+* #4946: py domain: type field could not handle "None" as a type
+* #4979: latex: Incorrect escaping of curly braces in index entries
+* #4956: autodoc: Failed to extract document from a subclass of the class on
+ mocked module
+* #4973: latex: glossary directive adds whitespace to each item
+* #4980: latex: Explicit labels on code blocks are duplicated
+* #4919: node.asdom() crashes if toctree has :numbered: option
+* #4914: autodoc: Parsing error when using dataclasses without default values
+* #4931: autodoc: crashed when handler for autodoc-skip-member raises an error
+* #4931: autodoc: crashed when subclass of mocked class are processed by
+ napoleon module
+* #5007: sphinx-build crashes when error log contains a "%" character
+
+Release 1.7.4 (released Apr 25, 2018)
+=====================================
+
+Bugs fixed
+----------
+
+* #4885, #4887: domains: Crashed with duplicated objects
+* #4889: latex: sphinx.writers.latex causes recursive import
+
+Release 1.7.3 (released Apr 23, 2018)
+=====================================
+
+Bugs fixed
+----------
+
+* #4769: autodoc loses the first staticmethod parameter
+* #4790: autosummary: too wide two column tables in PDF builds
+* #4795: Latex customization via ``_templates/longtable.tex_t`` is broken
+* #4789: imgconverter: confused by convert.exe of Windows
+* #4783: On windows, Sphinx crashed when drives of srcdir and outdir are
+ different
+* #4812: autodoc ignores type annotated variables
+* #4817: wrong URLs on warning messages
+* #4784: latex: :confval:`latex_show_urls` assigns incorrect footnote numbers if
+ hyperlinks exists inside substitutions
+* #4837: latex with class memoir Error: Font command ``\sf`` is not supported
+* #4803: latex: too slow in proportion to number of auto numbered footnotes
+* #4838: htmlhelp: The entries in .hhp file is not ordered
+* toctree directive tries to glob for URL having query_string
+* #4871: html search: Upper characters problem in German
+* #4717: latex: Compilation for German docs failed with LuaLaTeX and XeLaTeX
+* #4459: duplicated labels detector does not work well in parallel build
+* #4878: Crashed with extension which returns invalid metadata
+
+Release 1.7.2 (released Mar 21, 2018)
+=====================================
+
+Incompatible changes
+--------------------
+* #4520: apidoc: folders with an empty __init__.py are no longer excluded from
+ TOC
+
+Bugs fixed
+----------
+
+* #4669: sphinx.build_main and sphinx.make_main throw NameError
+* #4685: autosummary emits meaningless warnings
+* autodoc: crashed when invalid options given
+* pydomain: always strip parenthesis if empty (refs: #1042)
+* #4689: autosummary: unexpectedly strips docstrings containing "i.e."
+* #4701: viewcode: Misplaced ``<div>`` in viewcode html output
+* #4444: Don't require numfig to use :numref: on sections
+* #4727: Option clash for package textcomp
+* #4725: Sphinx does not work with python 3.5.0 and 3.5.1
+* #4716: Generation PDF file with TexLive on Windows, file not found error
+* #4574: vertical space before equation in latex
+* #4720: message when an image is mismatched for builder is not clear
+* #4655, #4684: Incomplete localization strings in Polish and Chinese
+* #2286: Sphinx crashes when error is happens in rendering HTML pages
+* #4688: Error to download remote images having long URL
+* #4754: sphinx/pycode/__init__.py raises AttributeError
+* #1435: qthelp builder should htmlescape keywords
+* epub: Fix docTitle elements of toc.ncx is not escaped
+* #4520: apidoc: Subpackage not in toc (introduced in 1.6.6) now fixed
+* #4767: html: search highlighting breaks mathjax equations
+
+Release 1.7.1 (released Feb 23, 2018)
+=====================================
+
+Deprecated
+----------
+
+* #4623: ``sphinx.build_main()`` is deprecated.
+* autosummary: The interface of ``sphinx.ext.autosummary.get_documenter()`` has
+ been changed (Since 1.7.0)
+* #4664: ``sphinx.ext.intersphinx.debug()`` is deprecated.
+
+For more details, see :ref:`deprecation APIs list <dev-deprecated-apis>`.
+
+Bugs fixed
+----------
+
+* #4608: epub: Invalid meta tag is generated
+* #4260: autodoc: keyword only argument separator is not disappeared if it is
+ appeared at top of the argument list
+* #4622: epub: :confval:`epub_scheme` does not effect to content.opf
+* #4627: graphviz: Fit graphviz images to page
+* #4617: quickstart: PROJECT_DIR argument is required
+* #4623: sphinx.build_main no longer exists in 1.7.0
+* #4615: The argument of ``sphinx.build`` has been changed in 1.7.0
+* autosummary: The interface of ``sphinx.ext.autosummary.get_documenter()`` has
+ been changed
+* #4630: Have order on msgids in sphinx.pot deterministic
+* #4563: autosummary: Incorrect end of line punctuation detection
+* #4577: Enumerated sublists with explicit start with wrong number
+* #4641: A external link in TOC cannot contain "?" with ``:glob:`` option
+* C++, add missing parsing of explicit casts and typeid in expression parsing.
+* C++, add missing parsing of ``this`` in expression parsing.
+* #4655: Fix incomplete localization strings in Polish
+* #4653: Fix error reporting for parameterless ImportErrors
+* #4664: Reading objects.inv fails again
+* #4662: ``any`` refs with ``term`` targets crash when an ambiguity is
+ encountered
+
+Release 1.7.0 (released Feb 12, 2018)
+=====================================
+
+Dependencies
+------------
+
+1.7.0b1
+
+* Add ``packaging`` package
+
+Incompatible changes
+--------------------
+
+1.7.0b1
+
+* #3668: The arguments has changed of main functions for each command
+* #3893: Unknown html_theme_options throw warnings instead of errors
+* #3927: Python parameter/variable types should match classes, not all objects
+* #3962: sphinx-apidoc now recognizes given directory as an implicit namespace
+ package when ``--implicit-namespaces`` option given, not subdirectories of
+ given directory.
+* #3929: apidoc: Move sphinx.apidoc to sphinx.ext.apidoc
+* #4226: apidoc: Generate new style makefile (make-mode)
+* #4274: sphinx-build returns 2 as an exit code on argument error
+* #4389: output directory will be created after loading extensions
+* autodoc does not generate warnings messages to the generated document even if
+ :confval:`keep_warnings` is True. They are only emitted to stderr.
+* shebang line is removed from generated conf.py
+* #2557: autodoc: :confval:`autodoc_mock_imports` only mocks specified modules
+ with their descendants. It does not mock their ancestors. If you want to
+ mock them, please specify the name of ancestors explicitly.
+* #3620: html theme: move DOCUMENTATION_OPTIONS to independent JavaScript file
+ (refs: #4295)
+* #4246: Limit width of text body for all themes. Configurable via theme
+ options ``body_min_width`` and ``body_max_width``.
+* #4771: apidoc: The ``exclude_patterns`` arguments are ignored if they are
+ placed just after command line options
+
+1.7.0b2
+
+* #4467: html theme: Rename ``csss`` block to ``css``
+
+Deprecated
+----------
+
+1.7.0b1
+
+* using a string value for :confval:`html_sidebars` is deprecated and only list
+ values will be accepted at 2.0.
+* ``format_annotation()`` and ``formatargspec()`` is deprecated. Please use
+ ``sphinx.util.inspect.Signature`` instead.
+* ``sphinx.ext.autodoc.AutodocReporter`` is replaced by ``sphinx.util.docutils.
+ switch_source_input()`` and now deprecated. It will be removed in Sphinx 2.0.
+* ``sphinx.ext.autodoc.add_documenter()`` and ``AutoDirective._register`` is now
+ deprecated. Please use ``app.add_autodocumenter()`` instead.
+* ``AutoDirective._special_attrgetters`` is now deprecated. Please use
+ ``app.add_autodoc_attrgetter()`` instead.
+
+Features added
+--------------
+
+1.7.0b1
+
+* C++, handle ``decltype(auto)``.
+* #2406: C++, add proper parsing of expressions, including linking of
+ identifiers.
+* C++, add a ``cpp:expr`` role for inserting inline C++ expressions or types.
+* C++, support explicit member instantiations with shorthand ``template`` prefix
+* C++, make function parameters linkable, like template params.
+* #3638: Allow to change a label of reference to equation using
+ ``math_eqref_format``
+* Now :confval:`suppress_warnings` accepts following configurations:
+
+ - ``ref.python`` (ref: #3866)
+
+* #3872: Add latex key to configure literal blocks caption position in PDF
+ output (refs #3792, #1723)
+* In case of missing docstring try to retrieve doc from base classes (ref:
+ #3140)
+* #4023: Clarify error message when any role has more than one target.
+* #3973: epub: allow to override build date
+* #3972: epub: Sort manifest entries by filename
+* #4052: viewcode: Sort before highlighting module code
+* #1448: qthelp: Add new config value; :confval:`qthelp_namespace`
+* #4140: html themes: Make body tag inheritable
+* #4168: improve zh search with jieba
+* HTML themes can set up default sidebars through ``theme.conf``
+* #3160: html: Use ``<kdb>`` to represent ``:kbd:`` role
+* #4212: autosummary: catch all exceptions when importing modules
+* #4166: Add :confval:`math_numfig` for equation numbering by section (refs:
+ #3991, #4080). Thanks to Oliver Jahn.
+* #4311: Let LaTeX obey :confval:`numfig_secnum_depth` for figures, tables, and
+ code-blocks
+* #947: autodoc now supports ignore-module-all to ignore a module's ``__all__``
+* #4332: Let LaTeX obey :confval:`math_numfig` for equation numbering
+* #4093: sphinx-build creates empty directories for unknown targets/builders
+* Add ``top-classes`` option for the ``sphinx.ext.inheritance_diagram``
+ extension to limit the scope of inheritance graphs.
+* #4183: doctest: ``:pyversion:`` option also follows PEP-440 specification
+* #4235: html: Add :confval:`manpages_url` to make manpage roles to hyperlinks
+* #3570: autodoc: Do not display 'typing.' module for type hints
+* #4354: sphinx-build now emits finish message. Builders can modify it through
+ ``Builder.epilog`` attribute
+* #4245: html themes: Add ``language`` to javascript vars list
+* #4079: html: Add ``notranslate`` class to each code-blocks, literals and maths
+ to let Google Translate know they are not translatable
+* #4137: doctest: doctest block is always highlighted as python console (pycon)
+* #4137: doctest: testcode block is always highlighted as python
+* #3998: text: Assign section numbers by default. You can control it using
+ :confval:`text_add_secnumbers` and :confval:`text_secnumber_suffix`
+
+1.7.0b2
+
+* #4271: sphinx-build supports an option called ``-j auto`` to adjust numbers of
+ processes automatically.
+* Napoleon: added option to specify custom section tags.
+
+
+Features removed
+----------------
+
+1.7.0b1
+
+* Configuration variables
+
+ - :confval:`!html_use_smartypants`
+ - :confval:`!latex_keep_old_macro_names`
+ - latex_elements['footer']
+
+* utility methods of ``sphinx.application.Sphinx`` class
+
+ - buildername (property)
+ - _display_chunk()
+ - old_status_iterator()
+ - status_iterator()
+ - _directive_helper()
+
+* utility methods of ``sphinx.environment.BuildEnvironment`` class
+
+ - currmodule (property)
+ - currclass (property)
+
+* epub2 builder
+* prefix and colorfunc parameter for warn()
+* ``sphinx.util.compat`` module
+* ``sphinx.util.nodes.process_only_nodes()``
+* LaTeX environment ``notice``, use ``sphinxadmonition`` instead
+* LaTeX ``\sphinxstylethead``, use ``\sphinxstyletheadfamily``
+* C++, support of function concepts. Thanks to mickk-on-cpp.
+* Not used and previously not documented LaTeX macros ``\shortversion``
+ and ``\setshortversion``
+
+
+Bugs fixed
+----------
+
+1.7.0b1
+
+* #3882: Update the order of files for HTMLHelp and QTHelp
+* #3962: sphinx-apidoc does not recognize implicit namespace packages correctly
+* #4094: C++, allow empty template argument lists.
+* C++, also hyperlink types in the name of declarations with qualified names.
+* C++, do not add index entries for declarations inside concepts.
+* C++, support the template disambiguator for dependent names.
+* #4314: For PDF 'howto' documents, numbering of code-blocks differs from the
+ one of figures and tables
+* #4330: PDF 'howto' documents have an incoherent default LaTeX tocdepth counter
+ setting
+* #4198: autosummary emits multiple 'autodoc-process-docstring' event. Thanks
+ to Joel Nothman.
+* #4081: Warnings and errors colored the same when building
+* latex: Do not display 'Release' label if :confval:`release` is not set
+
+1.7.0b2
+
+* #4415: autodoc classifies inherited classmethods as regular methods
+* #4415: autodoc classifies inherited staticmethods as regular methods
+* #4472: DOCUMENTATION_OPTIONS is not defined
+* #4491: autodoc: prefer _MockImporter over other importers in sys.meta_path
+* #4490: autodoc: type annotation is broken with python 3.7.0a4+
+* utils package is no longer installed
+* #3952: apidoc: module header is too escaped
+* #4275: Formats accepted by sphinx.util.i18n.format_date are limited
+* #4493: recommonmark raises AttributeError if AutoStructify enabled
+* #4209: intersphinx: In link title, "v" should be optional if target has no
+ version
+* #4230: slowdown in writing pages with sphinx 1.6
+* #4522: epub: document is not rebuilt even if config changed
+
+1.7.0b3
+
+* #4019: inheritance_diagram AttributeError stopping make process
+* #4531: autosummary: methods are not treated as attributes
+* #4538: autodoc: ``sphinx.ext.autodoc.Options`` has been moved
+* #4539: autodoc emits warnings for partialmethods
+* #4223: doctest: failing tests reported in wrong file, at wrong line
+* i18n: message catalogs are not compiled if specific filenames are given for
+ ``sphinx-build`` as arguments (refs: #4560)
+* #4027: sphinx.ext.autosectionlabel now expects labels to be the same as they
+ are in the raw source; no smart quotes, nothig fancy.
+* #4581: apidoc: Excluded modules still included
+
+
+Testing
+-------
+
+1.7.0b1
+
+* Add support for docutils 0.14
+* Add tests for the ``sphinx.ext.inheritance_diagram`` extension.
+
+Release 1.6.7 (released Feb 04, 2018)
+=====================================
+
+Bugs fixed
+----------
+
+* #1922: html search: Upper characters problem in French
+* #4412: Updated jQuery version from 3.1.0 to 3.2.1
+* #4438: math: math with labels with whitespace cause html error
+* #2437: make full reference for classes, aliased with "alias of"
+* #4434: pure numbers as link targets produce warning
+* #4477: Build fails after building specific files
+* #4449: apidoc: include "empty" packages that contain modules
+* #3917: citation labels are transformed to ellipsis
+* #4501: graphviz: epub3 validation error caused if graph is not clickable
+* #4514: graphviz: workaround for wrong map ID which graphviz generates
+* #4525: autosectionlabel does not support parallel build
+* #3953: Do not raise warning when there is a working intersphinx inventory
+* #4487: math: ValueError is raised on parallel build. Thanks to jschueller.
+* #2372: autosummary: invalid signatures are shown for type annotated functions
+* #3942: html: table is not aligned to center even if ``:align: center``
+
+Release 1.6.6 (released Jan 08, 2018)
+=====================================
+
+Features added
+--------------
+
+* #4181: autodoc: Sort dictionary keys when possible
+* ``VerbatimHighlightColor`` is a new
+ :ref:`LaTeX 'sphinxsetup' <latexsphinxsetup>` key (refs: #4285)
+* Easier customizability of LaTeX macros involved in rendering of code-blocks
+* Show traceback if conf.py raises an exception (refs: #4369)
+* Add :confval:`smartquotes` to disable smart quotes through ``conf.py``
+ (refs: #3967)
+* Add :confval:`smartquotes_action` and :confval:`smartquotes_excludes`
+ (refs: #4142, #4357)
+
+Bugs fixed
+----------
+
+* #4334: sphinx-apidoc: Don't generate references to non-existing files in TOC
+* #4206: latex: reST label between paragraphs loses paragraph break
+* #4231: html: Apply fixFirefoxAnchorBug only under Firefox
+* #4221: napoleon depends on autodoc, but users need to load it manually
+* #2298: automodule fails to document a class attribute
+* #4099: C++: properly link class reference to class from inside constructor
+* #4267: PDF build broken by Unicode U+2116 NUMERO SIGN character
+* #4249: PDF output: Pygments error highlighting increases line spacing in
+ code blocks
+* #1238: Support ``:emphasize-lines:`` in PDF output
+* #4279: Sphinx crashes with pickling error when run with multiple processes and
+ remote image
+* #1421: Respect the quiet flag in sphinx-quickstart
+* #4281: Race conditions when creating output directory
+* #4315: For PDF 'howto' documents, ``latex_toplevel_sectioning='part'``
+ generates ``\chapter`` commands
+* #4214: Two todolist directives break Sphinx 1.6.5
+* Fix links to external option docs with intersphinx (refs: #3769)
+* #4091: Private members not documented without :undoc-members:
+
+Release 1.6.5 (released Oct 23, 2017)
+=====================================
+
+Features added
+--------------
+
+* #4107: Make searchtools.js compatible with pre-Sphinx1.5 templates
+* #4112: Don't override the smart_quotes setting if it was already set
+* #4125: Display reference texts of original and translated passages on
+ i18n warning message
+* #4147: Include the exception when logging PO/MO file read/write
+
+Bugs fixed
+----------
+
+* #4085: Failed PDF build from image in parsed-literal using ``:align:`` option
+* #4100: Remove debug print from autodoc extension
+* #3987: Changing theme from alabaster causes HTML build to fail
+* #4096: C++, don't crash when using the wrong role type. Thanks to mitya57.
+* #4070, #4111: crashes when the warning message contains format strings (again)
+* #4108: Search word highlighting breaks SVG images
+* #3692: Unable to build HTML if writing .buildinfo failed
+* #4152: HTML writer crashes if a field list is placed on top of the document
+* #4063: Sphinx crashes when labeling directive ``.. todolist::``
+* #4134: [doc] :file:`docutils.conf` is not documented explicitly
+* #4169: Chinese language doesn't trigger Chinese search automatically
+* #1020: ext.todo todolist not linking to the page in pdflatex
+* #3965: New quickstart generates wrong SPHINXBUILD in Makefile
+* #3739: ``:module:`` option is ignored at content of pyobjects
+* #4149: Documentation: Help choosing :confval:`latex_engine`
+* #4090: [doc] :confval:`latex_additional_files` with extra LaTeX macros should
+ not use ``.tex`` extension
+* Failed to convert reST parser error to warning (refs: #4132)
+
+Release 1.6.4 (released Sep 26, 2017)
+=====================================
+
+Features added
+--------------
+
+* #3926: Add ``autodoc_warningiserror`` to suppress the behavior of ``-W``
+ option during importing target modules on autodoc
+
+Bugs fixed
+----------
+
+* #3924: docname lost after dynamically parsing RST in extension
+* #3946: Typo in sphinx.sty (this was a bug with no effect in default context)
+* :pep: and :rfc: does not supports ``default-role`` directive (refs: #3960)
+* #3960: default_role = 'guilabel' not functioning
+* Missing ``texinputs_win/Makefile`` to be used in latexpdf builder on windows.
+* #4026: nature: Fix macOS Safari scrollbar color
+* #3877: Fix for C++ multiline signatures.
+* #4006: Fix crash on parallel build
+* #3969: private instance attributes causes AttributeError
+* #4041: C++, remove extra name linking in function pointers.
+* #4038: C, add missing documentation of ``member`` role.
+* #4044: An empty multicolumn cell causes extra row height in PDF output
+* #4049: Fix typo in output of sphinx-build -h
+* #4062: hashlib.sha1() must take bytes, not unicode on Python 3
+* Avoid indent after index entries in latex (refs: #4066)
+* #4070: crashes when the warning message contains format strings
+* #4067: Return non-zero exit status when make subprocess fails
+* #4055: graphviz: the :align: option does not work for SVG output
+* #4055: graphviz: the :align: center option does not work for latex output
+* #4051: ``warn()`` function for HTML theme outputs 'None' string
+
+Release 1.6.3 (released Jul 02, 2017)
+=====================================
+
+Features added
+--------------
+
+* latex: hint that code-block continues on next page (refs: #3764, #3792)
+
+Bugs fixed
+----------
+
+* #3821: Failed to import sphinx.util.compat with docutils-0.14rc1
+* #3829: sphinx-quickstart template is incomplete regarding use of alabaster
+* #3772: 'str object' has no attribute 'filename'
+* Emit wrong warnings if citation label includes hyphens (refs: #3565)
+* #3858: Some warnings are not colored when using --color option
+* #3775: Remove unwanted whitespace in default template
+* #3835: sphinx.ext.imgmath fails to convert SVG images if project directory
+ name contains spaces
+* #3850: Fix color handling in make mode's help command
+* #3865: use of self.env.warn in sphinx extension fails
+* #3824: production lists apply smart quotes transform since Sphinx 1.6.1
+* latex: fix ``\sphinxbfcode`` swallows initial space of argument
+* #3878: Quotes in auto-documented class attributes should be straight quotes
+ in PDF output
+* #3881: LaTeX figure floated to next page sometimes leaves extra vertical
+ whitespace
+* #3885: duplicated footnotes raises IndexError
+* #3873: Failure of deprecation warning mechanism of
+ ``sphinx.util.compat.Directive``
+* #3874: Bogus warnings for "citation not referenced" for cross-file citations
+* #3860: Don't download images when builders not supported images
+* #3860: Remote image URIs without filename break builders not supported remote
+ images
+* #3833: command line messages are translated unintentionally with ``language``
+ setting.
+* #3840: make checking ``epub_uid`` strict
+* #3851, #3706: Fix about box drawing characters for PDF output
+* #3900: autosummary could not find methods
+* #3902: Emit error if ``latex_documents`` contains non-unicode string in py2
+
+Release 1.6.2 (released May 28, 2017)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #3789: Do not require typing module for python>=3.5
+
+Bugs fixed
+----------
+
+* #3754: HTML builder crashes if HTML theme appends own stylesheets
+* #3756: epub: Entity 'mdash' not defined
+* #3758: Sphinx crashed if logs are emitted in conf.py
+* #3755: incorrectly warns about dedent with literalinclude
+* #3742: `RTD <https://readthedocs.org/>`_ PDF builds of Sphinx own docs are
+ missing an index entry in the bookmarks and table of contents. This is
+ `rtfd/readthedocs.org#2857
+ <https://github.com/rtfd/readthedocs.org/issues/2857>`_ issue, a workaround
+ is obtained using some extra LaTeX code in Sphinx's own :file:`conf.py`
+* #3770: Build fails when a "code-block" has the option emphasize-lines and the
+ number indicated is higher than the number of lines
+* #3774: Incremental HTML building broken when using citations
+* #3763: got epubcheck validations error if epub_cover is set
+* #3779: 'ImportError' in sphinx.ext.autodoc due to broken 'sys.meta_path'.
+ Thanks to Tatiana Tereshchenko.
+* #3796: env.resolve_references() crashes when non-document node given
+* #3803: Sphinx crashes with invalid PO files
+* #3791: PDF "continued on next page" for long tables isn't internationalized
+* #3788: smartquotes emits warnings for unsupported languages
+* #3807: latex Makefile for ``make latexpdf`` is only for unixen
+* #3781: double hyphens in option directive are compiled as endashes
+* #3817: latex builder raises AttributeError
+
+Release 1.6.1 (released May 16, 2017)
+=====================================
+
+Dependencies
+------------
+
+1.6b1
+
+* (updated) latex output is tested with Ubuntu trusty's texlive packages (Feb.
+ 2014) and earlier tex installations may not be fully compliant, particularly
+ regarding Unicode engines xelatex and lualatex
+* (added) latexmk is required for ``make latexpdf`` on GNU/Linux and Mac OS X
+ (refs: #3082)
+
+Incompatible changes
+--------------------
+
+1.6b1
+
+* #1061, #2336, #3235: Now generation of autosummary doesn't contain imported
+ members by default. Thanks to Luc Saffre.
+* LaTeX ``\includegraphics`` command isn't overloaded: only
+ ``\sphinxincludegraphics`` has the custom code to fit image to available width
+ if oversized.
+* The subclasses of ``sphinx.domains.Index`` should override ``generate()``
+ method. The default implementation raises NotImplementedError
+* LaTeX positioned long tables horizontally centered, and short ones
+ flushed left (no text flow around table.) The position now defaults to center
+ in both cases, and it will obey Docutils 0.13 ``:align:`` option (refs #3415,
+ #3377)
+* option directive also allows all punctuations for the option name (refs:
+ #3366)
+* #3413: if :rst:dir:`literalinclude`'s ``:start-after:`` is used, make
+ ``:lines:`` relative (refs #3412)
+* ``literalinclude`` directive does not allow the combination of ``:diff:``
+ option and other options (refs: #3416)
+* LuaLaTeX engine uses ``fontspec`` like XeLaTeX. It is advised ``latex_engine
+ = 'lualatex'`` be used only on up-to-date TeX installs (refs #3070, #3466)
+* :confval:`!latex_keep_old_macro_names` default value has been changed from
+ ``True`` to ``False``. This means that some LaTeX macros for styling are
+ by default defined only with ``\sphinx..`` prefixed names. (refs: #3429)
+* Footer "Continued on next page" of LaTeX longtable's now not framed (refs:
+ #3497)
+* #3529: The arguments of ``BuildEnvironment.__init__`` is changed
+* #3082: Use latexmk for pdf (and dvi) targets (Unix-like platforms only)
+* #3558: Emit warnings if footnotes and citations are not referenced. The
+ warnings can be suppressed by ``suppress_warnings``.
+* latex made available (non documented) colour macros from a file distributed
+ with pdftex engine for Plain TeX. This is removed in order to provide better
+ support for multiple TeX engines. Only interface from ``color`` or
+ ``xcolor`` packages should be used by extensions of Sphinx latex writer.
+ (refs #3550)
+* ``Builder.env`` is not filled at instantiation
+* #3594: LaTeX: single raw directive has been considered as block level element
+* #3639: If ``html_experimental_html5_writer`` is available, epub builder use it
+ by default.
+* ``Sphinx.add_source_parser()`` raises an error if duplicated
+
+1.6b2
+
+* #3345: Replace the custom smartypants code with Docutils' smart_quotes.
+ Thanks to Dmitry Shachnev, and to Günter Milde at Docutils.
+
+1.6b3
+
+* LaTeX package ``eqparbox`` is not used and not loaded by Sphinx anymore
+* LaTeX package ``multirow`` is not used and not loaded by Sphinx anymore
+* Add line numbers to citation data in std domain
+
+1.6 final
+
+* LaTeX package ``threeparttable`` is not used and not loaded by Sphinx
+ anymore (refs #3686, #3532, #3377)
+
+Features removed
+----------------
+
+* Configuration variables
+
+ - epub3_contributor
+ - epub3_description
+ - epub3_page_progression_direction
+ - html_translator_class
+ - html_use_modindex
+ - latex_font_size
+ - latex_paper_size
+ - latex_preamble
+ - latex_use_modindex
+ - latex_use_parts
+
+* ``termsep`` node
+* defindex.html template
+* LDML format support in ``today``, ``today_fmt`` and ``html_last_updated_fmt``
+* ``:inline:`` option for the directives of sphinx.ext.graphviz extension
+* sphinx.ext.pngmath extension
+* ``sphinx.util.compat.make_admonition()``
+
+Features added
+--------------
+
+1.6b1
+
+* #3136: Add ``:name:`` option to the directives in ``sphinx.ext.graphviz``
+* #2336: Add ``imported_members`` option to ``sphinx-autogen`` command to
+ document imported members.
+* C++, add ``:tparam-line-spec:`` option to templated declarations.
+ When specified, each template parameter will be rendered on a separate line.
+* #3359: Allow sphinx.js in a user locale dir to override sphinx.js from Sphinx
+* #3303: Add ``:pyversion:`` option to the doctest directive.
+* #3378: (latex) support for ``:widths:`` option of table directives
+ (refs: #3379, #3381)
+* #3402: Allow to suppress "download file not readable" warnings using
+ :confval:`suppress_warnings`.
+* #3377: latex: Add support for Docutils 0.13 ``:align:`` option for tables
+ (but does not implement text flow around table).
+* latex: footnotes from inside tables are hyperlinked (except from captions or
+ headers) (refs: #3422)
+* Emit warning if over dedent has detected on ``literalinclude`` directive
+ (refs: #3416)
+* Use for LuaLaTeX same default settings as for XeLaTeX (i.e. ``fontspec`` and
+ ``polyglossia``). (refs: #3070, #3466)
+* Make ``'extraclassoptions'`` key of ``latex_elements`` public (refs #3480)
+* #3463: Add warning messages for required EPUB3 metadata. Add default value to
+ ``epub_description`` to avoid warning like other settings.
+* #3476: setuptools: Support multiple builders
+* latex: merged cells in LaTeX tables allow code-blocks, lists, blockquotes...
+ as do normal cells (refs: #3435)
+* HTML builder uses experimental HTML5 writer if
+ ``html_experimental_html5_writer`` is True and docutils 0.13 or later is
+ installed.
+* LaTeX macros to customize space before and after tables in PDF output (refs
+ #3504)
+* #3348: Show decorators in literalinclude and viewcode directives
+* #3108: Show warning if :start-at: and other literalinclude options does not
+ match to the text
+* #3609: Allow to suppress "duplicate citation" warnings using
+ ``suppress_warnings``
+* #2803: Discovery of builders by entry point
+* #1764, #1676: Allow setting 'rel' and 'title' attributes for stylesheets
+* #3589: Support remote images on non-HTML builders
+* #3589: Support images in Data URI on non-HTML builders
+* #2961: improve :confval:`autodoc_mock_imports`. Now the config value only
+ requires to declare the top-level modules that should be mocked.
+ Thanks to Robin Jarry.
+* #3449: On py3, autodoc use inspect.signature for more accurate signature
+ calculation. Thanks to Nathaniel J. Smith.
+* #3641: Epub theme supports HTML structures that are generated by HTML5 writer.
+* #3644 autodoc uses inspect instead of checking types. Thanks to
+ Jeroen Demeyer.
+* Add a new extension; ``sphinx.ext.imgconverter``. It converts images in the
+ document to appropriate format for builders
+* latex: Use templates to render tables (refs #3389, 2a37b0e)
+
+1.6b2
+
+* ``LATEXMKOPTS`` variable for the Makefile in ``$BUILDDIR/latex`` to pass
+ options to ``latexmk`` when executing ``make latexpdf`` (refs #3695, #3720)
+* Add a new event `env-check-consistency` to check consistency to extensions
+* Add `Domain.check_consistency()` to check consistency
+
+Bugs fixed
+----------
+
+1.6b1
+
+* ``literalinclude`` directive expands tabs after dedent-ing (refs: #3416)
+* #1574: Paragraphs in table cell doesn't work in Latex output
+* #3288: Table with merged headers not wrapping text
+* #3491: Inconsistent vertical space around table and longtable in PDF
+* #3506: Depart functions for all admonitions in HTML writer now properly pass
+ ``node`` to ``depart_admonition``.
+* #2693: Sphinx latex style file wrongly inhibits colours for section headings
+ for latex+dvi(ps,pdf,pdfmx)
+* C++, properly look up ``any`` references.
+* #3624: sphinx.ext.intersphinx couldn't load inventories compressed with gzip
+* #3551: PDF information dictionary is lacking author and title data
+* #3351: intersphinx does not refers context like ``py:module``, ``py:class``
+ and so on.
+* Fail to load template file if the parent template is archived
+
+1.6b2
+
+* #3661: sphinx-build crashes on parallel build
+* #3669: gettext builder fails with "ValueError: substring not found"
+* #3660: Sphinx always depends on sphinxcontrib-websupport and its dependencies
+* #3472: smart quotes getting wrong in latex (at least with list of strings via
+ autoattribute) (refs: #3345, #3666)
+
+1.6b3
+
+* #3588: No compact (p tag) html output in the i18n document build even when
+ :confval:`html_compact_lists` is True.
+* The ``make latexpdf`` from 1.6b1 (for GNU/Linux and Mac OS, using
+ ``latexmk``) aborted earlier in case of LaTeX errors than was the case with
+ 1.5 series, due to hard-coded usage of ``--halt-on-error`` option (refs #3695)
+* #3683: sphinx.websupport module is not provided by default
+* #3683: Failed to build document if builder.css_file.insert() is called
+* #3714: viewcode extension not taking ``highlight_code='none'`` in account
+* #3698: Moving :doc: to std domain broke backwards compatibility
+* #3633: misdetect unreferenced citations
+
+1.6 final
+
+* LaTeX tables do not allow multiple paragraphs in a header cell
+* LATEXOPTS is not passed over correctly to pdflatex since 1.6b3
+* #3532: Figure or literal block captions in cells of short tables cause havoc
+ in PDF output
+* Fix: in PDF captions of tables are rendered differently whether table is of
+ longtable class or not (refs #3686)
+* #3725: Todo looks different from note in LaTeX output
+* #3479: stub-columns have no effect in LaTeX output
+* #3738: Nonsensical code in theming.py
+* #3746: PDF builds fail with latexmk 4.48 or earlier due to undefined
+ options ``-pdfxe`` and ``-pdflua``
+
+Deprecated
+----------
+
+1.6b1
+
+* ``sphinx.util.compat.Directive`` class is now deprecated. Please use instead
+ ``docutils.parsers.rst.Directive``
+* ``sphinx.util.compat.docutils_version`` is now deprecated
+* #2367: ``Sphinx.warn()``, ``Sphinx.info()`` and other logging methods are now
+ deprecated. Please use ``sphinx.util.logging`` (:ref:`logging-api`) instead.
+* #3318: ``notice`` is now deprecated as LaTeX environment name and will be
+ removed at Sphinx 1.7. Extension authors please use ``sphinxadmonition``
+ instead (as Sphinx does since 1.5.)
+* ``Sphinx.status_iterator()`` and ``Sphinx.old_status_iterator()`` is now
+ deprecated. Please use ``sphinx.util:status_iterator()`` instead.
+* ``Sphinx._directive_helper()`` is deprecated. Please use
+ ``sphinx.util.docutils.directive_helper()`` instead.
+* ``BuildEnvironment.set_warnfunc()`` is now deprecated
+* Following methods of ``BuildEnvironment`` is now deprecated.
+
+ - ``BuildEnvironment.note_toctree()``
+ - ``BuildEnvironment.get_toc_for()``
+ - ``BuildEnvironment.get_toctree_for()``
+ - ``BuildEnvironment.create_index()``
+
+ Please use ``sphinx.environment.adapters`` modules instead.
+* latex package ``footnote`` is not loaded anymore by its bundled replacement
+ ``footnotehyper-sphinx``. The redefined macros keep the same names as in the
+ original package.
+* #3429: deprecate config setting :confval:`!latex_keep_old_macro_names`. It will
+ be removed at 1.7, and already its default value has changed from ``True`` to
+ ``False``.
+* #3221: epub2 builder is deprecated
+* #3254: ``sphinx.websupport`` is now separated into independent package;
+ ``sphinxcontrib-websupport``. ``sphinx.websupport`` will be removed in
+ Sphinx 2.0.
+* #3628: ``sphinx_themes`` entry_point is deprecated. Please use
+ ``sphinx.html_themes`` instead.
+
+1.6b2
+
+* #3662: ``builder.css_files`` is deprecated. Please use ``add_stylesheet()``
+ API instead.
+
+1.6 final
+
+* LaTeX ``\sphinxstylethead`` is deprecated at 1.6 and will be removed at 1.7.
+ Please move customization into new macro ``\sphinxstyletheadfamily``.
+
+Testing
+-------
+
+1.6 final
+
+* #3458: Add ``sphinx.testing`` (experimental)
+
+Release 1.6 (unreleased)
+========================
+
+* not released (because of package script error)
+
+Release 1.5.6 (released May 15, 2017)
+=====================================
+
+Bugs fixed
+----------
+
+* #3614: Sphinx crashes with requests-2.5.0
+* #3618: autodoc crashes with tupled arguments
+* #3664: No space after the bullet in items of a latex list produced by Sphinx
+* #3657: EPUB builder crashes if a document starting with genindex exists
+* #3588: No compact (p tag) html output in the i18n document build even when
+ :confval:`html_compact_lists` is True.
+* #3685: AttributeError when using 3rd party domains
+* #3702: LaTeX writer styles figure legends with a hard-coded ``\small``
+* #3708: LaTeX writer allows irc scheme
+* #3717: Stop enforcing that favicon's must be .ico
+* #3731, #3732: Protect isenumclass predicate against non-class arguments
+* #3320: Warning about reference target not being found for container types
+* Misspelled ARCHIVEPREFIX in Makefile for latex build repertory
+
+Release 1.5.5 (released Apr 03, 2017)
+=====================================
+
+Bugs fixed
+----------
+
+* #3597: python domain raises UnboundLocalError if invalid name given
+* #3599: Move to new MathJax CDN
+
+Release 1.5.4 (released Apr 02, 2017)
+=====================================
+
+Features added
+--------------
+
+* #3470: Make genindex support all kinds of letters, not only Latin ones
+
+Bugs fixed
+----------
+
+* #3445: setting ``'inputenc'`` key to ``\\usepackage[utf8x]{inputenc}`` leads
+ to failed PDF build
+* EPUB file has duplicated ``nav.xhtml`` link in ``content.opf``
+ except first time build
+* #3488: objects.inv has broken when ``release`` or ``version`` contain
+ return code
+* #2073, #3443, #3490: gettext builder that writes pot files unless the content
+ are same without creation date. Thanks to Yoshiki Shibukawa.
+* #3487: intersphinx: failed to refer options
+* #3496: latex longtable's last column may be much wider than its contents
+* #3507: wrong quotes in latex output for productionlist directive
+* #3533: Moving from Sphinx 1.3.1 to 1.5.3 breaks LaTeX compilation of links
+ rendered as code
+* #2665, #2607: Link names in C++ docfields, and make it possible for other
+ domains.
+* #3542: C++, fix parsing error of non-type template argument with template.
+* #3065, #3520: python domain fails to recognize nested class
+* #3575: Problems with pdflatex in a Turkish document built with sphinx has
+ reappeared (refs #2997, #2397)
+* #3577: Fix intersphinx debug tool
+* A LaTeX command such as ``\\large`` inserted in the title items of
+ :confval:`latex_documents` causes failed PDF build (refs #3551, #3567)
+
+Release 1.5.3 (released Feb 26, 2017)
+=====================================
+
+Features added
+--------------
+
+* Support requests-2.0.0 (experimental) (refs: #3367)
+* (latex) PDF page margin dimensions may be customized (refs: #3387)
+* ``literalinclude`` directive allows combination of ``:pyobject:`` and
+ ``:lines:`` options (refs: #3416)
+* #3400: make-mode doesn't use subprocess on building docs
+
+Bugs fixed
+----------
+
+* #3370: the caption of code-block is not picked up for translation
+* LaTeX: :confval:`release` is not escaped (refs: #3362)
+* #3364: sphinx-quickstart prompts overflow on Console with 80 chars width
+* since 1.5, PDF's TOC and bookmarks lack an entry for general Index
+ (refs: #3383)
+* #3392: ``'releasename'`` in :confval:`latex_elements` is not working
+* #3356: Page layout for Japanese ``'manual'`` docclass has a shorter text area
+* #3394: When ``'pointsize'`` is not ``10pt``, Japanese ``'manual'`` document
+ gets wrong PDF page dimensions
+* #3399: quickstart: conf.py was not overwritten by template
+* #3366: option directive does not allow punctuations
+* #3410: return code in :confval:`release` breaks html search
+* #3427: autodoc: memory addresses are not stripped on Windows
+* #3428: xetex build tests fail due to fontspec v2.6 defining ``\strong``
+* #3349: Result of ``IndexBuilder.load()`` is broken
+* #3450: &nbsp is appeared in EPUB docs
+* #3418: Search button is misaligned in nature and pyramid theme
+* #3421: Could not translate a caption of tables
+* #3552: linkcheck raises UnboundLocalError
+
+Release 1.5.2 (released Jan 22, 2017)
+=====================================
+
+Incompatible changes
+--------------------
+
+* Dependency requirement updates: requests 2.4.0 or above (refs: #3268, #3310)
+
+Features added
+--------------
+
+* #3241: emit latex warning if buggy titlesec (ref #3210)
+* #3194: Refer the $MAKE environment variable to determine ``make`` command
+* Emit warning for nested numbered toctrees (refs: #3142)
+* #978: `intersphinx_mapping` also allows a list as a parameter
+* #3340: (LaTeX) long lines in :dudir:`parsed-literal` are wrapped like in
+ :rst:dir:`code-block`, inline math and footnotes are fully functional.
+
+Bugs fixed
+----------
+
+* #3246: xapian search adapter crashes
+* #3253: In Py2 environment, building another locale with a non-captioned
+ toctree produces ``None`` captions
+* #185: References to section title including raw node has broken
+* #3255: In Py3.4 environment, autodoc doesn't support documentation for
+ attributes of Enum class correctly.
+* #3261: ``latex_use_parts`` makes sphinx crash
+* The warning type ``misc.highlighting_failure`` does not work
+* #3294: ``add_latex_package()`` make crashes non-LaTeX builders
+* The caption of table are rendered as invalid HTML (refs: #3287)
+* #3268: Sphinx crashes with requests package from Debian jessie
+* #3284: Sphinx crashes on parallel build with an extension which raises
+ unserializable exception
+* #3315: Bibliography crashes on latex build with docclass 'memoir'
+* #3328: Could not refer rubric implicitly
+* #3329: emit warnings if po file is invalid and can't read it. Also writing mo
+* #3337: Ugly rendering of definition list term's classifier
+* #3335: gettext does not extract field_name of a field in a field_list
+* #2952: C++, fix refs to operator() functions.
+* Fix Unicode super- and subscript digits in :rst:dir:`code-block` and
+ parsed-literal LaTeX output (ref #3342)
+* LaTeX writer: leave ``"`` character inside parsed-literal as is (ref #3341)
+* #3234: intersphinx failed for encoded inventories
+* #3158: too much space after captions in PDF output
+* #3317: An URL in parsed-literal contents gets wrongly rendered in PDF if
+ with hyphen
+* LaTeX crash if the filename of an image inserted in parsed-literal
+ via a substitution contains an hyphen (ref #3340)
+* LaTeX rendering of inserted footnotes in parsed-literal is wrong (ref #3340)
+* Inline math in parsed-literal is not rendered well by LaTeX (ref #3340)
+* #3308: Parsed-literals don't wrap very long lines with pdf builder (ref #3340)
+* #3295: Could not import extension sphinx.builders.linkcheck
+* #3285: autosummary: asterisks are escaped twice
+* LaTeX, pass dvipdfm option to geometry package for Japanese documents (ref
+ #3363)
+* Fix parselinenos() could not parse left half open range (cf. "-4")
+
+
+Release 1.5.1 (released Dec 13, 2016)
+=====================================
+
+Features added
+--------------
+
+* #3214: Allow to suppress "unknown mimetype" warnings from epub builder using
+ :confval:`suppress_warnings`.
+
+Bugs fixed
+----------
+
+* #3195: Can not build in parallel
+* #3198: AttributeError is raised when toctree has 'self'
+* #3211: Remove untranslated sphinx locale catalogs (it was covered by
+ untranslated it_IT)
+* #3212: HTML Builders crashes with docutils-0.13
+* #3207: more latex problems with references inside parsed-literal directive
+ (``\DUrole``)
+* #3205: sphinx.util.requests crashes with old pyOpenSSL (< 0.14)
+* #3220: KeyError when having a duplicate citation
+* #3200: LaTeX: xref inside desc_name not allowed
+* #3228: ``build_sphinx`` command crashes when missing dependency
+* #2469: Ignore updates of catalog files for gettext builder. Thanks to
+ Hiroshi Ohkubo.
+* #3183: Randomized jump box order in generated index page.
+
+Release 1.5 (released Dec 5, 2016)
+==================================
+
+Incompatible changes
+--------------------
+
+1.5a1
+
+* latex, package fancybox is not any longer a dependency of sphinx.sty
+* Use ``'locales'`` as a default value of `locale_dirs`
+* latex, package ifthen is not any longer a dependency of sphinx.sty
+* latex, style file does not modify fancyvrb's Verbatim (also available as
+ OriginalVerbatim) but uses sphinxVerbatim for name of custom wrapper.
+* latex, package newfloat is not used (and not included) anymore (ref #2660;
+ it was used since 1.3.4 and shipped with Sphinx since 1.4).
+* latex, literal blocks in tables do not use OriginalVerbatim but
+ sphinxVerbatimintable which handles captions and wraps lines (ref #2704).
+* latex, replace ``pt`` by TeX equivalent ``bp`` if found in ``width`` or
+ ``height`` attribute of an image.
+* latex, if ``width`` or ``height`` attribute of an image is given with no unit,
+ use ``px`` rather than ignore it.
+* latex: Separate stylesheets of pygments to independent .sty file
+* #2454: The filename of sourcelink is now changed. The value of
+ `html_sourcelink_suffix` will be appended to the original filename (like
+ ``index.rst.txt``).
+* ``sphinx.util.copy_static_entry()`` is now deprecated.
+ Use ``sphinx.util.fileutil.copy_asset()`` instead.
+* ``sphinx.util.osutil.filecopy()`` skips copying if the file has not been
+ changed (ref: #2510, #2753)
+* Internet Explorer 6-8, Opera 12.1x or Safari 5.1+ support is dropped
+ because jQuery version is updated from 1.11.0 to 3.1.0 (ref: #2634, #2773)
+* QtHelpBuilder doesn't generate search page (ref: #2352)
+* QtHelpBuilder uses ``nonav`` theme instead of default one
+ to improve readability.
+* latex: To provide good default settings to Japanese documents, Sphinx uses
+ ``jreport`` and ``jsbook`` as docclass if :confval:`language` is
+ ``ja``.
+* ``sphinx-quickstart`` now allows a project version is empty
+* Fix :download: role on epub/qthelp builder. They ignore the role because they
+ don't support it.
+* ``sphinx.ext.viewcode`` doesn't work on epub building by default.
+ ``viewcode_enable_epub`` option
+* ``sphinx.ext.viewcode`` disabled on singlehtml builder.
+* Use make-mode of ``sphinx-quickstart`` by default. To disable this, use
+ ``-M`` option
+* Fix ``genindex.html``, Sphinx's document template, link address to itself to
+ satisfy xhtml standard.
+* Use epub3 builder by default. And the old epub builder is renamed to epub2.
+* Fix ``epub`` and ``epub3`` builders that contained links to ``genindex`` even
+ if ``epub_use_index = False``.
+* ``html_translator_class`` is now deprecated.
+ Use :meth:`~sphinx.application.Sphinx.set_translator` API instead.
+* Drop python 2.6 and 3.3 support
+* Drop epub3 builder's ``epub3_page_progression_direction`` option (use
+ ``epub3_writing_mode``).
+* #2877: Rename ``latex_elements['footer']`` to
+ ``latex_elements['atendofbody']``
+
+1.5a2
+
+* #2983: Rename ``epub3_description`` and ``epub3_contributor`` to
+ ``epub_description`` and ``epub_contributor``.
+* Remove themes/basic/defindex.html; no longer used
+* Sphinx does not ship anymore (but still uses) LaTeX style file ``fncychap``
+* #2435: Slim down quickstarted conf.py
+* The ``sphinx.sty`` latex package does not load itself "hyperref", as this
+ is done later in the preamble of the latex output via ``'hyperref'`` key.
+* Sphinx does not ship anymore a custom modified LaTeX style file ``tabulary``.
+ The non-modified package is used.
+* #3057: By default, footnote marks in latex PDF output are not preceded by a
+ space anymore, ``\sphinxBeforeFootnote`` allows user customization if needed.
+* LaTeX target requires that option ``hyperfootnotes`` of package ``hyperref``
+ be left unchanged to its default (i.e. ``true``) (refs: #3022)
+
+1.5 final
+
+* #2986: ``themes/basic/defindex.html`` is now deprecated
+* Emit warnings that will be deprecated in Sphinx 1.6 by default.
+ Users can change the behavior by setting the environment variable
+ PYTHONWARNINGS. Please refer :ref:`when-deprecation-warnings-are-displayed`.
+* #2454: new JavaScript variable ``SOURCELINK_SUFFIX`` is added
+
+Deprecated
+----------
+
+These features are removed in Sphinx 1.6:
+
+* LDML format support in i18n feature
+* ``sphinx.addnodes.termsep``
+* Some functions and classes in ``sphinx.util.pycompat``:
+ ``zip_longest``, ``product``, ``all``, ``any``, ``next``, ``open``,
+ ``class_types``, ``base_exception``, ``relpath``, ``StringIO``, ``BytesIO``.
+ Please use the standard library version instead;
+
+If any deprecation warning like ``RemovedInSphinxXXXWarning`` are displayed,
+please refer :ref:`when-deprecation-warnings-are-displayed`.
+
+Features added
+--------------
+
+1.5a1
+
+* #2951: Add ``--implicit-namespaces`` PEP-0420 support to apidoc.
+* Add ``:caption:`` option for sphinx.ext.inheritance_diagram.
+* #2471: Add config variable for default doctest flags.
+* Convert linkcheck builder to requests for better encoding handling
+* #2463, #2516: Add keywords of "meta" directive to search index
+* ``:maxdepth:`` option of toctree affects ``secnumdepth`` (ref: #2547)
+* #2575: Now ``sphinx.ext.graphviz`` allows ``:align:`` option
+* Show warnings if unknown key is specified to `latex_elements`
+* Show warnings if no domains match with `primary_domain` (ref: #2001)
+* C++, show warnings when the kind of role is misleading for the kind
+ of target it refers to (e.g., using the `class` role for a function).
+* latex, writer abstracts more of text styling into customizable macros, e.g.
+ the ``visit_emphasis`` will output ``\sphinxstyleemphasis`` rather than
+ ``\emph`` (which may be in use elsewhere or in an added LaTeX package). See
+ list at end of ``sphinx.sty`` (ref: #2686)
+* latex, public names for environments and parameters used by note, warning,
+ and other admonition types, allowing full customizability from the
+ ``'preamble'`` key or an input file (ref: feature request #2674, #2685)
+* latex, better computes column widths of some tables (as a result, there will
+ be slight changes as tables now correctly fill the line width; ref: #2708)
+* latex, sphinxVerbatim environment is more easily customizable (ref: #2704).
+ In addition to already existing VerbatimColor and VerbatimBorderColor:
+
+ - two lengths ``\sphinxverbatimsep`` and ``\sphinxverbatimborder``,
+ - booleans ``\ifsphinxverbatimwithframe`` and ``\ifsphinxverbatimwrapslines``.
+
+* latex, captions for literal blocks inside tables are handled, and long code
+ lines wrapped to fit table cell (ref: #2704)
+* #2597: Show warning messages as darkred
+* latex, allow image dimensions using px unit (default is 96px=1in)
+* Show warnings if invalid dimension units found
+* #2650: Add ``--pdb`` option to setup.py command
+* latex, make the use of ``\small`` for code listings customizable (ref #2721)
+* #2663: Add ``--warning-is-error`` option to setup.py command
+* Show warnings if deprecated latex options are used
+* Add sphinx.config.ENUM to check the config values is in candidates
+* math: Add hyperlink marker to each equations in HTML output
+* Add new theme ``nonav`` that doesn't include any navigation links.
+ This is for any help generator like qthelp.
+* #2680: `sphinx.ext.todo` now emits warnings if `todo_emit_warnings` enabled.
+ Also, it emits an additional event named `todo-defined` to handle the TODO
+ entries in 3rd party extensions.
+* Python domain signature parser now uses the xref mixin for 'exceptions',
+ allowing exception classes to be autolinked.
+* #2513: Add `latex_engine` to switch the LaTeX engine by conf.py
+* #2682: C++, basic support for attributes (C++11 style and GNU style).
+ The new configuration variables 'cpp_id_attributes' and 'cpp_paren_attributes'
+ can be used to introduce custom attributes.
+* #1958: C++, add configuration variable 'cpp_index_common_prefix' for removing
+ prefixes from the index text of C++ objects.
+* C++, added concept directive. Thanks to mickk-on-cpp.
+* C++, added support for template introduction syntax. Thanks to mickk-on-cpp.
+* #2725: latex builder: allow to use user-defined template file (experimental)
+* apidoc now avoids invalidating cached files by not writing to files whose
+ content doesn't change. This can lead to significant performance wins if
+ apidoc is run frequently.
+* #2851: ``sphinx.ext.math`` emits missing-reference event if equation not found
+* #1210: ``eqref`` role now supports cross reference
+* #2892: Added ``-a`` (``--append-syspath``) option to ``sphinx-apidoc``
+* #1604: epub3 builder: Obey font-related CSS when viewing in iBooks.
+* #646: ``option`` directive support '.' character as a part of options
+* Add document about kindlegen and fix document structure for it.
+* #2474: Add ``intersphinx_timeout`` option to ``sphinx.ext.intersphinx``
+* #2926: EPUB3 builder supports vertical mode (``epub3_writing_mode`` option)
+* #2695: ``build_sphinx`` subcommand for setuptools handles exceptions as same
+ as ``sphinx-build`` does
+* #326: `numref` role can also refer sections
+* #2916: `numref` role can also refer caption as an its linktext
+
+1.5a2
+
+* #3008: ``linkcheck`` builder ignores self-signed certificate URL
+* #3020: new ``'geometry'`` key to ``latex_elements`` whose default uses
+ LaTeX style file ``geometry.sty`` to set page layout
+* #2843: Add :start-at: and :end-at: options to literalinclude directive
+* #2527: Add ``:reversed:`` option to toctree directive
+* Add ``-t`` and ``-d`` option to ``sphinx-quickstart`` to support templating
+ generated sphinx project.
+* #3028: Add ``{path}`` and ``{basename}`` to the format of
+ ``figure_language_filename``
+* new ``'hyperref'`` key in the ``latex_elements`` dictionary (ref #3030)
+* #3022: Allow code-blocks in footnotes for LaTeX PDF output
+
+1.5b1
+
+* #2513: A better default settings for XeLaTeX
+* #3096: ``'maxlistdepth'`` key to work around LaTeX list limitations
+* #3060: autodoc supports documentation for attributes of Enum class. Now
+ autodoc render just the value of Enum attributes instead of Enum attribute
+ representation.
+* Add ``--extensions`` to ``sphinx-quickstart`` to support enable arbitrary
+ extensions from command line (ref: #2904)
+* #3104, #3122: ``'sphinxsetup'`` for key=value styling of Sphinx LaTeX
+* #3071: Autodoc: Allow mocked module decorators to pass-through functions
+ unchanged
+* #2495: linkcheck: Allow skipping anchor checking using
+ :confval:`linkcheck_anchors_ignore`
+* #3083: let Unicode no-break space act like LaTeX ``~`` (fixed #3019)
+* #3116: allow word wrap in PDF output for inline literals (ref #3110)
+* #930: sphinx-apidoc allow wildcards for excluding paths. Thanks to Nick
+ Coghlan.
+* #3121: add ``inlineliteralwraps`` option to control if inline literal
+ word-wraps in latex
+
+1.5 final
+
+* #3095: Add :confval:`tls_verify` and :confval:`tls_cacerts` to support
+ self-signed HTTPS servers in linkcheck and intersphinx
+* #2215: make.bat generated by sphinx-quickstart can be called from another dir.
+ Thanks to Timotheus Kampik.
+* #3185: Add new warning type ``misc.highlighting_failure``
+
+Bugs fixed
+----------
+
+1.5a1
+
+* #2707: (latex) the column width is badly computed for tabular
+* #2799: Sphinx installs roles and directives automatically on importing sphinx
+ module. Now Sphinx installs them on running application.
+* `sphinx.ext.autodoc` crashes if target code imports * from mock modules
+ by `autodoc_mock_imports`.
+* #1953: ``Sphinx.add_node`` does not add handlers the translator installed by
+ ``html_translator_class``
+* #1797: text builder inserts blank line on top
+* #2894: quickstart main() doesn't use argv argument
+* #2874: gettext builder could not extract all text under the ``only``
+ directives
+* #2485: autosummary crashes with multiple source_suffix values
+* #1734: Could not translate the caption of toctree directive
+* Could not translate the content of meta directive (ref: #1734)
+* #2550: external links are opened in help viewer
+* #2687: Running Sphinx multiple times produces 'already registered' warnings
+
+1.5a2
+
+* #2810: Problems with pdflatex in an Italian document
+* Use ``latex_elements.papersize`` to specify papersize of LaTeX in Makefile
+* #2988: linkcheck: retry with GET request if denied HEAD request
+* #2990: linkcheck raises "Can't convert 'bytes' object to str implicitly" error
+ if linkcheck_anchors enabled
+* #3004: Invalid link types "top" and "up" are used
+* #3009: Bad rendering of parsed-literals in LaTeX since Sphinx 1.4.4
+* #3000: ``option`` directive generates invalid HTML anchors
+* #2984: Invalid HTML has been generated if `html_split_index` enabled
+* #2986: themes/basic/defindex.html should be changed for html5 friendly
+* #2987: Invalid HTML has been generated if multiple IDs are assigned to a list
+* #2891: HTML search does not provide all the results
+* #1986: Title in PDF Output
+* #147: Problem with latex chapter style
+* #3018: LaTeX problem with page layout dimensions and chapter titles
+* Fix an issue with ``\pysigline`` in LaTeX style file (ref #3023)
+* #3038: ``sphinx.ext.math*`` raises TypeError if labels are duplicated
+* #3031: incompatibility with LaTeX package ``tocloft``
+* #3003: literal blocks in footnotes are not supported by Latex
+* #3047: spacing before footnote in pdf output is not coherent and allows breaks
+* #3045: HTML search index creator should ignore "raw" content if now html
+* #3039: English stemmer returns wrong word if the word is capitalized
+* Fix make-mode Makefile template (ref #3056, #2936)
+
+1.5b1
+
+* #2432: Fix unwanted * between varargs and keyword only args. Thanks to Alex
+ Grönholm.
+* #3062: Failed to build PDF using 1.5a2 (undefined ``\hypersetup`` for
+ Japanese documents since PR#3030)
+* Better rendering of multiline signatures in html.
+* #777: LaTeX output "too deeply nested" (ref #3096)
+* Let LaTeX image inclusion obey ``scale`` before textwidth fit (ref #2865,
+ #3059)
+* #3019: LaTeX fails on description of C function with arguments (ref #3083)
+* fix latex inline literals where ``< > -`` gobbled a space
+
+1.5 final
+
+* #3069: Even if ``'babel'`` key is set to empty string, LaTeX output contains
+ one ``\addto\captions...``
+* #3123: user ``'babel'`` key setting is not obeyed anymore
+* #3155: Fix JavaScript for `html_sourcelink_suffix` fails with IE and Opera
+* #3085: keep current directory after breaking build documentation. Thanks to
+ Timotheus Kampik.
+* #3181: pLaTeX crashes with a section contains endash
+* #3180: latex: add stretch/shrink between successive singleline or
+ multipleline cpp signatures (ref #3072)
+* #3128: globing images does not support .svgz file
+* #3015: fix a broken test on Windows.
+* #1843: Fix documentation of descriptor classes that have a custom metaclass.
+ Thanks to Erik Bray.
+* #3190: util.split_docinfo fails to parse multi-line field bodies
+* #3024, #3037: In Python3, application.Sphinx._log crushed when the log message
+ cannot be encoded into console encoding.
+
+Testing
+-------
+
+* To simplify, sphinx uses external mock package even if unittest.mock exists.
+
+
+Release 1.4.9 (released Nov 23, 2016)
+=====================================
+
+Bugs fixed
+----------
+
+* #2936: Fix doc/Makefile that can't build man because doc/man exists
+* #3058: Using the same 'caption' attribute in multiple 'toctree' directives
+ results in warning / error
+* #3068: Allow the '=' character in the -D option of sphinx-build.py
+* #3074: ``add_source_parser()`` crashes in debug mode
+* #3135: ``sphinx.ext.autodoc`` crashes with plain Callable
+* #3150: Fix query word splitter in JavaScript. It behaves as same as Python's
+ regular expression.
+* #3093: gettext build broken on substituted images.
+* #3093: gettext build broken on image node under ``note`` directive.
+* imgmath: crashes on showing error messages if image generation failed
+* #3117: LaTeX writer crashes if admonition is placed before first section title
+* #3164: Change search order of ``sphinx.ext.inheritance_diagram``
+
+Release 1.4.8 (released Oct 1, 2016)
+====================================
+
+Bugs fixed
+----------
+
+* #2996: The wheel package of Sphinx got crash with ImportError
+
+Release 1.4.7 (released Oct 1, 2016)
+====================================
+
+Bugs fixed
+----------
+
+* #2890: Quickstart should return an error consistently on all error conditions
+* #2870: flatten genindex columns' heights.
+* #2856: Search on generated HTML site doesn't find some symbols
+* #2882: Fall back to a GET request on 403 status in linkcheck
+* #2902: jsdump.loads fails to load search index if keywords starts with
+ underscore
+* #2900: Fix epub content.opf: add auto generated orphan files to spine.
+* #2899: Fix ``hasdoc()`` function in Jinja2 template. It will detect
+ ``genindex``, ``search`` also.
+* #2901: Fix epub result: skip creating links from image tags to original image
+ files.
+* #2917: inline code is hyphenated on HTML
+* #1462: autosummary warns for namedtuple with attribute with trailing
+ underscore
+* Could not reference equations if ``:nowrap:`` option specified
+* #2873: code-block overflow in latex (due to commas)
+* #1060, #2056: sphinx.ext.intersphinx: broken links are generated if relative
+ paths are used in `intersphinx_mapping`
+* #2931: code-block directive with same :caption: causes warning of duplicate
+ target. Now `code-block` and `literalinclude` does not define hyperlink
+ target using its caption automatically.
+* #2962: latex: missing label of longtable
+* #2968: autodoc: show-inheritance option breaks docstrings
+
+Release 1.4.6 (released Aug 20, 2016)
+=====================================
+
+Incompatible changes
+--------------------
+
+* #2867: linkcheck builder crashes with six-1.4. Now Sphinx depends on six-1.5
+ or later
+
+Bugs fixed
+----------
+
+* applehelp: Sphinx crashes if ``hiutil`` or ``codesign`` commands not found
+* Fix ``make clean`` abort issue when build dir contains regular files like
+ ``DS_Store``.
+* Reduce epubcheck warnings/errors:
+
+ * Fix DOCTYPE to html5
+ * Change extension from .html to .xhtml.
+ * Disable search page on epub results
+
+* #2778: Fix autodoc crashes if obj.__dict__ is a property method and raises
+ exception
+* Fix duplicated toc in epub3 output.
+* #2775: Fix failing linkcheck with servers not supporting identity encoding
+* #2833: Fix formatting instance annotations in ext.autodoc.
+* #1911: ``-D`` option of ``sphinx-build`` does not override the ``extensions``
+ variable
+* #2789: `sphinx.ext.intersphinx` generates wrong hyperlinks if the inventory is
+ given
+* parsing errors for caption of code-blocks are displayed in document
+ (ref: #2845)
+* #2846: ``singlehtml`` builder does not include figure numbers
+* #2816: Fix data from builds cluttering the ``Domain.initial_data`` class
+ attributes
+
+Release 1.4.5 (released Jul 13, 2016)
+=====================================
+
+Incompatible changes
+--------------------
+
+* latex, inclusion of non-inline images from image directive resulted in
+ non-coherent whitespaces depending on original image width; new behaviour
+ by necessity differs from earlier one in some cases. (ref: #2672)
+* latex, use of ``\includegraphics`` to refer to Sphinx custom variant is
+ deprecated; in future it will revert to original LaTeX macro, custom one
+ already has alternative name ``\sphinxincludegraphics``.
+
+Features added
+--------------
+
+* new config option :confval:`!latex_keep_old_macro_names`, defaults to True. If False,
+ lets macros (for text styling) be defined only with ``\sphinx``-prefixed names
+* latex writer allows user customization of "shadowed" boxes (topics), via
+ three length variables.
+* woff-format web font files now supported by the epub builder.
+
+Bugs fixed
+----------
+
+* jsdump fix for python 3: fixes the HTML search on python > 3
+* #2676: (latex) Error with verbatim text in captions since Sphinx 1.4.4
+* #2629: memoir class crashes LaTeX. Fixed by
+ ``latex_keep_old_macro_names=False`` (ref 2675)
+* #2684: `sphinx.ext.intersphinx` crashes with six-1.4.1
+* #2679: ``float`` package needed for ``'figure_align': 'H'`` latex option
+* #2671: image directive may lead to inconsistent spacing in pdf
+* #2705: ``toctree`` generates empty bullet_list if ``:titlesonly:`` specified
+* #2479: `sphinx.ext.viewcode` uses python2 highlighter by default
+* #2700: HtmlHelp builder has hard coded index.html
+* latex, since 1.4.4 inline literal text is followed by spurious space
+* #2722: C++, fix id generation for var/member declarations to include
+ namespaces.
+* latex, images (from image directive) in lists or quoted blocks did not obey
+ indentation (fixed together with #2671)
+* #2733: since Sphinx 1.4.4 ``make latexpdf`` generates lots of hyperref
+ warnings
+* #2731: `sphinx.ext.autodoc` does not access propertymethods which raises any
+ exceptions
+* #2666: C++, properly look up nested names involving constructors.
+* #2579: Could not refer a label including both spaces and colons via
+ `sphinx.ext.intersphinx`
+* #2718: Sphinx crashes if the document file is not readable
+* #2699: hyperlinks in help HTMLs are broken if `html_file_suffix` is set
+* #2723: extra spaces in latex pdf output from multirow cell
+* #2735: latexpdf ``Underfull \hbox (badness 10000)`` warnings from title page
+* #2667: latex crashes if resized images appeared in section title
+* #2763: (html) Provide default value for required ``alt`` attribute for image
+ tags of SVG source, required to validate and now consistent w/ other formats.
+
+
+Release 1.4.4 (released Jun 12, 2016)
+=====================================
+
+Bugs fixed
+----------
+
+* #2630: latex: sphinx.sty notice environment formatting problem
+* #2632: Warning directives fail in quote environment latex build
+* #2633: Sphinx crashes with old styled indices
+* Fix a ``\begin{\minipage}`` typo in sphinx.sty from 1.4.2 (ref: 68becb1)
+* #2622: Latex produces empty pages after title and table of contents
+* #2640: 1.4.2 LaTeX crashes if code-block inside warning directive
+* Let LaTeX use straight quotes also in inline code (ref #2627)
+* #2351: latex crashes if enumerated lists are placed on footnotes
+* #2646: latex crashes if math contains twice empty lines
+* #2480: `sphinx.ext.autodoc`: memory addresses were shown
+* latex: allow code-blocks appearing inside lists and quotes at maximal nesting
+ depth (ref #777, #2624, #2651)
+* #2635: Latex code directives produce inconsistent frames based on viewing
+ resolution
+* #2639: Sphinx now bundles iftex.sty
+* Failed to build PDF with framed.sty 0.95
+* Sphinx now bundles needspace.sty
+
+
+Release 1.4.3 (released Jun 5, 2016)
+====================================
+
+Bugs fixed
+----------
+
+* #2530: got "Counter too large" error on building PDF if large numbered
+ footnotes existed in admonitions
+* ``width`` option of figure directive does not work if ``align`` option
+ specified at same time (ref: #2595)
+* #2590: The ``inputenc`` package breaks compiling under lualatex and xelatex
+* #2540: date on latex front page use different font
+* Suppress "document isn't included in any toctree" warning if the document is
+ included (ref: #2603)
+* #2614: Some tables in PDF output will end up shifted if user sets non zero
+ \parindent in preamble
+* #2602: URL redirection breaks the hyperlinks generated by
+ `sphinx.ext.intersphinx`
+* #2613: Show warnings if merged extensions are loaded
+* #2619: make sure amstext LaTeX package always loaded (ref: d657225, 488ee52,
+ 9d82cad and #2615)
+* #2593: latex crashes if any figures in the table
+
+
+Release 1.4.2 (released May 29, 2016)
+=====================================
+
+Features added
+--------------
+
+* Now :confval:`suppress_warnings` accepts following configurations
+ (ref: #2451, #2466):
+
+ - ``app.add_node``
+ - ``app.add_directive``
+ - ``app.add_role``
+ - ``app.add_generic_role``
+ - ``app.add_source_parser``
+ - ``image.data_uri``
+ - ``image.nonlocal_uri``
+
+* #2453: LaTeX writer allows page breaks in topic contents; and their
+ horizontal extent now fits in the line width (with shadow in margin). Also
+ warning-type admonitions allow page breaks and their vertical spacing has
+ been made more coherent with the one for hint-type notices (ref #2446).
+
+* #2459: the framing of literal code-blocks in LaTeX output (and not only the
+ code lines themselves) obey the indentation in lists or quoted blocks.
+
+* #2343: the long source lines in code-blocks are wrapped (without modifying
+ the line numbering) in LaTeX output (ref #1534, #2304).
+
+Bugs fixed
+----------
+
+* #2370: the equations are slightly misaligned in LaTeX writer
+* #1817, #2077: suppress pep8 warnings on conf.py generated by sphinx-quickstart
+* #2407: building docs crash if document includes large data image URIs
+* #2436: Sphinx does not check version by :confval:`needs_sphinx` if loading
+ extensions failed
+* #2397: Setup shorthandoff for Turkish documents
+* #2447: VerbatimBorderColor wrongly used also for captions of PDF
+* #2456: C++, fix crash related to document merging (e.g., singlehtml and Latex
+ builders).
+* #2446: latex(pdf) sets local tables of contents (or more generally topic
+ nodes) in unbreakable boxes, causes overflow at bottom
+* #2476: Omit MathJax markers if :nowrap: is given
+* #2465: latex builder fails in case no caption option is provided to toctree
+ directive
+* Sphinx crashes if self referenced toctree found
+* #2481: spelling mistake for mecab search splitter. Thanks to Naoki Sato.
+* #2309: Fix could not refer "indirect hyperlink targets" by ref-role
+* intersphinx fails if mapping URL contains any port
+* #2088: intersphinx crashes if the mapping URL requires basic auth
+* #2304: auto line breaks in latexpdf codeblocks
+* #1534: Word wrap long lines in Latex verbatim blocks
+* #2460: too much white space on top of captioned literal blocks in PDF output
+* Show error reason when multiple math extensions are loaded (ref: #2499)
+* #2483: any figure number was not assigned if figure title contains only non
+ text objects
+* #2501: Unicode subscript numbers are normalized in LaTeX
+* #2492: Figure directive with :figwidth: generates incorrect Latex-code
+* The caption of figure is always put on center even if ``:align:`` was
+ specified
+* #2526: LaTeX writer crashes if the section having only images
+* #2522: Sphinx touches mo files under installed directory that caused
+ permission error.
+* #2536: C++, fix crash when an immediately nested scope has the same name as
+ the current scope.
+* #2555: Fix crash on any-references with unicode.
+* #2517: wrong bookmark encoding in PDF if using LuaLaTeX
+* #2521: generated Makefile causes BSD make crashed if sphinx-build not found
+* #2470: ``typing`` backport package causes autodoc errors with python 2.7
+* ``sphinx.ext.intersphinx`` crashes if non-string value is used for key of
+ `intersphinx_mapping`
+* #2518: `intersphinx_mapping` disallows non alphanumeric keys
+* #2558: unpack error on devhelp builder
+* #2561: Info builder crashes when a footnote contains a link
+* #2565: The descriptions of objects generated by ``sphinx.ext.autosummary``
+ overflow lines at LaTeX writer
+* Extend pdflatex config in sphinx.sty to subparagraphs (ref: #2551)
+* #2445: `rst_prolog` and `rst_epilog` affect to non reST sources
+* #2576: ``sphinx.ext.imgmath`` crashes if subprocess raises error
+* #2577: ``sphinx.ext.imgmath``: Invalid argument are passed to dvisvgm
+* #2556: Xapian search does not work with Python 3
+* #2581: The search doesn't work if language="es" (Spanish)
+* #2382: Adjust spacing after abbreviations on figure numbers in LaTeX writer
+* #2383: The generated footnote by `latex_show_urls` overflows lines
+* #2497, #2552: The label of search button does not fit for the button itself
+
+
+Release 1.4.1 (released Apr 12, 2016)
+=====================================
+
+Incompatible changes
+--------------------
+
+* The default format of `today_fmt` and `html_last_updated_fmt` is back to
+ strftime format again. Locale Date Markup Language is also supported for
+ backward compatibility until Sphinx 1.5.
+
+Translations
+------------
+
+* Added Welsh translation, thanks to Geraint Palmer.
+* Added Greek translation, thanks to Stelios Vitalis.
+* Added Esperanto translation, thanks to Dinu Gherman.
+* Added Hindi translation, thanks to Purnank H. Ghumalia.
+* Added Romanian translation, thanks to Razvan Stefanescu.
+
+Bugs fixed
+----------
+
+* C++, added support for ``extern`` and ``thread_local``.
+* C++, type declarations are now using the prefixes ``typedef``, ``using``, and
+ ``type``, depending on the style of declaration.
+* #2413: C++, fix crash on duplicate declarations
+* #2394: Sphinx crashes when html_last_updated_fmt is invalid
+* #2408: dummy builder not available in Makefile and make.bat
+* #2412: hyperlink targets are broken in LaTeX builder
+* figure directive crashes if non paragraph item is given as caption
+* #2418: time formats no longer allowed in today_fmt
+* #2395: Sphinx crashes if unicode character in image filename
+* #2396: "too many values to unpack" in genindex-single
+* #2405: numref link in PDF jumps to the wrong location
+* #2414: missing number in PDF hyperlinks to code listings
+* #2440: wrong import for gmtime. Thanks to Uwe L. Korn.
+
+
+Release 1.4 (released Mar 28, 2016)
+===================================
+
+Incompatible changes
+--------------------
+* Drop ``PorterStemmer`` package support. Use ``PyStemmer`` instead of
+ ``PorterStemmer`` to accelerate stemming.
+* sphinx_rtd_theme has become optional. Please install it manually.
+ Refs #2087, #2086, #1845 and #2097. Thanks to Victor Zverovich.
+* #2231: Use DUrole instead of DUspan for custom roles in LaTeX writer. It
+ enables to take title of roles as an argument of custom macros.
+* #2022: 'Thumbs.db' and '.DS_Store' are added to `exclude_patterns` default
+ values in conf.py that will be provided on sphinx-quickstart.
+* #2027, #2208: The ``html_title`` accepts string values only. And The None
+ value cannot be accepted.
+* ``sphinx.ext.graphviz``: show graph image in inline by default
+* #2060, #2224: The ``manpage`` role now generate ``sphinx.addnodes.manpage``
+ node instead of ``sphinx.addnodes.literal_emphasis`` node.
+* #2022: :confval:`html_extra_path` also copies dotfiles in the extra directory,
+ and refers to :confval:`exclude_patterns` to exclude extra files and
+ directories.
+* #2300: enhance autoclass:: to use the docstring of __new__ if __init__
+ method's is missing of empty
+* #2251: Previously, under glossary directives, multiple terms for one
+ definition are converted into single ``term`` node and the each terms in the
+ term node are separated by ``termsep`` node. In new implementation, each terms
+ are converted into individual ``term`` nodes and ``termsep`` node is removed.
+ By this change, output layout of every builders are changed a bit.
+* The default highlight language is now Python 3. This means that source code
+ is highlighted as Python 3 (which is mostly a superset of Python 2), and no
+ parsing is attempted to distinguish valid code. To get the old behavior back,
+ add ``highlight_language = "python"`` to conf.py.
+* `Locale Date Markup Language
+ <https://unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns>`_ like
+ ``"MMMM dd, YYYY"`` is default format for `today_fmt` and
+ `html_last_updated_fmt`. However strftime format like ``"%B %d, %Y"`` is also
+ supported for backward compatibility until Sphinx 1.5. Later format will be
+ disabled from Sphinx 1.5.
+* #2327: ``latex_use_parts`` is deprecated now. Use `latex_toplevel_sectioning`
+ instead.
+* #2337: Use ``\url{URL}`` macro instead of ``\href{URL}{URL}`` in LaTeX writer.
+* #1498: manpage writer: don't make whole of item in definition list bold if it
+ includes strong node.
+* #582: Remove hint message from quick search box for html output.
+* #2378: Sphinx now bundles newfloat.sty
+
+Features added
+--------------
+* #2092: add todo directive support in napoleon package.
+* #1962: when adding directives, roles or nodes from an extension, warn if such
+ an element is already present (built-in or added by another extension).
+* #1909: Add "doc" references to Intersphinx inventories.
+* C++ type alias support (e.g., ``.. type:: T = int``).
+* C++ template support for classes, functions, type aliases, and variables
+ (#1729, #1314).
+* C++, added new scope management directives ``namespace-push`` and
+ ``namespace-pop``.
+* #1970: Keyboard shortcuts to navigate Next and Previous topics
+* Intersphinx: Added support for fetching Intersphinx inventories with URLs
+ using HTTP basic auth.
+* C++, added support for template parameter in function info field lists.
+* C++, added support for pointers to member (function).
+* #2113: Allow ``:class:`` option to code-block directive.
+* #2192: Imgmath (pngmath with svg support).
+* #2200: Support XeTeX and LuaTeX for the LaTeX builder.
+* #1906: Use xcolor over color for \fcolorbox where available for LaTeX output.
+* #2216: Texinputs makefile improvements.
+* #2170: Support for Chinese language search index.
+* #2214: Add sphinx.ext.githubpages to publish the docs on GitHub Pages
+* #1030: Make page reference names for latex_show_pagerefs translatable
+* #2162: Add Sphinx.add_source_parser() to add source_suffix and source_parsers
+ from extension
+* #2207: Add sphinx.parsers.Parser class; a base class for new parsers
+* #656: Add ``graphviz_dot`` option to graphviz directives to switch the ``dot``
+ command
+* #1939: Added the ``dummy`` builder: syntax check without output.
+* #2230: Add ``math_number_all`` option to number all displayed math in math
+ extensions
+* #2235: ``needs_sphinx`` supports micro version comparison
+* #2282: Add "language" attribute to html tag in the "basic" theme
+* #1779: Add EPUB 3 builder
+* #1751: Add :confval:`todo_link_only` to avoid file path and line indication on
+ :rst:dir:`todolist`. Thanks to Francesco Montesano.
+* #2199: Use ``imagesize`` package to obtain size of images.
+* #1099: Add configurable retries to the linkcheck builder. Thanks to Alex
+ Gaynor. Also don't check anchors starting with ``!``.
+* #2300: enhance autoclass:: to use the docstring of __new__ if __init__
+ method's is missing of empty
+* #1858: Add Sphinx.add_enumerable_node() to add enumerable nodes for numfig
+ feature
+* #1286, #2099: Add ``sphinx.ext.autosectionlabel`` extension to allow reference
+ sections using its title. Thanks to Tadhg O'Higgins.
+* #1854: Allow to choose Janome for Japanese splitter.
+* #1853: support custom text splitter on html search with ``language='ja'``.
+* #2320: classifier of glossary terms can be used for index entries grouping key
+ The classifier also be used for translation. See also
+ :ref:`glossary-directive`.
+* #2308: Define ``\tablecontinued`` macro to redefine the style of continued
+ label for longtables.
+* Select an image by similarity if multiple images are globbed by
+ ``.. image:: filename.*``
+* #1921: Support figure substitutions by :confval:`language` and
+ :confval:`figure_language_filename`
+* #2245: Add ``latex_elements["passoptionstopackages"]`` option to call
+ PassOptionsToPackages in early stage of preambles.
+* #2340: Math extension: support alignment of multiple equations for MathJax.
+* #2338: Define ``\titleref`` macro to redefine the style of ``title-reference``
+ roles.
+* Define ``\menuselection`` and ``\accelerator`` macros to redefine the style of
+ `menuselection` roles.
+* Define ``\crossref`` macro to redefine the style of references
+* #2301: Texts in the classic html theme should be hyphenated.
+* #2355: Define ``\termref`` macro to redefine the style of ``term`` roles.
+* Add :confval:`suppress_warnings` to suppress arbitrary warning message
+ (experimental)
+* #2229: Fix no warning is given for unknown options
+* #2327: Add `latex_toplevel_sectioning` to switch the top level sectioning of
+ LaTeX document.
+
+Bugs fixed
+----------
+* #1913: C++, fix assert bug for enumerators in next-to-global and global scope.
+* C++, fix parsing of 'signed char' and 'unsigned char' as types.
+* C++, add missing support for 'friend' functions.
+* C++, add missing support for virtual base classes (thanks to Rapptz).
+* C++, add support for final classes.
+* C++, fix parsing of types prefixed with 'enum'.
+* #2023: Dutch search support uses Danish stemming info.
+* C++, add support for user-defined literals.
+* #1804: Now html output wraps overflowed long-line-text in the sidebar. Thanks
+ to Hassen ben tanfous.
+* #2183: Fix porterstemmer causes ``make json`` to fail.
+* #1899: Ensure list is sent to OptParse.
+* #2164: Fix wrong check for pdftex inside sphinx.sty (for graphicx package
+ option).
+* #2165, #2218: Remove faulty and non-need conditional from sphinx.sty.
+* Fix broken LaTeX code is generated if unknown language is given
+* #1944: Fix rst_prolog breaks file-wide metadata
+* #2074: make gettext should use canonical relative paths for .pot. Thanks to
+ anatoly techtonik.
+* #2311: Fix sphinx.ext.inheritance_diagram raises AttributeError
+* #2251: Line breaks in .rst files are transferred to .pot files in a wrong way.
+* #794: Fix date formatting in latex output is not localized
+* Remove ``image/gif`` from supported_image_types of LaTeX writer (#2272)
+* Fix ValueError is raised if LANGUAGE is empty string
+* Fix unpack warning is shown when the directives generated from
+ ``Sphinx.add_crossref_type`` is used
+* The default highlight language is now ``default``. This means that source
+ code is highlighted as Python 3 (which is mostly a superset of Python 2) if
+ possible. To get the old behavior back, add ``highlight_language = "python"``
+ to conf.py.
+* #2329: Refresh environment forcedly if source directory has changed.
+* #2331: Fix code-blocks are filled by block in dvi; remove ``xcdraw`` option
+ from xcolor package
+* Fix the confval type checker emits warnings if unicode is given to confvals
+ which expects string value
+* #2360: Fix numref in LaTeX output is broken
+* #2361: Fix additional paragraphs inside the "compound" directive are indented
+* #2364: Fix KeyError 'rootSymbol' on Sphinx upgrade from older version.
+* #2348: Move amsmath and amssymb to before fontpkg on LaTeX writer.
+* #2368: Ignore emacs lock files like ``.#foo.rst`` by default.
+* #2262: literal_block and its caption has been separated by pagebreak in LaTeX
+ output.
+* #2319: Fix table counter is overridden by code-block's in LaTeX. Thanks to
+ jfbu.
+* Fix unpack warning if combined with 3rd party domain extensions.
+* #1153: Fix figures in sidebar causes latex build error.
+* #2358: Fix user-preamble could not override the tocdepth definition.
+* #2358: Reduce tocdepth if ``part`` or ``chapter`` is used for top_sectionlevel
+* #2351: Fix footnote spacing
+* #2363: Fix ``toctree()`` in templates generates broken links in
+ SingleHTMLBuilder.
+* #2366: Fix empty hyperref is generated on toctree in HTML builder.
+
+Documentation
+-------------
+
+* #1757: Fix for usage of :confval:`html_last_updated_fmt`. Thanks to Ralf
+ Hemmecke.
+
+
+Release 1.3.6 (released Feb 29, 2016)
+=====================================
+
+Features added
+--------------
+
+* #1873, #1876, #2278: Add ``page_source_suffix`` html context variable. This
+ should be introduced with :confval:`source_parsers` feature. Thanks for Eric
+ Holscher.
+
+
+Bugs fixed
+----------
+
+* #2265: Fix babel is used in spite of disabling it on ``latex_elements``
+* #2295: Avoid mutating dictionary errors while enumerating members in autodoc
+ with Python 3
+* #2291: Fix pdflatex "Counter too large" error from footnotes inside tables of
+ contents
+* #2292: Fix some footnotes disappear from LaTeX output
+* #2287: ``sphinx.transforms.Locale`` always uses rst parser. Sphinx i18n
+ feature should support parsers that specified source_parsers.
+* #2290: Fix ``sphinx.ext.mathbase`` use of amsfonts may break user choice of
+ math fonts
+* #2324: Print a hint how to increase the recursion limit when it is hit.
+* #1565, #2229: Revert new warning; the new warning will be triggered from
+ version 1.4 on.
+* #2329: Refresh environment forcedly if source directory has changed.
+* #2019: Fix the domain objects in search result are not escaped
+
+Release 1.3.5 (released Jan 24, 2016)
+=====================================
+
+Bugs fixed
+----------
+
+* Fix line numbers was not shown on warnings in LaTeX and texinfo builders
+* Fix filenames were not shown on warnings of citations
+* Fix line numbers was not shown on warnings in LaTeX and texinfo builders
+* Fix line numbers was not shown on warnings of indices
+* #2026: Fix LaTeX builder raises error if parsed-literal includes links
+* #2243: Ignore strange docstring types for classes, do not crash
+* #2247: Fix #2205 breaks make html for definition list with classifiers
+ that contains regular-expression like string
+* #1565: Sphinx will now emit a warning that highlighting was skipped if the
+ syntax is incorrect for `code-block`, `literalinclude` and so on.
+* #2211: Fix paragraphs in table cell doesn't work in Latex output
+* #2253: ``:pyobject:`` option of ``literalinclude`` directive can't detect
+ indented body block when the block starts with blank or comment lines.
+* Fix TOC is not shown when no ``:maxdepth:`` for toctrees (ref: #771)
+* Fix warning message for ``:numref:`` if target is in orphaned doc (ref: #2244)
+
+Release 1.3.4 (released Jan 12, 2016)
+=====================================
+
+Bugs fixed
+----------
+
+* #2134: Fix figure caption with reference causes latex build error
+* #2094: Fix rubric with reference not working in Latex
+* #2147: Fix literalinclude code in latex does not break in pages
+* #1833: Fix email addresses is showed again if latex_show_urls is not None
+* #2176: sphinx.ext.graphviz: use <object> instead of <img> to embed svg
+* #967: Fix SVG inheritance diagram is not hyperlinked (clickable)
+* #1237: Fix footnotes not working in definition list in LaTeX
+* #2168: Fix raw directive does not work for text writer
+* #2171: Fix cannot linkcheck url with unicode
+* #2182: LaTeX: support image file names with more than 1 dots
+* #2189: Fix previous sibling link for first file in subdirectory uses last
+ file, not intended previous from root toctree
+* #2003: Fix decode error under python2 (only) when ``make linkcheck`` is run
+* #2186: Fix LaTeX output of \mathbb in math
+* #1480, #2188: LaTeX: Support math in section titles
+* #2071: Fix same footnote in more than two section titles => LaTeX/PDF Bug
+* #2040: Fix UnicodeDecodeError in sphinx-apidoc when author contains non-ascii
+ characters
+* #2193: Fix shutil.SameFileError if source directory and destination directory
+ are same
+* #2178: Fix unparsable C++ cross-reference when referencing a function with
+ :cpp:any:
+* #2206: Fix Sphinx latex doc build failed due to a footnotes
+* #2201: Fix wrong table caption for tables with over 30 rows
+* #2213: Set <blockquote> in the classic theme to fit with <p>
+* #1815: Fix linkcheck does not raise an exception if warniserror set to true
+ and link is broken
+* #2197: Fix slightly cryptic error message for missing index.rst file
+* #1894: Unlisted phony targets in quickstart Makefile
+* #2125: Fix unifies behavior of collapsed fields (``GroupedField`` and
+ ``TypedField``)
+* #1408: Check latex_logo validity before copying
+* #771: Fix latex output doesn't set tocdepth
+* #1820: On Windows, console coloring is broken with colorama version 0.3.3.
+ Now sphinx use colorama>=0.3.5 to avoid this problem.
+* #2072: Fix footnotes in chapter-titles do not appear in PDF output
+* #1580: Fix paragraphs in longtable don't work in Latex output
+* #1366: Fix centered image not centered in latex
+* #1860: Fix man page using ``:samp:`` with braces - font doesn't reset
+* #1610: Sphinx crashes in Japanese indexing in some systems
+* Fix Sphinx crashes if mecab initialization failed
+* #2160: Fix broken TOC of PDFs if section includes an image
+* #2172: Fix dysfunctional admonition ``\py@lightbox`` in sphinx.sty. Thanks to
+ jfbu.
+* #2198,#2205: ``make gettext`` generate broken msgid for definition lists.
+* #2062: Escape characters in doctests are treated incorrectly with Python 2.
+* #2225: Fix if the option does not begin with dash, linking is not performed
+* #2226: Fix math is not HTML-encoded when :nowrap: is given (jsmath, mathjax)
+* #1601, #2220: 'any' role breaks extended domains behavior. Affected extensions
+ doesn't support resolve_any_xref and resolve_xref returns problematic node
+ instead of None. sphinxcontrib-httpdomain is one of them.
+* #2229: Fix no warning is given for unknown options
+
+Release 1.3.3 (released Dec 2, 2015)
+====================================
+
+Bugs fixed
+----------
+
+* #2177: Fix parallel hangs
+* #2012: Fix exception occurred if ``numfig_format`` is invalid
+* #2142: Provide non-minified JS code in ``sphinx/search/non-minified-js/*.js``
+ for source distribution on PyPI.
+* #2148: Error while building devhelp target with non-ASCII document.
+
+
+Release 1.3.2 (released Nov 29, 2015)
+=====================================
+
+Features added
+--------------
+
+* #1935: Make "numfig_format" overridable in latex_elements.
+
+Bugs fixed
+----------
+
+* #1976: Avoid "2.0" version of Babel because it doesn't work with Windows
+ environment.
+* Add a "default.css" stylesheet (which imports "classic.css") for compatibility
+* #1788: graphviz extension raises exception when caption option is present.
+* #1789: ``:pyobject:`` option of ``literalinclude`` directive includes
+ following lines after class definitions
+* #1790: ``literalinclude`` strips empty lines at the head and tail
+* #1802: load plugin themes automatically when theme.conf use it as 'inherit'.
+ Thanks to Takayuki Hirai.
+* #1794: custom theme extended from alabaster or sphinx_rtd_theme can't find
+ base theme.
+* #1834: compatibility for docutils-0.13: handle_io_errors keyword argument for
+ docutils.io.FileInput cause TypeError.
+* #1823: '.' as <module_path> for sphinx-apidoc cause an unfriendly error. Now
+ '.' is converted to absolute path automatically.
+* Fix a crash when setting up extensions which do not support metadata.
+* #1784: Provide non-minified JS code in ``sphinx/search/non-minified-js/*.js``
+* #1822, #1892: Fix regression for #1061. autosummary can't generate doc for
+ imported members since Sphinx 1.3b3. Thanks to Eric Larson.
+* #1793, #1819: "see also" misses a linebreak in text output. Thanks to Takayuki
+ Hirai.
+* #1780, #1866: "make text" shows "class" keyword twice. Thanks to Takayuki
+ Hirai.
+* #1871: Fix for LaTeX output of tables with one column and multirows.
+* Work around the lack of the HTMLParserError exception in Python 3.5.
+* #1949: Use ``safe_getattr`` in the coverage builder to avoid aborting with
+ descriptors that have custom behavior.
+* #1915: Do not generate smart quotes in doc field type annotations.
+* #1796: On py3, automated .mo building caused UnicodeDecodeError.
+* #1923: Use babel features only if the babel latex element is nonempty.
+* #1942: Fix a KeyError in websupport.
+* #1903: Fix strange id generation for glossary terms.
+* ``make text`` will crush if a definition list item has more than 1 classifiers
+ as: ``term : classifier1 : classifier2``.
+* #1855: make gettext generates broken po file for definition lists with
+ classifier.
+* #1869: Fix problems when dealing with files containing non-ASCII characters.
+ Thanks to Marvin Schmidt.
+* #1798: Fix building LaTeX with references in titles.
+* #1725: On py2 environment, doctest with using non-ASCII characters causes
+ ``'ascii' codec can't decode byte`` exception.
+* #1540: Fix RuntimeError with circular referenced toctree
+* #1983: i18n translation feature breaks references which uses section name.
+* #1990: Use caption of toctree to title of \tableofcontents in LaTeX
+* #1987: Fix ampersand is ignored in ``:menuselection:`` and ``:guilabel:``
+ on LaTeX builder
+* #1994: More supporting non-standard parser (like recommonmark parser) for
+ Translation and WebSupport feature. Now node.rawsource is fall backed to
+ node.astext() during docutils transforming.
+* #1989: "make blahblah" on Windows indicate help messages for sphinx-build
+ every time. It was caused by wrong make.bat that generated by
+ Sphinx 1.3.0/1.3.1.
+* On Py2 environment, conf.py that is generated by sphinx-quickstart should have
+ u prefixed config value for 'version' and 'release'.
+* #2102: On Windows + Py3, using ``|today|`` and non-ASCII date format will
+ raise UnicodeEncodeError.
+* #1974: UnboundLocalError: local variable 'domain' referenced before assignment
+ when using `any` role and `sphinx.ext.intersphinx` in same time.
+* #2121: multiple words search doesn't find pages when words across on the page
+ title and the page content.
+* #1884, #1885: plug-in html themes cannot inherit another plug-in theme. Thanks
+ to Suzumizaki.
+* #1818: `sphinx.ext.todo` directive generates broken html class attribute as
+ 'admonition-' when :confval:`language` is specified with non-ASCII linguistic
+ area like 'ru' or 'ja'. To fix this, now ``todo`` directive can use
+ ``:class:`` option.
+* #2140: Fix footnotes in table has broken in LaTeX
+* #2127: MecabBinder for html searching feature doesn't work with Python 3.
+ Thanks to Tomoko Uchida.
+
+
+Release 1.3.1 (released Mar 17, 2015)
+=====================================
+
+Bugs fixed
+----------
+
+* #1769: allows generating quickstart files/dirs for destination dir that
+ doesn't overwrite existent files/dirs. Thanks to WAKAYAMA shirou.
+* #1773: sphinx-quickstart doesn't accept non-ASCII character as a option
+ argument.
+* #1766: the message "least Python 2.6 to run" is at best misleading.
+* #1772: cross reference in docstrings like ``:param .write:`` breaks building.
+* #1770, #1774: ``literalinclude`` with empty file occurs exception. Thanks to
+ Takayuki Hirai.
+* #1777: Sphinx 1.3 can't load extra theme. Thanks to tell-k.
+* #1776: ``source_suffix = ['.rst']`` cause unfriendly error on prior version.
+* #1771: automated .mo building doesn't work properly.
+* #1783: Autodoc: Python2 Allow unicode string in __all__.
+ Thanks to Jens Hedegaard Nielsen.
+* #1781: Setting `html_domain_indices` to a list raises a type check warnings.
+
+
+Release 1.3 (released Mar 10, 2015)
+===================================
+
+Incompatible changes
+--------------------
+
+* Roles ``ref``, ``term`` and ``menusel`` now don't generate :durole:`emphasis`
+ nodes anymore. If you want to keep italic style, adapt your stylesheet.
+* Role ``numref`` uses ``%s`` as special character to indicate position of
+ figure numbers instead ``#`` symbol.
+
+Features added
+--------------
+
+* Add convenience directives and roles to the C++ domain:
+ directive ``cpp:var`` as alias for ``cpp:member``, role ``:cpp:var`` as alias
+ for ``:cpp:member``, and role `any` for cross-reference to any C++
+ declaraction. #1577, #1744
+* The :confval:`source_suffix` config value can now be a list of multiple
+ suffixes.
+* Add the ability to specify source parsers by source suffix with the
+ :confval:`source_parsers` config value.
+* #1675: A new builder, AppleHelpBuilder, has been added that builds Apple
+ Help Books.
+
+Bugs fixed
+----------
+
+* 1.3b3 change breaks a previous gettext output that contains duplicated
+ msgid such as "foo bar" and "version changes in 1.3: foo bar".
+* #1745: latex builder cause maximum recursion depth exceeded when a
+ footnote has a footnote mark itself.
+* #1748: SyntaxError in sphinx/ext/ifconfig.py with Python 2.6.
+* #1658, #1750: No link created (and warning given) if option does not
+ begin with -, / or +. Thanks to Takayuki Hirai.
+* #1753: C++, added missing support for more complex declarations.
+* #1700: Add ``:caption:`` option for :rst:dir:`toctree`.
+* #1742: ``:name:`` option is provided for :rst:dir:`toctree`,
+ :rst:dir:`code-block` and :rst:dir:`literalinclude` directives.
+* #1756: Incorrect section titles in search that was introduced from 1.3b3.
+* #1746: C++, fixed name lookup procedure, and added missing lookups in
+ declarations.
+* #1765: C++, fix old id generation to use fully qualified names.
+
+Documentation
+-------------
+
+* #1651: Add ``vartype`` field description for python domain.
+
+
+Release 1.3b3 (released Feb 24, 2015)
+=====================================
+
+Incompatible changes
+--------------------
+
+* Dependency requirement updates: docutils 0.11, Pygments 2.0
+* The ``gettext_enables`` config value has been renamed to
+ `gettext_additional_targets`.
+* #1735: Use https://docs.python.org/ instead of ``http`` protocol.
+ It was used for `sphinx.ext.intersphinx` and some documentation.
+
+Features added
+--------------
+
+* #1346: Add new default theme;
+
+ * Add 'alabaster' theme.
+ * Add 'sphinx_rtd_theme' theme.
+ * The 'default' html theme has been renamed to 'classic'. 'default' is still
+ available, however it will emit notice a recommendation that using new
+ 'alabaster' theme.
+
+* Added ``highlight_options`` configuration value.
+* The ``language`` config value is now available in the HTML templates.
+* The ``env-updated`` event can now return a value, which is interpreted
+ as an iterable of additional docnames that need to be rewritten.
+* #772: Support for scoped and unscoped enums in C++. Enumerators in unscoped
+ enums are injected into the parent scope in addition to the enum scope.
+* Add ``todo_include_todos`` config option to quickstart conf file, handled as
+ described in documentation.
+* HTML breadcrumb items tag has class "nav-item" and "nav-item-N" (like
+ nav-item-0, 1, 2...).
+* New option `sphinx-quickstart --use-make-mode` for generating Makefile that
+ use sphinx-build make-mode.
+* #1235: i18n: several node can be translated if it is set to
+ `gettext_additional_targets` in conf.py. Supported nodes are:
+
+ - 'literal-block'
+ - 'doctest-block'
+ - 'raw'
+ - 'image'
+
+* #1227: Add `html_scaled_image_link` config option to conf.py, to control
+ scaled image link.
+
+Bugs fixed
+----------
+
+* LaTeX writer now generates correct markup for cells spanning multiple rows.
+* #1674: Do not crash if a module's ``__all__`` is not a list of strings.
+* #1629: Use VerbatimBorderColor to add frame to code-block in LaTeX
+* On windows, make-mode didn't work on Win32 platform if sphinx was invoked as
+ ``python sphinx-build.py``.
+* #1687: linkcheck now treats 401 Unauthorized responses as "working".
+* #1690: toctrees with ``glob`` option now can also contain entries for single
+ documents with explicit title.
+* #1591: html search results for C++ elements now has correct interpage links.
+* bizstyle theme: nested long title pages make long breadcrumb that breaks page
+ layout.
+* bizstyle theme: all breadcrumb items become 'Top' on some mobile browser
+ (iPhone5s safari).
+* #1722: restore ``toctree()`` template function behavior that was changed at
+ 1.3b1.
+* #1732: i18n: localized table caption raises exception.
+* #1718: ``:numref:`` does not work with capital letters in the label
+* #1630: resolve CSS conflicts, ``div.container`` css target for literal block
+ wrapper now renamed to ``div.literal-block-wrapper``.
+* ``sphinx.util.pycompat`` has been restored in its backwards-compatibility;
+ slated for removal in Sphinx 1.4.
+* #1719: LaTeX writer does not respect ``numref_format`` option in captions
+
+
+Release 1.3b2 (released Dec 5, 2014)
+====================================
+
+Incompatible changes
+--------------------
+
+* update bundled ez_setup.py for setuptools-7.0 that requires Python 2.6 or
+ later.
+
+Features added
+--------------
+
+* #1597: Added possibility to return a new template name from
+ `html-page-context`.
+* PR#314, #1150: Configuration values are now checked for their type. A
+ warning is raised if the configured and the default value do not have the
+ same type and do not share a common non-trivial base class.
+
+Bugs fixed
+----------
+
+* PR#311: sphinx-quickstart does not work on python 3.4.
+* Fix :confval:`autodoc_docstring_signature` not working with signatures
+ in class docstrings.
+* Rebuilding cause crash unexpectedly when source files were added.
+* #1607: Fix a crash when building latexpdf with "howto" class
+* #1251: Fix again. Sections which depth are lower than :tocdepth: should not
+ be shown on localtoc sidebar.
+* make-mode didn't work on Win32 platform if sphinx was installed by wheel
+ package.
+
+
+Release 1.3b1 (released Oct 10, 2014)
+=====================================
+
+Incompatible changes
+--------------------
+
+* Dropped support for Python 2.5, 3.1 and 3.2.
+* Dropped support for docutils versions up to 0.9.
+* Removed the ``sphinx.ext.oldcmarkup`` extension.
+* The deprecated config values ``exclude_trees``, ``exclude_dirnames`` and
+ ``unused_docs`` have been removed.
+* A new node, ``sphinx.addnodes.literal_strong``, has been added, for text that
+ should appear literally (i.e. no smart quotes) in strong font. Custom writers
+ will have to be adapted to handle this node.
+* PR#269, #1476: replace ``<tt>`` tag by ``<code>``. User customized stylesheets
+ should be updated If the css contain some styles for ``tt>`` tag.
+ Thanks to Takeshi Komiya.
+* #1543: `templates_path` is automatically added to
+ `exclude_patterns` to avoid reading autosummary rst templates in the
+ templates directory.
+* Custom domains should implement the new `Domain.resolve_any_xref`
+ method to make the `any` role work properly.
+* gettext builder: gettext doesn't emit uuid information to generated pot files
+ by default. Please set ``True`` to `gettext_uuid` to emit uuid information.
+ Additionally, if the ``python-levenshtein`` 3rd-party package is installed,
+ it will improve the calculation time.
+* gettext builder: disable extracting/apply 'index' node by default. Please set
+ 'index' to ``gettext_enables`` to enable extracting index entries.
+* PR#307: Add frame to code-block in LaTeX. Thanks to Takeshi Komiya.
+
+Features added
+--------------
+
+* Add support for Python 3.4.
+* Add support for docutils 0.12
+* Added ``sphinx.ext.napoleon`` extension for NumPy and Google style docstring
+ support.
+* Added support for parallel reading (parsing) of source files with the
+ `sphinx-build -j` option. Third-party extensions will need to be checked for
+ compatibility and may need to be adapted if they store information in the
+ build environment object. See `env-merge-info`.
+* Added the `any` role that can be used to find a cross-reference of
+ *any* type in *any* domain. Custom domains should implement the new
+ `Domain.resolve_any_xref` method to make this work properly.
+* Exception logs now contain the last 10 messages emitted by Sphinx.
+* Added support for extension versions (a string returned by ``setup()``, these
+ can be shown in the traceback log files). Version requirements for extensions
+ can be specified in projects using the new `needs_extensions` config
+ value.
+* Changing the default role within a document with the :dudir:`default-role`
+ directive is now supported.
+* PR#214: Added stemming support for 14 languages, so that the built-in document
+ search can now handle these. Thanks to Shibukawa Yoshiki.
+* PR#296, PR#303, #76: numfig feature: Assign numbers to figures, tables and
+ code-blocks. This feature is configured with `numfig`, `numfig_secnum_depth`
+ and `numfig_format`. Also `numref` role is available. Thanks to Takeshi
+ Komiya.
+* PR#202: Allow "." and "~" prefixed references in ``:param:`` doc fields
+ for Python.
+* PR#184: Add `autodoc_mock_imports`, allowing to mock imports of
+ external modules that need not be present when autodocumenting.
+* #925: Allow list-typed config values to be provided on the command line,
+ like ``-D key=val1,val2``.
+* #668: Allow line numbering of `code-block` and `literalinclude` directives
+ to start at an arbitrary line number, with a new ``lineno-start`` option.
+* PR#172, PR#266: The `code-block` and `literalinclude`
+ directives now can have a ``caption`` option that shows a filename before the
+ code in the output. Thanks to Nasimul Haque, Takeshi Komiya.
+* Prompt for the document language in sphinx-quickstart.
+* PR#217: Added config values to suppress UUID and location information in
+ generated gettext catalogs.
+* PR#236, #1456: apidoc: Add a -M option to put module documentation before
+ submodule documentation. Thanks to Wes Turner and Luc Saffre.
+* #1434: Provide non-minified JS files for jquery.js and underscore.js to
+ clarify the source of the minified files.
+* PR#252, #1291: Windows color console support. Thanks to meu31.
+* PR#255: When generating latex references, also insert latex target/anchor
+ for the ids defined on the node. Thanks to Olivier Heurtier.
+* PR#229: Allow registration of other translators. Thanks to Russell Sim.
+* Add app.set_translator() API to register or override a Docutils translator
+ class like ``html_translator_class``.
+* PR#267, #1134: add 'diff' parameter to literalinclude. Thanks to Richard Wall
+ and WAKAYAMA shirou.
+* PR#272: Added 'bizstyle' theme. Thanks to Shoji KUMAGAI.
+* Automatically compile ``*.mo`` files from ``*.po`` files when
+ `gettext_auto_build` is True (default) and ``*.po`` is newer than
+ ``*.mo`` file.
+* #623: `sphinx.ext.viewcode` supports imported function/class aliases.
+* PR#275: `sphinx.ext.intersphinx` supports multiple target for the
+ inventory. Thanks to Brigitta Sipocz.
+* PR#261: Added the `env-before-read-docs` event that can be connected to modify
+ the order of documents before they are read by the environment.
+* #1284: Program options documented with :rst:dir:`option` can now start with
+ ``+``.
+* PR#291: The caption of :rst:dir:`code-block` is recognized as a title of ref
+ target. Thanks to Takeshi Komiya.
+* PR#298: Add new API: :meth:`~sphinx.application.Sphinx.add_latex_package`.
+ Thanks to Takeshi Komiya.
+* #1344: add ``gettext_enables`` to enable extracting 'index' to gettext
+ catalog output / applying translation catalog to generated documentation.
+* PR#301, #1583: Allow the line numbering of the directive `literalinclude` to
+ match that of the included file, using a new ``lineno-match`` option. Thanks
+ to Jeppe Pihl.
+* PR#299: add various options to sphinx-quickstart. Quiet mode option
+ ``--quiet`` will skips wizard mode. Thanks to WAKAYAMA shirou.
+* #1623: Return types specified with ``:rtype:`` are now turned into links if
+ possible.
+
+Bugs fixed
+----------
+
+* #1438: Updated jQuery version from 1.8.3 to 1.11.1.
+* #1568: Fix a crash when a "centered" directive contains a reference.
+* Now sphinx.ext.autodoc works with python-2.5 again.
+* #1563: :meth:`~sphinx.application.Sphinx.add_search_language` raises
+ AssertionError for correct type of argument. Thanks to rikoman.
+* #1174: Fix smart quotes being applied inside roles like :rst:role:`program` or
+ `makevar`.
+* PR#235: comment db schema of websupport lacked a length of the node_id field.
+ Thanks to solos.
+* #1466,PR#241: Fix failure of the cpp domain parser to parse C+11
+ "variadic templates" declarations. Thanks to Victor Zverovich.
+* #1459,PR#244: Fix default mathjax js path point to ``http://`` that cause
+ mixed-content error on HTTPS server. Thanks to sbrandtb and robo9k.
+* PR#157: autodoc remove spurious signatures from @property decorated
+ attributes. Thanks to David Ham.
+* PR#159: Add coverage targets to quickstart generated Makefile and make.bat.
+ Thanks to Matthias Troffaes.
+* #1251: When specifying toctree :numbered: option and :tocdepth: metadata,
+ sub section number that is larger depth than ``:tocdepth:`` is shrunk.
+* PR#260: Encode underscore in citation labels for latex export. Thanks to
+ Lennart Fricke.
+* PR#264: Fix could not resolve xref for figure node with :name: option.
+ Thanks to Takeshi Komiya.
+* PR#265: Fix could not capture caption of graphviz node by xref. Thanks to
+ Takeshi Komiya.
+* PR#263, #1013, #1103: Rewrite of C++ domain. Thanks to Jakob Lykke Andersen.
+
+ * Hyperlinks to all found nested names and template arguments (#1103).
+ * Support for function types everywhere, e.g., in
+ std::function<bool(int, int)> (#1013).
+ * Support for virtual functions.
+ * Changed interpretation of function arguments to following standard
+ prototype declarations, i.e., void f(arg) means that arg is the type of the
+ argument, instead of it being the name.
+ * Updated tests.
+ * Updated documentation with elaborate description of what declarations are
+ supported and how the namespace declarations influence declaration and
+ cross-reference lookup.
+ * Index names may be different now. Elements are indexed by their fully
+ qualified name. It should be rather easy to change this behaviour and
+ potentially index by namespaces/classes as well.
+
+* PR#258, #939: Add dedent option for `code-block` and
+ `literalinclude`. Thanks to Zafar Siddiqui.
+* PR#268: Fix numbering section does not work at singlehtml mode. It still
+ ad-hoc fix because there is a issue that section IDs are conflicted.
+ Thanks to Takeshi Komiya.
+* PR#273, #1536: Fix RuntimeError with numbered circular toctree. Thanks to
+ Takeshi Komiya.
+* PR#274: Set its URL as a default title value if URL appears in toctree.
+ Thanks to Takeshi Komiya.
+* PR#276, #1381: `rfc` and `pep` roles support custom link
+ text. Thanks to Takeshi Komiya.
+* PR#277, #1513: highlights for function pointers in argument list of
+ `c:function`. Thanks to Takeshi Komiya.
+* PR#278: Fix section entries were shown twice if toctree has been put under
+ only directive. Thanks to Takeshi Komiya.
+* #1547: pgen2 tokenizer doesn't recognize ``...`` literal (Ellipsis for py3).
+* PR#294: On LaTeX builder, wrap float environment on writing literal_block
+ to avoid separation of caption and body. Thanks to Takeshi Komiya.
+* PR#295, #1520: ``make.bat latexpdf`` mechanism to ``cd`` back to the current
+ directory. Thanks to Peter Suter.
+* PR#297, #1571: Add imgpath property to all builders. It make easier to
+ develop builder extensions. Thanks to Takeshi Komiya.
+* #1584: Point to master doc in HTML "top" link.
+* #1585: Autosummary of modules broken in Sphinx 1.2.3.
+* #1610: Sphinx cause AttributeError when MeCab search option is enabled and
+ python-mecab is not installed.
+* #1674: Do not crash if a module's ``__all__`` is not a list of strings.
+* #1673: Fix crashes with :confval:`nitpick_ignore` and ``:doc:`` references.
+* #1686: ifconfig directive doesn't care about default config values.
+* #1642: Fix only one search result appearing in Chrome.
+
+Documentation
+-------------
+
+* Add clarification about the syntax of tags. (:file:`doc/markup/misc.rst`)
+
+
+Release 1.2.3 (released Sep 1, 2014)
+====================================
+
+Features added
+--------------
+
+* #1518: ``sphinx-apidoc`` command now has a ``--version`` option to show
+ version information and exit
+* New locales: Hebrew, European Portuguese, Vietnamese.
+
+Bugs fixed
+----------
+
+* #636: Keep straight single quotes in literal blocks in the LaTeX build.
+* #1419: Generated i18n sphinx.js files are missing message catalog entries
+ from '.js_t' and '.html'. The issue was introduced from Sphinx 1.1
+* #1363: Fix i18n: missing python domain's cross-references with currentmodule
+ directive or currentclass directive.
+* #1444: autosummary does not create the description from attributes docstring.
+* #1457: In python3 environment, make linkcheck cause "Can't convert 'bytes'
+ object to str implicitly" error when link target url has a hash part.
+ Thanks to Jorge_C.
+* #1467: Exception on Python3 if nonexistent method is specified by automethod
+* #1441: autosummary can't handle nested classes correctly.
+* #1499: With non-callable ``setup`` in a conf.py, now sphinx-build emits
+ a user-friendly error message.
+* #1502: In autodoc, fix display of parameter defaults containing backslashes.
+* #1226: autodoc, autosummary: importing setup.py by automodule will invoke
+ setup process and execute ``sys.exit()``. Now sphinx avoids SystemExit
+ exception and emits warnings without unexpected termination.
+* #1503: py:function directive generate incorrectly signature when specifying
+ a default parameter with an empty list ``[]``. Thanks to Geert Jansen.
+* #1508: Non-ASCII filename raise exception on make singlehtml, latex, man,
+ texinfo and changes.
+* #1531: On Python3 environment, docutils.conf with 'source_link=true' in the
+ general section cause type error.
+* PR#270, #1533: Non-ASCII docstring cause UnicodeDecodeError when uses with
+ inheritance-diagram directive. Thanks to WAKAYAMA shirou.
+* PR#281, PR#282, #1509: TODO extension not compatible with websupport. Thanks
+ to Takeshi Komiya.
+* #1477: gettext does not extract nodes.line in a table or list.
+* #1544: ``make text`` generates wrong table when it has empty table cells.
+* #1522: Footnotes from table get displayed twice in LaTeX. This problem has
+ been appeared from Sphinx 1.2.1 by #949.
+* #508: Sphinx every time exit with zero when is invoked from setup.py command.
+ ex. ``python setup.py build_sphinx -b doctest`` return zero even if doctest
+ failed.
+
+Release 1.2.2 (released Mar 2, 2014)
+====================================
+
+Bugs fixed
+----------
+
+* PR#211: When checking for existence of the `html_logo` file, check
+ the full relative path and not the basename.
+* PR#212: Fix traceback with autodoc and ``__init__`` methods without docstring.
+* PR#213: Fix a missing import in the setup command.
+* #1357: Option names documented by :rst:dir:`option` are now again allowed to
+ not start with a dash or slash, and referencing them will work correctly.
+* #1358: Fix handling of image paths outside of the source directory when using
+ the "wildcard" style reference.
+* #1374: Fix for autosummary generating overly-long summaries if first line
+ doesn't end with a period.
+* #1383: Fix Python 2.5 compatibility of sphinx-apidoc.
+* #1391: Actually prevent using "pngmath" and "mathjax" extensions at the same
+ time in sphinx-quickstart.
+* #1386: Fix bug preventing more than one theme being added by the entry point
+ mechanism.
+* #1370: Ignore "toctree" nodes in text writer, instead of raising.
+* #1364: Fix 'make gettext' fails when the '.. todolist::' directive is present.
+* #1367: Fix a change of PR#96 that break sphinx.util.docfields.Field.make_field
+ interface/behavior for ``item`` argument usage.
+
+Documentation
+-------------
+
+* Extended the :ref:`documentation about building extensions <dev-extensions>`.
+
+
+Release 1.2.1 (released Jan 19, 2014)
+=====================================
+
+Bugs fixed
+----------
+
+* #1335: Fix autosummary template overloading with exclamation prefix like
+ ``{% extends "!autosummary/class.rst" %}`` cause infinite recursive function
+ call. This was caused by PR#181.
+* #1337: Fix autodoc with ``autoclass_content="both"`` uses useless
+ ``object.__init__`` docstring when class does not have ``__init__``.
+ This was caused by a change for #1138.
+* #1340: Can't search alphabetical words on the HTML quick search generated
+ with language='ja'.
+* #1319: Do not crash if the `html_logo` file does not exist.
+* #603: Do not use the HTML-ized title for building the search index (that
+ resulted in "literal" being found on every page with a literal in the
+ title).
+* #751: Allow production lists longer than a page in LaTeX by using longtable.
+* #764: Always look for stopwords lowercased in JS search.
+* #814: autodoc: Guard against strange type objects that don't have
+ ``__bases__``.
+* #932: autodoc: Do not crash if ``__doc__`` is not a string.
+* #933: Do not crash if an :rst:role:`option` value is malformed (contains
+ spaces but no option name).
+* #908: On Python 3, handle error messages from LaTeX correctly in the pngmath
+ extension.
+* #943: In autosummary, recognize "first sentences" to pull from the docstring
+ if they contain uppercase letters.
+* #923: Take the entire LaTeX document into account when caching
+ pngmath-generated images. This rebuilds them correctly when
+ ``pngmath_latex_preamble`` changes.
+* #901: Emit a warning when using docutils' new "math" markup without a Sphinx
+ math extension active.
+* #845: In code blocks, when the selected lexer fails, display line numbers
+ nevertheless if configured.
+* #929: Support parsed-literal blocks in LaTeX output correctly.
+* #949: Update the tabulary.sty packed with Sphinx.
+* #1050: Add anonymous labels into ``objects.inv`` to be referenced via
+ :mod:`~sphinx.ext.intersphinx`.
+* #1095: Fix print-media stylesheet being included always in the "scrolls"
+ theme.
+* #1085: Fix current classname not getting set if class description has
+ ``:noindex:`` set.
+* #1181: Report option errors in autodoc directives more gracefully.
+* #1155: Fix autodocumenting C-defined methods as attributes in Python 3.
+* #1233: Allow finding both Python classes and exceptions with the "class" and
+ "exc" roles in intersphinx.
+* #1198: Allow "image" for the "figwidth" option of the :dudir:`figure`
+ directive as documented by docutils.
+* #1152: Fix pycode parsing errors of Python 3 code by including two grammar
+ versions for Python 2 and 3, and loading the appropriate version for the
+ running Python version.
+* #1017: Be helpful and tell the user when the argument to :rst:dir:`option`
+ does not match the required format.
+* #1345: Fix two bugs with `nitpick_ignore`; now you don't have to
+ remove the store environment for changes to have effect.
+* #1072: In the JS search, fix issues searching for upper-cased words by
+ lowercasing words before stemming.
+* #1299: Make behavior of the :rst:dir:`math` directive more consistent and
+ avoid producing empty environments in LaTeX output.
+* #1308: Strip HTML tags from the content of "raw" nodes before feeding it
+ to the search indexer.
+* #1249: Fix duplicate LaTeX page numbering for manual documents.
+* #1292: In the linkchecker, retry HEAD requests when denied by HTTP 405.
+ Also make the redirect code apparent and tweak the output a bit to be
+ more obvious.
+* #1285: Avoid name clashes between C domain objects and section titles.
+* #848: Always take the newest code in incremental rebuilds with the
+ :mod:`sphinx.ext.viewcode` extension.
+* #979, #1266: Fix exclude handling in ``sphinx-apidoc``.
+* #1302: Fix regression in :mod:`sphinx.ext.inheritance_diagram` when
+ documenting classes that can't be pickled.
+* #1316: Remove hard-coded ``font-face`` resources from epub theme.
+* #1329: Fix traceback with empty translation msgstr in .po files.
+* #1300: Fix references not working in translated documents in some instances.
+* #1283: Fix a bug in the detection of changed files that would try to access
+ doctrees of deleted documents.
+* #1330: Fix `exclude_patterns` behavior with subdirectories in the
+ `html_static_path`.
+* #1323: Fix emitting empty ``<ul>`` tags in the HTML writer, which is not
+ valid HTML.
+* #1147: Don't emit a sidebar search box in the "singlehtml" builder.
+
+Documentation
+-------------
+
+* #1325: Added a "Intersphinx" tutorial section. (:file:`doc/tutorial.rst`)
+
+
+Release 1.2 (released Dec 10, 2013)
+===================================
+
+Features added
+--------------
+
+* Added ``sphinx.version_info`` tuple for programmatic checking of the Sphinx
+ version.
+
+Incompatible changes
+--------------------
+
+* Removed the ``sphinx.ext.refcounting`` extension -- it is very specific to
+ CPython and has no place in the main distribution.
+
+Bugs fixed
+----------
+
+* Restore ``versionmodified`` CSS class for versionadded/changed and deprecated
+ directives.
+
+* PR#181: Fix ``html_theme_path = ['.']`` is a trigger of rebuild all documents
+ always (This change keeps the current "theme changes cause a rebuild"
+ feature).
+
+* #1296: Fix invalid charset in HTML help generated HTML files for default
+ locale.
+
+* PR#190: Fix gettext does not extract figure caption and rubric title inside
+ other blocks. Thanks to Michael Schlenker.
+
+* PR#176: Make sure setup_command test can always import Sphinx. Thanks to
+ Dmitry Shachnev.
+
+* #1311: Fix test_linkcode.test_html fails with C locale and Python 3.
+
+* #1269: Fix ResourceWarnings with Python 3.2 or later.
+
+* #1138: Fix: When ``autodoc_docstring_signature = True`` and
+ ``autoclass_content = 'init'`` or ``'both'``, __init__ line should be
+ removed from class documentation.
+
+
+Release 1.2 beta3 (released Oct 3, 2013)
+========================================
+
+Features added
+--------------
+
+* The Sphinx error log files will now include a list of the loaded extensions
+ for help in debugging.
+
+Incompatible changes
+--------------------
+
+* PR#154: Remove "sphinx" prefix from LaTeX class name except 'sphinxmanual'
+ and 'sphinxhowto'. Now you can use your custom document class without
+ 'sphinx' prefix. Thanks to Erik B.
+
+Bugs fixed
+----------
+
+* #1265: Fix i18n: crash when translating a section name that is pointed to from
+ a named target.
+* A wrong condition broke the search feature on first page that is usually
+ index.rst. This issue was introduced in 1.2b1.
+* #703: When Sphinx can't decode filenames with non-ASCII characters, Sphinx now
+ catches UnicodeError and will continue if possible instead of raising the
+ exception.
+
+
+Release 1.2 beta2 (released Sep 17, 2013)
+=========================================
+
+Features added
+--------------
+
+* ``apidoc`` now ignores "_private" modules by default, and has an option ``-P``
+ to include them.
+* ``apidoc`` now has an option to not generate headings for packages and
+ modules, for the case that the module docstring already includes a reST
+ heading.
+* PR#161: ``apidoc`` can now write each module to a standalone page instead of
+ combining all modules in a package on one page.
+* Builders: rebuild i18n target document when catalog updated.
+* Support docutils.conf 'writers' and 'html4css1 writer' section in the HTML
+ writer. The latex, manpage and texinfo writers also support their respective
+ 'writers' sections.
+* The new `html_extra_path` config value allows to specify directories
+ with files that should be copied directly to the HTML output directory.
+* Autodoc directives for module data and attributes now support an
+ ``annotation`` option, so that the default display of the data/attribute
+ value can be overridden.
+* PR#136: Autodoc directives now support an ``imported-members`` option to
+ include members imported from different modules.
+* New locales: Macedonian, Sinhala, Indonesian.
+* Theme package collection by using setuptools plugin mechanism.
+
+Incompatible changes
+--------------------
+
+* PR#144, #1182: Force timezone offset to LocalTimeZone on POT-Creation-Date
+ that was generated by gettext builder. Thanks to masklinn and Jakub Wilk.
+
+Bugs fixed
+----------
+
+* PR#132: Updated jQuery version to 1.8.3.
+* PR#141, #982: Avoid crash when writing PNG file using Python 3. Thanks to
+ Marcin Wojdyr.
+* PR#145: In parallel builds, sphinx drops second document file to write.
+ Thanks to tychoish.
+* PR#151: Some styling updates to tables in LaTeX.
+* PR#153: The "extensions" config value can now be overridden.
+* PR#155: Added support for some C++11 function qualifiers.
+* Fix: 'make gettext' caused UnicodeDecodeError when templates contain utf-8
+ encoded strings.
+* #828: use inspect.getfullargspec() to be able to document functions with
+ keyword-only arguments on Python 3.
+* #1090: Fix i18n: multiple cross references (term, ref, doc) in the same line
+ return the same link.
+* #1157: Combination of 'globaltoc.html' and hidden toctree caused exception.
+* #1159: fix wrong generation of objects inventory for Python modules, and
+ add a workaround in intersphinx to fix handling of affected inventories.
+* #1160: Citation target missing caused an AssertionError.
+* #1162, PR#139: singlehtml builder didn't copy images to _images/.
+* #1173: Adjust setup.py dependencies because Jinja2 2.7 discontinued
+ compatibility with Python < 3.3 and Python < 2.6. Thanks to Alexander Dupuy.
+* #1185: Don't crash when a Python module has a wrong or no encoding declared,
+ and non-ASCII characters are included.
+* #1188: sphinx-quickstart raises UnicodeEncodeError if "Project version"
+ includes non-ASCII characters.
+* #1189: "Title underline is too short" WARNING is given when using fullwidth
+ characters to "Project name" on quickstart.
+* #1190: Output TeX/texinfo/man filename has no basename (only extension)
+ when using non-ASCII characters in the "Project name" on quickstart.
+* #1192: Fix escaping problem for hyperlinks in the manpage writer.
+* #1193: Fix i18n: multiple link references in the same line return the same
+ link.
+* #1176: Fix i18n: footnote reference number missing for auto numbered named
+ footnote and auto symbol footnote.
+* PR#146,#1172: Fix ZeroDivisionError in parallel builds. Thanks to tychoish.
+* #1204: Fix wrong generation of links to local intersphinx targets.
+* #1206: Fix i18n: gettext did not translate admonition directive's title.
+* #1232: Sphinx generated broken ePub files on Windows.
+* #1259: Guard the debug output call when emitting events; to prevent the
+ repr() implementation of arbitrary objects causing build failures.
+* #1142: Fix NFC/NFD normalizing problem of rst filename on Mac OS X.
+* #1234: Ignoring the string consists only of white-space characters.
+
+
+Release 1.2 beta1 (released Mar 31, 2013)
+=========================================
+
+Incompatible changes
+--------------------
+
+* Removed ``sphinx.util.compat.directive_dwim()`` and
+ ``sphinx.roles.xfileref_role()`` which were deprecated since version 1.0.
+* PR#122: the files given in `latex_additional_files` now override TeX
+ files included by Sphinx, such as ``sphinx.sty``.
+* PR#124: the node generated by `versionadded`,
+ `versionchanged` and `deprecated` directives now includes
+ all added markup (such as "New in version X") as child nodes, and no
+ additional text must be generated by writers.
+* PR#99: the :rst:dir:`seealso` directive now generates admonition nodes instead
+ of the custom ``seealso`` node.
+
+Features added
+--------------
+
+* Markup
+
+ - The :rst:dir:`toctree` directive and the ``toctree()`` template function now
+ have an ``includehidden`` option that includes hidden toctree entries (bugs
+ #790 and #1047). A bug in the ``maxdepth`` option for the ``toctree()``
+ template function has been fixed (bug #1046).
+ - PR#99: Strip down seealso directives to normal admonitions. This removes
+ their unusual CSS classes (admonition-see-also), inconsistent LaTeX
+ admonition title ("See Also" instead of "See also"), and spurious
+ indentation in the text builder.
+
+* HTML builder
+
+ - #783: Create a link to full size image if it is scaled with width or height.
+ - #1067: Improve the ordering of the JavaScript search results: matches in
+ titles come before matches in full text, and object results are better
+ categorized. Also implement a pluggable search scorer.
+ - #1053: The "rightsidebar" and "collapsiblesidebar" HTML theme options now
+ work together.
+ - Update to jQuery 1.7.1 and Underscore.js 1.3.1.
+
+* Texinfo builder
+
+ - An "Index" node is no longer added when there are no entries.
+ - "deffn" categories are no longer capitalized if they contain capital
+ letters.
+ - ``desc_annotation`` nodes are now rendered.
+ - ``strong`` and ``emphasis`` nodes are now formatted like
+ ``literal``\s. The reason for this is because the standard Texinfo markup
+ (``*strong*`` and ``_emphasis_``) resulted in confusing output due to the
+ common usage of using these constructs for documenting parameter names.
+ - Field lists formatting has been tweaked to better display
+ "Info field lists".
+ - ``system_message`` and ``problematic`` nodes are now formatted in a similar
+ fashion as done by the text builder.
+ - "en-dash" and "em-dash" conversion of hyphens is no longer performed in
+ option directive signatures.
+ - ``@ref`` is now used instead of ``@pxref`` for cross-references which
+ prevents the word "see" from being added before the link (does not affect
+ the Info output).
+ - The ``@finalout`` command has been added for better TeX output.
+ - ``transition`` nodes are now formatted using underscores ("_") instead of
+ asterisks ("*").
+ - The default value for the ``paragraphindent`` has been changed from 2 to 0
+ meaning that paragraphs are no longer indented by default.
+ - #1110: A new configuration value `texinfo_no_detailmenu` has been
+ added for controlling whether a ``@detailmenu`` is added in the "Top"
+ node's menu.
+ - Detailed menus are no longer created except for the "Top" node.
+ - Fixed an issue where duplicate domain indices would result in invalid
+ output.
+
+* LaTeX builder:
+
+ - PR#115: Add ``'transition'`` item in `latex_elements` for
+ customizing how transitions are displayed. Thanks to Jeff Klukas.
+ - PR#114: The LaTeX writer now includes the "cmap" package by default. The
+ ``'cmappkg'`` item in `latex_elements` can be used to control this.
+ Thanks to Dmitry Shachnev.
+ - The ``'fontpkg'`` item in `latex_elements` now defaults to ``''``
+ when the :confval:`language` uses the Cyrillic script. Suggested by Dmitry
+ Shachnev.
+ - The `latex_documents`, `texinfo_documents`, and
+ `man_pages` configuration values will be set to default values based
+ on the :confval:`master_doc` if not explicitly set in :file:`conf.py`.
+ Previously, if these values were not set, no output would be generated by
+ their respective builders.
+
+* Internationalization:
+
+ - Add i18n capabilities for custom templates. For example: The Sphinx
+ reference documentation in doc directory provides a ``sphinx.pot`` file with
+ message strings from ``doc/_templates/*.html`` when using ``make gettext``.
+
+ - PR#61,#703: Add support for non-ASCII filename handling.
+
+* Other builders:
+
+ - Added the Docutils-native XML and pseudo-XML builders. See
+ :class:`~sphinx.builders.xml.XMLBuilder` and
+ :class:`~sphinx.builders.xml.PseudoXMLBuilder`.
+ - PR#45: The linkcheck builder now checks ``#anchor``\ s for existence.
+ - PR#123, #1106: Add `epub_use_index` configuration value. If
+ provided, it will be used instead of `html_use_index` for epub
+ builder.
+ - PR#126: Add `epub_tocscope` configuration value. The setting
+ controls the generation of the epub toc. The user can now also include
+ hidden toc entries.
+ - PR#112: Add `epub_show_urls` configuration value.
+
+* Extensions:
+
+ - PR#52: ``special_members`` flag to autodoc now behaves like ``members``.
+ - PR#47: Added :mod:`sphinx.ext.linkcode` extension.
+ - PR#25: In inheritance diagrams, the first line of the class docstring
+ is now the tooltip for the class.
+
+* Command-line interfaces:
+
+ - PR#75: Added ``--follow-links`` option to sphinx-apidoc.
+ - #869: sphinx-build now has the option ``-T`` for printing the full
+ traceback after an unhandled exception.
+ - sphinx-build now supports the standard ``--help`` and ``--version`` options.
+ - sphinx-build now provides more specific error messages when called with
+ invalid options or arguments.
+ - sphinx-build now has a verbose option ``-v`` which can be repeated for
+ greater effect. A single occurrence provides a slightly more verbose output
+ than normal. Two or more occurrences of this option provides more detailed
+ output which may be useful for debugging.
+
+* Locales:
+
+ - PR#74: Fix some Russian translation.
+ - PR#54: Added Norwegian bokmaal translation.
+ - PR#35: Added Slovak translation.
+ - PR#28: Added Hungarian translation.
+ - #1113: Add Hebrew locale.
+ - #1097: Add Basque locale.
+ - #1037: Fix typos in Polish translation. Thanks to Jakub Wilk.
+ - #1012: Update Estonian translation.
+
+* Optimizations:
+
+ - Speed up building the search index by caching the results of the word
+ stemming routines. Saves about 20 seconds when building the Python
+ documentation.
+ - PR#108: Add experimental support for parallel building with a new
+ :option:`sphinx-build -j` option.
+
+Documentation
+-------------
+
+* PR#88: Added the "Sphinx Developer's Guide" (:file:`doc/devguide.rst`)
+ which outlines the basic development process of the Sphinx project.
+* Added a detailed "Installing Sphinx" document (:file:`doc/install.rst`).
+
+Bugs fixed
+----------
+
+* PR#124: Fix paragraphs in versionmodified are ignored when it has no
+ dangling paragraphs. Fix wrong html output (nested ``<p>`` tag). Fix
+ versionmodified is not translatable. Thanks to Nozomu Kaneko.
+* PR#111: Respect add_autodoc_attrgetter() even when inherited-members is set.
+ Thanks to A. Jesse Jiryu Davis.
+* PR#97: Fix footnote handling in translated documents.
+* Fix text writer not handling visit_legend for figure directive contents.
+* Fix text builder not respecting wide/fullwidth characters: title underline
+ width, table layout width and text wrap width.
+* Fix leading space in LaTeX table header cells.
+* #1132: Fix LaTeX table output for multi-row cells in the first column.
+* #1128: Fix Unicode errors when trying to format time strings with a
+ non-standard locale.
+* #1127: Fix traceback when autodoc tries to tokenize a non-Python file.
+* #1126: Fix double-hyphen to en-dash conversion in wrong places such as
+ command-line option names in LaTeX.
+* #1123: Allow whitespaces in filenames given to `literalinclude`.
+* #1120: Added improvements about i18n for themes "basic", "haiku" and
+ "scrolls" that Sphinx built-in. Thanks to Leonardo J. Caballero G.
+* #1118: Updated Spanish translation. Thanks to Leonardo J. Caballero G.
+* #1117: Handle .pyx files in sphinx-apidoc.
+* #1112: Avoid duplicate download files when referenced from documents in
+ different ways (absolute/relative).
+* #1111: Fix failure to find uppercase words in search when
+ `html_search_language` is 'ja'. Thanks to Tomo Saito.
+* #1108: The text writer now correctly numbers enumerated lists with
+ non-default start values (based on patch by Ewan Edwards).
+* #1102: Support multi-context "with" statements in autodoc.
+* #1090: Fix gettext not extracting glossary terms.
+* #1074: Add environment version info to the generated search index to avoid
+ compatibility issues with old builds.
+* #1070: Avoid un-pickling issues when running Python 3 and the saved
+ environment was created under Python 2.
+* #1069: Fixed error caused when autodoc would try to format signatures of
+ "partial" functions without keyword arguments (patch by Artur Gaspar).
+* #1062: sphinx.ext.autodoc use __init__ method signature for class signature.
+* #1055: Fix web support with relative path to source directory.
+* #1043: Fix sphinx-quickstart asking again for yes/no questions because
+ ``input()`` returns values with an extra '\r' on Python 3.2.0 +
+ Windows. Thanks to Régis Décamps.
+* #1041: Fix failure of the cpp domain parser to parse a const type with a
+ modifier.
+* #1038: Fix failure of the cpp domain parser to parse C+11 "static constexpr"
+ declarations. Thanks to Jakub Wilk.
+* #1029: Fix intersphinx_mapping values not being stable if the mapping has
+ plural key/value set with Python 3.3.
+* #1028: Fix line block output in the text builder.
+* #1024: Improve Makefile/make.bat error message if Sphinx is not found. Thanks
+ to Anatoly Techtonik.
+* #1018: Fix "container" directive handling in the text builder.
+* #1015: Stop overriding jQuery contains() in the JavaScript.
+* #1010: Make pngmath images transparent by default; IE7+ should handle it.
+* #1008: Fix test failures with Python 3.3.
+* #995: Fix table-of-contents and page numbering for the LaTeX "howto" class.
+* #976: Fix gettext does not extract index entries.
+* PR#72: #975: Fix gettext not extracting definition terms before docutils 0.10.
+* #961: Fix LaTeX output for triple quotes in code snippets.
+* #958: Do not preserve ``environment.pickle`` after a failed build.
+* #955: Fix i18n transformation.
+* #940: Fix gettext does not extract figure caption.
+* #920: Fix PIL packaging issue that allowed to import ``Image`` without PIL
+ namespace. Thanks to Marc Schlaich.
+* #723: Fix the search function on local files in WebKit based browsers.
+* #440: Fix coarse timestamp resolution in some filesystem generating a wrong
+ list of outdated files.
+
+
+Release 1.1.3 (Mar 10, 2012)
+============================
+
+* PR#40: Fix ``safe_repr`` function to decode bytestrings with non-ASCII
+ characters correctly.
+
+* PR#37: Allow configuring sphinx-apidoc via ``SPHINX_APIDOC_OPTIONS``.
+
+* PR#34: Restore Python 2.4 compatibility.
+
+* PR#36: Make the "bibliography to TOC" fix in LaTeX output specific to
+ the document class.
+
+* #695: When the highlight language "python" is specified explicitly,
+ do not try to parse the code to recognize non-Python snippets.
+
+* #859: Fix exception under certain circumstances when not finding
+ appropriate objects to link to.
+
+* #860: Do not crash when encountering invalid doctest examples, just
+ emit a warning.
+
+* #864: Fix crash with some settings of :confval:`modindex_common_prefix`.
+
+* #862: Fix handling of ``-D`` and ``-A`` options on Python 3.
+
+* #851: Recognize and warn about circular toctrees, instead of running
+ into recursion errors.
+
+* #853: Restore compatibility with docutils trunk.
+
+* #852: Fix HtmlHelp index entry links again.
+
+* #854: Fix inheritance_diagram raising attribute errors on builtins.
+
+* #832: Fix crashes when putting comments or lone terms in a glossary.
+
+* #834, #818: Fix HTML help language/encoding mapping for all Sphinx
+ supported languages.
+
+* #844: Fix crashes when dealing with Unicode output in doctest extension.
+
+* #831: Provide ``--project`` flag in setup_command as advertised.
+
+* #875: Fix reading config files under Python 3.
+
+* #876: Fix quickstart test under Python 3.
+
+* #870: Fix spurious KeyErrors when removing documents.
+
+* #892: Fix single-HTML builder misbehaving with the master document in a
+ subdirectory.
+
+* #873: Fix assertion errors with empty ``only`` directives.
+
+* #816: Fix encoding issues in the Qt help builder.
+
+
+Release 1.1.2 (Nov 1, 2011) -- 1.1.1 is a silly version number anyway!
+======================================================================
+
+* #809: Include custom fixers in the source distribution.
+
+
+Release 1.1.1 (Nov 1, 2011)
+===========================
+
+* #791: Fix QtHelp, DevHelp and HtmlHelp index entry links.
+
+* #792: Include "sphinx-apidoc" in the source distribution.
+
+* #797: Don't crash on a misformatted glossary.
+
+* #801: Make intersphinx work properly without SSL support.
+
+* #805: Make the ``Sphinx.add_index_to_domain`` method work correctly.
+
+* #780: Fix Python 2.5 compatibility.
+
+
+Release 1.1 (Oct 9, 2011)
+=========================
+
+Incompatible changes
+--------------------
+
+* The `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 `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.
+ - #678: C++ domain now supports superclasses.
+
+* HTML builder:
+
+ - Added ``pyramid`` theme.
+ - #559: ``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 `testcleanup` blocks in the doctest extension.
+ - #594: `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 ``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.
+
+* Bugs fixed:
+
+ - #778: Fix "hide search matches" link on pages linked by search.
+ - Fix the source positions referenced by the "viewcode" extension.
+
+
+Release 1.0.8 (Sep 23, 2011)
+============================
+
+* #627: Fix tracebacks for AttributeErrors in autosummary generation.
+
+* Fix the ``abbr`` role when the abbreviation has newlines in it.
+
+* #727: Fix the links to search results with custom object types.
+
+* #648: Fix line numbers reported in warnings about undefined
+ references.
+
+* #696, #666: Fix C++ array definitions and template arguments
+ that are not type names.
+
+* #633: Allow footnotes in section headers in LaTeX output.
+
+* #616: Allow keywords to be linked via intersphinx.
+
+* #613: Allow Unicode characters in production list token names.
+
+* #720: Add dummy visitors for graphviz nodes for text and man.
+
+* #704: Fix image file duplication bug.
+
+* #677: Fix parsing of multiple signatures in C++ domain.
+
+* #637: Ignore Emacs lock files when looking for source files.
+
+* #544: Allow .pyw extension for importable modules in autodoc.
+
+* #700: Use ``$(MAKE)`` in quickstart-generated Makefiles.
+
+* #734: Make sidebar search box width consistent in browsers.
+
+* #644: Fix spacing of centered figures in HTML output.
+
+* #767: Safely encode SphinxError messages when printing them to
+ sys.stderr.
+
+* #611: Fix LaTeX output error with a document with no sections but
+ a link target.
+
+* Correctly treat built-in method descriptors as methods in autodoc.
+
+* #706: Stop monkeypatching the Python textwrap module.
+
+* #657: viewcode now works correctly with source files that have
+ non-ASCII encoding.
+
+* #669: Respect the ``noindex`` flag option in py:module directives.
+
+* #675: Fix IndexErrors when including nonexisting lines with
+ `literalinclude`.
+
+* #676: Respect custom function/method parameter separator strings.
+
+* #682: Fix JS incompatibility with jQuery >= 1.5.
+
+* #693: Fix double encoding done when writing HTMLHelp .hhk files.
+
+* #647: Do not apply SmartyPants in parsed-literal blocks.
+
+* C++ domain now supports array definitions.
+
+
+Release 1.0.7 (Jan 15, 2011)
+============================
+
+* #347: Fix wrong generation of directives of static methods in
+ autosummary.
+
+* #599: Import PIL as ``from PIL import Image``.
+
+* #558: Fix longtables with captions in LaTeX output.
+
+* Make token references work as hyperlinks again in LaTeX output.
+
+* #572: Show warnings by default when reference labels cannot be
+ found.
+
+* #536: Include line number when complaining about missing reference
+ targets in nitpicky mode.
+
+* #590: Fix inline display of graphviz diagrams in LaTeX output.
+
+* #589: Build using app.build() in setup command.
+
+* Fix a bug in the inheritance diagram exception that caused base
+ classes to be skipped if one of them is a builtin.
+
+* Fix general index links for C++ domain objects.
+
+* #332: Make admonition boundaries in LaTeX output visible.
+
+* #573: Fix KeyErrors occurring on rebuild after removing a file.
+
+* Fix a traceback when removing files with globbed toctrees.
+
+* If an autodoc object cannot be imported, always re-read the
+ document containing the directive on next build.
+
+* If an autodoc object cannot be imported, show the full traceback
+ of the import error.
+
+* Fix a bug where the removal of download files and images wasn't
+ noticed.
+
+* #571: Implement ``~`` cross-reference prefix for the C domain.
+
+* Fix regression of LaTeX output with the fix of #556.
+
+* #568: Fix lookup of class attribute documentation on descriptors
+ so that comment documentation now works.
+
+* Fix traceback with ``only`` directives preceded by targets.
+
+* Fix tracebacks occurring for duplicate C++ domain objects.
+
+* Fix JavaScript domain links to objects with ``$`` in their name.
+
+
+Release 1.0.6 (Jan 04, 2011)
+============================
+
+* #581: Fix traceback in Python domain for empty cross-reference
+ targets.
+
+* #283: Fix literal block display issues on Chrome browsers.
+
+* #383, #148: Support sorting a limited range of accented characters
+ in the general index and the glossary.
+
+* #570: Try decoding ``-D`` and ``-A`` command-line arguments with
+ the locale's preferred encoding.
+
+* #528: Observe `locale_dirs` when looking for the JS
+ translations file.
+
+* #574: Add special code for better support of Japanese documents
+ in the LaTeX builder.
+
+* Regression of #77: If there is only one parameter given with
+ ``:param:`` markup, the bullet list is now suppressed again.
+
+* #556: Fix missing paragraph breaks in LaTeX output in certain
+ situations.
+
+* #567: Emit the ``autodoc-process-docstring`` event even for objects
+ without a docstring so that it can add content.
+
+* #565: In the LaTeX builder, not only literal blocks require different
+ table handling, but also quite a few other list-like block elements.
+
+* #515: Fix tracebacks in the viewcode extension for Python objects
+ that do not have a valid signature.
+
+* Fix strange reports of line numbers for warnings generated from
+ autodoc-included docstrings, due to different behavior depending
+ on docutils version.
+
+* Several fixes to the C++ domain.
+
+
+Release 1.0.5 (Nov 12, 2010)
+============================
+
+* #557: Add CSS styles required by docutils 0.7 for aligned images
+ and figures.
+
+* In the Makefile generated by LaTeX output, do not delete pdf files
+ on clean; they might be required images.
+
+* #535: Fix LaTeX output generated for line blocks.
+
+* #544: Allow ``.pyw`` as a source file extension.
+
+
+Release 1.0.4 (Sep 17, 2010)
+============================
+
+* #524: Open intersphinx inventories in binary mode on Windows,
+ since version 2 contains zlib-compressed data.
+
+* #513: Allow giving non-local URIs for JavaScript files, e.g.
+ in the JSMath extension.
+
+* #512: Fix traceback when ``intersphinx_mapping`` is empty.
+
+
+Release 1.0.3 (Aug 23, 2010)
+============================
+
+* #495: Fix internal vs. external link distinction for links coming
+ from a docutils table-of-contents.
+
+* #494: Fix the ``maxdepth`` option for the ``toctree()`` template
+ callable when used with ``collapse=True``.
+
+* #507: Fix crash parsing Python argument lists containing brackets
+ in string literals.
+
+* #501: Fix regression when building LaTeX docs with figures that
+ don't have captions.
+
+* #510: Fix inheritance diagrams for classes that are not picklable.
+
+* #497: Introduce separate background color for the sidebar collapse
+ button, making it easier to see.
+
+* #502, #503, #496: Fix small layout bugs in several builtin themes.
+
+
+Release 1.0.2 (Aug 14, 2010)
+============================
+
+* #490: Fix cross-references to objects of types added by the
+ :func:`~sphinx.application.Sphinx.add_object_type` API function.
+
+* Fix handling of doc field types for different directive types.
+
+* Allow breaking long signatures, continuing with backlash-escaped
+ newlines.
+
+* Fix unwanted styling of C domain references (because of a namespace
+ clash with Pygments styles).
+
+* Allow references to PEPs and RFCs with explicit anchors.
+
+* #471: Fix LaTeX references to figures.
+
+* #482: When doing a non-exact search, match only the given type
+ of object.
+
+* #481: Apply non-exact search for Python reference targets with
+ ``.name`` for modules too.
+
+* #484: Fix crash when duplicating a parameter in an info field list.
+
+* #487: Fix setting the default role to one provided by the
+ ``oldcmarkup`` extension.
+
+* #488: Fix crash when json-py is installed, which provides a
+ ``json`` module but is incompatible to simplejson.
+
+* #480: Fix handling of target naming in intersphinx.
+
+* #486: Fix removal of ``!`` for all cross-reference roles.
+
+
+Release 1.0.1 (Jul 27, 2010)
+============================
+
+* #470: Fix generated target names for reST domain objects; they
+ are not in the same namespace.
+
+* #266: Add Bengali language.
+
+* #473: Fix a bug in parsing JavaScript object names.
+
+* #474: Fix building with SingleHTMLBuilder when there is no toctree.
+
+* Fix display names for objects linked to by intersphinx with
+ explicit targets.
+
+* Fix building with the JSON builder.
+
+* Fix hyperrefs in object descriptions for LaTeX.
+
+
+Release 1.0 (Jul 23, 2010)
+==========================
+
+Incompatible changes
+--------------------
+
+* Support for domains has been added. A domain is a collection of
+ directives and roles that all describe objects belonging together,
+ e.g. elements of a programming language. A few builtin domains are
+ provided:
+
+ - Python
+ - C
+ - C++
+ - JavaScript
+ - reStructuredText
+
+* The old markup for defining and linking to C directives is now
+ deprecated. It will not work anymore in future versions without
+ activating the ``oldcmarkup`` extension; in Sphinx
+ 1.0, it is activated by default.
+
+* Removed support for old dependency versions; requirements are now:
+
+ - docutils >= 0.5
+ - Jinja2 >= 2.2
+
+* Removed deprecated elements:
+
+ - ``exclude_dirs`` config value
+ - ``sphinx.builder`` module
+
+Features added
+--------------
+
+* General:
+
+ - Added a "nitpicky" mode that emits warnings for all missing
+ references. It is activated by the :option:`sphinx-build -n` command-line
+ switch or the :confval:`nitpicky` config value.
+ - Added ``latexpdf`` target in quickstart Makefile.
+
+* Markup:
+
+ - The `menuselection` and `guilabel` roles now
+ support ampersand accelerators.
+ - New more compact doc field syntax is now recognized: ``:param type
+ name: description``.
+ - Added ``tab-width`` option to `literalinclude` directive.
+ - Added ``titlesonly`` option to :rst:dir:`toctree` directive.
+ - Added the ``prepend`` and ``append`` options to the
+ `literalinclude` directive.
+ - #284: All docinfo metadata is now put into the document metadata, not
+ just the author.
+ - The `ref` role can now also reference tables by caption.
+ - The :dudir:`include` directive now supports absolute paths, which
+ are interpreted as relative to the source directory.
+ - In the Python domain, references like ``:func:`.name``` now look for
+ matching names with any prefix if no direct match is found.
+
+* Configuration:
+
+ - Added `rst_prolog` config value.
+ - Added `html_secnumber_suffix` config value to control
+ section numbering format.
+ - Added `html_compact_lists` config value to control
+ docutils' compact lists feature.
+ - The `html_sidebars` config value can now contain patterns
+ as keys, and the values can be lists that explicitly select which
+ sidebar templates should be rendered. That means that the builtin
+ sidebar contents can be included only selectively.
+ - `html_static_path` can now contain single file entries.
+ - The new universal config value `exclude_patterns` makes the
+ old ``unused_docs``, ``exclude_trees`` and
+ ``exclude_dirnames`` obsolete.
+ - Added `html_output_encoding` config value.
+ - Added the `latex_docclass` config value and made the
+ "twoside" documentclass option overridable by "oneside".
+ - Added the `trim_doctest_flags` config value, which is true
+ by default.
+ - Added `html_show_copyright` config value.
+ - Added `latex_show_pagerefs` and `latex_show_urls`
+ config values.
+ - The behavior of `html_file_suffix` changed slightly: the
+ empty string now means "no suffix" instead of "default suffix", use
+ ``None`` for "default suffix".
+
+* New builders:
+
+ - Added a builder for the Epub format.
+ - Added a builder for manual pages.
+ - Added a single-file HTML builder.
+
+* HTML output:
+
+ - Inline roles now get a CSS class with their name, allowing styles to
+ customize their appearance. Domain-specific roles get two classes,
+ ``domain`` and ``domain-rolename``.
+ - References now get the class ``internal`` if they are internal to
+ the whole project, as opposed to internal to the current page.
+ - External references can be styled differently with the new
+ ``externalrefs`` theme option for the default theme.
+ - In the default theme, the sidebar can experimentally now be made
+ collapsible using the new ``collapsiblesidebar`` theme option.
+ - #129: Toctrees are now wrapped in a ``div`` tag with class
+ ``toctree-wrapper`` in HTML output.
+ - The :data:`toctree` callable in templates now has a ``maxdepth``
+ keyword argument to control the depth of the generated tree.
+ - The :data:`toctree` callable in templates now accepts a
+ ``titles_only`` keyword argument.
+ - Added ``htmltitle`` block in layout template.
+ - In the JavaScript search, allow searching for object names including
+ the module name, like ``sys.argv``.
+ - Added new theme ``haiku``, inspired by the Haiku OS user guide.
+ - Added new theme ``nature``.
+ - Added new theme ``agogo``, created by Andi Albrecht.
+ - Added new theme ``scrolls``, created by Armin Ronacher.
+ - #193: Added a ``visitedlinkcolor`` theme option to the default
+ theme.
+ - #322: Improved responsiveness of the search page by loading the
+ search index asynchronously.
+
+* Extension API:
+
+ - Added :event:`html-collect-pages`.
+ - Added `needs_sphinx` config value and
+ :meth:`~sphinx.application.Sphinx.require_sphinx` application API
+ method.
+ - #200: Added :meth:`!add_stylesheet`
+ application API method.
+
+* Extensions:
+
+ - Added the :mod:`~sphinx.ext.viewcode` extension.
+ - Added the :mod:`~sphinx.ext.extlinks` extension.
+ - Added support for source ordering of members in autodoc, with
+ ``autodoc_member_order = 'bysource'``.
+ - Added `autodoc_default_flags` config value, which can be
+ used to select default flags for all autodoc directives.
+ - Added a way for intersphinx to refer to named labels in other
+ projects, and to specify the project you want to link to.
+ - #280: Autodoc can now document instance attributes assigned in
+ ``__init__`` methods.
+ - Many improvements and fixes to the :mod:`~sphinx.ext.autosummary`
+ extension, thanks to Pauli Virtanen.
+ - #309: The :mod:`~sphinx.ext.graphviz` extension can now output SVG
+ instead of PNG images, controlled by the
+ `graphviz_output_format` config value.
+ - Added ``alt`` option to :rst:dir:`graphviz` extension directives.
+ - Added ``exclude`` argument to :func:`.autodoc.between`.
+
+* Translations:
+
+ - Added Croatian translation, thanks to Bojan MihelaÄ.
+ - Added Turkish translation, thanks to Firat Ozgul.
+ - Added Catalan translation, thanks to Pau Fernández.
+ - Added simplified Chinese translation.
+ - Added Danish translation, thanks to Hjorth Larsen.
+ - Added Lithuanian translation, thanks to Dalius Dobravolskas.
+
+* Bugs fixed:
+
+ - #445: Fix links to result pages when using the search function
+ of HTML built with the ``dirhtml`` builder.
+ - #444: In templates, properly re-escape values treated with the
+ "striptags" Jinja filter.
+
+
+Release 0.6.7 (Jun 05, 2010)
+============================
+
+* #440: Remove usage of a Python >= 2.5 API in the ``literalinclude``
+ directive.
+
+* Fix a bug that prevented some references being generated in the
+ LaTeX builder.
+
+* #428: Add some missing CSS styles for standard docutils classes.
+
+* #432: Fix UnicodeErrors while building LaTeX in translated locale.
+
+
+Release 0.6.6 (May 25, 2010)
+============================
+
+* Handle raw nodes in the ``text`` writer.
+
+* Fix a problem the Qt help project generated by the ``qthelp``
+ builder that would lead to no content being displayed in the Qt
+ Assistant.
+
+* #393: Fix the usage of Unicode characters in mathematic formulas
+ when using the ``pngmath`` extension.
+
+* #404: Make ``\and`` work properly in the author field of the
+ ``latex_documents`` setting.
+
+* #409: Make the ``highlight_language`` config value work properly
+ in the LaTeX builder.
+
+* #418: Allow relocation of the translation JavaScript files to
+ the system directory on Unix systems.
+
+* #414: Fix handling of Windows newlines in files included with
+ the ``literalinclude`` directive.
+
+* #377: Fix crash in linkcheck builder.
+
+* #387: Fix the display of search results in ``dirhtml`` output.
+
+* #376: In autodoc, fix display of parameter defaults containing
+ backslashes.
+
+* #370: Fix handling of complex list item labels in LaTeX output.
+
+* #374: Make the ``doctest_path`` config value of the doctest
+ extension actually work.
+
+* Fix the handling of multiple toctrees when creating the global
+ TOC for the ``toctree()`` template function.
+
+* Fix the handling of hidden toctrees when creating the global TOC
+ for the ``toctree()`` template function.
+
+* Fix the handling of nested lists in the text writer.
+
+* #362: In autodoc, check for the existence of ``__self__`` on
+ function objects before accessing it.
+
+* #353: Strip leading and trailing whitespace when extracting
+ search words in the search function.
+
+
+Release 0.6.5 (Mar 01, 2010)
+============================
+
+* In autodoc, fix the omission of some module members explicitly
+ documented using documentation comments.
+
+* #345: Fix cropping of sidebar scroll bar with ``stickysidebar``
+ option of the default theme.
+
+* #341: Always generate UNIX newlines in the quickstart Makefile.
+
+* #338: Fix running with ``-C`` under Windows.
+
+* In autodoc, allow customizing the signature of an object where
+ the built-in mechanism fails.
+
+* #331: Fix output for enumerated lists with start values in LaTeX.
+
+* Make the ``start-after`` and ``end-before`` options to the
+ ``literalinclude`` directive work correctly if not used together.
+
+* #321: Fix link generation in the LaTeX builder.
+
+
+Release 0.6.4 (Jan 12, 2010)
+============================
+
+* Improve the handling of non-Unicode strings in the configuration.
+
+* #316: Catch OSErrors occurring when calling graphviz with
+ arguments it doesn't understand.
+
+* Restore compatibility with Pygments >= 1.2.
+
+* #295: Fix escaping of hyperref targets in LaTeX output.
+
+* #302: Fix links generated by the ``:doc:`` role for LaTeX output.
+
+* #286: collect todo nodes after the whole document has been read;
+ this allows placing substitution references in todo items.
+
+* #294: do not ignore an explicit ``today`` config value in a
+ LaTeX build.
+
+* The ``alt`` text of inheritance diagrams is now much cleaner.
+
+* Ignore images in section titles when generating link captions.
+
+* #310: support exception messages in the ``testoutput`` blocks of
+ the ``doctest`` extension.
+
+* #293: line blocks are styled properly in HTML output.
+
+* #285: make the ``locale_dirs`` config value work again.
+
+* #303: ``html_context`` values given on the command line via ``-A``
+ should not override other values given in conf.py.
+
+* Fix a bug preventing incremental rebuilds for the ``dirhtml``
+ builder.
+
+* #299: Fix the mangling of quotes in some literal blocks.
+
+* #292: Fix path to the search index for the ``dirhtml`` builder.
+
+* Fix a Jython compatibility issue: make the dependence on the
+ ``parser`` module optional.
+
+* #238: In autodoc, catch all errors that occur on module import,
+ not just ``ImportError``.
+
+* Fix the handling of non-data, but non-method descriptors in autodoc.
+
+* When copying file times, ignore OSErrors raised by ``os.utime()``.
+
+
+Release 0.6.3 (Sep 03, 2009)
+============================
+
+* Properly add C module filenames as dependencies in autodoc.
+
+* #253: Ignore graphviz directives without content instead of
+ raising an unhandled exception.
+
+* #241: Fix a crash building LaTeX output for documents that contain
+ a todolist directive.
+
+* #252: Make it easier to change the build dir in the Makefiles
+ generated by quickstart.
+
+* #220: Fix CSS so that displaymath really is centered.
+
+* #222: Allow the "Footnotes" header to be translated.
+
+* #225: Don't add whitespace in generated HTML after inline tags.
+
+* #227: Make ``literalinclude`` work when the document's path
+ name contains non-ASCII characters.
+
+* #229: Fix autodoc failures with members that raise errors
+ on ``getattr()``.
+
+* #205: When copying files, don't copy full stat info, only
+ modification times.
+
+* #232: Support non-ASCII metadata in Qt help builder.
+
+* Properly format bullet lists nested in definition lists for LaTeX.
+
+* Section titles are now allowed inside ``only`` directives.
+
+* #201: Make ``centered`` directive work in LaTeX output.
+
+* #206: Refuse to overwrite an existing master document in
+ sphinx-quickstart.
+
+* #208: Use MS-sanctioned locale settings, determined by the
+ ``language`` config option, in the HTML help builder.
+
+* #210: Fix nesting of HTML tags for displayed math from pngmath
+ extension.
+
+* #213: Fix centering of images in LaTeX output.
+
+* #211: Fix compatibility with docutils 0.5.
+
+
+Release 0.6.2 (Jun 16, 2009)
+============================
+
+* #130: Fix obscure IndexError in doctest extension.
+
+* #167: Make glossary sorting case-independent.
+
+* #196: Add a warning if an extension module doesn't have a
+ ``setup()`` function.
+
+* #158: Allow '..' in template names, and absolute template paths;
+ Jinja 2 by default disables both.
+
+* When highlighting Python code, ignore extra indentation before
+ trying to parse it as Python.
+
+* #191: Don't escape the tilde in URIs in LaTeX.
+
+* Don't consider contents of source comments for the search index.
+
+* Set the default encoding to ``utf-8-sig`` to handle files with a
+ UTF-8 BOM correctly.
+
+* #178: apply ``add_function_parentheses`` config value to C
+ functions as promised.
+
+* #173: Respect the docutils ``title`` directive.
+
+* #172: The ``obj`` role now links to modules as promised.
+
+* #19: Tables now can have a "longtable" class, in order to get
+ correctly broken into pages in LaTeX output.
+
+* Look for Sphinx message catalogs in the system default path before
+ trying ``sphinx/locale``.
+
+* Fix the search for methods via "classname.methodname".
+
+* #155: Fix Python 2.4 compatibility: exceptions are old-style
+ classes there.
+
+* #150: Fix display of the "sphinxdoc" theme on Internet Explorer
+ versions 6 and 7.
+
+* #146: Don't fail to generate LaTeX when the user has an active
+ ``.docutils`` configuration.
+
+* #29: Don't generate visible "-{-}" in option lists in LaTeX.
+
+* Fix cross-reference roles when put into substitutions.
+
+* Don't put image "alt" text into table-of-contents entries.
+
+* In the LaTeX writer, do not raise an exception on too many section
+ levels, just use the "subparagraph" level for all of them.
+
+* #145: Fix autodoc problem with automatic members that refuse to be
+ getattr()'d from their parent.
+
+* If specific filenames to build are given on the command line,
+ check that they are within the source directory.
+
+* Fix autodoc crash for objects without a ``__name__``.
+
+* Fix intersphinx for installations without urllib2.HTTPSHandler.
+
+* #134: Fix pending_xref leftover nodes when using the todolist
+ directive from the todo extension.
+
+
+Release 0.6.1 (Mar 26, 2009)
+============================
+
+* #135: Fix problems with LaTeX output and the graphviz extension.
+
+* #132: Include the autosummary "module" template in the distribution.
+
+
+Release 0.6 (Mar 24, 2009)
+==========================
+
+New features added
+------------------
+
+* Incompatible changes:
+
+ - Templating now requires the Jinja2 library, which is an enhanced
+ version of the old Jinja1 engine. Since the syntax and semantic
+ is largely the same, very few fixes should be necessary in
+ custom templates.
+
+ - The "document" div tag has been moved out of the ``layout.html``
+ template's "document" block, because the closing tag was already
+ outside. If you overwrite this block, you need to remove your
+ "document" div tag as well.
+
+ - The ``autodoc_skip_member`` event now also gets to decide
+ whether to skip members whose name starts with underscores.
+ Previously, these members were always automatically skipped.
+ Therefore, if you handle this event, add something like this
+ to your event handler to restore the old behavior::
+
+ if name.startswith('_'):
+ return True
+
+* Theming support, see the new section in the documentation.
+
+* Markup:
+
+ - Due to popular demand, added a ``:doc:`` role which directly
+ links to another document without the need of creating a
+ label to which a ``:ref:`` could link to.
+
+ - #4: Added a ``:download:`` role that marks a non-document file
+ for inclusion into the HTML output and links to it.
+
+ - Added an ``only`` directive that can selectively include text
+ based on enabled "tags". Tags can be given on the command
+ line. Also, the current builder output format (e.g. "html" or
+ "latex") is always a defined tag.
+
+ - #10: Added HTML section numbers, enabled by giving a
+ ``:numbered:`` flag to the ``toctree`` directive.
+
+ - #114: Added an ``abbr`` role to markup abbreviations and
+ acronyms.
+
+ - The ``literalinclude`` directive now supports several more
+ options, to include only parts of a file.
+
+ - The ``toctree`` directive now supports a ``:hidden:`` flag,
+ which will prevent links from being generated in place of
+ the directive -- this allows you to define your document
+ structure, but place the links yourself.
+
+ - #123: The ``glossary`` directive now supports a ``:sorted:``
+ flag that sorts glossary entries alphabetically.
+
+ - Paths to images, literal include files and download files
+ can now be absolute (like ``/images/foo.png``). They are
+ treated as relative to the top source directory.
+
+ - #52: There is now a ``hlist`` directive, creating a compact
+ list by placing distributing items into multiple columns.
+
+ - #77: If a description environment with info field list only
+ contains one ``:param:`` entry, no bullet list is generated.
+
+ - #6: Don't generate redundant ``<ul>`` for top-level TOC tree
+ items, which leads to a visual separation of TOC entries.
+
+ - #23: Added a ``classmethod`` directive along with ``method``
+ and ``staticmethod``.
+
+ - Scaled images now get a link to the unscaled version.
+
+ - SVG images are now supported in HTML (via ``<object>`` and
+ ``<embed>`` tags).
+
+ - Added a ``toctree`` callable to the templates, and the ability
+ to include external links in toctrees. The 'collapse' keyword
+ argument indicates whether or not to only display subitems of
+ the current page. (Defaults to True.)
+
+* Configuration:
+
+ - The new config value ``rst_epilog`` can contain reST that is
+ appended to each source file that is read. This is the right
+ place for global substitutions.
+
+ - The new ``html_add_permalinks`` config value can be used to
+ switch off the generated "paragraph sign" permalinks for each
+ heading and definition environment.
+
+ - The new ``html_show_sourcelink`` config value can be used to
+ switch off the links to the reST sources in the sidebar.
+
+ - The default value for ``htmlhelp_basename`` is now the project
+ title, cleaned up as a filename.
+
+ - The new ``modindex_common_prefix`` config value can be used to
+ ignore certain package names for module index sorting.
+
+ - The new ``trim_footnote_reference_space`` config value mirrors
+ the docutils config value of the same name and removes the
+ space before a footnote reference that is necessary for reST
+ to recognize the reference.
+
+ - The new ``latex_additional_files`` config value can be used to
+ copy files (that Sphinx doesn't copy automatically, e.g. if they
+ are referenced in custom LaTeX added in ``latex_elements``) to
+ the build directory.
+
+* Builders:
+
+ - The HTML builder now stores a small file named ``.buildinfo`` in
+ its output directory. It stores a hash of config values that
+ can be used to determine if a full rebuild needs to be done (e.g.
+ after changing ``html_theme``).
+
+ - New builder for Qt help collections, by Antonio Valentino.
+
+ - The new ``DirectoryHTMLBuilder`` (short name ``dirhtml``) creates
+ a separate directory for every page, and places the page there
+ in a file called ``index.html``. Therefore, page URLs and links
+ don't need to contain ``.html``.
+
+ - The new ``html_link_suffix`` config value can be used to select
+ the suffix of generated links between HTML files.
+
+ - #96: The LaTeX builder now supports figures wrapped by text, when
+ using the ``figwidth`` option and right/left alignment.
+
+* New translations:
+
+ - Italian by Sandro Dentella.
+ - Ukrainian by Petro Sasnyk.
+ - Finnish by Jukka Inkeri.
+ - Russian by Alexander Smishlajev.
+
+* Extensions and API:
+
+ - New ``graphviz`` extension to embed graphviz graphs.
+
+ - New ``inheritance_diagram`` extension to embed... inheritance
+ diagrams!
+
+ - New ``autosummary`` extension that generates summaries of
+ modules and automatic documentation of modules.
+
+ - Autodoc now has a reusable Python API, which can be used to
+ create custom types of objects to auto-document (e.g. Zope
+ interfaces). See also ``Sphinx.add_autodocumenter()``.
+
+ - Autodoc now handles documented attributes.
+
+ - Autodoc now handles inner classes and their methods.
+
+ - Autodoc can document classes as functions now if explicitly
+ marked with ``autofunction``.
+
+ - Autodoc can now exclude single members from documentation
+ via the ``exclude-members`` option.
+
+ - Autodoc can now order members either alphabetically (like
+ previously) or by member type; configurable either with the
+ config value ``autodoc_member_order`` or a ``member-order``
+ option per directive.
+
+ - The function ``Sphinx.add_directive()`` now also supports
+ docutils 0.5-style directive classes. If they inherit from
+ ``sphinx.util.compat.Directive``, they also work with
+ docutils 0.4.
+
+ - There is now a ``Sphinx.add_lexer()`` method to be able to use
+ custom Pygments lexers easily.
+
+ - There is now ``Sphinx.add_generic_role()`` to mirror the
+ docutils' own function.
+
+* Other changes:
+
+ - Config overrides for single dict keys can now be given on the
+ command line.
+
+ - There is now a ``doctest_global_setup`` config value that can
+ be used to give setup code for all doctests in the documentation.
+
+ - Source links in HTML are now generated with ``rel="nofollow"``.
+
+ - Quickstart can now generate a Windows ``make.bat`` file.
+
+ - #62: There is now a ``-w`` option for sphinx-build that writes
+ warnings to a file, in addition to stderr.
+
+ - There is now a ``-W`` option for sphinx-build that turns warnings
+ into errors.
+
+
+Release 0.5.2 (Mar 24, 2009)
+============================
+
+* Properly escape ``|`` in LaTeX output.
+
+* #71: If a decoding error occurs in source files, print a
+ warning and replace the characters by "?".
+
+* Fix a problem in the HTML search if the index takes too long
+ to load.
+
+* Don't output system messages while resolving, because they
+ would stay in the doctrees even if keep_warnings is false.
+
+* #82: Determine the correct path for dependencies noted by
+ docutils. This fixes behavior where a source with dependent
+ files was always reported as changed.
+
+* Recognize toctree directives that are not on section toplevel,
+ but within block items, such as tables.
+
+* Use a new RFC base URL, since rfc.org seems down.
+
+* Fix a crash in the todolist directive when no todo items are
+ defined.
+
+* Don't call LaTeX or dvipng over and over again if it was not
+ found once, and use text-only latex as a substitute in that case.
+
+* Fix problems with footnotes in the LaTeX output.
+
+* Prevent double hyphens becoming en-dashes in literal code in
+ the LaTeX output.
+
+* Open literalinclude files in universal newline mode to allow
+ arbitrary newline conventions.
+
+* Actually make the ``-Q`` option work.
+
+* #86: Fix explicit document titles in toctrees.
+
+* #81: Write environment and search index in a manner that is safe
+ from exceptions that occur during dumping.
+
+* #80: Fix UnicodeErrors when a locale is set with setlocale().
+
+
+Release 0.5.1 (Dec 15, 2008)
+============================
+
+* #67: Output warnings about failed doctests in the doctest extension
+ even when running in quiet mode.
+
+* #72: In pngmath, make it possible to give a full path to LaTeX and
+ dvipng on Windows. For that to work, the ``pngmath_latex`` and
+ ``pngmath_dvipng`` options are no longer split into command and
+ additional arguments; use ``pngmath_latex_args`` and
+ ``pngmath_dvipng_args`` to give additional arguments.
+
+* Don't crash on failing doctests with non-ASCII characters.
+
+* Don't crash on writing status messages and warnings containing
+ unencodable characters.
+
+* Warn if a doctest extension block doesn't contain any code.
+
+* Fix the handling of ``:param:`` and ``:type:`` doc fields when
+ they contain markup (especially cross-referencing roles).
+
+* #65: Fix storage of depth information for PNGs generated by the
+ pngmath extension.
+
+* Fix autodoc crash when automethod is used outside a class context.
+
+* #68: Fix LaTeX writer output for images with specified height.
+
+* #60: Fix wrong generated image path when including images in sources
+ in subdirectories.
+
+* Fix the JavaScript search when html_copy_source is off.
+
+* Fix an indentation problem in autodoc when documenting classes
+ with the option ``autoclass_content = "both"`` set.
+
+* Don't crash on empty index entries, only emit a warning.
+
+* Fix a typo in the search JavaScript code, leading to unusable
+ search function in some setups.
+
+
+Release 0.5 (Nov 23, 2008) -- Birthday release!
+===============================================
+
+New features added
+------------------
+
+* Markup features:
+
+ - Citations are now global: all citation defined in any file can be
+ referenced from any file. Citations are collected in a bibliography
+ for LaTeX output.
+
+ - Footnotes are now properly handled in the LaTeX builder: they appear
+ at the location of the footnote reference in text, not at the end of
+ a section. Thanks to Andrew McNamara for the initial patch.
+
+ - "System Message" warnings are now automatically removed from the
+ built documentation, and only written to stderr. If you want the
+ old behavior, set the new config value ``keep_warnings`` to True.
+
+ - Glossary entries are now automatically added to the index.
+
+ - Figures with captions can now be referred to like section titles,
+ using the ``:ref:`` role without an explicit link text.
+
+ - Added ``cmember`` role for consistency.
+
+ - Lists enumerated by letters or roman numerals are now handled like in
+ standard reST.
+
+ - The ``seealso`` directive can now also be given arguments, as a short
+ form.
+
+ - You can now document several programs and their options with the
+ new ``program`` directive.
+
+* HTML output and templates:
+
+ - Incompatible change: The "root" relation link (top left in the
+ relbar) now points to the ``master_doc`` by default, no longer to a
+ document called "index". The old behavior, while useful in some
+ situations, was somewhat unexpected. Override the "rootrellink"
+ block in the template to customize where it refers to.
+
+ - The JavaScript search now searches for objects before searching in
+ the full text.
+
+ - TOC tree entries now have CSS classes that make it possible to
+ style them depending on their depth.
+
+ - Highlighted code blocks now have CSS classes that make it possible
+ to style them depending on their language.
+
+ - HTML ``<meta>`` tags via the docutils :dudir:`meta` directive are now
+ supported.
+
+ - ``SerializingHTMLBuilder`` was added as new abstract builder that
+ can be subclassed to serialize build HTML in a specific format. The
+ ``PickleHTMLBuilder`` is a concrete subclass of it that uses pickle
+ as serialization implementation.
+
+ - ``JSONHTMLBuilder`` was added as another ``SerializingHTMLBuilder``
+ subclass that dumps the generated HTML into JSON files for further
+ processing.
+
+ - The ``rellinks`` block in the layout template is now called
+ ``linktags`` to avoid confusion with the relbar links.
+
+ - The HTML builders have two additional attributes now that can be
+ used to disable the anchor-link creation after headlines and
+ definition links.
+
+ - Only generate a module index if there are some modules in the
+ documentation.
+
+* New and changed config values:
+
+ - Added support for internationalization in generated text with the
+ ``language`` and ``locale_dirs`` config values. Many thanks to
+ language contributors:
+
+ * Horst Gutmann -- German
+ * Pavel Kosina -- Czech
+ * David Larlet -- French
+ * Michał Kandulski -- Polish
+ * Yasushi Masuda -- Japanese
+ * Guillem Borrell -- Spanish
+ * Luc Saffre and Peter Bertels -- Dutch
+ * Fred Lin -- Traditional Chinese
+ * Roger Demetrescu -- Brazilian Portuguese
+ * Rok Garbas -- Slovenian
+
+ - The new config value ``highlight_language`` set a global default for
+ highlighting. When ``'python3'`` is selected, console output blocks
+ are recognized like for ``'python'``.
+
+ - Exposed Pygments' lexer guessing as a highlight "language" ``guess``.
+
+ - The new config value ``latex_elements`` allows to override all LaTeX
+ snippets that Sphinx puts into the generated .tex file by default.
+
+ - Added ``exclude_dirnames`` config value that can be used to exclude
+ e.g. CVS directories from source file search.
+
+ - Added ``source_encoding`` config value to select input encoding.
+
+* Extensions:
+
+ - The new extensions ``sphinx.ext.jsmath`` and ``sphinx.ext.pngmath``
+ provide math support for both HTML and LaTeX builders.
+
+ - The new extension ``sphinx.ext.intersphinx`` half-automatically
+ creates links to Sphinx documentation of Python objects in other
+ projects.
+
+ - The new extension ``sphinx.ext.todo`` allows the insertion of
+ "To do" directives whose visibility in the output can be toggled.
+ It also adds a directive to compile a list of all todo items.
+
+ - sphinx.ext.autodoc has a new event ``autodoc-process-signature``
+ that allows tuning function signature introspection.
+
+ - sphinx.ext.autodoc has a new event ``autodoc-skip-member`` that allows
+ tuning which members are included in the generated content.
+
+ - Respect __all__ when autodocumenting module members.
+
+ - The ``automodule`` directive now supports the ``synopsis``,
+ ``deprecated`` and ``platform`` options.
+
+* Extension API:
+
+ - ``Sphinx.add_node()`` now takes optional visitor methods for the
+ HTML, LaTeX and text translators; this prevents having to manually
+ patch the classes.
+
+ - Added ``Sphinx.add_javascript()`` that adds scripts to load in the
+ default HTML template.
+
+ - Added new events: ``source-read``, ``env-updated``,
+ ``env-purge-doc``, ``missing-reference``, ``build-finished``.
+
+* Other changes:
+
+ - Added a command-line switch ``-Q``: it will suppress warnings.
+
+ - Added a command-line switch ``-A``: it can be used to supply
+ additional values into the HTML templates.
+
+ - Added a command-line switch ``-C``: if it is given, no configuration
+ file ``conf.py`` is required.
+
+ - Added a distutils command ``build_sphinx``: When Sphinx is installed,
+ you can call ``python setup.py build_sphinx`` for projects that have
+ Sphinx documentation, which will build the docs and place them in
+ the standard distutils build directory.
+
+ - In quickstart, if the selected root path already contains a Sphinx
+ project, complain and abort.
+
+Bugs fixed
+----------
+
+* #51: Escape configuration values placed in HTML templates.
+
+* #44: Fix small problems in HTML help index generation.
+
+* Fix LaTeX output for line blocks in tables.
+
+* #38: Fix "illegal unit" error when using pixel image widths/heights.
+
+* Support table captions in LaTeX output.
+
+* #39: Work around a bug in Jinja that caused "<generator ...>" to be
+ emitted in HTML output.
+
+* Fix a problem with module links not being generated in LaTeX output.
+
+* Fix the handling of images in different directories.
+
+* #29: Support option lists in the text writer. Make sure that dashes
+ introducing long option names are not contracted to en-dashes.
+
+* Support the "scale" option for images in HTML output.
+
+* #25: Properly escape quotes in HTML help attribute values.
+
+* Fix LaTeX build for some description environments with ``:noindex:``.
+
+* #24: Don't crash on uncommon casing of role names (like ``:Class:``).
+
+* Only output ANSI colors on color terminals.
+
+* Update to newest fncychap.sty, to fix problems with non-ASCII
+ characters at the start of chapter titles.
+
+* Fix a problem with index generation in LaTeX output, caused by
+ hyperref not being included last.
+
+* Don't disregard return annotations for functions without any parameters.
+
+* Don't throw away labels for code blocks.
+
+
+Release 0.4.3 (Oct 8, 2008)
+===========================
+
+* Fix a bug in autodoc with directly given autodoc members.
+
+* Fix a bug in autodoc that would import a module twice, once as
+ "module", once as "module.".
+
+* Fix a bug in the HTML writer that created duplicate ``id``
+ attributes for section titles with docutils 0.5.
+
+* Properly call ``super()`` in overridden blocks in templates.
+
+* Add a fix when using XeTeX.
+
+* Unify handling of LaTeX escaping.
+
+* Rebuild everything when the ``extensions`` config value changes.
+
+* Don't try to remove a nonexisting static directory.
+
+* Fix an indentation problem in production lists.
+
+* Fix encoding handling for literal include files: ``literalinclude``
+ now has an ``encoding`` option that defaults to UTF-8.
+
+* Fix the handling of non-ASCII characters entered in quickstart.
+
+* Fix a crash with nonexisting image URIs.
+
+
+Release 0.4.2 (Jul 29, 2008)
+============================
+
+* Fix rendering of the ``samp`` role in HTML.
+
+* Fix a bug with LaTeX links to headings leading to a wrong page.
+
+* Reread documents with globbed toctrees when source files are
+ added or removed.
+
+* Add a missing parameter to PickleHTMLBuilder.handle_page().
+
+* Put inheritance info always on its own line.
+
+* Don't automatically enclose code with whitespace in it in quotes;
+ only do this for the ``samp`` role.
+
+* autodoc now emits a more precise error message when a module
+ can't be imported or an attribute can't be found.
+
+* The JavaScript search now uses the correct file name suffix when
+ referring to found items.
+
+* The automodule directive now accepts the ``inherited-members``
+ and ``show-inheritance`` options again.
+
+* You can now rebuild the docs normally after relocating the source
+ and/or doctree directory.
+
+
+Release 0.4.1 (Jul 5, 2008)
+===========================
+
+* Added sub-/superscript node handling to TextBuilder.
+
+* Label names in references are now case-insensitive, since reST
+ label names are always lowercased.
+
+* Fix linkcheck builder crash for malformed URLs.
+
+* Add compatibility for admonitions and docutils 0.5.
+
+* Remove the silly restriction on "rubric" in the LaTeX writer: you
+ can now write arbitrary "rubric" directives, and only those with
+ a title of "Footnotes" will be ignored.
+
+* Copy the HTML logo to the output ``_static`` directory.
+
+* Fix LaTeX code for modules with underscores in names and platforms.
+
+* Fix a crash with nonlocal image URIs.
+
+* Allow the usage of :noindex: in ``automodule`` directives, as
+ documented.
+
+* Fix the ``delete()`` docstring processor function in autodoc.
+
+* Fix warning message for nonexisting images.
+
+* Fix JavaScript search in Internet Explorer.
+
+
+Release 0.4 (Jun 23, 2008)
+==========================
+
+New features added
+------------------
+
+* ``tocdepth`` can be given as a file-wide metadata entry, and
+ specifies the maximum depth of a TOC of this file.
+
+* The new config value ``default_role`` can be used to select the
+ default role for all documents.
+
+* Sphinx now interprets field lists with fields like ``:param foo:``
+ in description units.
+
+* The new ``staticmethod`` directive can be used to mark methods as
+ static methods.
+
+* HTML output:
+
+ - The "previous" and "next" links have a more logical structure, so
+ that by following "next" links you can traverse the entire TOC
+ tree.
+
+ - The new event ``html-page-context`` can be used to include custom
+ values into the context used when rendering an HTML template.
+
+ - Document metadata is now in the default template context, under
+ the name ``metadata``.
+
+ - The new config value ``html_favicon`` can be used to set a favicon
+ for the HTML output. Thanks to Sebastian Wiesner.
+
+ - The new config value ``html_use_index`` can be used to switch index
+ generation in HTML documents off.
+
+ - The new config value ``html_split_index`` can be used to create
+ separate index pages for each letter, to be used when the complete
+ index is too large for one page.
+
+ - The new config value ``html_short_title`` can be used to set a
+ shorter title for the documentation which is then used in the
+ navigation bar.
+
+ - The new config value ``html_show_sphinx`` can be used to control
+ whether a link to Sphinx is added to the HTML footer.
+
+ - The new config value ``html_file_suffix`` can be used to set the
+ HTML file suffix to e.g. ``.xhtml``.
+
+ - The directories in the ``html_static_path`` can now contain
+ subdirectories.
+
+ - The module index now isn't collapsed if the number of submodules
+ is larger than the number of toplevel modules.
+
+* The image directive now supports specifying the extension as ``.*``,
+ which makes the builder select the one that matches best. Thanks to
+ Sebastian Wiesner.
+
+* The new config value ``exclude_trees`` can be used to exclude whole
+ subtrees from the search for source files.
+
+* Defaults for configuration values can now be callables, which allows
+ dynamic defaults.
+
+* The new TextBuilder creates plain-text output.
+
+* Python 3-style signatures, giving a return annotation via ``->``,
+ are now supported.
+
+* Extensions:
+
+ - The autodoc extension now offers a much more flexible way to
+ manipulate docstrings before including them into the output, via
+ the new ``autodoc-process-docstring`` event.
+
+ - The ``autodoc`` extension accepts signatures for functions, methods
+ and classes now that override the signature got via introspection
+ from Python code.
+
+ - The ``autodoc`` extension now offers a ``show-inheritance`` option
+ for autoclass that inserts a list of bases after the signature.
+
+ - The autodoc directives now support the ``noindex`` flag option.
+
+
+Bugs fixed
+----------
+
+* Correctly report the source location for docstrings included with
+ autodoc.
+
+* Fix the LaTeX output of description units with multiple signatures.
+
+* Handle the figure directive in LaTeX output.
+
+* Handle raw admonitions in LaTeX output.
+
+* Fix determination of the title in HTML help output.
+
+* Handle project names containing spaces.
+
+* Don't write SSI-like comments in HTML output.
+
+* Rename the "sidebar" class to "sphinxsidebar" in order to stay different
+ from reST sidebars.
+
+* Use a binary TOC in HTML help generation to fix issues links without
+ explicit anchors.
+
+* Fix behavior of references to functions/methods with an explicit title.
+
+* Support citation, subscript and superscript nodes in LaTeX writer.
+
+* Provide the standard "class" directive as "cssclass"; else it is
+ shadowed by the Sphinx-defined directive.
+
+* Fix the handling of explicit module names given to autoclass directives.
+ They now show up with the correct module name in the generated docs.
+
+* Enable autodoc to process Unicode docstrings.
+
+* The LaTeX writer now translates line blocks with ``\raggedright``,
+ which plays nicer with tables.
+
+* Fix bug with directories in the HTML builder static path.
+
+
+Release 0.3 (May 6, 2008)
+=========================
+
+New features added
+------------------
+
+* The ``toctree`` directive now supports a ``glob`` option that allows
+ glob-style entries in the content.
+
+* If the ``pygments_style`` config value contains a dot it's treated as the
+ import path of a custom Pygments style class.
+
+* A new config value, ``exclude_dirs``, can be used to exclude whole
+ directories from the search for source files.
+
+* The configuration directory (containing ``conf.py``) can now be set
+ independently from the source directory. For that, a new command-line
+ option ``-c`` has been added.
+
+* A new directive ``tabularcolumns`` can be used to give a tabular column
+ specification for LaTeX output. Tables now use the ``tabulary`` package.
+ Literal blocks can now be placed in tables, with several caveats.
+
+* A new config value, ``latex_use_parts``, can be used to enable parts in LaTeX
+ documents.
+
+* Autodoc now skips inherited members for classes, unless you give the
+ new ``inherited-members`` option.
+
+* A new config value, ``autoclass_content``, selects if the docstring of the
+ class' ``__init__`` method is added to the directive's body.
+
+* Support for C++ class names (in the style ``Class::Function``) in C function
+ descriptions.
+
+* Support for a ``toctree_only`` item in items for the ``latex_documents``
+ config value. This only includes the documents referenced by TOC trees in the
+ output, not the rest of the file containing the directive.
+
+Bugs fixed
+----------
+
+* sphinx.htmlwriter: Correctly write the TOC file for any structure of the
+ master document. Also encode non-ASCII characters as entities in TOC
+ and index file. Remove two remaining instances of hard-coded
+ "documentation".
+
+* sphinx.ext.autodoc: descriptors are detected properly now.
+
+* sphinx.latexwriter: implement all reST admonitions, not just ``note``
+ and ``warning``.
+
+* Lots of little fixes to the LaTeX output and style.
+
+* Fix OpenSearch template and make template URL absolute. The
+ ``html_use_opensearch`` config value now must give the base URL.
+
+* Some unused files are now stripped from the HTML help file build.
+
+
+Release 0.2 (Apr 27, 2008)
+==========================
+
+Incompatible changes
+--------------------
+
+* Jinja, the template engine used for the default HTML templates, is now
+ no longer shipped with Sphinx. If it is not installed automatically for
+ you (it is now listed as a dependency in ``setup.py``), install it manually
+ from PyPI. This will also be needed if you're using Sphinx from a SVN
+ checkout; in that case please also remove the ``sphinx/jinja`` directory
+ that may be left over from old revisions.
+
+* The clumsy handling of the ``index.html`` template was removed. The config
+ value ``html_index`` is gone, and ``html_additional_pages`` should be used
+ instead. If you need it, the old ``index.html`` template is still there,
+ called ``defindex.html``, and you can port your html_index template, using
+ Jinja inheritance, by changing your template::
+
+ {% extends "defindex.html" %}
+ {% block tables %}
+ ... old html_index template content ...
+ {% endblock %}
+
+ and putting ``'index': name of your template`` in ``html_additional_pages``.
+
+* In the layout template, redundant ``block``\s were removed; you should use
+ Jinja's standard ``{{ super() }}`` mechanism instead, as explained in the
+ (newly written) templating docs.
+
+New features added
+------------------
+
+* Extension API (Application object):
+
+ - Support a new method, ``add_crossref_type``. It works like
+ ``add_description_unit`` but the directive will only create a target
+ and no output.
+ - Support a new method, ``add_transform``. It takes a standard docutils
+ ``Transform`` subclass which is then applied by Sphinx' reader on
+ parsing reST document trees.
+ - Add support for other template engines than Jinja, by adding an
+ abstraction called a "template bridge". This class handles rendering
+ of templates and can be changed using the new configuration value
+ "template_bridge".
+ - The config file itself can be an extension (if it provides a ``setup()``
+ function).
+
+* Markup:
+
+ - New directive, ``currentmodule``. It can be used to indicate the module
+ name of the following documented things without creating index entries.
+ - Allow giving a different title to documents in the toctree.
+ - Allow giving multiple options in a ``cmdoption`` directive.
+ - Fix display of class members without explicit class name given.
+
+* Templates (HTML output):
+
+ - ``index.html`` renamed to ``defindex.html``, see above.
+ - There's a new config value, ``html_title``, that controls the overall
+ "title" of the set of Sphinx docs. It is used instead everywhere instead of
+ "Projectname vX.Y documentation" now.
+ - All references to "documentation" in the templates have been removed, so
+ that it is now easier to use Sphinx for non-documentation documents with
+ the default templates.
+ - Templates now have an XHTML doctype, to be consistent with docutils'
+ HTML output.
+ - You can now create an OpenSearch description file with the
+ ``html_use_opensearch`` config value.
+ - You can now quickly include a logo in the sidebar, using the ``html_logo``
+ config value.
+ - There are new blocks in the sidebar, so that you can easily insert content
+ into the sidebar.
+
+* LaTeX output:
+
+ - The ``sphinx.sty`` package was cleaned of unused stuff.
+ - You can include a logo in the title page with the ``latex_logo`` config
+ value.
+ - You can define the link colors and a border and background color for
+ verbatim environments.
+
+Thanks to Jacob Kaplan-Moss, Talin, Jeroen Ruigrok van der Werven and Sebastian
+Wiesner for suggestions.
+
+Bugs fixed
+----------
+
+* sphinx.ext.autodoc: Don't check ``__module__`` for explicitly given
+ members. Remove "self" in class constructor argument list.
+
+* sphinx.htmlwriter: Don't use os.path for joining image HREFs.
+
+* sphinx.htmlwriter: Don't use SmartyPants for HTML attribute values.
+
+* sphinx.latexwriter: Implement option lists. Also, some other changes
+ were made to ``sphinx.sty`` in order to enhance compatibility and
+ remove old unused stuff. Thanks to Gael Varoquaux for that!
+
+* sphinx.roles: Fix referencing glossary terms with explicit targets.
+
+* sphinx.environment: Don't swallow TOC entries when resolving subtrees.
+
+* sphinx.quickstart: Create a sensible default latex_documents setting.
+
+* sphinx.builder, sphinx.environment: Gracefully handle some user error
+ cases.
+
+* sphinx.util: Follow symbolic links when searching for documents.
+
+
+Release 0.1.61950 (Mar 26, 2008)
+================================
+
+* sphinx.quickstart: Fix format string for Makefile.
+
+
+Release 0.1.61945 (Mar 26, 2008)
+================================
+
+* sphinx.htmlwriter, sphinx.latexwriter: Support the ``.. image::``
+ directive by copying image files to the output directory.
+
+* sphinx.builder: Consistently name "special" HTML output directories
+ with a leading underscore; this means ``_sources`` and ``_static``.
+
+* sphinx.environment: Take dependent files into account when collecting
+ the set of outdated sources.
+
+* sphinx.directives: Record files included with ``.. literalinclude::``
+ as dependencies.
+
+* sphinx.ext.autodoc: Record files from which docstrings are included
+ as dependencies.
+
+* sphinx.builder: Rebuild all HTML files in case of a template change.
+
+* sphinx.builder: Handle unavailability of TOC relations (previous/
+ next chapter) more gracefully in the HTML builder.
+
+* sphinx.latexwriter: Include fncychap.sty which doesn't seem to be
+ very common in TeX distributions. Add a ``clean`` target in the
+ latex Makefile. Really pass the correct paper and size options
+ to the LaTeX document class.
+
+* setup: On Python 2.4, don't egg-depend on docutils if a docutils is
+ already installed -- else it will be overwritten.
+
+
+Release 0.1.61843 (Mar 24, 2008)
+================================
+
+* sphinx.quickstart: Really don't create a makefile if the user
+ doesn't want one.
+
+* setup: Don't install scripts twice, via setuptools entry points
+ and distutils scripts. Only install via entry points.
+
+* sphinx.builder: Don't recognize the HTML builder's copied source
+ files (under ``_sources``) as input files if the source suffix is
+ ``.txt``.
+
+* sphinx.highlighting: Generate correct markup for LaTeX Verbatim
+ environment escapes even if Pygments is not installed.
+
+* sphinx.builder: The WebHTMLBuilder is now called PickleHTMLBuilder.
+
+* sphinx.htmlwriter: Make parsed-literal blocks work as expected,
+ not highlighting them via Pygments.
+
+* sphinx.environment: Don't error out on reading an empty source file.
+
+
+Release 0.1.61798 (Mar 23, 2008)
+================================
+
+* sphinx: Work with docutils SVN snapshots as well as 0.4.
+
+* sphinx.ext.doctest: Make the group in which doctest blocks are
+ placed selectable, and default to ``'default'``.
+
+* sphinx.ext.doctest: Replace ``<BLANKLINE>`` in doctest blocks by
+ real blank lines for presentation output, and remove doctest
+ options given inline.
+
+* sphinx.environment: Move doctest_blocks out of block_quotes to
+ support indented doctest blocks.
+
+* sphinx.ext.autodoc: Render ``.. automodule::`` docstrings in a
+ section node, so that module docstrings can contain proper
+ sectioning.
+
+* sphinx.ext.autodoc: Use the module's encoding for decoding
+ docstrings, rather than requiring ASCII.
+
+
+Release 0.1.61611 (Mar 21, 2008)
+================================
+
+* First public release.
diff --git a/CODE_OF_CONDUCT b/CODE_OF_CONDUCT
new file mode 100644
index 0000000..4bec2fd
--- /dev/null
+++ b/CODE_OF_CONDUCT
@@ -0,0 +1,78 @@
+======================
+Sphinx Code of Conduct
+======================
+
+Like the technical community as a whole, the Sphinx team and community is made
+up of volunteers from all over the world.
+Diversity is a strength, but it can also lead to communication issues and
+unhappiness. To that end, we have a few ground rules that we ask people to
+adhere to.
+
+* **Be friendly and patient.**
+
+* **Be welcoming.**
+ We strive to be a community that welcomes and supports people of all
+ backgrounds and identities. This includes, but is not limited to members of
+ any race, ethnicity, culture, national origin, colour, immigration status,
+ social and economic class, educational level, sex, sexual orientation, gender
+ identity and expression, age, size, family status, political belief, religion,
+ and mental and physical ability.
+
+* **Be considerate.**
+ Your work will be used by other people, and you in turn will depend on the
+ work of others. Any decision you take will affect users and colleagues, and
+ you should take those consequences into account when making decisions.
+ Remember that we're a world-wide community, so you might not be communicating
+ in someone else's primary language.
+
+* **Be respectful.**
+ Not all of us will agree all the time, but disagreement is no excuse for poor
+ behavior and poor manners. We might all experience some frustration now and
+ then, but we cannot allow that frustration to turn into a personal attack.
+ It's important to remember that a community where people feel uncomfortable or
+ threatened is not a productive one. Members of the Sphinx community should be
+ respectful when dealing with other members as well as with people outside the
+ Sphinx community.
+
+* **Be careful in the words that you choose.**
+ We are a community of professionals, and we conduct ourselves professionally.
+ Be kind to others. Do not insult or put down other participants. Harassment
+ and other exclusionary behavior aren't acceptable. This includes, but is not
+ limited to:
+
+ * Violent threats or language directed against another person.
+
+ * Discriminatory jokes and language.
+
+ * Posting sexually explicit or violent material.
+
+ * Posting (or threatening to post) other people's personally identifying
+ information ("doxing").
+
+ * Personal insults, especially those using racist or sexist terms.
+
+ * Unwelcome sexual attention.
+
+ * Advocating for, or encouraging, any of the above behavior.
+
+ * Repeated harassment of others. In general, if someone asks you to stop, then
+ stop.
+
+* **When we disagree, try to understand why.**
+ Disagreements, both social and technical, happen all the time and Sphinx is no
+ exception. It is important that we resolve disagreements and differing views
+ constructively. Remember that we're different. Different people have different
+ perspectives on issues. Being unable to understand why someone holds a
+ viewpoint doesn't mean that they're wrong. Don't forget that it is human to
+ err and blaming each other doesn't get us anywhere. Instead, focus on helping
+ to resolve issues and learning from mistakes.
+
+This isn't an exhaustive list of things that you can't do.
+Rather, take it in the spirit in which it's intended - a guide to make it easier
+to enrich all of us and the technical communities in which we participate.
+This code of conduct applies to all spaces of the Sphinx community.
+
+.. rubric:: Attribution
+
+Original text courtesy of the Speak Up! project:
+http://web.archive.org/web/20141109123859/http://speakup.io/coc.html.
diff --git a/EXAMPLES b/EXAMPLES
new file mode 100644
index 0000000..5a787c3
--- /dev/null
+++ b/EXAMPLES
@@ -0,0 +1,479 @@
+Projects using Sphinx
+=====================
+
+This is an (incomplete) alphabetic list of projects that use Sphinx or
+are experimenting with using it for their documentation. If you like to
+be included, please mail to `the Google group
+<https://groups.google.com/forum/#!forum/sphinx-users>`_.
+
+I've grouped the list into sections to make it easier to find
+interesting examples.
+
+Documentation using the alabaster theme
+---------------------------------------
+
+* `Alabaster <https://alabaster.readthedocs.io/>`__
+* `Blinker <https://blinker.readthedocs.io/>`__
+* `Calibre <https://manual.calibre-ebook.com/>`__
+* `CherryPy <https://cherrypy.readthedocs.io/>`__
+* `Click <https://click.palletsprojects.com/>`__ (customized)
+* `coala <https://docs.coala.io/>`__ (customized)
+* `CodePy <https://documen.tician.de/codepy/>`__
+* `Django Q <https://django-q.readthedocs.io/>`__
+* `Eve <https://docs.python-eve.org/>`__ (Python REST API framework)
+* `Fabric <https://docs.fabfile.org/>`__
+* `Fityk <https://fityk.nieto.pl/>`__
+* `Flask <https://flask.palletsprojects.com/>`__
+* `Flask-OpenID <https://pythonhosted.org/Flask-OpenID/>`__
+* `Invoke <https://docs.pyinvoke.org/>`__
+* `Jinja <https://jinja.palletsprojects.com/>`__
+* `Lino <https://www.lino-framework.org/>`__ (customized)
+* `marbl <https://getmarbl.readthedocs.io/>`__
+* `MDAnalysis <https://www.mdanalysis.org/docs/>`__ (customized)
+* `MeshPy <https://documen.tician.de/meshpy/>`__
+* `Molecule <https://molecule.readthedocs.io/>`__
+* `Momotor LTI <https://momotor.org/doc/lti/canvas/>`__
+* `Podman <https://docs.podman.io/>`__
+* `PyCUDA <https://documen.tician.de/pycuda/>`__
+* `PyOpenCL <https://documen.tician.de/pyopencl/>`__
+* `PyLangAcq <https://pylangacq.org/>`__
+* `pytest <https://docs.pytest.org/>`__ (customized)
+* `python-apt <https://apt-team.pages.debian.net/python-apt/>`__
+* `PyVisfile <https://documen.tician.de/pyvisfile/>`__
+* `Requests <https://requests.readthedocs.io/>`__
+* `searx <https://asciimoo.github.io/searx/>`__
+* `Spyder <https://docs.spyder-ide.org/>`__ (customized)
+* `Tablib <http://docs.python-tablib.org/>`__
+* `urllib3 <https://urllib3.readthedocs.io/>`__ (customized)
+* `Werkzeug <https://werkzeug.palletsprojects.com/>`__
+* `Write the Docs <https://www.writethedocs.org/>`__
+
+Documentation using the classic theme
+-------------------------------------
+
+* `Advanced Generic Widgets <https://xoomer.virgilio.it/infinity77/AGW_Docs/>`__ (customized)
+* `Apache CouchDB <https://docs.couchdb.org/>`__ (customized)
+* `APSW <https://rogerbinns.github.io/apsw/>`__
+* `Arb <https://arblib.org/>`__
+* `Beautiful Soup <https://www.crummy.com/software/BeautifulSoup/bs4/doc/>`__
+* `Blender API <https://docs.blender.org/api/current/>`__
+* `Bugzilla <https://bugzilla.readthedocs.io/>`__
+* `Buildbot <https://docs.buildbot.net/latest/>`__
+* `CMake <https://cmake.org/documentation/>`__ (customized)
+* `Chaco <https://docs.enthought.com/chaco/>`__ (customized)
+* `Cormoran <http://cormoran.nhopkg.org/docs/>`__
+* `DEAP <https://deap.readthedocs.io/>`__ (customized)
+* `Director <https://pythonhosted.org/director/>`__
+* `EZ-Draw <https://pageperso.lif.univ-mrs.fr/~edouard.thiel/ez-draw/doc/en/html/ez-manual.html>`__ (customized)
+* `Generic Mapping Tools (GMT) <https://gmt.soest.hawaii.edu/doc/latest/>`__ (customized)
+* `Genomedata <https://noble.gs.washington.edu/proj/genomedata/doc/1.3.3/>`__
+* `GetFEM++ <https://getfem.org/>`__ (customized)
+* `Glasgow Haskell Compiler <https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/>`__ (customized)
+* `Grok <http://grok.zope.org/doc/current/>`__ (customized)
+* `GROMACS <https://manual.gromacs.org/documentation/>`__
+* `GSL Shell <https://www.nongnu.org/gsl-shell/>`__
+* `Hands-on Python Tutorial <http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/>`__
+* `Kaa <https://freevo.github.io/kaa-base/>`__ (customized)
+* `Leo <https://leoeditor.com/>`__ (customized)
+* `Mayavi <https://docs.enthought.com/mayavi/mayavi/>`__ (customized)
+* `MediaGoblin <https://mediagoblin.readthedocs.io/>`__ (customized)
+* `mpmath <https://mpmath.org/doc/current/>`__
+* `OpenCV <https://docs.opencv.org/>`__ (customized)
+* `OpenEXR <https://excamera.com/articles/26/doc/index.html>`__
+* `OpenGDA <http://www.opengda.org/documentation/>`__
+* `phpDocumentor <https://docs.phpdoc.org/>`__ (customized)
+* `Plone <https://docs.plone.org/>`__ (customized)
+* `PyEMD <https://pyemd.readthedocs.io/>`__
+* `Pyevolve <http://pyevolve.sourceforge.net/>`__
+* `Pygame <https://www.pygame.org/docs/>`__ (customized)
+* `PyMQI <https://dsuch.github.io/pymqi/>`__
+* `PyQt4 <http://pyqt.sourceforge.net/Docs/PyQt4/>`__ (customized)
+* `PyQt5 <http://pyqt.sourceforge.net/Docs/PyQt5/>`__ (customized)
+* `Python 2 <https://docs.python.org/2/>`__
+* `Python 3 <https://docs.python.org/3/>`__ (customized)
+* `Python Packaging Authority <https://www.pypa.io/>`__ (customized)
+* `Ring programming language <http://ring-lang.sourceforge.net/doc/>`__ (customized)
+* `SageMath <https://doc.sagemath.org/>`__ (customized)
+* `Segway <https://noble.gs.washington.edu/proj/segway/doc/1.1.0/segway.html>`__
+* `simuPOP <http://simupop.sourceforge.net/manual_release/build/userGuide.html>`__ (customized)
+* `Sprox <http://sprox.org/>`__ (customized)
+* `SymPy <https://docs.sympy.org/>`__
+* `TurboGears <https://turbogears.readthedocs.io/>`__ (customized)
+* `tvtk <https://docs.enthought.com/mayavi/tvtk/>`__
+* `Varnish <https://www.varnish-cache.org/docs/>`__ (customized, alabaster for index)
+* `Waf <https://waf.io/apidocs/>`__
+* `wxPython Phoenix <https://wxpython.org/Phoenix/docs/html/main.html>`__ (customized)
+* `Yum <http://yum.baseurl.org/api/yum/>`__
+* `z3c <https://www.ibiblio.org/paulcarduner/z3ctutorial/>`__
+* `zc.async <https://pythonhosted.org/zc.async/>`__ (customized)
+* `Zope <https://docs.zope.org/zope2/>`__ (customized)
+
+Documentation using the sphinxdoc theme
+---------------------------------------
+
+* `ABRT <https://abrt.readthedocs.io/>`__
+* `cartopy <https://scitools.org.uk/cartopy/docs/latest/>`__
+* `Jython <https://jython.readthedocs.io/>`__
+* `LLVM <https://llvm.org/docs/>`__
+* `MDAnalysis Tutorial <https://www.mdanalysis.org/MDAnalysisTutorial/>`__
+* `PyCantonese <https://pycantonese.org/>`__
+* `Pyre <https://pyre.readthedocs.io/>`__
+* `pySPACE <https://pyspace.github.io/pyspace/>`__
+* `Pysparse <http://pysparse.sourceforge.net/>`__
+* `PyTango <https://www.esrf.eu/computing/cs/tango/tango_doc/kernel_doc/pytango/latest/>`__
+* `Python Wild Magic <https://vmlaker.github.io/pythonwildmagic/>`__ (customized)
+* `RDKit <https://www.rdkit.org/docs/>`__
+* `Reteisi <http://www.reteisi.org/contents.html>`__ (customized)
+* `Sqlkit <http://sqlkit.argolinux.org/>`__ (customized)
+* `Turbulenz <http://docs.turbulenz.com/>`__
+
+Documentation using the nature theme
+------------------------------------
+
+* `Alembic <https://alembic.sqlalchemy.org/>`__
+* `Cython <https://docs.cython.org/>`__
+* `easybuild <https://easybuild.readthedocs.io/>`__
+* `libLAS <https://liblas.org/>`__ (customized)
+* `Lmod <https://lmod.readthedocs.io/>`__
+* `MapServer <https://mapserver.org/>`__ (customized)
+* `pyglet <https://pyglet.readthedocs.io/>`__ (customized)
+* `PyWavelets <https://pywavelets.readthedocs.io/>`__
+* `Setuptools <https://setuptools.readthedocs.io/>`__
+* `Spring Python <https://docs.spring.io/spring-python/1.2.x/sphinx/html/>`__
+* `StatsModels <https://www.statsmodels.org/>`__ (customized)
+* `Sylli <http://sylli.sourceforge.net/>`__
+
+Documentation using another builtin theme
+-----------------------------------------
+
+* `Breathe <https://breathe.readthedocs.io/>`__ (haiku)
+* `Breezy (fork of Bazaar) <https://www.breezy-vcs.org/doc/en/>`__ (agogo)
+* `MPipe <https://vmlaker.github.io/mpipe/>`__ (sphinx13)
+* `NLTK <https://www.nltk.org/>`__ (agogo)
+* `PyPubSub <https://pypubsub.readthedocs.io/>`__ (bizstyle)
+* `Pylons <https://docs.pylonsproject.org/projects/pylons-webframework/>`__ (pyramid)
+* `Pyramid web framework <https://docs.pylonsproject.org/projects/pyramid/>`__ (pyramid)
+* `RxDock <https://rxdock.gitlab.io/documentation/devel/html/>`__ (bizstyle)
+* `Sphinx <https://www.sphinx-doc.org/>`__ (sphinx13) :-)
+* `Valence <https://docs.valence.desire2learn.com/>`__ (haiku, customized)
+
+Documentation using sphinx_rtd_theme
+------------------------------------
+
+* `Aesara (fork of Theano) <https://aesara.readthedocs.io/>`__
+* `Annotator <https://docs.annotatorjs.org/>`__
+* `Ansible <https://docs.ansible.com/>`__ (customized)
+* `Arcade <https://arcade.academy/>`__
+* `aria2 <https://aria2.github.io/manual/en/html/>`__
+* `ASE <https://wiki.fysik.dtu.dk/ase/>`__
+* `asvin <https://asvin.readthedocs.io/>`__
+* `Autofac <https://docs.autofac.org/>`__
+* `BigchainDB <https://docs.bigchaindb.com/>`__
+* `Blender Reference Manual <https://docs.blender.org/manual/>`__
+* `Blocks <https://blocks.readthedocs.io/>`__
+* `bootstrap-datepicker <https://bootstrap-datepicker.readthedocs.io/>`__
+* `Certbot <https://certbot.eff.org/docs/>`__
+* `CKAN <https://docs.ckan.org/>`__
+* `Copr Buildsystem <https://docs.pagure.org/copr.copr/>`__ (customized)
+* `Coreboot <https://doc.coreboot.org/>`__
+* `Chainer <https://docs.chainer.org/>`__ (customized)
+* `citeproc-js <https://citeproc-js.readthedocs.io/>`__
+* `cloud-init <https://cloudinit.readthedocs.io/>`__
+* `CodeIgniter <https://www.codeigniter.com/user_guide/>`__
+* `Conda <https://conda.io/docs/>`__
+* `Corda <https://docs.corda.net/>`__
+* `Dask <https://dask.pydata.org/>`__
+* `Databricks <https://docs.databricks.com/>`__ (customized)
+* `Dataiku DSS <https://doc.dataiku.com/>`__
+* `DNF <https://dnf.readthedocs.io/>`__
+* `Distro Tracker <https://qa.pages.debian.net/distro-tracker/>`__
+* `Django-cas-ng <https://djangocas.dev/docs/>`__
+* `dj-stripe <https://dj-stripe.readthedocs.io/>`__
+* `edX <https://docs.edx.org/>`__
+* `Electrum <https://docs.electrum.org/>`__
+* `Elemental <https://libelemental.org/documentation/dev/>`__
+* `ESWP3 <https://eswp3.readthedocs.io/>`__
+* `Ethereum Homestead <https://www.ethdocs.org/>`__
+* `Exhale <https://exhale.readthedocs.io/>`__
+* `Faker <https://faker.readthedocs.io/>`__
+* `Fidimag <https://fidimag.readthedocs.io/>`__
+* `Flake8 <https://flake8.pycqa.org/>`__
+* `Flatpak <https://docs.flatpak.org/>`__
+* `FluidDyn <https://fluiddyn.readthedocs.io/>`__
+* `Fluidsim <https://fluidsim.readthedocs.io/>`__
+* `Gallium <https://gallium.readthedocs.io/>`__
+* `GeoNode <https://docs.geonode.org/>`__
+* `Glances <https://glances.readthedocs.io/>`__
+* `Godot <https://godot.readthedocs.io/>`__
+* `Graylog <https://docs.graylog.org/>`__
+* `GPAW <https://wiki.fysik.dtu.dk/gpaw/>`__ (customized)
+* `HDF5 for Python (h5py) <https://docs.h5py.org/>`__
+* `HyperKitty <https://hyperkitty.readthedocs.io/>`__
+* `Hyperledger Fabric <https://hyperledger-fabric.readthedocs.io/>`__
+* `Hyperledger Sawtooth <https://sawtooth.hyperledger.org/docs/>`__
+* `IdentityServer <https://docs.identityserver.io/>`__
+* `Idris <https://docs.idris-lang.org/>`__
+* `Inkscape <https://inkscape-manuals.readthedocs.io/>`__ (customized)
+* `javasphinx <https://bronto-javasphinx.readthedocs.io/>`__
+* `Jupyter Notebook <https://jupyter-notebook.readthedocs.io/>`__
+* `Kanboard <https://docs.kanboard.org/>`__
+* `Lasagne <https://lasagne.readthedocs.io/>`__
+* `latexindent.pl <https://latexindentpl.readthedocs.io/>`__
+* `Learning Apache Spark with Python <https://runawayhorse001.github.io/LearningApacheSpark>`__
+* `LibCEED <https://libceed.readthedocs.io/>`__
+* `Linguistica <https://linguistica-uchicago.github.io/lxa5/>`__
+* `Linux kernel <https://www.kernel.org/doc/html/latest/index.html>`__
+* `Mailman <https://docs.list.org/>`__
+* `MathJax <https://docs.mathjax.org/>`__
+* `MDTraj <http://mdtraj.org/>`__ (customized)
+* `Mesa 3D <https://docs.mesa3d.org/>`__
+* `micca - MICrobial Community Analysis <https://micca.readthedocs.io/>`__
+* `MicroPython <https://docs.micropython.org/>`__
+* `Mink <https://mink.behat.org/>`__
+* `Mockery <https://docs.mockery.io/>`__
+* `mod_wsgi <https://modwsgi.readthedocs.io/>`__
+* `MoinMoin <https://moin-20.readthedocs.io/>`__
+* `Mopidy <https://docs.mopidy.com/>`__
+* `mpi4py <https://mpi4py.readthedocs.io/>`__
+* `MyHDL <https://docs.myhdl.org/>`__
+* `Mypy <https://mypy.readthedocs.io/>`__
+* `Netgate Docs <https://docs.netgate.com/>`__
+* `Nextcloud Server <https://docs.nextcloud.com/#server>`__
+* `Nextflow <https://www.nextflow.io/docs/latest/index.html>`__
+* `nghttp2 <https://nghttp2.org/documentation/>`__
+* `NICOS <https://forge.frm2.tum.de/nicos/doc/nicos-master/>`__ (customized)
+* `OpenFAST <https://openfast.readthedocs.io/>`__
+* `Panda3D <https://docs.panda3d.org/>`__ (customized)
+* `Pelican <https://docs.getpelican.com/>`__
+* `picamera <https://picamera.readthedocs.io/>`__
+* `Pillow <https://pillow.readthedocs.io/>`__
+* `pip <https://pip.pypa.io/>`__
+* `Paver <https://paver.readthedocs.io/>`__
+* `peewee <https://docs.peewee-orm.com/>`__
+* `Phinx <https://docs.phinx.org/>`__
+* `phpMyAdmin <https://docs.phpmyadmin.net/>`__
+* `PHPUnit <https://phpunit.readthedocs.io/>`__
+* `PHPWord <https://phpword.readthedocs.io/>`__
+* `PROS <https://pros.cs.purdue.edu/v5/>`__ (customized)
+* `Pweave <https://mpastell.com/pweave/>`__
+* `pyca/cryptograhpy <https://cryptography.io/>`__
+* `PyNaCl <https://pynacl.readthedocs.io/>`__
+* `pyOpenSSL <https://www.pyopenssl.org/>`__
+* `PyPy <https://doc.pypy.org/>`__
+* `python-sqlparse <https://sqlparse.readthedocs.io/>`__
+* `PyVISA <https://pyvisa.readthedocs.io/>`__
+* `Read The Docs <https://docs.readthedocs.io/>`__
+* `RenderDoc <https://renderdoc.org/docs/>`__
+* `ROCm Platform <https://rocmdocs.amd.com/>`__
+* `Free your information from their silos (French) <https://redaction-technique.org/>`__ (customized)
+* `Releases Sphinx extension <https://releases.readthedocs.io/>`__
+* `Qtile <https://docs.qtile.org/>`__
+* `Quex <http://quex.sourceforge.net/doc/html/main.html>`__
+* `QuTiP <https://qutip.org/docs/latest/>`__
+* `Scapy <https://scapy.readthedocs.io/>`__
+* `SimGrid <https://simgrid.org/doc/latest/>`__
+* `SimPy <https://simpy.readthedocs.io/>`__
+* `six <https://six.readthedocs.io/>`__
+* `Solidity <https://solidity.readthedocs.io/>`__
+* `Sonos Controller (SoCo) <https://docs.python-soco.com/>`__
+* `Sphinx AutoAPI <https://sphinx-autoapi.readthedocs.io/>`__
+* `sphinx-argparse <https://sphinx-argparse.readthedocs.io/>`__
+* `sphinx-tabs <https://sphinx-tabs.readthedocs.io/>`__
+* `Sphinx-Gallery <https://sphinx-gallery.readthedocs.io/>`__ (customized)
+* `Sphinx with Github Webpages <https://runawayhorse001.github.io/SphinxGithub>`__
+* `SpotBugs <https://spotbugs.readthedocs.io/>`__
+* `StarUML <https://docs.staruml.io/>`__
+* `Sublime Text Unofficial Documentation <http://docs.sublimetext.info/>`__
+* `SunPy <https://docs.sunpy.org/>`__
+* `Sylius <https://docs.sylius.com/>`__
+* `Syncthing <https://docs.syncthing.net/>`__
+* `Tango Controls <https://tango-controls.readthedocs.io/>`__ (customized)
+* `Topshelf <https://docs.topshelf-project.com/>`__
+* `ThreatConnect <https://docs.threatconnect.com/>`__
+* `TrueNAS <https://www.ixsystems.com/documentation/truenas/>`__ (customized)
+* `Tuleap <https://tuleap.net/doc/en/>`__
+* `TYPO3 <https://docs.typo3.org/>`__ (customized)
+* `Veyon <https://docs.veyon.io/>`__
+* `Ubiquity <https://micro-framework.readthedocs.io/>`__
+* `uWSGI <https://uwsgi-docs.readthedocs.io/>`__
+* `virtualenv <https://virtualenv.readthedocs.io/>`__
+* `Wagtail <https://docs.wagtail.io/>`__
+* `Web Application Attack and Audit Framework (w3af) <https://docs.w3af.org/>`__
+* `Weblate <https://docs.weblate.org/>`__
+* `x265 <https://x265.readthedocs.io/>`__
+* `Zeek <https://docs.zeek.org/>`__
+* `Zulip <https://zulip.readthedocs.io/>`__
+
+Documentation using sphinx_bootstrap_theme
+------------------------------------------
+
+* `Bootstrap Theme <https://ryan-roemer.github.io/sphinx-bootstrap-theme/>`__
+* `C/C++ Software Development with Eclipse <https://eclipsebook.in/>`__
+* `Dataverse <https://guides.dataverse.org/>`__
+* `e-cidadania <https://e-cidadania.readthedocs.io/>`__
+* `Hangfire <https://docs.hangfire.io/>`__
+* `Hedge <https://documen.tician.de/hedge/>`__
+* `ObsPy <https://docs.obspy.org/>`__
+* `OPNFV <https://docs.opnfv.org/>`__
+* `Pootle <https://docs.translatehouse.org/projects/pootle/>`__
+* `PyUblas <https://documen.tician.de/pyublas/>`__
+* `seaborn <https://seaborn.pydata.org/>`__
+
+Documentation using pydata_sphinx_theme
+---------------------------------------
+
+* `Arviz <https://python.arviz.org/en/stable/>`__
+* `Binder <https://mybinder.readthedocs.io/en/latest/>`__
+* `Bokeh <https://docs.bokeh.org/en/latest/>`__
+* `CuPy <https://docs.cupy.dev/en/stable/>`__
+* `EnOSlib <https://discovery.gitlabpages.inria.fr/enoslib/>`__
+* `Fairlearn <https://fairlearn.org/main/>`__
+* `Feature-engine <https://feature-engine.readthedocs.io/en/latest/>`__
+* `Jupyter <https://docs.jupyter.org/en/latest/>`__
+* `Jupyter Book <https://jupyterbook.org/en/stable/intro.html>`__
+* `Matplotlib <https://matplotlib.org/stable/index.html>`__
+* `MegEngine <https://megengine.org.cn/doc/stable/en/>`__
+* `MNE-Python <https://mne.tools/stable/>`__
+* `NetworkX <https://networkx.org/documentation/stable/>`__
+* `Numpy <https://numpy.org/doc/stable/>`__
+* `Pandas <https://pandas.pydata.org/docs/>`__
+* `Pystra (continuation of PyRe) <https://pystra.github.io/pystra/>`__
+* `PyVista <https://docs.pyvista.org/>`__
+* `SciPy <https://docs.scipy.org/doc/scipy/>`__
+* `SEPAL <https://docs.sepal.io/en/latest/index.html>`__
+
+Documentation using a custom theme or integrated in a website
+-------------------------------------------------------------
+
+* `AIOHTTP <https://docs.aiohttp.org/>`__
+* `Apache Cassandra <https://cassandra.apache.org/doc/>`__
+* `Astropy <https://docs.astropy.org/>`__
+* `Boto 3 <https://boto3.readthedocs.io/>`__
+* `CakePHP <https://book.cakephp.org/>`__
+* `Ceph <https://docs.ceph.com/docs/master/>`__
+* `Chef <https://docs.chef.io/>`__
+* `CKAN <https://docs.ckan.org/>`__
+* `Confluent Platform <https://docs.confluent.io/>`__
+* `Django <https://docs.djangoproject.com/>`__
+* `django CMS <https://docs.django-cms.org/>`__
+* `Doctrine <https://www.doctrine-project.org/>`__
+* `Enterprise Toolkit for Acrobat products <https://www.adobe.com/devnet-docs/acrobatetk/>`__
+* `FreeFEM <https://doc.freefem.org/introduction/>`__
+* `fmt <https://fmt.dev/>`__
+* `Gameduino <https://excamera.com/sphinx/gameduino/>`__
+* `gensim <https://radimrehurek.com/gensim/>`__
+* `GeoServer <https://docs.geoserver.org/>`__
+* `gevent <https://www.gevent.org/>`__
+* `GHC - Glasgow Haskell Compiler <https://downloads.haskell.org/~ghc/master/users-guide/>`__
+* `Guzzle <https://docs.guzzlephp.org/>`__
+* `H2O.ai <https://docs.h2o.ai/>`__
+* `Heka <https://hekad.readthedocs.io/>`__
+* `Istihza (Turkish Python documentation project) <https://python-istihza.yazbel.com/>`__
+* `JupyterHub <https://jupyterhub.readthedocs.io/>`__
+* `Kombu <https://kombu.readthedocs.io/>`__
+* `Lasso <http://www.lassoguide.com/>`__
+* `Mako <https://docs.makotemplates.org/>`__
+* `MirrorBrain <https://mirrorbrain-docs.readthedocs.io/>`__
+* `Mitiq <https://mitiq.readthedocs.io/>`__
+* `MongoDB <https://docs.mongodb.com/>`__
+* `Music21 <https://web.mit.edu/music21/doc/>`__
+* `MyHDL <https://docs.myhdl.org/>`__
+* `ndnSIM <https://ndnsim.net/current/>`__
+* `nose <https://nose.readthedocs.io/>`__
+* `ns-3 <https://www.nsnam.org/documentation/>`__
+* `ObjectListView <http://objectlistview.sourceforge.net/python/>`__
+* `OpenERP <https://doc.odoo.com/>`__
+* `OpenCV <https://docs.opencv.org/>`__
+* `Open Dylan <https://opendylan.org/>`__
+* `OpenLayers <http://docs.openlayers.org/>`__
+* `OpenTURNS <https://openturns.github.io/openturns/master/>`__
+* `Open vSwitch <https://docs.openvswitch.org/>`__
+* `PlatformIO <https://docs.platformio.org/>`__
+* `Psycopg <https://www.psycopg.org/docs/>`__
+* `PyEphem <https://rhodesmill.org/pyephem/>`__
+* `Pygments <https://pygments.org/docs/>`__
+* `Plone User Manual (German) <https://www.hasecke.com/plone-benutzerhandbuch/4.0/>`__
+* `PSI4 <https://www.psicode.org/psi4manual/master/index.html>`__
+* `PyMOTW <https://pymotw.com/2/>`__
+* `python-aspectlib <https://python-aspectlib.readthedocs.io/>`__ (`sphinx_py3doc_enhanced_theme <https://pypi.org/project/sphinx_py3doc_enhanced_theme/>`__)
+* `QGIS <https://qgis.org/en/docs/index.html>`__
+* `Roundup <https://www.roundup-tracker.org/>`__
+* `SaltStack <https://docs.saltstack.com/>`__
+* `scikit-learn <https://scikit-learn.org/stable/>`__
+* `Scrapy <https://doc.scrapy.org/>`__
+* `Seaborn <https://seaborn.pydata.org/>`__
+* `Selenium <https://docs.seleniumhq.org/docs/>`__
+* `Self <https://www.selflanguage.org/>`__
+* `Substance D <https://docs.pylonsproject.org/projects/substanced/>`__
+* `Sulu <https://docs.sulu.io/>`__
+* `SQLAlchemy <https://docs.sqlalchemy.org/>`__
+* `tinyTiM <http://tinytim.sourceforge.net/docs/2.0/>`__
+* `Twisted <https://twistedmatrix.com/documents/current/>`__
+* `Ubuntu Packaging Guide <https://packaging.ubuntu.com/html/>`__
+* `WTForms <https://wtforms.readthedocs.io/>`__
+
+Homepages and other non-documentation sites
+-------------------------------------------
+
+* `Alan Crosswell's Using the Django REST Framework and DRF-JSONAPI <http://www.columbia.edu/~alan/django-jsonapi-training/>`__
+* `Arizona State University PHY494/PHY598/CHM598 Simulation approaches to Bio-and Nanophysics <https://becksteinlab.physics.asu.edu/pages/courses/2013/SimBioNano/>`__ (classic)
+* `Benoit Boissinot <https://bboissin.appspot.com/>`__ (classic, customized)
+* `EBI Cloud Consultancy Team <https://tsi-ccdoc.readthedocs.io/>`__ (sphinx_rtd_theme)
+* `Eric Holscher <https://ericholscher.com/>`__ (alabaster)
+* `Florian Diesch <https://www.florian-diesch.de/>`__
+* `Institute for the Design of Advanced Energy Systems (IDAES) <https://idaes-pse.readthedocs.io/>`__ (sphinx_rtd_theme)
+* `IDAES Examples <https://idaes.github.io/examples-pse/>`__ (sphinx_rtd_theme)
+* `Lei Ma's Statistical Mechanics lecture notes <https://statisticalphysics.leima.is/>`__ (sphinx_bootstrap_theme)
+* `Loyola University Chicago CS Academic Programs <https://academics.cs.luc.edu/index.html>`__ (sphinx_rtd_theme, customized)
+* `PyXLL <https://www.pyxll.com/>`__ (sphinx_bootstrap_theme, customized)
+* `SciPy Cookbook <https://scipy-cookbook.readthedocs.io/>`__ (sphinx_rtd_theme)
+* `Tech writer at work blog <https://documatt.com/blog/>`__ (custom theme)
+* `Thomas Cokelaer's Python, Sphinx and reStructuredText tutorials <https://thomas-cokelaer.info/tutorials/>`__ (standard)
+* `UC Berkeley ME233 Advanced Control Systems II course <https://berkeley-me233.github.io/>`__ (sphinxdoc)
+* `Željko Svedružić's Biomolecular Structure and Function Laboratory (BioSFLab) <https://svedruziclab.github.io/>`__ (sphinx_bootstrap_theme)
+
+Books produced using Sphinx
+---------------------------
+
+* `"The Art of Community" (Japanese translation) <https://www.oreilly.co.jp/books/9784873114958/>`__
+* `"Die Wahrheit des Sehens. Der DEKALOG von Krzysztof Kieślowski" <https://literatur.hasecke.com/post/die-wahrheit-des-sehens-dekalog-kieslowski/>`__
+* `"Expert Python Programming" <https://www.packtpub.com/application-development/expert-python-programming>`__
+* `"Expert Python Programming" (Japanese translation) <https://www.amazon.co.jp/dp/4048686291/>`__
+* `"Expert Python Programming 2nd Edition" (Japanese translation) <https://www.amazon.co.jp/dp/4048930613/>`__
+* `"The Hitchhiker's Guide to Python" <https://docs.python-guide.org/>`__
+* `"LassoGuide" <http://www.lassoguide.com/>`__
+* `"Learning Sphinx" (in Japanese) <https://www.oreilly.co.jp/books/9784873116488/>`__
+* `"Learning System Programming with Go (Japanese)" <https://www.lambdanote.com/products/go>`__
+* `"Mercurial: the definitive guide (Second edition)" <https://book.mercurial-scm.org/>`__
+* `"Mithril -- The fastest clientside MVC (Japanese)" <https://www.oreilly.co.jp/books/9784873117447/>`__
+* `"Pioneers and Prominent Men of Utah" <http://pioneers.rstebbing.com/>`__
+* `"Pomodoro Technique Illustrated" (Japanese translation) <https://www.amazon.co.jp/dp/4048689525/>`__
+* `"Professional Software Development" <https://mixmastamyk.bitbucket.io/pro_soft_dev/>`__
+* `"Python Professional Programming" (in Japanese) <https://www.amazon.co.jp/dp/4798032948/>`__
+* `"Python Professional Programming 2nd Edition" (in Japanese) <https://www.amazon.co.jp/dp/479804315X/>`__
+* `"Python Professional Programming 3rd Edition" (in Japanese) <https://www.amazon.co.jp/dp/4798053821/>`__
+* `Python Course by Yuri Petrov (Russian) <https://www.yuripetrov.ru/edu/python>`__
+* `"Real World HTTP -- Learning The Internet and Web Technology via its history and code (Japanese)" <https://www.oreilly.co.jp/books/9784873118048/>`__
+* `"Redmine Primer 5th Edition (in Japanese)" <https://www.shuwasystem.co.jp/products/7980html/4825.html>`__
+* `"The repoze.bfg Web Application Framework" <https://www.amazon.com/repoze-bfg-Web-Application-Framework-Version/dp/0615345379>`__
+* `"The Self-Taught Programmer" (Japanese translation) <https://www.amazon.co.jp/dp/4822292274/>`__
+* `"Simple and Steady Way of Learning for Software Engineering" (in Japanese) <https://www.amazon.co.jp/dp/477414259X/>`__
+* `"Software-Dokumentation mit Sphinx" <https://www.amazon.de/dp/1497448689/>`__
+* `"Theoretical Physics Reference" <https://www.theoretical-physics.net/>`__
+* `"The Varnish Book" <https://info.varnish-software.com/the-varnish-book>`__
+
+Theses produced using Sphinx
+----------------------------
+
+* `"Content Conditioning and Distribution for Dynamic Virtual Worlds" <https://www.cs.princeton.edu/research/techreps/TR-941-12>`__
+* `"The Sphinx Thesis Resource" <https://jterrace.github.io/sphinxtr/>`__
+
+Projects integrating Sphinx functionality
+-----------------------------------------
+
+* `Read the Docs <https://readthedocs.org/>`__, a software-as-a-service documentation hosting platform, uses
+ Sphinx to automatically build documentation updates that are pushed to GitHub.
+
+* `Spyder <https://docs.spyder-ide.org/current/panes/help.html>`__, the Scientific Python Development
+ Environment, uses Sphinx in its help pane to render rich documentation for functions, classes and methods
+ automatically or on-demand.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..12779b2
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,67 @@
+License for Sphinx
+==================
+
+Unless otherwise indicated, all code in the Sphinx project is licenced under the
+two clause BSD licence below.
+
+Copyright (c) 2007-2023 by the Sphinx team (see AUTHORS file).
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Licenses for incorporated software
+==================================
+
+The included implementation of NumpyDocstring._parse_numpydoc_see_also_section
+was derived from code under the following license:
+
+-------------------------------------------------------------------------------
+
+Copyright (C) 2008 Stefan van der Walt <stefan@mentat.za.net>, Pauli Virtanen <pav@iki.fi>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------------------
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..8494bd6
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,147 @@
+Metadata-Version: 2.1
+Name: Sphinx
+Version: 7.2.6
+Summary: Python documentation generator
+Author-email: Georg Brandl <georg@python.org>
+Requires-Python: >=3.9
+Description-Content-Type: text/x-rst
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Console
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Education
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: Intended Audience :: Science/Research
+Classifier: Intended Audience :: System Administrators
+Classifier: License :: OSI Approved :: BSD License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Framework :: Sphinx
+Classifier: Framework :: Sphinx :: Extension
+Classifier: Framework :: Sphinx :: Theme
+Classifier: Topic :: Documentation
+Classifier: Topic :: Documentation :: Sphinx
+Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
+Classifier: Topic :: Printing
+Classifier: Topic :: Software Development
+Classifier: Topic :: Software Development :: Documentation
+Classifier: Topic :: Text Processing
+Classifier: Topic :: Text Processing :: General
+Classifier: Topic :: Text Processing :: Indexing
+Classifier: Topic :: Text Processing :: Markup
+Classifier: Topic :: Text Processing :: Markup :: HTML
+Classifier: Topic :: Text Processing :: Markup :: LaTeX
+Classifier: Topic :: Utilities
+Requires-Dist: sphinxcontrib-applehelp
+Requires-Dist: sphinxcontrib-devhelp
+Requires-Dist: sphinxcontrib-jsmath
+Requires-Dist: sphinxcontrib-htmlhelp>=2.0.0
+Requires-Dist: sphinxcontrib-serializinghtml>=1.1.9
+Requires-Dist: sphinxcontrib-qthelp
+Requires-Dist: Jinja2>=3.0
+Requires-Dist: Pygments>=2.14
+Requires-Dist: docutils>=0.18.1,<0.21
+Requires-Dist: snowballstemmer>=2.0
+Requires-Dist: babel>=2.9
+Requires-Dist: alabaster>=0.7,<0.8
+Requires-Dist: imagesize>=1.3
+Requires-Dist: requests>=2.25.0
+Requires-Dist: packaging>=21.0
+Requires-Dist: importlib-metadata>=4.8; python_version < '3.10'
+Requires-Dist: colorama>=0.4.5; sys_platform == 'win32'
+Requires-Dist: sphinxcontrib-websupport ; extra == "docs"
+Requires-Dist: flake8>=3.5.0 ; extra == "lint"
+Requires-Dist: flake8-simplify ; extra == "lint"
+Requires-Dist: isort ; extra == "lint"
+Requires-Dist: ruff ; extra == "lint"
+Requires-Dist: mypy>=0.990 ; extra == "lint"
+Requires-Dist: sphinx-lint ; extra == "lint"
+Requires-Dist: docutils-stubs ; extra == "lint"
+Requires-Dist: types-requests ; extra == "lint"
+Requires-Dist: pytest>=4.6 ; extra == "test"
+Requires-Dist: html5lib ; extra == "test"
+Requires-Dist: cython>=3.0 ; extra == "test"
+Requires-Dist: setuptools>=67.0 ; extra == "test"
+Requires-Dist: filelock ; extra == "test"
+Project-URL: Changelog, https://www.sphinx-doc.org/en/master/changes.html
+Project-URL: Code, https://github.com/sphinx-doc/sphinx
+Project-URL: Download, https://pypi.org/project/Sphinx/
+Project-URL: Homepage, https://www.sphinx-doc.org/
+Project-URL: Issue tracker, https://github.com/sphinx-doc/sphinx/issues
+Provides-Extra: docs
+Provides-Extra: lint
+Provides-Extra: test
+
+========
+ Sphinx
+========
+
+.. image:: https://img.shields.io/pypi/v/sphinx.svg
+ :target: https://pypi.org/project/Sphinx/
+ :alt: Package on PyPI
+
+.. image:: https://github.com/sphinx-doc/sphinx/actions/workflows/main.yml/badge.svg
+ :target: https://github.com/sphinx-doc/sphinx/actions/workflows/main.yml
+ :alt: Build Status
+
+.. image:: https://readthedocs.org/projects/sphinx/badge/?version=master
+ :target: https://www.sphinx-doc.org/
+ :alt: Documentation Status
+
+.. image:: https://img.shields.io/badge/License-BSD%202--Clause-blue.svg
+ :target: https://opensource.org/licenses/BSD-2-Clause
+ :alt: BSD 2 Clause
+
+**Sphinx makes it easy to create intelligent and beautiful documentation.**
+
+Sphinx uses reStructuredText as its markup language, and many of its strengths
+come from the power and straightforwardness of reStructuredText and its parsing
+and translating suite, the Docutils.
+
+Features
+========
+
+* **Output formats**: HTML, PDF, plain text, EPUB, TeX, manual pages, and more
+* **Extensive cross-references**: semantic markup and automatic links
+ for functions, classes, glossary terms and similar pieces of information
+* **Hierarchical structure**: easy definition of a document tree, with automatic
+ links to siblings, parents and children
+* **Automatic indices**: general index as well as a module index
+* **Code highlighting**: automatic highlighting using the Pygments highlighter
+* **Templating**: Flexible HTML output using the Jinja 2 templating engine
+* **Extension ecosystem**: Many extensions are available, for example for
+ automatic function documentation or working with Jupyter notebooks.
+* **Language Support**: Python, C, C++, JavaScript, mathematics, and many other
+ languages through extensions.
+
+For more information, refer to the `the documentation`_.
+
+Installation
+============
+
+The following command installs Sphinx from the `Python Package Index`_. You will
+need a working installation of Python and pip.
+
+.. code-block:: sh
+
+ pip install -U sphinx
+
+Contributing
+============
+
+We appreciate all contributions! Refer to `the contributors guide`_ for
+information.
+
+.. _the documentation: https://www.sphinx-doc.org/
+.. _the contributors guide: https://www.sphinx-doc.org/en/master/internals/contributing.html
+.. _Python Package Index: https://pypi.org/project/Sphinx/
+
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..d1ad3f4
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,63 @@
+========
+ Sphinx
+========
+
+.. image:: https://img.shields.io/pypi/v/sphinx.svg
+ :target: https://pypi.org/project/Sphinx/
+ :alt: Package on PyPI
+
+.. image:: https://github.com/sphinx-doc/sphinx/actions/workflows/main.yml/badge.svg
+ :target: https://github.com/sphinx-doc/sphinx/actions/workflows/main.yml
+ :alt: Build Status
+
+.. image:: https://readthedocs.org/projects/sphinx/badge/?version=master
+ :target: https://www.sphinx-doc.org/
+ :alt: Documentation Status
+
+.. image:: https://img.shields.io/badge/License-BSD%202--Clause-blue.svg
+ :target: https://opensource.org/licenses/BSD-2-Clause
+ :alt: BSD 2 Clause
+
+**Sphinx makes it easy to create intelligent and beautiful documentation.**
+
+Sphinx uses reStructuredText as its markup language, and many of its strengths
+come from the power and straightforwardness of reStructuredText and its parsing
+and translating suite, the Docutils.
+
+Features
+========
+
+* **Output formats**: HTML, PDF, plain text, EPUB, TeX, manual pages, and more
+* **Extensive cross-references**: semantic markup and automatic links
+ for functions, classes, glossary terms and similar pieces of information
+* **Hierarchical structure**: easy definition of a document tree, with automatic
+ links to siblings, parents and children
+* **Automatic indices**: general index as well as a module index
+* **Code highlighting**: automatic highlighting using the Pygments highlighter
+* **Templating**: Flexible HTML output using the Jinja 2 templating engine
+* **Extension ecosystem**: Many extensions are available, for example for
+ automatic function documentation or working with Jupyter notebooks.
+* **Language Support**: Python, C, C++, JavaScript, mathematics, and many other
+ languages through extensions.
+
+For more information, refer to the `the documentation`_.
+
+Installation
+============
+
+The following command installs Sphinx from the `Python Package Index`_. You will
+need a working installation of Python and pip.
+
+.. code-block:: sh
+
+ pip install -U sphinx
+
+Contributing
+============
+
+We appreciate all contributions! Refer to `the contributors guide`_ for
+information.
+
+.. _the documentation: https://www.sphinx-doc.org/
+.. _the contributors guide: https://www.sphinx-doc.org/en/master/internals/contributing.html
+.. _Python Package Index: https://pypi.org/project/Sphinx/
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..84eafdb
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,20 @@
+# Makefile for Sphinx documentation
+#
+PYTHON ?= python3
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = $(PYTHON) ../sphinx/cmd/build.py
+SOURCEDIR = .
+BUILDDIR = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/doc/_static/Makefile b/doc/_static/Makefile
new file mode 100644
index 0000000..8c880bc
--- /dev/null
+++ b/doc/_static/Makefile
@@ -0,0 +1,6 @@
+translation.png: translation.puml
+ plantuml -tpng $<
+translation.svg: translation.puml
+ plantuml -tsvg $<
+clean:
+ rm -f translation.png translation.svg
diff --git a/doc/_static/bookcover.png b/doc/_static/bookcover.png
new file mode 100644
index 0000000..0a8167f
--- /dev/null
+++ b/doc/_static/bookcover.png
Binary files differ
diff --git a/doc/_static/conf.py.txt b/doc/_static/conf.py.txt
new file mode 100644
index 0000000..c5e75e0
--- /dev/null
+++ b/doc/_static/conf.py.txt
@@ -0,0 +1,346 @@
+# test documentation build configuration file, created by
+# sphinx-quickstart on Sun Jun 26 00:00:43 2016.
+#
+# This file is executed through importlib.import_module with
+# the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The encoding of source files.
+#
+# source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+root_doc = 'index'
+
+# General information about the project.
+project = 'test'
+copyright = '2016, test'
+author = 'test'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = 'test'
+# The full version, including alpha/beta/rc tags.
+release = 'test'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#
+# today = ''
+#
+# Else, today_fmt is used as the format for a strftime call.
+#
+# today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# These patterns also affect html_static_path and html_extra_path
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+# keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'alabaster'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#
+# html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# html_theme_path = []
+
+# The name for this set of Sphinx documents.
+# "<project> v<release> documentation" by default.
+#
+# html_title = 'test vtest'
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#
+# html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#
+# html_logo = None
+
+# The name of an image file (relative to this directory) to use as a favicon of
+# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#
+# html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#
+# html_extra_path = []
+
+# If not None, a 'Last updated on:' timestamp is inserted at every page
+# bottom, using the given strftime format.
+# The empty string is equivalent to '%b %d, %Y'.
+#
+# html_last_updated_fmt = None
+
+# Custom sidebar templates, maps document names to template names.
+#
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+#
+# html_domain_indices = True
+
+# If false, no index is generated.
+#
+# html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#
+# html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#
+# html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#
+# html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#
+# html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#
+# html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
+#
+# html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# 'ja' uses this config value.
+# 'zh' user can custom change `jieba` dictionary path.
+#
+# html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#
+# html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'testdoc'
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+ # The paper size ('letterpaper' or 'a4paper').
+ #
+ # 'papersize': 'letterpaper',
+
+ # The font size ('10pt', '11pt' or '12pt').
+ #
+ # 'pointsize': '10pt',
+
+ # Additional stuff for the LaTeX preamble.
+ #
+ # 'preamble': '',
+
+ # Latex figure (float) alignment
+ #
+ # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ (root_doc, 'test.tex', 'test Documentation',
+ 'test', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#
+# latex_logo = None
+
+# If true, show page references after internal links.
+#
+# latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#
+# latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#
+# latex_appendices = []
+
+# If false, no module index is generated.
+#
+# latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ (root_doc, 'test', 'test Documentation',
+ [author], 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 = [
+ (root_doc, 'test', 'test Documentation',
+ author, 'test', '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'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#
+# texinfo_no_detailmenu = False
+
+# If false, do not generate in manual @ref nodes.
+#
+# texinfo_cross_references = False
+
+# -- A random example -----------------------------------------------------
+
+import sys, os
+sys.path.insert(0, os.path.abspath('.'))
+exclude_patterns = ['zzz']
+
+numfig = True
+#language = 'ja'
+
+extensions.append('sphinx.ext.todo')
+extensions.append('sphinx.ext.autodoc')
+#extensions.append('sphinx.ext.autosummary')
+extensions.append('sphinx.ext.intersphinx')
+extensions.append('sphinx.ext.mathjax')
+extensions.append('sphinx.ext.viewcode')
+extensions.append('sphinx.ext.graphviz')
+
+
+autosummary_generate = True
+html_theme = 'default'
+#source_suffix = ['.rst', '.txt']
diff --git a/doc/_static/favicon.svg b/doc/_static/favicon.svg
new file mode 100644
index 0000000..c3e1acd
--- /dev/null
+++ b/doc/_static/favicon.svg
@@ -0,0 +1,8 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
+ <style>
+ @media (prefers-color-scheme: dark) {
+ svg { fill: white; }
+ }
+ </style>
+ <path d="m 67.780707,71.526216 c 0,-2.720856 0.735772,-7.633735 1.635035,-10.917507 2.076574,-7.582764 3.222746,-16.97568 2.071477,-16.97568 -0.485619,0 -3.994408,3.173002 -7.797313,7.051115 -14.448869,14.734603 -29.952812,23.068339 -42.915946,23.068339 -7.400211,0 -12.4298817,-1.871115 -17.2867007,-6.430912 -2.94436186,-2.764297 -3.47532146,-4.129685 -3.47532146,-8.936928 0,-4.94488 0.4862322,-6.108589 3.78321146,-9.054437 2.987989,-2.669773 4.875111,-3.380296 8.9779137,-3.380296 3.163221,0.711278 5.032659,0.664017 6.063532,1.917191 1.045041,1.231842 1.406892,5.262673 0.143323,7.623675 -0.674746,1.260763 -2.435471,2.043539 -4.5966,2.043539 -2.040303,0 -3.203991,-0.483702 -2.786976,-1.15844 1.31395,-2.126021 -0.560952,-3.566616 -2.9664067,-2.279256 -2.907025,1.555792 -2.957418,7.069066 -0.08839,9.665535 4.0345357,3.651203 15.1912207,5.023925 21.9019857,2.694828 7.250749,-2.516503 16.739014,-8.578986 24.30831,-15.531674 l 6.657407,-6.115083 -8.688303,-0.05007 C 43.622519,44.707714 37.702703,43.621524 18.54695,38.489741 12.175528,36.782852 6.0502733,35.306342 4.9352743,35.208608 3.6710803,35.097791 2.841723,34.067882 2.9080043,32.476074 3.0199286,29.788108 4.4800823,27.78768 6.2067673,27.033038 7.2437505,26.579828 14.43583,25.894406 22.0605,23.866486 c 29.699148,-7.899023 31.502043,-6.781254 51.28707,-1.772167 6.461504,1.635896 13.942408,3.414988 17.256961,3.474566 5.106245,0.09178 6.211825,0.514653 7.240255,2.76932 0.66758,1.46355 1.21378,2.858905 1.21378,3.10079 0,0.241884 -2.89333,1.764397 -6.429613,3.383363 -12.984983,5.944723 -17.083271,9.093943 -12.855172,15.130399 1.753219,2.503069 1.718037,2.768923 -0.57922,4.37799 -1.345193,0.942203 -2.457238,2.856456 -2.471232,4.253898 -0.03777,3.776976 -2.424786,11.884847 -5.893734,15.080164 l -3.048923,2.808424 z m 6.632814,-34.658372 c 5.169656,-1.440693 8.302047,-3.07045 14.72913,-6.500861 -5.292267,-1.548658 -18.570782,-3.724097 -18.570782,-3.724097 -9.796513,-1.964547 -8.76916,-1.865132 -9.21348,0.29669 -0.176673,0.859598 -0.702644,2.763948 -1.872329,4.596663 -2.251474,3.527711 -10.489307,4.271075 -15.214327,2.009703 -1.482367,-0.709454 -2.971272,-3.416276 -2.950606,-5.336922 0.02911,-2.705486 -1.505386,-3.336055 -2.486689,-2.975309 -0.796428,0.292781 -3.384665,0.330004 -9.071284,1.864262 -18.784765,5.068157 -21.3552119,4.487473 -9.110967,6.223299 1.472409,0.208739 9.252992,2.381926 13.052028,3.39412 9.318588,2.482796 11.064717,2.665087 23.125496,2.414247 8.385835,-0.174409 11.891174,-0.675356 17.58381,-2.261795 z M 3.0589449,14.916483 C 3.2921927,12.514245 3.424378,11.992797 10.100599,10.647894 13.924923,9.8774962 23.355266,7.3808108 31.056903,5.0997052 c 17.703937,-5.2436279 22.73392,-5.2565016 41.092202,-0.105175 7.923233,2.2232606 16.798382,4.047803 19.72254,4.054541 4.567242,0.01054 6.941892,2.0284768 6.941892,2.0284768 2.101843,4.825342 1.718463,5.158474 -6.484103,5.158474 -5.714193,0 -10.641875,-0.963081 -18.245438,-3.565943 C 68.300078,10.69012 60.060462,8.8316882 55.557963,8.4915615 47.342337,7.8709375 47.353713,7.8687835 21.963188,14.855617 17.503192,16.082896 11.34213,17.454164 8.2719268,17.902883 l -5.5821654,0.81585 z" />
+</svg>
diff --git a/doc/_static/more.png b/doc/_static/more.png
new file mode 100644
index 0000000..97553a8
--- /dev/null
+++ b/doc/_static/more.png
Binary files differ
diff --git a/doc/_static/sphinx.png b/doc/_static/sphinx.png
new file mode 100644
index 0000000..0a103cd
--- /dev/null
+++ b/doc/_static/sphinx.png
Binary files differ
diff --git a/doc/_static/themes/agogo.png b/doc/_static/themes/agogo.png
new file mode 100644
index 0000000..5a09cb9
--- /dev/null
+++ b/doc/_static/themes/agogo.png
Binary files differ
diff --git a/doc/_static/themes/alabaster.png b/doc/_static/themes/alabaster.png
new file mode 100644
index 0000000..4a49c1a
--- /dev/null
+++ b/doc/_static/themes/alabaster.png
Binary files differ
diff --git a/doc/_static/themes/bizstyle.png b/doc/_static/themes/bizstyle.png
new file mode 100644
index 0000000..e19fb6b
--- /dev/null
+++ b/doc/_static/themes/bizstyle.png
Binary files differ
diff --git a/doc/_static/themes/classic.png b/doc/_static/themes/classic.png
new file mode 100644
index 0000000..3b3c9cb
--- /dev/null
+++ b/doc/_static/themes/classic.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/agogo.png b/doc/_static/themes/fullsize/agogo.png
new file mode 100644
index 0000000..106a16c
--- /dev/null
+++ b/doc/_static/themes/fullsize/agogo.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/alabaster.png b/doc/_static/themes/fullsize/alabaster.png
new file mode 100644
index 0000000..5eca209
--- /dev/null
+++ b/doc/_static/themes/fullsize/alabaster.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/bizstyle.png b/doc/_static/themes/fullsize/bizstyle.png
new file mode 100644
index 0000000..5860647
--- /dev/null
+++ b/doc/_static/themes/fullsize/bizstyle.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/classic.png b/doc/_static/themes/fullsize/classic.png
new file mode 100644
index 0000000..269dab2
--- /dev/null
+++ b/doc/_static/themes/fullsize/classic.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/haiku.png b/doc/_static/themes/fullsize/haiku.png
new file mode 100644
index 0000000..707d2bf
--- /dev/null
+++ b/doc/_static/themes/fullsize/haiku.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/nature.png b/doc/_static/themes/fullsize/nature.png
new file mode 100644
index 0000000..00730c0
--- /dev/null
+++ b/doc/_static/themes/fullsize/nature.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/pyramid.png b/doc/_static/themes/fullsize/pyramid.png
new file mode 100644
index 0000000..3b9d04d
--- /dev/null
+++ b/doc/_static/themes/fullsize/pyramid.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/scrolls.png b/doc/_static/themes/fullsize/scrolls.png
new file mode 100644
index 0000000..8a1c1fa
--- /dev/null
+++ b/doc/_static/themes/fullsize/scrolls.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/sphinx_rtd_theme.png b/doc/_static/themes/fullsize/sphinx_rtd_theme.png
new file mode 100644
index 0000000..95cff4c
--- /dev/null
+++ b/doc/_static/themes/fullsize/sphinx_rtd_theme.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/sphinxdoc.png b/doc/_static/themes/fullsize/sphinxdoc.png
new file mode 100644
index 0000000..eb498e3
--- /dev/null
+++ b/doc/_static/themes/fullsize/sphinxdoc.png
Binary files differ
diff --git a/doc/_static/themes/fullsize/traditional.png b/doc/_static/themes/fullsize/traditional.png
new file mode 100644
index 0000000..07ad008
--- /dev/null
+++ b/doc/_static/themes/fullsize/traditional.png
Binary files differ
diff --git a/doc/_static/themes/haiku.png b/doc/_static/themes/haiku.png
new file mode 100644
index 0000000..4530deb
--- /dev/null
+++ b/doc/_static/themes/haiku.png
Binary files differ
diff --git a/doc/_static/themes/nature.png b/doc/_static/themes/nature.png
new file mode 100644
index 0000000..ad39b32
--- /dev/null
+++ b/doc/_static/themes/nature.png
Binary files differ
diff --git a/doc/_static/themes/pyramid.png b/doc/_static/themes/pyramid.png
new file mode 100644
index 0000000..72749dd
--- /dev/null
+++ b/doc/_static/themes/pyramid.png
Binary files differ
diff --git a/doc/_static/themes/scrolls.png b/doc/_static/themes/scrolls.png
new file mode 100644
index 0000000..1a11737
--- /dev/null
+++ b/doc/_static/themes/scrolls.png
Binary files differ
diff --git a/doc/_static/themes/sphinx_rtd_theme.png b/doc/_static/themes/sphinx_rtd_theme.png
new file mode 100644
index 0000000..7c3b7ae
--- /dev/null
+++ b/doc/_static/themes/sphinx_rtd_theme.png
Binary files differ
diff --git a/doc/_static/themes/sphinxdoc.png b/doc/_static/themes/sphinxdoc.png
new file mode 100644
index 0000000..587363e
--- /dev/null
+++ b/doc/_static/themes/sphinxdoc.png
Binary files differ
diff --git a/doc/_static/themes/traditional.png b/doc/_static/themes/traditional.png
new file mode 100644
index 0000000..9820fd0
--- /dev/null
+++ b/doc/_static/themes/traditional.png
Binary files differ
diff --git a/doc/_static/translation.png b/doc/_static/translation.png
new file mode 100644
index 0000000..002b3d1
--- /dev/null
+++ b/doc/_static/translation.png
Binary files differ
diff --git a/doc/_static/translation.puml b/doc/_static/translation.puml
new file mode 100644
index 0000000..7b8fc9f
--- /dev/null
+++ b/doc/_static/translation.puml
@@ -0,0 +1,16 @@
+@startuml
+file "SphinxProject"
+file ".rst"
+database ".pot"
+database ".po"
+database ".mo"
+actor translator
+file TranslatedBuild
+translator -l-> .po
+SphinxProject -r-> .rst
+.rst -r-> .pot : sphinx-build gettext
+.pot -r-> .po : Pootle
+.po -d-> .mo : msgfmt
+.mo -l-> TranslatedBuild
+.rst -d-> TranslatedBuild : "sphinx-build -Dlanguage="
+@enduml
diff --git a/doc/_static/translation.svg b/doc/_static/translation.svg
new file mode 100644
index 0000000..4e3ab5a
--- /dev/null
+++ b/doc/_static/translation.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="223px" preserveAspectRatio="none" style="width:637px;height:223px;" version="1.1" viewBox="0 0 637 223" width="637px" zoomAndPan="magnify"><defs><filter height="300%" id="fh7abla96c8rb" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><!--MD5=[631d54569d64dd7be7afb1602a233020]
+entity SphinxProject--><polygon fill="#FEFECE" filter="url(#fh7abla96c8rb)" points="6,30.5,6,66.7969,120,66.7969,120,40.5,110,30.5,6,30.5" style="stroke: #000000; stroke-width: 1.5;"/><path d="M110,30.5 L110,40.5 L120,40.5 " fill="#FEFECE" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="94" x="16" y="53.4951">SphinxProject</text><!--MD5=[61096c0d57626e43fed95496d4441932]
+entity .rst--><polygon fill="#FEFECE" filter="url(#fh7abla96c8rb)" points="155,30.5,155,66.7969,197,66.7969,197,40.5,187,30.5,155,30.5" style="stroke: #000000; stroke-width: 1.5;"/><path d="M187,30.5 L187,40.5 L197,40.5 " fill="#FEFECE" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="22" x="165" y="53.4951">.rst</text><!--MD5=[08ed079d9b091f9ed2d220f9f6abc033]
+entity .pot--><path d="M359.5,36 C359.5,26 383,26 383,26 C383,26 406.5,26 406.5,36 L406.5,61.2969 C406.5,71.2969 383,71.2969 383,71.2969 C383,71.2969 359.5,71.2969 359.5,61.2969 L359.5,36 " fill="#FEFECE" filter="url(#fh7abla96c8rb)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M359.5,36 C359.5,46 383,46 383,46 C383,46 406.5,46 406.5,36 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="27" x="369.5" y="62.9951">.pot</text><!--MD5=[66eca29884632d3929c321eae20b9288]
+entity .po--><path d="M483,36 C483,26 504,26 504,26 C504,26 525,26 525,36 L525,61.2969 C525,71.2969 504,71.2969 504,71.2969 C504,71.2969 483,71.2969 483,61.2969 L483,36 " fill="#FEFECE" filter="url(#fh7abla96c8rb)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M483,36 C483,46 504,46 504,46 C504,46 525,46 525,36 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="22" x="493" y="62.9951">.po</text><!--MD5=[fad5092d1b513ed9e4cd2391fb0fb212]
+entity .mo--><path d="M398,176 C398,166 421,166 421,166 C421,166 444,166 444,176 L444,201.2969 C444,211.2969 421,211.2969 421,211.2969 C421,211.2969 398,211.2969 398,201.2969 L398,176 " fill="#FEFECE" filter="url(#fh7abla96c8rb)" style="stroke: #000000; stroke-width: 1.5;"/><path d="M398,176 C398,186 421,186 421,186 C421,186 444,186 444,176 " fill="none" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="26" x="408" y="202.9951">.mo</text><!--MD5=[8f276d451ff344d4b5b89d896332ffcd]
+entity translator--><ellipse cx="593" cy="17.5" fill="#FEFECE" filter="url(#fh7abla96c8rb)" rx="8" ry="8" style="stroke: #A80036; stroke-width: 1.5;"/><path d="M593,25.5 L593,52.5 M580,33.5 L606,33.5 M593,52.5 L580,67.5 M593,52.5 L606,67.5 " fill="none" filter="url(#fh7abla96c8rb)" style="stroke: #A80036; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="65" x="560.5" y="85.9951">translator</text><!--MD5=[ba0f3816bcb6df458d88626e193b44ee]
+entity TranslatedBuild--><polygon fill="#FEFECE" filter="url(#fh7abla96c8rb)" points="214.5,170.5,214.5,206.7969,341.5,206.7969,341.5,180.5,331.5,170.5,214.5,170.5" style="stroke: #000000; stroke-width: 1.5;"/><path d="M331.5,170.5 L331.5,180.5 L341.5,180.5 " fill="#FEFECE" style="stroke: #000000; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacingAndGlyphs" textLength="107" x="224.5" y="193.4951">TranslatedBuild</text><!--MD5=[2a0f0d8c54238b3eb600ae284aca39d2]
+reverse link .po to translator--><path d="M530.44,48.5 C540.43,48.5 550.43,48.5 560.43,48.5 " fill="none" id=".po&lt;-translator" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="525.21,48.5,534.21,52.5,530.21,48.5,534.21,44.5,525.21,48.5" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[25ad71f3d3609323ec521914d1dc498d]
+link SphinxProject to .rst--><path d="M120.38,48.5 C130.13,48.5 139.87,48.5 149.61,48.5 " fill="none" id="SphinxProject-&gt;.rst" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="154.71,48.5,145.71,44.5,149.71,48.5,145.71,52.5,154.71,48.5" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[1109e8764a7297dc8aca732b1794aa90]
+link .rst to .pot--><path d="M197.37,48.5 C234.72,48.5 311.88,48.5 354,48.5 " fill="none" id=".rst-&gt;.pot" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="359.21,48.5,350.21,44.5,354.21,48.5,350.21,52.5,359.21,48.5" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="126" x="215.25" y="41.5669">sphinx-build gettext</text><!--MD5=[c2d0ba229470f335ea07ab2ed6b28ec0]
+link .pot to .po--><path d="M406.62,48.5 C427.03,48.5 456.51,48.5 477.68,48.5 " fill="none" id=".pot-&gt;.po" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="482.87,48.5,473.87,44.5,477.87,48.5,473.87,52.5,482.87,48.5" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="40" x="424.75" y="41.5669">Pootle</text><!--MD5=[06651b5914fbf4764a077bbac7efe19a]
+link .po to .mo--><path d="M491.03,71.06 C476.38,95.43 452.52,135.09 436.8,161.24 " fill="none" id=".po-&gt;.mo" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="434.15,165.63,442.2104,159.9705,436.7225,161.3425,435.3505,155.8546,434.15,165.63" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="50" x="462" y="132.0669">msgfmt</text><!--MD5=[02fa75427086f2cebad4a5f1b2dd96dd]
+reverse link TranslatedBuild to .mo--><path d="M346.94,188.5 C363.88,188.5 380.82,188.5 397.76,188.5 " fill="none" id="TranslatedBuild&lt;-.mo" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="341.68,188.5,350.68,192.5,346.68,188.5,350.68,184.5,341.68,188.5" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[e72b6258a50343d4926d984a36170cf2]
+link .rst to TranslatedBuild--><path d="M188.71,66.7 C207.27,91.8 241.75,138.46 262,165.86 " fill="none" id=".rst-&gt;TranslatedBuild" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="265.13,170.08,262.9905,160.4663,262.1552,166.0612,256.5604,165.226,265.13,170.08" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="165" x="241" y="132.0669">sphinx-build -Dlanguage=</text><!--MD5=[30dba34f254541587149d90abdb00688]
+@startuml
+file "SphinxProject"
+file ".rst"
+database ".pot"
+database ".po"
+database ".mo"
+actor translator
+file TranslatedBuild
+translator -l-> .po
+SphinxProject -r-> .rst
+.rst -r-> .pot : sphinx-build gettext
+.pot -r-> .po : Pootle
+.po -d-> .mo : msgfmt
+.mo -l-> TranslatedBuild
+.rst -d-> TranslatedBuild : "sphinx-build -Dlanguage="
+@enduml
+
+PlantUML version 1.2020.00(Sat Jan 11 12:30:53 GMT 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 1.8.0_252-b09
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: null
+--></g></svg> \ No newline at end of file
diff --git a/doc/_static/tutorial/lumache-autosummary.png b/doc/_static/tutorial/lumache-autosummary.png
new file mode 100644
index 0000000..ed54ea3
--- /dev/null
+++ b/doc/_static/tutorial/lumache-autosummary.png
Binary files differ
diff --git a/doc/_static/tutorial/lumache-first-light.png b/doc/_static/tutorial/lumache-first-light.png
new file mode 100644
index 0000000..fbf4aec
--- /dev/null
+++ b/doc/_static/tutorial/lumache-first-light.png
Binary files differ
diff --git a/doc/_static/tutorial/lumache-furo.png b/doc/_static/tutorial/lumache-furo.png
new file mode 100644
index 0000000..c7aaee7
--- /dev/null
+++ b/doc/_static/tutorial/lumache-furo.png
Binary files differ
diff --git a/doc/_static/tutorial/lumache-py-function-full.png b/doc/_static/tutorial/lumache-py-function-full.png
new file mode 100644
index 0000000..d13b637
--- /dev/null
+++ b/doc/_static/tutorial/lumache-py-function-full.png
Binary files differ
diff --git a/doc/_static/tutorial/lumache-py-function.png b/doc/_static/tutorial/lumache-py-function.png
new file mode 100644
index 0000000..06129d5
--- /dev/null
+++ b/doc/_static/tutorial/lumache-py-function.png
Binary files differ
diff --git a/doc/_templates/contents.html b/doc/_templates/contents.html
new file mode 100644
index 0000000..5eefe4e
--- /dev/null
+++ b/doc/_templates/contents.html
@@ -0,0 +1,8 @@
+{% extends "layout.html" %}
+{% set title = _('Sphinx documentation contents') %}
+{% block body %}
+<h1>{{ _('Sphinx documentation contents') }}</h1>
+<div class="toctree-wrapper compound">
+{{ toctree(includehidden=True, collapse=False, maxdepth=3) }}
+</div>
+{% endblock %}
diff --git a/doc/_themes/sphinx13/layout.html b/doc/_themes/sphinx13/layout.html
new file mode 100644
index 0000000..86a7943
--- /dev/null
+++ b/doc/_themes/sphinx13/layout.html
@@ -0,0 +1,60 @@
+{# Sphinx layout template for the sphinxdoc theme. #}
+{%- extends "basic/layout.html" %}
+
+{% block extrahead %}
+{{ super() }}
+{%- if not embedded and pagename == 'index' %}
+<style>.related { display: none; }</style>
+{%- endif %}
+{% endblock %}
+
+{% block header %}
+<div class="pageheader">
+<a href="{{ pathto('index') }}">
+ <img src="{{ pathto('_static/sphinxheader.png', 1) }}" alt="SPHINX" />
+</a>
+</div>
+{% endblock %}
+
+{%- block relbar1 %}
+<div class="related" role="navigation" aria-label="related navigation">
+ <h3>{{ _('Navigation') }}</h3>
+ <ul>
+ <li><a href="{{ pathto('index') }}">Documentation</a> &raquo;</li>
+ {%- for parent in parents %}
+ <li class="nav-item nav-item-{{ loop.index }}"><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
+ {%- endfor %}
+ <li class="nav-item nav-item-this"><a href="{{ link|e }}">{{ title }}</a></li>
+ </ul>
+</div>
+{% endblock %}
+
+{%- block content %}
+<div class="document">
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ {%- include "searchfield.html" %}
+ <div class="sphinxsidebar-navigation__contents">
+ <h3>{{ _('On this page') }}</h3>
+ {{ toc }}
+ </div>
+ <div class="sphinxsidebar-navigation__pages">
+ <h3>{{ _('Site navigation') }}</h3>
+ {{ toctree(includehidden=True, maxdepth=3, titles_only=True) }}
+ </div>
+ </div>
+ {%- block document %}
+ <div class="body" role="main">
+ {% block body %}{% endblock %}
+ </div>
+ {%- endblock %}
+</div>
+{%- endblock %}
+
+{%- block relbar2 %}{% endblock %}
+
+{%- block footer %}
+<div class="footer" role="contentinfo">
+ {{ copyright_block() }}
+ {% trans sphinx_version=sphinx_version|e %}Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+</div>
+{%- endblock %}
diff --git a/doc/_themes/sphinx13/static/sphinx13.css b/doc/_themes/sphinx13/static/sphinx13.css
new file mode 100644
index 0000000..674d211
--- /dev/null
+++ b/doc/_themes/sphinx13/static/sphinx13.css
@@ -0,0 +1,362 @@
+/* Stylesheet for Sphinx's documentation */
+
+/* Set master colours */
+:root {
+ --fonts-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
+ --colour-sphinx-blue: #0A507A;
+ --colour-text: #333;
+ --colour-links-light: #057;
+}
+
+body {
+ font-family: var(--fonts-sans-serif);
+ margin: 0 auto;
+ color: var(--colour-text);
+}
+
+.pageheader {
+ background-color: var(--colour-sphinx-blue);
+ padding: 10px 15px;
+}
+
+div.document {
+ display: flex;
+ margin: 0 0.5em;
+}
+
+div.body {
+ border-left: 1px solid var(--colour-sphinx-blue);
+ margin: 0;
+ padding: 0.5em 1.75em;
+ min-width: 0;
+ max-width: 800px;
+}
+
+div.related {
+ display: flex;
+ color: white;
+ background-color: var(--colour-sphinx-blue);
+ border-top: 1px solid #002e50;
+}
+
+div.related ul li {
+ margin: 0 5px 0 0;
+ float: left;
+}
+
+div.related ul li a {
+ padding: 0 5px 0 5px;
+ line-height: 1.75em;
+ color: white;
+}
+
+div.related ul li a:hover {
+ text-shadow: 0 0 1px rgba(255, 255, 255, 0.5);
+}
+
+div.sphinxsidebarwrapper {
+ padding: 0;
+}
+
+div.sphinxsidebar {
+ position: sticky;
+ top: 0;
+ align-self: flex-start;
+ height: 100vh;
+ width: 250px;
+ overflow-y: auto;
+ overflow-wrap: break-word;
+ margin: 0;
+ padding-right: 15px;
+ padding-top: 0.5em;
+ font-size: 1em;
+}
+
+div.sphinxsidebar h3 {
+ font-size: 1.5em;
+ margin-top: 0;
+ margin-bottom: 0.5em;
+ padding-top: 0.5em;
+}
+
+div.sphinxsidebar h4 {
+ font-size: 1.2em;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar h3, div.sphinxsidebar h4 {
+ margin-right: -15px;
+ margin-left: -15px;
+ padding-right: 14px;
+ padding-left: 14px;
+ color: #333;
+ font-weight: 300;
+}
+
+div.sphinxsidebar h3 a {
+ color: #333;
+}
+
+div.sphinxsidebar ul {
+ color: #444;
+ margin-top: 7px;
+ padding: 0;
+ line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+ margin-left: 1rem;
+ list-style-type: none;
+ font-size: .9em;
+}
+
+/* De-dent the first list because we hide the top-level item */
+.sphinxsidebar .sphinxsidebar-navigation__contents > ul > li > ul {
+ margin-left: 0;
+}
+
+div.sphinxsidebar p.caption {
+ font-weight: 300;
+ font-size: 1.2rem;
+}
+
+div.sphinxsidebar li.current > a {
+ font-weight: 600;
+}
+
+.sphinxsidebar-navigation__contents > ul > li > a {
+ display: none;
+}
+
+div.sphinxsidebar #searchbox {
+ margin: 12px 0 20px 0;
+}
+
+div.footer {
+ background-color: var(--colour-sphinx-blue);
+ color: #ccc;
+ text-shadow: 0 0 .2px rgba(255, 255, 255, 0.8);
+ padding: 3px 8px 3px 8px;
+ clear: both;
+ font-size: 0.8em;
+}
+
+/* no need to make a visible link to Sphinx on the Sphinx page */
+div.footer a {
+ color: #ccc;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+p {
+ margin: 0.8em 0 0.5em 0;
+}
+
+a {
+ color: var(--colour-links-light);
+ text-decoration: none;
+}
+
+div.body a {
+ text-decoration: underline;
+}
+
+h1 {
+ margin: 10px 0 0 0;
+ font-size: 2.4em;
+ color: var(--colour-sphinx-blue);
+ font-weight: 300;
+}
+
+h1 span.pre {
+ /* for code in titles */
+ word-break: break-all;
+ white-space: normal;
+}
+
+h2 {
+ margin: 1em 0 0.2em 0;
+ font-size: 1.5em;
+ font-weight: 300;
+ padding: 0;
+ color: #174967;
+}
+
+h3 {
+ margin: 1em 0 -0.3em 0;
+ font-size: 1.3em;
+ font-weight: 300;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+ text-decoration: none;
+}
+
+div.body h1 a tt, div.body h2 a tt, div.body h3 a tt, div.body h4 a tt, div.body h5 a tt, div.body h6 a tt {
+ color: var(--colour-sphinx-blue) !important;
+ font-size: inherit !important;
+}
+
+a.headerlink {
+ color: var(--colour-sphinx-blue) !important;
+ font-size: .8em;
+ margin-left: 6px;
+ padding: 0 4px 0 4px;
+ text-decoration: none !important;
+}
+
+a.headerlink:hover {
+ background-color: #ccc;
+ color: white!important;
+}
+
+/* avoid font-size when :mod: role in headings */
+h1 code, h2 code, h3 code, h4 code {
+ font-size: inherit;
+}
+
+cite, code, tt {
+ font-family: 'Consolas', 'DejaVu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 1em;
+ letter-spacing: -0.02em;
+}
+
+table.deprecated code.literal {
+ word-break: break-all;
+}
+
+tt {
+ background-color: #f2f2f2;
+ border: 1px solid #ddd;
+ border-radius: 2px;
+ color: #333;
+ padding: 1px 0.2em;
+}
+
+tt.descname, tt.descclassname, tt.xref {
+ border: 0;
+}
+
+hr {
+ border: 1px solid #abc;
+ margin: 2em;
+}
+
+a tt {
+ border: 0;
+ color: var(--colour-links-light);
+}
+
+pre {
+ font-family: 'Consolas', 'Courier New', 'DejaVu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 1em;
+ letter-spacing: 0.015em;
+ line-height: 120%;
+ padding: 0.5em;
+ border: 1px solid #ccc;
+ border-radius: 2px;
+ background-color: #f8f8f8;
+}
+
+pre a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td.linenos pre {
+ padding: 0.5em 0;
+}
+
+div.quotebar {
+ background-color: #f8f8f8;
+ max-width: 250px;
+ float: right;
+ padding: 0px 7px;
+ border: 1px solid #ccc;
+ margin-left: 1em;
+}
+
+blockquote.epigraph {
+ font-size: 1.5em;
+ padding-left: 1rem;
+ margin-left: 0;
+}
+
+nav.contents,
+div.topic,
+aside.topic {
+ background-color: #f8f8f8;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+ padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.admonition, div.warning {
+ font-size: 0.9em;
+ margin: 1em 0 1em 0;
+ border: 1px solid #86989B;
+ border-radius: 2px;
+ background-color: #f7f7f7;
+ padding: 1rem;
+}
+
+div.admonition > p, div.warning > p {
+ margin: 0;
+ padding: 0;
+}
+
+div.admonition > pre, div.warning > pre {
+ margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition > p.admonition-title,
+div.warning > p.admonition-title {
+ font-weight: bold;
+}
+
+div.warning {
+ border: 1px solid #940000;
+}
+
+div.admonition > ul,
+div.admonition > ol,
+div.warning > ul,
+div.warning > ol {
+ margin: 0.1em 0.5em 0.5em 3em;
+ padding: 0;
+}
+
+div.admonition div.highlight {
+ background: none;
+}
+
+.viewcode-back {
+ font-family: var(--fonts-sans-serif);
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
+
+
+/* media queries */
+
+/* Reduce padding & margins for smaller screens */
+@media (max-width: 750px) {
+ .sphinxsidebar {
+ display: none;
+ }
+ div.body {
+ border-left: none;
+ }
+}
diff --git a/doc/_themes/sphinx13/static/sphinxheader.png b/doc/_themes/sphinx13/static/sphinxheader.png
new file mode 100644
index 0000000..845da4a
--- /dev/null
+++ b/doc/_themes/sphinx13/static/sphinxheader.png
Binary files differ
diff --git a/doc/_themes/sphinx13/theme.conf b/doc/_themes/sphinx13/theme.conf
new file mode 100644
index 0000000..78bb78f
--- /dev/null
+++ b/doc/_themes/sphinx13/theme.conf
@@ -0,0 +1,4 @@
+[theme]
+inherit = basic
+pygments_style = default
+sidebars =
diff --git a/doc/authors.rst b/doc/authors.rst
new file mode 100644
index 0000000..411835b
--- /dev/null
+++ b/doc/authors.rst
@@ -0,0 +1,9 @@
+:tocdepth: 2
+
+.. _authors:
+
+==============
+Sphinx authors
+==============
+
+.. include:: ../AUTHORS
diff --git a/doc/changes.rst b/doc/changes.rst
new file mode 100644
index 0000000..96853fe
--- /dev/null
+++ b/doc/changes.rst
@@ -0,0 +1,22 @@
+:tocdepth: 1
+
+.. default-role:: any
+
+.. _changes:
+
+=========
+Changelog
+=========
+
+.. raw:: latex
+
+ \addtocontents{toc}{\protect\setcounter{tocdepth}{1}}%
+ \makeatletter
+ \addtocontents{toc}%
+ {\def\string\l@section{\string\@dottedtocline{1}{1.5em}{3.3em}}}
+ \addtocontents{toc}%
+ {\def\string\l@subsection{\string\@dottedtocline{2}{4.8em}{4em}}}
+ \makeatother
+
+
+.. include:: ../CHANGES
diff --git a/doc/conf.py b/doc/conf.py
new file mode 100644
index 0000000..d4915aa
--- /dev/null
+++ b/doc/conf.py
@@ -0,0 +1,244 @@
+# Sphinx documentation build configuration file
+
+import os
+import re
+import time
+
+import sphinx
+
+os.environ['SPHINX_AUTODOC_RELOAD_MODULES'] = '1'
+
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo',
+ 'sphinx.ext.autosummary', 'sphinx.ext.extlinks',
+ 'sphinx.ext.intersphinx',
+ 'sphinx.ext.viewcode', 'sphinx.ext.inheritance_diagram',
+ 'sphinx.ext.coverage']
+coverage_statistics_to_report = coverage_statistics_to_stdout = True
+templates_path = ['_templates']
+exclude_patterns = ['_build']
+
+project = 'Sphinx'
+copyright = f'2007-{time.strftime("%Y")}, the Sphinx developers'
+version = sphinx.__display_version__
+release = version
+show_authors = True
+
+html_theme = 'sphinx13'
+html_theme_path = ['_themes']
+html_css_files = [
+ # 'basic.css', # included through inheritance from the basic theme
+ 'sphinx13.css',
+]
+modindex_common_prefix = ['sphinx.']
+html_static_path = ['_static']
+html_title = 'Sphinx documentation'
+html_additional_pages = {'contents': 'contents.html'}
+html_use_opensearch = 'https://www.sphinx-doc.org/en/master'
+html_baseurl = 'https://www.sphinx-doc.org/en/master/'
+html_favicon = '_static/favicon.svg'
+
+htmlhelp_basename = 'Sphinxdoc'
+
+epub_theme = 'epub'
+epub_basename = 'sphinx'
+epub_author = 'the Sphinx developers'
+epub_publisher = 'https://www.sphinx-doc.org/'
+epub_uid = 'web-site'
+epub_scheme = 'url'
+epub_identifier = epub_publisher
+epub_pre_files = [('index.xhtml', 'Welcome')]
+epub_post_files = [('usage/installation.xhtml', 'Installing Sphinx'),
+ ('develop.xhtml', 'Sphinx development')]
+epub_exclude_files = ['_static/opensearch.xml', '_static/doctools.js',
+ '_static/searchtools.js',
+ '_static/sphinx_highlight.js',
+ '_static/basic.css',
+ '_static/language_data.js',
+ 'search.html', '_static/websupport.js']
+epub_fix_images = False
+epub_max_image_width = 0
+epub_show_urls = 'inline'
+epub_use_index = False
+epub_description = 'Sphinx documentation generator system manual'
+
+latex_documents = [('index', 'sphinx.tex', 'Sphinx Documentation',
+ 'the Sphinx developers', 'manual', 1)]
+latex_logo = '_static/sphinx.png'
+latex_elements = {
+ 'fontenc': r'\usepackage[LGR,X2,T1]{fontenc}',
+ 'passoptionstopackages': r'''
+\PassOptionsToPackage{svgnames}{xcolor}
+''',
+ 'preamble': r'''
+\DeclareUnicodeCharacter{229E}{\ensuremath{\boxplus}}
+\setcounter{tocdepth}{3}% depth of what main TOC shows (3=subsubsection)
+\setcounter{secnumdepth}{1}% depth of section numbering
+\setlength{\tymin}{2cm}% avoid too cramped table columns
+''',
+ # fix missing index entry due to RTD doing only once pdflatex after makeindex
+ 'printindex': r'''
+\IfFileExists{\jobname.ind}
+ {\footnotesize\raggedright\printindex}
+ {\begin{sphinxtheindex}\end{sphinxtheindex}}
+''',
+}
+latex_show_urls = 'footnote'
+latex_use_xindy = True
+
+linkcheck_timeout = 5
+
+autodoc_member_order = 'groupwise'
+autosummary_generate = False
+todo_include_todos = True
+extlinks = {'duref': ('https://docutils.sourceforge.io/docs/ref/rst/'
+ 'restructuredtext.html#%s', '%s'),
+ 'durole': ('https://docutils.sourceforge.io/docs/ref/rst/'
+ 'roles.html#%s', '%s'),
+ 'dudir': ('https://docutils.sourceforge.io/docs/ref/rst/'
+ 'directives.html#%s', '%s')}
+
+man_pages = [
+ ('index', 'sphinx-all', 'Sphinx documentation generator system manual',
+ 'the Sphinx developers', 1),
+ ('man/sphinx-build', 'sphinx-build', 'Sphinx documentation generator tool',
+ '', 1),
+ ('man/sphinx-quickstart', 'sphinx-quickstart', 'Sphinx documentation '
+ 'template generator', '', 1),
+ ('man/sphinx-apidoc', 'sphinx-apidoc', 'Sphinx API doc generator tool',
+ '', 1),
+ ('man/sphinx-autogen', 'sphinx-autogen', 'Generate autodoc stub pages',
+ '', 1),
+]
+
+texinfo_documents = [
+ ('index', 'sphinx', 'Sphinx Documentation', 'the Sphinx developers',
+ 'Sphinx', 'The Sphinx documentation builder.', 'Documentation tools',
+ 1),
+]
+
+intersphinx_mapping = {
+ 'python': ('https://docs.python.org/3/', None),
+ 'requests': ('https://requests.readthedocs.io/en/latest/', None),
+ 'readthedocs': ('https://docs.readthedocs.io/en/stable', None),
+}
+
+# Sphinx document translation with sphinx gettext feature uses these settings:
+locale_dirs = ['locale/']
+gettext_compact = False
+
+nitpick_ignore = {
+ ('cpp:class', 'template<typename TOuter> template<typename TInner> Wrapper::Outer<TOuter>::Inner'), # NoQA: E501
+ ('cpp:identifier', 'MyContainer'),
+ ('js:func', 'SomeError'),
+ ('js:func', 'number'),
+ ('js:func', 'string'),
+ ('py:attr', 'srcline'),
+ ('py:class', 'Element'), # sphinx.domains.Domain
+ ('py:class', 'IndexEntry'), # sphinx.domains.IndexEntry
+ ('py:class', 'Node'), # sphinx.domains.Domain
+ ('py:class', 'NullTranslations'), # gettext.NullTranslations
+ ('py:class', 'RoleFunction'), # sphinx.domains.Domain
+ ('py:class', 'Theme'), # sphinx.application.TemplateBridge
+ ('py:class', 'TitleGetter'), # sphinx.domains.Domain
+ ('py:class', 'XRefRole'), # sphinx.domains.Domain
+ ('py:class', 'docutils.nodes.Element'),
+ ('py:class', 'docutils.nodes.Node'),
+ ('py:class', 'docutils.nodes.NodeVisitor'),
+ ('py:class', 'docutils.nodes.TextElement'),
+ ('py:class', 'docutils.nodes.document'),
+ ('py:class', 'docutils.nodes.system_message'),
+ ('py:class', 'docutils.parsers.Parser'),
+ ('py:class', 'docutils.parsers.rst.states.Inliner'),
+ ('py:class', 'docutils.transforms.Transform'),
+ ('py:class', 'nodes.NodeVisitor'),
+ ('py:class', 'nodes.document'),
+ ('py:class', 'nodes.reference'),
+ ('py:class', 'pygments.lexer.Lexer'),
+ ('py:class', 'sphinx.directives.ObjDescT'),
+ ('py:class', 'sphinx.domains.IndexEntry'),
+ ('py:class', 'sphinx.ext.autodoc.Documenter'),
+ ('py:class', 'sphinx.errors.NoUri'),
+ ('py:class', 'sphinx.roles.XRefRole'),
+ ('py:class', 'sphinx.search.SearchLanguage'),
+ ('py:class', 'sphinx.theming.Theme'),
+ ('py:class', 'sphinxcontrib.websupport.errors.DocumentNotFoundError'),
+ ('py:class', 'sphinxcontrib.websupport.errors.UserNotAuthorizedError'),
+ ('py:exc', 'docutils.nodes.SkipNode'),
+ ('py:exc', 'sphinx.environment.NoUri'),
+ ('py:func', 'setup'),
+ ('py:func', 'sphinx.util.nodes.nested_parse_with_titles'),
+ # Error in sphinxcontrib.websupport.core::WebSupport.add_comment
+ ('py:meth', 'get_comments'),
+ ('py:mod', 'autodoc'),
+ ('py:mod', 'docutils.nodes'),
+ ('py:mod', 'docutils.parsers.rst.directives'),
+ ('py:mod', 'sphinx.ext'),
+ ('py:obj', 'sphinx.util.relative_uri'),
+ ('rst:role', 'c:any'),
+ ('std:confval', 'autodoc_inherit_docstring'),
+ ('std:confval', 'automodule_skip_lines'),
+ ('std:confval', 'autossummary_imported_members'),
+ ('std:confval', 'gettext_language_team'),
+ ('std:confval', 'gettext_last_translator'),
+ ('std:confval', 'globaltoc_collapse'),
+ ('std:confval', 'globaltoc_includehidden'),
+ ('std:confval', 'globaltoc_maxdepth'),
+}
+
+
+# -- Extension interface -------------------------------------------------------
+
+from sphinx import addnodes # noqa: E402
+
+event_sig_re = re.compile(r'([a-zA-Z-]+)\s*\((.*)\)')
+
+
+def parse_event(env, sig, signode):
+ m = event_sig_re.match(sig)
+ if not m:
+ signode += addnodes.desc_name(sig, sig)
+ return sig
+ name, args = m.groups()
+ signode += addnodes.desc_name(name, name)
+ plist = addnodes.desc_parameterlist()
+ for arg in args.split(','):
+ arg = arg.strip()
+ plist += addnodes.desc_parameter(arg, arg)
+ signode += plist
+ return name
+
+
+def linkify_issues_in_changelog(app, docname, source):
+ """ Linkify issue references like #123 in changelog to GitHub. """
+
+ if docname == 'changes':
+ changelog_path = os.path.join(os.path.dirname(__file__), "../CHANGES")
+ # this path trickery is needed because this script can
+ # be invoked with different working directories:
+ # * running make in docs/
+ # * running tox -e docs in the repo root dir
+
+ with open(changelog_path, encoding="utf-8") as f:
+ changelog = f.read()
+
+ def linkify(match):
+ url = 'https://github.com/sphinx-doc/sphinx/issues/' + match[1]
+ return f'`{match[0]} <{url}>`_'
+
+ linkified_changelog = re.sub(r'(?:PR)?#([0-9]+)\b', linkify, changelog)
+
+ source[0] = source[0].replace('.. include:: ../CHANGES', linkified_changelog)
+
+
+def setup(app):
+ from sphinx.ext.autodoc import cut_lines
+ from sphinx.util.docfields import GroupedField
+ app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
+ app.connect('source-read', linkify_issues_in_changelog)
+ app.add_object_type('confval', 'confval',
+ objname='configuration value',
+ indextemplate='pair: %s; configuration value')
+ fdesc = GroupedField('parameter', label='Parameters',
+ names=['param'], can_collapse=True)
+ app.add_object_type('event', 'event', 'pair: %s; event', parse_event,
+ doc_field_types=[fdesc])
diff --git a/doc/development/builders.rst b/doc/development/builders.rst
new file mode 100644
index 0000000..bb67770
--- /dev/null
+++ b/doc/development/builders.rst
@@ -0,0 +1,34 @@
+Configuring builders
+====================
+
+Discover builders by entry point
+--------------------------------
+
+.. versionadded:: 1.6
+
+:term:`builder` extensions can be discovered by means of `entry points`_ so
+that they do not have to be listed in the :confval:`extensions` configuration
+value.
+
+Builder extensions should define an entry point in the ``sphinx.builders``
+group. The name of the entry point needs to match your builder's
+:attr:`~.Builder.name` attribute, which is the name passed to the
+:option:`sphinx-build -b` option. The entry point value should equal the
+dotted name of the extension module. Here is an example of how an entry point
+for 'mybuilder' can be defined in the extension's ``setup.py``
+
+.. code-block:: python
+
+ setup(
+ # ...
+ entry_points={
+ 'sphinx.builders': [
+ 'mybuilder = my.extension.module',
+ ],
+ }
+ )
+
+Note that it is still necessary to register the builder using
+:meth:`~.Sphinx.add_builder` in the extension's :func:`setup` function.
+
+.. _entry points: https://setuptools.readthedocs.io/en/latest/setuptools.html#dynamic-discovery-of-services-and-plugins
diff --git a/doc/development/index.rst b/doc/development/index.rst
new file mode 100644
index 0000000..55a31a0
--- /dev/null
+++ b/doc/development/index.rst
@@ -0,0 +1,24 @@
+=========================
+Writing Sphinx Extensions
+=========================
+
+This guide is aimed at giving a quick introduction for those wishing to
+develop their own extensions for Sphinx. Sphinx possesses significant
+extensibility capabilities including the ability to hook into almost every
+point of the build process. If you simply wish to use Sphinx with existing
+extensions, refer to :doc:`/usage/index`. For a more detailed discussion of
+the extension interface see :doc:`/extdev/index`.
+
+.. toctree::
+ :maxdepth: 2
+
+ overview
+ tutorials/index
+ builders
+
+.. toctree::
+ :caption: Theming
+ :maxdepth: 2
+
+ templating
+ theming
diff --git a/doc/development/overview.rst b/doc/development/overview.rst
new file mode 100644
index 0000000..df8f5bb
--- /dev/null
+++ b/doc/development/overview.rst
@@ -0,0 +1,32 @@
+Developing extensions overview
+==============================
+
+This page contains general information about developing Sphinx extensions.
+
+Make an extension depend on another extension
+---------------------------------------------
+
+Sometimes your extension depends on the functionality of another
+Sphinx extension. Most Sphinx extensions are activated in a
+project's :file:`conf.py` file, but this is not available to you as an
+extension developer.
+
+.. module:: sphinx.application
+ :no-index:
+
+To ensure that another extension is activated as a part of your own extension,
+use the :meth:`sphinx.application.Sphinx.setup_extension` method. This will
+activate another extension at run-time, ensuring that you have access to its
+functionality.
+
+For example, the following code activates the ``recommonmark`` extension:
+
+.. code-block:: python
+
+ def setup(app):
+ app.setup_extension("recommonmark")
+
+.. note::
+
+ Since your extension will depend on another, make sure to include
+ it as a part of your extension's installation requirements.
diff --git a/doc/development/templating.rst b/doc/development/templating.rst
new file mode 100644
index 0000000..73ae6e5
--- /dev/null
+++ b/doc/development/templating.rst
@@ -0,0 +1,478 @@
+.. highlight:: html+jinja
+
+.. _templating:
+
+==========
+Templating
+==========
+
+Sphinx uses the `Jinja <https://jinja.palletsprojects.com/>`_ templating engine
+for its HTML templates. Jinja is a text-based engine, inspired by Django
+templates, so anyone having used Django will already be familiar with it. It
+also has excellent documentation for those who need to make themselves familiar
+with it.
+
+
+Do I need to use Sphinx's templates to produce HTML?
+----------------------------------------------------
+
+No. You have several other options:
+
+* You can write a :class:`~sphinx.application.TemplateBridge` subclass that
+ calls your template engine of choice, and set the :confval:`template_bridge`
+ configuration value accordingly.
+
+* You can :ref:`write a custom builder <writing-builders>` that derives from
+ :class:`~sphinx.builders.html.StandaloneHTMLBuilder` and calls your template
+ engine of choice.
+
+* You can use the :class:`~sphinxcontrib.serializinghtml.PickleHTMLBuilder` that
+ produces pickle files with the page contents, and postprocess them using a
+ custom tool, or use them in your Web application.
+
+
+Jinja/Sphinx Templating Primer
+------------------------------
+
+The default templating language in Sphinx is Jinja. It's Django/Smarty inspired
+and easy to understand. The most important concept in Jinja is :dfn:`template
+inheritance`, which means that you can overwrite only specific blocks within a
+template, customizing it while also keeping the changes at a minimum.
+
+To customize the output of your documentation you can override all the templates
+(both the layout templates and the child templates) by adding files with the
+same name as the original filename into the template directory of the structure
+the Sphinx quickstart generated for you.
+
+Sphinx will look for templates in the folders of :confval:`templates_path`
+first, and if it can't find the template it's looking for there, it falls back
+to the selected theme's templates.
+
+A template contains **variables**, which are replaced with values when the
+template is evaluated, **tags**, which control the logic of the template and
+**blocks** which are used for template inheritance.
+
+Sphinx's *basic* theme provides base templates with a couple of blocks it will
+fill with data. These are located in the :file:`themes/basic` subdirectory of
+the Sphinx installation directory, and used by all builtin Sphinx themes.
+Templates with the same name in the :confval:`templates_path` override templates
+supplied by the selected theme.
+
+For example, to add a new link to the template area containing related links all
+you have to do is to add a new template called ``layout.html`` with the
+following contents::
+
+ {% extends "!layout.html" %}
+ {% block rootrellink %}
+ <li><a href="https://project.invalid/">Project Homepage</a> &raquo;</li>
+ {{ super() }}
+ {% endblock %}
+
+By prefixing the name of the overridden template with an exclamation mark,
+Sphinx will load the layout template from the underlying HTML theme.
+
+.. important::
+ If you override a block, call ``{{ super() }}`` somewhere to render the
+ block's original content in the extended template -- unless you don't want
+ that content to show up.
+
+
+Working with the builtin templates
+----------------------------------
+
+The builtin **basic** theme supplies the templates that all builtin Sphinx
+themes are based on. It has the following elements you can override or use:
+
+Blocks
+~~~~~~
+
+The following blocks exist in the ``layout.html`` template:
+
+``doctype``
+ The doctype of the output format. By default this is XHTML 1.0 Transitional
+ as this is the closest to what Sphinx and Docutils generate and it's a good
+ idea not to change it unless you want to switch to HTML 5 or a different but
+ compatible XHTML doctype.
+
+``linktags``
+ This block adds a couple of ``<link>`` tags to the head section of the
+ template.
+
+``extrahead``
+ This block is empty by default and can be used to add extra contents into
+ the ``<head>`` tag of the generated HTML file. This is the right place to
+ add references to JavaScript or extra CSS files.
+
+``relbar1``, ``relbar2``
+ This block contains the *relation bar*, the list of related links (the
+ parent documents on the left, and the links to index, modules etc. on the
+ right). ``relbar1`` appears before the document, ``relbar2`` after the
+ document. By default, both blocks are filled; to show the relbar only
+ before the document, you would override `relbar2` like this::
+
+ {% block relbar2 %}{% endblock %}
+
+``rootrellink``, ``relbaritems``
+ Inside the relbar there are three sections: The ``rootrellink``, the links
+ from the documentation and the custom ``relbaritems``. The ``rootrellink``
+ is a block that by default contains a list item pointing to the root
+ document by default, the ``relbaritems`` is an empty block. If you
+ override them to add extra links into the bar make sure that they are list
+ items and end with the :data:`reldelim1`.
+
+``document``
+ The contents of the document itself. It contains the block "body" where
+ the individual content is put by subtemplates like ``page.html``.
+
+ .. note::
+ In order for the built-in JavaScript search to show a page preview on
+ the results page, the document or body content should be wrapped in an
+ HTML element containing the ``role="main"`` attribute. For example::
+
+ <div role="main">
+ {% block document %}{% endblock %}
+ </div>
+
+``sidebar1``, ``sidebar2``
+ A possible location for a sidebar. ``sidebar1`` appears before the document
+ and is empty by default, ``sidebar2`` after the document and contains the
+ default sidebar. If you want to swap the sidebar location override this and
+ call the ``sidebar`` helper::
+
+ {% block sidebar1 %}{{ sidebar() }}{% endblock %}
+ {% block sidebar2 %}{% endblock %}
+
+ (The ``sidebar2`` location for the sidebar is needed by the ``sphinxdoc.css``
+ stylesheet, for example.)
+
+``sidebarlogo``
+ The logo location within the sidebar. Override this if you want to place
+ some content at the top of the sidebar.
+
+``footer``
+ The block for the footer div. If you want a custom footer or markup before
+ or after it, override this one.
+
+The following four blocks are *only* used for pages that do not have assigned a
+list of custom sidebars in the :confval:`html_sidebars` config value. Their use
+is deprecated in favor of separate sidebar templates, which can be included via
+:confval:`html_sidebars`.
+
+``sidebartoc``
+ The table of contents within the sidebar.
+
+ .. deprecated:: 1.0
+
+``sidebarrel``
+ The relation links (previous, next document) within the sidebar.
+
+ .. deprecated:: 1.0
+
+``sidebarsourcelink``
+ The "Show source" link within the sidebar (normally only shown if this is
+ enabled by :confval:`html_show_sourcelink`).
+
+ .. deprecated:: 1.0
+
+``sidebarsearch``
+ The search box within the sidebar. Override this if you want to place some
+ content at the bottom of the sidebar.
+
+ .. deprecated:: 1.0
+
+
+Configuration Variables
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Inside templates you can set a couple of variables used by the layout template
+using the ``{% set %}`` tag:
+
+.. data:: reldelim1
+
+ The delimiter for the items on the left side of the related bar. This
+ defaults to ``' &raquo;'`` Each item in the related bar ends with the value
+ of this variable.
+
+.. data:: reldelim2
+
+ The delimiter for the items on the right side of the related bar. This
+ defaults to ``' |'``. Each item except of the last one in the related bar
+ ends with the value of this variable.
+
+Overriding works like this::
+
+ {% extends "!layout.html" %}
+ {% set reldelim1 = ' &gt;' %}
+
+.. data:: script_files
+
+ Add additional script files here, like this::
+
+ {% set script_files = script_files + ["_static/myscript.js"] %}
+
+ .. deprecated:: 1.8.0
+
+ Please use ``.Sphinx.add_js_file()`` instead.
+
+Helper Functions
+~~~~~~~~~~~~~~~~
+
+Sphinx provides various Jinja functions as helpers in the template. You can use
+them to generate links or output multiply used elements.
+
+.. function:: pathto(document)
+
+ Return the path to a Sphinx document as a URL. Use this to refer to built
+ documents.
+
+.. function:: pathto(file, 1)
+ :no-index:
+
+ Return the path to a *file* which is a filename relative to the root of the
+ generated output. Use this to refer to static files.
+
+.. function:: hasdoc(document)
+
+ Check if a document with the name *document* exists.
+
+.. function:: sidebar()
+
+ Return the rendered sidebar.
+
+.. function:: relbar()
+
+ Return the rendered relation bar.
+
+.. function:: warning(message)
+
+ Emit a warning message.
+
+Global Variables
+~~~~~~~~~~~~~~~~
+
+These global variables are available in every template and are safe to use.
+There are more, but most of them are an implementation detail and might change
+in the future.
+
+.. data:: builder
+
+ The name of the builder (e.g. ``html`` or ``htmlhelp``).
+
+.. data:: copyright
+
+ The value of :confval:`copyright`.
+
+.. data:: docstitle
+
+ The title of the documentation (the value of :confval:`html_title`), except
+ when the "single-file" builder is used, when it is set to ``None``.
+
+.. data:: embedded
+
+ True if the built HTML is meant to be embedded in some viewing application
+ that handles navigation, not the web browser, such as for HTML help or Qt
+ help formats. In this case, the sidebar is not included.
+
+.. data:: favicon_url
+
+ The relative path to the HTML favicon image from the current document, or
+ URL to the favicon, or ``''``.
+
+ .. versionadded:: 4.0
+
+.. data:: file_suffix
+
+ The value of the builder's :attr:`~.SerializingHTMLBuilder.out_suffix`
+ attribute, i.e. the file name extension that the output files will get. For
+ a standard HTML builder, this is usually ``.html``.
+
+.. data:: has_source
+
+ True if the reST document sources are copied (if :confval:`html_copy_source`
+ is ``True``).
+
+.. data:: language
+
+ The value of :confval:`language`.
+
+.. data:: last_updated
+
+ The build date.
+
+.. data:: logo_url
+
+ The relative path to the HTML logo image from the current document, or URL
+ to the logo, or ``''``.
+
+ .. versionadded:: 4.0
+
+.. data:: master_doc
+
+ Same as :data:`root_doc`.
+
+ .. versionchanged:: 4.0
+
+ Renamed to ``root_doc``.
+
+.. data:: root_doc
+
+ The value of :confval:`root_doc`, for usage with :func:`pathto`.
+
+ .. versionchanged:: 4.0
+
+ Renamed from ``master_doc``.
+
+.. data:: pagename
+
+ The "page name" of the current file, i.e. either the document name if the
+ file is generated from a reST source, or the equivalent hierarchical name
+ relative to the output directory
+ (``[directory/]filename_without_extension``).
+
+.. data:: project
+
+ The value of :confval:`project`.
+
+.. data:: release
+
+ The value of :confval:`release`.
+
+.. data:: rellinks
+
+ A list of links to put at the left side of the relbar, next to "next" and
+ "prev". This usually contains links to the general index and other indices,
+ such as the Python module index. If you add something yourself, it must be a
+ tuple ``(pagename, link title, accesskey, link text)``.
+
+.. data:: shorttitle
+
+ The value of :confval:`html_short_title`.
+
+.. data:: show_source
+
+ True if :confval:`html_show_sourcelink` is ``True``.
+
+.. data:: sphinx_version
+
+ The version of Sphinx used to build represented as a string for example "3.5.1".
+
+.. data:: sphinx_version_tuple
+
+ The version of Sphinx used to build represented as a tuple of five elements.
+ For Sphinx version 3.5.1 beta 3 this would be ``(3, 5, 1, 'beta', 3)``.
+ The fourth element can be one of: ``alpha``, ``beta``, ``rc``, ``final``.
+ ``final`` always has 0 as the last element.
+
+ .. versionadded:: 4.2
+
+.. data:: docutils_version_info
+
+ The version of Docutils used to build represented as a tuple of five elements.
+ For Docutils version 0.16.1 beta 2 this would be ``(0, 16, 1, 'beta', 2)``.
+ The fourth element can be one of: ``alpha``, ``beta``, ``candidate``, ``final``.
+ ``final`` always has 0 as the last element.
+
+ .. versionadded:: 5.0.2
+
+.. data:: styles
+
+ A list of the names of the main stylesheets as given by the theme or
+ :confval:`html_style`.
+
+ .. versionadded:: 5.1
+
+.. data:: title
+
+ The title of the current document, as used in the ``<title>`` tag.
+
+.. data:: use_opensearch
+
+ The value of :confval:`html_use_opensearch`.
+
+.. data:: version
+
+ The value of :confval:`version`.
+
+
+In addition to these values, there are also all **theme options** available
+(prefixed by ``theme_``), as well as the values given by the user in
+:confval:`html_context`.
+
+In documents that are created from source files (as opposed to
+automatically-generated files like the module index, or documents that already
+are in HTML form), these variables are also available:
+
+.. data:: body
+
+ A string containing the content of the page in HTML form as produced by the
+ HTML builder, before the theme is applied.
+
+.. data:: display_toc
+
+ A boolean that is True if the toc contains more than one entry.
+
+.. data:: meta
+
+ Document metadata (a dictionary), see :ref:`metadata`.
+
+.. data:: metatags
+
+ A string containing the page's HTML :dudir:`meta` tags.
+
+.. data:: next
+
+ The next document for the navigation. This variable is either false or has
+ two attributes `link` and `title`. The title contains HTML markup. For
+ example, to generate a link to the next page, you can use this snippet::
+
+ {% if next %}
+ <a href="{{ next.link|e }}">{{ next.title }}</a>
+ {% endif %}
+
+.. data:: page_source_suffix
+
+ The suffix of the file that was rendered. Since we support a list of
+ :confval:`source_suffix`, this will allow you to properly link to the
+ original source file.
+
+.. data:: parents
+
+ A list of parent documents for navigation, structured like the :data:`next`
+ item.
+
+.. data:: prev
+
+ Like :data:`next`, but for the previous page.
+
+.. data:: sourcename
+
+ The name of the copied source file for the current document. This is only
+ nonempty if the :confval:`html_copy_source` value is ``True``.
+ This has empty value on creating automatically-generated files.
+
+.. data:: toc
+
+ The local table of contents for the current page, rendered as HTML bullet
+ lists.
+
+.. data:: toctree
+
+ A callable yielding the global TOC tree containing the current page, rendered
+ as HTML bullet lists. Optional keyword arguments:
+
+ ``collapse``
+ If true, all TOC entries that are not ancestors of the current page are
+ collapsed.
+ ``True`` by default.
+
+ ``maxdepth``
+ The maximum depth of the tree. Set it to ``-1`` to allow unlimited depth.
+ Defaults to the max depth selected in the toctree directive.
+
+ ``titles_only``
+ If true, put only top-level document titles in the tree.
+ ``False`` by default.
+
+ ``includehidden``
+ If true, the ToC tree will also contain hidden entries.
+ ``False`` by default.
diff --git a/doc/development/theming.rst b/doc/development/theming.rst
new file mode 100644
index 0000000..538dcaf
--- /dev/null
+++ b/doc/development/theming.rst
@@ -0,0 +1,342 @@
+HTML theme development
+======================
+
+.. versionadded:: 0.6
+
+.. note::
+
+ This document provides information about creating your own theme. If you
+ simply wish to use a pre-existing HTML themes, refer to
+ :doc:`/usage/theming`.
+
+Sphinx supports changing the appearance of its HTML output via *themes*. A
+theme is a collection of HTML templates, stylesheet(s) and other static files.
+Additionally, it has a configuration file which specifies from which theme to
+inherit, which highlighting style to use, and what options exist for customizing
+the theme's look and feel.
+
+Themes are meant to be project-unaware, so they can be used for different
+projects without change.
+
+.. note::
+
+ See :ref:`dev-extensions` for more information that may
+ be helpful in developing themes.
+
+
+Creating themes
+---------------
+
+Themes take the form of either a directory or a zipfile (whose name is the
+theme name), containing the following:
+
+* A :file:`theme.conf` file.
+* HTML templates, if needed.
+* A ``static/`` directory containing any static files that will be copied to the
+ 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:
+
+.. sourcecode:: ini
+
+ [theme]
+ inherit = base theme
+ stylesheet = main CSS name
+ pygments_style = stylename
+ sidebars = localtoc.html, relations.html, sourcelink.html, searchbox.html
+
+ [options]
+ variable = default value
+
+* The **inherit** setting gives the name of a "base theme", or ``none``. The
+ base theme will be used to locate missing templates (most themes will not have
+ to supply most templates if they use ``basic`` as the base theme), its options
+ will be inherited, and all of its static files will be used as well. If you
+ want to also inherit the stylesheet, include it via CSS' ``@import`` in your
+ own.
+
+* The **stylesheet** setting gives a list of CSS filenames separated commas which
+ will be referenced in the HTML header. You can also use CSS' ``@import``
+ technique to include one from the other, or use a custom HTML template that
+ adds ``<link rel="stylesheet">`` tags as necessary. Setting the
+ :confval:`html_style` config value will override this setting.
+
+* The **pygments_style** setting gives the name of a Pygments style to use for
+ highlighting. This can be overridden by the user in the
+ :confval:`pygments_style` config value.
+
+* The **pygments_dark_style** setting gives the name of a Pygments style to use
+ for highlighting when the CSS media query ``(prefers-color-scheme: dark)``
+ evaluates to true. It is injected into the page using
+ :meth:`~sphinx.application.Sphinx.add_css_file()`.
+
+* The **sidebars** setting gives the comma separated list of sidebar templates
+ for constructing sidebars. This can be overridden by the user in the
+ :confval:`html_sidebars` config value.
+
+* The **options** section contains pairs of variable names and default values.
+ These options can be overridden by the user in :confval:`html_theme_options`
+ and are accessible from all templates as ``theme_<name>``.
+
+.. versionadded:: 1.7
+ sidebar settings
+
+.. versionchanged:: 5.1
+
+ The stylesheet setting accepts multiple CSS filenames
+
+.. _distribute-your-theme:
+
+Distribute your theme as a Python package
+-----------------------------------------
+
+As a way to distribute your theme, you can use a Python package. This makes it
+easier for users to set up your theme.
+
+To distribute your theme as a Python package, please define an entry point
+called ``sphinx.html_themes`` in your ``setup.py`` file, and write a ``setup()``
+function to register your themes using ``add_html_theme()`` API in it::
+
+ # 'setup.py'
+ setup(
+ ...
+ entry_points = {
+ 'sphinx.html_themes': [
+ 'name_of_theme = your_package',
+ ]
+ },
+ ...
+ )
+
+ # 'your_package.py'
+ from os import path
+
+ def setup(app):
+ app.add_html_theme('name_of_theme', path.abspath(path.dirname(__file__)))
+
+If your theme package contains two or more themes, please call
+``add_html_theme()`` twice or more.
+
+.. versionadded:: 1.2
+ 'sphinx_themes' entry_points feature.
+
+.. deprecated:: 1.6
+ ``sphinx_themes`` entry_points has been deprecated.
+
+.. versionadded:: 1.6
+ ``sphinx.html_themes`` entry_points feature.
+
+
+Templating
+----------
+
+The :doc:`guide to templating <templating>` is helpful if you want to write your
+own templates. What is important to keep in mind is the order in which Sphinx
+searches for templates:
+
+* First, in the user's ``templates_path`` directories.
+* Then, in the selected theme.
+* Then, in its base theme, its base's base theme, etc.
+
+When extending a template in the base theme with the same name, use the theme
+name as an explicit directory: ``{% extends "basic/layout.html" %}``. From a
+user ``templates_path`` template, you can still use the "exclamation mark"
+syntax as described in the templating document.
+
+
+.. _theming-static-templates:
+
+Static templates
+~~~~~~~~~~~~~~~~
+
+Since theme options are meant for the user to configure a theme more easily,
+without having to write a custom stylesheet, it is necessary to be able to
+template static files as well as HTML files. Therefore, Sphinx supports
+so-called "static templates", like this:
+
+If the name of a file in the ``static/`` directory of a theme (or in the user's
+static path, for that matter) ends with ``_t``, it will be processed by the
+template engine. The ``_t`` will be left from the final file name. For
+example, the *classic* theme has a file ``static/classic.css_t`` which uses
+templating to put the color options into the stylesheet. When a documentation
+project is built with the classic theme, the output directory will contain a
+``_static/classic.css`` file where all template tags have been processed.
+
+
+Use custom page metadata in HTML templates
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Any key / value pairs in :doc:`field lists </usage/restructuredtext/field-lists>`
+that are placed *before* the page's title will be available to the Jinja
+template when building the page within the :data:`meta` attribute. For example,
+if a page had the following text before its first title:
+
+.. code-block:: rst
+
+ :mykey: My value
+
+ My first title
+ --------------
+
+Then it could be accessed within a Jinja template like so:
+
+.. code-block:: jinja
+
+ {%- if meta is mapping %}
+ {{ meta.get("mykey") }}
+ {%- endif %}
+
+Note the check that ``meta`` is a dictionary ("mapping" in Jinja
+terminology) to ensure that using it in this way is valid.
+
+
+Defining custom template functions
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Sometimes it is useful to define your own function in Python that you wish to
+then use in a template. For example, if you'd like to insert a template value
+with logic that depends on the user's configuration in the project, or if you'd
+like to include non-trivial checks and provide friendly error messages for
+incorrect configuration in the template.
+
+To define your own template function, you'll need to define two functions
+inside your module:
+
+* A **page context event handler** (or **registration**) function. This is
+ connected to the :class:`.Sphinx` application via an event callback.
+* A **template function** that you will use in your Jinja template.
+
+First, define the registration function, which accepts the arguments for
+:event:`html-page-context`.
+
+Within the registration function, define the template function that you'd like to
+use within Jinja. The template function should return a string or Python objects
+(lists, dictionaries) with strings inside that Jinja uses in the templating process
+
+.. note::
+
+ The template function will have access to all of the variables that
+ are passed to the registration function.
+
+At the end of the registration function, add the template function to the
+Sphinx application's context with ``context['template_func'] = template_func``.
+
+Finally, in your extension's ``setup()`` function, add your registration
+function as a callback for :event:`html-page-context`.
+
+.. code-block:: python
+
+ # The registration function
+ def setup_my_func(app, pagename, templatename, context, doctree):
+ # The template function
+ def my_func(mystring):
+ return "Your string is %s" % mystring
+ # Add it to the page's context
+ context['my_func'] = my_func
+
+ # Your extension's setup function
+ def setup(app):
+ app.connect("html-page-context", setup_my_func)
+
+Now, you will have access to this function in jinja like so:
+
+.. code-block:: jinja
+
+ <div>
+ {{ my_func("some string") }}
+ </div>
+
+
+Add your own static files to the build assets
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+By default, Sphinx copies static files on the ``static/`` directory of the template
+directory. However, if your package needs to place static files outside of the
+``static/`` directory for some reasons, you need to copy them to the ``_static/``
+directory of HTML outputs manually at the build via an event hook. Here is an
+example of code to accomplish this:
+
+.. code-block:: python
+
+ from os import path
+ from sphinx.util.fileutil import copy_asset_file
+
+ def copy_custom_files(app, exc):
+ if app.builder.format == 'html' and not exc:
+ staticdir = path.join(app.builder.outdir, '_static')
+ copy_asset_file('path/to/myextension/_static/myjsfile.js', staticdir)
+
+ def setup(app):
+ app.connect('build-finished', copy_custom_files)
+
+
+Inject JavaScript based on user configuration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If your extension makes use of JavaScript, it can be useful to allow users
+to control its behavior using their Sphinx configuration. However, this can
+be difficult to do if your JavaScript comes in the form of a static library
+(which will not be built with Jinja).
+
+There are two ways to inject variables into the JavaScript space based on user
+configuration.
+
+First, you may append ``_t`` to the end of any static files included with your
+extension. This will cause Sphinx to process these files with the templating
+engine, allowing you to embed variables and control behavior.
+
+For example, the following JavaScript structure:
+
+.. code-block:: none
+
+ mymodule/
+ ├── _static
+ │   └── myjsfile.js_t
+ └── mymodule.py
+
+Will result in the following static file placed in your HTML's build output:
+
+.. code-block:: none
+
+ _build/
+ └── html
+ └── _static
+    └── myjsfile.js
+
+See :ref:`theming-static-templates` for more information.
+
+Second, you may use the :meth:`.Sphinx.add_js_file` method without pointing it
+to a file. Normally, this method is used to insert a new JavaScript file
+into your site. However, if you do *not* pass a file path, but instead pass
+a string to the "body" argument, then this text will be inserted as JavaScript
+into your site's head. This allows you to insert variables into your project's
+JavaScript from Python.
+
+For example, the following code will read in a user-configured value and then
+insert this value as a JavaScript variable, which your extension's JavaScript
+code may use:
+
+.. code-block:: python
+
+ # This function reads in a variable and inserts it into JavaScript
+ def add_js_variable(app):
+ # This is a configuration that you've specified for users in `conf.py`
+ js_variable = app.config['my_javascript_variable']
+ js_text = "var my_variable = '%s';" % js_variable
+ app.add_js_file(None, body=js_text)
+ # We connect this function to the step after the builder is initialized
+ def setup(app):
+ # Tell Sphinx about this configuration variable
+ app.add_config_value('my_javascript_variable', 0, 'html')
+ # Run the function after the builder is initialized
+ app.connect('builder-inited', add_js_variable)
+
+As a result, in your theme you can use code that depends on the presence of
+this variable. Users can control the variable's value by defining it in their
+:file:`conf.py` file.
+
+
+.. [1] It is not an executable Python file, as opposed to :file:`conf.py`,
+ because that would pose an unnecessary security risk if themes are
+ shared.
diff --git a/doc/development/tutorials/autodoc_ext.rst b/doc/development/tutorials/autodoc_ext.rst
new file mode 100644
index 0000000..cfd23e7
--- /dev/null
+++ b/doc/development/tutorials/autodoc_ext.rst
@@ -0,0 +1,141 @@
+.. _autodoc_ext_tutorial:
+
+Developing autodoc extension for IntEnum
+========================================
+
+The objective of this tutorial is to create an extension that adds
+support for new type for autodoc. This autodoc extension will format
+the ``IntEnum`` class from Python standard library. (module ``enum``)
+
+Overview
+--------
+
+We want the extension that will create auto-documentation for IntEnum.
+``IntEnum`` is the integer enum class from standard library ``enum`` module.
+
+Currently this class has no special auto documentation behavior.
+
+We want to add following to autodoc:
+
+* A new ``autointenum`` directive that will document the ``IntEnum`` class.
+* The generated documentation will have all the enum possible values
+ with names.
+* The ``autointenum`` directive will have an option ``:hex:`` which will
+ cause the integers be printed in hexadecimal form.
+
+
+Prerequisites
+-------------
+
+We need the same setup as in :doc:`the previous extensions <todo>`. This time,
+we will be putting out extension in a file called :file:`autodoc_intenum.py`.
+The :file:`my_enums.py` will contain the sample enums we will document.
+
+Here is an example of the folder structure you might obtain:
+
+.. code-block:: text
+
+ └── source
+    ├── _ext
+ │   └── autodoc_intenum.py
+    ├── conf.py
+    ├── index.rst
+    └── my_enums.py
+
+
+Writing the extension
+---------------------
+
+Start with ``setup`` function for the extension.
+
+.. literalinclude:: examples/autodoc_intenum.py
+ :language: python
+ :linenos:
+ :pyobject: setup
+
+
+The :meth:`~sphinx.application.Sphinx.setup_extension` method will pull the
+autodoc extension because our new extension depends on autodoc.
+:meth:`~sphinx.application.Sphinx.add_autodocumenter` is the method that
+registers our new auto documenter class.
+
+We want to import certain objects from the autodoc extension:
+
+.. literalinclude:: examples/autodoc_intenum.py
+ :language: python
+ :linenos:
+ :lines: 1-7
+
+
+There are several different documenter classes such as ``MethodDocumenter``
+or ``AttributeDocumenter`` available in the autodoc extension but
+our new class is the subclass of ``ClassDocumenter`` which a
+documenter class used by autodoc to document classes.
+
+This is the definition of our new the auto-documenter class:
+
+.. literalinclude:: examples/autodoc_intenum.py
+ :language: python
+ :linenos:
+ :pyobject: IntEnumDocumenter
+
+
+Important attributes of the new class:
+
+**objtype**
+ This attribute determines the ``auto`` directive name. In
+ this case the auto directive will be ``autointenum``.
+
+**directivetype**
+ This attribute sets the generated directive name. In
+ this example the generated directive will be ``.. :py:class::``.
+
+**priority**
+ the larger the number the higher is the priority. We want our
+ documenter be higher priority than the parent.
+
+**option_spec**
+ option specifications. We copy the parent class options and
+ add a new option *hex*.
+
+
+Overridden members:
+
+**can_document_member**
+ This member is important to override. It should
+ return *True* when the passed object can be documented by this class.
+
+**add_directive_header**
+ This method generates the directive header. We add
+ **:final:** directive option. Remember to call **super** or no directive
+ will be generated.
+
+**add_content**
+ This method generates the body of the class documentation.
+ After calling the super method we generate lines for enum description.
+
+
+Using the extension
+-------------------
+
+You can now use the new autodoc directive to document any ``IntEnum``.
+
+For example, you have the following ``IntEnum``:
+
+.. code-block:: python
+ :caption: my_enums.py
+
+ class Colors(IntEnum):
+ """Colors enumerator"""
+ NONE = 0
+ RED = 1
+ GREEN = 2
+ BLUE = 3
+
+
+This will be the documentation file with auto-documentation directive:
+
+.. code-block:: rst
+ :caption: index.rst
+
+ .. autointenum:: my_enums.Colors
diff --git a/doc/development/tutorials/examples/README.rst b/doc/development/tutorials/examples/README.rst
new file mode 100644
index 0000000..2b9c01b
--- /dev/null
+++ b/doc/development/tutorials/examples/README.rst
@@ -0,0 +1,11 @@
+:orphan:
+
+Tutorial examples
+=================
+
+This directory contains a number of examples used in the tutorials. These are
+intended to be increasingly complex to demonstrate the various features of
+Sphinx, but should aim to be as complicated as necessary but no more.
+Individual sections are referenced by line numbers, meaning if you make changes
+to the source files, you should update the references in the documentation
+accordingly.
diff --git a/doc/development/tutorials/examples/autodoc_intenum.py b/doc/development/tutorials/examples/autodoc_intenum.py
new file mode 100644
index 0000000..75fa204
--- /dev/null
+++ b/doc/development/tutorials/examples/autodoc_intenum.py
@@ -0,0 +1,58 @@
+from __future__ import annotations
+
+from enum import IntEnum
+from typing import TYPE_CHECKING, Any
+
+from sphinx.ext.autodoc import ClassDocumenter, bool_option
+
+if TYPE_CHECKING:
+ from docutils.statemachine import StringList
+
+ from sphinx.application import Sphinx
+
+
+class IntEnumDocumenter(ClassDocumenter):
+ objtype = 'intenum'
+ directivetype = ClassDocumenter.objtype
+ priority = 10 + ClassDocumenter.priority
+ option_spec = dict(ClassDocumenter.option_spec)
+ option_spec['hex'] = bool_option
+
+ @classmethod
+ def can_document_member(cls,
+ member: Any, membername: str,
+ isattr: bool, parent: Any) -> bool:
+ try:
+ return issubclass(member, IntEnum)
+ except TypeError:
+ return False
+
+ def add_directive_header(self, sig: str) -> None:
+ super().add_directive_header(sig)
+ self.add_line(' :final:', self.get_sourcename())
+
+ def add_content(self,
+ more_content: StringList | None,
+ no_docstring: bool = False,
+ ) -> None:
+
+ super().add_content(more_content, no_docstring)
+
+ source_name = self.get_sourcename()
+ enum_object: IntEnum = self.object
+ use_hex = self.options.hex
+ self.add_line('', source_name)
+
+ for the_member_name, enum_member in enum_object.__members__.items():
+ the_member_value = enum_member.value
+ if use_hex:
+ the_member_value = hex(the_member_value)
+
+ self.add_line(
+ f"**{the_member_name}**: {the_member_value}", source_name)
+ self.add_line('', source_name)
+
+
+def setup(app: Sphinx) -> None:
+ app.setup_extension('sphinx.ext.autodoc') # Require autodoc extension
+ app.add_autodocumenter(IntEnumDocumenter)
diff --git a/doc/development/tutorials/examples/helloworld.py b/doc/development/tutorials/examples/helloworld.py
new file mode 100644
index 0000000..d6d81fd
--- /dev/null
+++ b/doc/development/tutorials/examples/helloworld.py
@@ -0,0 +1,19 @@
+from docutils import nodes
+from docutils.parsers.rst import Directive
+
+
+class HelloWorld(Directive):
+
+ def run(self):
+ paragraph_node = nodes.paragraph(text='Hello World!')
+ return [paragraph_node]
+
+
+def setup(app):
+ app.add_directive("helloworld", HelloWorld)
+
+ return {
+ 'version': '0.1',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/doc/development/tutorials/examples/recipe.py b/doc/development/tutorials/examples/recipe.py
new file mode 100644
index 0000000..c7ebf2a
--- /dev/null
+++ b/doc/development/tutorials/examples/recipe.py
@@ -0,0 +1,159 @@
+from collections import defaultdict
+
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.directives import ObjectDescription
+from sphinx.domains import Domain, Index
+from sphinx.roles import XRefRole
+from sphinx.util.nodes import make_refnode
+
+
+class RecipeDirective(ObjectDescription):
+ """A custom directive that describes a recipe."""
+
+ has_content = True
+ required_arguments = 1
+ option_spec = {
+ 'contains': directives.unchanged_required,
+ }
+
+ def handle_signature(self, sig, signode):
+ signode += addnodes.desc_name(text=sig)
+ return sig
+
+ def add_target_and_index(self, name_cls, sig, signode):
+ signode['ids'].append('recipe' + '-' + sig)
+ if 'contains' in self.options:
+ ingredients = [
+ x.strip() for x in self.options.get('contains').split(',')]
+
+ recipes = self.env.get_domain('recipe')
+ recipes.add_recipe(sig, ingredients)
+
+
+class IngredientIndex(Index):
+ """A custom index that creates an ingredient matrix."""
+
+ name = 'ingredient'
+ localname = 'Ingredient Index'
+ shortname = 'Ingredient'
+
+ def generate(self, docnames=None):
+ content = defaultdict(list)
+
+ recipes = {name: (dispname, typ, docname, anchor)
+ for name, dispname, typ, docname, anchor, _
+ in self.domain.get_objects()}
+ recipe_ingredients = self.domain.data['recipe_ingredients']
+ ingredient_recipes = defaultdict(list)
+
+ # flip from recipe_ingredients to ingredient_recipes
+ for recipe_name, ingredients in recipe_ingredients.items():
+ for ingredient in ingredients:
+ ingredient_recipes[ingredient].append(recipe_name)
+
+ # convert the mapping of ingredient to recipes to produce the expected
+ # output, shown below, using the ingredient name as a key to group
+ #
+ # name, subtype, docname, anchor, extra, qualifier, description
+ for ingredient, recipe_names in ingredient_recipes.items():
+ for recipe_name in recipe_names:
+ dispname, typ, docname, anchor = recipes[recipe_name]
+ content[ingredient].append(
+ (dispname, 0, docname, anchor, docname, '', typ))
+
+ # convert the dict to the sorted list of tuples expected
+ content = sorted(content.items())
+
+ return content, True
+
+
+class RecipeIndex(Index):
+ """A custom index that creates an recipe matrix."""
+
+ name = 'recipe'
+ localname = 'Recipe Index'
+ shortname = 'Recipe'
+
+ def generate(self, docnames=None):
+ content = defaultdict(list)
+
+ # sort the list of recipes in alphabetical order
+ recipes = self.domain.get_objects()
+ recipes = sorted(recipes, key=lambda recipe: recipe[0])
+
+ # generate the expected output, shown below, from the above using the
+ # first letter of the recipe as a key to group thing
+ #
+ # name, subtype, docname, anchor, extra, qualifier, description
+ for _name, dispname, typ, docname, anchor, _priority in recipes:
+ content[dispname[0].lower()].append(
+ (dispname, 0, docname, anchor, docname, '', typ))
+
+ # convert the dict to the sorted list of tuples expected
+ content = sorted(content.items())
+
+ return content, True
+
+
+class RecipeDomain(Domain):
+
+ name = 'recipe'
+ label = 'Recipe Sample'
+ roles = {
+ 'ref': XRefRole(),
+ }
+ directives = {
+ 'recipe': RecipeDirective,
+ }
+ indices = {
+ RecipeIndex,
+ IngredientIndex,
+ }
+ initial_data = {
+ 'recipes': [], # object list
+ 'recipe_ingredients': {}, # name -> object
+ }
+
+ def get_full_qualified_name(self, node):
+ return f'recipe.{node.arguments[0]}'
+
+ def get_objects(self):
+ yield from self.data['recipes']
+
+ def resolve_xref(self, env, fromdocname, builder, typ, target, node,
+ contnode):
+ match = [(docname, anchor)
+ for name, sig, typ, docname, anchor, prio
+ in self.get_objects() if sig == target]
+
+ if len(match) > 0:
+ todocname = match[0][0]
+ targ = match[0][1]
+
+ return make_refnode(builder, fromdocname, todocname, targ,
+ contnode, targ)
+ else:
+ print('Awww, found nothing')
+ return None
+
+ def add_recipe(self, signature, ingredients):
+ """Add a new recipe to the domain."""
+ name = f'recipe.{signature}'
+ anchor = f'recipe-{signature}'
+
+ self.data['recipe_ingredients'][name] = ingredients
+ # name, dispname, type, docname, anchor, priority
+ self.data['recipes'].append(
+ (name, signature, 'Recipe', self.env.docname, anchor, 0))
+
+
+def setup(app):
+ app.add_domain(RecipeDomain)
+
+ return {
+ 'version': '0.1',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/doc/development/tutorials/examples/todo.py b/doc/development/tutorials/examples/todo.py
new file mode 100644
index 0000000..15368f4
--- /dev/null
+++ b/doc/development/tutorials/examples/todo.py
@@ -0,0 +1,135 @@
+from docutils import nodes
+from docutils.parsers.rst import Directive
+
+from sphinx.locale import _
+from sphinx.util.docutils import SphinxDirective
+
+
+class todo(nodes.Admonition, nodes.Element):
+ pass
+
+
+class todolist(nodes.General, nodes.Element):
+ pass
+
+
+def visit_todo_node(self, node):
+ self.visit_admonition(node)
+
+
+def depart_todo_node(self, node):
+ self.depart_admonition(node)
+
+
+class TodolistDirective(Directive):
+
+ def run(self):
+ return [todolist('')]
+
+
+class TodoDirective(SphinxDirective):
+
+ # this enables content in the directive
+ has_content = True
+
+ def run(self):
+ targetid = 'todo-%d' % self.env.new_serialno('todo')
+ targetnode = nodes.target('', '', ids=[targetid])
+
+ todo_node = todo('\n'.join(self.content))
+ todo_node += nodes.title(_('Todo'), _('Todo'))
+ self.state.nested_parse(self.content, self.content_offset, todo_node)
+
+ if not hasattr(self.env, 'todo_all_todos'):
+ self.env.todo_all_todos = []
+
+ self.env.todo_all_todos.append({
+ 'docname': self.env.docname,
+ 'lineno': self.lineno,
+ 'todo': todo_node.deepcopy(),
+ 'target': targetnode,
+ })
+
+ return [targetnode, todo_node]
+
+
+def purge_todos(app, env, docname):
+ if not hasattr(env, 'todo_all_todos'):
+ return
+
+ env.todo_all_todos = [todo for todo in env.todo_all_todos
+ if todo['docname'] != docname]
+
+
+def merge_todos(app, env, docnames, other):
+ if not hasattr(env, 'todo_all_todos'):
+ env.todo_all_todos = []
+ if hasattr(other, 'todo_all_todos'):
+ env.todo_all_todos.extend(other.todo_all_todos)
+
+
+def process_todo_nodes(app, doctree, fromdocname):
+ if not app.config.todo_include_todos:
+ for node in doctree.findall(todo):
+ node.parent.remove(node)
+
+ # Replace all todolist nodes with a list of the collected todos.
+ # Augment each todo with a backlink to the original location.
+ env = app.builder.env
+
+ if not hasattr(env, 'todo_all_todos'):
+ env.todo_all_todos = []
+
+ for node in doctree.findall(todolist):
+ if not app.config.todo_include_todos:
+ node.replace_self([])
+ continue
+
+ content = []
+
+ for todo_info in env.todo_all_todos:
+ para = nodes.paragraph()
+ filename = env.doc2path(todo_info['docname'], base=None)
+ description = (
+ _('(The original entry is located in %s, line %d and can be found ') %
+ (filename, todo_info['lineno']))
+ para += nodes.Text(description)
+
+ # Create a reference
+ newnode = nodes.reference('', '')
+ innernode = nodes.emphasis(_('here'), _('here'))
+ newnode['refdocname'] = todo_info['docname']
+ newnode['refuri'] = app.builder.get_relative_uri(
+ fromdocname, todo_info['docname'])
+ newnode['refuri'] += '#' + todo_info['target']['refid']
+ newnode.append(innernode)
+ para += newnode
+ para += nodes.Text('.)')
+
+ # Insert into the todolist
+ content.append(todo_info['todo'])
+ content.append(para)
+
+ node.replace_self(content)
+
+
+def setup(app):
+ app.add_config_value('todo_include_todos', False, 'html')
+
+ app.add_node(todolist)
+ app.add_node(todo,
+ html=(visit_todo_node, depart_todo_node),
+ latex=(visit_todo_node, depart_todo_node),
+ text=(visit_todo_node, depart_todo_node))
+
+ app.add_directive('todo', TodoDirective)
+ app.add_directive('todolist', TodolistDirective)
+ app.connect('doctree-resolved', process_todo_nodes)
+ app.connect('env-purge-doc', purge_todos)
+ app.connect('env-merge-info', merge_todos)
+
+ return {
+ 'version': '0.1',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/doc/development/tutorials/helloworld.rst b/doc/development/tutorials/helloworld.rst
new file mode 100644
index 0000000..8940e3d
--- /dev/null
+++ b/doc/development/tutorials/helloworld.rst
@@ -0,0 +1,189 @@
+Developing a "Hello world" extension
+====================================
+
+The objective of this tutorial is to create a very basic extension that adds a
+new directive. This directive will output a paragraph containing "hello world".
+
+Only basic information is provided in this tutorial. For more information, refer
+to the :doc:`other tutorials <index>` that go into more details.
+
+.. warning::
+
+ For this extension, you will need some basic understanding of docutils_
+ and Python.
+
+
+Overview
+--------
+
+We want the extension to add the following to Sphinx:
+
+* A ``helloworld`` directive, that will simply output the text "hello world".
+
+
+Prerequisites
+-------------
+
+We will not be distributing this plugin via `PyPI`_ and will instead include it
+as part of an existing project. This means you will need to use an existing
+project or create a new one using :program:`sphinx-quickstart`.
+
+We assume you are using separate source (:file:`source`) and build
+(:file:`build`) folders. Your extension file could be in any folder of your
+project. In our case, let's do the following:
+
+#. Create an :file:`_ext` folder in :file:`source`
+#. Create a new Python file in the :file:`_ext` folder called
+ :file:`helloworld.py`
+
+Here is an example of the folder structure you might obtain:
+
+.. code-block:: text
+
+ └── source
+    ├── _ext
+ │   └── helloworld.py
+    ├── _static
+    ├── conf.py
+    ├── somefolder
+    ├── index.rst
+    ├── somefile.rst
+    └── someotherfile.rst
+
+
+Writing the extension
+---------------------
+
+Open :file:`helloworld.py` and paste the following code in it:
+
+.. literalinclude:: examples/helloworld.py
+ :language: python
+ :linenos:
+
+Some essential things are happening in this example, and you will see them for
+all directives.
+
+.. rubric:: The directive class
+
+Our new directive is declared in the ``HelloWorld`` class.
+
+.. literalinclude:: examples/helloworld.py
+ :language: python
+ :linenos:
+ :lines: 5-9
+
+This class extends the docutils_' ``Directive`` class. All extensions that
+create directives should extend this class.
+
+.. seealso::
+
+ `The docutils documentation on creating directives <docutils directives_>`_
+
+This class contains a ``run`` method. This method is a requirement and it is
+part of every directive. It contains the main logic of the directive and it
+returns a list of docutils nodes to be processed by Sphinx. These nodes are
+docutils' way of representing the content of a document. There are many types of
+nodes available: text, paragraph, reference, table, etc.
+
+.. seealso::
+
+ `The docutils documentation on nodes <docutils nodes_>`_
+
+The ``nodes.paragraph`` class creates a new paragraph node. A paragraph
+node typically contains some text that we can set during instantiation using
+the ``text`` parameter.
+
+.. rubric:: The ``setup`` function
+
+.. currentmodule:: sphinx.application
+
+This function is a requirement. We use it to plug our new directive into
+Sphinx.
+
+.. literalinclude:: examples/helloworld.py
+ :language: python
+ :linenos:
+ :lines: 12-
+
+The simplest thing you can do is to call the :meth:`~Sphinx.add_directive` method,
+which is what we've done here. For this particular call, the first argument is
+the name of the directive itself as used in a reST file. In this case, we would
+use ``helloworld``. For example:
+
+.. code-block:: rst
+
+ Some intro text here...
+
+ .. helloworld::
+
+ Some more text here...
+
+We also return the :ref:`extension metadata <ext-metadata>` that indicates the
+version of our extension, along with the fact that it is safe to use the
+extension for both parallel reading and writing.
+
+
+Using the extension
+-------------------
+
+The extension has to be declared in your :file:`conf.py` file to make Sphinx
+aware of it. There are two steps necessary here:
+
+#. Add the :file:`_ext` directory to the `Python path`_ using
+ ``sys.path.append``. This should be placed at the top of the file.
+
+#. Update or create the :confval:`extensions` list and add the extension file
+ name to the list
+
+For example:
+
+.. code-block:: python
+
+ import os
+ import sys
+
+ sys.path.append(os.path.abspath("./_ext"))
+
+ extensions = ['helloworld']
+
+.. tip::
+
+ We're not distributing this extension as a `Python package`_, we need to
+ modify the `Python path`_ so Sphinx can find our extension. This is why we
+ need the call to ``sys.path.append``.
+
+You can now use the extension in a file. For example:
+
+.. code-block:: rst
+
+ Some intro text here...
+
+ .. helloworld::
+
+ Some more text here...
+
+The sample above would generate:
+
+.. code-block:: text
+
+ Some intro text here...
+
+ Hello World!
+
+ Some more text here...
+
+
+Further reading
+---------------
+
+This is the very basic principle of an extension that creates a new directive.
+
+For a more advanced example, refer to :doc:`todo`.
+
+
+.. _docutils: https://docutils.sourceforge.io/
+.. _docutils directives: https://docutils.sourceforge.io/docs/howto/rst-directives.html
+.. _docutils nodes: https://docutils.sourceforge.io/docs/ref/doctree.html
+.. _PyPI: https://pypi.org/
+.. _Python package: https://packaging.python.org/
+.. _Python path: https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH
diff --git a/doc/development/tutorials/index.rst b/doc/development/tutorials/index.rst
new file mode 100644
index 0000000..a7eee48
--- /dev/null
+++ b/doc/development/tutorials/index.rst
@@ -0,0 +1,17 @@
+.. _extension-tutorials-index:
+
+Extension tutorials
+===================
+
+Refer to the following tutorials to get started with extension development.
+
+
+.. toctree::
+ :caption: Directive tutorials
+ :maxdepth: 1
+
+ helloworld
+ todo
+ recipe
+ autodoc_ext
+
diff --git a/doc/development/tutorials/recipe.rst b/doc/development/tutorials/recipe.rst
new file mode 100644
index 0000000..1ed428a
--- /dev/null
+++ b/doc/development/tutorials/recipe.rst
@@ -0,0 +1,227 @@
+Developing a "recipe" extension
+===============================
+
+The objective of this tutorial is to illustrate roles, directives and domains.
+Once complete, we will be able to use this extension to describe a recipe and
+reference that recipe from elsewhere in our documentation.
+
+.. note::
+
+ This tutorial is based on a guide first published on `opensource.com`_ and
+ is provided here with the original author's permission.
+
+ .. _opensource.com: https://opensource.com/article/18/11/building-custom-workflows-sphinx
+
+
+Overview
+--------
+
+We want the extension to add the following to Sphinx:
+
+* A ``recipe`` :term:`directive`, containing some content describing the recipe
+ steps, along with a ``:contains:`` option highlighting the main ingredients
+ of the recipe.
+
+* A ``ref`` :term:`role`, which provides a cross-reference to the recipe
+ itself.
+
+* A ``recipe`` :term:`domain`, which allows us to tie together the above role
+ and domain, along with things like indices.
+
+For that, we will need to add the following elements to Sphinx:
+
+* A new directive called ``recipe``
+
+* New indexes to allow us to reference ingredient and recipes
+
+* A new domain called ``recipe``, which will contain the ``recipe`` directive
+ and ``ref`` role
+
+
+Prerequisites
+-------------
+
+We need the same setup as in :doc:`the previous extensions <todo>`. This time,
+we will be putting out extension in a file called :file:`recipe.py`.
+
+Here is an example of the folder structure you might obtain:
+
+.. code-block:: text
+
+ └── source
+    ├── _ext
+ │   └── recipe.py
+    ├── conf.py
+    └── index.rst
+
+
+Writing the extension
+---------------------
+
+Open :file:`recipe.py` and paste the following code in it, all of which we will
+explain in detail shortly:
+
+.. literalinclude:: examples/recipe.py
+ :language: python
+ :linenos:
+
+Let's look at each piece of this extension step-by-step to explain what's going
+on.
+
+.. rubric:: The directive class
+
+The first thing to examine is the ``RecipeDirective`` directive:
+
+.. literalinclude:: examples/recipe.py
+ :language: python
+ :linenos:
+ :pyobject: RecipeDirective
+
+Unlike :doc:`helloworld` and :doc:`todo`, this directive doesn't derive from
+:class:`docutils.parsers.rst.Directive` and doesn't define a ``run`` method.
+Instead, it derives from :class:`sphinx.directives.ObjectDescription` and
+defines ``handle_signature`` and ``add_target_and_index`` methods. This is
+because ``ObjectDescription`` is a special-purpose directive that's intended
+for describing things like classes, functions, or, in our case, recipes. More
+specifically, ``handle_signature`` implements parsing the signature of the
+directive and passes on the object's name and type to its superclass, while
+``add_target_and_index`` adds a target (to link to) and an entry to the index
+for this node.
+
+We also see that this directive defines ``has_content``, ``required_arguments``
+and ``option_spec``. Unlike the ``TodoDirective`` directive added in the
+:doc:`previous tutorial <todo>`, this directive takes a single argument, the
+recipe name, and an option, ``contains``, in addition to the nested
+reStructuredText in the body.
+
+.. rubric:: The index classes
+
+.. currentmodule:: sphinx.domains
+
+.. todo:: Add brief overview of indices
+
+.. literalinclude:: examples/recipe.py
+ :language: python
+ :linenos:
+ :pyobject: IngredientIndex
+
+.. literalinclude:: examples/recipe.py
+ :language: python
+ :linenos:
+ :pyobject: RecipeIndex
+
+Both ``IngredientIndex`` and ``RecipeIndex`` are derived from :class:`Index`.
+They implement custom logic to generate a tuple of values that define the
+index. Note that ``RecipeIndex`` is a simple index that has only one entry.
+Extending it to cover more object types is not yet part of the code.
+
+Both indices use the method :meth:`Index.generate` to do their work. This
+method combines the information from our domain, sorts it, and returns it in a
+list structure that will be accepted by Sphinx. This might look complicated but
+all it really is is a list of tuples like ``('tomato', 'TomatoSoup', 'test',
+'rec-TomatoSoup',...)``. Refer to the :doc:`domain API guide
+</extdev/domainapi>` for more information on this API.
+
+These index pages can be referenced with the :rst:role:`ref` role by combining
+the domain name and the index ``name`` value. For example, ``RecipeIndex`` can be
+referenced with ``:ref:`recipe-recipe``` and ``IngredientIndex`` can be referenced
+with ``:ref:`recipe-ingredient```.
+
+.. rubric:: The domain
+
+A Sphinx domain is a specialized container that ties together roles,
+directives, and indices, among other things. Let's look at the domain we're
+creating here.
+
+.. literalinclude:: examples/recipe.py
+ :language: python
+ :linenos:
+ :pyobject: RecipeDomain
+
+There are some interesting things to note about this ``recipe`` domain and domains
+in general. Firstly, we actually register our directives, roles and indices
+here, via the ``directives``, ``roles`` and ``indices`` attributes, rather than
+via calls later on in ``setup``. We can also note that we aren't actually
+defining a custom role and are instead reusing the
+:class:`sphinx.roles.XRefRole` role and defining the
+:class:`sphinx.domains.Domain.resolve_xref` method. This method takes two
+arguments, ``typ`` and ``target``, which refer to the cross-reference type and
+its target name. We'll use ``target`` to resolve our destination from our
+domain's ``recipes`` because we currently have only one type of node.
+
+Moving on, we can see that we've defined ``initial_data``. The values defined in
+``initial_data`` will be copied to ``env.domaindata[domain_name]`` as the
+initial data of the domain, and domain instances can access it via
+``self.data``. We see that we have defined two items in ``initial_data``:
+``recipes`` and ``recipe_ingredients``. Each contains a list of all objects
+defined (i.e. all recipes) and a hash that maps a canonical ingredient name to
+the list of objects. The way we name objects is common across our extension and
+is defined in the ``get_full_qualified_name`` method. For each object created,
+the canonical name is ``recipe.<recipename>``, where ``<recipename>`` is the
+name the documentation writer gives the object (a recipe). This enables the
+extension to use different object types that share the same name. Having a
+canonical name and central place for our objects is a huge advantage. Both our
+indices and our cross-referencing code use this feature.
+
+.. rubric:: The ``setup`` function
+
+.. currentmodule:: sphinx.application
+
+:doc:`As always <todo>`, the ``setup`` function is a requirement and is used to
+hook the various parts of our extension into Sphinx. Let's look at the
+``setup`` function for this extension.
+
+.. literalinclude:: examples/recipe.py
+ :language: python
+ :linenos:
+ :pyobject: setup
+
+This looks a little different to what we're used to seeing. There are no calls
+to :meth:`~Sphinx.add_directive` or even :meth:`~Sphinx.add_role`. Instead, we
+have a single call to :meth:`~Sphinx.add_domain` followed by some
+initialization of the :ref:`standard domain <domains-std>`. This is because we
+had already registered our directives, roles and indexes as part of the
+directive itself.
+
+
+Using the extension
+-------------------
+
+You can now use the extension throughout your project. For example:
+
+.. code-block:: rst
+ :caption: index.rst
+
+ Joe's Recipes
+ =============
+
+ Below are a collection of my favourite recipes. I highly recommend the
+ :recipe:ref:`TomatoSoup` recipe in particular!
+
+ .. toctree::
+
+ tomato-soup
+
+.. code-block:: rst
+ :caption: tomato-soup.rst
+
+ The recipe contains `tomato` and `cilantro`.
+
+ .. recipe:recipe:: TomatoSoup
+ :contains: tomato, cilantro, salt, pepper
+
+ This recipe is a tasty tomato soup, combine all ingredients
+ and cook.
+
+The important things to note are the use of the ``:recipe:ref:`` role to
+cross-reference the recipe actually defined elsewhere (using the
+``:recipe:recipe:`` directive).
+
+
+Further reading
+---------------
+
+For more information, refer to the `docutils`_ documentation and
+:doc:`/extdev/index`.
+
+.. _docutils: https://docutils.sourceforge.io/docs/
diff --git a/doc/development/tutorials/todo.rst b/doc/development/tutorials/todo.rst
new file mode 100644
index 0000000..f23d8ad
--- /dev/null
+++ b/doc/development/tutorials/todo.rst
@@ -0,0 +1,367 @@
+Developing a "TODO" extension
+=============================
+
+The objective of this tutorial is to create a more comprehensive extension than
+that created in :doc:`helloworld`. Whereas that guide just covered writing a
+custom :term:`directive`, this guide adds multiple directives, along with custom
+nodes, additional config values and custom event handlers. To this end, we will
+cover a ``todo`` extension that adds capabilities to include todo entries in the
+documentation, and to collect these in a central place. This is similar the
+``sphinxext.todo`` extension distributed with Sphinx.
+
+
+Overview
+--------
+
+.. note::
+ To understand the design of this extension, refer to
+ :ref:`important-objects` and :ref:`build-phases`.
+
+We want the extension to add the following to Sphinx:
+
+* A ``todo`` directive, containing some content that is marked with "TODO" and
+ only shown in the output if a new config value is set. Todo entries should not
+ be in the output by default.
+
+* A ``todolist`` directive that creates a list of all todo entries throughout
+ the documentation.
+
+For that, we will need to add the following elements to Sphinx:
+
+* New directives, called ``todo`` and ``todolist``.
+
+* New document tree nodes to represent these directives, conventionally also
+ called ``todo`` and ``todolist``. We wouldn't need new nodes if the new
+ directives only produced some content representable by existing nodes.
+
+* A new config value ``todo_include_todos`` (config value names should start
+ with the extension name, in order to stay unique) that controls whether todo
+ entries make it into the output.
+
+* New event handlers: one for the :event:`doctree-resolved` event, to
+ replace the todo and todolist nodes, one for :event:`env-merge-info`
+ to merge intermediate results from parallel builds, and one for
+ :event:`env-purge-doc` (the reason for that will be covered later).
+
+
+Prerequisites
+-------------
+
+As with :doc:`helloworld`, we will not be distributing this plugin via PyPI so
+once again we need a Sphinx project to call this from. You can use an existing
+project or create a new one using :program:`sphinx-quickstart`.
+
+We assume you are using separate source (:file:`source`) and build
+(:file:`build`) folders. Your extension file could be in any folder of your
+project. In our case, let's do the following:
+
+#. Create an :file:`_ext` folder in :file:`source`
+#. Create a new Python file in the :file:`_ext` folder called :file:`todo.py`
+
+Here is an example of the folder structure you might obtain:
+
+.. code-block:: text
+
+ └── source
+    ├── _ext
+ │   └── todo.py
+    ├── _static
+    ├── conf.py
+    ├── somefolder
+    ├── index.rst
+    ├── somefile.rst
+    └── someotherfile.rst
+
+
+Writing the extension
+---------------------
+
+Open :file:`todo.py` and paste the following code in it, all of which we will
+explain in detail shortly:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+
+This is far more extensive extension than the one detailed in :doc:`helloworld`,
+however, we will will look at each piece step-by-step to explain what's
+happening.
+
+.. rubric:: The node classes
+
+Let's start with the node classes:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+ :lines: 8-21
+
+Node classes usually don't have to do anything except inherit from the standard
+docutils classes defined in :mod:`docutils.nodes`. ``todo`` inherits from
+``Admonition`` because it should be handled like a note or warning, ``todolist``
+is just a "general" node.
+
+.. note::
+
+ Many extensions will not have to create their own node classes and work fine
+ with the nodes already provided by `docutils
+ <https://docutils.sourceforge.io/docs/ref/doctree.html>`__ and :ref:`Sphinx
+ <nodes>`.
+
+.. attention::
+
+ It is important to know that while you can extend Sphinx without
+ leaving your ``conf.py``, if you declare an inherited node right
+ there, you'll hit an unobvious :py:class:`~pickle.PickleError`. So if
+ something goes wrong, please make sure that you put inherited nodes
+ into a separate Python module.
+
+ For more details, see:
+
+ - https://github.com/sphinx-doc/sphinx/issues/6751
+ - https://github.com/sphinx-doc/sphinx/issues/1493
+ - https://github.com/sphinx-doc/sphinx/issues/1424
+
+.. rubric:: The directive classes
+
+A directive class is a class deriving usually from
+:class:`docutils.parsers.rst.Directive`. The directive interface is also
+covered in detail in the `docutils documentation`_; the important thing is that
+the class should have attributes that configure the allowed markup, and a
+``run`` method that returns a list of nodes.
+
+Looking first at the ``TodolistDirective`` directive:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+ :lines: 24-27
+
+It's very simple, creating and returning an instance of our ``todolist`` node
+class. The ``TodolistDirective`` directive itself has neither content nor
+arguments that need to be handled. That brings us to the ``TodoDirective``
+directive:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+ :lines: 30-53
+
+Several important things are covered here. First, as you can see, we're now
+subclassing the :class:`~sphinx.util.docutils.SphinxDirective` helper class
+instead of the usual :class:`~docutils.parsers.rst.Directive` class. This
+gives us access to the :ref:`build environment instance <important-objects>`
+using the ``self.env`` property. Without this, we'd have to use the rather
+convoluted ``self.state.document.settings.env``. Then, to act as a link target
+(from ``TodolistDirective``), the ``TodoDirective`` directive needs to return a
+target node in addition to the ``todo`` node. The target ID (in HTML, this will
+be the anchor name) is generated by using ``env.new_serialno`` which returns a
+new unique integer on each call and therefore leads to unique target names. The
+target node is instantiated without any text (the first two arguments).
+
+On creating admonition node, the content body of the directive are parsed using
+``self.state.nested_parse``. The first argument gives the content body, and
+the second one gives content offset. The third argument gives the parent node
+of parsed result, in our case the ``todo`` node. Following this, the ``todo``
+node is added to the environment. This is needed to be able to create a list of
+all todo entries throughout the documentation, in the place where the author
+puts a ``todolist`` directive. For this case, the environment attribute
+``todo_all_todos`` is used (again, the name should be unique, so it is prefixed
+by the extension name). It does not exist when a new environment is created, so
+the directive must check and create it if necessary. Various information about
+the todo entry's location are stored along with a copy of the node.
+
+In the last line, the nodes that should be put into the doctree are returned:
+the target node and the admonition node.
+
+The node structure that the directive returns looks like this::
+
+ +--------------------+
+ | target node |
+ +--------------------+
+ +--------------------+
+ | todo node |
+ +--------------------+
+ \__+--------------------+
+ | admonition title |
+ +--------------------+
+ | paragraph |
+ +--------------------+
+ | ... |
+ +--------------------+
+
+.. rubric:: The event handlers
+
+Event handlers are one of Sphinx's most powerful features, providing a way to
+do hook into any part of the documentation process. There are many events
+provided by Sphinx itself, as detailed in :ref:`the API guide <events>`, and
+we're going to use a subset of them here.
+
+Let's look at the event handlers used in the above example. First, the one for
+the :event:`env-purge-doc` event:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+ :lines: 56-61
+
+Since we store information from source files in the environment, which is
+persistent, it may become out of date when the source file changes. Therefore,
+before each source file is read, the environment's records of it are cleared,
+and the :event:`env-purge-doc` event gives extensions a chance to do the same.
+Here we clear out all todos whose docname matches the given one from the
+``todo_all_todos`` list. If there are todos left in the document, they will be
+added again during parsing.
+
+The next handler, for the :event:`env-merge-info` event, is used
+during parallel builds. As during parallel builds all threads have
+their own ``env``, there's multiple ``todo_all_todos`` lists that need
+to be merged:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+ :lines: 64-68
+
+
+The other handler belongs to the :event:`doctree-resolved` event:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+ :lines: 71-113
+
+The :event:`doctree-resolved` event is emitted at the end of :ref:`phase 3
+(resolving) <build-phases>` and allows custom resolving to be done. The handler
+we have written for this event is a bit more involved. If the
+``todo_include_todos`` config value (which we'll describe shortly) is false,
+all ``todo`` and ``todolist`` nodes are removed from the documents. If not,
+``todo`` nodes just stay where and how they are. ``todolist`` nodes are
+replaced by a list of todo entries, complete with backlinks to the location
+where they come from. The list items are composed of the nodes from the
+``todo`` entry and docutils nodes created on the fly: a paragraph for each
+entry, containing text that gives the location, and a link (reference node
+containing an italic node) with the backreference. The reference URI is built
+by :meth:`sphinx.builders.Builder.get_relative_uri` which creates a suitable
+URI depending on the used builder, and appending the todo node's (the target's)
+ID as the anchor name.
+
+.. rubric:: The ``setup`` function
+
+.. currentmodule:: sphinx.application
+
+As noted :doc:`previously <helloworld>`, the ``setup`` function is a requirement
+and is used to plug directives into Sphinx. However, we also use it to hook up
+the other parts of our extension. Let's look at our ``setup`` function:
+
+.. literalinclude:: examples/todo.py
+ :language: python
+ :linenos:
+ :lines: 116-
+
+The calls in this function refer to the classes and functions we added earlier.
+What the individual calls do is the following:
+
+* :meth:`~Sphinx.add_config_value` lets Sphinx know that it should recognize the
+ new *config value* ``todo_include_todos``, whose default value should be
+ ``False`` (this also tells Sphinx that it is a boolean value).
+
+ If the third argument was ``'html'``, HTML documents would be full rebuild if the
+ config value changed its value. This is needed for config values that
+ influence reading (build :ref:`phase 1 (reading) <build-phases>`).
+
+* :meth:`~Sphinx.add_node` adds a new *node class* to the build system. It also
+ can specify visitor functions for each supported output format. These visitor
+ functions are needed when the new nodes stay until :ref:`phase 4 (writing)
+ <build-phases>`. Since the ``todolist`` node is always replaced in
+ :ref:`phase 3 (resolving) <build-phases>`, it doesn't need any.
+
+* :meth:`~Sphinx.add_directive` adds a new *directive*, given by name and class.
+
+* Finally, :meth:`~Sphinx.connect` adds an *event handler* to the event whose
+ name is given by the first argument. The event handler function is called
+ with several arguments which are documented with the event.
+
+With this, our extension is complete.
+
+
+Using the extension
+-------------------
+
+As before, we need to enable the extension by declaring it in our
+:file:`conf.py` file. There are two steps necessary here:
+
+#. Add the :file:`_ext` directory to the `Python path`_ using
+ ``sys.path.append``. This should be placed at the top of the file.
+
+#. Update or create the :confval:`extensions` list and add the extension file
+ name to the list
+
+In addition, we may wish to set the ``todo_include_todos`` config value. As
+noted above, this defaults to ``False`` but we can set it explicitly.
+
+For example:
+
+.. code-block:: python
+
+ import os
+ import sys
+
+ sys.path.append(os.path.abspath("./_ext"))
+
+ extensions = ['todo']
+
+ todo_include_todos = False
+
+You can now use the extension throughout your project. For example:
+
+.. code-block:: rst
+ :caption: index.rst
+
+ Hello, world
+ ============
+
+ .. toctree::
+ somefile.rst
+ someotherfile.rst
+
+ Hello world. Below is the list of TODOs.
+
+ .. todolist::
+
+.. code-block:: rst
+ :caption: somefile.rst
+
+ foo
+ ===
+
+ Some intro text here...
+
+ .. todo:: Fix this
+
+.. code-block:: rst
+ :caption: someotherfile.rst
+
+ bar
+ ===
+
+ Some more text here...
+
+ .. todo:: Fix that
+
+Because we have configured ``todo_include_todos`` to ``False``, we won't
+actually see anything rendered for the ``todo`` and ``todolist`` directives.
+However, if we toggle this to true, we will see the output described
+previously.
+
+
+Further reading
+---------------
+
+For more information, refer to the `docutils`_ documentation and
+:doc:`/extdev/index`.
+
+
+.. _docutils: https://docutils.sourceforge.io/docs/
+.. _Python path: https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH
+.. _docutils documentation: https://docutils.sourceforge.io/docs/ref/rst/directives.html
diff --git a/doc/examples.rst b/doc/examples.rst
new file mode 100644
index 0000000..c28364a
--- /dev/null
+++ b/doc/examples.rst
@@ -0,0 +1,5 @@
+:tocdepth: 2
+
+.. _examples:
+
+.. include:: ../EXAMPLES
diff --git a/doc/extdev/appapi.rst b/doc/extdev/appapi.rst
new file mode 100644
index 0000000..270000b
--- /dev/null
+++ b/doc/extdev/appapi.rst
@@ -0,0 +1,473 @@
+.. highlight:: rest
+
+Application API
+===============
+
+.. module:: sphinx.application
+ :synopsis: Application class and extensibility interface.
+
+
+Each Sphinx extension is a Python module with at least a :func:`setup`
+function. This function is called at initialization time with one argument,
+the application object representing the Sphinx process.
+
+.. class:: Sphinx
+
+ This application object has the public API described in the following.
+
+Extension setup
+---------------
+
+These methods are usually called in an extension's ``setup()`` function.
+
+Examples of using the Sphinx extension API can be seen in the :mod:`sphinx.ext`
+package.
+
+.. currentmodule:: sphinx.application
+
+.. automethod:: Sphinx.setup_extension
+
+.. automethod:: Sphinx.require_sphinx
+
+.. automethod:: Sphinx.connect
+
+.. automethod:: Sphinx.disconnect
+
+.. automethod:: Sphinx.add_builder
+
+.. automethod:: Sphinx.add_config_value
+
+.. automethod:: Sphinx.add_event
+
+.. automethod:: Sphinx.set_translator
+
+.. automethod:: Sphinx.add_node
+
+.. automethod:: Sphinx.add_enumerable_node
+
+.. automethod:: Sphinx.add_directive
+
+.. automethod:: Sphinx.add_role
+
+.. automethod:: Sphinx.add_generic_role
+
+.. automethod:: Sphinx.add_domain
+
+.. automethod:: Sphinx.add_directive_to_domain
+
+.. automethod:: Sphinx.add_role_to_domain
+
+.. automethod:: Sphinx.add_index_to_domain
+
+.. automethod:: Sphinx.add_object_type
+
+.. automethod:: Sphinx.add_crossref_type
+
+.. automethod:: Sphinx.add_transform
+
+.. automethod:: Sphinx.add_post_transform
+
+.. automethod:: Sphinx.add_js_file
+
+.. automethod:: Sphinx.add_css_file
+
+.. automethod:: Sphinx.add_latex_package
+
+.. automethod:: Sphinx.add_lexer
+
+.. automethod:: Sphinx.add_autodocumenter
+
+.. automethod:: Sphinx.add_autodoc_attrgetter
+
+.. automethod:: Sphinx.add_search_language
+
+.. automethod:: Sphinx.add_source_suffix
+
+.. automethod:: Sphinx.add_source_parser
+
+.. automethod:: Sphinx.add_env_collector
+
+.. automethod:: Sphinx.add_html_theme
+
+.. automethod:: Sphinx.add_html_math_renderer
+
+.. automethod:: Sphinx.add_message_catalog
+
+.. automethod:: Sphinx.is_parallel_allowed
+
+.. exception:: ExtensionError
+
+ All these methods raise this exception if something went wrong with the
+ extension API.
+
+
+Emitting events
+---------------
+
+.. class:: Sphinx
+ :no-index:
+
+ .. automethod:: emit
+
+ .. automethod:: emit_firstresult
+
+
+Sphinx runtime information
+--------------------------
+
+The application object also provides runtime information as attributes.
+
+.. attribute:: Sphinx.project
+
+ Target project. See :class:`.Project`.
+
+.. attribute:: Sphinx.srcdir
+
+ Source directory.
+
+.. attribute:: Sphinx.confdir
+
+ Directory containing ``conf.py``.
+
+.. attribute:: Sphinx.doctreedir
+
+ Directory for storing pickled doctrees.
+
+.. attribute:: Sphinx.outdir
+
+ Directory for storing built document.
+
+
+.. _events:
+
+Sphinx core events
+------------------
+
+These events are known to the core. The arguments shown are given to the
+registered event handlers. Use :meth:`.Sphinx.connect` in an extension's
+``setup`` function (note that ``conf.py`` can also have a ``setup`` function) to
+connect handlers to the events. Example:
+
+.. code-block:: python
+
+ def source_read_handler(app, docname, source):
+ print('do something here...')
+
+ def setup(app):
+ app.connect('source-read', source_read_handler)
+
+
+Below is an overview of each event that happens during a build. In the list
+below, we include the event name, its callback parameters, and the input and output
+type for that event:
+
+.. code-block:: none
+
+ 1. event.config-inited(app,config)
+ 2. event.builder-inited(app)
+ 3. event.env-get-outdated(app, env, added, changed, removed)
+ 4. event.env-before-read-docs(app, env, docnames)
+
+ for docname in docnames:
+ 5. event.env-purge-doc(app, env, docname)
+
+ if doc changed and not removed:
+ 6. source-read(app, docname, source)
+ 7. run source parsers: text -> docutils.document
+ - parsers can be added with the app.add_source_parser() API
+ 8. apply transforms based on priority: docutils.document -> docutils.document
+ - event.doctree-read(app, doctree) is called in the middle of transforms,
+ transforms come before/after this event depending on their priority.
+
+ 9. event.env-merge-info(app, env, docnames, other)
+ - if running in parallel mode, this event will be emitted for each process
+
+ 10. event.env-updated(app, env)
+ 11. event.env-get-updated(app, env)
+ 12. event.env-check-consistency(app, env)
+
+ # The updated-docs list can be builder dependent, but generally includes all new/changed documents,
+ # plus any output from `env-get-updated`, and then all "parent" documents in the ToC tree
+ # For builders that output a single page, they are first joined into a single doctree before post-transforms
+ # or the doctree-resolved event is emitted
+ for docname in updated-docs:
+ 13. apply post-transforms (by priority): docutils.document -> docutils.document
+ 14. event.doctree-resolved(app, doctree, docname)
+ - In the event that any reference nodes fail to resolve, the following may emit:
+ - event.missing-reference(env, node, contnode)
+ - event.warn-missing-reference(domain, node)
+
+ 15. Generate output files
+ 16. event.build-finished(app, exception)
+
+Here is a more detailed list of these events.
+
+.. event:: builder-inited (app)
+
+ Emitted when the builder object has been created. It is available as
+ ``app.builder``.
+
+.. event:: config-inited (app, config)
+
+ Emitted when the config object has been initialized.
+
+ .. versionadded:: 1.8
+
+.. 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
+ environment, that is, if the source file is removed or before it is freshly
+ read. This is for extensions that keep their own caches in attributes of the
+ environment.
+
+ For example, there is a cache of all modules on the environment. When a
+ source file has been changed, the cache's entries for the file are cleared,
+ since the module declarations could have been removed from the file.
+
+ .. versionadded:: 0.5
+
+.. event:: env-before-read-docs (app, env, docnames)
+
+ Emitted after the environment has determined the list of all added and
+ changed files and just before it reads them. It allows extension authors to
+ reorder the list of docnames (*inplace*) before processing, or add more
+ docnames that Sphinx did not consider changed (but never add any docnames
+ that are not in ``env.found_docs``).
+
+ You can also remove document names; do this with caution since it will make
+ Sphinx treat changed files as unchanged.
+
+ .. versionadded:: 1.3
+
+.. event:: source-read (app, docname, source)
+
+ Emitted when a source file has been read. The *source* argument is a list
+ whose single element is the contents of the source file. You can process the
+ contents and replace this item to implement source-level transformations.
+
+ For example, if you want to use ``$`` signs to delimit inline math, like in
+ LaTeX, you can use a regular expression to replace ``$...$`` by
+ ``:math:`...```.
+
+ .. versionadded:: 0.5
+
+.. event:: include-read (app, relative_path, parent_docname, content)
+
+ Emitted when a file has been read with the :dudir:`include` directive.
+ The *relative_path* argument is a :py:class:`~pathlib.Path` object representing
+ the relative path of the included file from the :term:`source directory`.
+ The *parent_docname* argument is the name of the document that
+ contains the :dudir:`include` directive.
+ The *source* argument is a list whose single element is
+ the contents of the included file.
+ You can process the contents and replace this item
+ to transform the included content,
+ as with the :event:`source-read` event.
+
+ .. versionadded:: 7.2.5
+
+ .. seealso:: The :dudir:`include` directive and the :event:`source-read` event.
+
+.. event:: object-description-transform (app, domain, objtype, contentnode)
+
+ Emitted when an object description directive has run. The *domain* and
+ *objtype* arguments are strings indicating object description of the object.
+ And *contentnode* is a content for the object. It can be modified in-place.
+
+ .. versionadded:: 2.4
+
+.. event:: doctree-read (app, doctree)
+
+ Emitted when a doctree has been parsed and read by the environment, and is
+ about to be pickled. The *doctree* can be modified in-place.
+
+.. event:: missing-reference (app, env, node, contnode)
+
+ Emitted when a cross-reference to an object cannot be resolved.
+ If the event handler can resolve the reference, it should return a
+ new docutils node to be inserted in the document tree in place of the node
+ *node*. Usually this node is a :class:`~nodes.reference` node containing
+ *contnode* as a child.
+ If the handler can not resolve the cross-reference,
+ it can either return ``None`` to let other handlers try,
+ or raise :class:`~sphinx.errors.NoUri` to prevent other handlers in
+ trying and suppress a warning about this cross-reference being unresolved.
+
+ :param env: The build environment (``app.builder.env``).
+ :param node: The :class:`~sphinx.addnodes.pending_xref` node to be resolved.
+ Its ``reftype``, ``reftarget``, ``modname`` and ``classname`` attributes
+ determine the type and target of the reference.
+ :param contnode: The node that carries the text and formatting inside the
+ future reference and should be a child of the returned reference node.
+
+ .. versionadded:: 0.5
+
+.. event:: warn-missing-reference (app, domain, node)
+
+ Emitted when a cross-reference to an object cannot be resolved even after
+ :event:`missing-reference`. If the event handler can emit warnings for
+ the missing reference, it should return ``True``. The configuration variables
+ :confval:`nitpick_ignore` and :confval:`nitpick_ignore_regex` prevent the
+ event from being emitted for the corresponding nodes.
+
+ .. versionadded:: 3.4
+
+.. event:: doctree-resolved (app, doctree, docname)
+
+ Emitted when a doctree has been "resolved" by the environment, that is, all
+ references have been resolved and TOCs have been inserted. The *doctree* can
+ be modified in place.
+
+ Here is the place to replace custom nodes that don't have visitor methods in
+ the writers, so that they don't cause errors when the writers encounter them.
+
+.. event:: env-merge-info (app, env, docnames, other)
+
+ This event is only emitted when parallel reading of documents is enabled. It
+ is emitted once for every subprocess that has read some documents.
+
+ You must handle this event in an extension that stores data in the
+ environment in a custom location. Otherwise the environment in the main
+ process will not be aware of the information stored in the subprocess.
+
+ *other* is the environment object from the subprocess, *env* is the
+ environment from the main process. *docnames* is a set of document names
+ that have been read in the subprocess.
+
+ .. versionadded:: 1.3
+
+.. event:: env-updated (app, env)
+
+ Emitted after reading all documents, when the environment and all
+ doctrees are now up-to-date.
+
+ You can return an iterable of docnames from the handler. These documents
+ will then be considered updated, and will be (re-)written during the writing
+ phase.
+
+ .. versionadded:: 0.5
+
+ .. versionchanged:: 1.3
+ The handlers' return value is now used.
+
+.. event:: env-check-consistency (app, env)
+
+ Emitted when Consistency checks phase. You can check consistency of
+ metadata for whole of documents.
+
+ .. versionadded:: 1.6
+
+ As a **experimental** event
+
+.. event:: html-collect-pages (app)
+
+ Emitted when the HTML builder is starting to write non-document pages. You
+ can add pages to write by returning an iterable from this event consisting of
+ ``(pagename, context, templatename)``.
+
+ .. versionadded:: 1.0
+
+.. event:: html-page-context (app, pagename, templatename, context, doctree)
+
+ Emitted when the HTML builder has created a context dictionary to render a
+ template with -- this can be used to add custom elements to the context.
+
+ The *pagename* argument is the canonical name of the page being rendered,
+ that is, without ``.html`` suffix and using slashes as path separators. The
+ *templatename* is the name of the template to render, this will be
+ ``'page.html'`` for all pages from reST documents.
+
+ The *context* argument is a dictionary of values that are given to the
+ template engine to render the page and can be modified to include custom
+ values. Keys must be strings.
+
+ The *doctree* argument will be a doctree when the page is created from a reST
+ documents; it will be ``None`` when the page is created from an HTML template
+ alone.
+
+ You can return a string from the handler, it will then replace
+ ``'page.html'`` as the HTML template for this page.
+
+ .. note:: You can install JS/CSS files for the specific page via
+ :meth:`Sphinx.add_js_file` and :meth:`Sphinx.add_css_file` since
+ v3.5.0.
+
+ .. versionadded:: 0.4
+
+ .. versionchanged:: 1.3
+ The return value can now specify a template name.
+
+.. event:: linkcheck-process-uri (app, uri)
+
+ Emitted when the linkcheck builder collects hyperlinks from document. *uri*
+ is a collected URI. The event handlers can modify the URI by returning a
+ string.
+
+ .. versionadded:: 4.1
+
+.. event:: build-finished (app, exception)
+
+ Emitted when a build has finished, before Sphinx exits, usually used for
+ cleanup. This event is emitted even when the build process raised an
+ exception, given as the *exception* argument. The exception is reraised in
+ the application after the event handlers have run. If the build process
+ raised no exception, *exception* will be ``None``. This allows to customize
+ cleanup actions depending on the exception status.
+
+ .. versionadded:: 0.5
+
+
+Checking the Sphinx version
+---------------------------
+
+.. currentmodule:: sphinx
+
+Use this to adapt your extension to API changes in Sphinx.
+
+.. autodata:: version_info
+
+
+The Config object
+-----------------
+
+.. currentmodule:: sphinx.config
+
+.. autoclass:: Config
+
+
+.. _template-bridge:
+
+The template bridge
+-------------------
+
+.. currentmodule:: sphinx.application
+
+.. autoclass:: TemplateBridge
+ :members:
+
+
+.. _exceptions:
+
+Exceptions
+----------
+
+.. module:: sphinx.errors
+
+.. autoexception:: SphinxError
+
+.. autoexception:: ConfigError
+
+.. autoexception:: ExtensionError
+
+.. autoexception:: ThemeError
+
+.. autoexception:: VersionRequirementError
diff --git a/doc/extdev/builderapi.rst b/doc/extdev/builderapi.rst
new file mode 100644
index 0000000..5c5a525
--- /dev/null
+++ b/doc/extdev/builderapi.rst
@@ -0,0 +1,46 @@
+.. _writing-builders:
+
+Builder API
+===========
+
+.. todo:: Expand this.
+
+.. currentmodule:: sphinx.builders
+
+.. class:: Builder
+
+ This is the base class for all builders.
+
+ These attributes should be set on builder classes:
+
+ .. autoattribute:: name
+ .. autoattribute:: format
+ .. autoattribute:: epilog
+ .. autoattribute:: allow_parallel
+ .. autoattribute:: supported_image_types
+ .. autoattribute:: supported_remote_images
+ .. autoattribute:: supported_data_uri_images
+ .. autoattribute:: default_translator_class
+
+ These methods are predefined and will be called from the application:
+
+ .. automethod:: get_relative_uri
+ .. automethod:: build_all
+ .. automethod:: build_specific
+ .. automethod:: build_update
+ .. automethod:: build
+
+ These methods can be overridden in concrete builder classes:
+
+ .. automethod:: init
+ .. automethod:: get_outdated_docs
+ .. automethod:: get_target_uri
+ .. automethod:: prepare_writing
+ .. automethod:: write_doc
+ .. automethod:: finish
+
+ **Attributes**
+
+ .. attribute:: events
+
+ An :class:`.EventManager` object.
diff --git a/doc/extdev/collectorapi.rst b/doc/extdev/collectorapi.rst
new file mode 100644
index 0000000..cb4c30b
--- /dev/null
+++ b/doc/extdev/collectorapi.rst
@@ -0,0 +1,9 @@
+.. _collector-api:
+
+Environment Collector API
+-------------------------
+
+.. module:: sphinx.environment.collectors
+
+.. autoclass:: EnvironmentCollector
+ :members:
diff --git a/doc/extdev/deprecated.rst b/doc/extdev/deprecated.rst
new file mode 100644
index 0000000..f90389c
--- /dev/null
+++ b/doc/extdev/deprecated.rst
@@ -0,0 +1,1911 @@
+.. _dev-deprecated-apis:
+
+Deprecated APIs
+===============
+
+On developing Sphinx, we are always careful to the compatibility of our APIs.
+But, sometimes, the change of interface are needed for some reasons. In such
+cases, we've marked them as deprecated. And they are kept during the two
+major versions (for more details, please see :ref:`deprecation-policy`).
+
+The following is a list of deprecated interfaces.
+
+.. tabularcolumns:: >{\raggedright}\Y{.4}>{\centering}\Y{.1}>{\sphinxcolorblend{!95!red}\centering\noindent\bfseries\color{red}}\Y{.12}>{\raggedright\arraybackslash}\Y{.38}
+
+.. list-table:: deprecated APIs
+ :header-rows: 1
+ :class: deprecated
+ :widths: 40, 10, 10, 40
+
+ * - Target
+ - Deprecated
+ - Removed
+ - Alternatives
+
+ * - ``sphinx.ext.autodoc.preserve_defaults.get_function_def()``
+ - 7.2
+ - 9.0
+ - N/A (replacement is private)
+
+ * - ``sphinx.builders.html.StandaloneHTMLBuilder.css_files``
+ - 7.2
+ - 9.0
+ - N/A
+
+ * - ``sphinx.builders.html.StandaloneHTMLBuilder.script_files``
+ - 7.2
+ - 9.0
+ - N/A
+
+ * - ``sphinx.builders.html.Stylesheet``
+ - 7.2
+ - 9.0
+ - ``sphinx.application.Sphinx.add_css_file()``
+
+ * - ``sphinx.builders.html.JavaScript``
+ - 7.2
+ - 9.0
+ - ``sphinx.application.Sphinx.add_js_file()``
+
+ * - ``sphinx.util.split_into``
+ - 7.2
+ - 9.0
+ - N/A
+
+ * - ``sphinx.util.split_index_msg``
+ - 7.2
+ - 9.0
+ - ``sphinx.util.index_entries.split_index_msg``
+
+ * - ``sphinx.testing.path``
+ - 7.2
+ - 9.0
+ - ``os.path`` or ``pathlib``
+
+ * - ``sphinx.util.md5``
+ - 7.2
+ - 9.0
+ - ``hashlib.md5``
+
+ * - ``sphinx.util.sha1``
+ - 7.2
+ - 9.0
+ - ``hashlib.sha1``
+
+ * - ``sphinx.util.osutil.cd``
+ - 6.2
+ - 8.0
+ - ``contextlib.chdir``
+
+ * - ``sphinx.util.save_traceback``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.exceptions.save_traceback``
+
+ * - ``sphinx.util.format_exception_cut_frames``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.exceptions.format_exception_cut_frames``
+
+ * - ``sphinx.util.epoch_to_rfc1123``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.http_date.epoch_to_rfc1123``
+
+ * - ``sphinx.util.rfc1123_to_epoch``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.http_date.rfc1123_to_epoch``
+
+ * - ``sphinx.util.status_iterator``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.display.status_iterator``
+
+ * - ``sphinx.util.display_chunk``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.display.display_chunk``
+
+ * - ``sphinx.util.SkipProgressMessage``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.display.SkipProgressMessage``
+
+ * - ``sphinx.util.progress_message``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.display.progress_message``
+
+ * - ``sphinx.util.typing.stringify``
+ - 6.1
+ - 8.0
+ - ``sphinx.util.typing.stringify_annotation``
+
+ * - HTML 4 support
+ - 5.2
+ - 7.0
+ - N/A
+
+ * - ``sphinx.util.path_stabilize``
+ - 5.1
+ - 7.0
+ - ``sphinx.util.osutil.path_stabilize``
+
+ * - ``sphinx.util.get_matching_files``
+ - 5.1
+ - 7.0
+ - ``sphinx.util.matching.get_matching_files``
+
+ * - ``sphinx.ext.napoleon.iterators``
+ - 5.1
+ - 7.0
+ - ``pockets.iterators``
+
+ * - ``sphinx.util.stemmer``
+ - 5.1
+ - 7.0
+ - ``snowballstemmer``
+
+ * - ``sphinx.util.jsdump``
+ - 5.0
+ - 7.0
+ - The standard library ``json`` module.
+
+ * - The Setuptools integration (``setup.py build_sphinx``)
+ - 5.0
+ - 7.0
+ - N/A
+
+ * - The ``locale`` argument of ``sphinx.util.i18n:babel_format_date()``
+ - 5.0
+ - 7.0
+ - N/A
+
+ * - The ``language`` argument of ``sphinx.util.i18n:format_date()``
+ - 5.0
+ - 7.0
+ - N/A
+
+ * - ``sphinx.builders.html.html5_ready``
+ - 5.0
+ - 7.0
+ - N/A
+
+ * - ``sphinx.io.read_doc()``
+ - 5.0
+ - 7.0
+ - ``sphinx.builders.Builder.read_doc()``
+
+ * - ``sphinx.util.docutils.__version_info__``
+ - 5.0
+ - 7.0
+ - ``docutils.__version_info__``
+
+ * - ``sphinx.util.docutils.is_html5_writer_available()``
+ - 5.0
+ - 7.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXWriter.docclasses``
+ - 5.0
+ - 7.0
+ - N/A
+
+ * - ``sphinx.ext.napoleon.docstring.GoogleDocstring._qualify_name()``
+ - 4.5
+ - 6.0
+ - N/A
+
+ * - ``sphinx.ext.autodoc.AttributeDocumenter._datadescriptor``
+ - 4.3
+ - 6.0
+ - N/A
+
+ * - ``sphinx.writers.html.HTMLTranslator._fieldlist_row_index``
+ - 4.3
+ - 6.0
+ - ``sphinx.writers.html.HTMLTranslator._fieldlist_row_indices``
+
+ * - ``sphinx.writers.html.HTMLTranslator._table_row_index``
+ - 4.3
+ - 6.0
+ - ``sphinx.writers.html.HTMLTranslator._table_row_indices``
+
+ * - ``sphinx.writers.html5.HTML5Translator._fieldlist_row_index``
+ - 4.3
+ - 6.0
+ - ``sphinx.writers.html5.HTML5Translator._fieldlist_row_indices``
+
+ * - ``sphinx.writers.html5.HTML5Translator._table_row_index``
+ - 4.3
+ - 6.0
+ - ``sphinx.writers.html5.HTML5Translator._table_row_indices``
+
+ * - The optional argument ``app`` for ``sphinx.environment.BuildEnvironment``
+ - 4.1
+ - 6.0
+ - The required argument
+
+ * - ``sphinx.application.Sphinx.html_theme``
+ - 4.1
+ - 6.0
+ - ``sphinx.registry.SphinxComponentRegistry.html_themes``
+
+ * - ``sphinx.ext.autosummary._app``
+ - 4.1
+ - 6.0
+ - N/A
+
+ * - ``sphinx.util.docstrings.extract_metadata()``
+ - 4.1
+ - 6.0
+ - ``sphinx.util.docstrings.separate_metadata()``
+
+ * - ``favicon`` variable in HTML templates
+ - 4.0
+ - 6.0
+ - ``favicon_url``
+
+ * - ``logo`` variable in HTML templates
+ - 4.0
+ - 6.0
+ - ``logo_url``
+
+ * - ``sphinx.directives.patches.ListTable``
+ - 4.0
+ - 6.0
+ - ``docutils.parsers.rst.directives.tables.ListSVTable``
+
+ * - ``sphinx.directives.patches.RSTTable``
+ - 4.0
+ - 6.0
+ - ``docutils.parsers.rst.directives.tables.RSTTable``
+
+ * - ``sphinx.ext.autodoc.directive.DocumenterBridge.filename_set``
+ - 4.0
+ - 6.0
+ - ``sphinx.ext.autodoc.directive.DocumenterBridge.record_dependencies``
+
+ * - ``sphinx.ext.autodoc.directive.DocumenterBridge.warn()``
+ - 4.0
+ - 6.0
+ - :ref:`logging-api`
+
+ * - ``sphinx.registry.SphinxComponentRegistry.get_source_input()``
+ - 4.0
+ - 6.0
+ - N/A
+
+ * - ``sphinx.registry.SphinxComponentRegistry.source_inputs``
+ - 4.0
+ - 6.0
+ - N/A
+
+ * - ``sphinx.transforms.FigureAligner``
+ - 4.0
+ - 6.0
+ - N/A
+
+ * - ``sphinx.util.pycompat.convert_with_2to3()``
+ - 4.0
+ - 6.0
+ - N/A
+
+ * - ``sphinx.util.pycompat.execfile_()``
+ - 4.0
+ - 6.0
+ - N/A
+
+ * - ``sphinx.util.smartypants``
+ - 4.0
+ - 6.0
+ - ``docutils.utils.smartquotes``
+
+ * - ``sphinx.util.typing.DirectiveOption``
+ - 4.0
+ - 6.0
+ - N/A
+
+ * - pending_xref node for viewcode extension
+ - 3.5
+ - 5.0
+ - ``sphinx.ext.viewcode.viewcode_anchor``
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.anchors_ignore``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.auth``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.broken``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.good``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.redirected``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.rqueue``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.to_ignore``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.workers``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.CheckExternalLinksBuilder.wqueue``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.linkcheck.node_line_or_0()``
+ - 3.5
+ - 5.0
+ - ``sphinx.util.nodes.get_node_line()``
+
+ * - ``sphinx.ext.autodoc.AttributeDocumenter.isinstanceattribute()``
+ - 3.5
+ - 5.0
+ - N/A
+
+ * - ``sphinx.ext.autodoc.importer.get_module_members()``
+ - 3.5
+ - 5.0
+ - ``sphinx.ext.autodoc.ModuleDocumenter.get_module_members()``
+
+ * - ``sphinx.ext.autosummary.generate._simple_info()``
+ - 3.5
+ - 5.0
+ - :ref:`logging-api`
+
+ * - ``sphinx.ext.autosummary.generate._simple_warn()``
+ - 3.5
+ - 5.0
+ - :ref:`logging-api`
+
+ * - ``sphinx.writers.html.HTMLTranslator.permalink_text``
+ - 3.5
+ - 5.0
+ - :confval:`html_permalinks_icon`
+
+ * - ``sphinx.writers.html5.HTML5Translator.permalink_text``
+ - 3.5
+ - 5.0
+ - :confval:`html_permalinks_icon`
+
+ * - The ``follow_wrapped`` argument of ``sphinx.util.inspect.signature()``
+ - 3.4
+ - 5.0
+ - N/A
+
+ * - The ``no_docstring`` argument of
+ ``sphinx.ext.autodoc.Documenter.add_content()``
+ - 3.4
+ - 5.0
+ - ``sphinx.ext.autodoc.Documenter.get_doc()``
+
+ * - ``sphinx.ext.autodoc.Documenter.get_object_members()``
+ - 3.4
+ - 6.0
+ - ``sphinx.ext.autodoc.ClassDocumenter.get_object_members()``
+
+ * - ``sphinx.ext.autodoc.DataDeclarationDocumenter``
+ - 3.4
+ - 5.0
+ - ``sphinx.ext.autodoc.DataDocumenter``
+
+ * - ``sphinx.ext.autodoc.GenericAliasDocumenter``
+ - 3.4
+ - 5.0
+ - ``sphinx.ext.autodoc.DataDocumenter``
+
+ * - ``sphinx.ext.autodoc.InstanceAttributeDocumenter``
+ - 3.4
+ - 5.0
+ - ``sphinx.ext.autodoc.AttributeDocumenter``
+
+ * - ``sphinx.ext.autodoc.SlotsAttributeDocumenter``
+ - 3.4
+ - 5.0
+ - ``sphinx.ext.autodoc.AttributeDocumenter``
+
+ * - ``sphinx.ext.autodoc.TypeVarDocumenter``
+ - 3.4
+ - 5.0
+ - ``sphinx.ext.autodoc.DataDocumenter``
+
+ * - ``sphinx.ext.autodoc.directive.DocumenterBridge.reporter``
+ - 3.5
+ - 5.0
+ - ``sphinx.util.logging``
+
+ * - ``sphinx.ext.autodoc.importer._getannotations()``
+ - 3.4
+ - 4.0
+ - ``sphinx.util.inspect.getannotations()``
+
+ * - ``sphinx.ext.autodoc.importer._getmro()``
+ - 3.4
+ - 4.0
+ - ``sphinx.util.inspect.getmro()``
+
+ * - ``sphinx.pycode.ModuleAnalyzer.parse()``
+ - 3.4
+ - 5.0
+ - ``sphinx.pycode.ModuleAnalyzer.analyze()``
+
+ * - ``sphinx.util.osutil.movefile()``
+ - 3.4
+ - 5.0
+ - ``os.replace()``
+
+ * - ``sphinx.util.requests.is_ssl_error()``
+ - 3.4
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.latex.LaTeXBuilder.usepackages``
+ - 3.3
+ - 5.0
+ - N/A
+
+ * - ``sphinx.builders.latex.LaTeXBuilder.usepackages_afger_hyperref``
+ - 3.3
+ - 5.0
+ - N/A
+
+ * - ``sphinx.ext.autodoc.SingledispatchFunctionDocumenter``
+ - 3.3
+ - 5.0
+ - ``sphinx.ext.autodoc.FunctionDocumenter``
+
+ * - ``sphinx.ext.autodoc.SingledispatchMethodDocumenter``
+ - 3.3
+ - 5.0
+ - ``sphinx.ext.autodoc.MethodDocumenter``
+
+ * - ``sphinx.ext.autodoc.members_set_option()``
+ - 3.2
+ - 5.0
+ - N/A
+
+ * - ``sphinx.ext.autodoc.merge_special_members_option()``
+ - 3.2
+ - 5.0
+ - ``sphinx.ext.autodoc.merge_members_option()``
+
+ * - ``sphinx.writers.texinfo.TexinfoWriter.desc``
+ - 3.2
+ - 5.0
+ - ``sphinx.writers.texinfo.TexinfoWriter.descs``
+
+ * - The first argument for
+ ``sphinx.ext.autosummary.generate.AutosummaryRenderer`` has been changed
+ to Sphinx object
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - ``sphinx.ext.autosummary.generate.AutosummaryRenderer`` takes an object
+ type as an argument
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - The ``ignore`` argument of ``sphinx.ext.autodoc.Documenter.get_doc()``
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - The ``template_dir`` argument of
+ ``sphinx.ext.autosummary.generate.AutosummaryRenderer``
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - The ``module`` argument of
+ ``sphinx.ext.autosummary.generate.find_autosummary_in_docstring()``
+ - 3.0
+ - 5.0
+ - N/A
+
+ * - The ``builder`` argument of
+ ``sphinx.ext.autosummary.generate.generate_autosummary_docs()``
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - The ``template_dir`` argument of
+ ``sphinx.ext.autosummary.generate.generate_autosummary_docs()``
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - ``sphinx.ext.autosummary.generate.AutosummaryRenderer.exists()``
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - The ``ignore`` argument of ``sphinx.util.docstring.prepare_docstring()``
+ - 3.1
+ - 5.0
+ - N/A
+
+ * - ``sphinx.util.rpartition()``
+ - 3.1
+ - 5.0
+ - ``str.rpartition()``
+
+ * - ``desc_signature['first']``
+ -
+ - 3.0
+ - N/A
+
+ * - ``sphinx.directives.DescDirective``
+ - 3.0
+ - 5.0
+ - ``sphinx.directives.ObjectDescription``
+
+ * - ``sphinx.domains.std.StandardDomain.add_object()``
+ - 3.0
+ - 5.0
+ - ``sphinx.domains.std.StandardDomain.note_object()``
+
+ * - ``sphinx.domains.python.PyDecoratorMixin``
+ - 3.0
+ - 5.0
+ - N/A
+
+ * - ``sphinx.ext.autodoc.get_documenters()``
+ - 3.0
+ - 5.0
+ - ``sphinx.registry.documenters``
+
+ * - ``sphinx.ext.autosummary.process_autosummary_toc()``
+ - 3.0
+ - 5.0
+ - N/A
+
+ * - ``sphinx.parsers.Parser.app``
+ - 3.0
+ - 5.0
+ - N/A
+
+ * - ``sphinx.testing.path.Path.text()``
+ - 3.0
+ - 5.0
+ - ``sphinx.testing.path.Path.read_text()``
+
+ * - ``sphinx.testing.path.Path.bytes()``
+ - 3.0
+ - 5.0
+ - ``sphinx.testing.path.Path.read_bytes()``
+
+ * - ``sphinx.util.inspect.getargspec()``
+ - 3.0
+ - 5.0
+ - ``inspect.getargspec()``
+
+ * - ``sphinx.writers.latex.LaTeXWriter.format_docclass()``
+ - 3.0
+ - 5.0
+ - LaTeX Themes
+
+ * - ``decode`` argument of ``sphinx.pycode.ModuleAnalyzer()``
+ - 2.4
+ - 4.0
+ - N/A
+
+ * - ``sphinx.directives.other.Index``
+ - 2.4
+ - 4.0
+ - ``sphinx.domains.index.IndexDirective``
+
+ * - ``sphinx.environment.temp_data['gloss_entries']``
+ - 2.4
+ - 4.0
+ - ``documents.nameids``
+
+ * - ``sphinx.environment.BuildEnvironment.indexentries``
+ - 2.4
+ - 4.0
+ - ``sphinx.domains.index.IndexDomain``
+
+ * - ``sphinx.environment.collectors.indexentries.IndexEntriesCollector``
+ - 2.4
+ - 4.0
+ - ``sphinx.domains.index.IndexDomain``
+
+ * - ``sphinx.io.FiletypeNotFoundError``
+ - 2.4
+ - 4.0
+ - ``sphinx.errors.FiletypeNotFoundError``
+
+ * - ``sphinx.ext.apidoc.INITPY``
+ - 2.4
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.apidoc.shall_skip()``
+ - 2.4
+ - 4.0
+ - ``sphinx.ext.apidoc.is_skipped_package``
+
+ * - ``sphinx.io.get_filetype()``
+ - 2.4
+ - 4.0
+ - ``sphinx.util.get_filetype()``
+
+ * - ``sphinx.pycode.ModuleAnalyzer.encoding``
+ - 2.4
+ - 4.0
+ - N/A
+
+ * - ``sphinx.roles.Index``
+ - 2.4
+ - 4.0
+ - ``sphinx.domains.index.IndexRole``
+
+ * - ``sphinx.util.detect_encoding()``
+ - 2.4
+ - 4.0
+ - ``tokenize.detect_encoding()``
+
+ * - ``sphinx.util.get_module_source()``
+ - 2.4
+ - 4.0
+ - N/A
+
+ * - ``sphinx.util.inspect.Signature``
+ - 2.4
+ - 4.0
+ - ``sphinx.util.inspect.signature`` and
+ ``sphinx.util.inspect.stringify_signature()``
+
+ * - ``sphinx.util.inspect.safe_getmembers()``
+ - 2.4
+ - 4.0
+ - ``inspect.getmembers()``
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.settings.author``
+ - 2.4
+ - 4.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.settings.contentsname``
+ - 2.4
+ - 4.0
+ - ``document['contentsname']``
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.settings.docclass``
+ - 2.4
+ - 4.0
+ - ``document['docclass']``
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.settings.docname``
+ - 2.4
+ - 4.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.settings.title``
+ - 2.4
+ - 4.0
+ - N/A
+
+ * - ``sphinx.writers.latex.ADDITIONAL_SETTINGS``
+ - 2.4
+ - 4.0
+ - ``sphinx.builders.latex.constants.ADDITIONAL_SETTINGS``
+
+ * - ``sphinx.writers.latex.DEFAULT_SETTINGS``
+ - 2.4
+ - 4.0
+ - ``sphinx.builders.latex.constants.DEFAULT_SETTINGS``
+
+ * - ``sphinx.writers.latex.LUALATEX_DEFAULT_FONTPKG``
+ - 2.4
+ - 4.0
+ - ``sphinx.builders.latex.constants.LUALATEX_DEFAULT_FONTPKG``
+
+ * - ``sphinx.writers.latex.PDFLATEX_DEFAULT_FONTPKG``
+ - 2.4
+ - 4.0
+ - ``sphinx.builders.latex.constants.PDFLATEX_DEFAULT_FONTPKG``
+
+ * - ``sphinx.writers.latex.XELATEX_DEFAULT_FONTPKG``
+ - 2.4
+ - 4.0
+ - ``sphinx.builders.latex.constants.XELATEX_DEFAULT_FONTPKG``
+
+ * - ``sphinx.writers.latex.XELATEX_GREEK_DEFAULT_FONTPKG``
+ - 2.4
+ - 4.0
+ - ``sphinx.builders.latex.constants.XELATEX_GREEK_DEFAULT_FONTPKG``
+
+ * - ``sphinx.builders.gettext.POHEADER``
+ - 2.3
+ - 4.0
+ - ``sphinx/templates/gettext/message.pot_t`` (template file)
+
+ * - ``sphinx.io.SphinxStandaloneReader.app``
+ - 2.3
+ - 4.0
+ - ``sphinx.io.SphinxStandaloneReader.setup()``
+
+ * - ``sphinx.io.SphinxStandaloneReader.env``
+ - 2.3
+ - 4.0
+ - ``sphinx.io.SphinxStandaloneReader.setup()``
+
+ * - ``sphinx.util.texescape.tex_escape_map``
+ - 2.3
+ - 4.0
+ - ``sphinx.util.texescape.escape()``
+
+ * - ``sphinx.util.texescape.tex_hl_escape_map_new``
+ - 2.3
+ - 4.0
+ - ``sphinx.util.texescape.hlescape()``
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.no_contractions``
+ - 2.3
+ - 4.0
+ - N/A
+
+ * - ``sphinx.domains.math.MathDomain.add_equation()``
+ - 2.2
+ - 4.0
+ - ``sphinx.domains.math.MathDomain.note_equation()``
+
+ * - ``sphinx.domains.math.MathDomain.get_next_equation_number()``
+ - 2.2
+ - 4.0
+ - ``sphinx.domains.math.MathDomain.note_equation()``
+
+ * - The ``info`` and ``warn`` arguments of
+ ``sphinx.ext.autosummary.generate.generate_autosummary_docs()``
+ - 2.2
+ - 4.0
+ - ``logging.info()`` and ``logging.warning()``
+
+ * - ``sphinx.ext.autosummary.generate._simple_info()``
+ - 2.2
+ - 4.0
+ - ``logging.info()``
+
+ * - ``sphinx.ext.autosummary.generate._simple_warn()``
+ - 2.2
+ - 4.0
+ - ``logging.warning()``
+
+ * - ``sphinx.ext.todo.merge_info()``
+ - 2.2
+ - 4.0
+ - ``sphinx.ext.todo.TodoDomain``
+
+ * - ``sphinx.ext.todo.process_todo_nodes()``
+ - 2.2
+ - 4.0
+ - ``sphinx.ext.todo.TodoDomain``
+
+ * - ``sphinx.ext.todo.process_todos()``
+ - 2.2
+ - 4.0
+ - ``sphinx.ext.todo.TodoDomain``
+
+ * - ``sphinx.ext.todo.purge_todos()``
+ - 2.2
+ - 4.0
+ - ``sphinx.ext.todo.TodoDomain``
+
+ * - ``sphinx.builders.latex.LaTeXBuilder.apply_transforms()``
+ - 2.1
+ - 4.0
+ - N/A
+
+ * - ``sphinx.builders._epub_base.EpubBuilder.esc()``
+ - 2.1
+ - 4.0
+ - ``html.escape()``
+
+ * - ``sphinx.directives.Acks``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.Acks``
+
+ * - ``sphinx.directives.Author``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.Author``
+
+ * - ``sphinx.directives.Centered``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.Centered``
+
+ * - ``sphinx.directives.Class``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.Class``
+
+ * - ``sphinx.directives.CodeBlock``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.code.CodeBlock``
+
+ * - ``sphinx.directives.Figure``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.patches.Figure``
+
+ * - ``sphinx.directives.HList``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.HList``
+
+ * - ``sphinx.directives.Highlight``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.code.Highlight``
+
+ * - ``sphinx.directives.Include``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.Include``
+
+ * - ``sphinx.directives.Index``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.Index``
+
+ * - ``sphinx.directives.LiteralInclude``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.code.LiteralInclude``
+
+ * - ``sphinx.directives.Meta``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.patches.Meta``
+
+ * - ``sphinx.directives.Only``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.Only``
+
+ * - ``sphinx.directives.SeeAlso``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.SeeAlso``
+
+ * - ``sphinx.directives.TabularColumns``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.TabularColumns``
+
+ * - ``sphinx.directives.TocTree``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.TocTree``
+
+ * - ``sphinx.directives.VersionChange``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.other.VersionChange``
+
+ * - ``sphinx.domains.python.PyClassmember``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.python.PyAttribute``,
+ ``sphinx.domains.python.PyMethod``,
+ ``sphinx.domains.python.PyClassMethod``,
+ ``sphinx.domains.python.PyObject`` and
+ ``sphinx.domains.python.PyStaticMethod``
+
+ * - ``sphinx.domains.python.PyModulelevel``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.python.PyFunction``,
+ ``sphinx.domains.python.PyObject`` and
+ ``sphinx.domains.python.PyVariable``
+
+ * - ``sphinx.domains.std.StandardDomain._resolve_citation_xref()``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.citation.CitationDomain.resolve_xref()``
+
+ * - ``sphinx.domains.std.StandardDomain.note_citations()``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.citation.CitationDomain.note_citation()``
+
+ * - ``sphinx.domains.std.StandardDomain.note_citation_refs()``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.citation.CitationDomain.note_citation_reference()``
+
+ * - ``sphinx.domains.std.StandardDomain.note_labels()``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.std.StandardDomain.process_doc()``
+
+ * - ``sphinx.domains.js.JSObject.display_prefix``
+ -
+ - 4.3
+ - ``sphinx.domains.js.JSObject.get_display_prefix()``
+
+ * - ``sphinx.environment.NoUri``
+ - 2.1
+ - 3.0
+ - ``sphinx.errors.NoUri``
+
+ * - ``sphinx.ext.apidoc.format_directive()``
+ - 2.1
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.apidoc.format_heading()``
+ - 2.1
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.apidoc.makename()``
+ - 2.1
+ - 4.0
+ - ``sphinx.ext.apidoc.module_join()``
+
+ * - ``sphinx.ext.autodoc.importer.MockFinder``
+ - 2.1
+ - 4.0
+ - ``sphinx.ext.autodoc.mock.MockFinder``
+
+ * - ``sphinx.ext.autodoc.importer.MockLoader``
+ - 2.1
+ - 4.0
+ - ``sphinx.ext.autodoc.mock.MockLoader``
+
+ * - ``sphinx.ext.autodoc.importer.mock()``
+ - 2.1
+ - 4.0
+ - ``sphinx.ext.autodoc.mock.mock()``
+
+ * - ``sphinx.ext.autosummary.autolink_role()``
+ - 2.1
+ - 4.0
+ - ``sphinx.ext.autosummary.AutoLink``
+
+ * - ``sphinx.ext.imgmath.DOC_BODY``
+ - 2.1
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.imgmath.DOC_BODY_PREVIEW``
+ - 2.1
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.imgmath.DOC_HEAD``
+ - 2.1
+ - 4.0
+ - N/A
+
+ * - ``sphinx.transforms.CitationReferences``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.citation.CitationReferenceTransform``
+
+ * - ``sphinx.transforms.SmartQuotesSkipper``
+ - 2.1
+ - 4.0
+ - ``sphinx.domains.citation.CitationDefinitionTransform``
+
+ * - ``sphinx.util.docfields.DocFieldTransformer.preprocess_fieldtypes()``
+ - 2.1
+ - 4.0
+ - ``sphinx.directives.ObjectDescription.get_field_type_map()``
+
+ * - ``sphinx.util.node.find_source_node()``
+ - 2.1
+ - 4.0
+ - ``sphinx.util.node.get_node_source()``
+
+ * - ``sphinx.util.i18n.find_catalog()``
+ - 2.1
+ - 4.0
+ - ``sphinx.util.i18n.docname_to_domain()``
+
+ * - ``sphinx.util.i18n.find_catalog_files()``
+ - 2.1
+ - 4.0
+ - ``sphinx.util.i18n.CatalogRepository``
+
+ * - ``sphinx.util.i18n.find_catalog_source_files()``
+ - 2.1
+ - 4.0
+ - ``sphinx.util.i18n.CatalogRepository``
+
+ * - ``encoding`` argument of ``autodoc.Documenter.get_doc()``,
+ ``autodoc.DocstringSignatureMixin.get_doc()``,
+ ``autodoc.DocstringSignatureMixin._find_signature()``, and
+ ``autodoc.ClassDocumenter.get_doc()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - arguments of ``EpubBuilder.build_mimetype()``,
+ ``EpubBuilder.build_container()``, ``EpubBuilder.build_content()``,
+ ``EpubBuilder.build_toc()`` and ``EpubBuilder.build_epub()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - arguments of ``Epub3Builder.build_navigation_doc()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``nodetype`` argument of
+ ``sphinx.search.WordCollector.is_meta_keywords()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``suffix`` argument of ``BuildEnvironment.doc2path()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - string style ``base`` argument of ``BuildEnvironment.doc2path()``
+ - 2.0
+ - 4.0
+ - ``os.path.join()``
+
+ * - ``sphinx.addnodes.abbreviation``
+ - 2.0
+ - 4.0
+ - ``docutils.nodes.abbreviation``
+
+ * - ``sphinx.builders.applehelp``
+ - 2.0
+ - 4.0
+ - ``sphinxcontrib.applehelp``
+
+ * - ``sphinx.builders.devhelp``
+ - 2.0
+ - 4.0
+ - ``sphinxcontrib.devhelp``
+
+ * - ``sphinx.builders.epub3.Epub3Builder.validate_config_value()``
+ - 2.0
+ - 4.0
+ - ``sphinx.builders.epub3.validate_config_values()``
+
+ * - ``sphinx.builders.html.JSONHTMLBuilder``
+ - 2.0
+ - 4.0
+ - ``sphinx.builders.serializinghtml.JSONHTMLBuilder``
+
+ * - ``sphinx.builders.html.PickleHTMLBuilder``
+ - 2.0
+ - 4.0
+ - ``sphinx.builders.serializinghtml.PickleHTMLBuilder``
+
+ * - ``sphinx.builders.html.SerializingHTMLBuilder``
+ - 2.0
+ - 4.0
+ - ``sphinx.builders.serializinghtml.SerializingHTMLBuilder``
+
+ * - ``sphinx.builders.html.SingleFileHTMLBuilder``
+ - 2.0
+ - 4.0
+ - ``sphinx.builders.singlehtml.SingleFileHTMLBuilder``
+
+ * - ``sphinx.builders.html.WebHTMLBuilder``
+ - 2.0
+ - 4.0
+ - ``sphinx.builders.serializinghtml.PickleHTMLBuilder``
+
+ * - ``sphinx.builders.htmlhelp``
+ - 2.0
+ - 4.0
+ - ``sphinxcontrib.htmlhelp``
+
+ * - ``sphinx.builders.htmlhelp.HTMLHelpBuilder.open_file()``
+ - 2.0
+ - 4.0
+ - ``open()``
+
+ * - ``sphinx.builders.qthelp``
+ - 2.0
+ - 4.0
+ - ``sphinxcontrib.qthelp``
+
+ * - ``sphinx.cmd.quickstart.term_decode()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.cmd.quickstart.TERM_ENCODING``
+ - 2.0
+ - 4.0
+ - ``sys.stdin.encoding``
+
+ * - ``sphinx.config.check_unicode()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.config.string_classes``
+ - 2.0
+ - 4.0
+ - ``[str]``
+
+ * - ``sphinx.domains.cpp.DefinitionError.description``
+ - 2.0
+ - 4.0
+ - ``str(exc)``
+
+ * - ``sphinx.domains.cpp.NoOldIdError.description``
+ - 2.0
+ - 4.0
+ - ``str(exc)``
+
+ * - ``sphinx.domains.cpp.UnsupportedMultiCharacterCharLiteral.decoded``
+ - 2.0
+ - 4.0
+ - ``str(exc)``
+
+ * - ``sphinx.ext.autosummary.Autosummary.warn()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.autosummary.Autosummary.genopt``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.autosummary.Autosummary.warnings``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.autosummary.Autosummary.result``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.doctest.doctest_encode()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.ext.jsmath``
+ - 2.0
+ - 4.0
+ - ``sphinxcontrib.jsmath``
+
+ * - ``sphinx.roles.abbr_role()``
+ - 2.0
+ - 4.0
+ - ``sphinx.roles.Abbreviation``
+
+ * - ``sphinx.roles.emph_literal_role()``
+ - 2.0
+ - 4.0
+ - ``sphinx.roles.EmphasizedLiteral``
+
+ * - ``sphinx.roles.menusel_role()``
+ - 2.0
+ - 4.0
+ - ``sphinx.roles.GUILabel`` or ``sphinx.roles.MenuSelection``
+
+ * - ``sphinx.roles.index_role()``
+ - 2.0
+ - 4.0
+ - ``sphinx.roles.Index``
+
+ * - ``sphinx.roles.indexmarkup_role()``
+ - 2.0
+ - 4.0
+ - ``sphinx.roles.PEP`` or ``sphinx.roles.RFC``
+
+ * - ``sphinx.testing.util.remove_unicode_literal()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.util.attrdict``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.util.force_decode()``
+ - 2.0
+ - 5.0
+ - N/A
+
+ * - ``sphinx.util.get_matching_docs()``
+ - 2.0
+ - 4.0
+ - ``sphinx.util.get_matching_files()``
+
+ * - ``sphinx.util.inspect.Parameter``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.util.jsonimpl``
+ - 2.0
+ - 4.0
+ - ``sphinxcontrib.serializinghtml.jsonimpl``
+
+ * - ``sphinx.util.osutil.EEXIST``
+ - 2.0
+ - 4.0
+ - ``errno.EEXIST`` or ``FileExistsError``
+
+ * - ``sphinx.util.osutil.EINVAL``
+ - 2.0
+ - 4.0
+ - ``errno.EINVAL``
+
+ * - ``sphinx.util.osutil.ENOENT``
+ - 2.0
+ - 4.0
+ - ``errno.ENOENT`` or ``FileNotFoundError``
+
+ * - ``sphinx.util.osutil.EPIPE``
+ - 2.0
+ - 4.0
+ - ``errno.ENOENT`` or ``BrokenPipeError``
+
+ * - ``sphinx.util.osutil.walk()``
+ - 2.0
+ - 4.0
+ - ``os.walk()``
+
+ * - ``sphinx.util.pycompat.NoneType``
+ - 2.0
+ - 4.0
+ - ``sphinx.util.typing.NoneType``
+
+ * - ``sphinx.util.pycompat.TextIOWrapper``
+ - 2.0
+ - 4.0
+ - ``io.TextIOWrapper``
+
+ * - ``sphinx.util.pycompat.UnicodeMixin``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.util.pycompat.htmlescape()``
+ - 2.0
+ - 4.0
+ - ``html.escape()``
+
+ * - ``sphinx.util.pycompat.indent()``
+ - 2.0
+ - 4.0
+ - ``textwrap.indent()``
+
+ * - ``sphinx.util.pycompat.sys_encoding``
+ - 2.0
+ - 4.0
+ - ``sys.getdefaultencoding()``
+
+ * - ``sphinx.util.pycompat.terminal_safe()``
+ - 2.0
+ - 4.0
+ - ``sphinx.util.console.terminal_safe()``
+
+ * - ``sphinx.util.pycompat.u``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.util.PeekableIterator``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - Omitting the ``filename`` argument in an overriddent
+ ``IndexBuilder.feed()`` method.
+ - 2.0
+ - 4.0
+ - ``IndexBuilder.feed(docname, filename, title, doctree)``
+
+ * - ``sphinx.writers.latex.ExtBabel``
+ - 2.0
+ - 4.0
+ - ``sphinx.builders.latex.util.ExtBabel``
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.babel_defmacro()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.application.Sphinx._setting_up_extension``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - The ``importer`` argument of ``sphinx.ext.autodoc.importer._MockModule``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.ext.autodoc.importer._MockImporter``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.io.SphinxBaseFileInput``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.io.SphinxFileInput.supported``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.io.SphinxRSTFileInput``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.registry.SphinxComponentRegistry.add_source_input()``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator._make_visit_admonition()``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.collect_footnotes()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - ``sphinx.writers.texinfo.TexinfoTranslator._make_visit_admonition()``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.text.TextTranslator._make_depart_admonition()``
+ - 2.0
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.generate_numfig_format()``
+ - 2.0
+ - 4.0
+ - N/A
+
+ * - :rst:dir:`!highlightlang`
+ - 1.8
+ - 4.0
+ - :rst:dir:`highlight`
+
+ * - :meth:`!add_stylesheet`
+ - 1.8
+ - 6.0
+ - :meth:`~sphinx.application.Sphinx.add_css_file()`
+
+ * - :meth:`!add_javascript()`
+ - 1.8
+ - 4.0
+ - :meth:`~sphinx.application.Sphinx.add_js_file()`
+
+ * - :confval:`autodoc_default_flags`
+ - 1.8
+ - 4.0
+ - :confval:`autodoc_default_options`
+
+ * - ``content`` arguments of ``sphinx.util.image.guess_mimetype()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``gettext_compact`` arguments of
+ ``sphinx.util.i18n.find_catalog_source_files()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.io.SphinxI18nReader.set_lineno_for_reporter()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.io.SphinxI18nReader.line``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.directives.other.VersionChanges``
+ - 1.8
+ - 3.0
+ - ``sphinx.domains.changeset.VersionChanges``
+
+ * - ``sphinx.highlighting.PygmentsBridge.unhighlight()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``trim_doctest_flags`` arguments of
+ ``sphinx.highlighting.PygmentsBridge``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.ext.mathbase``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.ext.mathbase.MathDomain``
+ - 1.8
+ - 3.0
+ - ``sphinx.domains.math.MathDomain``
+
+ * - ``sphinx.ext.mathbase.MathDirective``
+ - 1.8
+ - 3.0
+ - ``sphinx.directives.patches.MathDirective``
+
+ * - ``sphinx.ext.mathbase.math_role()``
+ - 1.8
+ - 3.0
+ - ``docutils.parsers.rst.roles.math_role()``
+
+ * - ``sphinx.ext.mathbase.setup_math()``
+ - 1.8
+ - 3.0
+ - :meth:`~sphinx.application.Sphinx.add_html_math_renderer()`
+
+ * - ``sphinx.ext.mathbase.is_in_section_title()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.ext.mathbase.get_node_equation_number()``
+ - 1.8
+ - 3.0
+ - ``sphinx.util.math.get_node_equation_number()``
+
+ * - ``sphinx.ext.mathbase.wrap_displaymath()``
+ - 1.8
+ - 3.0
+ - ``sphinx.util.math.wrap_displaymath()``
+
+ * - ``sphinx.ext.mathbase.math`` (node)
+ - 1.8
+ - 3.0
+ - ``docutils.nodes.math``
+
+ * - ``sphinx.ext.mathbase.displaymath`` (node)
+ - 1.8
+ - 3.0
+ - ``docutils.nodes.math_block``
+
+ * - ``sphinx.ext.mathbase.eqref`` (node)
+ - 1.8
+ - 3.0
+ - ``sphinx.builders.latex.nodes.math_reference``
+
+ * - :confval:`!viewcode_import` (config value)
+ - 1.8
+ - 3.0
+ - :confval:`viewcode_follow_imported_members`
+
+ * - ``sphinx.writers.latex.Table.caption_footnotetexts``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.Table.header_footnotetexts``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.footnotestack``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.in_container_literal_block``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.next_section_ids``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.next_hyperlink_ids``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.restrict_footnote()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.unrestrict_footnote()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.push_hyperlink_ids()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.pop_hyperlink_ids()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.bibitems``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.hlsettingstack``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.ExtBabel.get_shorthandoff()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html.HTMLTranslator.highlightlang()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html.HTMLTranslator.highlightlang_base()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html.HTMLTranslator.highlightlangopts()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html.HTMLTranslator.highlightlinenothreshold()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html5.HTMLTranslator.highlightlang()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html5.HTMLTranslator.highlightlang_base()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html5.HTMLTranslator.highlightlangopts()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.html5.HTMLTranslator.highlightlinenothreshold()``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``sphinx.writers.latex.LaTeXTranslator.check_latex_elements()``
+ - 1.8
+ - 3.0
+ - Nothing
+
+ * - ``sphinx.application.CONFIG_FILENAME``
+ - 1.8
+ - 3.0
+ - ``sphinx.config.CONFIG_FILENAME``
+
+ * - ``Config.check_unicode()``
+ - 1.8
+ - 3.0
+ - ``sphinx.config.check_unicode()``
+
+ * - ``Config.check_types()``
+ - 1.8
+ - 3.0
+ - ``sphinx.config.check_confval_types()``
+
+ * - ``dirname``, ``filename`` and ``tags`` arguments of
+ ``Config.__init__()``
+ - 1.8
+ - 3.0
+ - ``Config.read()``
+
+ * - The value of :confval:`html_search_options`
+ - 1.8
+ - 3.0
+ - see :confval:`html_search_options`
+
+ * - ``sphinx.versioning.prepare()``
+ - 1.8
+ - 3.0
+ - ``sphinx.versioning.UIDTransform``
+
+ * - ``Sphinx.override_domain()``
+ - 1.8
+ - 3.0
+ - :meth:`~sphinx.application.Sphinx.add_domain()`
+
+ * - ``Sphinx.import_object()``
+ - 1.8
+ - 3.0
+ - ``sphinx.util.import_object()``
+
+ * - ``suffix`` argument of
+ :meth:`~sphinx.application.Sphinx.add_source_parser()`
+ - 1.8
+ - 3.0
+ - :meth:`~sphinx.application.Sphinx.add_source_suffix()`
+
+
+ * - ``BuildEnvironment.load()``
+ - 1.8
+ - 3.0
+ - ``pickle.load()``
+
+ * - ``BuildEnvironment.loads()``
+ - 1.8
+ - 3.0
+ - ``pickle.loads()``
+
+ * - ``BuildEnvironment.frompickle()``
+ - 1.8
+ - 3.0
+ - ``pickle.load()``
+
+ * - ``BuildEnvironment.dump()``
+ - 1.8
+ - 3.0
+ - ``pickle.dump()``
+
+ * - ``BuildEnvironment.dumps()``
+ - 1.8
+ - 3.0
+ - ``pickle.dumps()``
+
+ * - ``BuildEnvironment.topickle()``
+ - 1.8
+ - 3.0
+ - ``pickle.dump()``
+
+ * - ``BuildEnvironment._nitpick_ignore``
+ - 1.8
+ - 3.0
+ - :confval:`nitpick_ignore`
+
+ * - ``BuildEnvironment.versionchanges``
+ - 1.8
+ - 3.0
+ - N/A
+
+ * - ``BuildEnvironment.update()``
+ - 1.8
+ - 3.0
+ - ``Builder.read()``
+
+ * - ``BuildEnvironment.read_doc()``
+ - 1.8
+ - 3.0
+ - ``Builder.read_doc()``
+
+ * - ``BuildEnvironment._read_serial()``
+ - 1.8
+ - 3.0
+ - ``Builder.read()``
+
+ * - ``BuildEnvironment._read_parallel()``
+ - 1.8
+ - 3.0
+ - ``Builder.read()``
+
+ * - ``BuildEnvironment.write_doctree()``
+ - 1.8
+ - 3.0
+ - ``Builder.write_doctree()``
+
+ * - ``BuildEnvironment.note_versionchange()``
+ - 1.8
+ - 3.0
+ - ``ChangesDomain.note_changeset()``
+
+ * - ``warn()`` (template helper function)
+ - 1.8
+ - 3.0
+ - ``warning()``
+
+ * - :confval:`source_parsers`
+ - 1.8
+ - 3.0
+ - :meth:`~sphinx.application.Sphinx.add_source_parser()`
+
+ * - ``sphinx.util.docutils.directive_helper()``
+ - 1.8
+ - 3.0
+ - ``Directive`` class of docutils
+
+ * - ``sphinx.cmdline``
+ - 1.8
+ - 3.0
+ - ``sphinx.cmd.build``
+
+ * - ``sphinx.make_mode``
+ - 1.8
+ - 3.0
+ - ``sphinx.cmd.make_mode``
+
+ * - ``sphinx.locale.l_()``
+ - 1.8
+ - 3.0
+ - :func:`sphinx.locale._()`
+
+ * - ``sphinx.locale.lazy_gettext()``
+ - 1.8
+ - 3.0
+ - :func:`sphinx.locale._()`
+
+ * - ``sphinx.locale.mygettext()``
+ - 1.8
+ - 3.0
+ - :func:`sphinx.locale._()`
+
+ * - ``sphinx.util.copy_static_entry()``
+ - 1.5
+ - 3.0
+ - ``sphinx.util.fileutil.copy_asset()``
+
+ * - ``sphinx.build_main()``
+ - 1.7
+ - 2.0
+ - ``sphinx.cmd.build.build_main()``
+
+ * - ``sphinx.ext.intersphinx.debug()``
+ - 1.7
+ - 2.0
+ - ``sphinx.ext.intersphinx.inspect_main()``
+
+ * - ``sphinx.ext.autodoc.format_annotation()``
+ - 1.7
+ - 2.0
+ - ``sphinx.util.inspect.Signature``
+
+ * - ``sphinx.ext.autodoc.formatargspec()``
+ - 1.7
+ - 2.0
+ - ``sphinx.util.inspect.Signature``
+
+ * - ``sphinx.ext.autodoc.AutodocReporter``
+ - 1.7
+ - 2.0
+ - ``sphinx.util.docutils.switch_source_input()``
+
+ * - ``sphinx.ext.autodoc.add_documenter()``
+ - 1.7
+ - 2.0
+ - :meth:`~sphinx.application.Sphinx.add_autodocumenter()`
+
+ * - ``sphinx.ext.autodoc.AutoDirective._register``
+ - 1.7
+ - 2.0
+ - :meth:`~sphinx.application.Sphinx.add_autodocumenter()`
+
+ * - ``AutoDirective._special_attrgetters``
+ - 1.7
+ - 2.0
+ - :meth:`~sphinx.application.Sphinx.add_autodoc_attrgetter()`
+
+ * - ``Sphinx.warn()``, ``Sphinx.info()``
+ - 1.6
+ - 2.0
+ - :ref:`logging-api`
+
+ * - ``BuildEnvironment.set_warnfunc()``
+ - 1.6
+ - 2.0
+ - :ref:`logging-api`
+
+ * - ``BuildEnvironment.note_toctree()``
+ - 1.6
+ - 2.0
+ - ``Toctree.note()`` (in ``sphinx.environment.adapters.toctree``)
+
+ * - ``BuildEnvironment.get_toc_for()``
+ - 1.6
+ - 2.0
+ - ``Toctree.get_toc_for()`` (in ``sphinx.environment.adapters.toctree``)
+
+ * - ``BuildEnvironment.get_toctree_for()``
+ - 1.6
+ - 2.0
+ - ``Toctree.get_toctree_for()`` (in ``sphinx.environment.adapters.toctree``)
+
+ * - ``BuildEnvironment.create_index()``
+ - 1.6
+ - 2.0
+ - ``IndexEntries.create_index()`` (in ``sphinx.environment.adapters.indexentries``)
+
+ * - ``sphinx.websupport``
+ - 1.6
+ - 2.0
+ - `sphinxcontrib-websupport`_
+
+ .. _sphinxcontrib-websupport: https://pypi.org/project/sphinxcontrib-websupport/
+
+ * - ``StandaloneHTMLBuilder.css_files``
+ - 1.6
+ - 2.0
+ - :meth:`!add_stylesheet`
+
+ * - ``document.settings.gettext_compact``
+ - 1.8
+ - 1.8
+ - :confval:`gettext_compact`
+
+ * - ``Sphinx.status_iterator()``
+ - 1.6
+ - 1.7
+ - ``sphinx.util.status_iterator()``
+
+ * - ``Sphinx.old_status_iterator()``
+ - 1.6
+ - 1.7
+ - ``sphinx.util.old_status_iterator()``
+
+ * - ``Sphinx._directive_helper()``
+ - 1.6
+ - 1.7
+ - ``sphinx.util.docutils.directive_helper()``
+
+ * - ``sphinx.util.compat.Directive``
+ - 1.6
+ - 1.7
+ - ``docutils.parsers.rst.Directive``
+
+ * - ``sphinx.util.compat.docutils_version``
+ - 1.6
+ - 1.7
+ - ``sphinx.util.docutils.__version_info__``
+
+.. note:: On deprecating on public APIs (internal functions and classes),
+ we also follow the policy as much as possible.
diff --git a/doc/extdev/domainapi.rst b/doc/extdev/domainapi.rst
new file mode 100644
index 0000000..d70b5db
--- /dev/null
+++ b/doc/extdev/domainapi.rst
@@ -0,0 +1,32 @@
+.. _domain-api:
+
+Domain API
+==========
+
+.. module:: sphinx.domains
+
+.. autoclass:: Domain
+ :members:
+
+.. autoclass:: ObjType
+
+.. autoclass:: Index
+ :members:
+
+.. module:: sphinx.directives
+
+.. autoclass:: ObjectDescription
+ :members:
+ :private-members: _toc_entry_name, _object_hierarchy_parts
+
+Python Domain
+-------------
+
+.. module:: sphinx.domains.python
+
+.. autoclass:: PythonDomain
+
+ .. autoattribute:: objects
+ .. autoattribute:: modules
+ .. automethod:: note_object
+ .. automethod:: note_module
diff --git a/doc/extdev/envapi.rst b/doc/extdev/envapi.rst
new file mode 100644
index 0000000..d7ec239
--- /dev/null
+++ b/doc/extdev/envapi.rst
@@ -0,0 +1,58 @@
+Build environment API
+=====================
+
+.. module:: sphinx.environment
+
+.. class:: BuildEnvironment
+
+ **Attributes**
+
+ .. attribute:: app
+
+ Reference to the :class:`.Sphinx` (application) object.
+
+ .. attribute:: config
+
+ Reference to the :class:`.Config` object.
+
+ .. attribute:: project
+
+ Target project. See :class:`.Project`.
+
+ .. attribute:: srcdir
+
+ Source directory.
+
+ .. attribute:: doctreedir
+
+ Directory for storing pickled doctrees.
+
+ .. attribute:: events
+
+ An :class:`.EventManager` object.
+
+ .. attribute:: found_docs
+
+ A set of all existing docnames.
+
+ .. attribute:: metadata
+
+ Dictionary mapping docnames to "metadata" (see :ref:`metadata`).
+
+ .. attribute:: titles
+
+ Dictionary mapping docnames to the docutils node for their main title.
+
+ .. autoattribute:: docname
+
+ **Utility methods**
+
+ .. automethod:: doc2path
+
+ .. automethod:: relfn2path
+
+ .. automethod:: note_dependency
+
+ .. automethod:: new_serialno
+
+ .. automethod:: note_reread
diff --git a/doc/extdev/i18n.rst b/doc/extdev/i18n.rst
new file mode 100644
index 0000000..6b32b8b
--- /dev/null
+++ b/doc/extdev/i18n.rst
@@ -0,0 +1,97 @@
+.. _i18n-api:
+
+i18n API
+========
+
+.. currentmodule:: sphinx.locale
+
+.. autofunction:: init
+
+.. autofunction:: init_console
+
+.. autofunction:: get_translation
+
+.. autofunction:: _
+
+.. autofunction:: __
+
+
+.. _ext-i18n:
+
+Extension internationalization (`i18n`) and localization (`l10n`) using i18n API
+--------------------------------------------------------------------------------
+
+.. versionadded:: 1.8
+
+An extension may naturally come with message translations. This is briefly
+summarized in :func:`sphinx.locale.get_translation` help.
+
+In practice, you have to:
+
+#. Choose a name for your message catalog, which must be unique. Usually
+ the name of your extension is used for the name of message catalog.
+
+#. Mark in your extension sources all messages as translatable, via
+ :func:`sphinx.locale.get_translation` function, usually renamed ``_()``,
+ e.g.:
+
+ .. code-block:: python
+ :caption: src/__init__.py
+
+ from sphinx.locale import get_translation
+
+ MESSAGE_CATALOG_NAME = 'myextension'
+ _ = get_translation(MESSAGE_CATALOG_NAME)
+
+ translated_text = _('Hello Sphinx!')
+
+#. Set up your extension to be aware of its dedicated translations:
+
+ .. code-block:: python
+ :caption: src/__init__.py
+
+ def setup(app):
+ package_dir = path.abspath(path.dirname(__file__))
+ locale_dir = os.path.join(package_dir, 'locales')
+ app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)
+
+#. Generate message catalog template ``*.pot`` file, usually in ``locale/``
+ source directory, for example via `Babel`_:
+
+ .. code-block:: console
+
+ $ pybabel extract --output=src/locale/myextension.pot src/
+
+#. Create message catalogs (``*.po``) for each language which your extension
+ will provide localization, for example via `Babel`_:
+
+ .. code-block:: console
+
+ $ pybabel init --input-file=src/locale/myextension.pot --domain=myextension --output-dir=src/locale --locale=fr_FR
+
+#. Translate message catalogs for each language manually
+
+#. Compile message catalogs into ``*.mo`` files, for example via `Babel`_:
+
+ .. code-block:: console
+
+ $ pybabel compile --directory=src/locale --domain=myextension
+
+#. Ensure that message catalog files are distributed when your package will
+ be installed, by adding equivalent line in your extension ``MANIFEST.in``:
+
+ .. code-block:: ini
+ :caption: MANIFEST.in
+
+ recursive-include src *.pot *.po *.mo
+
+
+When the messages on your extension has been changed, you need to also update
+message catalog template and message catalogs, for example via `Babel`_:
+
+.. code-block:: console
+
+ $ pybabel extract --output=src/locale/myextension.pot src/
+ $ pybabel update --input-file=src/locale/myextension.pot --domain=myextension --output-dir=src/locale
+
+.. _Babel: https://babel.pocoo.org/
diff --git a/doc/extdev/index.rst b/doc/extdev/index.rst
new file mode 100644
index 0000000..8332315
--- /dev/null
+++ b/doc/extdev/index.rst
@@ -0,0 +1,218 @@
+.. _dev-extensions:
+
+Sphinx Extensions API
+=====================
+
+Since many projects will need special features in their documentation, Sphinx
+is designed to be extensible on several levels.
+
+Here are a few things you can do in an extension:
+
+* Add new :term:`builder`\s to support new output formats or actions on the
+ parsed documents.
+* Register custom reStructuredText roles and directives, extending the markup
+ using the :doc:`markupapi`.
+* Add custom code to so-called "hook points" at strategic places throughout the
+ build process, allowing you to register a hook and run specialized code.
+ For example, see the :ref:`events`.
+
+An extension is simply a Python module with a ``setup()`` function. A user
+activates the extension by placing the extension's module name
+(or a sub-module) in their :confval:`extensions` configuration value.
+
+When :program:`sphinx-build` is executed, Sphinx will attempt to import each
+module that is listed, and execute ``yourmodule.setup(app)``. This
+function is used to prepare the extension (e.g., by executing Python code),
+linking resources that Sphinx uses in the build process (like CSS or HTML
+files), and notifying Sphinx of everything the extension offers (such
+as directive or role definitions). The ``app`` argument is an instance of
+:class:`.Sphinx` and gives you control over most aspects of the Sphinx build.
+
+.. note::
+
+ The configuration file itself can be treated as an extension if it
+ contains a ``setup()`` function. All other extensions to load must be
+ listed in the :confval:`extensions` configuration value.
+
+The rest of this page describes some high-level aspects of developing
+extensions and various parts of Sphinx's behavior that you can control.
+For some examples of how extensions can be built and used to control different
+parts of Sphinx, see the :ref:`extension-tutorials-index`.
+
+.. _important-objects:
+
+Important objects
+-----------------
+
+There are several key objects whose API you will use while writing an
+extension. These are:
+
+**Application**
+ The application object (usually called ``app``) is an instance of
+ :class:`.Sphinx`. It controls most high-level functionality, such as the
+ setup of extensions, event dispatching and producing output (logging).
+
+ If you have the environment object, the application is available as
+ ``env.app``.
+
+**Environment**
+ The build environment object (usually called ``env``) is an instance of
+ :class:`.BuildEnvironment`. It is responsible for parsing the source
+ documents, stores all metadata about the document collection and is
+ serialized to disk after each build.
+
+ Its API provides methods to do with access to metadata, resolving references,
+ etc. It can also be used by extensions to cache information that should
+ persist for incremental rebuilds.
+
+ If you have the application or builder object, the environment is available
+ as ``app.env`` or ``builder.env``.
+
+**Builder**
+ The builder object (usually called ``builder``) is an instance of a specific
+ subclass of :class:`.Builder`. Each builder class knows how to convert the
+ parsed documents into an output format, or otherwise process them (e.g. check
+ external links).
+
+ If you have the application object, the builder is available as
+ ``app.builder``.
+
+**Config**
+ The config object (usually called ``config``) provides the values of
+ configuration values set in :file:`conf.py` as attributes. It is an instance
+ of :class:`.Config`.
+
+ The config is available as ``app.config`` or ``env.config``.
+
+To see an example of use of these objects, refer to
+:doc:`../development/tutorials/index`.
+
+.. _build-phases:
+
+Build Phases
+------------
+
+One thing that is vital in order to understand extension mechanisms is the way
+in which a Sphinx project is built: this works in several phases.
+
+**Phase 0: Initialization**
+
+In this phase, almost nothing of interest to us happens. The source
+directory is searched for source files, and extensions are initialized.
+Should a stored build environment exist, it is loaded, otherwise a new one is
+created.
+
+**Phase 1: Reading**
+
+In Phase 1, all source files (and on subsequent builds, those that are new or
+changed) are read and parsed. This is the phase where directives and roles
+are encountered by docutils, and the corresponding code is executed. The
+output of this phase is a *doctree* for each source file; that is a tree of
+docutils nodes. For document elements that aren't fully known until all
+existing files are read, temporary nodes are created.
+
+There are nodes provided by docutils, which are documented `in the docutils
+documentation <https://docutils.sourceforge.io/docs/ref/doctree.html>`__.
+Additional nodes are provided by Sphinx and :ref:`documented here <nodes>`.
+
+During reading, the build environment is updated with all meta- and cross
+reference data of the read documents, such as labels, the names of headings,
+described Python objects and index entries. This will later be used to
+replace the temporary nodes.
+
+The parsed doctrees are stored on the disk, because it is not possible to
+hold all of them in memory.
+
+**Phase 2: Consistency checks**
+
+Some checking is done to ensure no surprises in the built documents.
+
+**Phase 3: Resolving**
+
+Now that the metadata and cross-reference data of all existing documents is
+known, all temporary nodes are replaced by nodes that can be converted into
+output using components called transforms. For example, links are created
+for object references that exist, and simple literal nodes are created for
+those that don't.
+
+**Phase 4: Writing**
+
+This phase converts the resolved doctrees to the desired output format, such
+as HTML or LaTeX. This happens via a so-called docutils writer that visits
+the individual nodes of each doctree and produces some output in the process.
+
+.. note::
+
+ Some builders deviate from this general build plan, for example, the builder
+ that checks external links does not need anything more than the parsed
+ doctrees and therefore does not have phases 2--4.
+
+To see an example of application, refer to :doc:`../development/tutorials/todo`.
+
+.. _ext-metadata:
+
+Extension metadata
+------------------
+
+.. versionadded:: 1.3
+
+The ``setup()`` function can return a dictionary. This is treated by Sphinx
+as metadata of the extension. Metadata keys currently recognized are:
+
+* ``'version'``: a string that identifies the extension version. It is used for
+ extension version requirement checking (see :confval:`needs_extensions`) and
+ informational purposes. If not given, ``"unknown version"`` is substituted.
+* ``'env_version'``: an integer that identifies the version of env data
+ structure if the extension stores any data to environment. It is used to
+ detect the data structure has been changed from last build. The extensions
+ have to increment the version when data structure has changed. If not given,
+ Sphinx considers the extension does not stores any data to environment.
+* ``'parallel_read_safe'``: a boolean that specifies if parallel reading of
+ source files can be used when the extension is loaded. It defaults to
+ ``False``, i.e. you have to explicitly specify your extension to be
+ parallel-read-safe after checking that it is.
+
+ .. note:: The *parallel-read-safe* extension must satisfy the following
+ conditions:
+
+ * The core logic of the extension is parallelly executable during
+ the reading phase.
+ * It has event handlers for :event:`env-merge-info` and
+ :event:`env-purge-doc` events if it stores data to the build
+ environment object (env) during the reading phase.
+
+* ``'parallel_write_safe'``: a boolean that specifies if parallel writing of
+ output files can be used when the extension is loaded. Since extensions
+ usually don't negatively influence the process, this defaults to ``True``.
+
+ .. note:: The *parallel-write-safe* extension must satisfy the following
+ conditions:
+
+ * The core logic of the extension is parallelly executable during
+ the writing phase.
+
+
+APIs used for writing extensions
+--------------------------------
+
+These sections provide a more complete description of the tools at your
+disposal when developing Sphinx extensions. Some are core to Sphinx
+(such as the :doc:`appapi`) while others trigger specific behavior
+(such as the :doc:`i18n`)
+
+.. toctree::
+ :maxdepth: 2
+
+ appapi
+ projectapi
+ envapi
+ builderapi
+ collectorapi
+ markupapi
+ domainapi
+ parserapi
+ nodes
+ logging
+ i18n
+ utils
+ deprecated
diff --git a/doc/extdev/logging.rst b/doc/extdev/logging.rst
new file mode 100644
index 0000000..e6c4dc6
--- /dev/null
+++ b/doc/extdev/logging.rst
@@ -0,0 +1,66 @@
+.. _logging-api:
+
+Logging API
+===========
+
+.. currentmodule:: sphinx.util.logging
+
+.. autofunction:: getLogger(name)
+
+.. autoclass:: SphinxLoggerAdapter(logging.LoggerAdapter)
+
+ .. method:: SphinxLoggerAdapter.error(msg, *args, **kwargs)
+ .. method:: SphinxLoggerAdapter.critical(msg, *args, **kwargs)
+ .. method:: SphinxLoggerAdapter.warning(msg, *args, **kwargs)
+
+ Logs a message on this logger with the specified level.
+ Basically, the arguments are as with python's logging module.
+
+ In addition, Sphinx logger supports following keyword arguments:
+
+ **type**, ***subtype***
+ Categories of warning logs. It is used to suppress
+ warnings by :confval:`suppress_warnings` setting.
+
+ **location**
+ Where the warning happened. It is used to include
+ the path and line number in each log. It allows docname,
+ tuple of docname and line number and nodes::
+
+ logger = sphinx.util.logging.getLogger(__name__)
+ logger.warning('Warning happened!', location='index')
+ logger.warning('Warning happened!', location=('chapter1/index', 10))
+ logger.warning('Warning happened!', location=some_node)
+
+ **color**
+ The color of logs. By default, error level logs are colored as
+ ``"darkred"``, critical level ones is not colored, and warning level
+ ones are colored as ``"red"``.
+
+ .. method:: SphinxLoggerAdapter.log(level, msg, *args, **kwargs)
+ .. method:: SphinxLoggerAdapter.info(msg, *args, **kwargs)
+ .. method:: SphinxLoggerAdapter.verbose(msg, *args, **kwargs)
+ .. method:: SphinxLoggerAdapter.debug(msg, *args, **kwargs)
+
+ Logs a message to this logger with the specified level.
+ Basically, the arguments are as with python's logging module.
+
+ In addition, Sphinx logger supports following keyword arguments:
+
+ **nonl**
+ If true, the logger does not fold lines at the end of the log message.
+ The default is ``False``.
+
+ **location**
+ Where the message emitted. For more detail, see
+ :meth:`SphinxLoggerAdapter.warning`.
+
+ **color**
+ The color of logs. By default, info and verbose level logs are not
+ colored, and debug level ones are colored as ``"darkgray"``.
+
+.. autofunction:: pending_logging()
+
+.. autofunction:: pending_warnings()
+
+.. autofunction:: prefixed_warnings()
diff --git a/doc/extdev/markupapi.rst b/doc/extdev/markupapi.rst
new file mode 100644
index 0000000..072760c
--- /dev/null
+++ b/doc/extdev/markupapi.rst
@@ -0,0 +1,152 @@
+Docutils markup API
+===================
+
+This section describes the API for adding ReST markup elements (roles and
+directives).
+
+Roles
+-----
+
+
+Directives
+----------
+
+Directives are handled by classes derived from
+``docutils.parsers.rst.Directive``. They have to be registered by an extension
+using :meth:`.Sphinx.add_directive` or :meth:`.Sphinx.add_directive_to_domain`.
+
+.. module:: docutils.parsers.rst
+
+.. class:: Directive
+
+ The markup syntax of the new directive is determined by the follow five class
+ attributes:
+
+ .. autoattribute:: required_arguments
+ .. autoattribute:: optional_arguments
+ .. autoattribute:: final_argument_whitespace
+ .. autoattribute:: option_spec
+
+ Option validator functions take a single parameter, the option argument
+ (or ``None`` if not given), and should validate it or convert it to the
+ proper form. They raise :exc:`ValueError` or :exc:`TypeError` to indicate
+ failure.
+
+ There are several predefined and possibly useful validators in the
+ :mod:`docutils.parsers.rst.directives` module.
+
+ .. autoattribute:: has_content
+
+ New directives must implement the :meth:`run` method:
+
+ .. method:: run()
+
+ This method must process the directive arguments, options and content, and
+ return a list of Docutils/Sphinx nodes that will be inserted into the
+ document tree at the point where the directive was encountered.
+
+ Instance attributes that are always set on the directive are:
+
+ .. attribute:: name
+
+ The directive name (useful when registering the same directive class under
+ multiple names).
+
+ .. attribute:: arguments
+
+ The arguments given to the directive, as a list.
+
+ .. attribute:: options
+
+ The options given to the directive, as a dictionary mapping option names
+ to validated/converted values.
+
+ .. attribute:: content
+
+ The directive content, if given, as a :class:`!ViewList`.
+
+ .. attribute:: lineno
+
+ The absolute line number on which the directive appeared. This is not
+ always a useful value; use :attr:`srcline` instead.
+
+ .. attribute:: content_offset
+
+ Internal offset of the directive content. Used when calling
+ ``nested_parse`` (see below).
+
+ .. attribute:: block_text
+
+ The string containing the entire directive.
+
+ .. attribute:: state
+ state_machine
+
+ The state and state machine which controls the parsing. Used for
+ ``nested_parse``.
+
+
+ViewLists
+^^^^^^^^^
+
+Docutils represents document source lines in a class
+``docutils.statemachine.ViewList``. This is a list with extended functionality
+-- for one, slicing creates views of the original list, and also the list
+contains information about the source line numbers.
+
+The :attr:`Directive.content` attribute is a ViewList. If you generate content
+to be parsed as ReST, you have to create a ViewList yourself. Important for
+content generation are the following points:
+
+* The constructor takes a list of strings (lines) and a source (document) name.
+
+* The ``.append()`` method takes a line and a source name as well.
+
+
+Parsing directive content as ReST
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Many directives will contain more markup that must be parsed. To do this, use
+one of the following APIs from the :meth:`Directive.run` method:
+
+* ``self.state.nested_parse``
+* :func:`sphinx.util.nodes.nested_parse_with_titles` -- this allows titles in
+ the parsed content.
+
+Both APIs parse the content into a given node. They are used like this::
+
+ node = docutils.nodes.paragraph()
+ # either
+ nested_parse_with_titles(self.state, self.result, node)
+ # or
+ self.state.nested_parse(self.result, 0, node)
+
+.. note::
+
+ ``sphinx.util.docutils.switch_source_input()`` allows to change a target file
+ during nested_parse. It is useful to mixed contents. For example, ``sphinx.
+ ext.autodoc`` uses it to parse docstrings::
+
+ from sphinx.util.docutils import switch_source_input
+
+ # Switch source_input between parsing content.
+ # Inside this context, all parsing errors and warnings are reported as
+ # happened in new source_input (in this case, ``self.result``).
+ with switch_source_input(self.state, self.result):
+ node = docutils.nodes.paragraph()
+ self.state.nested_parse(self.result, 0, node)
+
+ .. deprecated:: 1.7
+
+ Until Sphinx 1.6, ``sphinx.ext.autodoc.AutodocReporter`` was used for this
+ purpose. It is replaced by ``switch_source_input()``.
+
+If you don't need the wrapping node, you can use any concrete node type and
+return ``node.children`` from the Directive.
+
+
+.. seealso::
+
+ `Creating directives`_ HOWTO of the Docutils documentation
+
+.. _Creating directives: https://docutils.sourceforge.io/docs/howto/rst-directives.html
diff --git a/doc/extdev/nodes.rst b/doc/extdev/nodes.rst
new file mode 100644
index 0000000..7603763
--- /dev/null
+++ b/doc/extdev/nodes.rst
@@ -0,0 +1,103 @@
+.. _nodes:
+
+Doctree node classes added by Sphinx
+====================================
+
+.. module:: sphinx.addnodes
+
+Nodes for domain-specific object descriptions
+---------------------------------------------
+
+Top-level nodes
+...............
+
+These nodes form the top-most levels of object descriptions.
+
+.. autoclass:: desc
+.. autoclass:: desc_signature
+.. autoclass:: desc_signature_line
+.. autoclass:: desc_content
+.. autoclass:: desc_inline
+
+Nodes for high-level structure in signatures
+............................................
+
+These nodes occur in in non-multiline :py:class:`desc_signature` nodes
+and in :py:class:`desc_signature_line` nodes.
+
+.. autoclass:: desc_name
+.. autoclass:: desc_addname
+
+.. autoclass:: desc_type
+.. autoclass:: desc_returns
+.. autoclass:: desc_parameterlist
+.. autoclass:: desc_parameter
+.. autoclass:: desc_optional
+.. autoclass:: desc_annotation
+
+Nodes for signature text elements
+.................................
+
+These nodes inherit :py:class:`desc_sig_element` and are generally translated
+to ``docutils.nodes.inline`` by :py:class:`!SigElementFallbackTransform`.
+
+Extensions may create additional ``desc_sig_*``-like nodes but in order for
+:py:class:`!SigElementFallbackTransform` to translate them to inline nodes
+automatically, they must be added to :py:data:`SIG_ELEMENTS` via the class
+keyword argument `_sig_element=True` of :py:class:`desc_sig_element`, e.g.:
+
+ .. code-block:: python
+
+ class desc_custom_sig_node(desc_sig_element, _sig_element=True): ...
+
+For backwards compatibility, it is still possible to add the nodes directly
+using ``SIG_ELEMENTS.add(desc_custom_sig_node)``.
+
+.. autodata:: SIG_ELEMENTS
+ :no-value:
+
+.. autoclass:: desc_sig_element
+
+.. autoclass:: desc_sig_space
+.. autoclass:: desc_sig_name
+.. autoclass:: desc_sig_operator
+.. autoclass:: desc_sig_punctuation
+.. autoclass:: desc_sig_keyword
+.. autoclass:: desc_sig_keyword_type
+.. autoclass:: desc_sig_literal_number
+.. autoclass:: desc_sig_literal_string
+.. autoclass:: desc_sig_literal_char
+
+New admonition-like constructs
+------------------------------
+
+.. autoclass:: versionmodified
+.. autoclass:: seealso
+
+Other paragraph-level nodes
+-------------------------------
+
+.. autoclass:: compact_paragraph
+
+New inline nodes
+----------------
+
+.. autoclass:: index
+.. autoclass:: pending_xref
+.. autoclass:: pending_xref_condition
+.. autoclass:: literal_emphasis
+.. autoclass:: download_reference
+
+Special nodes
+-------------
+
+.. autoclass:: only
+.. autoclass:: highlightlang
+
+You should not need to generate the nodes below in extensions.
+
+.. autoclass:: glossary
+.. autoclass:: toctree
+.. autoclass:: start_of_file
+.. autoclass:: productionlist
+.. autoclass:: production
diff --git a/doc/extdev/parserapi.rst b/doc/extdev/parserapi.rst
new file mode 100644
index 0000000..c5db2ac
--- /dev/null
+++ b/doc/extdev/parserapi.rst
@@ -0,0 +1,38 @@
+.. _parser-api:
+
+Parser API
+==========
+
+`The docutils documentation describes`__ parsers as follows:
+
+ The Parser analyzes the input document and creates a node tree
+ representation.
+
+__ https://docutils.sourceforge.io/docs/dev/hacking.html#parsing-the-document
+
+In Sphinx, the parser modules works as same as docutils. The parsers are
+registered to Sphinx by extensions using Application APIs;
+:meth:`.Sphinx.add_source_suffix()` and :meth:`.Sphinx.add_source_parser()`.
+
+The *source suffix* is a mapping from file suffix to file type. For example,
+``.rst`` file is mapped to ``'restructuredtext'`` type. Sphinx uses the
+file type to looking for parsers from registered list. On searching,
+Sphinx refers to the ``Parser.supported`` attribute and picks up a parser
+which contains the file type in the attribute.
+
+The users can override the source suffix mappings using
+:confval:`source_suffix` like following::
+
+ # a mapping from file suffix to file types
+ source_suffix = {
+ '.rst': 'restructuredtext',
+ '.md': 'markdown',
+ }
+
+You should indicate file types your parser supports. This will allow users
+to configure their settings appropriately.
+
+.. module:: sphinx.parsers
+
+.. autoclass:: Parser
+ :members:
diff --git a/doc/extdev/projectapi.rst b/doc/extdev/projectapi.rst
new file mode 100644
index 0000000..238aeb4
--- /dev/null
+++ b/doc/extdev/projectapi.rst
@@ -0,0 +1,9 @@
+.. _project-api:
+
+Project API
+===========
+
+.. currentmodule:: sphinx.project
+
+.. autoclass:: Project
+ :members:
diff --git a/doc/extdev/utils.rst b/doc/extdev/utils.rst
new file mode 100644
index 0000000..e842f30
--- /dev/null
+++ b/doc/extdev/utils.rst
@@ -0,0 +1,37 @@
+Utilities
+=========
+
+Sphinx provides utility classes and functions to develop extensions.
+
+Base classes for components
+---------------------------
+
+These base classes are useful to allow your extensions to obtain Sphinx
+components (e.g. :class:`.Config`, :class:`.BuildEnvironment` and so on) easily.
+
+.. note:: The subclasses of them might not work with bare docutils because they
+ are strongly coupled with Sphinx.
+
+.. autoclass:: sphinx.transforms.SphinxTransform
+ :members:
+
+.. autoclass:: sphinx.transforms.post_transforms.SphinxPostTransform
+ :members:
+
+.. autoclass:: sphinx.util.docutils.SphinxDirective
+ :members:
+
+.. autoclass:: sphinx.util.docutils.SphinxRole
+ :members:
+
+.. autoclass:: sphinx.util.docutils.ReferenceRole
+ :members:
+
+.. autoclass:: sphinx.transforms.post_transforms.images.ImageConverter
+ :members:
+
+Utility components
+------------------
+
+.. autoclass:: sphinx.events.EventManager
+ :members:
diff --git a/doc/faq.rst b/doc/faq.rst
new file mode 100644
index 0000000..85ccb24
--- /dev/null
+++ b/doc/faq.rst
@@ -0,0 +1,354 @@
+.. _faq:
+
+Sphinx FAQ
+==========
+
+This is a list of Frequently Asked Questions about Sphinx. Feel free to
+suggest new entries!
+
+How do I...
+-----------
+
+... create PDF files without LaTeX?
+ `rinohtype`_ provides a PDF builder that can be used as a drop-in
+ replacement for the LaTeX builder.
+
+ .. _rinohtype: https://github.com/brechtm/rinohtype
+
+... get section numbers?
+ They are automatic in LaTeX output; for HTML, give a ``:numbered:`` option to
+ the :rst:dir:`toctree` directive where you want to start numbering.
+
+... customize the look of the built HTML files?
+ Use themes, see :doc:`/usage/theming`.
+
+... add global substitutions or includes?
+ Add them in the :confval:`rst_prolog` or :confval:`rst_epilog` config value.
+
+... display the whole TOC tree in the sidebar?
+ Use the :data:`toctree` callable in a custom layout template, probably in the
+ ``sidebartoc`` block.
+
+... write my own extension?
+ See the :doc:`/development/tutorials/index`.
+
+... convert from my existing docs using MoinMoin markup?
+ The easiest way is to convert to xhtml, then convert `xhtml to reST`_.
+ You'll still need to mark up classes and such, but the headings and code
+ examples come through cleanly.
+
+For many more extensions and other contributed stuff, see the sphinx-contrib_
+repository.
+
+.. _sphinx-contrib: https://github.com/sphinx-contrib/
+
+.. _usingwith:
+
+Using Sphinx with...
+--------------------
+
+Read the Docs
+ `Read the Docs <https://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`_ 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.
+
+Doxygen
+ Michael Jones is developing a reST/Sphinx bridge to doxygen called `breathe
+ <https://github.com/michaeljones/breathe/tree/master>`_.
+
+SCons
+ Glenn Hutchings has written a SCons build script to build Sphinx
+ documentation; it is hosted here:
+ https://bitbucket-archive.softwareheritage.org/projects/zo/zondo/sphinx-scons.html
+
+PyPI
+ Jannis Leidel wrote a `setuptools command
+ <https://pypi.org/project/Sphinx-PyPI-upload/>`_ that automatically
+ uploads Sphinx documentation to the PyPI package documentation area at
+ https://pythonhosted.org/.
+
+GitHub Pages
+ Please add :py:mod:`sphinx.ext.githubpages` to your project. It allows you
+ to publish your document in GitHub Pages. It generates helper files for
+ GitHub Pages on building HTML document automatically.
+
+MediaWiki
+ See `sphinx-wiki`_, a project by Kevin Dunn.
+
+ .. _sphinx-wiki: https://bitbucket-archive.softwareheritage.org/projects/ke/kevindunn/sphinx-wiki.html
+
+Google Analytics
+ You can use a custom ``layout.html`` template, like this:
+
+ .. code-block:: html+jinja
+
+ {% extends "!layout.html" %}
+
+ {%- block extrahead %}
+ {{ super() }}
+ <script>
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'XXX account number XXX']);
+ _gaq.push(['_trackPageview']);
+ </script>
+ {% endblock %}
+
+ {% block footer %}
+ {{ super() }}
+ <div class="footer">This page uses <a href="https://analytics.google.com/">
+ Google Analytics</a> to collect statistics. You can disable it by blocking
+ the JavaScript coming from www.google-analytics.com.
+ <script>
+ (function() {
+ var ga = document.createElement('script');
+ ga.src = ('https:' == document.location.protocol ?
+ 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ ga.setAttribute('async', 'true');
+ document.documentElement.firstChild.appendChild(ga);
+ })();
+ </script>
+ </div>
+ {% endblock %}
+
+
+Google Search
+ To replace Sphinx's built-in search function with Google Search, proceed as
+ follows:
+
+ 1. Go to https://cse.google.com/cse/all to create the Google Search code
+ snippet.
+
+ 2. Copy the code snippet and paste it into ``_templates/searchbox.html`` in
+ your Sphinx project:
+
+ .. code-block:: html+jinja
+
+ <div>
+ <h3>{{ _('Quick search') }}</h3>
+ <script>
+ (function() {
+ var cx = '......';
+ var gcse = document.createElement('script');
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+ </script>
+ <gcse:search></gcse:search>
+ </div>
+
+ 3. Add ``searchbox.html`` to the :confval:`html_sidebars` configuration value.
+
+.. _Getting Started: https://docs.readthedocs.io/en/stable/intro/getting-started-with-sphinx.html
+.. _api role: https://git.savannah.gnu.org/cgit/kenozooid.git/tree/doc/extapi.py
+.. _xhtml to reST: https://docutils.sourceforge.io/sandbox/xhtml2rest/xhtml2rest.py
+
+
+Sphinx vs. Docutils
+-------------------
+
+tl;dr: *docutils* converts reStructuredText to multiple output formats. Sphinx
+builds upon docutils to allow construction of cross-referenced and indexed
+bodies of documentation.
+
+`docutils`__ is a text processing system for converting plain text
+documentation into other, richer formats. As noted in the `docutils
+documentation`__, docutils uses *readers* to read a document, *parsers* for
+parsing plain text formats into an internal tree representation made up of
+different types of *nodes*, and *writers* to output this tree in various
+document formats. docutils provides parsers for one plain text format -
+`reStructuredText`__ - though other, *out-of-tree* parsers have been
+implemented including Sphinx's :doc:`Markdown parser </usage/markdown>`. On the
+other hand, it provides writers for many different formats including HTML,
+LaTeX, man pages, Open Document Format and XML.
+
+docutils exposes all of its functionality through a variety of `front-end
+tools`__, such as ``rst2html``, ``rst2odt`` and ``rst2xml``. Crucially though,
+all of these tools, and docutils itself, are concerned with individual
+documents. They don't support concepts such as cross-referencing, indexing of
+documents, or the construction of a document hierarchy (typically manifesting
+in a table of contents).
+
+Sphinx builds upon docutils by harnessing docutils' readers and parsers and
+providing its own :doc:`/usage/builders/index`. As a result, Sphinx wraps some
+of the *writers* provided by docutils. This allows Sphinx to provide many
+features that would simply not be possible with docutils, such as those
+outlined above.
+
+__ https://docutils.sourceforge.io/
+__ https://docutils.sourceforge.io/docs/dev/hacking.html
+__ https://docutils.sourceforge.io/rst.html
+__ https://docutils.sourceforge.io/docs/user/tools.html
+
+
+.. _epub-faq:
+
+Epub info
+---------
+
+The following list gives some hints for the creation of epub files:
+
+* Split the text into several files. The longer the individual HTML files are,
+ the longer it takes the ebook reader to render them. In extreme cases, the
+ rendering can take up to one minute.
+
+* Try to minimize the markup. This also pays in rendering time.
+
+* For some readers you can use embedded or external fonts using the CSS
+ ``@font-face`` directive. This is *extremely* useful for code listings which
+ are often cut at the right margin. The default Courier font (or variant) is
+ quite wide and you can only display up to 60 characters on a line. If you
+ replace it with a narrower font, you can get more characters on a line. You
+ may even use `FontForge <https://fontforge.github.io/>`_ and create
+ narrow variants of some free font. In my case I get up to 70 characters on a
+ line.
+
+ You may have to experiment a little until you get reasonable results.
+
+* Test the created epubs. You can use several alternatives. The ones I am aware
+ of are Epubcheck_, Calibre_, FBreader_ (although it does not render the CSS),
+ and Bookworm_. For Bookworm, you can download the source from
+ https://code.google.com/archive/p/threepress and run your own local server.
+
+* Large floating divs are not displayed properly.
+ If they cover more than one page, the div is only shown on the first page.
+ In that case you can copy the :file:`epub.css` from the
+ ``sphinx/themes/epub/static/`` directory to your local ``_static/``
+ directory and remove the float settings.
+
+* Files that are inserted outside of the ``toctree`` directive must be manually
+ included. This sometimes applies to appendixes, e.g. the glossary or
+ the indices. You can add them with the :confval:`epub_post_files` option.
+
+* The handling of the epub cover page differs from the reStructuredText
+ procedure which automatically resolves image paths and puts the images
+ into the ``_images`` directory. For the epub cover page put the image in the
+ :confval:`html_static_path` directory and reference it with its full path in
+ the :confval:`epub_cover` config option.
+
+* kindlegen_ command can convert from epub3 resulting file to ``.mobi`` file
+ for Kindle. You can get ``yourdoc.mobi`` under ``_build/epub`` after the
+ following command:
+
+ .. code-block:: bash
+
+ $ make epub
+ $ kindlegen _build/epub/yourdoc.epub
+
+ The kindlegen command doesn't accept documents that have section
+ titles surrounding ``toctree`` directive:
+
+ .. code-block:: rst
+
+ Section Title
+ =============
+
+ .. toctree::
+
+ subdocument
+
+ Section After Toc Tree
+ ======================
+
+ kindlegen assumes all documents order in line, but the resulting document
+ has complicated order for kindlegen::
+
+ ``parent.xhtml`` -> ``child.xhtml`` -> ``parent.xhtml``
+
+ If you get the following error, fix your document structure:
+
+ .. code-block:: none
+
+ Error(prcgen):E24011: TOC section scope is not included in the parent chapter:(title)
+ Error(prcgen):E24001: The table of content could not be built.
+
+.. _Epubcheck: https://github.com/IDPF/epubcheck
+.. _Calibre: https://calibre-ebook.com/
+.. _FBreader: https://fbreader.org/
+.. _Bookworm: https://www.oreilly.com/bookworm/index.html
+.. _kindlegen: https://www.amazon.com/gp/feature.html?docId=1000765211
+
+.. _texinfo-faq:
+
+Texinfo info
+------------
+
+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`
+
+One can disable generation of the inline references in a document
+with :confval:`texinfo_cross_references`. That makes
+an info file more readable with stand-alone reader (``info``).
+
+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 do 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``.
+
+.. code-block:: elisp
+
+ (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 (``;``).
+
+- Links to external Info files can be created using the somewhat official URI
+ scheme ``info``. For example::
+
+ info:Texinfo#makeinfo_options
diff --git a/doc/glossary.rst b/doc/glossary.rst
new file mode 100644
index 0000000..e58ce6b
--- /dev/null
+++ b/doc/glossary.rst
@@ -0,0 +1,103 @@
+.. _glossary:
+
+Glossary
+========
+
+.. glossary::
+
+ builder
+ A class (inheriting from :class:`~sphinx.builders.Builder`) that takes
+ parsed documents and performs an action on them. Normally, builders
+ translate the documents to an output format, but it is also possible to
+ use builders that e.g. check for broken links in the documentation, or
+ build coverage information.
+
+ See :doc:`/usage/builders/index` for an overview over Sphinx's built-in
+ builders.
+
+ configuration directory
+ The directory containing :file:`conf.py`. By default, this is the same as
+ the :term:`source directory`, but can be set differently with the **-c**
+ command-line option.
+
+ directive
+ 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:
+
+ .. sourcecode:: rst
+
+ .. directivename:: argument ...
+ :option: value
+
+ Content of the directive.
+
+ See :ref:`rst-directives` for more information.
+
+ document name
+ Since reST source files can have different extensions (some people like
+ ``.txt``, some like ``.rst`` -- the extension can be configured with
+ :confval:`source_suffix`) and different OSes have different path
+ separators, Sphinx abstracts them: :dfn:`document names` are always
+ relative to the :term:`source directory`, the extension is stripped, and
+ path separators are converted to slashes. All values, parameters and such
+ referring to "documents" expect such document names.
+
+ Examples for document names are ``index``, ``library/zipfile``, or
+ ``reference/datamodel/types``. Note that there is no leading or trailing
+ slash.
+
+ domain
+ A domain is a collection of markup (reStructuredText :term:`directive`\ s
+ and :term:`role`\ s) to describe and link to :term:`object`\ s belonging
+ together, e.g. elements of a programming language. Directive and role
+ names in a domain have names like ``domain:name``, e.g. ``py:function``.
+
+ Having domains means that there are no naming problems when one set of
+ documentation wants to refer to e.g. C++ and Python classes. It also
+ means that extensions that support the documentation of whole new
+ languages are much easier to write.
+
+ For more information, refer to :doc:`/usage/restructuredtext/domains`.
+
+ environment
+ A structure where information about all documents under the root is saved,
+ and used for cross-referencing. The environment is pickled after the
+ parsing stage, so that successive runs only need to read and parse new and
+ changed documents.
+
+ extension
+ A custom :term:`role`, :term:`directive` or other aspect of Sphinx that
+ allows users to modify any aspect of the build process within Sphinx.
+
+ For more information, refer to :doc:`/usage/extensions/index`.
+
+ master document
+ The document that contains the root :rst:dir:`toctree` directive.
+
+ root document
+ Same as :term:`master document`.
+
+ object
+ The basic building block of Sphinx documentation. Every "object
+ directive" (e.g. :rst:dir:`py:function` or :rst:dir:`object`) creates such
+ a block; and most objects can be cross-referenced to.
+
+ RemoveInSphinxXXXWarning
+ The feature which is warned will be removed in Sphinx-XXX version.
+ It usually caused from Sphinx extensions which is using deprecated.
+ See also :ref:`when-deprecation-warnings-are-displayed`.
+
+ role
+ A reStructuredText markup element that allows marking a piece of text.
+ Like directives, roles are extensible. The basic syntax looks like this:
+ ``:rolename:`content```. See :ref:`rst-inline-markup` for details.
+
+ source directory
+ The directory which, including its subdirectories, contains all source
+ files for one Sphinx project.
+
+ reStructuredText
+ An easy-to-read, what-you-see-is-what-you-get plaintext markup syntax and
+ parser system.
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..e9aea1c
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,117 @@
+=======
+Welcome
+=======
+
+.. epigraph:: Sphinx makes it easy to create intelligent and beautiful documentation.
+
+Here are some of Sphinx's major features:
+
+* **Output formats:** HTML (including Windows HTML Help), LaTeX (for printable
+ PDF versions), ePub, Texinfo, manual pages, plain text
+* **Extensive cross-references:** semantic markup and automatic links for
+ functions, classes, citations, glossary terms and similar pieces of
+ information
+* **Hierarchical structure:** easy definition of a document tree, with automatic
+ links to siblings, parents and children
+* **Automatic indices:** general index as well as a language-specific module
+ indices
+* **Code handling:** automatic highlighting using the Pygments_ highlighter
+* **Extensions:** automatic testing of code snippets, inclusion of docstrings
+ from Python modules (API docs) via :ref:`built-in extensions
+ <builtin-extensions>`, and much more functionality via :ref:`third-party
+ extensions <third-party-extensions>`.
+* **Themes:** modify the look and feel of outputs via :doc:`creating themes
+ <development/theming>`, and re-use many :ref:`third-party themes
+ <third-party-themes>`.
+* **Contributed extensions:** dozens of extensions :ref:`contributed by users
+ <third-party-extensions>`; most of them installable from PyPI.
+
+.. _reStructuredText: https://docutils.sourceforge.io/rst.html
+.. _Docutils: https://docutils.sourceforge.io/
+.. _Pygments: https://pygments.org/
+
+Sphinx uses the reStructuredText_ markup language by default, and can read
+:ref:`MyST markdown <markdown>` via third-party extensions. Both of these
+are powerful and straightforward to use, and have functionality
+for complex documentation and publishing workflows. They both build upon
+Docutils_ to parse and write documents.
+
+See below for how to navigate Sphinx's documentation.
+
+.. seealso::
+
+ The `Sphinx documentation Table of Contents <contents.html>`_ has
+ a full list of this site's pages.
+
+.. _get-started:
+
+Get started
+===========
+
+These sections cover the basics of getting started with Sphinx, including
+creating and building your own documentation from scratch.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Get started
+
+ usage/quickstart
+ usage/installation
+ tutorial/index
+
+.. _user-guides:
+
+User Guides
+===========
+
+These sections cover various topics in using and extending Sphinx for various
+use-cases. They are a comprehensive guide to using Sphinx in many contexts and
+assume more knowledge of Sphinx. If you are new to Sphinx, we recommend
+starting with :ref:`get-started`.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: User Guides
+
+ usage/index
+ development/index
+ latex
+ extdev/index
+
+Community guide
+===============
+
+Sphinx is community supported and welcomes contributions from anybody.
+The sections below should help you get started joining the Sphinx community
+as well as contributing.
+
+See the :doc:`Sphinx contributors' guide <internals/contributing>` if you would
+like to contribute to the project.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Community
+
+ support
+ internals/index
+ faq
+ authors
+
+Reference guide
+===============
+
+Reference documentation is more complete and programmatic in nature, it is a
+collection of information that can be quickly referenced. If you would like
+usecase-driven documentation, see :ref:`get-started` or :ref:`user-guides`.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Reference
+
+ man/index
+ usage/configuration
+ usage/extensions/index
+ usage/restructuredtext/index
+ glossary
+ changes
+ examples
diff --git a/doc/internals/code-of-conduct.rst b/doc/internals/code-of-conduct.rst
new file mode 100644
index 0000000..8e31ef0
--- /dev/null
+++ b/doc/internals/code-of-conduct.rst
@@ -0,0 +1,5 @@
+:tocdepth: 2
+
+.. _code_of_conduct:
+
+.. include:: ../../CODE_OF_CONDUCT
diff --git a/doc/internals/contributing.rst b/doc/internals/contributing.rst
new file mode 100644
index 0000000..195f6a5
--- /dev/null
+++ b/doc/internals/contributing.rst
@@ -0,0 +1,332 @@
+======================
+Contributing to Sphinx
+======================
+
+There are many ways you can contribute to Sphinx, be it filing bug reports or
+feature requests, writing new documentation or submitting patches for new or
+fixed behavior. This guide serves to illustrate how you can get started with
+this.
+
+Get help
+--------
+
+The Sphinx community maintains a number of mailing lists and IRC channels.
+
+Stack Overflow with tag `python-sphinx`_
+ Questions and answers about use and development.
+
+sphinx-users <sphinx-users@googlegroups.com>
+ Mailing list for user support.
+
+sphinx-dev <sphinx-dev@googlegroups.com>
+ Mailing list for development related discussions.
+
+#sphinx-doc on irc.libera.chat
+ IRC channel for development questions and user support.
+
+.. _python-sphinx: https://stackoverflow.com/questions/tagged/python-sphinx
+
+Bug Reports and Feature Requests
+--------------------------------
+
+If you have encountered a problem with Sphinx or have an idea for a new
+feature, please submit it to the `issue tracker`_ on GitHub or discuss it
+on the `sphinx-dev`_ mailing list.
+
+For bug reports, please include the output produced during the build process
+and also the log file Sphinx creates after it encounters an unhandled
+exception. The location of this file should be shown towards the end of the
+error message.
+
+Including or providing a link to the source files involved may help us fix the
+issue. If possible, try to create a minimal project that produces the error
+and post that instead.
+
+.. _`issue tracker`: https://github.com/sphinx-doc/sphinx/issues
+.. _`sphinx-dev`: mailto:sphinx-dev@googlegroups.com
+
+
+Contribute code
+---------------
+
+The Sphinx source code is managed using Git and is hosted on `GitHub`__. The
+recommended way for new contributors to submit code to Sphinx is to fork this
+repository and submit a pull request after committing changes to their fork.
+The pull request will then need to be approved by one of the core developers
+before it is merged into the main repository.
+
+.. __: https://github.com/sphinx-doc/sphinx
+
+.. _contribute-get-started:
+
+Getting started
+~~~~~~~~~~~~~~~
+
+Before starting on a patch, we recommend checking for open issues or open a
+fresh issue to start a discussion around a feature idea or a bug. If you feel
+uncomfortable or uncertain about an issue or your changes, feel free to email
+the *sphinx-dev* mailing list.
+
+These are the basic steps needed to start developing on Sphinx.
+
+#. Create an account on GitHub.
+
+#. Fork the main Sphinx repository (`sphinx-doc/sphinx
+ <https://github.com/sphinx-doc/sphinx>`_) using the GitHub interface.
+
+#. Clone the forked repository to your machine. ::
+
+ git clone https://github.com/USERNAME/sphinx
+ cd sphinx
+
+#. Checkout the appropriate branch.
+
+ Sphinx adopts Semantic Versioning 2.0.0 (refs: https://semver.org/ ).
+
+ For changes that preserves backwards-compatibility of API and features,
+ they should be included in the next MINOR release, use the ``A.x`` branch.
+ ::
+
+ git checkout A.x
+
+ For incompatible or other substantial changes that should wait until the
+ next MAJOR release, use the ``master`` branch.
+
+ For urgent release, a new PATCH branch must be branched from the newest
+ release tag (see :doc:`release-process` for detail).
+
+#. Setup a virtual environment.
+
+ This is not necessary for unit testing, thanks to ``tox``, but it is
+ necessary if you wish to run ``sphinx-build`` locally or run unit tests
+ without the help of ``tox``::
+
+ virtualenv ~/.venv
+ . ~/.venv/bin/activate
+ pip install -e .
+
+#. Create a new working branch. Choose any name you like. ::
+
+ git checkout -b feature-xyz
+
+#. Hack, hack, hack.
+
+ Write your code along with tests that shows that the bug was fixed or that
+ the feature works as expected.
+
+#. Add a bullet point to :file:`CHANGES` if the fix or feature is not trivial
+ (small doc updates, typo fixes), then commit::
+
+ git commit -m '#42: Add useful new feature that does this.'
+
+ GitHub recognizes certain phrases that can be used to automatically
+ update the issue tracker. For example::
+
+ git commit -m 'Closes #42: Fix invalid markup in docstring of Foo.bar.'
+
+ would close issue #42.
+
+#. Push changes in the branch to your forked repository on GitHub::
+
+ git push origin feature-xyz
+
+#. Submit a pull request from your branch to the respective branch (``master``
+ or ``A.x``).
+
+#. Wait for a core developer to review your changes.
+
+Coding style
+~~~~~~~~~~~~
+
+Please follow these guidelines when writing code for Sphinx:
+
+* Try to use the same code style as used in the rest of the project.
+
+* For non-trivial changes, please update the :file:`CHANGES` file. If your
+ changes alter existing behavior, please document this.
+
+* New features should be documented. Include examples and use cases where
+ appropriate. If possible, include a sample that is displayed in the
+ generated output.
+
+* When adding a new configuration variable, be sure to document it and update
+ :file:`sphinx/cmd/quickstart.py` if it's important enough.
+
+* Add appropriate unit tests.
+
+Style and type checks can be run as follows::
+
+ ruff .
+ mypy sphinx/
+
+Unit tests
+~~~~~~~~~~
+
+Sphinx is tested using `pytest`__ for Python code and `Karma`__ for JavaScript.
+
+.. __: https://docs.pytest.org/en/latest/
+.. __: https://karma-runner.github.io
+
+To run Python unit tests, we recommend using ``tox``, which provides a number
+of targets and allows testing against multiple different Python environments:
+
+* To list all possible targets::
+
+ tox -av
+
+* To run unit tests for a specific Python version, such as Python 3.10::
+
+ tox -e py310
+
+* To run unit tests for a specific Python version and turn on deprecation
+ warnings so they're shown in the test output::
+
+ PYTHONWARNINGS=error tox -e py310
+
+* Arguments to ``pytest`` can be passed via ``tox``, e.g., in order to run a
+ particular test::
+
+ tox -e py310 tests/test_module.py::test_new_feature
+
+You can also test by installing dependencies in your local environment::
+
+ pip install .[test]
+
+To run JavaScript tests, use ``npm``::
+
+ npm install
+ npm run test
+
+New unit tests should be included in the ``tests`` directory where
+necessary:
+
+* For bug fixes, first add a test that fails without your changes and passes
+ after they are applied.
+
+* Tests that need a ``sphinx-build`` run should be integrated in one of the
+ existing test modules if possible. New tests that to ``@with_app`` and
+ then ``build_all`` for a few assertions are not good since *the test suite
+ should not take more than a minute to run*.
+
+.. versionadded:: 1.8
+
+ Sphinx also runs JavaScript tests.
+
+.. versionadded:: 1.6
+
+ ``sphinx.testing`` is added as a experimental.
+
+.. versionchanged:: 1.5.2
+
+ Sphinx was switched from nose to pytest.
+
+.. todo:: The below belongs in the developer guide
+
+Utility functions and pytest fixtures for testing are provided in
+``sphinx.testing``. If you are a developer of Sphinx extensions, you can write
+unit tests by using pytest. At this time, ``sphinx.testing`` will help your
+test implementation.
+
+How to use pytest fixtures that are provided by ``sphinx.testing``? You can
+require ``'sphinx.testing.fixtures'`` in your test modules or ``conftest.py``
+files like this::
+
+ pytest_plugins = 'sphinx.testing.fixtures'
+
+If you want to know more detailed usage, please refer to ``tests/conftest.py``
+and other ``test_*.py`` files under the ``tests`` directory.
+
+
+Contribute documentation
+------------------------
+
+Contributing to documentation involves modifying the source files found in the
+``doc/`` folder. To get started, you should first follow :ref:`contribute-get-started`,
+and then take the steps below to work with the documentation.
+
+The following sections describe how to get started with contributing
+documentation, as well as key aspects of a few different tools that we use.
+
+.. todo:: Add a more extensive documentation contribution guide.
+
+Build the documentation
+~~~~~~~~~~~~~~~~~~~~~~~
+
+To build the documentation, run the following command::
+
+ sphinx-build -M html ./doc ./build/sphinx -W --keep-going
+
+This will parse the Sphinx documentation's source files and generate HTML for
+you to preview in ``build/sphinx/html``.
+
+You can also build a **live version of the documentation** that you can preview
+in the browser. It will detect changes and reload the page any time you make
+edits. To do so, run the following command::
+
+ sphinx-autobuild ./doc ./build/sphinx/
+
+Translations
+~~~~~~~~~~~~
+
+The parts of messages in Sphinx that go into builds are translated into several
+locales. The translations are kept as gettext ``.po`` files translated from the
+master template :file:`sphinx/locale/sphinx.pot`.
+
+Sphinx uses `Babel <https://babel.pocoo.org/en/latest/>`_ to extract messages
+and maintain the catalog files. The ``utils`` directory contains a helper
+script, ``babel_runner.py``.
+
+* Use ``python babel_runner.py extract`` to update the ``.pot`` template.
+* Use ``python babel_runner.py update`` to update all existing language
+ catalogs in ``sphinx/locale/*/LC_MESSAGES`` with the current messages in the
+ template file.
+* Use ``python babel_runner.py compile`` to compile the ``.po`` files to binary
+ ``.mo`` files and ``.js`` files.
+
+When an updated ``.po`` file is submitted, run
+``python babel_runner.py compile`` to commit both the source and the compiled
+catalogs.
+
+When a new locale is submitted, add a new directory with the ISO 639-1 language
+identifier and put ``sphinx.po`` in there. Don't forget to update the possible
+values for :confval:`language` in ``doc/usage/configuration.rst``.
+
+The Sphinx core messages can also be translated on `Transifex
+<https://www.transifex.com/sphinx-doc/sphinx-1/>`_. There ``tx`` client tool,
+which is provided by the ``transifex_client`` Python package, can be used to
+pull translations in ``.po`` format from Transifex. To do this, go to
+``sphinx/locale`` and then run ``tx pull -f -l LANG`` where ``LANG`` is an
+existing language identifier. It is good practice to run
+``python babel_runner.py update`` afterwards to make sure the ``.po`` file has the
+canonical Babel formatting.
+
+
+Debugging tips
+--------------
+
+* Delete the build cache before building documents if you make changes in the
+ code by running the command ``make clean`` or using the
+ :option:`sphinx-build -E` option.
+
+* Use the :option:`sphinx-build -P` option to run ``pdb`` on exceptions.
+
+* Use ``node.pformat()`` and ``node.asdom().toxml()`` to generate a printable
+ representation of the document structure.
+
+* Set the configuration variable :confval:`keep_warnings` to ``True`` so
+ warnings will be displayed in the generated output.
+
+* Set the configuration variable :confval:`nitpicky` to ``True`` so that Sphinx
+ will complain about references without a known target.
+
+* Set the debugging options in the `Docutils configuration file
+ <https://docutils.sourceforge.io/docs/user/config.html>`_.
+
+* JavaScript stemming algorithms in ``sphinx/search/non-minified-js/*.js``
+ are generated using `snowball <https://github.com/snowballstem/snowball>`_
+ by cloning the repository, executing ``make dist_libstemmer_js`` and then
+ unpacking the tarball which is generated in ``dist`` directory.
+
+ Minified files in ``sphinx/search/minified-js/*.js`` are generated from
+ non-minified ones using ``uglifyjs`` (installed via npm), with ``-m``
+ option to enable mangling.
diff --git a/doc/internals/index.rst b/doc/internals/index.rst
new file mode 100644
index 0000000..187082e
--- /dev/null
+++ b/doc/internals/index.rst
@@ -0,0 +1,15 @@
+====================
+Contribute to Sphinx
+====================
+
+This guide contains information about the Sphinx open source project itself.
+This is where you can find information about how Sphinx is managed and learn
+how to contribute to the project.
+
+.. toctree::
+ :maxdepth: 2
+
+ contributing
+ release-process
+ organization
+ code-of-conduct
diff --git a/doc/internals/organization.rst b/doc/internals/organization.rst
new file mode 100644
index 0000000..9dec923
--- /dev/null
+++ b/doc/internals/organization.rst
@@ -0,0 +1,56 @@
+==================================
+Organization of the Sphinx project
+==================================
+
+The guide explains how the Sphinx project is organized.
+
+Core developers
+---------------
+
+The core developers of Sphinx have write access to the main repository. They
+can commit changes, accept/reject pull requests, and manage items on the issue
+tracker.
+
+Guidelines
+~~~~~~~~~~
+
+The following are some general guidelines for core developers:
+
+* Questionable or extensive changes should be submitted as a pull request
+ instead of being committed directly to the main repository. The pull
+ request should be reviewed by another core developer before it is merged.
+
+* Trivial changes can be committed directly but be sure to keep the repository
+ in a good working state and that all tests pass before pushing your changes.
+
+* When committing code written by someone else, please attribute the original
+ author in the commit message and any relevant :file:`CHANGES` entry.
+
+Membership
+~~~~~~~~~~
+
+Core membership is predicated on continued active contribution to the project.
+In general, prospective cores should demonstrate:
+
+- a good understanding of one of more components of Sphinx
+
+- a history of helpful, constructive contributions
+
+- a willingness to invest time improving Sphinx
+
+Refer to :doc:`contributing` for more information on how you can get started.
+
+Other contributors
+------------------
+
+You do not need to be a core developer or have write access to be involved in
+the development of Sphinx. You can submit patches or create pull requests
+from forked repositories and have a core developer add the changes for you.
+
+Similarly, contributions are not limited to code patches. We also welcome help
+triaging bugs, input on design decisions, reviews of existing patches and
+documentation improvements. More information can be found in
+:doc:`contributing`.
+
+A list of people that have contributed to Sphinx can be found in
+:doc:`../authors`.
diff --git a/doc/internals/release-process.rst b/doc/internals/release-process.rst
new file mode 100644
index 0000000..50648cd
--- /dev/null
+++ b/doc/internals/release-process.rst
@@ -0,0 +1,125 @@
+========================
+Sphinx's release process
+========================
+
+Versioning
+----------
+
+Sphinx adheres to :pep:`440` versions, with a ``major.minor.micro`` scheme for
+the *release segment* (e.g. 1.2.3).
+The major, minor, and micro version parts should be altered as follows:
+
+* The major version part should be incremented for incompatible behavior change and
+ public API updates.
+
+* The minor version part should be incremented for most releases of Sphinx, where
+ backwards-compatibility of API and features are preserves.
+
+* The micro version part should only be incremented for urgent bugfix-only releases.
+
+When the major version part is incremented, the minor and micro version parts
+must be set to ``0``.
+When the minor version part is incremented, the micro version part must be set
+to ``0``.
+
+New major versions should come with a beta-testing period before the final
+release.
+
+
+Deprecating a feature
+---------------------
+
+There are a couple reasons that code in Sphinx might be deprecated:
+
+* If a feature has been improved or modified in a backwards-incompatible way,
+ the old feature or behavior will be deprecated.
+
+* Sometimes Sphinx will include a backport of a Python library that's not
+ included in a version of Python that Sphinx currently supports. When Sphinx
+ no longer needs to support the older version of Python that doesn't include
+ the library, the library will be deprecated in Sphinx.
+
+As the :ref:`deprecation-policy` describes, the first release of Sphinx that
+deprecates a feature (``A.B``) should raise a ``RemovedInSphinxXXWarning``
+(where ``XX`` is the Sphinx version where the feature will be removed) when the
+deprecated feature is invoked. Assuming we have good test coverage, these
+warnings are converted to errors when running the test suite with warnings
+enabled::
+
+ pytest -Wall
+
+Thus, when adding a ``RemovedInSphinxXXWarning`` you need to eliminate or
+silence any warnings generated when running the tests.
+
+
+.. _deprecation-policy:
+
+Deprecation policy
+------------------
+
+MAJOR and MINOR releases may deprecate certain features from previous
+releases. If a feature is deprecated in a release A.x, it will continue to
+work in all A.x.x versions (for all versions of x). It will continue to work
+in all B.x.x versions but raise deprecation warnings. Deprecated features
+will be removed at the C.0.0. It means the deprecated feature will work during
+2 MAJOR releases at least.
+
+So, for example, if we decided to start the deprecation of a function in
+Sphinx 2.x:
+
+* Sphinx 2.x will contain a backwards-compatible replica of the function
+ which will raise a ``RemovedInSphinx40Warning``.
+ This is a subclass of :exc:`python:PendingDeprecationWarning`, i.e. it
+ will not get displayed by default.
+
+* Sphinx 3.x will still contain the backwards-compatible replica, but
+ ``RemovedInSphinx40Warning`` will be a subclass of
+ :exc:`python:DeprecationWarning` then, and gets displayed by default.
+
+* Sphinx 4.0 will remove the feature outright.
+
+Deprecation warnings
+~~~~~~~~~~~~~~~~~~~~
+
+Sphinx will enable its ``RemovedInNextVersionWarning`` warnings by default, if
+:envvar:`python:PYTHONWARNINGS` is not set. Therefore you can disable them
+using:
+
+* ``PYTHONWARNINGS= make html`` (Linux/Mac)
+* ``export PYTHONWARNINGS=`` and do ``make html`` (Linux/Mac)
+* ``set PYTHONWARNINGS=`` and do ``make html`` (Windows)
+
+But you can also explicitly enable the pending ones using e.g.
+``PYTHONWARNINGS=default`` (see the :ref:`Python docs on configuring warnings
+<python:describing-warning-filters>`) for more details.
+
+Python version support policy
+-----------------------------
+
+Sphinx supports at all minor versions of Python released in the past 42 months
+from the anticipated release date with a minimum of 3 minor versions of Python.
+This policy is derived from `NEP 29`_, a scientific Python domain standard.
+
+.. _NEP 29: https://numpy.org/neps/nep-0029-deprecation_policy.html
+
+For example, a version of Sphinx released in May 2024 would support Python 3.10,
+3.11, and 3.12.
+
+This is a summary table with the current policy:
+
+=========== ======
+Date Python
+=========== ======
+26 Dec 2021 3.8+
+----------- ------
+14 Apr 2023 3.9+
+----------- ------
+05 Apr 2024 3.10+
+----------- ------
+04 Apr 2025 3.11+
+=========== ======
+
+Release procedures
+------------------
+
+The release procedures are listed in ``utils/release-checklist``.
diff --git a/doc/latex.rst b/doc/latex.rst
new file mode 100644
index 0000000..4c9a4e0
--- /dev/null
+++ b/doc/latex.rst
@@ -0,0 +1,1841 @@
+LaTeX customization
+===================
+
+.. module:: latex
+ :synopsis: LaTeX specifics.
+
+.. _contents: https://docutils.sourceforge.io/docs/ref/rst/directives.html#table-of-contents
+
+.. raw:: latex
+
+ \begingroup
+ \sphinxsetup{%
+ TitleColor={named}{DarkGoldenrod},
+ pre_border-width=2pt,
+ pre_border-right-width=8pt,
+ pre_padding=5pt,
+ pre_border-radius=5pt,
+ pre_background-TeXcolor={named}{OldLace},
+ pre_border-TeXcolor=Gold!90,
+ pre_box-shadow=6pt 6pt,
+ pre_box-shadow-TeXcolor=gray!20,
+ %
+ div.warning_border-width=3pt,
+ div.warning_padding=6pt,
+ div.warning_padding-right=18pt,
+ div.warning_padding-bottom=18pt,
+ div.warning_border-TeXcolor=DarkCyan,
+ div.warning_background-TeXcolor=LightCyan,
+ div.warning_box-shadow=-12pt -12pt inset,
+ div.warning_box-shadow-TeXcolor=Cyan,
+ %
+ attentionborder=3pt,
+ attentionBorderColor=Crimson,
+ attentionBgColor=FloralWhite,
+ %
+ noteborder=1pt,
+ noteBorderColor=Olive,
+ noteBgColor=Olive!10,
+ div.note_border-top-width=0pt,
+ div.note_border-bottom-width=0pt,
+ hintBorderColor=LightCoral,
+ }
+ \relax
+
+Unlike :ref:`the HTML builders <html-themes>`, the ``latex`` builder does not
+benefit from prepared themes. The :ref:`latex-options`, and particularly the
+:ref:`latex_elements <latex_elements_confval>` variable, provides much of the
+interface for customization. For example:
+
+.. code-block:: latex
+
+ # inside conf.py
+ latex_engine = 'xelatex'
+ latex_elements = {
+ 'fontpkg': r'''
+ \setmainfont{DejaVu Serif}
+ \setsansfont{DejaVu Sans}
+ \setmonofont{DejaVu Sans Mono}
+ ''',
+ 'preamble': r'''
+ \usepackage[titles]{tocloft}
+ \cftsetpnumwidth {1.25cm}\cftsetrmarg{1.5cm}
+ \setlength{\cftchapnumwidth}{0.75cm}
+ \setlength{\cftsecindent}{\cftchapnumwidth}
+ \setlength{\cftsecnumwidth}{1.25cm}
+ ''',
+ 'fncychap': r'\usepackage[Bjornstrup]{fncychap}',
+ 'printindex': r'\footnotesize\raggedright\printindex',
+ }
+ latex_show_urls = 'footnote'
+
+.. note::
+
+ Keep in mind that backslashes must be doubled in Python string literals to
+ avoid interpretation as escape sequences. Alternatively, you may use raw
+ strings as is done above.
+
+.. _latex_elements_confval:
+
+The ``latex_elements`` configuration setting
+--------------------------------------------
+
+A dictionary that contains LaTeX snippets overriding those Sphinx usually puts
+into the generated ``.tex`` files. Its ``'sphinxsetup'`` key is described
+:ref:`separately <latexsphinxsetup>`. It allows also local configurations
+inserted in generated files, via :dudir:`raw` directives. For example, in
+the PDF documentation this chapter is styled especially, as will be described
+later.
+
+Keys that you may want to override include:
+
+``'papersize'``
+ Paper size option of the document class (``'a4paper'`` or
+ ``'letterpaper'``)
+
+ Default: ``'letterpaper'``
+
+``'pointsize'``
+ Point size option of the document class (``'10pt'``, ``'11pt'`` or
+ ``'12pt'``)
+
+ Default: ``'10pt'``
+
+``'pxunit'``
+ The value of the ``px`` when used in image attributes ``width`` and
+ ``height``. The default value is ``'0.75bp'`` which achieves
+ ``96px=1in`` (in TeX ``1in = 72bp = 72.27pt``.) To obtain for
+ example ``100px=1in`` use ``'0.01in'`` or ``'0.7227pt'`` (the latter
+ leads to TeX computing a more precise value, due to the smaller unit
+ used in the specification); for ``72px=1in``, simply use ``'1bp'``; for
+ ``90px=1in``, use ``'0.8bp'`` or ``'0.803pt'``.
+
+ Default: ``'0.75bp'``
+
+ .. versionadded:: 1.5
+
+``'passoptionstopackages'``
+ A string which will be positioned early in the preamble, designed to
+ contain ``\\PassOptionsToPackage{options}{foo}`` commands.
+
+ .. hint::
+
+ It may be also used for loading LaTeX packages very early in the
+ preamble. For example package ``fancybox`` is incompatible with
+ being loaded via the ``'preamble'`` key, it must be loaded earlier.
+
+ Default: ``''``
+
+ .. versionadded:: 1.4
+
+``'babel'``
+ "babel" package inclusion, default ``'\\usepackage{babel}'`` (the
+ suitable document language string is passed as class option, and
+ ``english`` is used if no language.) For Japanese documents, the
+ default is the empty string.
+
+ With XeLaTeX and LuaLaTeX, Sphinx configures the LaTeX document to use
+ `polyglossia`_, but one should be aware that current `babel`_ has
+ improved its support for Unicode engines in recent years and for some
+ languages it may make sense to prefer ``babel`` over ``polyglossia``.
+
+ .. _`polyglossia`: https://ctan.org/pkg/polyglossia
+ .. _`babel`: https://ctan.org/pkg/babel
+
+ .. hint::
+
+ After modifying a core LaTeX key like this one, clean up the LaTeX
+ build repertory before next PDF build, else left-over auxiliary
+ files are likely to break the build.
+
+ Default: ``'\\usepackage{babel}'`` (``''`` for Japanese documents)
+
+ .. versionchanged:: 1.5
+ For :confval:`latex_engine` set to ``'xelatex'``, the default
+ is ``'\\usepackage{polyglossia}\n\\setmainlanguage{<language>}'``.
+
+ .. versionchanged:: 1.6
+ ``'lualatex'`` uses same default setting as ``'xelatex'``
+
+ .. versionchanged:: 1.7.6
+ For French, ``xelatex`` and ``lualatex`` default to using
+ ``babel``, not ``polyglossia``.
+
+``'fontpkg'``
+ Font package inclusion. The default is::
+
+ r"""\usepackage{tgtermes}
+ \usepackage{tgheros}
+ \renewcommand\ttdefault{txtt}
+ """
+
+ For ``'xelatex'`` and ``'lualatex'`` however the default is to use
+ the GNU FreeFont.
+
+ .. versionchanged:: 1.2
+ Defaults to ``''`` when the :confval:`language` uses the Cyrillic
+ script.
+
+ .. versionchanged:: 2.0
+ Incorporates some font substitution commands to help support occasional
+ Greek or Cyrillic in a document using ``'pdflatex'`` engine.
+
+ .. versionchanged:: 4.0.0
+
+ - The font substitution commands added at ``2.0`` have been moved
+ to the ``'fontsubstitution'`` key, as their presence here made
+ it complicated for user to customize the value of ``'fontpkg'``.
+ - The default font setting has changed: it still uses Times and
+ Helvetica clones for serif and sans serif, but via better, more
+ complete TeX fonts and associated LaTeX packages. The
+ monospace font has been changed to better match the Times clone.
+
+``'fncychap'``
+ Inclusion of the "fncychap" package (which makes fancy chapter titles),
+ default ``'\\usepackage[Bjarne]{fncychap}'`` for English documentation
+ (this option is slightly customized by Sphinx),
+ ``'\\usepackage[Sonny]{fncychap}'`` for internationalized docs (because
+ the "Bjarne" style uses numbers spelled out in English). Other
+ "fncychap" styles you can try are "Lenny", "Glenn", "Conny", "Rejne" and
+ "Bjornstrup". You can also set this to ``''`` to disable fncychap.
+
+ Default: ``'\\usepackage[Bjarne]{fncychap}'`` for English documents,
+ ``'\\usepackage[Sonny]{fncychap}'`` for internationalized documents, and
+ ``''`` for Japanese documents.
+
+``'preamble'``
+ Additional preamble content. One may move all needed macros into some file
+ :file:`mystyle.tex.txt` of the project source repertory, and get LaTeX to
+ import it at run time::
+
+ 'preamble': r'\input{mystyle.tex.txt}',
+ # or, if the \ProvidesPackage LaTeX macro is used in a file mystyle.sty
+ 'preamble': r'\usepackage{mystyle}',
+
+ It is then needed to set appropriately :confval:`latex_additional_files`,
+ for example:
+
+ .. code-block:: python
+
+ latex_additional_files = ["mystyle.sty"]
+
+ Do not use ``.tex`` as suffix, else the file is submitted itself to the PDF
+ build process, use ``.tex.txt`` or ``.sty`` as in the examples above.
+
+ Default: ``''``
+
+``'figure_align'``
+ Latex figure float alignment. Whenever an image doesn't fit into the current
+ page, it will be 'floated' into the next page but may be preceded by any
+ other text. If you don't like this behavior, use 'H' which will disable
+ floating and position figures strictly in the order they appear in the
+ source.
+
+ Default: ``'htbp'`` (here, top, bottom, page)
+
+ .. versionadded:: 1.3
+
+``'atendofbody'``
+ Additional document content (right before the indices).
+
+ Default: ``''``
+
+ .. versionadded:: 1.5
+
+``'extrapackages'``
+ Additional LaTeX packages. For example:
+
+ .. code-block:: latex
+
+ latex_elements = {
+ 'extrapackages': r'\usepackage{isodate}'
+ }
+
+ The specified LaTeX packages will be loaded before
+ hyperref package and packages loaded from Sphinx extensions.
+
+ .. hint::
+ If you'd like to load additional LaTeX packages after hyperref, use
+ ``'preamble'`` key instead.
+
+ Default: ``''``
+
+ .. versionadded:: 2.3
+
+``'footer'``
+ Additional footer content (before the indices).
+
+ Default: ``''``
+
+ .. deprecated:: 1.5
+ Use ``'atendofbody'`` key instead.
+
+Keys that don't need to be overridden unless in special cases are:
+
+``'extraclassoptions'``
+ The default is the empty string. Example: ``'extraclassoptions':
+ 'openany'`` will allow chapters (for documents of the ``'manual'``
+ type) to start on any page.
+
+ Default: ``''``
+
+ .. versionadded:: 1.2
+
+ .. versionchanged:: 1.6
+ Added this documentation.
+
+``'maxlistdepth'``
+ LaTeX allows by default at most 6 levels for nesting list and
+ quote-like environments, with at most 4 enumerated lists, and 4 bullet
+ lists. Setting this key for example to ``'10'`` (as a string) will
+ allow up to 10 nested levels (of all sorts). Leaving it to the empty
+ string means to obey the LaTeX default.
+
+ .. warning::
+
+ - Using this key may prove incompatible with some LaTeX packages
+ or special document classes which do their own list customization.
+
+ - The key setting is silently *ignored* if ``\usepackage{enumitem}``
+ is executed inside the document preamble. Use then rather the
+ dedicated commands of this LaTeX package.
+
+ Default: ``6``
+
+ .. versionadded:: 1.5
+
+``'inputenc'``
+ "inputenc" package inclusion.
+
+ Default: ``'\\usepackage[utf8]{inputenc}'`` when using pdflatex, else
+ ``''``.
+
+ .. note::
+
+ If using ``utf8x`` in place of ``utf8`` it is mandatory to extend the
+ LaTeX preamble with suitable ``\PreloadUnicodePage{<number>}`` commands,
+ as per the ``utf8x`` documentation (``texdoc ucs`` on a TeXLive based
+ TeX installation). Else, unexpected and possibly hard-to-spot problems
+ (i.e. not causing a build crash) may arise in the PDF, in particular
+ regarding hyperlinks.
+
+ Even if these precautions are taken, PDF build via ``pdflatex`` engine
+ may crash due to upstream LaTeX not being fully compatible with
+ ``utf8x``. For example, in certain circumstances related to
+ code-blocks, or attempting to include images whose filenames contain
+ Unicode characters. Indeed, starting in 2015, upstream LaTeX with
+ ``pdflatex`` engine has somewhat enhanced native support for Unicode and
+ is becoming more and more incompatible with ``utf8x``. In particular,
+ since the October 2019 LaTeX release, filenames can use Unicode
+ characters, and even spaces. At Sphinx level this means e.g. that the
+ :dudir:`image` and :dudir:`figure` directives are now compatible with
+ such filenames for PDF via LaTeX output. But this is broken if
+ ``utf8x`` is in use.
+
+ .. versionchanged:: 1.4.3
+ Previously ``'\\usepackage[utf8]{inputenc}'`` was used for all
+ compilers.
+
+``'cmappkg'``
+ "cmap" package inclusion.
+
+ Default: ``'\\usepackage{cmap}'``
+
+ .. versionadded:: 1.2
+
+``'fontenc'``
+ Customize this from its default ``'\\usepackage[T1]{fontenc}'`` to:
+
+ - ``'\\usepackage[X2,T1]{fontenc}'`` if you need occasional
+ Cyrillic letters (физика чаÑтиц),
+
+ - ``'\\usepackage[LGR,T1]{fontenc}'`` if you need occasional
+ Greek letters (Σωματιδιακή φυσική).
+
+ Use ``[LGR,X2,T1]`` rather if both are needed.
+
+ .. attention::
+
+ - Do not use this key for a :confval:`latex_engine` other than
+ ``'pdflatex'``.
+
+ - If Greek is main language, do not use this key. Since Sphinx 2.2.1,
+ ``xelatex`` will be used automatically as :confval:`latex_engine`.
+
+ - The TeX installation may need some extra packages. For example,
+ on Ubuntu xenial, packages ``texlive-lang-greek`` and ``cm-super``
+ are needed for ``LGR`` to work. And ``texlive-lang-cyrillic`` and
+ ``cm-super`` are needed for support of Cyrillic.
+
+ .. versionchanged:: 1.5
+ Defaults to ``'\\usepackage{fontspec}'`` when
+ :confval:`latex_engine` is ``'xelatex'``.
+
+ .. versionchanged:: 1.6
+ ``'lualatex'`` uses ``fontspec`` per default like ``'xelatex'``.
+
+ .. versionchanged:: 2.0
+ ``'lualatex'`` executes
+ ``\defaultfontfeatures[\rmfamily,\sffamily]{}`` to disable TeX
+ ligatures transforming `<<` and `>>` as escaping working with
+ ``pdflatex/xelatex`` failed with ``lualatex``.
+
+ .. versionchanged:: 2.0
+ Detection of ``LGR``, ``T2A``, ``X2`` to trigger support of
+ occasional Greek or Cyrillic letters (``'pdflatex'``).
+
+ .. versionchanged:: 2.3.0
+ ``'xelatex'`` executes
+ ``\defaultfontfeatures[\rmfamily,\sffamily]{}`` in order to avoid
+ contractions of ``--`` into en-dash or transforms of straight quotes
+ into curly ones in PDF (in non-literal text paragraphs) despite
+ :confval:`smartquotes` being set to ``False``.
+
+``'fontsubstitution'``
+ Ignored if ``'fontenc'`` was not configured to use ``LGR`` or ``X2`` (or
+ ``T2A``). In case ``'fontpkg'`` key is configured for usage with some
+ TeX fonts known to be available in the ``LGR`` or ``X2`` encodings, set
+ this one to be the empty string. Else leave to its default.
+
+ Ignored with :confval:`latex_engine` other than ``'pdflatex'``.
+
+ .. versionadded:: 4.0.0
+
+``'textgreek'``
+ For the support of occasional Greek letters.
+
+ It is ignored with ``'platex'``, ``'xelatex'`` or ``'lualatex'`` as
+ :confval:`latex_engine` and defaults to either the empty string or
+ to ``'\\usepackage{textalpha}'`` for ``'pdflatex'`` depending on
+ whether the ``'fontenc'`` key was used with ``LGR`` or not. Only
+ expert LaTeX users may want to customize this key.
+
+ It can also be used as ``r'\usepackage{textalpha,alphabeta}'`` to let
+ ``'pdflatex'`` support Greek Unicode input in :rst:dir:`math` context.
+ For example ``:math:`α``` (U+03B1) will render as :math:`\alpha`.
+
+ Default: ``'\\usepackage{textalpha}'`` or ``''`` if ``fontenc`` does not
+ include the ``LGR`` option.
+
+ .. versionadded:: 2.0
+
+``'geometry'``
+ "geometry" package inclusion, the default definition is:
+
+ .. code:: latex
+
+ '\\usepackage{geometry}'
+
+ with an additional ``[dvipdfm]`` for Japanese documents.
+ The Sphinx LaTeX style file executes:
+
+ .. code:: latex
+
+ \PassOptionsToPackage{hmargin=1in,vmargin=1in,marginpar=0.5in}{geometry}
+
+ which can be customized via corresponding :ref:`'sphinxsetup' options
+ <latexsphinxsetup>`.
+
+ Default: ``'\\usepackage{geometry}'`` (or
+ ``'\\usepackage[dvipdfm]{geometry}'`` for Japanese documents)
+
+ .. versionadded:: 1.5
+
+ .. versionchanged:: 1.5.2
+ ``dvipdfm`` option if :confval:`latex_engine` is ``'platex'``.
+
+ .. versionadded:: 1.5.3
+ The :ref:`'sphinxsetup' keys for the margins
+ <latexsphinxsetuphmargin>`.
+
+ .. versionchanged:: 1.5.3
+ The location in the LaTeX file has been moved to after
+ ``\usepackage{sphinx}`` and ``\sphinxsetup{..}``, hence also after
+ insertion of ``'fontpkg'`` key. This is in order to handle the paper
+ layout options in a special way for Japanese documents: the text
+ width will be set to an integer multiple of the *zenkaku* width, and
+ the text height to an integer multiple of the baseline. See the
+ :ref:`hmargin <latexsphinxsetuphmargin>` documentation for more.
+
+``'hyperref'``
+ "hyperref" package inclusion; also loads package "hypcap" and issues
+ ``\urlstyle{same}``. This is done after :file:`sphinx.sty` file is
+ loaded and before executing the contents of ``'preamble'`` key.
+
+ .. attention::
+
+ Loading of packages "hyperref" and "hypcap" is mandatory.
+
+ .. versionadded:: 1.5
+ Previously this was done from inside :file:`sphinx.sty`.
+
+``'maketitle'``
+ "maketitle" call. Override if you want to generate a differently styled
+ title page.
+
+ .. hint::
+
+ If the key value is set to
+ ``r'\newcommand\sphinxbackoftitlepage{<Extra
+ material>}\sphinxmaketitle'``, then ``<Extra material>`` will be
+ typeset on back of title page (``'manual'`` docclass only).
+
+ Default: ``'\\sphinxmaketitle'``
+
+ .. versionchanged:: 1.8.3
+ Original ``\maketitle`` from document class is not overwritten,
+ hence is re-usable as part of some custom setting for this key.
+
+ .. versionadded:: 1.8.3
+ ``\sphinxbackoftitlepage`` optional macro. It can also be defined
+ inside ``'preamble'`` key rather than this one.
+
+``'releasename'``
+ Value that prefixes ``'release'`` element on title page. As for *title* and
+ *author* used in the tuples of :confval:`latex_documents`, it is inserted as
+ LaTeX markup.
+
+ Default: ``'Release'``
+
+``'tableofcontents'``
+ "tableofcontents" call. The default of ``'\\sphinxtableofcontents'`` is a
+ wrapper of unmodified ``\tableofcontents``, which may itself be customized
+ by user loaded packages. Override if you want to generate a different table
+ of contents or put content between the title page and the TOC.
+
+ Default: ``'\\sphinxtableofcontents'``
+
+ .. versionchanged:: 1.5
+ Previously the meaning of ``\tableofcontents`` itself was modified
+ by Sphinx. This created an incompatibility with dedicated packages
+ modifying it also such as "tocloft" or "etoc".
+
+``'transition'``
+ Commands used to display transitions. Override if you want to display
+ transitions differently.
+
+ Default: ``'\n\n\\bigskip\\hrule\\bigskip\n\n'``
+
+ .. versionadded:: 1.2
+
+ .. versionchanged:: 1.6
+ Remove unneeded ``{}`` after ``\\hrule``.
+
+``'makeindex'``
+ "makeindex" call, the last thing before ``\begin{document}``. With
+ ``'\\usepackage[columns=1]{idxlayout}\\makeindex'`` the index will use
+ only one column. You may have to install ``idxlayout`` LaTeX package.
+
+ Default: ``'\\makeindex'``
+
+``'printindex'``
+ "printindex" call, the last thing in the file. Override if you want to
+ generate the index differently, append some content after the index, or
+ change the font. As LaTeX uses two-column mode for the index it is
+ often advisable to set this key to
+ ``'\\footnotesize\\raggedright\\printindex'``. Or, to obtain a one-column
+ index, use ``'\\def\\twocolumn[#1]{#1}\\printindex'`` (this trick may fail
+ if using a custom document class; then try the ``idxlayout`` approach
+ described in the documentation of the ``'makeindex'`` key).
+
+ Default: ``'\\printindex'``
+
+``'fvset'``
+ Customization of ``fancyvrb`` LaTeX package.
+
+ The default value is ``'\\fvset{fontsize=auto}'`` which means that the
+ font size will adjust correctly if a code-block ends up in a footnote.
+ You may need to modify this if you use custom fonts:
+ ``'\\fvset{fontsize=\\small}'`` if the monospace font is Courier-like.
+
+ Default: ``'\\fvset{fontsize=auto}'``
+
+ .. versionadded:: 1.8
+
+ .. versionchanged:: 2.0
+ For ``'xelatex'`` and ``'lualatex'`` defaults to
+ ``'\\fvset{fontsize=\\small}'`` as this
+ is adapted to the relative widths of the FreeFont family.
+
+ .. versionchanged:: 4.0.0
+ Changed default for ``'pdflatex'``. Previously it was using
+ ``'\\fvset{fontsize=\\small}'``.
+
+ .. versionchanged:: 4.1.0
+ Changed default for Chinese documents to
+ ``'\\fvset{fontsize=\\small,formatcom=\\xeCJKVerbAddon}'``
+
+Keys that are set by other options and therefore should not be overridden are:
+
+``'docclass'``
+``'classoptions'``
+``'title'``
+``'release'``
+``'author'``
+
+
+.. _latexsphinxsetup:
+
+The ``sphinxsetup`` configuration setting
+-----------------------------------------
+
+.. versionadded:: 1.5
+
+The ``'sphinxsetup'`` key of :ref:`latex_elements <latex_elements_confval>`
+provides a LaTeX-type customization interface::
+
+ latex_elements = {
+ 'sphinxsetup': 'key1=value1, key2=value2, ...',
+ }
+
+It defaults to empty. If non-empty, it will be passed as argument to the
+``\sphinxsetup`` macro inside the document preamble, like this::
+
+ \usepackage{sphinx}
+ \sphinxsetup{key1=value1, key2=value2,...}
+
+The colors used in the above are provided by the ``svgnames`` option of the
+"xcolor" package::
+
+ latex_elements = {
+ 'passoptionstopackages': r'\PassOptionsToPackage{svgnames}{xcolor}',
+ }
+
+It is possible to insert uses of the ``\sphinxsetup`` LaTeX macro directly
+into the body of the document, via the ``raw`` directive. This chapter is
+styled in the PDF output using the following insertion at its start. This
+uses keys described later in :ref:`additionalcss`.
+
+.. code-block:: latex
+
+ .. raw:: latex
+
+ \begingroup
+ \sphinxsetup{%
+ TitleColor={named}{DarkGoldenrod},
+ % pre_border-width is 5.1.0 alias for verbatimborder
+ pre_border-width=2pt,
+ pre_border-right-width=8pt,
+ % pre_padding is a 5.1.0 alias for verbatimsep
+ pre_padding=5pt,
+ % Rounded boxes are new at 5.1.0
+ pre_border-radius=5pt,
+ % TeXcolor reminds that syntax must be as for LaTeX \definecolor
+ pre_background-TeXcolor={named}{OldLace},
+ % ... and since 5.3.0 also xcolor \colorlet syntax is accepted and we
+ % can thus drop the {named}{...} thing if xcolor is available!
+ pre_border-TeXcolor=Gold,
+ % ... and even take more advantage of xcolor syntax:
+ pre_border-TeXcolor=Gold!90,
+ % add a shadow to code-blocks
+ pre_box-shadow=6pt 6pt,
+ pre_box-shadow-TeXcolor=gray!20,
+ %
+ % This 5.1.0 CSS-named option is alias for warningborder
+ div.warning_border-width=3pt,
+ % Prior to 5.1.0, padding for admonitions was not customizable
+ div.warning_padding=6pt,
+ div.warning_padding-right=18pt,
+ div.warning_padding-bottom=18pt,
+ % Assume xcolor has been loaded with its svgnames option
+ div.warning_border-TeXcolor=DarkCyan,
+ div.warning_background-TeXcolor=LightCyan,
+ % This one is the only option with space separated input:
+ div.warning_box-shadow=-12pt -12pt inset,
+ div.warning_box-shadow-TeXcolor=Cyan,
+ %
+ % The 5.1.0 new name would be div.attention_border-width
+ attentionborder=3pt,
+ % The 5.1.0 name here would be div.attention_border-TeXcolor
+ attentionBorderColor=Crimson,
+ % The 5.1.0 name would be div.attention_background-TeXcolor
+ attentionBgColor=FloralWhite,
+ %
+ % For note/hint/important/tip, the CSS syntax was added at 6.2.0
+ % Legacy syntax still works
+ noteborder=1pt,
+ noteBorderColor=Olive,
+ % But setting a background color via the new noteBgColor means that
+ % it will be rendered using the same interface as warning type
+ noteBgColor=Olive!10,
+ % We can customize separately the four border-widths, and mimic
+ % the legacy "light" rendering, but now with a background color:
+ % div.note_border-left-width=0pt,
+ % div.note_border-right-width=0pt,
+ % Let's rather for variety use lateral borders:
+ div.note_border-top-width=0pt,
+ div.note_border-bottom-width=0pt,
+ %
+ % As long as only border width and border color are set, *and* using
+ % for this the old interface, the rendering will be the "light" one
+ hintBorderColor=LightCoral,
+ % but if we had used div.hint_border-TeXcolor or *any* CSS-named
+ % option we would have triggered the more complex "heavybox" code.
+ }
+
+
+And this is placed at the end of the chapter source to end the scope of
+the configuration:
+
+.. code-block:: latex
+
+ .. raw:: latex
+
+ \endgroup
+
+LaTeX syntax for boolean keys requires *lowercase* ``true`` or ``false``
+e.g ``'sphinxsetup': "verbatimwrapslines=false"``. If setting the
+boolean key to ``true``, ``=true`` is optional.
+Spaces around the commas and equal signs are ignored, spaces inside LaTeX
+macros may be significant.
+Do not use quotes to enclose values, whether numerical or strings.
+
+``bookmarksdepth``
+ Controls the depth of the collapsible bookmarks panel in the PDF.
+ May be either a number (e.g. ``3``) or a LaTeX sectioning name (e.g.
+ ``subsubsection``, i.e. without backslash).
+ For details, refer to the ``hyperref`` LaTeX docs.
+
+ Default: ``5``
+
+ .. versionadded:: 4.0.0
+
+.. _latexsphinxsetuphmargin:
+
+``hmargin, vmargin``
+ The dimensions of the horizontal (resp. vertical) margins, passed as
+ ``hmargin`` (resp. ``vmargin``) option to the ``geometry`` package.
+ Example::
+
+ 'sphinxsetup': 'hmargin={2in,1.5in}, vmargin={1.5in,2in}, marginpar=1in',
+
+ Japanese documents currently accept only the one-dimension format for
+ these parameters. The ``geometry`` package is then passed suitable options
+ to get the text width set to an exact multiple of the *zenkaku* width, and
+ the text height set to an integer multiple of the baselineskip, with the
+ closest fit for the margins.
+
+ Default: ``1in`` (equivalent to ``{1in,1in}``)
+
+ .. hint::
+
+ For Japanese ``'manual'`` docclass with pointsize ``11pt`` or ``12pt``,
+ use the ``nomag`` extra document class option (cf.
+ ``'extraclassoptions'`` key of :confval:`latex_elements`) or so-called
+ TeX "true" units::
+
+ 'sphinxsetup': 'hmargin=1.5truein, vmargin=1.5truein, marginpar=5zw',
+
+ .. versionadded:: 1.5.3
+
+``marginpar``
+ The ``\marginparwidth`` LaTeX dimension. For Japanese documents, the value
+ is modified to be the closest integer multiple of the *zenkaku* width.
+
+ Default: ``0.5in``
+
+ .. versionadded:: 1.5.3
+
+``verbatimwithframe``
+ Boolean to specify if :rst:dir:`code-block`\ s and literal includes are
+ framed. Setting it to ``false`` does not deactivate use of package
+ "framed", because it is still in use for the optional background color.
+
+ Default: ``true``.
+
+``verbatimwrapslines``
+ Boolean to specify if long lines in :rst:dir:`code-block`\ 's contents are
+ wrapped.
+
+ If ``true``, line breaks may happen at spaces (the last space before the
+ line break will be rendered using a special symbol), and at ascii
+ punctuation characters (i.e. not at letters or digits). Whenever a long
+ string has no break points, it is moved to next line. If its length is
+ longer than the line width it will overflow.
+
+ Default: ``true``
+
+.. _latexsphinxsetupforcewraps:
+
+``verbatimforcewraps``
+ Boolean to specify if long lines in :rst:dir:`code-block`\ 's contents
+ should be forcefully wrapped to never overflow due to long strings.
+
+ .. note::
+
+ It is assumed that the Pygments_ LaTeXFormatter has not been used with
+ its ``texcomments`` or similar options which allow additional
+ (arbitrary) LaTeX mark-up.
+
+ Also, in case of :confval:`latex_engine` set to ``'pdflatex'``, only
+ the default LaTeX handling of Unicode code points, i.e. ``utf8`` not
+ ``utf8x`` is allowed.
+
+ .. _Pygments: https://pygments.org/
+
+ Default: ``false``
+
+ .. versionadded:: 3.5.0
+
+``verbatimmaxoverfull``
+ A number. If an unbreakable long string has length larger than the total
+ linewidth plus this number of characters, and if ``verbatimforcewraps``
+ mode is on, the input line will be reset using the forceful algorithm
+ which applies breakpoints at each character.
+
+ Default: ``3``
+
+ .. versionadded:: 3.5.0
+
+``verbatimmaxunderfull``
+ A number. If ``verbatimforcewraps`` mode applies, and if after applying
+ the line wrapping at spaces and punctuation, the first part of the split
+ line is lacking at least that number of characters to fill the available
+ width, then the input line will be reset using the forceful algorithm.
+
+ As the default is set to a high value, the forceful algorithm is triggered
+ only in overfull case, i.e. in presence of a string longer than full
+ linewidth. Set this to ``0`` to force all input lines to be hard wrapped
+ at the current available linewidth::
+
+ latex_elements = {
+ 'sphinxsetup': "verbatimforcewraps, verbatimmaxunderfull=0",
+ }
+
+ This can be done locally for a given code-block via the use of raw latex
+ directives to insert suitable ``\sphinxsetup`` (before and after) into the
+ latex file.
+
+ Default: ``100``
+
+ .. versionadded:: 3.5.0
+
+``verbatimhintsturnover``
+ Boolean to specify if code-blocks display "continued on next page" and
+ "continued from previous page" hints in case of page breaks.
+
+ Default: ``true``
+
+ .. versionadded:: 1.6.3
+ .. versionchanged:: 1.7
+ the default changed from ``false`` to ``true``.
+
+``verbatimcontinuedalign``, ``verbatimcontinuesalign``
+ Horizontal position relative to the framed contents: either ``l`` (left
+ aligned), ``r`` (right aligned) or ``c`` (centered).
+
+ Default: ``r``
+
+ .. versionadded:: 1.7
+
+``parsedliteralwraps``
+ Boolean to specify if long lines in :dudir:`parsed-literal`\ 's contents
+ should wrap.
+
+ Default: ``true``
+
+ .. versionadded:: 1.5.2
+ set this option value to ``false`` to recover former behavior.
+
+``inlineliteralwraps``
+ Boolean to specify if line breaks are allowed inside inline literals: but
+ extra potential break-points (additionally to those allowed by LaTeX at
+ spaces or for hyphenation) are currently inserted only after the characters
+ ``. , ; ? ! /`` and ``\``. Due to TeX internals, white space in the line
+ will be stretched (or shrunk) in order to accommodate the linebreak.
+
+ Default: ``true``
+
+ .. versionadded:: 1.5
+ set this option value to ``false`` to recover former behavior.
+
+ .. versionchanged:: 2.3.0
+ added potential breakpoint at ``\`` characters.
+
+``verbatimvisiblespace``
+ When a long code line is split, the last space character from the source
+ code line right before the linebreak location is typeset using this.
+
+ Default: ``\textcolor{red}{\textvisiblespace}``
+
+``verbatimcontinued``
+ A LaTeX macro inserted at start of continuation code lines. Its
+ (complicated...) default typesets a small red hook pointing to the right::
+
+ \makebox[2\fontcharwd\font`\x][r]{\textcolor{red}{\tiny$\hookrightarrow$}}
+
+ .. versionchanged:: 1.5
+ The breaking of long code lines was added at 1.4.2. The default
+ definition of the continuation symbol was changed at 1.5 to accommodate
+ various font sizes (e.g. code-blocks can be in footnotes).
+
+.. note::
+
+ Values for color keys must either:
+
+ - obey the syntax of the ``\definecolor`` LaTeX command, e.g. something
+ such as ``VerbatimColor={rgb}{0.2,0.3,0.5}`` or ``{RGB}{37,23,255}`` or
+ ``{gray}{0.75}`` or (only with package ``xcolor``) ``{HTML}{808080}`` or
+ ...
+
+ - or obey the syntax of the ``\colorlet`` command from package ``xcolor``
+ (which then must exist in the LaTeX installation),
+ e.g. ``VerbatimColor=red!10`` or ``red!50!green`` or ``-red!75`` or
+ ``MyPreviouslyDefinedColor`` or... Refer to xcolor_ documentation for
+ this syntax.
+
+ .. _xcolor: https://ctan.org/pkg/xcolor
+
+ .. versionchanged:: 5.3.0
+ Formerly only the ``\definecolor`` syntax was accepted.
+
+``TitleColor``
+ The color for titles (as configured via use of package "titlesec".)
+
+ Default: ``{rgb}{0.126,0.263,0.361}``
+
+``InnerLinkColor``
+ A color passed to ``hyperref`` as value of ``linkcolor`` and
+ ``citecolor``.
+
+ Default: ``{rgb}{0.208,0.374,0.486}``.
+
+``OuterLinkColor``
+ A color passed to ``hyperref`` as value of ``filecolor``, ``menucolor``,
+ and ``urlcolor``.
+
+ Default: ``{rgb}{0.216,0.439,0.388}``
+
+``VerbatimColor``
+ The background color for :rst:dir:`code-block`\ s.
+
+ Default: ``{gray}{0.95}``
+
+ .. versionchanged:: 6.0.0
+
+ Formerly, it was ``{rgb}{1,1,1}`` (white).
+
+``VerbatimBorderColor``
+ The frame color.
+
+ Default: ``{RGB}{32,32,32}``
+
+ .. versionchanged:: 6.0.0
+
+ Formerly it was ``{rgb}{0,0,0}`` (black).
+
+``VerbatimHighlightColor``
+ The color for highlighted lines.
+
+ Default: ``{rgb}{0.878,1,1}``
+
+ .. versionadded:: 1.6.6
+
+.. _tablecolors:
+
+``TableRowColorHeader``
+ Sets the background color for (all) the header rows of tables.
+
+ It will have an effect only if either the :confval:`latex_table_style`
+ contains ``'colorrows'`` or if the table is assigned the ``colorrows``
+ class. It is ignored for tables with ``nocolorrows`` class.
+
+ As for the other ``'sphinxsetup'`` keys, it can also be set or modified
+ from a ``\sphinxsetup{...}`` LaTeX command inserted via the :dudir:`raw`
+ directive, or also from a LaTeX environment associated to a `container
+ class <latexcontainer_>`_ and using such ``\sphinxsetup{...}``.
+
+ Default: ``{gray}{0.86}``
+
+ There is also ``TableMergeColorHeader``. If used, sets a specific color
+ for merged single-row cells in the header.
+
+ .. versionadded:: 5.3.0
+
+``TableRowColorOdd``
+ Sets the background color for odd rows in tables (the row count starts at
+ ``1`` at the first non-header row). Has an effect only if the
+ :confval:`latex_table_style` contains ``'colorrows'`` or for specific
+ tables assigned the ``colorrows`` class.
+
+ Default: ``{gray}{0.92}``
+
+ There is also ``TableMergeColorOdd``.
+
+ .. versionadded:: 5.3.0
+
+``TableRowColorEven``
+ Sets the background color for even rows in tables.
+
+ Default ``{gray}{0.98}``
+
+ There is also ``TableMergeColorEven``.
+
+ .. versionadded:: 5.3.0
+
+``verbatimsep``
+ The separation between code lines and the frame.
+
+ See :ref:`additionalcss` for its alias ``pre_padding`` and
+ additional keys.
+
+ Default: ``\fboxsep``
+
+``verbatimborder``
+ The width of the frame around :rst:dir:`code-block`\ s. See also
+ :ref:`additionalcss` for ``pre_border-width``.
+
+ Default: ``\fboxrule``
+
+``shadowsep``
+ The separation between contents and frame for contents_ and
+ :dudir:`topic` boxes.
+
+ See :ref:`additionalcss` for the alias ``div.topic_padding``.
+
+ Default: ``5pt``
+
+``shadowsize``
+ The width of the lateral "shadow" to the right and bottom.
+
+ See :ref:`additionalcss` for ``div.topic_box-shadow`` which allows to
+ configure separately the widths of the vertical and horizontal shadows.
+
+ Default: ``4pt``
+
+ .. versionchanged:: 6.1.2
+ Fixed a regression introduced at ``5.1.0`` which modified unintentionally
+ the width of topic boxes and worse had made usage of this key break PDF
+ builds.
+
+``shadowrule``
+ The width of the frame around :dudir:`topic` boxes. See also
+ :ref:`additionalcss` for ``div.topic_border-width``.
+
+ Default: ``\fboxrule``
+
+|notebdcolors|
+ The color for the two horizontal rules used by Sphinx in LaTeX for styling
+ a :dudir:`note` type admonition.
+
+ Default: ``{rgb}{0,0,0}`` (black)
+
+|notebgcolors|
+ The optional color for the background. It is a priori set to white, but
+ is not used, unless it has been set explicitly, and doing this triggers
+ Sphinx into switching to the more complex LaTeX code which is employed
+ also for ``warning`` type admonitions. There are then additional options
+ which are described in :ref:`additionalcss`.
+
+ Default: ``{rgb}{1,1,1}`` (white)
+
+ .. versionadded:: 6.2.0
+
+|notetextcolors|
+ The optional color for the contents.
+
+ Default: unset (uses ambient text color, a priori black)
+
+ .. versionadded:: 6.2.0
+
+ To be considered experimental until 7.0.0. These options have aliases
+ ``div.note_TeXcolor`` (etc) described in :ref:`additionalcss`. Using
+ the latter will let Sphinx switch to a more complex LaTeX code,
+ which supports the customizability described in :ref:`additionalcss`.
+
+|notetexextras|
+ Some extra LaTeX code (such as ``\bfseries`` or ``\footnotesize``)
+ to be executed at start of the contents.
+
+ Default: empty
+
+ .. versionadded:: 6.2.0
+
+ To be considered experimental until 7.0.0. These options have aliases
+ ``div.note_TeXextras`` (etc) described in :ref:`additionalcss`.
+
+``noteborder``, ``hintborder``, ``importantborder``, ``tipborder``
+ The width of the two horizontal rules.
+
+ If the background color is set, or the alternative :ref:`additionalcss`
+ syntax is used (e.g. ``div.note_border-width=1pt`` in place of
+ ``noteborder=1pt``), or *any* option with a CSS-alike name is used, then
+ the border is a full frame and this parameter sets its width also for left
+ and right.
+
+ Default: ``0.5pt``
+
+.. only:: not latex
+
+ |warningbdcolors|
+ The color for the admonition frame.
+
+ Default: ``{rgb}{0,0,0}`` (black)
+
+.. only:: latex
+
+ |wgbdcolorslatex|
+ The color for the admonition frame.
+
+ Default: ``{rgb}{0,0,0}`` (black)
+
+|warningbgcolors|
+ The background colors for the respective admonitions.
+
+ Default: ``{rgb}{1,1,1}`` (white)
+
+|warningborders|
+ The width of the frame. See
+ :ref:`additionalcss` for keys allowing to configure separately each
+ border width.
+
+ Default: ``1pt``
+
+``AtStartFootnote``
+ LaTeX macros inserted at the start of the footnote text at bottom of page,
+ after the footnote number.
+
+ Default: ``\mbox{ }``
+
+``BeforeFootnote``
+ LaTeX macros inserted before the footnote mark. The default removes
+ possible space before it (else, TeX could insert a line break there).
+
+ Default: ``\leavevmode\unskip``
+
+ .. versionadded:: 1.5
+
+``HeaderFamily``
+ default ``\sffamily\bfseries``. Sets the font used by headings.
+
+
+.. |notebdcolors| replace:: ``noteBorderColor``, ``hintBorderColor``,
+ ``importantBorderColor``, ``tipBorderColor``
+
+.. |notebgcolors| replace:: ``noteBgColor``, ``hintBgColor``,
+ ``importantBgColor``, ``tipBgColor``
+
+.. |notetextcolors| replace:: ``noteTextColor``, ``hintTextColor``,
+ ``importantTextColor``, ``tipTextColor``
+
+.. |notetexextras| replace:: ``noteTeXextras``, ``hintTeXextras``,
+ ``importantTeXextras``, ``tipTeXextras``
+
+.. |warningbdcolors| replace:: ``warningBorderColor``, ``cautionBorderColor``,
+ ``attentionBorderColor``, ``dangerBorderColor``,
+ ``errorBorderColor``
+
+.. |wgbdcolorslatex| replace:: ``warningBorderColor``, and
+ ``(caution|attention|danger|error)BorderColor``
+
+.. else latex goes into right margin, as it does not hyphenate the names
+
+.. |warningbgcolors| replace:: ``warningBgColor``, ``cautionBgColor``,
+ ``attentionBgColor``, ``dangerBgColor``,
+ ``errorBgColor``
+
+.. |warningborders| replace:: ``warningborder``, ``cautionborder``,
+ ``attentionborder``, ``dangerborder``,
+ ``errorborder``
+
+.. _additionalcss:
+
+Additional CSS-like ``'sphinxsetup'`` keys
+-------------------------------------------
+
+.. versionadded:: 5.1.0
+
+ For :rst:dir:`code-block`, :dudir:`topic` and contents_ directive,
+ and strong-type admonitions (:dudir:`warning`, :dudir:`error`, ...).
+
+.. versionadded:: 6.2.0
+
+ Also the :dudir:`note`, :dudir:`hint`, :dudir:`important` and :dudir:`tip`
+ admonitions can be styled this way. Using for them *any* of the listed
+ options will trigger usage of a more complex LaTeX code than the one used
+ per default (``sphinxheavybox`` vs ``sphinxlightbox``). Setting the new
+ ``noteBgColor`` (or ``hintBgColor``, ...) also triggers usage of
+ ``sphinxheavybox`` for :dudir:`note` (or :dudir:`hint`, ...).
+
+Perhaps in future these 5.1.0 (and 6.2.0) novel settings will be optionally
+imported from some genuine CSS external file, but currently they have to be used
+via the ``'sphinxsetup'`` interface (or the ``\sphinxsetup`` LaTeX command
+inserted via the :dudir:`raw` directive) and the CSS syntax is only imitated.
+
+.. important:: Low-level LaTeX errors causing a build failure can happen if
+ the input syntax is not respected.
+
+ * In particular colors must be input as for the other color related options
+ previously described, i.e. either in the ``\definecolor`` syntax or, if
+ package ``xcolor`` is available (it is then automatically used) also the
+ ``\colorlet`` syntax::
+
+ ...<other options>
+ div.warning_border-TeXcolor={rgb}{1,0,0},% (always works)
+ div.error_background-TeXcolor=red!10,% (works only if xcolor is available)
+ ...<other options>
+
+ * A colon in place of the equal sign will break LaTeX.
+
+ * ``...border-width`` or ``...padding`` expect a *single* dimension: they can not
+ be used so far with space separated dimensions.
+
+ * ``...top-right-radius`` et al. values may be either a single or *two* space
+ separated dimensions.
+
+ * Dimension specifications must use TeX units such as ``pt`` or ``cm`` or
+ ``in``. The ``px`` unit is recognized by ``pdflatex`` and ``lualatex``
+ but not by ``xelatex`` or ``platex``.
+
+ * It is allowed for such specifications to be so-called "dimensional
+ expressions", e.g. ``\fboxsep+2pt`` or ``0.5\baselineskip`` are valid
+ inputs. The expressions will be evaluated only at the typesetting time.
+ Be careful though if using as in these examples TeX control sequences to
+ double the backslash or to employ a raw Python string for the value of
+ the :ref:`'sphinxsetup' <latexsphinxsetup>` key.
+
+ * As a rule, avoid inserting unneeded spaces in the key values: especially
+ for the radii an input such ``2 pt 3pt`` will break LaTeX. Beware also
+ that ``\fboxsep \fboxsep`` will not be seen as space separated in LaTeX.
+ You must use something such as ``{\fboxsep} \fboxsep``. Or use
+ directly ``3pt 3pt`` which is a priori equivalent and simpler.
+
+The options are all named in a similar pattern which depends on a ``prefix``,
+which is then followed by an underscore, then the property name.
+
+.. csv-table::
+ :header: Directive, Option prefix, LaTeX environment
+
+ :rst:dir:`code-block`, ``pre``, ``sphinxVerbatim``
+ :dudir:`topic`, ``div.topic``, ``sphinxShadowBox``
+ contents_, ``div.topic``, ``sphinxShadowBox``
+ :dudir:`note`, ``div.note``, ``sphinxnote`` using ``sphinxheavybox``
+ :dudir:`warning`, ``div.warning``, ``sphinxwarning`` (uses ``sphinxheavybox``)
+ admonition type, ``div.<type>``, ``sphinx<type>`` (using ``sphinxheavybox``)
+
+Here are now these options as well as their common defaults.
+Replace below ``<prefix>`` by the actual prefix as explained above. Don't
+forget the underscore separating the prefix from the property names.
+
+- | ``<prefix>_border-top-width``,
+ | ``<prefix>_border-right-width``,
+ | ``<prefix>_border-bottom-width``,
+ | ``<prefix>_border-left-width``,
+ | ``<prefix>_border-width``. The latter can (currently) be only a *single*
+ dimension which then sets all four others.
+
+ The default is that all those dimensions are equal. They are set to:
+
+ * ``\fboxrule`` (i.e. a priori ``0.4pt``) for :rst:dir:`code-block`,
+ * ``\fboxrule`` for :dudir:`topic` or contents_ directive,
+ * ``1pt`` for :dudir:`warning` and other "strong" admonitions,
+ * ``0.5pt`` for :dudir:`note` and other "light" admonitions. The framing
+ style of the "lighbox" used for them in absence of usage of CSS-named
+ options will be emulated by the richer "heavybox" if setting
+ ``border-left-width`` and ``border-right-width`` both to ``0pt``.
+
+- ``<prefix>_box-decoration-break`` can be set to either ``clone`` or
+ ``slice`` and configures the behavior at page breaks.
+ It defaults to ``slice`` for :rst:dir:`code-block` (i.e. for ``<prefix>=pre``)
+ since 6.0.0. For other directives the default is ``clone``.
+- | ``<prefix>_padding-top``,
+ | ``<prefix>_padding-right``,
+ | ``<prefix>_padding-bottom``,
+ | ``<prefix>_padding-left``,
+ | ``<prefix>_padding``. The latter can (currently) be only a *single*
+ dimension which then sets all four others.
+
+ The default is that all those dimensions are equal. They are set to:
+
+ * ``\fboxsep`` (i.e. a priori ``3pt``) for :rst:dir:`code-block`,
+ * ``5pt`` for :dudir:`topic` or contents_ directive,
+ * a special value for :dudir:`warning` and other "strong" admonitions,
+ which ensures a backward compatible behavior.
+
+ .. important::
+
+ Prior to 5.1.0 there was no separate customizability of
+ padding for warning-type boxes in PDF via LaTeX output. The sum of
+ padding and border-width (as set for example for :dudir:`warning` by
+ ``warningborder``, now also named ``div.warning_border-width``) was
+ kept to a certain constant value. This limited the border-width
+ to small values else the border could overlap the text contents.
+ This behavior is kept as default.
+
+ * the same padding behavior is obeyed per default for :dudir:`note` or
+ other "light" admonitions when using ``sphinxheavybox``.
+- | ``<prefix>_border-top-left-radius``,
+ | ``<prefix>_border-top-right-radius``,
+ | ``<prefix>_border-bottom-right-radius``,
+ | ``<prefix>_border-bottom-left-radius``,
+ | ``<prefix>_border-radius``. This last key sets the first four to
+ its assigned value. Each key value can be either a single, or *two*,
+ dimensions which are then space separated.
+
+ The default is that all four corners are either circular or straight,
+ with common radii:
+
+ * ``\fboxsep`` (i.e. a priori ``3pt``) for :rst:dir:`code-block` (since 6.0.0).
+ * ``0pt`` for all other directives; this means to use straight corners.
+
+ See a remark above about traps with spaces in LaTeX.
+- ``<prefix>_box-shadow`` is special in so far as it may be:
+
+ * the ``none`` keyword,
+ * or a single dimension (giving both x-offset and y-offset),
+ * or two dimensions (separated by a space),
+ * or two dimensions followed by the keyword ``inset``.
+
+ The x-offset and y-offset may be negative. The default is ``none``,
+ *except* for the :dudir:`topic` or contents_ directives, for which it is
+ ``4pt 4pt``, i.e. the shadow has a width of ``4pt`` and extends to the right
+ and below the frame. The lateral shadow then extends into the page right
+ margin.
+- | ``<prefix>_border-TeXcolor``,
+ | ``<prefix>_background-TeXcolor``,
+ | ``<prefix>_box-shadow-TeXcolor``,
+ | ``<prefix>_TeXcolor``.
+ These are colors.
+
+ The shadow color defaults in all cases to ``{rgb}{0,0,0}`` i.e. to black.
+
+ Since 6.0.0 the border color and background color of :rst:dir:`code-block`,
+ i.e. ``pre`` prefix, default respectively to ``{RGB}{32,32,32}`` and
+ ``{gray}{0.95}``. They previously defaulted to black, respectively white.
+
+ For all other types, the border color defaults to black and the background
+ color to white.
+
+ The ``<prefix>_TeXcolor`` stands for the CSS property "color", i.e. it
+ influences the text color of the contents. As for the three other options,
+ the naming ``TeXcolor`` is to stress that the input syntax is the TeX one
+ for colors not an HTML/CSS one. If package ``xcolor`` is available in the
+ LaTeX installation, one can use directly named colors as key values.
+ Consider passing options such as ``dvipsnames``, ``svgnames`` or ``x11names``
+ to ``xcolor`` via ``'passoptionstopackages'`` key of :confval:`latex_elements`.
+
+ If ``<prefix>_TeXcolor`` is set, a ``\color`` command is inserted at
+ start of the directive contents; for admonitions, this happens after the
+ heading which reproduces the admonition type.
+
+- ``<prefix>_TeXextras``: if set, its value must be some LaTeX command or
+ commands, for example ``\itshape``. These commands will be inserted at the
+ start of the contents; for admonitions, this happens after the heading which
+ reproduces the admonition type.
+
+.. note::
+
+ - All directives support ``box-decoration-break`` to be set to ``slice``.
+
+ .. versionchanged:: 6.2.0
+
+ Formerly, only :rst:dir:`code-block` did. The default remains
+ ``clone`` for all other directives, but this will probably change at
+ 7.0.0.
+
+ - The corners of rounded boxes may be elliptical.
+
+ .. versionchanged:: 6.2.0
+
+ Formerly, only circular rounded corners were supported and a rounded
+ corner forced the whole frame to use the same constant width from
+ ``<prefix>_border-width``.
+
+ - Inset shadows are incompatible with rounded corners. In case
+ both are specified the inset shadow will simply be ignored.
+
+ .. versionchanged:: 6.2.0
+
+ Formerly it was to the contrary the rounded corners which were ignored
+ in case an inset shadow was specified.
+
+ - ``<prefix>_TeXcolor`` and ``<prefix>_TeXextras`` are new with 6.2.0.
+
+ Usefulness is doubtful in the case of :rst:dir:`code-block`:
+
+ - ``pre_TeXcolor`` will influence only the few non-Pygments highlighted
+ tokens; it does color the line numbers, but if one wants to color
+ *only* them one has to go through the ``fancyvrb`` interface.
+
+ - ``pre_TeXextras=\footnotesize`` for example may be replaced by usage of
+ the :confval:`latex_elements` key ``'fvset'``. For ``'lualatex'`` or
+ ``'xelatex'`` Sphinx includes in the preamble already
+ ``\fvset{fontsize=\small}`` and this induces ``fancyvrb`` into
+ overriding a ``\footnotesize`` coming from ``pre_TeXextras``. One has
+ to use ``pre_TeXextras=\fvset{fontsize=\footnotesize}`` syntax.
+ Simpler to set directly the :confval:`latex_elements` key
+ ``'fvset'``...
+
+ Consider these options experimental and that some implementation details
+ may change. For example if the ``pre_TeXextras`` LaTeX commands were put
+ by Sphinx in another location it could override the ``'fvset'`` effect,
+ perhaps this is what will be done in a future release.
+
+ - Rounded boxes are done using the pict2e_ interface to some basic PDF
+ graphics operations. If this LaTeX package can not be found the build
+ will proceed and render all boxes with straight corners.
+
+ - Elliptic corners use the ellipse_ LaTeX package which extends pict2e_.
+ If this LaTeX package can not be found rounded corners will be circular
+ arcs (or straight if pict2e_ is not available).
+
+.. _pict2e: https://ctan.org/pkg/pict2e
+.. _ellipse: https://ctan.org/pkg/ellipse
+
+
+The following legacy behavior is currently not customizable:
+
+- For :rst:dir:`code-block`, padding and border-width and shadow (if one adds
+ one) will go into the margin; the code lines remain at the same place
+ independently of the values of the padding and border-width, except for
+ being shifted vertically of course to not overwrite other text due to the
+ width of the border or external shadow.
+
+- For :dudir:`topic` (and contents_) the shadow (if on right) goes into the
+ page margin, but the border and the extra padding are kept within the text
+ area. Same for admonitions.
+
+- The contents_ and :dudir:`topic` directives are governed by the same options
+ with ``div.topic`` prefix: the Sphinx LaTeX mark-up uses for both directives
+ the same ``sphinxShadowBox`` environment which has currently no additional
+ branching, contrarily to the ``sphinxadmonition`` environment which branches
+ according to the admonition directive name, e.g. either to ``sphinxnote``
+ or ``sphinxwarning`` etc...
+
+
+LaTeX macros and environments
+-----------------------------
+
+The "LaTeX package" file :file:`sphinx.sty` loads various components
+providing support macros (aka commands), and environments, which are used in
+the mark-up produced on output from the ``latex`` builder, before conversion
+to ``pdf`` via the LaTeX toolchain. Also the "LaTeX class" files
+:file:`sphinxhowto.cls` and :file:`sphinxmanual.cls` define or customize some
+environments. All of these files can be found in the latex build repertory.
+
+Some of these provide facilities not available from pre-existing LaTeX
+packages and work around LaTeX limitations with lists, table cells, verbatim
+rendering, footnotes, etc...
+
+Others simply define macros with public names to make overwriting their
+defaults easy via user-added contents to the preamble. We will survey most of
+those public names here, but defaults have to be looked at in their respective
+definition files.
+
+.. hint::
+
+ Sphinx LaTeX support code is split across multiple smaller-sized files.
+ Rather than adding code to the preamble via
+ `latex_elements <latex_elements_confval_>`_\ [``'preamble'``] it is
+ also possible to replace entirely one of the component files of Sphinx
+ LaTeX code with a custom version, simply by including a modified copy in
+ the project source and adding the filename to the
+ :confval:`latex_additional_files` list. Check the LaTeX build repertory
+ for the filenames and contents.
+
+.. versionchanged:: 4.0.0
+ split of :file:`sphinx.sty` into multiple smaller units, to facilitate
+ customization of many aspects simultaneously.
+
+.. _latex-macros:
+
+Macros
+~~~~~~
+
+- Text styling commands:
+
+ .. csv-table::
+ :header: Name, ``maps argument #1 to:``
+ :align: left
+ :class: longtable
+ :delim: ;
+
+ ``\sphinxstrong``; ``\textbf{#1}``
+ ``\sphinxcode``; ``\texttt{#1}``
+ ``\sphinxbfcode``; ``\textbf{\sphinxcode{#1}}``
+ ``\sphinxemail``; ``\textsf{#1}``
+ ``\sphinxtablecontinued``; ``\textsf{#1}``
+ ``\sphinxtitleref``; ``\emph{#1}``
+ ``\sphinxmenuselection``; ``\emph{#1}``
+ ``\sphinxguilabel``; ``\emph{#1}``
+ ``\sphinxkeyboard``; ``\sphinxcode{#1}``
+ ``\sphinxaccelerator``; ``\underline{#1}``
+ ``\sphinxcrossref``; ``\emph{#1}``
+ ``\sphinxtermref``; ``\emph{#1}``
+ ``\sphinxsamedocref``; ``\emph{#1}``
+ ``\sphinxparam``; ``\emph{#1}``
+ ``\sphinxtypeparam``; ``\emph{#1}``
+ ``\sphinxoptional``; ``[#1]`` with larger brackets, see source
+
+ .. versionadded:: 1.4.5
+ Use of ``\sphinx`` prefixed macro names to limit possibilities of conflict
+ with LaTeX packages.
+
+ .. versionadded:: 1.8
+ ``\sphinxguilabel``
+
+ .. versionadded:: 3.0
+ ``\sphinxkeyboard``
+
+ .. versionadded:: 6.2.0
+ ``\sphinxparam``, ``\sphinxsamedocref``
+
+ .. versionadded:: 7.1.0
+ ``\sphinxparamcomma`` which defaults to a comma followed by a space and
+ ``\sphinxparamcommaoneperline`` which is used for one-parameter-per-line
+ signatures (see :confval:`maximum_signature_line_length`). It defaults
+ to ``\texttt{,}`` to make these end-of-line separators more distinctive.
+
+ Signatures of Python functions are rendered as ``name<space>(parameters)``
+ or ``name<space>[type parameters]<space>(parameters)`` (see :pep:`695`)
+ where the length of ``<space>`` is set to ``0pt`` by default.
+ This can be changed via ``\setlength{\sphinxsignaturelistskip}{1ex}``
+ for instance.
+
+- More text styling:
+
+ .. csv-table::
+ :header: Name, ``maps argument #1 to:``
+ :align: left
+ :class: longtable
+ :delim: ;
+
+ ``\sphinxstyleindexentry``; ``\texttt{#1}``
+ ``\sphinxstyleindexextra``; ``(\emph{#1})`` (with a space upfront)
+ ``\sphinxstyleindexpageref``; ``, \pageref{#1}``
+ ``\sphinxstyleindexpagemain``; ``\textbf{#1}``
+ ``\sphinxstyleindexlettergroup``; ``{\Large\sffamily#1}\nopagebreak\vspace{1mm}``
+ ``\sphinxstyleindexlettergroupDefault``; check source, too long for here
+ ``\sphinxstyletopictitle``; ``\textbf{#1}\par\medskip``
+ ``\sphinxstylesidebartitle``; ``\textbf{#1}\par\medskip``
+ ``\sphinxstyleothertitle``; ``\textbf{#1}``
+ ``\sphinxstylesidebarsubtitle``; ``~\\\textbf{#1} \smallskip``
+ ``\sphinxstyletheadfamily``; ``\sffamily`` (*this one has no argument*)
+ ``\sphinxstyleemphasis``; ``\emph{#1}``
+ ``\sphinxstyleliteralemphasis``; ``\emph{\sphinxcode{#1}}``
+ ``\sphinxstylestrong``; ``\textbf{#1}``
+ ``\sphinxstyleliteralstrong``; ``\sphinxbfcode{#1}``
+ ``\sphinxstyleabbreviation``; ``\textsc{#1}``
+ ``\sphinxstyleliteralintitle``; ``\sphinxcode{#1}``
+ ``\sphinxstylecodecontinued``; ``{\footnotesize(#1)}}``
+ ``\sphinxstylecodecontinues``; ``{\footnotesize(#1)}}``
+ ``\sphinxstylenotetitle``; ``\sphinxstrong{#1}<space>``
+ ``\sphinxstylehinttitle``; *idem*
+ ``\sphinxstyleimportanttitle``; *idem*
+ ``\sphinxstyletiptitle``; *idem*
+ ``\sphinxstylewarningtitle``; *idem*
+ ``\sphinxstylecautiontitle``; *idem*
+ ``\sphinxstyleattentiontitle``; *idem*
+ ``\sphinxstyledangertitle``; *idem*
+ ``\sphinxstyleerrortitle``; *idem*
+ ``\sphinxstyleseealsotitle``; ``\sphinxstrong{#1}\par\nopagebreak``
+
+ .. versionadded:: 1.5
+ These macros were formerly hard-coded as non customizable ``\texttt``,
+ ``\emph``, etc...
+
+ .. versionadded:: 1.6
+ ``\sphinxstyletheadfamily`` which defaults to ``\sffamily`` and allows
+ multiple paragraphs in header cells of tables.
+
+ .. versionadded:: 1.6.3
+ ``\sphinxstylecodecontinued`` and ``\sphinxstylecodecontinues``.
+
+ .. versionadded:: 1.8
+ ``\sphinxstyleindexlettergroup``, ``\sphinxstyleindexlettergroupDefault``.
+
+ .. versionadded:: 6.2.0
+ ``\sphinxstylenotetitle`` et al. The ``#1`` is the localized name of the
+ directive, with a final colon. Wrap it as ``\sphinxremovefinalcolon{#1}``
+ if this final colon is to be removed. Examples:
+
+ .. code-block:: latex
+
+ \renewcommand\sphinxstylewarningtitle[1]{%
+ \underline{\textbf{\sphinxremovefinalcolon{#1}}}\par
+ }
+ \renewcommand{\sphinxstylenotetitle}[1]{%
+ \textit{\textbf{\sphinxremovefinalcolon{#1}}}\par\nobreak
+ % LaTeX syntax is complex and we would be better off using \hrule.
+ {\parskip0pt\noindent}%
+ \raisebox{1ex}%
+ {\makebox[\linewidth]{\textcolor{sphinxnoteBorderColor}{\dotfill}}}
+ % It is complex to obtain nice vertical spacing for both a paragraph
+ % or a list following up; this set-up is better for a paragraph next.
+ \par\vskip-\parskip
+ }
+
+- ``\sphinxtableofcontents``: A wrapper (defined differently in
+ :file:`sphinxhowto.cls` and in :file:`sphinxmanual.cls`) of standard
+ ``\tableofcontents``. The macro ``\sphinxtableofcontentshook`` is executed
+ during its expansion right before ``\tableofcontents`` itself.
+
+ .. versionchanged:: 1.5
+ Formerly, the meaning of ``\tableofcontents`` was modified by Sphinx.
+
+ .. versionchanged:: 2.0
+ Hard-coded redefinitions of ``\l@section`` and ``\l@subsection`` formerly
+ done during loading of ``'manual'`` docclass are now executed later via
+ ``\sphinxtableofcontentshook``. This macro is also executed by the
+ ``'howto'`` docclass, but defaults to empty with it.
+
+ .. hint::
+
+ If adding to preamble the loading of ``tocloft`` package, also add to
+ preamble ``\renewcommand\sphinxtableofcontentshook{}`` else it will reset
+ ``\l@section`` and ``\l@subsection`` cancelling ``tocloft`` customization.
+
+- ``\sphinxmaketitle``: Used as the default setting of the ``'maketitle'``
+ :confval:`latex_elements` key.
+ Defined in the class files :file:`sphinxmanual.cls` and
+ :file:`sphinxhowto.cls`.
+
+ .. versionchanged:: 1.8.3
+ Formerly, ``\maketitle`` from LaTeX document class was modified by
+ Sphinx.
+
+- ``\sphinxbackoftitlepage``: For ``'manual'`` docclass, and if it is
+ defined, it gets executed at end of ``\sphinxmaketitle``, before the final
+ ``\clearpage``. Use either the ``'maketitle'`` key or the ``'preamble'`` key
+ of :confval:`latex_elements` to add a custom definition of
+ ``\sphinxbackoftitlepage``.
+
+ .. versionadded:: 1.8.3
+
+- ``\sphinxcite``: A wrapper of standard ``\cite`` for citation references.
+
+
+.. _sphinxbox:
+
+The ``\sphinxbox`` command
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 6.2.0
+
+The ``\sphinxbox[key=value,...]{inline text}`` command can be used to "box"
+inline text elements with all the customizability which has been described in
+:ref:`additionalcss`. It is a LaTeX command with one optional argument, which
+is a comma-separated list of key=value pairs, as for :ref:`latexsphinxsetup`.
+Here is the complete list of keys. They don't use any prefix.
+
+- ``border-width``,
+- ``border-top-width``, ``border-right-width``, ``border-bottom-width``,
+ ``border-left-width``,
+- ``padding``,
+- ``padding-top``, ``padding-right``, ``padding-bottom``, ``padding-left``,
+- ``border-radius``,
+- ``border-top-left-radius``, ``border-top-right-radius``,
+ ``border-bottom-right-radius``, ``border-bottom-left-radius``,
+- ``box-shadow``,
+- ``border-TeXcolor``, ``background-TeXcolor``, ``box-shadow-TeXcolor``,
+ ``TeXcolor``,
+- ``TeXextras``,
+- and ``addstrut`` which is a boolean key, i.e. to be used as ``addstrut=true``,
+ or ``addstrut`` alone where ``=true`` is omitted, or ``addstrut=false``.
+
+This last key is specific to ``\sphinxbox`` and it means to add a ``\strut``
+so that heights and depths are equalized across various instances on the same
+line with varying contents. The default is ``addstrut=false``.
+
+.. important::
+
+ Perhaps the default will turn into ``addstrut=true`` at 7.0.0 depending on
+ feedback until then.
+
+The combination ``addstrut, padding-bottom=0pt, padding-top=1pt`` is often
+satisfactory.
+
+Refer to :ref:`additionalcss` for important syntax information regarding the
+other keys. The default
+configuration uses no shadow, a border-width of ``\fboxrule``, a padding of
+``\fboxsep``, circular corners with radii ``\fboxsep`` and background and
+border colors as for the default rendering of code-blocks.
+
+When a ``\sphinxbox`` usage is nested within another one, it will ignore the
+options of the outer one: it first resets all options to their default state
+as they were prior to applying the outer box options, then it applies its own
+specific ones.
+
+One can modify these defaults via the command ``\sphinxboxsetup{key=value,...}``.
+The effect is cumulative, if one uses this command multiple times. Here the
+options are a mandatory argument so are within curly braces, not square
+brackets.
+
+Here is some example of use:
+
+.. code-block:: latex
+
+ latex_elements = {
+ 'preamble': r'''
+ % modify globally the defaults
+ \sphinxboxsetup{border-width=2pt,%
+ border-radius=4pt,%
+ background-TeXcolor=yellow!20}
+ % configure some styling element with some extra specific options:
+ \protected\def\sphinxkeyboard#1{\sphinxbox[border-TeXcolor=green]{\sphinxcode{#1}}}
+ ''',
+ }
+
+A utility ``\newsphinxbox`` is provided to create a new boxing macro, say
+``\foo`` which will act exactly like ``\sphinxbox`` but with a given extra
+configuration:
+
+.. code-block:: latex
+
+ % the specific options to \foo are within brackets
+ \newsphinxbox[border-radius=0pt, box-shadow=2pt 2pt]{\foo}
+ % then use this \foo, possibly with some extra options still:
+ \protected\def\sphinxguilabel#1{\foo{#1}}
+ \protected\def\sphinxmenuselection#1{\foo[box-shadow-TeXcolor=gray]{#1}}
+
+Boxes rendered with ``\foo`` obey as the ones using directly ``\sphinxbox``
+the current configuration as set possibly mid-way in document via
+``\sphinxboxsetup`` (from a :dudir:`raw` LaTeX mark-up), the only difference
+is that they have an initial additional set of default extras.
+
+In the above examples, you can probably use ``\renewcommand`` syntax if you
+prefer it to ``\protected\def`` (with ``[1]`` in place of ``#1`` then).
+
+
+Environments
+~~~~~~~~~~~~
+
+- A :dudir:`figure` may have an optional legend with arbitrary body
+ elements: they are rendered in a ``sphinxlegend`` environment. The default
+ definition issues ``\small``, and ends with ``\par``.
+
+ .. versionadded:: 1.5.6
+ Formerly, the ``\small`` was hardcoded in LaTeX writer and the ending
+ ``\par`` was lacking.
+
+- Environments associated with admonitions:
+
+ - ``sphinxnote``,
+ - ``sphinxhint``,
+ - ``sphinximportant``,
+ - ``sphinxtip``,
+ - ``sphinxwarning``,
+ - ``sphinxcaution``,
+ - ``sphinxattention``,
+ - ``sphinxdanger``,
+ - ``sphinxerror``.
+
+ They may be ``\renewenvironment``
+ 'd individually, and must then be defined with one argument (it is the heading
+ of the notice, for example ``Warning:`` for :dudir:`warning` directive, if
+ English is the document language). Their default definitions use either the
+ *sphinxheavybox* (for the last 5 ones) or the *sphinxlightbox*
+ environments, configured to use the parameters (colors, border thickness)
+ specific to each type, which can be set via ``'sphinxsetup'`` string.
+
+ .. versionchanged:: 1.5
+ Use of public environment names, separate customizability of the
+ parameters, such as ``noteBorderColor``, ``noteborder``,
+ ``warningBgColor``, ``warningBorderColor``, ``warningborder``, ...
+
+- Environment for the :rst:dir:`seealso` directive: ``sphinxseealso``.
+ It takes one argument which will be the localized string ``See also``
+ followed with a colon.
+
+ .. versionadded:: 6.1.0
+ .. versionchanged:: 6.2.0
+
+ Colon made part of the mark-up rather than being inserted by the
+ environment for coherence with how admonitions are handled generally.
+
+- The contents_ directive (with ``:local:`` option) and the
+ :dudir:`topic` directive are implemented by environment ``sphinxShadowBox``.
+
+ .. versionadded:: 1.4.2
+ Former code refactored into an environment allowing page breaks.
+
+ .. versionchanged:: 1.5
+ Options ``shadowsep``, ``shadowsize``, ``shadowrule``.
+
+- The literal blocks (via ``::`` or :rst:dir:`code-block`), are
+ implemented using ``sphinxVerbatim`` environment which is a wrapper of
+ ``Verbatim`` environment from package ``fancyvrb.sty``. It adds the handling
+ of the top caption and the wrapping of long lines, and a frame which allows
+ page breaks. Inside tables the used
+ environment is ``sphinxVerbatimintable`` (it does not draw a frame, but
+ allows a caption).
+
+ .. versionchanged:: 1.5
+ ``Verbatim`` keeps exact same meaning as in ``fancyvrb.sty`` (also
+ under the name ``OriginalVerbatim``); ``sphinxVerbatimintable`` is used
+ inside tables.
+
+ .. versionadded:: 1.5
+ Options ``verbatimwithframe``, ``verbatimwrapslines``,
+ ``verbatimsep``, ``verbatimborder``.
+
+ .. versionadded:: 1.6.6
+ Support for ``:emphasize-lines:`` option
+
+ .. versionadded:: 1.6.6
+ Easier customizability of the formatting via exposed to user LaTeX macros
+ such as ``\sphinxVerbatimHighlightLine``.
+
+- The bibliography uses ``sphinxthebibliography`` and the Python Module index
+ as well as the general index both use ``sphinxtheindex``; these environments
+ are wrappers of the ``thebibliography`` and respectively ``theindex``
+ environments as provided by the document class (or packages).
+
+ .. versionchanged:: 1.5
+ Formerly, the original environments were modified by Sphinx.
+
+Miscellany
+~~~~~~~~~~
+
+- Every text paragraph in document body starts with ``\sphinxAtStartPar``.
+ Currently, this is used to insert a zero width horizontal skip which
+ is a trick to allow TeX hyphenation of the first word of a paragraph
+ in a narrow context (like a table cell). For ``'lualatex'`` which
+ does not need the trick, the ``\sphinxAtStartPar`` does nothing.
+
+ .. versionadded:: 3.5.0
+
+- The section, subsection, ... headings are set using *titlesec*'s
+ ``\titleformat`` command.
+
+- For the ``'manual'`` docclass, the chapter headings can be customized using
+ *fncychap*'s commands ``\ChNameVar``, ``\ChNumVar``, ``\ChTitleVar``. File
+ :file:`sphinx.sty` has custom re-definitions in case of *fncychap*
+ option ``Bjarne``.
+
+ .. versionchanged:: 1.5
+ Formerly, use of *fncychap* with other styles than ``Bjarne`` was
+ dysfunctional.
+
+.. _latexcontainer:
+
+- Docutils :dudir:`container` directives are supported in LaTeX output: to
+ let a container class with name ``foo`` influence the final PDF via LaTeX,
+ it is only needed to define in the preamble an environment
+ ``sphinxclassfoo``. A simple example would be:
+
+ .. code-block:: latex
+
+ \newenvironment{sphinxclassred}{\color{red}}{}
+
+ Currently the class names must contain only ascii characters and avoid
+ characters special to LaTeX such as ``\``.
+
+ .. versionadded:: 4.1.0
+
+.. hint::
+
+ As an experimental feature, Sphinx can use user-defined template file for
+ LaTeX source if you have a file named ``_templates/latex.tex_t`` in your
+ project.
+
+ Additional files ``longtable.tex_t``, ``tabulary.tex_t`` and
+ ``tabular.tex_t`` can be added to ``_templates/`` to configure some aspects
+ of table rendering (such as the caption position).
+
+ .. versionadded:: 1.6
+ currently all template variables are unstable and undocumented.
+
+.. raw:: latex
+
+ \endgroup
diff --git a/doc/make.bat b/doc/make.bat
new file mode 100644
index 0000000..e2bd7ea
--- /dev/null
+++ b/doc/make.bat
@@ -0,0 +1,32 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=python ../sphinx/cmd/build.py
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+
+:end
diff --git a/doc/man/index.rst b/doc/man/index.rst
new file mode 100644
index 0000000..1468022
--- /dev/null
+++ b/doc/man/index.rst
@@ -0,0 +1,22 @@
+Command-Line Tools
+==================
+
+These are the applications provided as part of Sphinx.
+
+Core Applications
+-----------------
+
+.. toctree::
+ :maxdepth: 3
+
+ sphinx-quickstart
+ sphinx-build
+
+Additional Applications
+-----------------------
+
+.. toctree::
+ :maxdepth: 3
+
+ sphinx-apidoc
+ sphinx-autogen
diff --git a/doc/man/sphinx-apidoc.rst b/doc/man/sphinx-apidoc.rst
new file mode 100644
index 0000000..efc8230
--- /dev/null
+++ b/doc/man/sphinx-apidoc.rst
@@ -0,0 +1,171 @@
+sphinx-apidoc
+=============
+
+Synopsis
+--------
+
+**sphinx-apidoc** [*OPTIONS*] -o <*OUTPUT_PATH*> <*MODULE_PATH*>
+[*EXCLUDE_PATTERN* ...]
+
+Description
+-----------
+
+:program:`sphinx-apidoc` is a tool for automatic generation of Sphinx sources
+that, using the :py:mod:`~sphinx.ext.autodoc` extension, document a whole
+package in the style of other automatic API documentation tools.
+
+*MODULE_PATH* is the path to a Python package to document, and *OUTPUT_PATH* is
+the directory where the generated sources are placed. Any *EXCLUDE_PATTERN*\s
+given are `fnmatch-style`_ file and/or directory patterns that will be excluded
+from generation.
+
+.. _fnmatch-style: https://docs.python.org/3/library/fnmatch.html
+
+.. warning::
+
+ ``sphinx-apidoc`` generates source files that use :mod:`sphinx.ext.autodoc`
+ to document all found modules. If any modules have side effects on import,
+ these will be executed by ``autodoc`` when ``sphinx-build`` is run.
+
+ If you document scripts (as opposed to library modules), make sure their main
+ routine is protected by a ``if __name__ == '__main__'`` condition.
+
+Options
+-------
+
+.. program:: sphinx-apidoc
+
+.. option:: -o <OUTPUT_PATH>
+
+ Directory to place the output files. If it does not exist, it is created.
+
+.. option:: -q
+
+ Do not output anything on standard output, only write warnings and errors to
+ standard error.
+
+.. option:: -f, --force
+
+ Force overwriting of any existing generated files.
+
+.. option:: -l, --follow-links
+
+ Follow symbolic links. Defaults to ``False``.
+
+.. option:: -n, --dry-run
+
+ Do not create any files.
+
+.. option:: -s <suffix>
+
+ Suffix for the source files generated. Defaults to ``rst``.
+
+.. option:: -d <MAXDEPTH>
+
+ Maximum depth for the generated table of contents file. Defaults to ``4``.
+
+.. option:: --tocfile
+
+ Filename for a table of contents file. Defaults to ``modules``.
+
+.. option:: -T, --no-toc
+
+ Do not create a table of contents file. Ignored when :option:`--full` is
+ provided.
+
+.. option:: -F, --full
+
+ Generate a full Sphinx project (``conf.py``, ``Makefile`` etc.) using
+ the same mechanism as :program:`sphinx-quickstart`.
+
+.. option:: -e, --separate
+
+ Put documentation for each module on its own page.
+
+ .. versionadded:: 1.2
+
+.. option:: -E, --no-headings
+
+ Do not create headings for the modules/packages. This is useful, for
+ example, when docstrings already contain headings.
+
+.. option:: -P, --private
+
+ Include "_private" modules.
+
+ .. versionadded:: 1.2
+
+.. option:: --implicit-namespaces
+
+ By default sphinx-apidoc processes sys.path searching for modules only.
+ Python 3.3 introduced :pep:`420` implicit namespaces that allow module path
+ structures such as ``foo/bar/module.py`` or ``foo/bar/baz/__init__.py``
+ (notice that ``bar`` and ``foo`` are namespaces, not modules).
+
+ Interpret paths recursively according to PEP-0420.
+
+.. option:: -M, --module-first
+
+ Put module documentation before submodule documentation.
+
+These options are used when :option:`--full` is specified:
+
+.. option:: -a
+
+ Append module_path to sys.path.
+
+.. 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`).
+
+.. rubric:: Project templating
+
+.. versionadded:: 2.2
+ Project templating options for sphinx-apidoc
+
+.. option:: -t, --templatedir=TEMPLATEDIR
+
+ Template directory for template files. You can modify the templates of
+ sphinx project files generated by apidoc. Following Jinja2 template
+ files are allowed:
+
+ * ``module.rst_t``
+ * ``package.rst_t``
+ * ``toc.rst_t``
+ * ``root_doc.rst_t``
+ * ``conf.py_t``
+ * ``Makefile_t``
+ * ``Makefile.new_t``
+ * ``make.bat_t``
+ * ``make.bat.new_t``
+
+ In detail, please refer the system template files Sphinx provides.
+ (``sphinx/templates/apidoc`` and ``sphinx/templates/quickstart``)
+
+Environment
+-----------
+
+.. envvar:: SPHINX_APIDOC_OPTIONS
+
+ A comma-separated list of option to append to generated ``automodule``
+ directives. Defaults to ``members,undoc-members,show-inheritance``.
+
+See also
+--------
+
+:manpage:`sphinx-build(1)`, :manpage:`sphinx-autogen(1)`
+
+.. _fnmatch: https://docs.python.org/3/library/fnmatch.html
diff --git a/doc/man/sphinx-autogen.rst b/doc/man/sphinx-autogen.rst
new file mode 100644
index 0000000..caeb44b
--- /dev/null
+++ b/doc/man/sphinx-autogen.rst
@@ -0,0 +1,97 @@
+sphinx-autogen
+==============
+
+Synopsis
+--------
+
+**sphinx-autogen** [*options*] <sourcefile> ...
+
+Description
+-----------
+
+:program:`sphinx-autogen` is a tool for automatic generation of Sphinx sources
+that, using the :py:mod:`~sphinx.ext.autodoc` extension, document items included
+in :rst:dir:`autosummary` listing(s).
+
+*sourcefile* is the path to one or more reStructuredText documents containing
+:rst:dir:`autosummary` entries with the ``:toctree::`` option set. *sourcefile*
+can be an :py:mod:`fnmatch`-style pattern.
+
+Options
+-------
+
+.. program:: sphinx-autogen
+
+.. option:: -o <outputdir>
+
+ Directory to place the output file. If it does not exist, it is created.
+ Defaults to the value passed to the ``:toctree:`` option.
+
+.. option:: -s <suffix>, --suffix <suffix>
+
+ Default suffix to use for generated files. Defaults to ``rst``.
+
+.. option:: -t <templates>, --templates <templates>
+
+ Custom template directory. Defaults to ``None``.
+
+.. option:: -i, --imported-members
+
+ Document imported members.
+
+.. option:: -a, --respect-module-all
+
+ Document exactly the members in a module's ``__all__`` attribute.
+
+Example
+-------
+
+Given the following directory structure::
+
+ docs
+ ├── index.rst
+ └── ...
+ foobar
+ ├── foo
+ │ └── __init__.py
+ └── bar
+ ├── __init__.py
+ └── baz
+ └── __init__.py
+
+and assuming ``docs/index.rst`` contained the following:
+
+.. code-block:: rst
+
+ Modules
+ =======
+
+ .. autosummary::
+ :toctree: modules
+
+ foobar.foo
+ foobar.bar
+ foobar.bar.baz
+
+If you run the following:
+
+.. code-block:: console
+
+ $ PYTHONPATH=. sphinx-autogen docs/index.rst
+
+then the following stub files will be created in ``docs``::
+
+ docs
+ ├── index.rst
+ └── modules
+ ├── foobar.bar.rst
+ ├── foobar.bar.baz.rst
+ └── foobar.foo.rst
+
+and each of those files will contain a :py:mod:`~sphinx.ext.autodoc` directive
+and some other information.
+
+See also
+--------
+
+:manpage:`sphinx-build(1)`, :manpage:`sphinx-apidoc(1)`
diff --git a/doc/man/sphinx-build.rst b/doc/man/sphinx-build.rst
new file mode 100644
index 0000000..a1fb9be
--- /dev/null
+++ b/doc/man/sphinx-build.rst
@@ -0,0 +1,355 @@
+sphinx-build
+============
+
+Synopsis
+--------
+
+**sphinx-build** [*options*] <*sourcedir*> <*outputdir*> [*filenames* ...]
+
+Description
+-----------
+
+:program:`sphinx-build` generates documentation from the files in
+``<sourcedir>`` and places it in the ``<outputdir>``.
+
+:program:`sphinx-build` looks for ``<sourcedir>/conf.py`` for the configuration
+settings. :manpage:`sphinx-quickstart(1)` may be used to generate template
+files, including ``conf.py``.
+
+:program:`sphinx-build` can create documentation in different formats. A
+format is selected by specifying the builder name on the command line; it
+defaults to HTML. Builders can also perform other tasks related to
+documentation processing. For a list of available builders, refer to
+:option:`sphinx-build -b`.
+
+By default, everything that is outdated is built. Output only for selected
+files can be built by specifying individual filenames.
+
+Options
+-------
+
+.. program:: sphinx-build
+
+.. option:: -b buildername
+
+ The most important option: it selects a builder. The most common builders
+ are:
+
+ **html**
+ Build HTML pages. This is the default builder.
+
+ **dirhtml**
+ Build HTML pages, but with a single directory per document. Makes for
+ prettier URLs (no ``.html``) if served from a webserver.
+
+ **singlehtml**
+ Build a single HTML with the whole content.
+
+ **htmlhelp**, **qthelp**, **devhelp**, **epub**
+ Build HTML files with additional information for building a documentation
+ collection in one of these formats.
+
+ **applehelp**
+ Build an Apple Help Book. Requires :program:`hiutil` and
+ :program:`codesign`, which are not Open Source and presently only
+ available on Mac OS X 10.6 and higher.
+
+ **latex**
+ Build LaTeX sources that can be compiled to a PDF document using
+ :program:`pdflatex`.
+
+ **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.
+
+ **linkcheck**
+ Check the integrity of all external links.
+
+ **xml**
+ Build Docutils-native XML files.
+
+ **pseudoxml**
+ Build compact pretty-printed "pseudo-XML" files displaying the
+ internal structure of the intermediate document trees.
+
+ See :doc:`/usage/builders/index` for a list of all builders shipped with
+ Sphinx. Extensions can add their own builders.
+
+.. _make_mode:
+
+.. option:: -M buildername
+
+ Alternative to :option:`-b`. Uses the Sphinx :program:`make_mode` module,
+ which provides the same build functionality as a default :ref:`Makefile or
+ Make.bat <makefile_options>`. In addition to all Sphinx
+ :doc:`/usage/builders/index`, the following build pipelines are available:
+
+ **latexpdf**
+ Build LaTeX files and run them through :program:`pdflatex`, or as per
+ :confval:`latex_engine` setting.
+ If :confval:`language` is set to ``'ja'``, will use automatically
+ the :program:`platex/dvipdfmx` latex to PDF pipeline.
+
+ **info**
+ Build Texinfo files and run them through :program:`makeinfo`.
+
+ .. important::
+ Sphinx only recognizes the ``-M`` option if it is placed first.
+
+ .. versionadded:: 1.2.1
+
+.. option:: -a
+
+ If given, always write all output files. The default is to only write output
+ files for new and changed source files. (This may not apply to all
+ builders.)
+
+.. option:: -E
+
+ Don't use a saved :term:`environment` (the structure caching all
+ cross-references), but rebuild it completely. The default is to only read
+ and parse source files that are new or have changed since the last run.
+
+.. option:: -t tag
+
+ Define the tag *tag*. This is relevant for :rst:dir:`only` directives that
+ only include their content if this tag is set.
+
+ .. versionadded:: 0.6
+
+.. option:: -d path
+
+ Since Sphinx has to read and parse all source files before it can write an
+ output file, the parsed source files are cached as "doctree pickles".
+ Normally, these files are put in a directory called :file:`.doctrees` under
+ the build directory; with this option you can select a different cache
+ directory (the doctrees can be shared between all builders).
+
+.. option:: -j N, --jobs N
+
+ Distribute the build over *N* processes in parallel, to make building on
+ multiprocessor machines more effective. Note that not all parts and not all
+ builders of Sphinx can be parallelized. If ``auto`` argument is given,
+ Sphinx uses the number of CPUs as *N*.
+
+ .. versionadded:: 1.2
+ This option should be considered *experimental*.
+
+ .. versionchanged:: 1.7
+ Support ``auto`` argument.
+
+ .. versionchanged:: 6.2
+ Add ``--jobs`` long option.
+
+.. option:: -c path
+
+ Don't look for the :file:`conf.py` in the source directory, but use the given
+ configuration directory instead. Note that various other files and paths
+ given by configuration values are expected to be relative to the
+ configuration directory, so they will have to be present at this location
+ too.
+
+ .. versionadded:: 0.3
+
+.. option:: -C
+
+ Don't look for a configuration file; only take options via the ``-D`` option.
+
+ .. versionadded:: 0.5
+
+.. option:: -D setting=value
+
+ Override a configuration value set in the :file:`conf.py` file. The value
+ must be a number, string, list or dictionary value.
+
+ For lists, you can separate elements with a comma like this: ``-D
+ html_theme_path=path1,path2``.
+
+ For dictionary values, supply the setting name and key like this:
+ ``-D latex_elements.docclass=scrartcl``.
+
+ For boolean values, use ``0`` or ``1`` as the value.
+
+ .. versionchanged:: 0.6
+ The value can now be a dictionary value.
+
+ .. versionchanged:: 1.3
+ The value can now also be a list value.
+
+.. option:: -A name=value
+
+ Make the *name* assigned to *value* in the HTML templates.
+
+ .. versionadded:: 0.5
+
+.. option:: -n
+
+ Run in nit-picky mode. Currently, this generates warnings for all missing
+ references. See the config value :confval:`nitpick_ignore` for a way to
+ exclude some references as "known missing".
+
+.. option:: -N, --no-color
+
+ Do not emit colored output.
+
+ .. versionchanged:: 1.6
+ Add ``--no-color`` long option.
+
+.. option:: --color
+
+ Emit colored output. Auto-detected by default.
+
+ .. versionadded:: 1.6
+
+.. option:: -v
+
+ Increase verbosity (loglevel). This option can be given up to three times
+ to get more debug logging output. It implies :option:`-T`.
+
+ .. versionadded:: 1.2
+
+.. option:: -q
+
+ Do not output anything on standard output, only write warnings and errors to
+ standard error.
+
+.. option:: -Q
+
+ Do not output anything on standard output, also suppress warnings. Only
+ errors are written to standard error.
+
+.. option:: -w file
+
+ Write warnings (and errors) to the given file, in addition to standard error.
+
+.. option:: -W
+
+ Turn warnings into errors. This means that the build stops at the first
+ warning and ``sphinx-build`` exits with exit status 1.
+
+.. option:: --keep-going
+
+ With -W option, keep going processing when getting warnings to the end
+ of build, and ``sphinx-build`` exits with exit status 1.
+
+ .. versionadded:: 1.8
+
+.. option:: -T
+
+ Display the full traceback when an unhandled exception occurs. Otherwise,
+ only a summary is displayed and the traceback information is saved to a file
+ for further analysis.
+
+ .. versionadded:: 1.2
+
+.. option:: -P
+
+ (Useful for debugging only.) Run the Python debugger, :mod:`pdb`, if an
+ unhandled exception occurs while building.
+
+.. option:: -h, --help, --version
+
+ Display usage summary or Sphinx version.
+
+ .. versionadded:: 1.2
+
+You can also give one or more filenames on the command line after the source
+and build directories. Sphinx will then try to build only these output files
+(and their dependencies).
+
+Environment Variables
+---------------------
+
+The :program:`sphinx-build` refers following environment variables:
+
+.. describe:: MAKE
+
+ A path to make command. A command name is also allowed.
+ :program:`sphinx-build` uses it to invoke sub-build process on make-mode.
+
+.. _makefile_options:
+
+.. rubric:: Makefile Options
+
+The :file:`Makefile` and :file:`make.bat` files created by
+:program:`sphinx-quickstart` usually run :program:`sphinx-build` only with the
+:option:`-b` and :option:`-d` options. However, they support the following
+variables to customize behavior:
+
+.. describe:: PAPER
+
+ This sets the ``'papersize'`` key of :confval:`latex_elements`:
+ i.e. ``PAPER=a4`` sets it to ``'a4paper'`` and ``PAPER=letter`` to
+ ``'letterpaper'``.
+
+ .. note::
+
+ Usage of this environment variable got broken at Sphinx 1.5 as
+ ``a4`` or ``letter`` ended up as option to LaTeX document in
+ place of the needed ``a4paper``, resp. ``letterpaper``. Fixed at
+ 1.7.7.
+
+.. describe:: SPHINXBUILD
+
+ The command to use instead of ``sphinx-build``.
+
+.. describe:: BUILDDIR
+
+ The build directory to use instead of the one chosen in
+ :program:`sphinx-quickstart`.
+
+.. describe:: SPHINXOPTS
+
+ Additional options for :program:`sphinx-build`. These options can
+ also be set via the shortcut variable **O** (capital 'o').
+
+.. describe:: NO_COLOR
+
+ When set (regardless of value), :program:`sphinx-build` will not use color
+ in terminal output. ``NO_COLOR`` takes precedence over ``FORCE_COLOR``. See
+ `no-color.org <https://no-color.org/>`__ for other libraries supporting this
+ community standard.
+
+ .. versionadded:: 4.5.0
+
+.. describe:: FORCE_COLOR
+
+ When set (regardless of value), :program:`sphinx-build` will use color in
+ terminal output. ``NO_COLOR`` takes precedence over ``FORCE_COLOR``.
+
+ .. versionadded:: 4.5.0
+
+.. _when-deprecation-warnings-are-displayed:
+
+Deprecation Warnings
+--------------------
+
+If any deprecation warning like ``RemovedInSphinxXXXWarning`` are displayed
+when building a user's document, some Sphinx extension is using deprecated
+features. In that case, please report it to author of the extension.
+
+To disable the deprecation warnings, please set ``PYTHONWARNINGS=`` environment
+variable to your environment. For example:
+
+* ``PYTHONWARNINGS= make html`` (Linux/Mac)
+* ``export PYTHONWARNINGS=`` and do ``make html`` (Linux/Mac)
+* ``set PYTHONWARNINGS=`` and do ``make html`` (Windows)
+* modify your Makefile/make.bat and set the environment variable
+
+See also
+--------
+
+:manpage:`sphinx-quickstart(1)`
diff --git a/doc/man/sphinx-quickstart.rst b/doc/man/sphinx-quickstart.rst
new file mode 100644
index 0000000..d050a29
--- /dev/null
+++ b/doc/man/sphinx-quickstart.rst
@@ -0,0 +1,169 @@
+sphinx-quickstart
+=================
+
+Synopsis
+--------
+
+**sphinx-quickstart**
+
+Description
+-----------
+
+:program:`sphinx-quickstart` is an interactive tool that asks some questions
+about your project and then generates a complete documentation directory and
+sample Makefile to be used with :manpage:`sphinx-build(1)`.
+
+Options
+-------
+
+.. program:: sphinx-quickstart
+
+.. option:: -q, --quiet
+
+ Quiet mode that skips the interactive wizard for specifying options.
+ This option requires `-p`, `-a` and `-v` options.
+
+.. option:: -h, --help, --version
+
+ Display usage summary or Sphinx version.
+
+.. rubric:: Structure Options
+
+.. option:: --sep
+
+ If specified, separate source and build directories.
+
+.. option:: --no-sep
+
+ If specified, create build directory under source directory.
+
+.. option:: --dot=DOT
+
+ 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.
+
+.. rubric:: Project Basic Options
+
+.. option:: -p PROJECT, --project=PROJECT
+
+ Project name will be set. (see :confval:`project`).
+
+.. option:: -a AUTHOR, --author=AUTHOR
+
+ Author names. (see :confval:`copyright`).
+
+.. option:: -v VERSION
+
+ Version of project. (see :confval:`version`).
+
+.. option:: -r RELEASE, --release=RELEASE
+
+ Release of project. (see :confval:`release`).
+
+.. option:: -l LANGUAGE, --language=LANGUAGE
+
+ Document language. (see :confval:`language`).
+
+.. option:: --suffix=SUFFIX
+
+ Source file suffix. (see :confval:`source_suffix`).
+
+.. option:: --master=MASTER
+
+ Master document name. (see :confval:`root_doc`).
+
+.. rubric:: Extension Options
+
+.. option:: --ext-autodoc
+
+ Enable :py:mod:`sphinx.ext.autodoc` extension.
+
+.. option:: --ext-doctest
+
+ Enable `sphinx.ext.doctest` extension.
+
+.. option:: --ext-intersphinx
+
+ Enable `sphinx.ext.intersphinx` extension.
+
+.. option:: --ext-todo
+
+ Enable `sphinx.ext.todo` extension.
+
+.. option:: --ext-coverage
+
+ Enable `sphinx.ext.coverage` extension.
+
+.. option:: --ext-imgmath
+
+ Enable `sphinx.ext.imgmath` extension.
+
+.. option:: --ext-mathjax
+
+ Enable `sphinx.ext.mathjax` extension.
+
+.. option:: --ext-ifconfig
+
+ Enable `sphinx.ext.ifconfig` extension.
+
+.. option:: --ext-viewcode
+
+ Enable `sphinx.ext.viewcode` extension.
+
+.. option:: --ext-githubpages
+
+ Enable `sphinx.ext.githubpages` extension.
+
+.. option:: --extensions=EXTENSIONS
+
+ Enable arbitrary extensions.
+
+.. rubric:: Makefile and Batchfile Creation Options
+
+.. option:: --use-make-mode (-m), --no-use-make-mode (-M)
+
+ :file:`Makefile/make.bat` uses (or doesn't use) :ref:`make-mode <make_mode>`.
+ Default is ``use``, which generates a more concise :file:`Makefile/make.bat`.
+
+ .. versionchanged:: 1.5
+ make-mode is default.
+
+.. option:: --makefile, --no-makefile
+
+ Create (or not create) makefile.
+
+.. option:: --batchfile, --no-batchfile
+
+ Create (or not create) batchfile
+
+.. rubric:: Project templating
+
+.. versionadded:: 1.5
+ Project templating options for sphinx-quickstart
+
+.. option:: -t, --templatedir=TEMPLATEDIR
+
+ Template directory for template files. You can modify the templates of
+ sphinx project files generated by quickstart. Following Jinja2 template
+ files are allowed:
+
+ * ``root_doc.rst_t``
+ * ``conf.py_t``
+ * ``Makefile_t``
+ * ``Makefile.new_t``
+ * ``make.bat_t``
+ * ``make.bat.new_t``
+
+ In detail, please refer the system template files Sphinx provides.
+ (``sphinx/templates/quickstart``)
+
+.. option:: -d NAME=VALUE
+
+ Define a template variable
+
+See also
+--------
+
+:manpage:`sphinx-build(1)`
diff --git a/doc/support.rst b/doc/support.rst
new file mode 100644
index 0000000..b7c6f01
--- /dev/null
+++ b/doc/support.rst
@@ -0,0 +1,20 @@
+Get support
+===========
+
+For questions or to report problems with Sphinx, join the `sphinx-users`_
+mailing list on Google Groups, come to the ``#sphinx-doc`` channel on
+`libera.chat`_, or open an issue at the tracker_.
+
+.. _sphinx-users: https://groups.google.com/group/sphinx-users
+.. _libera.chat: https://web.libera.chat/?channel=#sphinx-doc
+.. _tracker: https://github.com/sphinx-doc/sphinx/issues
+
+Examples of other projects using Sphinx can be found in the :doc:`examples page
+<examples>`. A useful tutorial_ has been written by the matplotlib developers.
+
+.. _tutorial: http://matplotlib.sourceforge.net/sampledoc/
+
+There is a translation team in Transifex_ of this documentation, thanks to the
+Sphinx document translators.
+
+.. _Transifex: https://www.transifex.com/sphinx-doc/sphinx-doc/dashboard/
diff --git a/doc/tutorial/automatic-doc-generation.rst b/doc/tutorial/automatic-doc-generation.rst
new file mode 100644
index 0000000..b47673d
--- /dev/null
+++ b/doc/tutorial/automatic-doc-generation.rst
@@ -0,0 +1,165 @@
+Automatic documentation generation from code
+============================================
+
+In the :ref:`previous section <tutorial-describing-objects>` of the tutorial
+you manually documented a Python function in Sphinx. However, the description
+was out of sync with the code itself, since the function signature was not
+the same. Besides, it would be nice to reuse :pep:`Python docstrings
+<257#what-is-a-docstring>` in the documentation, rather than having to write
+the information in two places.
+
+Fortunately, :doc:`the autodoc extension </usage/extensions/autodoc>` provides this
+functionality.
+
+Reusing signatures and docstrings with autodoc
+----------------------------------------------
+
+To use autodoc, first add it to the list of enabled extensions:
+
+.. code-block:: python
+ :caption: docs/source/conf.py
+ :emphasize-lines: 4
+
+ extensions = [
+ 'sphinx.ext.duration',
+ 'sphinx.ext.doctest',
+ 'sphinx.ext.autodoc',
+ ]
+
+Next, move the content of the ``.. py:function`` directive to the function
+docstring in the original Python file, as follows:
+
+.. code-block:: python
+ :caption: lumache.py
+ :emphasize-lines: 2-11
+
+ def get_random_ingredients(kind=None):
+ """
+ Return a list of random ingredients as strings.
+
+ :param kind: Optional "kind" of ingredients.
+ :type kind: list[str] or None
+ :raise lumache.InvalidKindError: If the kind is invalid.
+ :return: The ingredients list.
+ :rtype: list[str]
+
+ """
+ return ["shells", "gorgonzola", "parsley"]
+
+Finally, replace the ``.. py:function`` directive from the Sphinx documentation
+with :rst:dir:`autofunction`:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+ :emphasize-lines: 3
+
+ you can use the ``lumache.get_random_ingredients()`` function:
+
+ .. autofunction:: lumache.get_random_ingredients
+
+If you now build the HTML documentation, the output will be the same!
+With the advantage that it is generated from the code itself.
+Sphinx took the reStructuredText from the docstring and included it,
+also generating proper cross-references.
+
+You can also autogenerate documentation from other objects. For example, add
+the code for the ``InvalidKindError`` exception:
+
+.. code-block:: python
+ :caption: lumache.py
+
+ class InvalidKindError(Exception):
+ """Raised if the kind is invalid."""
+ pass
+
+And replace the ``.. py:exception`` directive with :rst:dir:`autoexception`
+as follows:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+ :emphasize-lines: 4
+
+ or ``"veggies"``. Otherwise, :py:func:`lumache.get_random_ingredients`
+ will raise an exception.
+
+ .. autoexception:: lumache.InvalidKindError
+
+And again, after running ``make html``, the output will be the same as before.
+
+Generating comprehensive API references
+---------------------------------------
+
+While using ``sphinx.ext.autodoc`` makes keeping the code and the documentation
+in sync much easier, it still requires you to write an ``auto*`` directive
+for every object you want to document. Sphinx provides yet another level of
+automation: the :doc:`autosummary </usage/extensions/autosummary>` extension.
+
+The :rst:dir:`autosummary` directive generates documents that contain all the
+necessary ``autodoc`` directives. To use it, first enable the autosummary
+extension:
+
+.. code-block:: python
+ :caption: docs/source/conf.py
+ :emphasize-lines: 5
+
+ extensions = [
+ 'sphinx.ext.duration',
+ 'sphinx.ext.doctest',
+ 'sphinx.ext.autodoc',
+ 'sphinx.ext.autosummary',
+ ]
+
+Next, create a new ``api.rst`` file with these contents:
+
+.. code-block:: rst
+ :caption: docs/source/api.rst
+
+ API
+ ===
+
+ .. autosummary::
+ :toctree: generated
+
+ lumache
+
+Remember to include the new document in the root toctree:
+
+.. code-block:: rst
+ :caption: docs/source/index.rst
+ :emphasize-lines: 7
+
+ Contents
+ --------
+
+ .. toctree::
+
+ usage
+ api
+
+Finally, after you build the HTML documentation running ``make html``, it will
+contain two new pages:
+
+- ``api.html``, corresponding to ``docs/source/api.rst`` and containing a table
+ with the objects you included in the ``autosummary`` directive (in this case,
+ only one).
+- ``generated/lumache.html``, corresponding to a newly created reST file
+ ``generated/lumache.rst`` and containing a summary of members of the module,
+ in this case one function and one exception.
+
+.. figure:: /_static/tutorial/lumache-autosummary.png
+ :width: 80%
+ :align: center
+ :alt: Summary page created by autosummary
+
+ Summary page created by autosummary
+
+Each of the links in the summary page will take you to the places where you
+originally used the corresponding ``autodoc`` directive, in this case in the
+``usage.rst`` document.
+
+.. note::
+
+ The generated files are based on `Jinja2
+ templates <https://jinja2docs.readthedocs.io/>`_ that
+ :ref:`can be customized <autosummary-customizing-templates>`,
+ but that is out of scope for this tutorial.
diff --git a/doc/tutorial/deploying.rst b/doc/tutorial/deploying.rst
new file mode 100644
index 0000000..e16abdf
--- /dev/null
+++ b/doc/tutorial/deploying.rst
@@ -0,0 +1,281 @@
+Appendix: Deploying a Sphinx project online
+===========================================
+
+When you are ready to show your documentation project to the world, there are
+many options available to do so. Since the HTML generated by Sphinx is static,
+you can decouple the process of building your HTML documentation from hosting
+such files in the platform of your choice. You will not need a sophisticated
+server running Python: virtually every web hosting service will suffice.
+
+Therefore, the challenge is less how or where to serve the static HTML, but
+rather how to pick a workflow that automatically updates the deployed
+documentation every time there is a change in the source files.
+
+The following sections describe some of the available options to deploy
+your online documentation, and give some background information. If you want
+to go directly to the practical part, you can skip to :ref:`publishing-sources`.
+
+Sphinx-friendly deployment options
+----------------------------------
+
+There are several possible options you have to host your Sphinx documentation.
+Some of them are:
+
+**Read the Docs**
+ `Read the Docs`_ is an online service specialized in hosting technical
+ documentation written in Sphinx, as well as MkDocs. They have a
+ number of extra features, such as versioned documentation, traffic and
+ search analytics, custom domains, user-defined redirects, and more.
+
+**GitHub Pages**
+ `GitHub Pages`_ is a simple static web hosting tightly integrated with
+ `GitHub`_: static HTML is served from one of the branches of a project,
+ and usually sources are stored in another branch so that the output
+ can be updated every time the sources change (for example using `GitHub
+ Actions`_). It is free to use and supports custom domains.
+
+**GitLab Pages**
+ `GitLab Pages`_ is a similar concept to GitHub Pages, integrated with
+ `GitLab`_ and usually automated with `GitLab CI`_ instead.
+
+**Netlify**
+ `Netlify`_ is a sophisticated hosting for static sites enhanced by
+ client-side web technologies like JavaScript (so-called `"Jamstack"`_).
+ They offer support for headless content management systems and
+ serverless computing.
+
+**Your own server**
+ You can always use your own web server to host Sphinx HTML documentation.
+ It is the option that gives more flexibility, but also more complexity.
+
+All these options have zero cost, with the option of paying for extra features.
+
+.. _Read the Docs: https://readthedocs.org/
+.. _GitHub Pages: https://pages.github.com/
+.. _GitHub: https://github.com/
+.. _GitHub Actions: https://github.com/features/actions
+.. _GitLab Pages: https://about.gitlab.com/stages-devops-lifecycle/pages/
+.. _GitLab: https://gitlab.com/
+.. _GitLab CI: https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/
+.. _Netlify: https://www.netlify.com/
+.. _"Jamstack": https://jamstack.org/
+
+Embracing the "Docs as Code" philosophy
+---------------------------------------
+
+The free offerings of most of the options listed above require your
+documentation sources to be publicly available. Moreover, these services
+expect you to use a `Version Control System`_, a technology that tracks the
+evolution of a collection of files as a series of snapshots ("commits").
+The practice of writing documentation in plain text files with the same tools
+as the ones used for software development is commonly known as `"Docs as Code"`_.
+
+The most popular Version Control System nowadays is Git_, a free and open
+source tool that is the backbone of services like GitHub and GitLab.
+Since both Read the Docs and Netlify have integrations with GitHub and GitLab,
+and both GitHub and GitLab have an integrated Pages product, the most effective
+way of automatically build your documentation online is to upload your sources
+to either of these Git hosting services.
+
+.. _Version Control System: https://en.wikipedia.org/wiki/Version_control
+.. _"Docs as Code": https://www.writethedocs.org/guide/docs-as-code/
+.. _Git: https://git-scm.com/
+
+.. _publishing-sources:
+
+Publishing your documentation sources
+-------------------------------------
+
+GitHub
+~~~~~~
+
+The quickest way to upload an existing project to GitHub is to:
+
+1. `Sign up for a GitHub account <https://github.com/signup>`_.
+2. `Create a new repository <https://github.com/new>`_.
+3. Open `the "Upload files" page`_ of your new repository.
+4. Select the files on your operating system file browser (in your case
+ ``README.rst``, ``lumache.py``, the makefiles under the ``docs`` directory,
+ and everything under ``docs/source``) and drag them to the GitHub interface
+ to upload them all.
+5. Click on the :guilabel:`Commit changes` button.
+
+.. _the "Upload files" page: https://docs.github.com/en/repositories/working-with-files/managing-files/adding-a-file-to-a-repository
+
+.. note::
+
+ Make sure you don't upload the ``docs/build`` directory, as it contains the
+ output generated by Sphinx and it will change every time you change the
+ sources, complicating your workflow.
+
+These steps do not require access to the command line or installing any
+additional software. To learn more, you can:
+
+- Follow `this interactive GitHub course`_ to learn more about how the GitHub
+ interface works.
+- Read `this quickstart tutorial`_ to install extra software on your machine
+ and have more flexibility. You can either use the Git command line, or the
+ GitHub Desktop application.
+
+.. _this interactive GitHub course: https://lab.github.com/githubtraining/introduction-to-github
+.. _this quickstart tutorial: https://docs.github.com/en/get-started/quickstart
+
+GitLab
+~~~~~~
+
+Similarly to GitHub, the fastest way to upload your project to GitLab is
+using the web interface:
+
+1. `Sign up for a GitLab account <https://gitlab.com/users/sign_up>`_.
+2. `Create a new blank project <https://gitlab.com/projects/new>`_.
+3. Upload the project files (in your case ``README.rst``, ``lumache.py``, the
+ makefiles under the ``docs`` directory, and everything under
+ ``docs/source``) one by one using the :guilabel:`Upload File` button [#f1]_.
+
+Again, these steps do not require additional software on your computer. To
+learn more, you can:
+
+- Follow `this tutorial`_ to install Git on your machine.
+- Browse the `GitLab User documentation`_ to understand the possibilities of
+ the platform.
+
+.. _this tutorial: https://docs.gitlab.com/ee/gitlab-basics/start-using-git.html
+.. _GitLab User documentation: https://docs.gitlab.com/ee/user/index.html
+
+.. note::
+
+ Make sure you don't upload the ``docs/build`` directory, as it contains the
+ output generated by Sphinx and it will change every time you change the
+ sources, complicating your workflow.
+
+.. [#f1] At the time of writing, `uploading whole directories to GitLab using
+ only the web
+ interface <https://gitlab.com/gitlab-org/gitlab/-/issues/228490>`_ is
+ not yet implemented.
+
+Publishing your HTML documentation
+----------------------------------
+
+Read the Docs
+~~~~~~~~~~~~~
+
+`Read the Docs`_ offers integration with both GitHub and GitLab. The quickest
+way of getting started is to follow :doc:`the RTD
+tutorial <readthedocs:tutorial/index>`, which is loosely based on this one.
+You can publish your sources on GitHub as explained :ref:`in the previous
+section <publishing-sources>`, then skip directly to
+:ref:`readthedocs:tutorial/index:Sign up for Read the Docs`.
+If you choose GitLab instead, the process is similar.
+
+GitHub Pages
+~~~~~~~~~~~~
+
+`GitHub Pages`_ requires you to :ref:`publish your
+sources <publishing-sources>` on `GitHub`_. After that, you will need an
+automated process that performs the ``make html`` step every time the sources
+change. That can be achieved using `GitHub Actions`_.
+
+After you have published your sources on GitHub, create a file named
+``.github/workflows/sphinx.yml`` in your repository with the following
+contents:
+
+.. code-block:: yaml
+ :caption: .github/workflows/
+
+ name: "Sphinx: Render docs"
+
+ on: push
+
+ jobs:
+ build:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ steps:
+ - uses: actions/checkout@v3
+ - name: Build HTML
+ uses: ammaraskar/sphinx-action@master
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: html-docs
+ path: docs/build/html/
+ - name: Deploy
+ uses: peaceiris/actions-gh-pages@v3
+ if: github.ref == 'refs/heads/main'
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: docs/build/html
+
+This contains a GitHub Actions workflow with a single job of four steps:
+
+1. Checkout the code.
+2. Build the HTML documentation using Sphinx.
+3. Attach the HTML output the artifacts to the GitHub Actions job, for easier
+ inspection.
+4. If the change happens on the default branch, take the contents of
+ ``docs/build/html`` and push it to the ``gh-pages`` branch.
+
+Next, you need to specify the dependencies for the ``make html`` step to be
+successful. For that, create a file ``docs/requirements.txt`` and add the
+following contents:
+
+.. code-block::
+ :caption: docs/requirements.txt
+
+ furo==2021.11.16
+
+And finally, you are ready to `enable GitHub Pages on your repository`_. For
+that, go to :guilabel:`Settings`, then :guilabel:`Pages` on the left sidebar,
+select the ``gh-pages`` branch in the "Source" dropdown menu, and click
+:guilabel:`Save`. After a few minutes, you should be able to see your HTML at
+the designated URL.
+
+.. _enable GitHub Pages on your repository: https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site
+
+GitLab Pages
+~~~~~~~~~~~~
+
+`GitLab Pages`_, on the other hand, requires you to :ref:`publish your
+sources <publishing-sources>` on `GitLab`_. When you are ready, you can
+automate the process of running ``make html`` using `GitLab CI`_.
+
+After you have published your sources on GitLab, create a file named
+``.gitlab-ci.yml`` in your repository with these contents:
+
+.. code-block:: yaml
+ :caption: .gitlab-ci.yml
+
+ stages:
+ - deploy
+
+ pages:
+ stage: deploy
+ image: python:3.9-slim
+ before_script:
+ - apt-get update && apt-get install make --no-install-recommends -y
+ - python -m pip install sphinx furo
+ script:
+ - cd docs && make html
+ after_script:
+ - mv docs/build/html/ ./public/
+ artifacts:
+ paths:
+ - public
+ rules:
+ - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
+
+This contains a GitLab CI workflow with one job of several steps:
+
+1. Install the necessary dependencies.
+2. Build the HTML documentation using Sphinx.
+3. Move the output to a known artifacts location.
+
+.. note::
+ You will need to `validate your account`_ by entering a payment method
+ (you will be charged a small amount that will then be reimbursed).
+
+.. _validate your account: https://about.gitlab.com/blog/2021/05/17/prevent-crypto-mining-abuse/#validating-an-account
+
+After that, if the pipeline is successful, you should be able to see your HTML
+at the designated URL.
diff --git a/doc/tutorial/describing-code.rst b/doc/tutorial/describing-code.rst
new file mode 100644
index 0000000..24fea38
--- /dev/null
+++ b/doc/tutorial/describing-code.rst
@@ -0,0 +1,276 @@
+Describing code in Sphinx
+=========================
+
+In the :doc:`previous sections of the tutorial </tutorial/index>` you can read
+how to write narrative or prose documentation in Sphinx. In this section you
+will describe code objects instead.
+
+Sphinx supports documenting code objects in several languages, namely Python,
+C, C++, JavaScript, and reStructuredText. Each of them can be documented using
+a series of directives and roles grouped by
+:doc:`domain </usage/restructuredtext/domains>`. For the remainder of the
+tutorial you will use the Python domain, but all the concepts seen in this
+section apply for the other domains as well.
+
+.. _tutorial-describing-objects:
+
+Python
+------
+
+Documenting Python objects
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Sphinx offers several roles and directives to document Python objects,
+all grouped together in :ref:`the Python domain <python-domain>`. For example,
+you can use the :rst:dir:`py:function` directive to document a Python function,
+as follows:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+
+ Creating recipes
+ ----------------
+
+ To retrieve a list of random ingredients,
+ you can use the ``lumache.get_random_ingredients()`` function:
+
+ .. py:function:: lumache.get_random_ingredients(kind=None)
+
+ Return a list of random ingredients as strings.
+
+ :param kind: Optional "kind" of ingredients.
+ :type kind: list[str] or None
+ :return: The ingredients list.
+ :rtype: list[str]
+
+Which will render like this:
+
+.. figure:: /_static/tutorial/lumache-py-function.png
+ :width: 80%
+ :align: center
+ :alt: HTML result of documenting a Python function in Sphinx
+
+ The rendered result of documenting a Python function in Sphinx
+
+Notice several things:
+
+- Sphinx parsed the argument of the ``.. py:function`` directive and
+ highlighted the module, the function name, and the parameters appropriately.
+- The directive content includes a one-line description of the function,
+ as well as an :ref:`info field list <info-field-lists>` containing the function
+ parameter, its expected type, the return value, and the return type.
+
+.. note::
+
+ The ``py:`` prefix specifies the :term:`domain`. You may configure the
+ default domain so you can omit the prefix, either globally using the
+ :confval:`primary_domain` configuration, or use the
+ :rst:dir:`default-domain` directive to change it from the point it is called
+ until the end of the file.
+ For example, if you set it to ``py`` (the default), you can write
+ ``.. function::`` directly.
+
+Cross-referencing Python objects
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+By default, most of these directives generate entities that can be
+cross-referenced from any part of the documentation by using
+:ref:`a corresponding role <python-roles>`. For the case of functions,
+you can use :rst:role:`py:func` for that, as follows:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+
+ The ``kind`` parameter should be either ``"meat"``, ``"fish"``,
+ or ``"veggies"``. Otherwise, :py:func:`lumache.get_random_ingredients`
+ will raise an exception.
+
+When generating code documentation, Sphinx will generate a
+cross-reference automatically just by using the name of the object,
+without you having to explicitly use a role for that. For example, you
+can describe the custom exception raised by the function using the
+:rst:dir:`py:exception` directive:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+
+ .. py:exception:: lumache.InvalidKindError
+
+ Raised if the kind is invalid.
+
+Then, add this exception to the original description of the function:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+ :emphasize-lines: 7
+
+ .. py:function:: lumache.get_random_ingredients(kind=None)
+
+ Return a list of random ingredients as strings.
+
+ :param kind: Optional "kind" of ingredients.
+ :type kind: list[str] or None
+ :raise lumache.InvalidKindError: If the kind is invalid.
+ :return: The ingredients list.
+ :rtype: list[str]
+
+And finally, this is how the result would look:
+
+.. figure:: /_static/tutorial/lumache-py-function-full.png
+ :width: 80%
+ :align: center
+ :alt: HTML result of documenting a Python function in Sphinx
+ with cross-references
+
+ HTML result of documenting a Python function in Sphinx with cross-references
+
+Beautiful, isn't it?
+
+Including doctests in your documentation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Since you are now describing code from a Python library, it will become useful
+to keep both the documentation and the code as synchronized as possible.
+One of the ways to do that in Sphinx is to include code snippets in the
+documentation, called *doctests*, that are executed when the documentation is
+built.
+
+To demonstrate doctests and other Sphinx features covered in this tutorial,
+Sphinx will need to be able to import the code. To achieve that, write this
+at the beginning of ``conf.py``:
+
+.. code-block:: python
+ :caption: docs/source/conf.py
+ :emphasize-lines: 3-5
+
+ # If extensions (or modules to document with autodoc) are in another directory,
+ # add these directories to sys.path here.
+ import pathlib
+ import sys
+ sys.path.insert(0, pathlib.Path(__file__).parents[2].resolve().as_posix())
+
+.. note::
+
+ An alternative to changing the :py:data:`sys.path` variable is to create a
+ ``pyproject.toml`` file and make the code installable,
+ so it behaves like any other Python library. However, the ``sys.path``
+ approach is simpler.
+
+Then, before adding doctests to your documentation, enable the
+:doc:`doctest </usage/extensions/doctest>` extension in ``conf.py``:
+
+.. code-block:: python
+ :caption: docs/source/conf.py
+ :emphasize-lines: 3
+
+ extensions = [
+ 'sphinx.ext.duration',
+ 'sphinx.ext.doctest',
+ ]
+
+Next, write a doctest block as follows:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+
+ >>> import lumache
+ >>> lumache.get_random_ingredients()
+ ['shells', 'gorgonzola', 'parsley']
+
+Doctests include the Python instructions to be run preceded by ``>>>``,
+the standard Python interpreter prompt, as well as the expected output
+of each instruction. This way, Sphinx can check whether the actual output
+matches the expected one.
+
+To observe how a doctest failure looks like (rather than a code error as
+above), let's write the return value incorrectly first. Therefore, add a
+function ``get_random_ingredients`` like this:
+
+.. code-block:: python
+ :caption: lumache.py
+
+ def get_random_ingredients(kind=None):
+ return ["eggs", "bacon", "spam"]
+
+You can now run ``make doctest`` to execute the doctests of your documentation.
+Initially this will display an error, since the actual code does not behave
+as specified:
+
+.. code-block:: console
+
+ (.venv) $ make doctest
+ Running Sphinx v4.2.0
+ loading pickled environment... done
+ ...
+ running tests...
+
+ Document: usage
+ ---------------
+ **********************************************************************
+ File "usage.rst", line 44, in default
+ Failed example:
+ lumache.get_random_ingredients()
+ Expected:
+ ['shells', 'gorgonzola', 'parsley']
+ Got:
+ ['eggs', 'bacon', 'spam']
+ **********************************************************************
+ ...
+ make: *** [Makefile:20: doctest] Error 1
+
+As you can see, doctest reports the expected and the actual results,
+for easy examination. It is now time to fix the function:
+
+.. code-block:: python
+ :caption: lumache.py
+ :emphasize-lines: 2
+
+ def get_random_ingredients(kind=None):
+ return ["shells", "gorgonzola", "parsley"]
+
+And finally, ``make test`` reports success!
+
+For big projects though, this manual approach can become a bit tedious.
+In the next section, you will see :doc:`how to automate the
+process </tutorial/automatic-doc-generation>`.
+
+Other languages (C, C++, others)
+--------------------------------
+
+Documenting and cross-referencing objects
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Sphinx also supports documenting and cross-referencing objects written in
+other programming languages. There are four additional built-in domains:
+C, C++, JavaScript, and reStructuredText. Third-party extensions may
+define domains for more languages, such as
+
+- `Fortran <https://sphinx-fortran.readthedocs.io>`_,
+- `Julia <http://bastikr.github.io/sphinx-julia>`_, or
+- `PHP <https://github.com/markstory/sphinxcontrib-phpdomain>`_.
+
+For example, to document a C++ type definition, you would use the built-in
+:rst:dir:`cpp:type` directive, as follows:
+
+.. code-block:: rst
+
+ .. cpp:type:: std::vector<int> CustomList
+
+ A typedef-like declaration of a type.
+
+Which would give the following result:
+
+.. cpp:type:: std::vector<int> CustomList
+
+ A typedef-like declaration of a type.
+
+All such directives then generate references that can be
+cross-referenced by using the corresponding role. For example, to reference
+the previous type definition, you can use the :rst:role:`cpp:type` role
+as follows:
+
+.. code-block:: rst
+
+ Cross reference to :cpp:type:`CustomList`.
+
+Which would produce a hyperlink to the previous definition: :cpp:type:`CustomList`.
diff --git a/doc/tutorial/end.rst b/doc/tutorial/end.rst
new file mode 100644
index 0000000..9f35b07
--- /dev/null
+++ b/doc/tutorial/end.rst
@@ -0,0 +1,6 @@
+Where to go from here
+=====================
+
+This tutorial covered the very first steps to create a documentation project
+with Sphinx. To continue learning more about Sphinx, check out the `rest of the
+documentation <../contents.html>`__.
diff --git a/doc/tutorial/first-steps.rst b/doc/tutorial/first-steps.rst
new file mode 100644
index 0000000..fd5c631
--- /dev/null
+++ b/doc/tutorial/first-steps.rst
@@ -0,0 +1,92 @@
+First steps to document your project using Sphinx
+=================================================
+
+Building your HTML documentation
+--------------------------------
+
+The ``index.rst`` file that ``sphinx-quickstart`` created has some content
+already, and it gets rendered as the front page of your HTML documentation. It
+is written in reStructuredText, a powerful markup language.
+
+Modify the file as follows:
+
+.. code-block:: rst
+ :caption: docs/source/index.rst
+
+ Welcome to Lumache's documentation!
+ ===================================
+
+ **Lumache** (/lu'make/) is a Python library for cooks and food lovers that
+ creates recipes mixing random ingredients. It pulls data from the `Open Food
+ Facts database <https://world.openfoodfacts.org/>`_ and offers a *simple* and
+ *intuitive* API.
+
+ .. note::
+
+ This project is under active development.
+
+This showcases several features of the reStructuredText syntax, including:
+
+- a **section header** using ``===`` for the underline,
+- two examples of :ref:`rst-inline-markup`: ``**strong emphasis**`` (typically
+ bold) and ``*emphasis*`` (typically italics),
+- an **inline external link**,
+- and a ``note`` **admonition** (one of the available :ref:`directives
+ <rst-directives>`)
+
+Now to render it with the new content, you can use the ``sphinx-build`` command
+as before, or leverage the convenience script as follows:
+
+.. code-block:: console
+
+ (.venv) $ cd docs
+ (.venv) $ make html
+
+After running this command, you will see that ``index.html`` reflects the new
+changes!
+
+Building your documentation in other formats
+--------------------------------------------
+
+Sphinx supports a variety of formats apart from HTML, including PDF, EPUB,
+:ref:`and more <builders>`. For example, to build your documentation
+in EPUB format, run this command from the ``docs`` directory:
+
+.. code-block:: console
+
+ (.venv) $ make epub
+
+After that, you will see the files corresponding to the e-book under
+``docs/build/epub/``. You can either open ``Lumache.epub`` with an
+EPUB-compatible e-book viewer, like `Calibre <https://calibre-ebook.com/>`_,
+or preview ``index.xhtml`` on a web browser.
+
+.. note::
+
+ To quickly display a complete list of possible output formats, plus some
+ extra useful commands, you can run :code:`make help`.
+
+Each output format has some specific configuration options that you can tune,
+:ref:`including EPUB <epub-options>`. For instance, the default value of
+:confval:`epub_show_urls` is ``inline``, which means that, by default, URLs are
+shown right after the corresponding link, in parentheses. You can change that
+behavior by adding the following code at the end of your ``conf.py``:
+
+.. code-block:: python
+
+ # EPUB options
+ epub_show_urls = 'footnote'
+
+With this configuration value, and after running ``make epub`` again, you will
+notice that URLs appear now as footnotes, which avoids cluttering the text.
+Sweet! Read on to explore :doc:`other ways to customize
+Sphinx </tutorial/more-sphinx-customization>`.
+
+.. note::
+
+ Generating a PDF using Sphinx can be done running ``make latexpdf``,
+ provided that the system has a working LaTeX installation,
+ as explained in the documentation of :class:`sphinx.builders.latex.LaTeXBuilder`.
+ Although this is perfectly feasible, such installations are often big,
+ and in general LaTeX requires careful configuration in some cases,
+ so PDF generation is out of scope for this tutorial.
diff --git a/doc/tutorial/getting-started.rst b/doc/tutorial/getting-started.rst
new file mode 100644
index 0000000..5cf0b38
--- /dev/null
+++ b/doc/tutorial/getting-started.rst
@@ -0,0 +1,120 @@
+Getting started
+===============
+
+Setting up your project and development environment
+---------------------------------------------------
+
+In a new directory, create a file called ``README.rst`` with the following
+content.
+
+.. code-block:: rst
+ :caption: README.rst
+
+ Lumache
+ =======
+
+ **Lumache** (/lu'make/) is a Python library for cooks and food lovers that
+ creates recipes mixing random ingredients.
+
+It is a good moment to create a Python virtual environment and install the
+required tools. For that, open a command line terminal, ``cd`` into the
+directory you just created, and run the following commands:
+
+.. code-block:: console
+
+ $ python -m venv .venv
+ $ source .venv/bin/activate
+ (.venv) $ python -m pip install sphinx
+
+.. note::
+
+ The installation method used above is described in more detail in
+ :ref:`install-pypi`. For the rest of this tutorial, the instructions will
+ assume a Python virtual environment.
+
+If you executed these instructions correctly, you should have the Sphinx command
+line tools available. You can do a basic verification running this command:
+
+.. code-block:: console
+
+ (.venv) $ sphinx-build --version
+ sphinx-build 4.0.2
+
+If you see a similar output, you are on the right path!
+
+Creating the documentation layout
+---------------------------------
+
+Then from the command line, run the following command:
+
+.. code-block:: console
+
+ (.venv) $ sphinx-quickstart docs
+
+This will present to you a series of questions required to create the basic
+directory and configuration layout for your project inside the ``docs`` folder.
+To proceed, answer each question as follows:
+
+- ``> Separate source and build directories (y/n) [n]``: Write "``y``" (without
+ quotes) and press :kbd:`Enter`.
+- ``> Project name``: Write "``Lumache``" (without quotes) and press
+ :kbd:`Enter`.
+- ``> Author name(s)``: Write "``Graziella``" (without quotes) and press
+ :kbd:`Enter`.
+- ``> Project release []``: Write "``0.1``" (without quotes) and press
+ :kbd:`Enter`.
+- ``> Project language [en]``: Leave it empty (the default, English) and press
+ :kbd:`Enter`.
+
+After the last question, you will see the new ``docs`` directory with the
+following content.
+
+.. code-block:: text
+
+ docs
+ ├── build
+ ├── make.bat
+ ├── Makefile
+ └── source
+ ├── conf.py
+ ├── index.rst
+ ├── _static
+ └── _templates
+
+The purpose of each of these files is:
+
+``build/``
+ An empty directory (for now) that will hold the rendered documentation.
+
+``make.bat`` and ``Makefile``
+ Convenience scripts to simplify some common Sphinx operations, such as
+ rendering the content.
+
+``source/conf.py``
+ A Python script holding the configuration of the Sphinx project. It contains
+ the project name and release you specified to ``sphinx-quickstart``, as well
+ as some extra configuration keys.
+
+``source/index.rst``
+ The :term:`root document` of the project, which serves as welcome page and
+ contains the root of the "table of contents tree" (or *toctree*).
+
+Thanks to this bootstrapping step, you already have everything needed to render
+the documentation as HTML for the first time. To do that, run this command:
+
+.. code-block:: console
+
+ (.venv) $ sphinx-build -b html docs/source/ docs/build/html
+
+And finally, open ``docs/build/html/index.html`` in your browser. You should see
+something like this:
+
+.. figure:: /_static/tutorial/lumache-first-light.png
+ :width: 80%
+ :align: center
+ :alt: Freshly created documentation of Lumache
+
+ Freshly created documentation of Lumache
+
+There we go! You created your first HTML documentation using Sphinx.
+Now you can start :doc:`customizing it </tutorial/first-steps>`.
diff --git a/doc/tutorial/index.rst b/doc/tutorial/index.rst
new file mode 100644
index 0000000..d7f4861
--- /dev/null
+++ b/doc/tutorial/index.rst
@@ -0,0 +1,39 @@
+.. _tutorial:
+
+==================================
+Tutorial: Build your first project
+==================================
+
+In this tutorial you will build a simple documentation project using Sphinx, and
+view it in your browser as HTML. The project will include narrative,
+handwritten documentation, as well as autogenerated API documentation.
+
+The tutorial is aimed towards Sphinx newcomers willing to learn the fundamentals
+of how projects are created and structured. You will create a fictional
+software library to generate random food recipes that will serve as a guide
+throughout the process, with the objective of properly documenting it.
+
+To showcase Sphinx capabilities for code documentation you will use Python,
+which also supports *automatic* documentation generation.
+
+.. note::
+
+ Several other languages are natively supported in Sphinx for *manual* code
+ documentation, however they require extensions for *automatic* code
+ documentation, like `Breathe <https://breathe.readthedocs.io/>`_.
+
+To follow the instructions you will need access to a Linux-like command line and
+a basic understanding of how it works, as well as a working Python installation
+for development, since you will use *Python virtual environments* to create the
+project.
+
+.. toctree::
+
+ getting-started
+ first-steps
+ more-sphinx-customization
+ narrative-documentation
+ describing-code
+ automatic-doc-generation
+ deploying
+ end
diff --git a/doc/tutorial/more-sphinx-customization.rst b/doc/tutorial/more-sphinx-customization.rst
new file mode 100644
index 0000000..c28263c
--- /dev/null
+++ b/doc/tutorial/more-sphinx-customization.rst
@@ -0,0 +1,78 @@
+More Sphinx customization
+=========================
+
+There are two main ways to customize your documentation beyond what is possible
+with core Sphinx: extensions and themes.
+
+Enabling a built-in extension
+-----------------------------
+
+In addition to these configuration values, you can customize Sphinx even more
+by using :doc:`extensions </usage/extensions/index>`. Sphinx ships several
+:ref:`builtin ones <builtin-extensions>`, and there are many more
+:ref:`maintained by the community <third-party-extensions>`.
+
+For example, to enable the :mod:`sphinx.ext.duration` extension,
+locate the ``extensions`` list in your ``conf.py`` and add one element as
+follows:
+
+.. code-block:: python
+ :caption: docs/source/conf.py
+
+ # Add any Sphinx extension module names here, as strings. They can be
+ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+ # ones.
+ extensions = [
+ 'sphinx.ext.duration',
+ ]
+
+After that, every time you generate your documentation, you will see a short
+durations report at the end of the console output, like this one:
+
+.. code-block:: console
+
+ (.venv) $ make html
+ ...
+ The HTML pages are in build/html.
+
+ ====================== slowest reading durations =======================
+ 0.042 temp/source/index
+
+Using a third-party HTML theme
+------------------------------
+
+Themes, on the other hand, are a way to customize the appearance of your
+documentation. Sphinx has several :ref:`builtin themes <builtin-themes>`, and
+there are also `third-party ones <https://sphinx-themes.org/>`_.
+
+For example, to use the `Furo <https://pradyunsg.me/furo/>`_ third-party theme
+in your HTML documentation, first you will need to install it with ``pip`` in
+your Python virtual environment, like this:
+
+.. code-block:: console
+
+ (.venv) $ pip install furo
+
+And then, locate the ``html_theme`` variable on your ``conf.py`` and replace
+its value as follows:
+
+.. code-block:: python
+ :caption: docs/source/conf.py
+
+ # The theme to use for HTML and HTML Help pages. See the documentation for
+ # a list of builtin themes.
+ #
+ html_theme = 'furo'
+
+With this change, you will notice that your HTML documentation has now a new
+appearance:
+
+.. figure:: /_static/tutorial/lumache-furo.png
+ :width: 80%
+ :align: center
+ :alt: HTML documentation of Lumache with the Furo theme
+
+ HTML documentation of Lumache with the Furo theme
+
+It is now time to :doc:`expand the narrative documentation and split it into
+several documents </tutorial/narrative-documentation>`.
diff --git a/doc/tutorial/narrative-documentation.rst b/doc/tutorial/narrative-documentation.rst
new file mode 100644
index 0000000..a81204d
--- /dev/null
+++ b/doc/tutorial/narrative-documentation.rst
@@ -0,0 +1,130 @@
+Narrative documentation in Sphinx
+=================================
+
+Structuring your documentation across multiple pages
+----------------------------------------------------
+
+The file ``index.rst`` created by ``sphinx-quickstart`` is the :term:`root
+document`, whose main function is to serve as a welcome page and to contain the
+root of the "table of contents tree" (or *toctree*). Sphinx allows you to
+assemble a project from different files, which is helpful when the project
+grows.
+
+As an example, create a new file ``docs/source/usage.rst`` (next to
+``index.rst``) with these contents:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+
+ Usage
+ =====
+
+ Installation
+ ------------
+
+ To use Lumache, first install it using pip:
+
+ .. code-block:: console
+
+ (.venv) $ pip install lumache
+
+This new file contains two :ref:`section <rst-sections>` headers, normal
+paragraph text, and a :rst:dir:`code-block` directive that renders
+a block of content as source code, with appropriate syntax highlighting
+(in this case, generic ``console`` text).
+
+The structure of the document is determined by the succession of heading
+styles, which means that, by using ``---`` for the "Installation" section
+after ``===`` for the "Usage" section, you have declared "Installation" to
+be a *subsection* of "Usage".
+
+To complete the process, add a ``toctree`` :ref:`directive <rst-directives>` at
+the end of ``index.rst`` including the document you just created, as follows:
+
+.. code-block:: rst
+ :caption: docs/source/index.rst
+
+ Contents
+ --------
+
+ .. toctree::
+
+ usage
+
+This step inserts that document in the root of the *toctree*, so now it belongs
+to the structure of your project, which so far looks like this:
+
+.. code-block:: text
+
+ index
+ └── usage
+
+If you build the HTML documentation running ``make html``, you will see
+that the ``toctree`` gets rendered as a list of hyperlinks, and this allows you
+to navigate to the new page you just created. Neat!
+
+.. warning::
+
+ Documents outside a *toctree* will result in ``WARNING: document isn't
+ included in any toctree`` messages during the build process, and will be
+ unreachable for users.
+
+Adding cross-references
+-----------------------
+
+One powerful feature of Sphinx is the ability to seamlessly add
+:ref:`cross-references <xref-syntax>` to specific parts of the documentation:
+a document, a section, a figure, a code object, etc. This tutorial is full of
+them!
+
+To add a cross-reference, write this sentence right after the
+introduction paragraph in ``index.rst``:
+
+.. code-block:: rst
+ :caption: docs/source/index.rst
+
+ Check out the :doc:`usage` section for further information.
+
+The :rst:role:`doc` :ref:`role <rst-roles-alt>` you used automatically
+references a specific document in the project, in this case the ``usage.rst``
+you created earlier.
+
+Alternatively, you can also add a cross-reference to an arbitrary part of the
+project. For that, you need to use the :rst:role:`ref` role, and add an
+explicit *label* that acts as :duref:`a target <hyperlink-targets>`.
+
+For example, to reference the "Installation" subsection, add a label right
+before the heading, as follows:
+
+.. code-block:: rst
+ :caption: docs/source/usage.rst
+ :emphasize-lines: 4
+
+ Usage
+ =====
+
+ .. _installation:
+
+ Installation
+ ------------
+
+ ...
+
+And make the sentence you added in ``index.rst`` look like this:
+
+.. code-block:: rst
+ :caption: docs/source/index.rst
+
+ Check out the :doc:`usage` section for further information, including how to
+ :ref:`install <installation>` the project.
+
+Notice a trick here: the ``install`` part specifies how the link will look like
+(we want it to be a specific word, so the sentence makes sense), whereas the
+``<installation>`` part refers to the actual label we want to add a
+cross-reference to. If you do not include an explicit title, hence using
+``:ref:`installation```, the section title will be used (in this case,
+``Installation``). Both the ``:doc:`` and the ``:ref:`` roles will be rendered
+as hyperlinks in the HTML documentation.
+
+What about :doc:`documenting code objects in Sphinx </tutorial/describing-code>`?
+Read on!
diff --git a/doc/usage/advanced/intl.rst b/doc/usage/advanced/intl.rst
new file mode 100644
index 0000000..ae6e7dc
--- /dev/null
+++ b/doc/usage/advanced/intl.rst
@@ -0,0 +1,372 @@
+.. _intl:
+
+Internationalization
+====================
+
+.. versionadded:: 1.1
+
+Complementary to translations provided for Sphinx-generated messages such as
+navigation bars, Sphinx provides mechanisms facilitating the translation of
+*documents*. See the :ref:`intl-options` for details on configuration.
+
+.. figure:: /_static/translation.*
+ :width: 100%
+
+ Workflow visualization of translations in Sphinx. (The figure is created by
+ `plantuml <https://plantuml.com>`_.)
+
+.. contents::
+ :local:
+
+Sphinx internationalization details
+-----------------------------------
+
+**gettext** [1]_ is an established standard for internationalization and
+localization. It naively 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``. Imagine you have
+Spanish translations [2]_ stored in ``usage.po`` --- for your builds to
+be translated you need to follow these instructions:
+
+* Compile your message catalog to a locale directory, say ``locale``, so it
+ ends up in ``./locale/es/LC_MESSAGES/usage.mo`` in your source directory
+ (where ``es`` is the language code for Spanish.) ::
+
+ msgfmt "usage.po" -o "locale/es/LC_MESSAGES/usage.mo"
+
+* Set :confval:`locale_dirs` to ``["locale/"]``.
+* Set :confval:`language` to ``es`` (also possible via
+ :option:`-D <sphinx-build -D>`).
+* Run your desired build.
+
+
+In order to protect against mistakes, a warning is emitted if
+cross-references in the translated paragraph do not match those from the
+original. This can be turned off globally using the
+:confval:`suppress_warnings` configuration variable. Alternatively, to
+turn it off for one message only, end the message with ``#noqa`` like
+this::
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse
+ risus tortor, luctus id ultrices at. #noqa
+
+(Write ``\#noqa`` in case you want to have "#noqa" literally in the
+text. This does not apply to code blocks, where ``#noqa`` is ignored
+because code blocks do not contain references anyway.)
+
+.. versionadded:: 4.5
+ The ``#noqa`` mechanism.
+
+
+Translating with sphinx-intl
+----------------------------
+
+Quick guide
+~~~~~~~~~~~
+
+`sphinx-intl`_ is a useful tool to work with Sphinx translation flow. This
+section describe an easy way to translate with *sphinx-intl*.
+
+#. Install `sphinx-intl`_.
+
+ .. code-block:: console
+
+ $ pip install sphinx-intl
+
+#. Add configurations to ``conf.py``.
+
+ ::
+
+ locale_dirs = ['locale/'] # path is example but recommended.
+ gettext_compact = False # optional.
+
+ This case-study assumes that BUILDDIR is set to ``_build``,
+ :confval:`locale_dirs` is set to ``locale/`` and :confval:`gettext_compact`
+ is set to ``False`` (the Sphinx document is already configured as such).
+
+#. Extract translatable messages into pot files.
+
+ .. code-block:: console
+
+ $ make gettext
+
+ The generated pot files will be placed in the ``_build/gettext`` directory.
+
+#. Generate po files.
+
+ We'll use the pot files generated in the above step.
+
+ .. code-block:: console
+
+ $ sphinx-intl update -p _build/gettext -l de -l ja
+
+ Once completed, the generated po files will be placed in the below
+ directories:
+
+ * ``./locale/de/LC_MESSAGES/``
+ * ``./locale/ja/LC_MESSAGES/``
+
+#. Translate po files.
+
+ As noted above, these are located in the ``./locale/<lang>/LC_MESSAGES``
+ directory. An example of one such file, from Sphinx, ``builders.po``, is
+ given below.
+
+ .. code-block:: po
+
+ # a5600c3d2e3d48fc8c261ea0284db79b
+ #: ../../builders.rst:4
+ msgid "Available builders"
+ msgstr "<FILL HERE BY TARGET LANGUAGE>"
+
+ Another case, msgid is multi-line text and contains reStructuredText syntax:
+
+ .. code-block:: po
+
+ # 302558364e1d41c69b3277277e34b184
+ #: ../../builders.rst:9
+ msgid ""
+ "These are the built-in Sphinx builders. More builders can be added by "
+ ":ref:`extensions <extensions>`."
+ msgstr ""
+ "FILL HERE BY TARGET LANGUAGE FILL HERE BY TARGET LANGUAGE FILL HERE "
+ "BY TARGET LANGUAGE :ref:`EXTENSIONS <extensions>` FILL HERE."
+
+ Please be careful not to break reST notation. Most po-editors will help you
+ with that.
+
+#. Build translated document.
+
+ You need a :confval:`language` parameter in ``conf.py`` or you may also
+ specify the parameter on the command line.
+
+ For BSD/GNU make, run:
+
+ .. code-block:: console
+
+ $ make -e SPHINXOPTS="-D language='de'" html
+
+ For Windows :command:`cmd.exe`, run:
+
+ .. code-block:: console
+
+ > set SPHINXOPTS=-D language=de
+ > .\make.bat html
+
+ For PowerShell, run:
+
+ .. code-block:: console
+
+ > Set-Item env:SPHINXOPTS "-D language=de"
+ > .\make.bat html
+
+Congratulations! You got the translated documentation in the ``_build/html``
+directory.
+
+.. versionadded:: 1.3
+
+ :program:`sphinx-build` that is invoked by make command will build po files
+ into mo files.
+
+ If you are using 1.2.x or earlier, please invoke :command:`sphinx-intl build`
+ command before :command:`make` command.
+
+Translating
+~~~~~~~~~~~
+
+Update your po files by new pot files
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a document is updated, it is necessary to generate updated pot files and to
+apply differences to translated po files. In order to apply the updates from a
+pot file to the po file, use the :command:`sphinx-intl update` command.
+
+.. code-block:: console
+
+ $ sphinx-intl update -p _build/gettext
+
+
+Using Transifex service for team translation
+--------------------------------------------
+
+Transifex_ is one of several services that allow collaborative translation via a
+web interface. It has a nifty Python-based command line client that makes it
+easy to fetch and push translations.
+
+.. TODO: why use transifex?
+
+
+#. Install `transifex-client`_.
+
+ You need :command:`tx` command to upload resources (pot files).
+
+ .. code-block:: console
+
+ $ pip install transifex-client
+
+ .. seealso:: `Transifex Client documentation`_
+
+#. Create your Transifex_ account and create new project for your document.
+
+ Currently, Transifex does not allow for a translation project to have more
+ than one version of the document, so you'd better include a version number in
+ your project name.
+
+ For example:
+
+ :Project ID: ``sphinx-document-test_1_0``
+ :Project URL: ``https://www.transifex.com/projects/p/sphinx-document-test_1_0/``
+
+#. Create config files for :command:`tx` command.
+
+ This process will create ``.tx/config`` in the current directory, as well as
+ a ``~/.transifexrc`` file that includes auth information.
+
+ .. code-block:: console
+
+ $ tx init
+ Creating .tx folder...
+ Transifex instance [https://www.transifex.com]:
+ ...
+ Please enter your transifex username: <transifex-username>
+ Password: <transifex-password>
+ ...
+ Done.
+
+#. Upload pot files to Transifex service.
+
+ Register pot files to ``.tx/config`` file:
+
+ .. code-block:: console
+
+ $ cd /your/document/root
+ $ sphinx-intl update-txconfig-resources --pot-dir _build/locale \
+ --transifex-project-name sphinx-document-test_1_0
+
+ and upload pot files:
+
+ .. code-block:: console
+
+ $ tx push -s
+ Pushing translations for resource sphinx-document-test_1_0.builders:
+ Pushing source file (locale/pot/builders.pot)
+ Resource does not exist. Creating...
+ ...
+ Done.
+
+#. Forward the translation on Transifex.
+
+ .. TODO: write this section
+
+#. Pull translated po files and make translated HTML.
+
+ Get translated catalogs and build mo files. For example, to build mo files
+ for German (de):
+
+ .. code-block:: console
+
+ $ cd /your/document/root
+ $ tx pull -l de
+ Pulling translations for resource sphinx-document-test_1_0.builders (...)
+ -> de: locale/de/LC_MESSAGES/builders.po
+ ...
+ Done.
+
+ Invoke :command:`make html` (for BSD/GNU make):
+
+ .. code-block:: console
+
+ $ make -e SPHINXOPTS="-D language='de'" html
+
+That's all!
+
+.. tip:: Translating locally and on Transifex
+
+ If you want to push all language's po files, you can be done by using
+ :command:`tx push -t` command. Watch out! This operation overwrites
+ translations in Transifex.
+
+ In other words, if you have updated each in the service and local po files,
+ it would take much time and effort to integrate them.
+
+
+Using Weblate service for team translation
+------------------------------------------
+
+Read more in `Weblate's documentation`_.
+
+
+Contributing to Sphinx reference translation
+--------------------------------------------
+
+The recommended way for new contributors to translate Sphinx reference is to
+join the translation team on Transifex.
+
+There is a `sphinx translation page`_ for Sphinx (master) documentation.
+
+1. Login to Transifex_ service.
+2. Go to `sphinx translation page`_.
+3. Click ``Request language`` and fill form.
+4. Wait acceptance by Transifex sphinx translation maintainers.
+5. (After acceptance) Translate on Transifex.
+
+Detail is here: https://docs.transifex.com/getting-started-1/translators
+
+
+Translation progress and statistics
+-----------------------------------
+
+.. versionadded:: 7.1.0
+
+During the rendering process,
+Sphinx marks each translatable node with a ``translated`` attribute,
+indicating if a translation was found for the text in that node.
+
+The :confval:`translation_progress_classes` configuration value
+can be used to add a class to each element,
+depending on the value of the ``translated`` attribute.
+
+The ``|translation progress|`` substitution can be used to display the
+percentage of nodes that have been translated on a per-document basis.
+
+.. rubric:: Footnotes
+
+.. [1] See the `GNU gettext utilities
+ <https://www.gnu.org/software/gettext/manual/gettext.html#Introduction>`_
+ for details on that software suite.
+.. [2] Because nobody expects the Spanish Inquisition!
+
+.. _`transifex-client`: https://pypi.org/project/transifex-client/
+.. _`sphinx-intl`: https://pypi.org/project/sphinx-intl/
+.. _Transifex: https://www.transifex.com/
+.. _Weblate's documentation: https://docs.weblate.org/en/latest/devel/sphinx.html
+.. _`sphinx translation page`: https://www.transifex.com/sphinx-doc/sphinx-doc/
+.. _`Transifex Client documentation`: https://docs.transifex.com/client/introduction/
diff --git a/doc/usage/advanced/websupport/api.rst b/doc/usage/advanced/websupport/api.rst
new file mode 100644
index 0000000..79b51ee
--- /dev/null
+++ b/doc/usage/advanced/websupport/api.rst
@@ -0,0 +1,80 @@
+.. _websupportapi:
+
+.. currentmodule:: sphinxcontrib.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 the static files should be created in a different location
+ **and not in** ``'/static'``, this should be a string with the name of
+ that location (e.g. ``builddir + '/static_files'``).
+
+ .. note::
+ If you specify ``staticdir``, you will typically want to adjust
+ ``staticroot`` accordingly.
+
+ staticroot
+ If the static files are not served from ``'/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'``).
+
+
+.. versionchanged:: 1.6
+
+ WebSupport class is moved to sphinxcontrib.websupport from sphinx.websupport.
+ Please add ``sphinxcontrib-websupport`` package in your dependency and use
+ moved class instead.
+
+
+Methods
+-------
+
+.. automethod:: sphinxcontrib.websupport.WebSupport.build
+
+.. automethod:: sphinxcontrib.websupport.WebSupport.get_document
+
+.. automethod:: sphinxcontrib.websupport.WebSupport.get_data
+
+.. automethod:: sphinxcontrib.websupport.WebSupport.add_comment
+
+.. automethod:: sphinxcontrib.websupport.WebSupport.process_vote
+
+.. automethod:: sphinxcontrib.websupport.WebSupport.get_search_results
diff --git a/doc/usage/advanced/websupport/index.rst b/doc/usage/advanced/websupport/index.rst
new file mode 100644
index 0000000..0816640
--- /dev/null
+++ b/doc/usage/advanced/websupport/index.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::
+
+ quickstart
+ api
+ searchadapters
+ storagebackends
diff --git a/doc/usage/advanced/websupport/quickstart.rst b/doc/usage/advanced/websupport/quickstart.rst
new file mode 100644
index 0000000..1cdd23f
--- /dev/null
+++ b/doc/usage/advanced/websupport/quickstart.rst
@@ -0,0 +1,255 @@
+.. _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 sphinxcontrib.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 sphinxcontrib.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 its :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
+* **script**: 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
+<https://jinja.palletsprojects.com/>`_ is:
+
+.. code-block:: 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 script %}
+ {{ super() }}
+ {{ document.script|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 privileges.
+The default value for *moderator* is ``False``.
+
+An example `Flask <https://flask.palletsprojects.com/>`_ function that checks
+whether a user is logged in and then retrieves a document is::
+
+ from sphinxcontrib.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 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:`~sphinxcontrib.websupport.WebSupport.get_search_results` method to
+retrieve search results. In `Flask <https://flask.palletsprojects.com/>`_ 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:`~sphinxcontrib.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:`.WebSupport.add_comment`.
diff --git a/doc/usage/advanced/websupport/searchadapters.rst b/doc/usage/advanced/websupport/searchadapters.rst
new file mode 100644
index 0000000..262d666
--- /dev/null
+++ b/doc/usage/advanced/websupport/searchadapters.rst
@@ -0,0 +1,49 @@
+.. _searchadapters:
+
+.. currentmodule:: sphinxcontrib.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.
+
+.. versionchanged:: 1.6
+
+ BaseSearch class is moved to sphinxcontrib.websupport.search from
+ sphinx.websupport.search.
+
+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/usage/advanced/websupport/storagebackends.rst b/doc/usage/advanced/websupport/storagebackends.rst
new file mode 100644
index 0000000..ccb00b6
--- /dev/null
+++ b/doc/usage/advanced/websupport/storagebackends.rst
@@ -0,0 +1,49 @@
+.. _storagebackends:
+
+.. currentmodule:: sphinxcontrib.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.
+
+.. versionchanged:: 1.6
+
+ StorageBackend class is moved to sphinxcontrib.websupport.storage from
+ sphinx.websupport.storage.
+
+
+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/usage/builders/index.rst b/doc/usage/builders/index.rst
new file mode 100644
index 0000000..ce2c5dc
--- /dev/null
+++ b/doc/usage/builders/index.rst
@@ -0,0 +1,565 @@
+.. _builders:
+
+========
+Builders
+========
+
+.. module:: sphinx.builders
+ :synopsis: Available built-in builder classes.
+
+These are the built-in Sphinx builders. More builders can be added by
+:doc:`extensions </usage/extensions/index>`.
+
+The builder's "name" must be given to the **-b** command-line option of
+:program:`sphinx-build` to select a builder.
+
+
+.. module:: sphinx.builders.html
+.. class:: StandaloneHTMLBuilder
+
+ This is the standard HTML builder. Its output is a directory with HTML
+ files, complete with style sheets and optionally the reST sources. There are
+ quite a few configuration values that customize the output of this builder,
+ see the chapter :ref:`html-options` for details.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+.. module:: sphinx.builders.dirhtml
+.. class:: DirectoryHTMLBuilder
+
+ This is a subclass of the standard HTML builder. Its output is a directory
+ with HTML files, where each file is called ``index.html`` and placed in a
+ subdirectory named like its page name. For example, the document
+ ``markup/rest.rst`` will not result in an output file ``markup/rest.html``,
+ but ``markup/rest/index.html``. When generating links between pages, the
+ ``index.html`` is omitted, so that the URL would look like ``markup/rest/``.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 0.6
+
+.. module:: sphinx.builders.singlehtml
+.. class:: SingleFileHTMLBuilder
+
+ This is an HTML builder that combines the whole project in one output file.
+ (Obviously this only works with smaller projects.) The file is named like
+ the root document. No indices will be generated.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.0
+
+.. module:: sphinxcontrib.htmlhelp
+.. class:: HTMLHelpBuilder
+
+ This builder produces the same output as the standalone HTML builder, but
+ also generates HTML Help support files that allow the Microsoft HTML Help
+ Workshop to compile them into a CHM file.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+.. module:: sphinxcontrib.qthelp
+.. class:: QtHelpBuilder
+
+ This builder produces the same output as the standalone HTML builder, but
+ also generates `Qt help`_ collection support files that allow the Qt
+ collection generator to compile them.
+
+ .. versionchanged:: 2.0
+
+ Moved to sphinxcontrib.qthelp from sphinx.builders package.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. _Qt help: https://doc.qt.io/qt-4.8/qthelp-framework.html
+
+.. module:: sphinxcontrib.applehelp
+.. class:: AppleHelpBuilder
+
+ This builder produces an Apple Help Book based on the same output as the
+ standalone HTML builder.
+
+ If the source directory contains any ``.lproj`` folders, the one
+ corresponding to the selected language will have its contents merged with
+ the generated output. These folders will be ignored by all other
+ documentation types.
+
+ In order to generate a valid help book, this builder requires the command
+ line tool :program:`hiutil`, which is only available on Mac OS X 10.6 and
+ above. You can disable the indexing step by setting
+ :confval:`applehelp_disable_external_tools` to ``True``, in which case the
+ output will not be valid until :program:`hiutil` has been run on all of the
+ ``.lproj`` folders within the bundle.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.3
+
+ .. versionchanged:: 2.0
+
+ Moved to sphinxcontrib.applehelp from sphinx.builders package.
+
+.. module:: sphinxcontrib.devhelp
+.. class:: DevhelpBuilder
+
+ This builder produces the same output as the standalone HTML builder, but
+ also generates `GNOME Devhelp <https://wiki.gnome.org/Apps/Devhelp>`__
+ support file that allows the GNOME Devhelp reader to view them.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionchanged:: 2.0
+
+ Moved to sphinxcontrib.devhelp from sphinx.builders package.
+
+.. module:: sphinx.builders.epub3
+.. class:: Epub3Builder
+
+ This builder produces the same output as the standalone HTML builder, but
+ also generates an *epub* file for ebook readers. See :ref:`epub-faq` for
+ details about it. For definition of the epub format, have a look at
+ `<http://idpf.org/epub>`_ or `<https://en.wikipedia.org/wiki/EPUB>`_.
+ The builder creates *EPUB 3* files.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.4
+
+ .. versionchanged:: 1.5
+
+ Since Sphinx 1.5, the epub3 builder is used as the default epub builder.
+
+.. module:: sphinx.builders.latex
+.. class:: LaTeXBuilder
+
+ This builder produces LaTeX source files in the output directory. The
+ actual PDF builds happen inside this output directory and need to be
+ triggered in a second step. This can be done via
+ :program:`make all-pdf` there.
+ To combine the two steps into only one, use :option:`sphinx-build -M`
+ (i.e. ``-M latexpdf`` not ``-b latexpdf``) or :program:`make latexpdf`
+ at the project root.
+
+ See :confval:`latex_documents` and the chapter :ref:`latex-options` for
+ available options.
+
+ PDF builds need a sufficiently complete LaTeX installation.
+ The testing is currently (since 5.3.0) done on Ubuntu 22.04LTS,
+ whose LaTeX distribution matches upstream TeXLive 2021 as of 2022/02/04,
+ but PDF builds can be successfully done on much older LaTeX installations.
+
+ At any rate, on Ubuntu for example, following packages must all be present:
+
+ * ``texlive-latex-recommended``
+ * ``texlive-fonts-recommended``
+ * ``tex-gyre`` (if :confval:`latex_engine` left to default)
+ * ``texlive-latex-extra``
+ * ``latexmk``
+
+ .. versionchanged:: 4.0.0
+ TeX Gyre fonts now required for ``'pdflatex'`` engine (default).
+
+ Additional packages are needed in some circumstances:
+
+ * ``texlive-lang-cyrillic`` for Cyrillic (and also then
+ ``cm-super`` if using the default fonts),
+ * ``texlive-lang-greek`` for Greek (and also then
+ ``cm-super`` if using the default fonts),
+ * ``texlive-xetex`` if :confval:`latex_engine` is ``'xelatex'``,
+ * ``texlive-luatex`` if :confval:`latex_engine` is ``'lualatex'``,
+ * ``fonts-freefont-otf`` if :confval:`latex_engine` is either
+ ``'xelatex'`` or ``'lualatex'``.
+
+ .. note::
+
+ Since 1.6, ``make latexpdf`` uses on GNU/Linux and macOS
+ :program:`latexmk`, as it
+ makes sure the needed number of runs is automatically executed.
+ On Windows the PDF builds execute a fix number of LaTeX runs
+ (three, then ``makeindex``, then two more).
+
+ One can pass to ``latexmk`` options via the ``LATEXMKOPTS``
+ Makefile variable. For example:
+
+ .. code-block:: console
+
+ make latexpdf LATEXMKOPTS="-silent"
+
+ reduces console output to a minimum.
+
+ Also, if ``latexmk`` is at version 4.52b or higher (January 2017)
+ ``LATEXMKOPTS="-xelatex"`` speeds up PDF builds via XeLateX in case
+ of numerous graphics inclusions.
+
+ To pass options directly to the ``(pdf|xe|lua)latex`` binary, use
+ variable ``LATEXOPTS``, for example:
+
+ .. code-block:: console
+
+ make latexpdf LATEXOPTS="--halt-on-error"
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+Note that a direct PDF builder is being provided by `rinohtype`_. The builder's
+name is ``rinoh``. Refer to the `rinohtype manual`_ for details.
+
+.. _rinohtype: https://github.com/brechtm/rinohtype
+.. _rinohtype manual: https://www.mos6581.org/rinohtype/master/quickstart.html#sphinx-builder
+
+.. module:: sphinx.builders.text
+.. class:: TextBuilder
+
+ This builder produces a text file for each reST file -- this is almost the
+ same as the reST source, but with much of the markup stripped for better
+ readability.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 0.4
+
+.. module:: sphinx.builders.manpage
+.. class:: ManualPageBuilder
+
+ This builder produces manual pages in the groff format. You have to specify
+ which documents are to be included in which manual pages via the
+ :confval:`man_pages` configuration value.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. 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
+ `<https://www.gnu.org/software/texinfo/>`_.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.1
+
+
+.. currentmodule:: sphinxcontrib.serializinghtml
+.. class:: SerializingHTMLBuilder
+
+ This builder uses a module that implements the Python serialization API
+ (`pickle`, `simplejson`, `phpserialize`, and others) to dump the generated
+ HTML documentation. The pickle builder is a subclass of it.
+
+ A concrete subclass of this builder serializing to the `PHP serialization`_
+ format could look like this::
+
+ import phpserialize
+
+ class PHPSerializedBuilder(SerializingHTMLBuilder):
+ name = 'phpserialized'
+ implementation = phpserialize
+ out_suffix = '.file.phpdump'
+ globalcontext_filename = 'globalcontext.phpdump'
+ searchindex_filename = 'searchindex.phpdump'
+
+ .. _PHP serialization: https://pypi.org/project/phpserialize/
+
+ .. attribute:: implementation
+
+ A module that implements `dump()`, `load()`, `dumps()` and `loads()`
+ functions that conform to the functions with the same names from the
+ pickle module. Known modules implementing this interface are
+ `simplejson`, `phpserialize`, `plistlib`, and others.
+
+ .. attribute:: out_suffix
+
+ The suffix for all regular files.
+
+ .. attribute:: globalcontext_filename
+
+ The filename for the file that contains the "global context". This
+ is a dict with some general configuration values such as the name
+ of the project.
+
+ .. attribute:: searchindex_filename
+
+ The filename for the search index Sphinx generates.
+
+ See :ref:`serialization-details` for details about the output format.
+
+ .. versionadded:: 0.5
+
+.. class:: PickleHTMLBuilder
+
+ This builder produces a directory with pickle files containing mostly HTML
+ fragments and TOC information, for use of a web application (or custom
+ postprocessing tool) that doesn't use the standard HTML templates.
+
+ See :ref:`serialization-details` for details about the output format.
+
+ .. autoattribute:: name
+
+ The old name ``web`` still works as well.
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ The file suffix is ``.fpickle``. The global context is called
+ ``globalcontext.pickle``, the search index ``searchindex.pickle``.
+
+.. class:: JSONHTMLBuilder
+
+ This builder produces a directory with JSON files containing mostly HTML
+ fragments and TOC information, for use of a web application (or custom
+ postprocessing tool) that doesn't use the standard HTML templates.
+
+ See :ref:`serialization-details` for details about the output format.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ The file suffix is ``.fjson``. The global context is called
+ ``globalcontext.json``, the search index ``searchindex.json``.
+
+ .. 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.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.1
+
+.. module:: sphinx.builders.changes
+.. class:: ChangesBuilder
+
+ This builder produces an HTML overview of all :rst:dir:`versionadded`,
+ :rst:dir:`versionchanged` and :rst:dir:`deprecated` directives for the
+ current :confval:`version`. This is useful to generate a ChangeLog file, for
+ example.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+.. module:: sphinx.builders.dummy
+.. class:: DummyBuilder
+
+ This builder produces no output. The input is only parsed and checked for
+ consistency. This is useful for linting purposes.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.4
+
+.. module:: sphinx.builders.linkcheck
+.. class:: CheckExternalLinksBuilder
+
+ This builder scans all documents for external links, tries to open them with
+ ``requests``, and writes an overview which ones are broken and redirected to
+ standard output and to :file:`output.txt` in the output directory.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionchanged:: 1.5
+
+ Since Sphinx 1.5, the linkcheck builder uses the requests module.
+
+ .. versionchanged:: 3.4
+
+ The linkcheck builder retries links when servers apply rate limits.
+
+.. module:: sphinx.builders.xml
+.. class:: XMLBuilder
+
+ This builder produces Docutils-native XML files. The output can be
+ transformed with standard XML tools such as XSLT processors into arbitrary
+ final forms.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.2
+
+.. class:: PseudoXMLBuilder
+
+ This builder is used for debugging the Sphinx/Docutils "Reader to Transform
+ to Writer" pipeline. It produces compact pretty-printed "pseudo-XML", files
+ where nesting is indicated by indentation (no end-tags). External
+ attributes for all elements are output, and internal attributes for any
+ leftover "pending" elements are also given.
+
+ .. autoattribute:: name
+
+ .. autoattribute:: format
+
+ .. autoattribute:: supported_image_types
+
+ .. versionadded:: 1.2
+
+
+Built-in Sphinx extensions that offer more builders are:
+
+* :mod:`~sphinx.ext.doctest`
+* :mod:`~sphinx.ext.coverage`
+
+
+.. _serialization-details:
+
+Serialization builder details
+-----------------------------
+
+All serialization builders outputs one file per source file and a few special
+files. They also copy the reST source files in the directory ``_sources``
+under the output directory.
+
+The :class:`.PickleHTMLBuilder` is a builtin subclass that implements the pickle
+serialization interface.
+
+The files per source file have the extensions of
+:attr:`~.SerializingHTMLBuilder.out_suffix`, and are arranged in directories
+just as the source files are. They unserialize to a dictionary (or dictionary
+like structure) with these keys:
+
+``body``
+ The HTML "body" (that is, the HTML rendering of the source file), as rendered
+ by the HTML translator.
+
+``title``
+ The title of the document, as HTML (may contain markup).
+
+``toc``
+ The table of contents for the file, rendered as an HTML ``<ul>``.
+
+``display_toc``
+ A boolean that is ``True`` if the ``toc`` contains more than one entry.
+
+``current_page_name``
+ The document name of the current file.
+
+``parents``, ``prev`` and ``next``
+ Information about related chapters in the TOC tree. Each relation is a
+ dictionary with the keys ``link`` (HREF for the relation) and ``title``
+ (title of the related document, as HTML). ``parents`` is a list of
+ relations, while ``prev`` and ``next`` are a single relation.
+
+``sourcename``
+ The name of the source file under ``_sources``.
+
+The special files are located in the root output directory. They are:
+
+:attr:`.SerializingHTMLBuilder.globalcontext_filename`
+ A pickled dict with these keys:
+
+ ``project``, ``copyright``, ``release``, ``version``
+ The same values as given in the configuration file.
+
+ ``style``
+ :confval:`html_style`.
+
+ ``last_updated``
+ Date of last build.
+
+ ``builder``
+ Name of the used builder, in the case of pickles this is always
+ ``'pickle'``.
+
+ ``titles``
+ A dictionary of all documents' titles, as HTML strings.
+
+:attr:`.SerializingHTMLBuilder.searchindex_filename`
+ An index that can be used for searching the documentation. It is a pickled
+ list with these entries:
+
+ * A list of indexed docnames.
+ * A list of document titles, as HTML strings, in the same order as the first
+ list.
+ * A dict mapping word roots (processed by an English-language stemmer) to a
+ list of integers, which are indices into the first list.
+
+``environment.pickle``
+ The build environment. This is always a pickle file, independent of the
+ builder and a copy of the environment that was used when the builder was
+ started.
+
+ .. todo:: Document common members.
+
+ Unlike the other pickle files this pickle file requires that the ``sphinx``
+ package is available on unpickling.
diff --git a/doc/usage/configuration.rst b/doc/usage/configuration.rst
new file mode 100644
index 0000000..d440132
--- /dev/null
+++ b/doc/usage/configuration.rst
@@ -0,0 +1,3094 @@
+.. highlight:: python
+
+.. _build-config:
+
+=============
+Configuration
+=============
+
+.. module:: conf
+ :synopsis: Build configuration file.
+
+The :term:`configuration directory` must contain a file named :file:`conf.py`.
+This file (containing Python code) is called the "build configuration file"
+and contains (almost) all configuration needed to customize Sphinx input
+and output behavior.
+
+An optional file `docutils.conf`_ can be added to the configuration
+directory to adjust `Docutils`_ configuration if not otherwise overridden or
+set by Sphinx.
+
+.. _`docutils`: https://docutils.sourceforge.io/
+.. _`docutils.conf`: https://docutils.sourceforge.io/docs/user/config.html
+
+The configuration file is executed as Python code at build time (using
+:func:`importlib.import_module`, and with the current directory set to its
+containing directory), and therefore can execute arbitrarily complex code.
+Sphinx then reads simple names from the file's namespace as its configuration.
+
+Important points to note:
+
+* If not otherwise documented, values must be strings, and their default is the
+ empty string.
+
+* The term "fully-qualified name" refers to a string that names an importable
+ Python object inside a module; for example, the FQN
+ ``"sphinx.builders.Builder"`` means the ``Builder`` class in the
+ ``sphinx.builders`` module.
+
+* Remember that document names use ``/`` as the path separator and don't
+ contain the file name extension.
+
+* Since :file:`conf.py` is read as a Python file, the usual rules apply for
+ encodings and Unicode support.
+
+* The contents of the config namespace are pickled (so that Sphinx can find out
+ when configuration changes), so it may not contain unpickleable values --
+ delete them from the namespace with ``del`` if appropriate. Modules are
+ removed automatically, so you don't need to ``del`` your imports after use.
+
+ .. _conf-tags:
+
+* There is a special object named ``tags`` available in the config file.
+ It can be used to query and change the tags (see :ref:`tags`). Use
+ ``tags.has('tag')`` to query, ``tags.add('tag')`` and ``tags.remove('tag')``
+ to change. Only tags set via the ``-t`` command-line option or via
+ ``tags.add('tag')`` can be queried using ``tags.has('tag')``.
+ Note that the current builder tag is not available in ``conf.py``, as it is
+ created *after* the builder is initialized.
+
+
+Project information
+-------------------
+
+.. confval:: project
+
+ The documented project's name.
+
+.. confval:: author
+
+ The author name(s) of the document. The default value is ``'unknown'``.
+
+.. confval:: copyright
+
+ A copyright statement in the style ``'2008, Author Name'``.
+
+ .. versionchanged:: 7.1
+ The value may now be a sequence of copyright statements in the above form,
+ which will be displayed each to their own line.
+
+.. confval:: project_copyright
+
+ An alias of :confval:`copyright`.
+
+ .. versionadded:: 3.5
+
+.. confval:: version
+
+ The major project version, used as the replacement for ``|version|``. For
+ example, for the Python documentation, this may be something like ``2.6``.
+
+.. confval:: release
+
+ The full project version, used as the replacement for ``|release|`` and
+ e.g. in the HTML templates. For example, for the Python documentation, this
+ may be something like ``2.6.0rc1``.
+
+ If you don't need the separation provided between :confval:`version` and
+ :confval:`release`, just set them both to the same value.
+
+
+General configuration
+---------------------
+
+.. confval:: extensions
+
+ A list of strings that are module names of :doc:`extensions
+ <extensions/index>`. These can be extensions coming with Sphinx (named
+ ``sphinx.ext.*``) or custom ones.
+
+ Note that you can extend :data:`sys.path` within the conf file if your
+ extensions live in another directory -- but make sure you use absolute paths.
+ If your extension path is relative to the :term:`configuration directory`,
+ use :func:`os.path.abspath` like so::
+
+ import sys, os
+
+ sys.path.append(os.path.abspath('sphinxext'))
+
+ extensions = ['extname']
+
+ That way, you can load an extension called ``extname`` from the subdirectory
+ ``sphinxext``.
+
+ The configuration file itself can be an extension; for that, you only need
+ to provide a :func:`setup` function in it.
+
+.. confval:: source_suffix
+
+ The file extensions of source files. Sphinx considers the files with this
+ suffix as sources. The value can be a dictionary mapping file extensions
+ to file types. For example::
+
+ source_suffix = {
+ '.rst': 'restructuredtext',
+ '.txt': 'restructuredtext',
+ '.md': 'markdown',
+ }
+
+ By default, Sphinx only supports ``'restructuredtext'`` file type. You can
+ add a new file type using source parser extensions. Please read a document
+ of the extension to know which file type the extension supports.
+
+ The value may also be a list of file extensions: then Sphinx will consider
+ that they all map to the ``'restructuredtext'`` file type.
+
+ Default is ``{'.rst': 'restructuredtext'}``.
+
+ .. note:: file extensions have to start with a dot (e.g. ``.rst``).
+
+ .. versionchanged:: 1.3
+ Can now be a list of extensions.
+
+ .. versionchanged:: 1.8
+ Support file type mapping
+
+.. confval:: source_encoding
+
+ The encoding of all reST source files. The recommended encoding, and the
+ default value, is ``'utf-8-sig'``.
+
+ .. versionadded:: 0.5
+ Previously, Sphinx accepted only UTF-8 encoded sources.
+
+.. confval:: source_parsers
+
+ If given, a dictionary of parser classes for different source suffices. The
+ keys are the suffix, the values can be either a class or a string giving a
+ fully-qualified name of a parser class. The parser class can be either
+ ``docutils.parsers.Parser`` or :class:`sphinx.parsers.Parser`. Files with a
+ suffix that is not in the dictionary will be parsed with the default
+ reStructuredText parser.
+
+ For example::
+
+ source_parsers = {'.md': 'recommonmark.parser.CommonMarkParser'}
+
+ .. note::
+
+ Refer to :doc:`/usage/markdown` for more information on using Markdown
+ with Sphinx.
+
+ .. versionadded:: 1.3
+
+ .. deprecated:: 1.8
+ Now Sphinx provides an API :meth:`.Sphinx.add_source_parser` to register
+ a source parser. Please use it instead.
+
+.. confval:: master_doc
+
+ Same as :confval:`root_doc`.
+
+ .. versionchanged:: 4.0
+ Renamed ``master_doc`` to ``root_doc``.
+
+.. confval:: root_doc
+
+ The document name of the "root" document, that is, the document that
+ contains the root :rst:dir:`toctree` directive. Default is ``'index'``.
+
+ .. versionchanged:: 2.0
+ The default is changed to ``'index'`` from ``'contents'``.
+ .. versionchanged:: 4.0
+ Renamed ``root_doc`` from ``master_doc``.
+
+.. confval:: exclude_patterns
+
+ A list of glob-style patterns [1]_ that should be excluded when looking for
+ source files. They are matched against the source file names relative
+ to the source directory, using slashes as directory separators on all
+ platforms.
+
+ Example patterns:
+
+ - ``'library/xml.rst'`` -- ignores the ``library/xml.rst`` file
+ - ``'library/xml'`` -- ignores the ``library/xml`` directory
+ - ``'library/xml*'`` -- ignores all files and directories starting with
+ ``library/xml``
+ - ``'**/.svn'`` -- ignores all ``.svn`` directories
+
+ :confval:`exclude_patterns` is also consulted when looking for static files
+ in :confval:`html_static_path` and :confval:`html_extra_path`.
+
+ .. versionadded:: 1.0
+
+.. confval:: include_patterns
+
+ A list of glob-style patterns [1]_ that are used to find source files. They
+ are matched against the source file names relative to the source directory,
+ using slashes as directory separators on all platforms. The default is ``**``,
+ meaning that all files are recursively included from the source directory.
+
+ Example patterns:
+
+ - ``'**'`` -- all files in the source directory and subdirectories, recursively
+ - ``'library/xml'`` -- just the ``library/xml`` directory
+ - ``'library/xml*'`` -- all files and directories starting with ``library/xml``
+ - ``'**/doc'`` -- all ``doc`` directories (this might be useful if
+ documentation is co-located with source files)
+
+ .. versionadded:: 5.1
+
+.. confval:: templates_path
+
+ A list of paths that contain extra templates (or templates that overwrite
+ builtin/theme-specific templates). Relative paths are taken as relative to
+ the configuration directory.
+
+ .. versionchanged:: 1.3
+ As these files are not meant to be built, they are automatically added to
+ :confval:`exclude_patterns`.
+
+.. confval:: template_bridge
+
+ A string with the fully-qualified name of a callable (or simply a class)
+ that returns an instance of :class:`~sphinx.application.TemplateBridge`.
+ This instance is then used to render HTML documents, and possibly the output
+ of other builders (currently the changes builder). (Note that the template
+ bridge must be made theme-aware if HTML themes are to be used.)
+
+.. confval:: rst_epilog
+
+ .. index:: pair: global; substitutions
+
+ A string of reStructuredText that will be included at the end of every source
+ file that is read. This is a possible place to add substitutions that should
+ be available in every file (another being :confval:`rst_prolog`). An
+ example::
+
+ rst_epilog = """
+ .. |psf| replace:: Python Software Foundation
+ """
+
+ .. versionadded:: 0.6
+
+.. confval:: rst_prolog
+
+ .. index:: pair: global; substitutions
+
+ A string of reStructuredText that will be included at the beginning of every
+ source file that is read. This is a possible place to add substitutions that
+ should be available in every file (another being :confval:`rst_epilog`). An
+ example::
+
+ rst_prolog = """
+ .. |psf| replace:: Python Software Foundation
+ """
+
+ .. versionadded:: 1.0
+
+.. confval:: primary_domain
+
+ .. index:: default; domain
+ primary; domain
+
+ The name of the default :doc:`domain </usage/restructuredtext/domains>`.
+ Can also be ``None`` to disable a default domain. The default is ``'py'``.
+ Those objects in other domains (whether the domain name is given explicitly,
+ or selected by a :rst:dir:`default-domain` directive) will have the domain
+ name explicitly prepended when named (e.g., when the default domain is C,
+ Python functions will be named "Python function", not just "function").
+
+ .. versionadded:: 1.0
+
+.. confval:: default_role
+
+ .. index:: default; role
+
+ The name of a reST role (builtin or Sphinx extension) to use as the default
+ role, that is, for text marked up ```like this```. This can be set to
+ ``'py:obj'`` to make ```filter``` a cross-reference to the Python function
+ "filter". The default is ``None``, which doesn't reassign the default role.
+
+ The default role can always be set within individual documents using the
+ standard reST :dudir:`default-role` directive.
+
+ .. versionadded:: 0.4
+
+.. confval:: keep_warnings
+
+ If true, keep warnings as "system message" paragraphs in the built
+ documents. Regardless of this setting, warnings are always written to the
+ standard error stream when ``sphinx-build`` is run.
+
+ The default is ``False``, the pre-0.5 behavior was to always keep them.
+
+ .. versionadded:: 0.5
+
+.. confval:: suppress_warnings
+
+ A list of warning types to suppress arbitrary warning messages.
+
+ Sphinx supports following warning types:
+
+ * ``app.add_node``
+ * ``app.add_directive``
+ * ``app.add_role``
+ * ``app.add_generic_role``
+ * ``app.add_source_parser``
+ * ``autosectionlabel.*``
+ * ``download.not_readable``
+ * ``epub.unknown_project_files``
+ * ``epub.duplicated_toc_entry``
+ * ``i18n.inconsistent_references``
+ * ``index``
+ * ``image.not_readable``
+ * ``ref.term``
+ * ``ref.ref``
+ * ``ref.numref``
+ * ``ref.keyword``
+ * ``ref.option``
+ * ``ref.citation``
+ * ``ref.footnote``
+ * ``ref.doc``
+ * ``ref.python``
+ * ``misc.highlighting_failure``
+ * ``toc.circular``
+ * ``toc.excluded``
+ * ``toc.not_readable``
+ * ``toc.secnum``
+
+ You can choose from these types. You can also give only the first
+ component to exclude all warnings attached to it.
+
+ Now, this option should be considered *experimental*.
+
+ .. versionadded:: 1.4
+
+ .. versionchanged:: 1.5
+
+ Added ``misc.highlighting_failure``
+
+ .. versionchanged:: 1.5.1
+
+ Added ``epub.unknown_project_files``
+
+ .. versionchanged:: 1.6
+
+ Added ``ref.footnote``
+
+ .. versionchanged:: 2.1
+
+ Added ``autosectionlabel.*``
+
+ .. versionchanged:: 3.3.0
+
+ Added ``epub.duplicated_toc_entry``
+
+ .. versionchanged:: 4.3
+
+ Added ``toc.excluded`` and ``toc.not_readable``
+
+ .. versionadded:: 4.5
+
+ Added ``i18n.inconsistent_references``
+
+ .. versionadded:: 7.1
+
+ Added ``index`` warning type.
+
+.. confval:: needs_sphinx
+
+ If set to a ``major.minor`` version string like ``'1.1'``, Sphinx will
+ compare it with its version and refuse to build if it is too old. Default
+ is no requirement.
+
+ .. versionadded:: 1.0
+
+ .. versionchanged:: 1.4
+ also accepts micro version string
+
+.. confval:: needs_extensions
+
+ This value can be a dictionary specifying version requirements for
+ extensions in :confval:`extensions`, e.g. ``needs_extensions =
+ {'sphinxcontrib.something': '1.5'}``. The version strings should be in the
+ form ``major.minor``. Requirements do not have to be specified for all
+ extensions, only for those you want to check.
+
+ This requires that the extension specifies its version to Sphinx (see
+ :ref:`dev-extensions` for how to do that).
+
+ .. versionadded:: 1.3
+
+.. confval:: manpages_url
+
+ A URL to cross-reference :rst:role:`manpage` roles. If this is
+ defined to ``https://manpages.debian.org/{path}``, the
+ :literal:`:manpage:`man(1)`` role will link to
+ <https://manpages.debian.org/man(1)>. The patterns available are:
+
+ * ``page`` - the manual page (``man``)
+ * ``section`` - the manual section (``1``)
+ * ``path`` - the original manual page and section specified (``man(1)``)
+
+ This also supports manpages specified as ``man.1``.
+
+ .. note:: This currently affects only HTML writers but could be
+ expanded in the future.
+
+ .. versionadded:: 1.7
+
+.. confval:: nitpicky
+
+ If true, Sphinx will warn about *all* references where the target cannot be
+ found. Default is ``False``. You can activate this mode temporarily using
+ the :option:`-n <sphinx-build -n>` command-line switch.
+
+ .. versionadded:: 1.0
+
+.. confval:: nitpick_ignore
+
+ A set or 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 if present. Example entries would be
+ ``('py:func', 'int')`` or ``('envvar', 'LD_LIBRARY_PATH')``.
+
+ .. versionadded:: 1.1
+ .. versionchanged:: 6.2
+ Changed allowable container types to a set, list, or tuple
+
+.. confval:: nitpick_ignore_regex
+
+ An extended version of :confval:`nitpick_ignore`, which instead interprets
+ the ``type`` and ``target`` strings as regular expressions. Note, that the
+ regular expression must match the whole string (as if the ``^`` and ``$``
+ markers were inserted).
+
+ For example, ``(r'py:.*', r'foo.*bar\.B.*')`` will ignore nitpicky warnings
+ for all python entities that start with ``'foo'`` and have ``'bar.B'`` in
+ them, such as ``('py:const', 'foo_package.bar.BAZ_VALUE')`` or
+ ``('py:class', 'food.bar.Barman')``.
+
+ .. versionadded:: 4.1
+ .. versionchanged:: 6.2
+ Changed allowable container types to a set, list, or tuple
+
+.. confval:: numfig
+
+ If true, figures, tables and code-blocks are automatically numbered if they
+ have a caption. The :rst:role:`numref` role is enabled.
+ Obeyed so far only by HTML and LaTeX builders. Default is ``False``.
+
+ .. note::
+
+ The LaTeX builder always assigns numbers whether this option is enabled
+ or not.
+
+ .. versionadded:: 1.3
+
+.. confval:: numfig_format
+
+ A dictionary mapping ``'figure'``, ``'table'``, ``'code-block'`` and
+ ``'section'`` to strings that are used for format of figure numbers.
+ As a special character, ``%s`` will be replaced to figure number.
+
+ Default is to use ``'Fig. %s'`` for ``'figure'``, ``'Table %s'`` for
+ ``'table'``, ``'Listing %s'`` for ``'code-block'`` and ``'Section %s'`` for
+ ``'section'``.
+
+ .. versionadded:: 1.3
+
+.. confval:: numfig_secnum_depth
+
+ - if set to ``0``, figures, tables and code-blocks are continuously numbered
+ starting at ``1``.
+ - if ``1`` (default) numbers will be ``x.1``, ``x.2``, ... with ``x``
+ the section number (top level sectioning; no ``x.`` if no section).
+ This naturally applies only if section numbering has been activated via
+ the ``:numbered:`` option of the :rst:dir:`toctree` directive.
+ - ``2`` means that numbers will be ``x.y.1``, ``x.y.2``, ... if located in
+ a sub-section (but still ``x.1``, ``x.2``, ... if located directly under a
+ section and ``1``, ``2``, ... if not in any top level section.)
+ - etc...
+
+ .. versionadded:: 1.3
+
+ .. versionchanged:: 1.7
+ The LaTeX builder obeys this setting (if :confval:`numfig` is set to
+ ``True``).
+
+.. confval:: smartquotes
+
+ If true, the `Docutils Smart Quotes transform`__, originally based on
+ `SmartyPants`__ (limited to English) and currently applying to many
+ languages, will be used to convert quotes and dashes to typographically
+ correct entities. Default: ``True``.
+
+ __ https://docutils.sourceforge.io/docs/user/smartquotes.html
+ __ https://daringfireball.net/projects/smartypants/
+
+ .. versionadded:: 1.6.6
+ It replaces deprecated :confval:`html_use_smartypants`.
+ It applies by default to all builders except ``man`` and ``text``
+ (see :confval:`smartquotes_excludes`.)
+
+ A `docutils.conf`__ file located in the configuration directory (or a
+ global :file:`~/.docutils` file) is obeyed unconditionally if it
+ *deactivates* smart quotes via the corresponding `Docutils option`__. But
+ if it *activates* them, then :confval:`smartquotes` does prevail.
+
+ __ https://docutils.sourceforge.io/docs/user/config.html
+ __ https://docutils.sourceforge.io/docs/user/config.html#smart-quotes
+
+.. confval:: smartquotes_action
+
+ This string customizes the Smart Quotes transform. See the file
+ :file:`smartquotes.py` at the `Docutils repository`__ for details. The
+ default ``'qDe'`` educates normal **q**\ uote characters ``"``, ``'``,
+ em- and en-**D**\ ashes ``---``, ``--``, and **e**\ llipses ``...``.
+
+ .. versionadded:: 1.6.6
+
+ __ https://sourceforge.net/p/docutils/code/HEAD/tree/trunk/docutils/
+
+.. confval:: smartquotes_excludes
+
+ This is a ``dict`` whose default is::
+
+ {'languages': ['ja'], 'builders': ['man', 'text']}
+
+ Each entry gives a sufficient condition to ignore the
+ :confval:`smartquotes` setting and deactivate the Smart Quotes transform.
+ Accepted keys are as above ``'builders'`` or ``'languages'``.
+ The values are lists.
+
+ .. note:: Currently, in case of invocation of :program:`make` with multiple
+ targets, the first target name is the only one which is tested against
+ the ``'builders'`` entry and it decides for all. Also, a ``make text``
+ following ``make html`` needs to be issued in the form ``make text
+ O="-E"`` to force re-parsing of source files, as the cached ones are
+ already transformed. On the other hand the issue does not arise with
+ direct usage of :program:`sphinx-build` as it caches
+ (in its default usage) the parsed source files in per builder locations.
+
+ .. hint:: An alternative way to effectively deactivate (or customize) the
+ smart quotes for a given builder, for example ``latex``, is to use
+ ``make`` this way:
+
+ .. code-block:: console
+
+ make latex O="-D smartquotes_action="
+
+ This can follow some ``make html`` with no problem, in contrast to the
+ situation from the prior note.
+
+ .. versionadded:: 1.6.6
+
+.. confval:: user_agent
+
+ A User-Agent of Sphinx. It is used for a header on HTTP access (ex.
+ linkcheck, intersphinx and so on). Default is ``"Sphinx/X.Y.Z
+ requests/X.Y.Z python/X.Y.Z"``.
+
+ .. versionadded:: 2.3
+
+.. confval:: tls_verify
+
+ If true, Sphinx verifies server certifications. Default is ``True``.
+
+ .. versionadded:: 1.5
+
+.. confval:: tls_cacerts
+
+ A path to a certification file of CA or a path to directory which
+ contains the certificates. This also allows a dictionary mapping
+ hostname to the path to certificate file.
+ The certificates are used to verify server certifications.
+
+ .. versionadded:: 1.5
+
+ .. tip:: Sphinx uses requests_ as a HTTP library internally.
+ Therefore, Sphinx refers a certification file on the
+ directory pointed ``REQUESTS_CA_BUNDLE`` environment
+ variable if ``tls_cacerts`` not set.
+
+ .. _requests: https://requests.readthedocs.io/en/master/
+
+.. confval:: today
+ today_fmt
+
+ These values determine how to format the current date, used as the
+ replacement for ``|today|``.
+
+ * If you set :confval:`today` to a non-empty value, it is used.
+ * Otherwise, the current time is formatted using :func:`time.strftime` and
+ the format given in :confval:`today_fmt`.
+
+ The default is now :confval:`today` and a :confval:`today_fmt` of ``'%b %d,
+ %Y'`` (or, if translation is enabled with :confval:`language`, an equivalent
+ format for the selected locale).
+
+.. confval:: highlight_language
+
+ The default language to highlight source code in. The default is
+ ``'default'``. It is similar to ``'python3'``; it is mostly a superset of
+ ``'python'`` but it fallbacks to ``'none'`` without warning if failed.
+ ``'python3'`` and other languages will emit warning if failed.
+
+ The value should be a valid Pygments lexer name, see
+ :ref:`code-examples` for more details.
+
+ .. versionadded:: 0.5
+
+ .. versionchanged:: 1.4
+ The default is now ``'default'``. If you prefer Python 2 only
+ highlighting, you can set it back to ``'python'``.
+
+.. confval:: highlight_options
+
+ A dictionary that maps language names to options for the lexer modules of
+ Pygments. These are lexer-specific; for the options understood by each,
+ see the `Pygments documentation <https://pygments.org/docs/lexers>`_.
+
+ Example::
+
+ highlight_options = {
+ 'default': {'stripall': True},
+ 'php': {'startinline': True},
+ }
+
+ A single dictionary of options are also allowed. Then it is recognized
+ as options to the lexer specified by :confval:`highlight_language`::
+
+ # configuration for the ``highlight_language``
+ highlight_options = {'stripall': True}
+
+ .. versionadded:: 1.3
+ .. versionchanged:: 3.5
+
+ Allow to configure highlight options for multiple languages
+
+.. confval:: pygments_style
+
+ The style name to use for Pygments highlighting of source code. If not set,
+ either the theme's default style or ``'sphinx'`` is selected for HTML
+ output.
+
+ .. versionchanged:: 0.3
+ If the value is a fully-qualified name of a custom Pygments style class,
+ this is then used as custom style.
+
+.. confval:: maximum_signature_line_length
+
+ If a signature's length in characters exceeds the number set, each
+ parameter within the signature will be displayed on an individual logical
+ line.
+
+ When ``None`` (the default), there is no maximum length and the entire
+ signature will be displayed on a single logical line.
+
+ A 'logical line' is similar to a hard line break---builders or themes may
+ choose to 'soft wrap' a single logical line, and this setting does not affect
+ that behaviour.
+
+ Domains may provide options to suppress any hard wrapping on an individual
+ object directive, such as seen in the C, C++, and Python domains (e.g.
+ :rst:dir:`py:function:single-line-parameter-list`).
+
+ .. versionadded:: 7.1
+
+.. confval:: add_function_parentheses
+
+ A boolean that decides whether parentheses are appended to function and
+ method role text (e.g. the content of ``:func:`input```) to signify that the
+ name is callable. Default is ``True``.
+
+.. confval:: add_module_names
+
+ A boolean that decides whether module names are prepended to all
+ :term:`object` names (for object types where a "module" of some kind is
+ defined), e.g. for :rst:dir:`py:function` directives. Default is ``True``.
+
+.. confval:: toc_object_entries
+
+ Create table of contents entries for domain objects (e.g. functions, classes,
+ attributes, etc.). Default is ``True``.
+
+.. confval:: toc_object_entries_show_parents
+
+ A string that determines how domain objects (e.g. functions, classes,
+ attributes, etc.) are displayed in their table of contents entry.
+
+ Use ``domain`` to allow the domain to determine the appropriate number of
+ parents to show. For example, the Python domain would show ``Class.method()``
+ and ``function()``, leaving out the ``module.`` level of parents.
+ This is the default setting.
+
+ Use ``hide`` to only show the name of the element without any parents
+ (i.e. ``method()``).
+
+ Use ``all`` to show the fully-qualified name for the object
+ (i.e. ``module.Class.method()``), displaying all parents.
+
+ .. versionadded:: 5.2
+
+.. confval:: show_authors
+
+ A boolean that decides whether :rst:dir:`codeauthor` and
+ :rst:dir:`sectionauthor` directives produce any output in the built files.
+
+.. confval:: modindex_common_prefix
+
+ A list of prefixes that are ignored for sorting the Python module index
+ (e.g., if this is set to ``['foo.']``, then ``foo.bar`` is shown under ``B``,
+ not ``F``). This can be handy if you document a project that consists of a
+ single package. Works only for the HTML builder currently. Default is
+ ``[]``.
+
+ .. versionadded:: 0.6
+
+.. confval:: trim_footnote_reference_space
+
+ Trim spaces before footnote references that are necessary for the reST
+ parser to recognize the footnote, but do not look too nice in the output.
+
+ .. versionadded:: 0.6
+
+.. confval:: trim_doctest_flags
+
+ If true, doctest flags (comments looking like ``# doctest: FLAG, ...``) at
+ 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>``.
+
+.. confval:: strip_signature_backslash
+
+ Default is ``False``.
+ When backslash stripping is enabled then every occurrence of ``\\`` in a
+ domain directive will be changed to ``\``, even within string literals.
+ This was the behaviour before version 3.0, and setting this variable to
+ ``True`` will reinstate that behaviour.
+
+ .. versionadded:: 3.0
+
+.. confval:: option_emphasise_placeholders
+
+ Default is ``False``.
+ When enabled, emphasise placeholders in :rst:dir:`option` directives.
+ To display literal braces, escape with a backslash (``\{``). For example,
+ ``option_emphasise_placeholders=True`` and ``.. option:: -foption={TYPE}`` would
+ render with ``TYPE`` emphasised.
+
+ .. versionadded:: 5.1
+
+.. _intl-options:
+
+Options for internationalization
+--------------------------------
+
+These options influence Sphinx's *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`. Sphinx will search
+ language-specific figures named by :confval:`figure_language_filename`
+ (e.g. the German version of ``myfigure.png`` will be ``myfigure.de.png``
+ by default setting) and substitute them for original figures. In the LaTeX
+ builder, a suitable language will be selected as an option for the *Babel*
+ package. Default is ``'en'``.
+
+ .. versionadded:: 0.5
+
+ .. versionchanged:: 1.4
+
+ Support figure substitution
+
+ .. versionchanged:: 5.0
+
+ Currently supported languages by Sphinx are:
+
+ * ``ar`` -- Arabic
+ * ``bg`` -- Bulgarian
+ * ``bn`` -- Bengali
+ * ``ca`` -- Catalan
+ * ``cak`` -- Kaqchikel
+ * ``cs`` -- Czech
+ * ``cy`` -- Welsh
+ * ``da`` -- Danish
+ * ``de`` -- German
+ * ``el`` -- Greek
+ * ``en`` -- English (default)
+ * ``eo`` -- Esperanto
+ * ``es`` -- Spanish
+ * ``et`` -- Estonian
+ * ``eu`` -- Basque
+ * ``fa`` -- Iranian
+ * ``fi`` -- Finnish
+ * ``fr`` -- French
+ * ``he`` -- Hebrew
+ * ``hi`` -- Hindi
+ * ``hi_IN`` -- Hindi (India)
+ * ``hr`` -- Croatian
+ * ``hu`` -- Hungarian
+ * ``id`` -- Indonesian
+ * ``it`` -- Italian
+ * ``ja`` -- Japanese
+ * ``ko`` -- Korean
+ * ``lt`` -- Lithuanian
+ * ``lv`` -- Latvian
+ * ``mk`` -- Macedonian
+ * ``nb_NO`` -- Norwegian Bokmal
+ * ``ne`` -- Nepali
+ * ``nl`` -- Dutch
+ * ``pl`` -- Polish
+ * ``pt`` -- Portuguese
+ * ``pt_BR`` -- Brazilian Portuguese
+ * ``pt_PT`` -- European Portuguese
+ * ``ro`` -- Romanian
+ * ``ru`` -- Russian
+ * ``si`` -- Sinhala
+ * ``sk`` -- Slovak
+ * ``sl`` -- Slovenian
+ * ``sq`` -- Albanian
+ * ``sr`` -- Serbian
+ * ``sr@latin`` -- Serbian (Latin)
+ * ``sr_RS`` -- Serbian (Cyrillic)
+ * ``sv`` -- Swedish
+ * ``ta`` -- Tamil
+ * ``te`` -- Telugu
+ * ``tr`` -- Turkish
+ * ``uk_UA`` -- Ukrainian
+ * ``ur`` -- Urdu
+ * ``vi`` -- Vietnamese
+ * ``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 setting, 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 ``['locales']``.
+
+ .. note:: The :option:`-v option for sphinx-build command <sphinx-build -v>`
+ is useful to check the locale_dirs config works as expected. It
+ emits debug messages if message catalog directory not found.
+
+ .. versionchanged:: 1.5
+ Use ``locales`` directory as a default value
+
+.. confval:: gettext_allow_fuzzy_translations
+
+ If true, "fuzzy" messages in the message catalogs are used for translation.
+ The default is ``False``.
+
+ .. versionadded:: 4.3
+
+.. 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.
+
+ If set to string, all document's text domain is this string, making all
+ documents use single text domain.
+
+ By default, the document ``markup/code.rst`` ends up in the ``markup`` text
+ domain. With this option set to ``False``, it is ``markup/code``.
+
+ .. versionchanged:: 3.3
+ The string value is now accepted.
+
+.. confval:: gettext_uuid
+
+ If true, Sphinx generates uuid information for version tracking in message
+ catalogs. It is used for:
+
+ * Add uid line for each msgids in .pot files.
+ * Calculate similarity between new msgids and previously saved old msgids.
+ This calculation takes a long time.
+
+ If you want to accelerate the calculation, you can use
+ ``python-levenshtein`` 3rd-party package written in C by using
+ :command:`pip install python-levenshtein`.
+
+ The default is ``False``.
+
+ .. versionadded:: 1.3
+
+.. confval:: gettext_location
+
+ If true, Sphinx generates location information for messages in message
+ catalogs.
+
+ The default is ``True``.
+
+ .. versionadded:: 1.3
+
+.. confval:: gettext_auto_build
+
+ If true, Sphinx builds mo file for each translation catalog files.
+
+ The default is ``True``.
+
+ .. versionadded:: 1.3
+
+.. confval:: gettext_additional_targets
+
+ To specify names to enable gettext extracting and translation applying for
+ i18n additionally. You can specify below names:
+
+ :index: index terms
+ :literal-block: literal blocks (``::`` annotation and ``code-block`` directive)
+ :doctest-block: doctest block
+ :raw: raw content
+ :image: image/figure uri
+
+ For example: ``gettext_additional_targets = ['literal-block', 'image']``.
+
+ The default is ``[]``.
+
+ .. versionadded:: 1.3
+ .. versionchanged:: 4.0
+
+ The alt text for image is translated by default.
+
+.. confval:: figure_language_filename
+
+ The filename format for language-specific figures. The default value is
+ ``{root}.{language}{ext}``. It will be expanded to
+ ``dirname/filename.en.png`` from ``.. image:: dirname/filename.png``.
+ The available format tokens are:
+
+ * ``{root}`` - the filename, including any path component, without the file
+ extension, e.g. ``dirname/filename``
+ * ``{path}`` - the directory path component of the filename, with a trailing
+ slash if non-empty, e.g. ``dirname/``
+ * ``{docpath}`` - the directory path component for the current document, with
+ a trailing slash if non-empty.
+ * ``{basename}`` - the filename without the directory path or file extension
+ components, e.g. ``filename``
+ * ``{ext}`` - the file extension, e.g. ``.png``
+ * ``{language}`` - the translation language, e.g. ``en``
+
+ For example, setting this to ``{path}{language}/{basename}{ext}`` will
+ expand to ``dirname/en/filename.png`` instead.
+
+ .. versionadded:: 1.4
+
+ .. versionchanged:: 1.5
+ Added ``{path}`` and ``{basename}`` tokens.
+
+ .. versionchanged:: 3.2
+ Added ``{docpath}`` token.
+
+.. confval:: translation_progress_classes
+
+ Control which, if any, classes are added to indicate translation progress.
+ This setting would likely only be used by translators of documentation,
+ in order to quickly indicate translated and untranslated content.
+
+ * ``True``: add ``translated`` and ``untranslated`` classes
+ to all nodes with translatable content.
+ * ``translated``: only add the ``translated`` class.
+ * ``untranslated``: only add the ``untranslated`` class.
+ * ``False``: do not add any classes to indicate translation progress.
+
+ Defaults to ``False``.
+
+ .. versionadded:: 7.1
+
+.. _math-options:
+
+Options for Math
+----------------
+
+These options influence Math notations.
+
+.. confval:: math_number_all
+
+ Set this option to ``True`` if you want all displayed math to be numbered.
+ The default is ``False``.
+
+.. confval:: math_eqref_format
+
+ A string used for formatting the labels of references to equations.
+ The ``{number}`` place-holder stands for the equation number.
+
+ Example: ``'Eq.{number}'`` gets rendered as, for example, ``Eq.10``.
+
+.. confval:: math_numfig
+
+ If ``True``, displayed math equations are numbered across pages when
+ :confval:`numfig` is enabled. The :confval:`numfig_secnum_depth` setting
+ is respected. The :rst:role:`eq`, not :rst:role:`numref`, role
+ must be used to reference equation numbers. Default is ``True``.
+
+ .. versionadded:: 1.7
+
+
+.. _html-options:
+
+Options for HTML output
+-----------------------
+
+These options influence HTML as well as HTML Help output, and other builders
+that use Sphinx's HTMLWriter class.
+
+.. confval:: html_theme
+
+ The "theme" that the HTML output should use. See the :doc:`section about
+ theming </usage/theming>`. The default is ``'alabaster'``.
+
+ .. versionadded:: 0.6
+
+.. confval:: html_theme_options
+
+ A dictionary of options that influence the look and feel of the selected
+ theme. These are theme-specific. For the options understood by the builtin
+ themes, see :ref:`this section <builtin-themes>`.
+
+ .. versionadded:: 0.6
+
+.. confval:: html_theme_path
+
+ A list of paths that contain custom themes, either as subdirectories or as
+ zip files. Relative paths are taken as relative to the configuration
+ directory.
+
+ .. versionadded:: 0.6
+
+.. confval:: html_style
+
+ The style sheet to use for HTML pages. A file of that name must exist
+ either in Sphinx's :file:`static/` path, or in one of the custom paths given
+ in :confval:`html_static_path`. Default is the stylesheet given by the
+ selected theme. If you only want to add or override a few things compared
+ to the theme's stylesheet, use CSS ``@import`` to import the theme's
+ stylesheet.
+
+.. confval:: html_title
+
+ The "title" for HTML documentation generated with Sphinx's own templates.
+ This is appended to the ``<title>`` tag of individual pages, and used in the
+ navigation bar as the "topmost" element. It defaults to :samp:`'{<project>}
+ v{<revision>} documentation'`.
+
+.. confval:: html_short_title
+
+ A shorter "title" for the HTML docs. This is used for links in the
+ header and in the HTML Help docs. If not given, it defaults to the value of
+ :confval:`html_title`.
+
+ .. versionadded:: 0.4
+
+.. confval:: html_baseurl
+
+ The base URL which points to the root of the HTML documentation. It is used
+ to indicate the location of document using `The Canonical Link Relation`_.
+ Default: ``''``.
+
+ .. _The Canonical Link Relation: https://datatracker.ietf.org/doc/html/rfc6596
+
+ .. versionadded:: 1.8
+
+.. confval:: html_codeblock_linenos_style
+
+ The style of line numbers for code-blocks.
+
+ * ``'table'`` -- display line numbers using ``<table>`` tag
+ * ``'inline'`` -- display line numbers using ``<span>`` tag (default)
+
+ .. versionadded:: 3.2
+ .. versionchanged:: 4.0
+
+ It defaults to ``'inline'``.
+
+ .. deprecated:: 4.0
+
+.. confval:: html_context
+
+ A dictionary of values to pass into the template engine's context for all
+ pages. Single values can also be put in this dictionary using the
+ :option:`-A <sphinx-build -A>` command-line option of ``sphinx-build``.
+
+ .. versionadded:: 0.5
+
+.. confval:: html_logo
+
+ If given, this must be the name of an image file (path relative to the
+ :term:`configuration directory`) that is the logo of the docs, or URL that
+ points an image file for the logo. It is placed at the top of the sidebar;
+ its width should therefore not exceed 200 pixels. Default: ``None``.
+
+ .. versionadded:: 0.4.1
+ The image file will be copied to the ``_static`` directory of the output
+ HTML, but only if the file does not already exist there.
+
+ .. versionchanged:: 4.0
+ Also accepts the URL for the logo file.
+
+.. confval:: html_favicon
+
+ If given, this must be the name of an image file (path relative to the
+ :term:`configuration directory`) that is the favicon of the docs, or URL that
+ points an image file for the favicon. Modern browsers use this as the icon
+ for tabs, windows and bookmarks. It should be a Windows-style icon file
+ (``.ico``), which is 16x16 or 32x32 pixels large. Default: ``None``.
+
+ .. versionadded:: 0.4
+ The image file will be copied to the ``_static`` directory of the output
+ HTML, but only if the file does not already exist there.
+
+ .. versionchanged:: 4.0
+ Also accepts the URL for the favicon.
+
+.. confval:: html_css_files
+
+ A list of CSS files. The entry must be a *filename* string or a tuple
+ containing the *filename* string and the *attributes* dictionary. The
+ *filename* must be relative to the :confval:`html_static_path`, or a full URI
+ with scheme like ``https://example.org/style.css``. The *attributes* is used
+ for attributes of ``<link>`` tag. It defaults to an empty list.
+
+ Example::
+
+ html_css_files = ['custom.css',
+ 'https://example.com/css/custom.css',
+ ('print.css', {'media': 'print'})]
+
+ As a special attribute, *priority* can be set as an integer to load the CSS
+ file earlier or lazier step. For more information, refer
+ :meth:`.Sphinx.add_css_file()`.
+
+ .. versionadded:: 1.8
+ .. versionchanged:: 3.5
+
+ Support priority attribute
+
+.. confval:: html_js_files
+
+ A list of JavaScript *filename*. The entry must be a *filename* string or a
+ tuple containing the *filename* string and the *attributes* dictionary. The
+ *filename* must be relative to the :confval:`html_static_path`, or a full
+ URI with scheme like ``https://example.org/script.js``. The *attributes* is
+ used for attributes of ``<script>`` tag. It defaults to an empty list.
+
+ Example::
+
+ html_js_files = ['script.js',
+ 'https://example.com/scripts/custom.js',
+ ('custom.js', {'async': 'async'})]
+
+ As a special attribute, *priority* can be set as an integer to load the CSS
+ file earlier or lazier step. For more information, refer
+ :meth:`.Sphinx.add_css_file()`.
+
+ .. versionadded:: 1.8
+ .. versionchanged:: 3.5
+
+ Support priority attribute
+
+.. confval:: html_static_path
+
+ A list of paths that contain custom static files (such as style
+ sheets or script files). Relative paths are taken as relative to
+ the configuration directory. They are copied to the output's
+ :file:`_static` directory after the theme's static files, so a file
+ named :file:`default.css` will overwrite the theme's
+ :file:`default.css`.
+
+ As these files are not meant to be built, they are automatically excluded
+ from source files.
+
+ .. note::
+
+ For security reasons, dotfiles under ``html_static_path`` will
+ not be copied. If you would like to copy them intentionally, please
+ add each filepath to this setting::
+
+ html_static_path = ['_static', '_static/.htaccess']
+
+ Another way to do that, you can also use
+ :confval:`html_extra_path`. It allows to copy dotfiles under
+ the directories.
+
+ .. versionchanged:: 0.4
+ The paths in :confval:`html_static_path` can now contain subdirectories.
+
+ .. versionchanged:: 1.0
+ The entries in :confval:`html_static_path` can now be single files.
+
+ .. versionchanged:: 1.8
+ The files under :confval:`html_static_path` are excluded from source
+ files.
+
+.. confval:: html_extra_path
+
+ A list of paths that contain extra files not directly related to
+ the documentation, such as :file:`robots.txt` or :file:`.htaccess`.
+ Relative paths are taken as relative to the configuration
+ directory. They are copied to the output directory. They will
+ overwrite any existing file of the same name.
+
+ As these files are not meant to be built, they are automatically excluded
+ from source files.
+
+ .. versionadded:: 1.2
+
+ .. versionchanged:: 1.4
+ The dotfiles in the extra directory will be copied to the output
+ directory. And it refers :confval:`exclude_patterns` on copying extra
+ files and directories, and ignores if path matches to patterns.
+
+.. confval:: html_last_updated_fmt
+
+ If this is not None, a 'Last updated on:' timestamp is inserted
+ at every page bottom, using the given :func:`~time.strftime` format.
+ The empty string is equivalent to ``'%b %d, %Y'`` (or a
+ locale-dependent equivalent).
+
+.. confval:: html_use_smartypants
+
+ If true, quotes and dashes are converted to typographically correct
+ entities. Default: ``True``.
+
+ .. deprecated:: 1.6
+ To disable smart quotes, use rather :confval:`smartquotes`.
+
+.. confval:: html_permalinks
+
+ Add link anchors for each heading and description environment.
+ Default: ``True``.
+
+ .. versionadded:: 3.5
+
+.. confval:: html_permalinks_icon
+
+ Text for link anchors for each heading and description environment.
+ HTML entities and Unicode are allowed. Default: a paragraph sign; ``¶``
+
+ .. versionadded:: 3.5
+
+.. confval:: html_sidebars
+
+ Custom sidebar templates, must be a dictionary that maps document names to
+ template names.
+
+ The keys can contain glob-style patterns [1]_, in which case all matching
+ documents will get the specified sidebars. (A warning is emitted when a
+ more than one glob-style pattern matches for any document.)
+
+ The values can be either lists or single strings.
+
+ * If a value is a list, it specifies the complete list of sidebar templates
+ to include. If all or some of the default sidebars are to be included,
+ they must be put into this list as well.
+
+ The default sidebars (for documents that don't match any pattern) are
+ defined by theme itself. Builtin themes are using these templates by
+ default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
+ 'searchbox.html']``.
+
+ * If a value is a single string, it specifies a custom sidebar to be added
+ between the ``'sourcelink.html'`` and ``'searchbox.html'`` entries. This
+ is for compatibility with Sphinx versions before 1.0.
+
+ .. deprecated:: 1.7
+
+ a single string value for ``html_sidebars`` will be removed in 2.0
+
+ Builtin sidebar templates that can be rendered are:
+
+ * **localtoc.html** -- a fine-grained table of contents of the current
+ document
+ * **globaltoc.html** -- a coarse-grained table of contents for the whole
+ documentation set, collapsed
+ * **relations.html** -- two links to the previous and next documents
+ * **sourcelink.html** -- a link to the source of the current document, if
+ enabled in :confval:`html_show_sourcelink`
+ * **searchbox.html** -- the "quick search" box
+
+ Example::
+
+ html_sidebars = {
+ '**': ['globaltoc.html', 'sourcelink.html', 'searchbox.html'],
+ 'using/windows': ['windowssidebar.html', 'searchbox.html'],
+ }
+
+ This will render the custom template ``windowssidebar.html`` and the quick
+ search box within the sidebar of the given document, and render the default
+ sidebars for all other pages (except that the local TOC is replaced by the
+ global TOC).
+
+ .. versionadded:: 1.0
+ The ability to use globbing keys and to specify multiple sidebars.
+
+ Note that this value only has no effect if the chosen theme does not possess
+ a sidebar, like the builtin **scrolls** and **haiku** themes.
+
+.. confval:: html_additional_pages
+
+ Additional templates that should be rendered to HTML pages, must be a
+ dictionary that maps document names to template names.
+
+ Example::
+
+ html_additional_pages = {
+ 'download': 'customdownload.html',
+ }
+
+ This will render the template ``customdownload.html`` as the page
+ ``download.html``.
+
+.. confval:: html_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.
+ To find out the index name for a specific index, look at the HTML file name.
+ For example, the Python module index has the name ``'py-modindex'``.
+
+ .. versionadded:: 1.0
+
+.. confval:: html_use_index
+
+ If true, add an index to the HTML documents. Default is ``True``.
+
+ .. versionadded:: 0.4
+
+.. confval:: html_split_index
+
+ If true, the index is generated twice: once as a single page with all the
+ entries, and once as one page per starting letter. Default is ``False``.
+
+ .. versionadded:: 0.4
+
+.. confval:: html_copy_source
+
+ If true, the reST sources are included in the HTML build as
+ :file:`_sources/{name}`. The default is ``True``.
+
+.. confval:: html_show_sourcelink
+
+ If true (and :confval:`html_copy_source` is true as well), links to the
+ reST sources will be added to the sidebar. The default is ``True``.
+
+ .. versionadded:: 0.6
+
+.. confval:: html_sourcelink_suffix
+
+ Suffix to be appended to source links (see :confval:`html_show_sourcelink`),
+ unless they have this suffix already. Default is ``'.txt'``.
+
+ .. versionadded:: 1.5
+
+.. confval:: html_use_opensearch
+
+ If nonempty, an `OpenSearch <https://github.com/dewitt/opensearch>`_
+ description file will be output, and all pages will contain a ``<link>``
+ tag referring to it. Since OpenSearch doesn't support relative URLs for
+ its search page location, the value of this option must be the base URL
+ from which these documents are served (without trailing slash), e.g.
+ ``"https://docs.python.org"``. The default is ``''``.
+
+.. confval:: html_file_suffix
+
+ This is the file name suffix for generated HTML files, if set to a :obj:`str`
+ value. If left to the default ``None``, the suffix will be ``".html"``.
+
+ .. versionadded:: 0.4
+
+.. confval:: html_link_suffix
+
+ Suffix for generated links to HTML files. The default is whatever
+ :confval:`html_file_suffix` is set to; it can be set differently (e.g. to
+ support different web server setups).
+
+ .. versionadded:: 0.6
+
+.. confval:: html_show_copyright
+
+ If true, "(C) Copyright ..." is shown in the HTML footer. Default is
+ ``True``.
+
+ .. versionadded:: 1.0
+
+.. confval:: html_show_search_summary
+
+ If true, the text around the keyword is shown as summary of each search result.
+ Default is ``True``.
+
+ .. versionadded:: 4.5
+
+.. confval:: html_show_sphinx
+
+ If true, "Created using Sphinx" is shown in the HTML footer. Default is
+ ``True``.
+
+ .. versionadded:: 0.4
+
+.. confval:: html_output_encoding
+
+ Encoding of HTML output files. Default is ``'utf-8'``. Note that this
+ encoding name must both be a valid Python encoding name and a valid HTML
+ ``charset`` value.
+
+ .. versionadded:: 1.0
+
+.. confval:: html_compact_lists
+
+ If true, a list all whose items consist of a single paragraph and/or a
+ sub-list all whose items etc... (recursive definition) will not use the
+ ``<p>`` element for any of its items. This is standard docutils behavior.
+ Default: ``True``.
+
+ .. versionadded:: 1.0
+
+.. confval:: html_secnumber_suffix
+
+ Suffix for section numbers. Default: ``". "``. Set to ``" "`` to suppress
+ the final dot on section numbers.
+
+ .. 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:
+
+ * ``da`` -- Danish
+ * ``nl`` -- Dutch
+ * ``en`` -- English
+ * ``fi`` -- Finnish
+ * ``fr`` -- French
+ * ``de`` -- German
+ * ``hu`` -- Hungarian
+ * ``it`` -- Italian
+ * ``ja`` -- Japanese
+ * ``no`` -- Norwegian
+ * ``pt`` -- Portuguese
+ * ``ro`` -- Romanian
+ * ``ru`` -- Russian
+ * ``es`` -- Spanish
+ * ``sv`` -- Swedish
+ * ``tr`` -- Turkish
+ * ``zh`` -- Chinese
+
+ .. admonition:: Accelerating build speed
+
+ Each language (except Japanese) provides its own stemming algorithm.
+ Sphinx uses a Python implementation by default. You can use a C
+ implementation to accelerate building the index file.
+
+ * `PorterStemmer <https://pypi.org/project/PorterStemmer/>`_ (``en``)
+ * `PyStemmer <https://pypi.org/project/PyStemmer/>`_ (all languages)
+
+ .. versionadded:: 1.1
+ With support for ``en`` and ``ja``.
+
+ .. versionchanged:: 1.3
+ Added additional languages.
+
+.. 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:
+ _`type` is dotted module path string to specify Splitter implementation
+ which should be derived from :class:`!sphinx.search.ja.BaseSplitter`. If
+ not specified or ``None`` is specified,
+ ``'sphinx.search.ja.DefaultSplitter'`` will be used.
+
+ You can choose from these modules:
+
+ :'sphinx.search.ja.DefaultSplitter':
+ TinySegmenter algorithm. This is default splitter.
+ :'sphinx.search.ja.MecabSplitter':
+ MeCab binding. To use this splitter, 'mecab' python binding or dynamic
+ link library ('libmecab.so' for linux, 'libmecab.dll' for windows) is
+ required.
+ :'sphinx.search.ja.JanomeSplitter':
+ Janome binding. To use this splitter,
+ `Janome <https://pypi.org/project/Janome/>`_ is required.
+
+ .. deprecated:: 1.6
+ ``'mecab'``, ``'janome'`` and ``'default'`` is deprecated.
+ To keep compatibility, ``'mecab'``, ``'janome'`` and ``'default'`` are
+ also acceptable.
+
+ Other option values depend on splitter value which you choose.
+
+ Options for ``'mecab'``:
+ :dic_enc:
+ _`dic_enc option` is the encoding for the MeCab algorithm.
+ :dict:
+ _`dict option` is the dictionary to use for the MeCab algorithm.
+ :lib:
+ _`lib option` is the library name for finding the MeCab library via
+ ctypes if the Python binding is not installed.
+
+ For example::
+
+ html_search_options = {
+ 'type': 'mecab',
+ 'dic_enc': 'utf-8',
+ 'dict': '/path/to/mecab.dic',
+ 'lib': '/path/to/libmecab.so',
+ }
+
+ Options for ``'janome'``:
+ :user_dic:
+ _`user_dic option` is the user dictionary file path for Janome.
+ :user_dic_enc:
+ _`user_dic_enc option` is the encoding for the user dictionary file
+ specified by ``user_dic`` option. Default is 'utf8'.
+
+ .. versionadded:: 1.1
+
+ .. versionchanged:: 1.4
+ html_search_options for Japanese is re-organized and any custom splitter
+ can be used by `type`_ settings.
+
+ The Chinese support has these options:
+
+ * ``dict`` -- the ``jieba`` dictionary path if want to use
+ custom dictionary.
+
+.. confval:: html_search_scorer
+
+ The name of a JavaScript file (relative to the configuration directory) that
+ implements a search results scorer. If empty, the default will be used.
+
+ .. XXX describe interface for scorer here
+
+ .. versionadded:: 1.2
+
+.. confval:: html_scaled_image_link
+
+ If true, image itself links to the original image if it doesn't have
+ 'target' option or scale related options: 'scale', 'width', 'height'.
+ The default is ``True``.
+
+ Document authors can disable this feature manually with giving
+ ``no-scaled-link`` class to the image:
+
+ .. code-block:: rst
+
+ .. image:: sphinx.png
+ :scale: 50%
+ :class: no-scaled-link
+
+ .. versionadded:: 1.3
+
+ .. versionchanged:: 3.0
+
+ It is disabled for images having ``no-scaled-link`` class
+
+.. confval:: html_math_renderer
+
+ The name of math_renderer extension for HTML output. The default is
+ ``'mathjax'``.
+
+ .. versionadded:: 1.8
+
+.. confval:: html_experimental_html5_writer
+
+ Output is processed with HTML5 writer. Default is ``False``.
+
+ .. versionadded:: 1.6
+
+ .. deprecated:: 2.0
+
+.. confval:: html4_writer
+
+ Output is processed with HTML4 writer. Default is ``False``.
+
+Options for Single HTML output
+-------------------------------
+
+.. confval:: singlehtml_sidebars
+
+ Custom sidebar templates, must be a dictionary that maps document names to
+ template names. And it only allows a key named `'index'`. All other keys
+ are ignored. For more information, refer to :confval:`html_sidebars`. By
+ default, it is same as :confval:`html_sidebars`.
+
+
+.. _htmlhelp-options:
+
+Options for HTML help output
+-----------------------------
+
+.. confval:: htmlhelp_basename
+
+ Output file base name for HTML help builder. Default is ``'pydoc'``.
+
+.. confval:: htmlhelp_file_suffix
+
+ This is the file name suffix for generated HTML help files. The
+ default is ``".html"``.
+
+ .. versionadded:: 2.0
+
+.. confval:: htmlhelp_link_suffix
+
+ Suffix for generated links to HTML files. The default is ``".html"``.
+
+ .. versionadded:: 2.0
+
+
+.. _applehelp-options:
+
+Options for Apple Help output
+-----------------------------
+
+.. versionadded:: 1.3
+
+These options influence the Apple Help output. This builder derives from the
+HTML builder, so the HTML options also apply where appropriate.
+
+.. note::
+
+ Apple Help output will only work on Mac OS X 10.6 and higher, as it
+ requires the :program:`hiutil` and :program:`codesign` command line tools,
+ neither of which are Open Source.
+
+ You can disable the use of these tools using
+ :confval:`applehelp_disable_external_tools`, but the result will not be a
+ valid help book until the indexer is run over the ``.lproj`` folders within
+ the bundle.
+
+.. confval:: applehelp_bundle_name
+
+ The basename for the Apple Help Book. Defaults to the :confval:`project`
+ name.
+
+.. confval:: applehelp_bundle_id
+
+ The bundle ID for the help book bundle.
+
+ .. warning::
+
+ You *must* set this value in order to generate Apple Help.
+
+.. confval:: applehelp_dev_region
+
+ The development region. Defaults to ``'en-us'``, which is Apple’s
+ recommended setting.
+
+.. confval:: applehelp_bundle_version
+
+ The bundle version (as a string). Defaults to ``'1'``.
+
+.. confval:: applehelp_icon
+
+ The help bundle icon file, or ``None`` for no icon. According to Apple's
+ documentation, this should be a 16-by-16 pixel version of the application's
+ icon with a transparent background, saved as a PNG file.
+
+.. confval:: applehelp_kb_product
+
+ The product tag for use with :confval:`applehelp_kb_url`. Defaults to
+ :samp:`'{<project>}-{<release>}'`.
+
+.. confval:: applehelp_kb_url
+
+ The URL for your knowledgebase server,
+ e.g. ``https://example.com/kbsearch.py?p='product'&q='query'&l='lang'``.
+ Help Viewer will replace the values ``'product'``, ``'query'`` and
+ ``'lang'`` at runtime with the contents of :confval:`applehelp_kb_product`,
+ the text entered by the user in the search box and the user's system
+ language respectively.
+
+ Defaults to ``None`` for no remote search.
+
+.. confval:: applehelp_remote_url
+
+ The URL for remote content. You can place a copy of your Help Book's
+ ``Resources`` folder at this location and Help Viewer will attempt to use
+ it to fetch updated content.
+
+ e.g. if you set it to ``https://example.com/help/Foo/`` and Help Viewer
+ wants a copy of ``index.html`` for an English speaking customer, it will
+ look at ``https://example.com/help/Foo/en.lproj/index.html``.
+
+ Defaults to ``None`` for no remote content.
+
+.. confval:: applehelp_index_anchors
+
+ If ``True``, tell the help indexer to index anchors in the generated HTML.
+ This can be useful for jumping to a particular topic using the
+ ``AHLookupAnchor`` function or the ``openHelpAnchor:inBook:`` method in
+ your code. It also allows you to use ``help:anchor`` URLs; see the Apple
+ documentation for more information on this topic.
+
+.. confval:: applehelp_min_term_length
+
+ Controls the minimum term length for the help indexer. Defaults to
+ ``None``, which means the default will be used.
+
+.. confval:: applehelp_stopwords
+
+ Either a language specification (to use the built-in stopwords), or the
+ path to a stopwords plist, or ``None`` if you do not want to use stopwords.
+ The default stopwords plist can be found at
+ ``/usr/share/hiutil/Stopwords.plist`` and contains, at time of writing,
+ stopwords for the following languages:
+
+ ========= ====
+ Language Code
+ ========= ====
+ English en
+ German de
+ Spanish es
+ French fr
+ Swedish sv
+ Hungarian hu
+ Italian it
+ ========= ====
+
+ Defaults to :confval:`language`, or if that is not set, to ``'en'``.
+
+.. confval:: applehelp_locale
+
+ Specifies the locale to generate help for. This is used to determine
+ the name of the ``.lproj`` folder inside the Help Book’s ``Resources``, and
+ is passed to the help indexer.
+
+ Defaults to :confval:`language`, or if that is not set, to ``'en'``.
+
+.. confval:: applehelp_title
+
+ Specifies the help book title. Defaults to :samp:`'{<project>} Help'`.
+
+.. confval:: applehelp_codesign_identity
+
+ Specifies the identity to use for code signing, or ``None`` if code signing
+ is not to be performed.
+
+ Defaults to the value of the environment variable ``CODE_SIGN_IDENTITY``,
+ which is set by Xcode for script build phases, or ``None`` if that variable
+ is not set.
+
+.. confval:: applehelp_codesign_flags
+
+ A *list* of additional arguments to pass to :program:`codesign` when
+ signing the help book.
+
+ Defaults to a list based on the value of the environment variable
+ ``OTHER_CODE_SIGN_FLAGS``, which is set by Xcode for script build phases,
+ or the empty list if that variable is not set.
+
+.. confval:: applehelp_indexer_path
+
+ The path to the :program:`hiutil` program. Defaults to
+ ``'/usr/bin/hiutil'``.
+
+.. confval:: applehelp_codesign_path
+
+ The path to the :program:`codesign` program. Defaults to
+ ``'/usr/bin/codesign'``.
+
+.. confval:: applehelp_disable_external_tools
+
+ If ``True``, the builder will not run the indexer or the code signing tool,
+ no matter what other settings are specified.
+
+ This is mainly useful for testing, or where you want to run the Sphinx
+ build on a non-Mac OS X platform and then complete the final steps on OS X
+ for some reason.
+
+ Defaults to ``False``.
+
+
+.. _epub-options:
+
+Options for epub output
+-----------------------
+
+These options influence the epub output. As this builder derives from the HTML
+builder, the HTML options also apply where appropriate. The actual values for
+some of the options is not really important, they just have to be entered into
+the `Dublin Core metadata <https://dublincore.org/>`_.
+
+.. confval:: epub_basename
+
+ The basename for the epub file. It defaults to the :confval:`project` name.
+
+.. confval:: epub_theme
+
+ The HTML theme for the epub output. Since the default themes are not
+ optimized for small screen space, using the same theme for HTML and epub
+ output is usually not wise. This defaults to ``'epub'``, a theme designed
+ to save visual space.
+
+.. confval:: epub_theme_options
+
+ A dictionary of options that influence the look and feel of the selected
+ theme. These are theme-specific. For the options understood by the builtin
+ themes, see :ref:`this section <builtin-themes>`.
+
+ .. versionadded:: 1.2
+
+.. confval:: epub_title
+
+ The title of the document. It defaults to the :confval:`html_title` option
+ but can be set independently for epub creation. It defaults to the
+ :confval:`project` option.
+
+ .. versionchanged:: 2.0
+ It defaults to the ``project`` option.
+
+.. confval:: epub_description
+
+ The description of the document. The default value is ``'unknown'``.
+
+ .. versionadded:: 1.4
+
+ .. versionchanged:: 1.5
+ Renamed from ``epub3_description``
+
+.. confval:: epub_author
+
+ The author of the document. This is put in the Dublin Core metadata. It
+ defaults to the :confval:`author` option.
+
+.. confval:: epub_contributor
+
+ The name of a person, organization, etc. that played a secondary role in
+ the creation of the content of an EPUB Publication. The default value is
+ ``'unknown'``.
+
+ .. versionadded:: 1.4
+
+ .. versionchanged:: 1.5
+ Renamed from ``epub3_contributor``
+
+.. confval:: epub_language
+
+ The language of the document. This is put in the Dublin Core metadata. The
+ default is the :confval:`language` option or ``'en'`` if unset.
+
+.. confval:: epub_publisher
+
+ The publisher of the document. This is put in the Dublin Core metadata.
+ You may use any sensible string, e.g. the project homepage. The defaults to
+ the :confval:`author` option.
+
+.. confval:: epub_copyright
+
+ The copyright of the document. It defaults to the :confval:`copyright`
+ option but can be set independently for epub creation.
+
+.. confval:: epub_identifier
+
+ An identifier for the document. This is put in the Dublin Core metadata.
+ For published documents this is the ISBN number, but you can also use an
+ alternative scheme, e.g. the project homepage. The default value is
+ ``'unknown'``.
+
+.. confval:: epub_scheme
+
+ The publication scheme for the :confval:`epub_identifier`. This is put in
+ the Dublin Core metadata. For published books the scheme is ``'ISBN'``. If
+ you use the project homepage, ``'URL'`` seems reasonable. The default value
+ is ``'unknown'``.
+
+.. confval:: epub_uid
+
+ A unique identifier for the document. This is put in the Dublin Core
+ metadata. You may use a
+ `XML's Name format <https://www.w3.org/TR/REC-xml/#NT-NameStartChar>`_
+ string. You can't use hyphen, period, numbers as a first character. 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_css_files
+
+ A list of CSS files. The entry must be a *filename* string or a tuple
+ containing the *filename* string and the *attributes* dictionary. For more
+ information, see :confval:`html_css_files`.
+
+ .. versionadded:: 1.8
+
+.. confval:: epub_guide
+
+ Meta data for the guide element of :file:`content.opf`. This is a
+ sequence of tuples containing the *type*, the *uri* and the *title* of
+ the optional guide information. See the OPF documentation
+ at `<http://idpf.org/epub>`_ for details. If possible, default entries
+ for the *cover* and *toc* types are automatically inserted. However,
+ the types can be explicitly overwritten if the default entries are not
+ appropriate. Example::
+
+ epub_guide = (('cover', 'cover.html', 'Cover Page'),)
+
+ The default value is ``()``.
+
+.. confval:: epub_pre_files
+
+ Additional files that should be inserted before the text generated by
+ Sphinx. It is a list of tuples containing the file name and the title.
+ If the title is empty, no entry is added to :file:`toc.ncx`. Example::
+
+ epub_pre_files = [
+ ('index.html', 'Welcome'),
+ ]
+
+ The default value is ``[]``.
+
+.. confval:: epub_post_files
+
+ Additional files that should be inserted after the text generated by Sphinx.
+ It is a list of tuples containing the file name and the title. This option
+ can be used to add an appendix. If the title is empty, no entry is added
+ to :file:`toc.ncx`. The default value is ``[]``.
+
+.. confval:: epub_exclude_files
+
+ A list of files that are generated/copied in the build directory but should
+ not be included in the epub file. The default value is ``[]``.
+
+.. confval:: epub_tocdepth
+
+ The depth of the table of contents in the file :file:`toc.ncx`. It should
+ be an integer greater than zero. The default value is 3. Note: A deeply
+ nested table of contents may be difficult to navigate.
+
+.. confval:: epub_tocdup
+
+ This flag determines if a toc entry is inserted again at the beginning of
+ its nested toc listing. This allows easier navigation to the top of
+ a chapter, but can be confusing because it mixes entries of different
+ depth in one list. The default value is ``True``.
+
+.. confval:: epub_tocscope
+
+ This setting control the scope of the epub table of contents. The setting
+ can have the following values:
+
+ * ``'default'`` -- include all toc entries that are not hidden (default)
+ * ``'includehidden'`` -- include all toc entries
+
+ .. versionadded:: 1.2
+
+.. confval:: epub_fix_images
+
+ This flag determines if sphinx should try to fix image formats that are not
+ supported by some epub readers. At the moment palette images with a small
+ color table are upgraded. You need Pillow, the Python Image Library,
+ installed to use this option. The default value is ``False`` because the
+ automatic conversion may lose information.
+
+ .. versionadded:: 1.2
+
+.. confval:: epub_max_image_width
+
+ This option specifies the maximum width of images. If it is set to a value
+ greater than zero, images with a width larger than the given value are
+ scaled accordingly. If it is zero, no scaling is performed. The default
+ value is ``0``. You need the Python Image Library (Pillow) installed to use
+ this option.
+
+ .. versionadded:: 1.2
+
+.. confval:: epub_show_urls
+
+ Control whether to display URL addresses. This is very useful for
+ readers that have no other means to display the linked URL. The
+ settings can have the following values:
+
+ * ``'inline'`` -- display URLs inline in parentheses (default)
+ * ``'footnote'`` -- display URLs in footnotes
+ * ``'no'`` -- do not display URLs
+
+ The display of inline URLs can be customized by adding CSS rules for the
+ class ``link-target``.
+
+ .. versionadded:: 1.2
+
+.. confval:: epub_use_index
+
+ If true, add an index to the epub document. It defaults to the
+ :confval:`html_use_index` option but can be set independently for epub
+ creation.
+
+ .. versionadded:: 1.2
+
+.. confval:: epub_writing_mode
+
+ It specifies writing direction. It can accept ``'horizontal'`` (default) and
+ ``'vertical'``
+
+ .. list-table::
+ :header-rows: 1
+ :stub-columns: 1
+
+ - * ``epub_writing_mode``
+ * ``'horizontal'``
+ * ``'vertical'``
+ - * writing-mode [#]_
+ * ``horizontal-tb``
+ * ``vertical-rl``
+ - * page progression
+ * left to right
+ * right to left
+ - * iBook's Scroll Theme support
+ * scroll-axis is vertical.
+ * scroll-axis is horizontal.
+
+ .. [#] https://developer.mozilla.org/en-US/docs/Web/CSS/writing-mode
+
+
+.. _latex-options:
+
+Options for LaTeX output
+------------------------
+
+These options influence LaTeX output.
+
+.. confval:: latex_engine
+
+ The LaTeX engine to build the docs. The setting can have the following
+ values:
+
+ * ``'pdflatex'`` -- PDFLaTeX (default)
+ * ``'xelatex'`` -- XeLaTeX
+ * ``'lualatex'`` -- LuaLaTeX
+ * ``'platex'`` -- pLaTeX
+ * ``'uplatex'`` -- upLaTeX (default if :confval:`language` is ``'ja'``)
+
+ ``'pdflatex'``\ 's support for Unicode characters is limited.
+
+ .. note::
+
+ 2.0 adds to ``'pdflatex'`` support in Latin language document of
+ occasional Cyrillic or Greek letters or words. This is not automatic,
+ see the discussion of the :confval:`latex_elements` ``'fontenc'`` key.
+
+ If your project uses Unicode characters, setting the engine to
+ ``'xelatex'`` or ``'lualatex'`` and making sure to use an OpenType font
+ with wide-enough glyph coverage is often easier than trying to make
+ ``'pdflatex'`` work with the extra Unicode characters. Since Sphinx 2.0
+ the default is the GNU FreeFont which covers well Latin, Cyrillic and
+ Greek.
+
+ .. versionchanged:: 2.1.0
+
+ Use ``xelatex`` (and LaTeX package ``xeCJK``) by default for Chinese
+ documents.
+
+ .. versionchanged:: 2.2.1
+
+ Use ``xelatex`` by default for Greek documents.
+
+ .. versionchanged:: 2.3
+
+ Add ``uplatex`` support.
+
+ .. versionchanged:: 4.0
+
+ ``uplatex`` becomes the default setting of Japanese documents.
+
+ Contrarily to :ref:`MathJaX math rendering in HTML output <math-support>`,
+ LaTeX requires some extra configuration to support Unicode literals in
+ :rst:dir:`math`: the only comprehensive solution (as far as we know) is to
+ use ``'xelatex'`` or ``'lualatex'`` *and* to add
+ ``r'\usepackage{unicode-math}'`` (e.g. via the :confval:`latex_elements`
+ ``'preamble'`` key). You may prefer
+ ``r'\usepackage[math-style=literal]{unicode-math}'`` to keep a Unicode
+ literal such as ``α`` (U+03B1) for example as is in output, rather than
+ being rendered as :math:`\alpha`.
+
+.. confval:: latex_documents
+
+ This value determines how to group the document tree into LaTeX source files.
+ It must be a list of tuples ``(startdocname, targetname, title, author,
+ theme, toctree_only)``, where the items are:
+
+ *startdocname*
+ String that specifies the :term:`document name` of the LaTeX file's master
+ document. All documents referenced by the *startdoc* document in TOC trees
+ will be included in the LaTeX file. (If you want to use the default root
+ document for your LaTeX build, provide your :confval:`root_doc` here.)
+
+ *targetname*
+ File name of the LaTeX file in the output directory.
+
+ *title*
+ LaTeX document title. Can be empty to use the title of the *startdoc*
+ document. This is inserted as LaTeX markup, so special characters like a
+ backslash or ampersand must be represented by the proper LaTeX commands if
+ they are to be inserted literally.
+
+ *author*
+ Author for the LaTeX document. The same LaTeX markup caveat as for *title*
+ applies. Use ``\\and`` to separate multiple authors, as in:
+ ``'John \\and Sarah'`` (backslashes must be Python-escaped to reach LaTeX).
+
+ *theme*
+ LaTeX theme. See :confval:`latex_theme`.
+
+ *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 LaTeX output.
+
+ .. versionadded:: 1.2
+ In the past including your own document class required you to prepend the
+ document class name with the string "sphinx". This is not necessary
+ anymore.
+
+ .. versionadded:: 0.3
+ The 6th item ``toctree_only``. Tuples with 5 items are still accepted.
+
+.. confval:: latex_logo
+
+ If given, this must be the name of an image file (relative to the
+ configuration directory) that is the logo of the docs. It is placed at the
+ top of the title page. Default: ``None``.
+
+.. confval:: latex_toplevel_sectioning
+
+ This value determines the topmost sectioning unit. It should be chosen from
+ ``'part'``, ``'chapter'`` or ``'section'``. The default is ``None``;
+ the topmost
+ sectioning unit is switched by documentclass: ``section`` is used if
+ documentclass will be ``howto``, otherwise ``chapter`` will be used.
+
+ Note that if LaTeX uses ``\part`` command, then the numbering of sectioning
+ units one level deep gets off-sync with HTML numbering, because LaTeX
+ numbers continuously ``\chapter`` (or ``\section`` for ``howto``.)
+
+ .. versionadded:: 1.4
+
+.. confval:: latex_appendices
+
+ A list of document names to append as an appendix to all manuals.
+
+.. confval:: latex_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.0
+
+.. confval:: latex_show_pagerefs
+
+ If true, add page references after internal references. This is very useful
+ for printed copies of the manual. Default is ``False``.
+
+ .. versionadded:: 1.0
+
+.. confval:: latex_show_urls
+
+ 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_use_latex_multicolumn
+
+ The default is ``False``: it means that Sphinx's own macros are used for
+ merged cells from grid tables. They allow general contents (literal blocks,
+ lists, blockquotes, ...) but may have problems if the
+ :rst:dir:`tabularcolumns` directive was used to inject LaTeX mark-up of the
+ type ``>{..}``, ``<{..}``, ``@{..}`` as column specification.
+
+ Setting to ``True`` means to use LaTeX's standard ``\multicolumn``; this is
+ incompatible with literal blocks in the horizontally merged cell, and also
+ with multiple paragraphs in such cell if the table is rendered using
+ ``tabulary``.
+
+ .. versionadded:: 1.6
+
+.. confval:: latex_table_style
+
+ A list of styling classes (strings). Currently supported:
+
+ - ``'booktabs'``: no vertical lines, and only 2 or 3 horizontal lines (the
+ latter if there is a header), using the booktabs_ package.
+
+ - ``'borderless'``: no lines whatsoever.
+
+ - ``'colorrows'``: the table rows are rendered with alternating background
+ colours. The interface to customize them is via :ref:`dedicated keys
+ <tablecolors>` of :ref:`latexsphinxsetup`.
+
+ .. important::
+
+ With the ``'colorrows'`` style, the ``\rowcolors`` LaTeX command
+ becomes a no-op (this command has limitations and has never correctly
+ supported all types of tables Sphinx produces in LaTeX). Please
+ update your project to use instead
+ the :ref:`latex table color configuration <tablecolors>` keys.
+
+ Default: ``['booktabs', 'colorrows']``
+
+ .. versionadded:: 5.3.0
+
+ .. versionchanged:: 6.0.0
+
+ Modify default from ``[]`` to ``['booktabs', 'colorrows']``.
+
+ Each table can override the global style via ``:class:`` option, or
+ ``.. rst-class::`` for no-directive tables (cf. :ref:`table-directives`).
+ Currently recognized classes are ``booktabs``, ``borderless``,
+ ``standard``, ``colorrows``, ``nocolorrows``. The latter two can be
+ combined with any of the first three. The ``standard`` class produces
+ tables with both horizontal and vertical lines (as has been the default so
+ far with Sphinx).
+
+ A single-row multi-column merged cell will obey the row colour, if it is
+ set. See also ``TableMergeColor{Header,Odd,Even}`` in the
+ :ref:`latexsphinxsetup` section.
+
+ .. note::
+
+ - It is hard-coded in LaTeX that a single cell will obey the row colour
+ even if there is a column colour set via ``\columncolor`` from a
+ column specification (see :rst:dir:`tabularcolumns`). Sphinx provides
+ ``\sphinxnorowcolor`` which can be used like this:
+
+ .. code-block:: latex
+
+ >{\columncolor{blue}\sphinxnorowcolor}
+
+ in a table column specification.
+
+ - Sphinx also provides ``\sphinxcolorblend`` which however requires the
+ xcolor_ package. Here is an example:
+
+ .. code-block:: latex
+
+ >{\sphinxcolorblend{!95!red}}
+
+ It means that in this column, the row colours will be slightly tinted
+ by red; refer to xcolor_ documentation for more on the syntax of its
+ ``\blendcolors`` command (a ``\blendcolors`` in place of
+ ``\sphinxcolorblend`` would modify colours of the cell *contents*, not
+ of the cell *background colour panel*...). You can find an example of
+ usage in the :ref:`dev-deprecated-apis` section of this document in
+ PDF format.
+
+ .. hint::
+
+ If you want to use a special colour for the *contents* of the
+ cells of a given column use ``>{\noindent\color{<color>}}``,
+ possibly in addition to the above.
+
+ - Multi-row merged cells, whether single column or multi-column
+ currently ignore any set column, row, or cell colour.
+
+ - It is possible for a simple cell to set a custom colour via the
+ :dudir:`raw` directive and the ``\cellcolor`` LaTeX command used
+ anywhere in the cell contents. This currently is without effect
+ in a merged cell, whatever its kind.
+
+ .. hint::
+
+ In a document not using ``'booktabs'`` globally, it is possible to style
+ an individual table via the ``booktabs`` class, but it will be necessary
+ to add ``r'\usepackage{booktabs}'`` to the LaTeX preamble.
+
+ On the other hand one can use ``colorrows`` class for individual tables
+ with no extra package (as Sphinx since 5.3.0 always loads colortbl_).
+
+ .. _booktabs: https://ctan.org/pkg/booktabs
+ .. _colortbl: https://ctan.org/pkg/colortbl
+ .. _xcolor: https://ctan.org/pkg/xcolor
+
+.. confval:: latex_use_xindy
+
+ If ``True``, the PDF build from the LaTeX files created by Sphinx
+ will use :program:`xindy` (doc__) rather than :program:`makeindex`
+ for preparing the index of general terms (from :rst:dir:`index`
+ usage). This means that words with UTF-8 characters will get
+ ordered correctly for the :confval:`language`.
+
+ __ http://xindy.sourceforge.net/
+
+ - This option is ignored if :confval:`latex_engine` is ``'platex'``
+ (Japanese documents; :program:`mendex` replaces :program:`makeindex`
+ then).
+
+ - The default is ``True`` for ``'xelatex'`` or ``'lualatex'`` as
+ :program:`makeindex`, if any indexed term starts with a non-ascii
+ character, creates ``.ind`` files containing invalid bytes for
+ UTF-8 encoding. With ``'lualatex'`` this then breaks the PDF
+ build.
+
+ - The default is ``False`` for ``'pdflatex'`` but ``True`` is
+ recommended for non-English documents as soon as some indexed
+ terms use non-ascii characters from the language script.
+
+ Sphinx adds to :program:`xindy` base distribution some dedicated support
+ for using ``'pdflatex'`` engine with Cyrillic scripts. And whether with
+ ``'pdflatex'`` or Unicode engines, Cyrillic documents handle correctly the
+ indexing of Latin names, even with diacritics.
+
+ .. versionadded:: 1.8
+
+.. confval:: latex_elements
+
+ .. versionadded:: 0.5
+
+ Its :ref:`documentation <latex_elements_confval>` has moved to :doc:`/latex`.
+
+.. confval:: latex_docclass
+
+ A dictionary mapping ``'howto'`` and ``'manual'`` to names of real document
+ classes that will be used as the base for the two Sphinx classes. Default
+ is to use ``'article'`` for ``'howto'`` and ``'report'`` for ``'manual'``.
+
+ .. versionadded:: 1.0
+
+ .. versionchanged:: 1.5
+
+ In Japanese docs (:confval:`language` is ``'ja'``), by default
+ ``'jreport'`` is used for ``'howto'`` and ``'jsbook'`` for ``'manual'``.
+
+.. confval:: latex_additional_files
+
+ A list of file names, relative to the configuration directory, to copy to
+ the build directory when building LaTeX output. This is useful to copy
+ files that Sphinx doesn't copy automatically, e.g. if they are referenced in
+ custom LaTeX added in ``latex_elements``. Image files that are referenced
+ in source files (e.g. via ``.. image::``) are copied automatically.
+
+ You have to make sure yourself that the filenames don't collide with those
+ of any automatically copied files.
+
+ .. attention::
+
+ Filenames with extension ``.tex`` will automatically be handed over to
+ the PDF build process triggered by :option:`sphinx-build -M`
+ ``latexpdf`` or by :program:`make latexpdf`. If the file was added only
+ to be ``\input{}`` from a modified preamble, you must add a further
+ suffix such as ``.txt`` to the filename and adjust accordingly the
+ ``\input{}`` command added to the LaTeX document preamble.
+
+ .. versionadded:: 0.6
+
+ .. versionchanged:: 1.2
+ This overrides the files which is provided from Sphinx such as
+ ``sphinx.sty``.
+
+.. confval:: latex_theme
+
+ The "theme" that the LaTeX output should use. It is a collection of settings
+ for LaTeX output (ex. document class, top level sectioning unit and so on).
+
+ As a built-in LaTeX themes, ``manual`` and ``howto`` are bundled.
+
+ ``manual``
+ A LaTeX theme for writing a manual. It imports the ``report`` document
+ class (Japanese documents use ``jsbook``).
+
+ ``howto``
+ A LaTeX theme for writing an article. It imports the ``article`` document
+ class (Japanese documents use ``jreport`` rather). :confval:`latex_appendices`
+ is available only for this theme.
+
+ It defaults to ``'manual'``.
+
+ .. versionadded:: 3.0
+
+.. confval:: latex_theme_options
+
+ A dictionary of options that influence the look and feel of the selected
+ theme.
+
+ .. versionadded:: 3.1
+
+.. confval:: latex_theme_path
+
+ A list of paths that contain custom LaTeX themes as subdirectories. Relative
+ paths are taken as relative to the configuration directory.
+
+ .. versionadded:: 3.0
+
+
+.. _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
+
+.. confval:: text_add_secnumbers
+
+ A boolean that decides whether section numbers are included in text output.
+ Default is ``True``.
+
+ .. versionadded:: 1.7
+
+.. confval:: text_secnumber_suffix
+
+ Suffix for section numbers in text output. Default: ``". "``. Set to
+ ``" "`` to suppress the final dot on section numbers.
+
+ .. versionadded:: 1.7
+
+
+.. _man-options:
+
+Options for manual page output
+------------------------------
+
+These options influence manual page output.
+
+.. confval:: man_pages
+
+ This value determines how to group the document tree into manual pages. It
+ must be a list of tuples ``(startdocname, name, description, authors,
+ section)``, where the items are:
+
+ *startdocname*
+ String that specifies the :term:`document name` of the manual page's master
+ document. All documents referenced by the *startdoc* document in TOC trees
+ will be included in the manual file. (If you want to use the default
+ root document for your manual pages build, use your :confval:`root_doc`
+ here.)
+
+ *name*
+ Name of the manual page. This should be a short string without spaces or
+ special characters. It is used to determine the file name as 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.
+ Can be an empty string if you do not want to automatically generate
+ 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.
+
+ *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
+
+.. confval:: man_make_section_directory
+
+ If true, make a section directory on build man page. Default is True.
+
+ .. versionadded:: 3.3
+ .. versionchanged:: 4.0
+
+ The default is changed to ``False`` from ``True``.
+
+ .. versionchanged:: 4.0.2
+
+ The default is changed to ``True`` from ``False`` again.
+
+.. _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*
+ String that specifies the :term:`document name` of the the Texinfo file's
+ master document. All documents referenced by the *startdoc* document in
+ TOC trees will be included in the Texinfo file. (If you want to use the
+ default master document for your Texinfo build, provide your
+ :confval:`root_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*
+ document. 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_no_detailmenu
+
+ If true, do not generate a ``@detailmenu`` in the "Top" node's menu
+ containing entries for each sub-node in the document. Default is ``False``.
+
+ .. versionadded:: 1.2
+
+.. 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'``
+
+ .. versionadded:: 1.1
+
+.. confval:: texinfo_cross_references
+
+ If false, do not generate inline references in a document. That makes
+ an info file more readable with stand-alone reader (``info``).
+ Default is ``True``.
+
+ .. versionadded:: 4.4
+
+.. _qthelp-options:
+
+Options for QtHelp output
+--------------------------
+
+These options influence qthelp output. As this builder derives from the HTML
+builder, the HTML options also apply where appropriate.
+
+.. confval:: qthelp_basename
+
+ The basename for the qthelp file. It defaults to the :confval:`project`
+ name.
+
+.. confval:: qthelp_namespace
+
+ The namespace for the qthelp file. It defaults to
+ ``org.sphinx.<project_name>.<project_version>``.
+
+.. confval:: qthelp_theme
+
+ The HTML theme for the qthelp output.
+ This defaults to ``'nonav'``.
+
+.. confval:: qthelp_theme_options
+
+ A dictionary of options that influence the look and feel of the selected
+ theme. These are theme-specific. For the options understood by the builtin
+ themes, see :ref:`this section <builtin-themes>`.
+
+
+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_allowed_redirects
+
+ A dictionary that maps a pattern of the source URI to a pattern of the canonical
+ URI. The linkcheck builder treats the redirected link as "working" when:
+
+ - the link in the document matches the source URI pattern, and
+ - the redirect location matches the canonical URI pattern.
+
+ Example:
+
+ .. code-block:: python
+
+ linkcheck_allowed_redirects = {
+ # All HTTP redirections from the source URI to the canonical URI will be treated as "working".
+ r'https://sphinx-doc\.org/.*': r'https://sphinx-doc\.org/en/master/.*'
+ }
+
+ If set, linkcheck builder will emit a warning when disallowed redirection
+ found. It's useful to detect unexpected redirects under :option:`the
+ warn-is-error mode <sphinx-build -W>`.
+
+ .. versionadded:: 4.1
+
+.. confval:: linkcheck_request_headers
+
+ A dictionary that maps baseurls to HTTP request headers.
+
+ The key is a URL base string like ``"https://www.sphinx-doc.org/"``. To specify
+ headers for other hosts, ``"*"`` can be used. It matches all hosts only when
+ the URL does not match other settings.
+
+ The value is a dictionary that maps header name to its value.
+
+ Example:
+
+ .. code-block:: python
+
+ linkcheck_request_headers = {
+ "https://www.sphinx-doc.org/": {
+ "Accept": "text/html",
+ "Accept-Encoding": "utf-8",
+ },
+ "*": {
+ "Accept": "text/html,application/xhtml+xml",
+ }
+ }
+
+ .. versionadded:: 3.1
+
+.. confval:: linkcheck_retries
+
+ The number of times the linkcheck builder will attempt to check a URL before
+ declaring it broken. Defaults to 1 attempt.
+
+ .. versionadded:: 1.4
+
+.. confval:: linkcheck_timeout
+
+ A timeout value, in seconds, for the linkcheck builder. 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
+
+.. confval:: linkcheck_anchors
+
+ If true, check the validity of ``#anchor``\ s in links. Since this requires
+ downloading the whole document, it's considerably slower when enabled.
+ Default is ``True``.
+
+ .. versionadded:: 1.2
+
+.. confval:: linkcheck_anchors_ignore
+
+ A list of regular expressions that match anchors Sphinx should skip when
+ checking the validity of anchors in links. This allows skipping anchors that
+ a website's JavaScript adds to control dynamic pages or when triggering an
+ internal REST request. Default is ``["^!"]``.
+
+ .. tip::
+
+ Use :confval:`linkcheck_anchors_ignore_for_url` to check a URL,
+ but skip verifying that the anchors exist.
+
+ .. note::
+
+ If you want to ignore anchors of a specific page or of pages that match a
+ specific pattern (but still check occurrences of the same page(s) that
+ don't have anchors), use :confval:`linkcheck_ignore` instead, for example
+ as follows::
+
+ linkcheck_ignore = [
+ 'https://www.sphinx-doc.org/en/1.7/intro.html#',
+ ]
+
+ .. versionadded:: 1.5
+
+.. confval:: linkcheck_anchors_ignore_for_url
+
+ A list or tuple of regular expressions matching URLs
+ for which Sphinx should not check the validity of anchors.
+ This allows skipping anchor checks on a per-page basis
+ while still checking the validity of the page itself.
+ Default is an empty tuple ``()``.
+
+ .. versionadded:: 7.1
+
+.. confval:: linkcheck_auth
+
+ Pass authentication information when doing a ``linkcheck`` build.
+
+ A list of ``(regex_pattern, auth_info)`` tuples where the items are:
+
+ *regex_pattern*
+ A regular expression that matches a URI.
+ *auth_info*
+ Authentication information to use for that URI. The value can be anything
+ that is understood by the ``requests`` library (see :ref:`requests
+ Authentication <requests:authentication>` for details).
+
+ The ``linkcheck`` builder will use the first matching ``auth_info`` value
+ it can find in the :confval:`linkcheck_auth` list, so values earlier in the
+ list have higher priority.
+
+ Example::
+
+ linkcheck_auth = [
+ ('https://foo\.yourcompany\.com/.+', ('johndoe', 'secret')),
+ ('https://.+\.yourcompany\.com/.+', HTTPDigestAuth(...)),
+ ]
+
+ .. versionadded:: 2.3
+
+.. confval:: linkcheck_rate_limit_timeout
+
+ The ``linkcheck`` builder may issue a large number of requests to the same
+ site over a short period of time. This setting controls the builder behavior
+ when servers indicate that requests are rate-limited.
+
+ If a server indicates when to retry (using the `Retry-After`_ header),
+ ``linkcheck`` always follows the server indication.
+
+ Otherwise, ``linkcheck`` waits for a minute before to retry and keeps
+ doubling the wait time between attempts until it succeeds or exceeds the
+ ``linkcheck_rate_limit_timeout``. By default, the timeout is 5 minutes.
+
+ .. _Retry-After: https://datatracker.ietf.org/doc/html/rfc7231#section-7.1.3
+
+ .. versionadded:: 3.4
+
+.. confval:: linkcheck_exclude_documents
+
+ A list of regular expressions that match documents in which Sphinx should
+ not check the validity of links. This can be used for permitting link decay
+ in legacy or historical sections of the documentation.
+
+ Example::
+
+ # ignore all links in documents located in a subfolder named 'legacy'
+ linkcheck_exclude_documents = [r'.*/legacy/.*']
+
+ .. versionadded:: 4.4
+
+
+Options for the XML builder
+---------------------------
+
+.. confval:: xml_pretty
+
+ If true, pretty-print the XML. Default is ``True``.
+
+ .. versionadded:: 1.2
+
+
+.. rubric:: Footnotes
+
+.. [1] A note on available globbing syntax: you can use the standard shell
+ constructs ``*``, ``?``, ``[...]`` and ``[!...]`` with the feature that
+ these all don't match slashes. A double star ``**`` can be used to
+ match any sequence of characters *including* slashes.
+
+
+.. _c-config:
+
+Options for the C domain
+------------------------
+
+.. confval:: c_id_attributes
+
+ A list of strings that the parser additionally should accept as attributes.
+ This can for example be used when attributes have been ``#define`` d for
+ portability.
+
+ .. versionadded:: 3.0
+
+.. confval:: c_paren_attributes
+
+ A list of strings that the parser additionally should accept as attributes
+ with one argument. That is, if ``my_align_as`` is in the list, then
+ ``my_align_as(X)`` is parsed as an attribute for all strings ``X`` that have
+ balanced braces (``()``, ``[]``, and ``{}``). This can for example be used
+ when attributes have been ``#define`` d for portability.
+
+ .. versionadded:: 3.0
+
+.. confval:: c_extra_keywords
+
+ A list of identifiers to be recognized as keywords by the C parser.
+ It defaults to ``['alignas', 'alignof', 'bool', 'complex', 'imaginary',
+ 'noreturn', 'static_assert', 'thread_local']``.
+
+ .. versionadded:: 4.0.3
+
+.. confval:: c_maximum_signature_line_length
+
+ If a signature's length in characters exceeds the number set, each
+ parameter will be displayed on an individual logical line. This is a
+ domain-specific setting, overriding :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+.. _cpp-config:
+
+Options for the C++ domain
+--------------------------
+
+.. confval:: cpp_index_common_prefix
+
+ A list of prefixes that will be ignored when sorting C++ objects in the
+ global index. For example ``['awesome_lib::']``.
+
+ .. versionadded:: 1.5
+
+.. confval:: cpp_id_attributes
+
+ A list of strings that the parser additionally should accept as attributes.
+ This can for example be used when attributes have been ``#define`` d for
+ portability.
+
+ .. versionadded:: 1.5
+
+.. confval:: cpp_paren_attributes
+
+ A list of strings that the parser additionally should accept as attributes
+ with one argument. That is, if ``my_align_as`` is in the list, then
+ ``my_align_as(X)`` is parsed as an attribute for all strings ``X`` that have
+ balanced braces (``()``, ``[]``, and ``{}``). This can for example be used
+ when attributes have been ``#define`` d for portability.
+
+ .. versionadded:: 1.5
+
+.. confval:: cpp_maximum_signature_line_length
+
+ If a signature's length in characters exceeds the number set, each
+ parameter will be displayed on an individual logical line. This is a
+ domain-specific setting, overriding :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+Options for the Python domain
+-----------------------------
+
+.. confval:: python_display_short_literal_types
+
+ This value controls how :py:data:`~typing.Literal` types are displayed.
+ The setting is a boolean, default ``False``.
+
+ Examples
+ ~~~~~~~~
+
+ The examples below use the following :rst:dir:`py:function` directive:
+
+ .. code:: reStructuredText
+
+ .. py:function:: serve_food(item: Literal["egg", "spam", "lobster thermidor"]) -> None
+
+ When ``False``, :py:data:`~typing.Literal` types display as per standard
+ Python syntax, i.e.:
+
+ .. code:: python
+
+ serve_food(item: Literal["egg", "spam", "lobster thermidor"]) -> None
+
+ When ``True``, :py:data:`~typing.Literal` types display with a short,
+ :PEP:`604`-inspired syntax, i.e.:
+
+ .. code:: python
+
+ serve_food(item: "egg" | "spam" | "lobster thermidor") -> None
+
+ .. versionadded:: 6.2
+
+.. confval:: python_use_unqualified_type_names
+
+ If true, suppress the module name of the python reference if it can be
+ resolved. The default is ``False``.
+
+ .. versionadded:: 4.0
+
+ .. note:: This configuration is still in experimental
+
+.. confval:: python_maximum_signature_line_length
+
+ If a signature's length in characters exceeds the number set,
+ each argument or type parameter will be displayed on an individual logical line.
+ This is a domain-specific setting,
+ overriding :confval:`maximum_signature_line_length`.
+
+ For the Python domain, the signature length depends on whether
+ the type parameters or the list of arguments are being formatted.
+ For the former, the signature length ignores the length of the arguments list;
+ for the latter, the signature length ignores the length of
+ the type parameters list.
+
+ For instance, with `python_maximum_signature_line_length = 20`,
+ only the list of type parameters will be wrapped
+ while the arguments list will be rendered on a single line
+
+ .. code:: rst
+
+ .. py:function:: add[T: VERY_LONG_SUPER_TYPE, U: VERY_LONG_SUPER_TYPE](a: T, b: U)
+
+ .. versionadded:: 7.1
+
+Options for the Javascript domain
+---------------------------------
+
+.. confval:: javascript_maximum_signature_line_length
+
+ If a signature's length in characters exceeds the number set, each
+ parameter will be displayed on an individual logical line. This is a
+ domain-specific setting, overriding :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+Example of configuration file
+-----------------------------
+
+.. literalinclude:: /_static/conf.py.txt
+ :language: python
diff --git a/doc/usage/extensions/autodoc.rst b/doc/usage/extensions/autodoc.rst
new file mode 100644
index 0000000..1498ae9
--- /dev/null
+++ b/doc/usage/extensions/autodoc.rst
@@ -0,0 +1,853 @@
+.. highlight:: rest
+
+:mod:`sphinx.ext.autodoc` -- Include documentation from docstrings
+==================================================================
+
+.. module:: sphinx.ext.autodoc
+ :synopsis: Include documentation from docstrings.
+
+.. index:: pair: automatic; documentation
+ single: docstring
+
+This extension can import the modules you are documenting, and pull in
+documentation from docstrings in a semi-automatic way.
+
+.. note::
+
+ For Sphinx (actually, the Python interpreter that executes Sphinx) to find
+ your module, it must be importable. That means that the module or the
+ package must be in one of the directories on :data:`sys.path` -- adapt your
+ :data:`sys.path` in the configuration file accordingly.
+
+.. warning::
+
+ :mod:`~sphinx.ext.autodoc` **imports** the modules to be documented. If any
+ modules have side effects on import, these will be executed by ``autodoc``
+ when ``sphinx-build`` is run.
+
+ If you document scripts (as opposed to library modules), make sure their main
+ routine is protected by a ``if __name__ == '__main__'`` condition.
+
+For this to work, the docstrings must of course be written in correct
+reStructuredText. You can then use all of the usual Sphinx markup in the
+docstrings, and it will end up correctly in the documentation. Together with
+hand-written documentation, this technique eases the pain of having to maintain
+two locations for documentation, while at the same time avoiding
+auto-generated-looking pure API documentation.
+
+If you prefer `NumPy`_ or `Google`_ style docstrings over reStructuredText,
+you can also enable the :mod:`napoleon <sphinx.ext.napoleon>` extension.
+:mod:`napoleon <sphinx.ext.napoleon>` is a preprocessor that converts your
+docstrings to correct reStructuredText before :mod:`autodoc` processes them.
+
+.. _Google: https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings
+.. _NumPy: https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
+
+
+Directives
+----------
+
+:mod:`autodoc` provides several directives that are versions of the usual
+:rst:dir:`py:module`, :rst:dir:`py:class` and so forth. On parsing time, they
+import the corresponding module and extract the docstring of the given objects,
+inserting them into the page source under a suitable :rst:dir:`py:module`,
+:rst:dir:`py:class` etc. directive.
+
+.. note::
+
+ Just as :rst:dir:`py:class` respects the current :rst:dir:`py:module`,
+ :rst:dir:`autoclass` will also do so. Likewise, :rst:dir:`automethod` will
+ respect the current :rst:dir:`py:class`.
+
+
+.. rst:directive:: automodule
+ autoclass
+ autoexception
+
+ Document a module, class or exception. All three directives will by default
+ only insert the docstring of the object itself::
+
+ .. autoclass:: Noodle
+
+ will produce source like this::
+
+ .. class:: Noodle
+
+ Noodle's docstring.
+
+ The "auto" directives can also contain content of their own, it will be
+ inserted into the resulting non-auto directive source after the docstring
+ (but before any automatic member documentation).
+
+ Therefore, you can also mix automatic and non-automatic member documentation,
+ like so::
+
+ .. autoclass:: Noodle
+ :members: eat, slurp
+
+ .. method:: boil(time=10)
+
+ Boil the noodle *time* minutes.
+
+ .. rubric:: Options
+
+ .. rst:directive:option:: members
+ :type: no value or comma separated list
+
+ If set, autodoc will generate document for the members of the target
+ module, class or exception.
+
+ For example::
+
+ .. automodule:: noodle
+ :members:
+
+ will document all module members (recursively), and ::
+
+ .. autoclass:: Noodle
+ :members:
+
+ will document all class member methods and properties.
+
+ By default, autodoc will not generate document for the members that are
+ private, not having docstrings, inherited from super class, or special
+ members.
+
+ For modules, ``__all__`` will be respected when looking for members unless
+ you give the ``ignore-module-all`` flag option. Without
+ ``ignore-module-all``, the order of the members will also be the order in
+ ``__all__``.
+
+ You can also give an explicit list of members; only these will then be
+ documented::
+
+ .. autoclass:: Noodle
+ :members: eat, slurp
+
+ .. rst:directive:option:: undoc-members
+ :type: no value
+
+ If set, autodoc will also generate document for the members not having
+ docstrings::
+
+ .. automodule:: noodle
+ :members:
+ :undoc-members:
+
+ .. rst:directive:option:: private-members
+ :type: no value or comma separated list
+
+ If set, autodoc will also generate document for the private members
+ (that is, those named like ``_private`` or ``__private``)::
+
+ .. automodule:: noodle
+ :members:
+ :private-members:
+
+ It can also take an explicit list of member names to be documented as
+ arguments::
+
+ .. automodule:: noodle
+ :members:
+ :private-members: _spicy, _garlickly
+
+ .. versionadded:: 1.1
+ .. versionchanged:: 3.2
+ The option can now take arguments.
+
+ .. rst:directive:option:: special-members
+ :type: no value or comma separated list
+
+ If set, autodoc will also generate document for the special members
+ (that is, those named like ``__special__``)::
+
+ .. autoclass:: my.Class
+ :members:
+ :special-members:
+
+ It can also take an explicit list of member names to be documented as
+ arguments::
+
+ .. autoclass:: my.Class
+ :members:
+ :special-members: __init__, __name__
+
+ .. versionadded:: 1.1
+
+ .. versionchanged:: 1.2
+ The option can now take arguments
+
+ **Options and advanced usage**
+
+ * If you want to make the ``members`` option (or other options described
+ below) the default, see :confval:`autodoc_default_options`.
+
+ .. tip::
+
+ You can use a negated form, :samp:`'no-{flag}'`, as an option of
+ autodoc directive, to disable it temporarily. For example::
+
+ .. automodule:: foo
+ :no-undoc-members:
+
+ .. tip::
+
+ You can use autodoc directive options to temporarily override or
+ extend default options which takes list as an input. For example::
+
+ .. autoclass:: Noodle
+ :members: eat
+ :private-members: +_spicy, _garlickly
+
+ .. versionchanged:: 3.5
+ The default options can be overridden or extended temporarily.
+
+ * autodoc considers a member private if its docstring contains
+ ``:meta private:`` in its :ref:`info-field-lists`.
+ For example:
+
+ .. code-block:: python
+
+ def my_function(my_arg, my_other_arg):
+ """blah blah blah
+
+ :meta private:
+ """
+
+ .. versionadded:: 3.0
+
+ * autodoc considers a member public if its docstring contains
+ ``:meta public:`` in its :ref:`info-field-lists`, even if it starts with
+ an underscore.
+ For example:
+
+ .. code-block:: python
+
+ def _my_function(my_arg, my_other_arg):
+ """blah blah blah
+
+ :meta public:
+ """
+
+ .. versionadded:: 3.1
+
+ * autodoc considers a variable member does not have any default value if its
+ docstring contains ``:meta hide-value:`` in its :ref:`info-field-lists`.
+ Example:
+
+ .. code-block:: python
+
+ var1 = None #: :meta hide-value:
+
+ .. versionadded:: 3.5
+
+ * For classes and exceptions, members inherited from base classes will be
+ left out when documenting all members, unless you give the
+ ``inherited-members`` option, in addition to ``members``::
+
+ .. autoclass:: Noodle
+ :members:
+ :inherited-members:
+
+ This can be combined with ``undoc-members`` to document *all* available
+ members of the class or module.
+
+ It can take an ancestor class not to document inherited members from it.
+ By default, members of ``object`` class are not documented. To show them
+ all, give ``None`` to the option.
+
+ For example; If your class ``Foo`` is derived from ``list`` class and
+ you don't want to document ``list.__len__()``, you should specify a
+ option ``:inherited-members: list`` to avoid special members of list
+ class.
+
+ Another example; If your class Foo has ``__str__`` special method and
+ autodoc directive has both ``inherited-members`` and ``special-members``,
+ ``__str__`` will be documented as in the past, but other special method
+ that are not implemented in your class ``Foo``.
+
+ Since v5.0, it can take a comma separated list of ancestor classes. It
+ allows to suppress inherited members of several classes on the module at
+ once by specifying the option to :rst:dir:`automodule` directive.
+
+ Note: this will lead to markup errors if the inherited members come from a
+ module whose docstrings are not reST formatted.
+
+ .. versionadded:: 0.3
+
+ .. versionchanged:: 3.0
+
+ It takes an ancestor class name as an argument.
+
+ .. versionchanged:: 5.0
+
+ It takes a comma separated list of ancestor class names.
+
+ * It's possible to override the signature for explicitly documented callable
+ objects (functions, methods, classes) with the regular syntax that will
+ override the signature gained from introspection::
+
+ .. autoclass:: Noodle(type)
+
+ .. automethod:: eat(persona)
+
+ This is useful if the signature from the method is hidden by a decorator.
+
+ .. versionadded:: 0.4
+
+ * The :rst:dir:`automodule`, :rst:dir:`autoclass` and
+ :rst:dir:`autoexception` directives also support a flag option called
+ ``show-inheritance``. When given, a list of base classes will be inserted
+ just below the class signature (when used with :rst:dir:`automodule`, this
+ will be inserted for every class that is documented in the module).
+
+ .. versionadded:: 0.4
+
+ * All autodoc directives support the ``no-index`` flag option that has the
+ same effect as for standard :rst:dir:`py:function` etc. directives: no
+ index entries are generated for the documented object (and all
+ autodocumented members).
+
+ .. versionadded:: 0.4
+
+ * :rst:dir:`automodule` also recognizes the ``synopsis``, ``platform`` and
+ ``deprecated`` options that the standard :rst:dir:`py:module` directive
+ supports.
+
+ .. 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
+ :confval:`autodoc_member_order` for one directive.
+
+ .. versionadded:: 0.6
+
+ * The directives supporting member documentation also have a
+ ``exclude-members`` option that can be used to exclude single member names
+ from documentation, if all members are to be documented.
+
+ .. versionadded:: 0.6
+
+ * In an :rst:dir:`automodule` directive with the ``members`` option set, only
+ module members whose ``__module__`` attribute is equal to the module name
+ as given to ``automodule`` will be documented. This is to prevent
+ documentation of imported classes or functions. Set the
+ ``imported-members`` option if you want to prevent this behavior and
+ document all available members. Note that attributes from imported modules
+ will not be documented, because attribute documentation is discovered by
+ parsing the source file of the current module.
+
+ .. versionadded:: 1.2
+
+ * Add a list of modules in the :confval:`autodoc_mock_imports` to prevent
+ import errors to halt the building process when some external dependencies
+ are not importable at build time.
+
+ .. versionadded:: 1.3
+
+ * As a hint to autodoc extension, you can put a ``::`` separator in between
+ module name and object name to let autodoc know the correct module name if
+ it is ambiguous. ::
+
+ .. autoclass:: module.name::Noodle
+
+ * :rst:dir:`autoclass` also recognizes the ``class-doc-from`` option that
+ can be used to override the global value of :confval:`autoclass_content`.
+
+ .. versionadded:: 4.1
+
+.. rst:directive:: autofunction
+ autodecorator
+ autodata
+ automethod
+ autoattribute
+ autoproperty
+
+ These work exactly like :rst:dir:`autoclass` etc.,
+ but do not offer the options used for automatic member documentation.
+
+ :rst:dir:`autodata` and :rst:dir:`autoattribute` support the ``annotation``
+ option. The option controls how the value of variable is shown. If specified
+ without arguments, only the name of the variable will be printed, and its value
+ is not shown::
+
+ .. autodata:: CD_DRIVE
+ :annotation:
+
+ If the option specified with arguments, it is printed after the name as a value
+ of the variable::
+
+ .. autodata:: CD_DRIVE
+ :annotation: = your CD device name
+
+ By default, without ``annotation`` option, Sphinx tries to obtain the value of
+ the variable and print it after the name.
+
+ The ``no-value`` option can be used instead of a blank ``annotation`` to show the
+ type hint but not the value::
+
+ .. autodata:: CD_DRIVE
+ :no-value:
+
+ If both the ``annotation`` and ``no-value`` options are used, ``no-value`` has no
+ effect.
+
+ For module data members and class attributes, documentation can either be put
+ into a comment with special formatting (using a ``#:`` to start the comment
+ instead of just ``#``), 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 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 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.
+ .. versionchanged:: 1.2
+ :rst:dir:`autodata` and :rst:dir:`autoattribute` have an ``annotation``
+ option.
+ .. versionchanged:: 2.0
+ :rst:dir:`autodecorator` added.
+ .. versionchanged:: 2.1
+ :rst:dir:`autoproperty` added.
+ .. versionchanged:: 3.4
+ :rst:dir:`autodata` and :rst:dir:`autoattribute` now have a ``no-value``
+ option.
+
+ .. note::
+
+ If you document decorated functions or methods, keep in mind that autodoc
+ retrieves its docstrings by importing the module and inspecting the
+ ``__doc__`` attribute of the given function or method. That means that if
+ a decorator replaces the decorated function with another, it must copy the
+ original ``__doc__`` to the new function.
+
+
+Configuration
+-------------
+
+There are also config values that you can set:
+
+.. confval:: autoclass_content
+
+ This value selects what content will be inserted into the main body of an
+ :rst:dir:`autoclass` directive. The possible values are:
+
+ ``"class"``
+ Only the class' docstring is inserted. This is the default. You can
+ still document ``__init__`` as a separate method using
+ :rst:dir:`automethod` or the ``members`` option to :rst:dir:`autoclass`.
+ ``"both"``
+ Both the class' and the ``__init__`` method's docstring are concatenated
+ and inserted.
+ ``"init"``
+ Only the ``__init__`` method's docstring is inserted.
+
+ .. versionadded:: 0.3
+
+ If the class has no ``__init__`` method or if the ``__init__`` method's
+ docstring is empty, but the class has a ``__new__`` method's docstring,
+ it is used instead.
+
+ .. versionadded:: 1.4
+
+.. confval:: autodoc_class_signature
+
+ This value selects how the signature will be displayed for the class defined
+ by :rst:dir:`autoclass` directive. The possible values are:
+
+ ``"mixed"``
+ Display the signature with the class name.
+ ``"separated"``
+ Display the signature as a method.
+
+ The default is ``"mixed"``.
+
+ .. versionadded:: 4.1
+
+.. confval:: autodoc_member_order
+
+ This value selects if automatically documented members are sorted
+ alphabetical (value ``'alphabetical'``), by member type (value
+ ``'groupwise'``) or by source order (value ``'bysource'``). The default is
+ alphabetical.
+
+ Note that for source order, the module must be a Python module with the
+ source code available.
+
+ .. versionadded:: 0.6
+ .. versionchanged:: 1.0
+ Support for ``'bysource'``.
+
+.. confval:: autodoc_default_flags
+
+ 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'``, ``'private-members'``, ``'special-members'``,
+ ``'inherited-members'``, ``'show-inheritance'``, ``'ignore-module-all'``
+ and ``'exclude-members'``.
+
+ .. versionadded:: 1.0
+
+ .. deprecated:: 1.8
+
+ Integrated into :confval:`autodoc_default_options`.
+
+.. confval:: autodoc_default_options
+
+ The default options for autodoc directives. They are applied to all autodoc
+ directives automatically. It must be a dictionary which maps option names
+ to the values. For example::
+
+ autodoc_default_options = {
+ 'members': 'var1, var2',
+ 'member-order': 'bysource',
+ 'special-members': '__init__',
+ 'undoc-members': True,
+ 'exclude-members': '__weakref__'
+ }
+
+ Setting ``None`` or ``True`` to the value is equivalent to giving only the
+ option name to the directives.
+
+ The supported options are ``'members'``, ``'member-order'``,
+ ``'undoc-members'``, ``'private-members'``, ``'special-members'``,
+ ``'inherited-members'``, ``'show-inheritance'``, ``'ignore-module-all'``,
+ ``'imported-members'``, ``'exclude-members'``, ``'class-doc-from'`` and
+ ``'no-value'``.
+
+ .. versionadded:: 1.8
+
+ .. versionchanged:: 2.0
+ Accepts ``True`` as a value.
+
+ .. versionchanged:: 2.1
+ Added ``'imported-members'``.
+
+ .. versionchanged:: 4.1
+ Added ``'class-doc-from'``.
+
+ .. versionchanged:: 4.5
+ Added ``'no-value'``.
+
+.. 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.
+
+ autodoc will continue to look for multiple signature lines,
+ stopping at the first line that does not look like a signature.
+ This is useful for declaring overloaded function signatures.
+
+ .. versionadded:: 1.1
+ .. versionchanged:: 3.1
+
+ Support overloaded signatures
+
+ .. versionchanged:: 4.0
+
+ Overloaded signatures do not need to be separated by a backslash
+
+.. confval:: autodoc_mock_imports
+
+ This value contains a list of modules to be mocked up. This is useful when
+ some external dependencies are not met at build time and break the building
+ process. You may only specify the root package of the dependencies
+ themselves and omit the sub-modules:
+
+ .. code-block:: python
+
+ autodoc_mock_imports = ["django"]
+
+ Will mock all imports under the ``django`` package.
+
+ .. versionadded:: 1.3
+
+ .. versionchanged:: 1.6
+ This config value only requires to declare the top-level modules that
+ should be mocked.
+
+.. confval:: autodoc_typehints
+
+ This value controls how to represent typehints. The setting takes the
+ following values:
+
+ * ``'signature'`` -- Show typehints in the signature (default)
+ * ``'description'`` -- Show typehints as content of the function or method
+ The typehints of overloaded functions or methods will still be represented
+ in the signature.
+ * ``'none'`` -- Do not show typehints
+ * ``'both'`` -- Show typehints in the signature and as content of
+ the function or method
+
+ Overloaded functions or methods will not have typehints included in the
+ description because it is impossible to accurately represent all possible
+ overloads as a list of parameters.
+
+ .. versionadded:: 2.1
+ .. versionadded:: 3.0
+
+ New option ``'description'`` is added.
+
+ .. versionadded:: 4.1
+
+ New option ``'both'`` is added.
+
+.. confval:: autodoc_typehints_description_target
+
+ This value controls whether the types of undocumented parameters and return
+ values are documented when ``autodoc_typehints`` is set to ``description``.
+
+ The default value is ``"all"``, meaning that types are documented for all
+ parameters and return values, whether they are documented or not.
+
+ When set to ``"documented"``, types will only be documented for a parameter
+ or a return value that is already documented by the docstring.
+
+ With ``"documented_params"``, parameter types will only be annotated if the
+ parameter is documented in the docstring. The return type is always
+ annotated (except if it is ``None``).
+
+ .. versionadded:: 4.0
+
+ .. versionadded:: 5.0
+
+ New option ``'documented_params'`` is added.
+
+.. confval:: autodoc_type_aliases
+
+ A dictionary for users defined `type aliases`__ that maps a type name to the
+ full-qualified object name. It is used to keep type aliases not evaluated in
+ the document. Defaults to empty (``{}``).
+
+ The type aliases are only available if your program enables :pep:`Postponed
+ Evaluation of Annotations (PEP 563) <563>` feature via ``from __future__ import
+ annotations``.
+
+ For example, there is code using a type alias::
+
+ from __future__ import annotations
+
+ AliasType = Union[List[Dict[Tuple[int, str], Set[int]]], Tuple[str, List[str]]]
+
+ def f() -> AliasType:
+ ...
+
+ If ``autodoc_type_aliases`` is not set, autodoc will generate internal mark-up
+ from this code as following::
+
+ .. py:function:: f() -> Union[List[Dict[Tuple[int, str], Set[int]]], Tuple[str, List[str]]]
+
+ ...
+
+ If you set ``autodoc_type_aliases`` as
+ ``{'AliasType': 'your.module.AliasType'}``, it generates the following document
+ internally::
+
+ .. py:function:: f() -> your.module.AliasType:
+
+ ...
+
+ .. __: https://mypy.readthedocs.io/en/latest/kinds_of_types.html#type-aliases
+ .. versionadded:: 3.3
+
+.. confval:: autodoc_typehints_format
+
+ This value controls the format of typehints. The setting takes the
+ following values:
+
+ * ``'fully-qualified'`` -- Show the module name and its name of typehints
+ * ``'short'`` -- Suppress the leading module names of the typehints
+ (ex. ``io.StringIO`` -> ``StringIO``) (default)
+
+ .. versionadded:: 4.4
+
+ .. versionchanged:: 5.0
+
+ The default setting was changed to ``'short'``
+
+.. confval:: autodoc_preserve_defaults
+
+ If True, the default argument values of functions will be not evaluated on
+ generating document. It preserves them as is in the source code.
+
+ .. versionadded:: 4.0
+
+ Added as an experimental feature. This will be integrated into autodoc core
+ in the future.
+
+.. confval:: autodoc_warningiserror
+
+ This value controls the behavior of :option:`sphinx-build -W` during
+ importing modules.
+ If ``False`` is given, autodoc forcedly suppresses the error if the imported
+ module emits warnings. By default, ``True``.
+
+.. confval:: autodoc_inherit_docstrings
+
+ This value controls the docstrings inheritance.
+ If set to True the docstring for classes or methods, if not explicitly set,
+ is inherited from parents.
+
+ The default is ``True``.
+
+ .. versionadded:: 1.7
+
+.. confval:: suppress_warnings
+ :no-index:
+
+ :mod:`autodoc` supports to suppress warning messages via
+ :confval:`suppress_warnings`. It allows following warnings types in
+ addition:
+
+ * autodoc
+ * autodoc.import_object
+
+
+Docstring preprocessing
+-----------------------
+
+autodoc provides the following additional events:
+
+.. event:: autodoc-process-docstring (app, what, name, obj, options, lines)
+
+ .. versionadded:: 0.4
+
+ Emitted when autodoc has read and processed a docstring. *lines* is a list
+ of strings -- the lines of the processed docstring -- that the event handler
+ can modify **in place** to change what Sphinx puts into the output.
+
+ :param app: the Sphinx application object
+ :param what: the type of the object which the docstring belongs to (one of
+ ``"module"``, ``"class"``, ``"exception"``, ``"function"``, ``"method"``,
+ ``"attribute"``)
+ :param name: the fully qualified name of the object
+ :param obj: the object itself
+ :param options: the options given to the directive: an object with attributes
+ ``inherited_members``, ``undoc_members``, ``show_inheritance`` and
+ ``no-index`` that are true if the flag option of same name was given to the
+ auto directive
+ :param lines: the lines of the docstring, see above
+
+.. event:: autodoc-before-process-signature (app, obj, bound_method)
+
+ .. versionadded:: 2.4
+
+ Emitted before autodoc formats a signature for an object. The event handler
+ can modify an object to change its signature.
+
+ :param app: the Sphinx application object
+ :param obj: the object itself
+ :param bound_method: a boolean indicates an object is bound method or not
+
+.. event:: autodoc-process-signature (app, what, name, obj, options, signature, return_annotation)
+
+ .. versionadded:: 0.5
+
+ Emitted when autodoc has formatted a signature for an object. The event
+ handler can return a new tuple ``(signature, return_annotation)`` to change
+ what Sphinx puts into the output.
+
+ :param app: the Sphinx application object
+ :param what: the type of the object which the docstring belongs to (one of
+ ``"module"``, ``"class"``, ``"exception"``, ``"function"``, ``"method"``,
+ ``"attribute"``)
+ :param name: the fully qualified name of the object
+ :param obj: the object itself
+ :param options: the options given to the directive: an object with attributes
+ ``inherited_members``, ``undoc_members``, ``show_inheritance`` and
+ ``no-index`` that are true if the flag option of same name was given to the
+ auto directive
+ :param signature: function signature, as a string of the form
+ ``"(parameter_1, parameter_2)"``, or ``None`` if introspection didn't
+ succeed and signature wasn't specified in the directive.
+ :param return_annotation: function return annotation as a string of the form
+ ``" -> annotation"``, or ``None`` if there is no return annotation
+
+The :mod:`sphinx.ext.autodoc` module provides factory functions for commonly
+needed docstring processing in event :event:`autodoc-process-docstring`:
+
+.. autofunction:: cut_lines
+.. autofunction:: between
+
+.. event:: autodoc-process-bases (app, name, obj, options, bases)
+
+ Emitted when autodoc has read and processed a class to determine the
+ base-classes. *bases* is a list of classes that the event handler can
+ modify **in place** to change what Sphinx puts into the output. It's
+ emitted only if ``show-inheritance`` option given.
+
+ :param app: the Sphinx application object
+ :param name: the fully qualified name of the object
+ :param obj: the object itself
+ :param options: the options given to the class directive
+ :param bases: the list of base classes signature. see above.
+
+ .. versionadded:: 4.1
+ .. versionchanged:: 4.3
+
+ ``bases`` can contain a string as a base class name. It will be processed
+ as reST mark-up'ed text.
+
+
+Skipping members
+----------------
+
+autodoc allows the user to define a custom method for determining whether a
+member should be included in the documentation by using the following event:
+
+.. event:: autodoc-skip-member (app, what, name, obj, skip, options)
+
+ .. versionadded:: 0.5
+
+ Emitted when autodoc has to decide whether a member should be included in the
+ documentation. The member is excluded if a handler returns ``True``. It is
+ included if the handler returns ``False``.
+
+ If more than one enabled extension handles the ``autodoc-skip-member``
+ event, autodoc will use the first non-``None`` value returned by a handler.
+ Handlers should return ``None`` to fall back to the skipping behavior of
+ autodoc and other enabled extensions.
+
+ :param app: the Sphinx application object
+ :param what: the type of the object which the docstring belongs to (one of
+ ``"module"``, ``"class"``, ``"exception"``, ``"function"``, ``"method"``,
+ ``"attribute"``)
+ :param name: the fully qualified name of the object
+ :param obj: the object itself
+ :param skip: a boolean indicating if autodoc will skip this member if the
+ user handler does not override the decision
+ :param options: the options given to the directive: an object with attributes
+ ``inherited_members``, ``undoc_members``, ``show_inheritance`` and
+ ``no-index`` that are true if the flag option of same name was given to the
+ auto directive
diff --git a/doc/usage/extensions/autosectionlabel.rst b/doc/usage/extensions/autosectionlabel.rst
new file mode 100644
index 0000000..b5b9b51
--- /dev/null
+++ b/doc/usage/extensions/autosectionlabel.rst
@@ -0,0 +1,56 @@
+.. highlight:: rest
+
+:mod:`sphinx.ext.autosectionlabel` -- Allow reference sections using its title
+==============================================================================
+
+.. module:: sphinx.ext.autosectionlabel
+ :synopsis: Allow reference section its title.
+
+.. versionadded:: 1.4
+
+This extension allows you to refer sections its title. This affects to the
+reference role (:rst:role:`ref`).
+
+For example::
+
+ A Plain Title
+ -------------
+
+ This is the text of the section.
+
+ It refers to the section title, see :ref:`A Plain Title`.
+
+
+Internally, this extension generates the labels for each section. If same
+section names are used in whole of document, any one is used for a target by
+default. The ``autosectionlabel_prefix_document`` configuration variable can be
+used to make headings which appear multiple times but in different documents
+unique.
+
+
+Configuration
+-------------
+
+.. confval:: autosectionlabel_prefix_document
+
+ True to prefix each section label with the name of the document it is in,
+ followed by a colon. For example, ``index:Introduction`` for a section
+ called ``Introduction`` that appears in document ``index.rst``. Useful for
+ avoiding ambiguity when the same section heading appears in different
+ documents.
+
+.. confval:: autosectionlabel_maxdepth
+
+ If set, autosectionlabel chooses the sections for labeling by its depth. For
+ example, when set 1 to ``autosectionlabel_maxdepth``, labels are generated
+ only for top level sections, and deeper sections are not labeled. It
+ defaults to ``None`` (disabled).
+
+
+Debugging
+---------
+
+The ``WARNING: undefined label`` indicates that your reference in
+:rst:role:`ref` is mis-spelled. Invoking :program:`sphinx-build` with ``-vv``
+(see :option:`-v`) will print all section names and the labels that have been
+generated for them. This output can help finding the right reference label.
diff --git a/doc/usage/extensions/autosummary.rst b/doc/usage/extensions/autosummary.rst
new file mode 100644
index 0000000..a18460b
--- /dev/null
+++ b/doc/usage/extensions/autosummary.rst
@@ -0,0 +1,364 @@
+.. highlight:: rest
+
+:mod:`sphinx.ext.autosummary` -- Generate autodoc summaries
+===========================================================
+
+.. module:: sphinx.ext.autosummary
+ :synopsis: Generate autodoc summaries
+
+.. versionadded:: 0.6
+
+This extension generates function/method/attribute summary lists, similar to
+those output e.g. by Epydoc and other API doc generation tools. This is
+especially useful when your docstrings are long and detailed, and putting each
+one of them on a separate page makes them easier to read.
+
+The :mod:`sphinx.ext.autosummary` extension does this in two parts:
+
+1. There is an :rst:dir:`autosummary` directive for generating summary listings
+ that contain links to the documented items, and short summary blurbs
+ extracted from their docstrings.
+
+2. A :rst:dir:`autosummary` directive also generates short "stub" files for the
+ entries listed in its content. These files by default contain only the
+ corresponding :mod:`sphinx.ext.autodoc` directive, but can be customized with
+ templates.
+
+ The :program:`sphinx-autogen` script is also able to generate "stub" files
+ from command line.
+
+.. 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. Optionally, stub
+ ``.rst`` files for these items can also be automatically generated
+ when :confval:`autosummary_generate` is `True`.
+
+ For example, ::
+
+ .. currentmodule:: sphinx
+
+ .. autosummary::
+
+ environment.BuildEnvironment
+ util.relative_uri
+
+ produces a table like this:
+
+ .. currentmodule:: sphinx
+
+ .. autosummary::
+
+ environment.BuildEnvironment
+ util.relative_uri
+
+ .. currentmodule:: sphinx.ext.autosummary
+
+ Autosummary preprocesses the docstrings and signatures with the same
+ :event:`autodoc-process-docstring` and :event:`autodoc-process-signature`
+ hooks as :mod:`~sphinx.ext.autodoc`.
+
+ **Options**
+
+ * If you want the :rst:dir:`autosummary` table to also serve as a
+ :rst:dir:`toctree` entry, use the ``toctree`` option, for example::
+
+ .. autosummary::
+ :toctree: DIRNAME
+
+ sphinx.environment.BuildEnvironment
+ sphinx.util.relative_uri
+
+ The ``toctree`` option also signals to the :program:`sphinx-autogen` script
+ that stub pages should be generated for the entries listed in this
+ directive. The option accepts a directory name as an argument;
+ :program:`sphinx-autogen` will by default place its output in this
+ directory. If no argument is given, output is placed in the same directory
+ as the file that contains the directive.
+
+ You can also use ``caption`` option to give a caption to the toctree.
+
+ .. versionadded:: 3.1
+
+ caption option added.
+
+ * If you don't want the :rst:dir:`autosummary` to show function signatures in
+ the listing, include the ``nosignatures`` option::
+
+ .. autosummary::
+ :nosignatures:
+
+ sphinx.environment.BuildEnvironment
+ sphinx.util.relative_uri
+
+ * You can specify a custom template with the ``template`` option.
+ For example, ::
+
+ .. autosummary::
+ :template: mytemplate.rst
+
+ sphinx.environment.BuildEnvironment
+
+ would use the template :file:`mytemplate.rst` in your
+ :confval:`templates_path` to generate the pages for all entries
+ listed. See `Customizing templates`_ below.
+
+ .. versionadded:: 1.0
+
+ * You can specify the ``recursive`` option to generate documents for
+ modules and sub-packages recursively. It defaults to disabled.
+ For example, ::
+
+ .. autosummary::
+ :recursive:
+
+ sphinx.environment.BuildEnvironment
+
+ .. versionadded:: 3.1
+
+
+:program:`sphinx-autogen` -- generate autodoc stub pages
+--------------------------------------------------------
+
+The :program:`sphinx-autogen` script can be used to conveniently generate stub
+documentation pages for items included in :rst:dir:`autosummary` listings.
+
+For example, the command ::
+
+ $ sphinx-autogen -o generated *.rst
+
+will read all :rst:dir:`autosummary` tables in the :file:`*.rst` files that have
+the ``:toctree:`` option set, and output corresponding stub pages in directory
+``generated`` for all documented items. The generated pages by default contain
+text of the form::
+
+ sphinx.util.relative_uri
+ ========================
+
+ .. autofunction:: sphinx.util.relative_uri
+
+If the ``-o`` option is not given, the script will place the output files in the
+directories specified in the ``:toctree:`` options.
+
+For more information, refer to the :doc:`sphinx-autogen documentation
+</man/sphinx-autogen>`
+
+
+Generating stub pages automatically
+-----------------------------------
+
+If you do not want to create stub pages with :program:`sphinx-autogen`, you can
+also use these config values:
+
+.. confval:: autosummary_context
+
+ A dictionary of values to pass into the template engine's context for
+ autosummary stubs files.
+
+ .. versionadded:: 3.1
+
+.. confval:: autosummary_generate
+
+ Boolean indicating whether to scan all found documents for autosummary
+ directives, and to generate stub pages for each. It is enabled by default.
+
+ Can also be a list of documents for which stub pages should be generated.
+
+ The new files will be placed in the directories specified in the
+ ``:toctree:`` options of the directives.
+
+ .. versionchanged:: 2.3
+
+ Emits :event:`autodoc-skip-member` event as :mod:`~sphinx.ext.autodoc`
+ does.
+
+ .. versionchanged:: 4.0
+
+ Enabled by default.
+
+.. confval:: autosummary_generate_overwrite
+
+ If true, autosummary overwrites existing files by generated stub pages.
+ Defaults to true (enabled).
+
+ .. versionadded:: 3.0
+
+.. confval:: autosummary_mock_imports
+
+ This value contains a list of modules to be mocked up. See
+ :confval:`autodoc_mock_imports` for more details. It defaults to
+ :confval:`autodoc_mock_imports`.
+
+ .. versionadded:: 2.0
+
+.. confval:: autosummary_imported_members
+
+ A boolean flag indicating whether to document classes and functions imported
+ in modules. Default is ``False``
+
+ .. versionadded:: 2.1
+
+ .. versionchanged:: 4.4
+
+ If ``autosummary_ignore_module_all`` is ``False``, this configuration
+ value is ignored for members listed in ``__all__``.
+
+.. confval:: autosummary_ignore_module_all
+
+ If ``False`` and a module has the ``__all__`` attribute set, autosummary
+ documents every member listed in ``__all__`` and no others. Default is
+ ``True``
+
+ Note that if an imported member is listed in ``__all__``, it will be
+ documented regardless of the value of ``autosummary_imported_members``. To
+ match the behaviour of ``from module import *``, set
+ ``autosummary_ignore_module_all`` to False and
+ ``autosummary_imported_members`` to True.
+
+ .. versionadded:: 4.4
+
+.. confval:: autosummary_filename_map
+
+ A dict mapping object names to filenames. This is necessary to avoid
+ filename conflicts where multiple objects have names that are
+ indistinguishable when case is ignored, on file systems where filenames
+ are case-insensitive.
+
+ .. versionadded:: 3.2
+
+.. _autosummary-customizing-templates:
+
+Customizing templates
+---------------------
+
+.. versionadded:: 1.0
+
+You can customize the stub page templates, in a similar way as the HTML Jinja
+templates, see :ref:`templating`. (:class:`~sphinx.application.TemplateBridge`
+is not supported.)
+
+.. note::
+
+ If you find yourself spending much time tailoring the stub templates, this
+ may indicate that it's a better idea to write custom narrative documentation
+ instead.
+
+Autosummary uses the following Jinja template files:
+
+- :file:`autosummary/base.rst` -- fallback template
+- :file:`autosummary/module.rst` -- template for modules
+- :file:`autosummary/class.rst` -- template for classes
+- :file:`autosummary/function.rst` -- template for functions
+- :file:`autosummary/attribute.rst` -- template for class attributes
+- :file:`autosummary/method.rst` -- template for class methods
+
+The following variables are available in the templates:
+
+.. currentmodule:: None
+
+.. data:: name
+
+ Name of the documented object, excluding the module and class parts.
+
+.. data:: objname
+
+ Name of the documented object, excluding the module parts.
+
+.. data:: fullname
+
+ Full name of the documented object, including module and class parts.
+
+.. data:: objtype
+
+ Type of the documented object, one of ``"module"``, ``"function"``,
+ ``"class"``, ``"method"``, ``"attribute"``, ``"data"``, ``"object"``,
+ ``"exception"``, ``"newvarattribute"``, ``"newtypedata"``, ``"property"``.
+
+.. data:: module
+
+ Name of the module the documented object belongs to.
+
+.. data:: class
+
+ Name of the class the documented object belongs to. Only available for
+ methods and attributes.
+
+.. data:: underline
+
+ A string containing ``len(full_name) * '='``. Use the ``underline`` filter
+ instead.
+
+.. data:: members
+
+ List containing names of all members of the module or class. Only available
+ for modules and classes.
+
+.. data:: inherited_members
+
+ List containing names of all inherited members of class. Only available for
+ classes.
+
+ .. versionadded:: 1.8.0
+
+.. data:: functions
+
+ List containing names of "public" functions in the module. Here, "public"
+ means that the name does not start with an underscore. Only available
+ for modules.
+
+.. data:: classes
+
+ List containing names of "public" classes in the module. Only available for
+ modules.
+
+.. data:: exceptions
+
+ List containing names of "public" exceptions in the module. Only available
+ for modules.
+
+.. data:: methods
+
+ List containing names of "public" methods in the class. Only available for
+ classes.
+
+.. data:: attributes
+
+ List containing names of "public" attributes in the class/module. Only
+ available for classes and modules.
+
+ .. versionchanged:: 3.1
+
+ Attributes of modules are supported.
+
+.. data:: modules
+
+ List containing names of "public" modules in the package. Only available for
+ modules that are packages and the ``recursive`` option is on.
+
+ .. versionadded:: 3.1
+
+Additionally, the following filters are available
+
+.. function:: escape(s)
+
+ Escape any special characters in the text to be used in formatting RST
+ contexts. For instance, this prevents asterisks making things bold. This
+ replaces the builtin Jinja `escape filter`_ that does html-escaping.
+
+.. function:: underline(s, line='=')
+ :no-index:
+
+ Add a title underline to a piece of text.
+
+For instance, ``{{ fullname | escape | underline }}`` should be used to produce
+the title of a page.
+
+.. note::
+
+ You can use the :rst:dir:`autosummary` directive in the stub pages.
+ Stub pages are generated also based on these directives.
+
+.. _`escape filter`: https://jinja.palletsprojects.com/en/3.0.x/templates/#jinja-filters.escape
diff --git a/doc/usage/extensions/coverage.rst b/doc/usage/extensions/coverage.rst
new file mode 100644
index 0000000..1390ebf
--- /dev/null
+++ b/doc/usage/extensions/coverage.rst
@@ -0,0 +1,99 @@
+:mod:`sphinx.ext.coverage` -- Collect doc coverage stats
+========================================================
+
+.. module:: sphinx.ext.coverage
+ :synopsis: Check Python modules and C API for coverage in the documentation.
+
+This extension features one additional builder, the :class:`CoverageBuilder`.
+
+.. class:: CoverageBuilder
+
+ To use this builder, activate the coverage extension in your configuration
+ file and give ``-b coverage`` on the command line.
+
+.. todo:: Write this section.
+
+Several configuration values can be used to specify what the builder
+should check:
+
+.. confval:: coverage_ignore_modules
+
+.. confval:: coverage_ignore_functions
+
+.. confval:: coverage_ignore_classes
+
+.. confval:: coverage_ignore_pyobjects
+
+ List of `Python regular expressions`_.
+
+ If any of these regular expressions matches any part of the full import path
+ of a Python object, that Python object is excluded from the documentation
+ coverage report.
+
+ .. _Python regular expressions: https://docs.python.org/library/re
+
+ .. versionadded:: 2.1
+
+.. confval:: coverage_c_path
+
+.. 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
+
+.. confval:: coverage_show_missing_items
+
+ Print objects that are missing to standard output also.
+ ``False`` by default.
+
+ .. versionadded:: 3.1
+
+.. confval:: coverage_statistics_to_report
+
+ Print a tabluar report of the coverage statistics to the coverage report.
+ ``True`` by default.
+
+ Example output:
+
+ .. code-block:: text
+
+ +-----------------------+----------+--------------+
+ | Module | Coverage | Undocumented |
+ +=======================+==========+==============+
+ | package.foo_module | 100.00% | 0 |
+ +-----------------------+----------+--------------+
+ | package.bar_module | 83.33% | 1 |
+ +-----------------------+----------+--------------+
+
+ .. versionadded:: 7.2
+
+.. confval:: coverage_statistics_to_stdout
+
+ Print a tabluar report of the coverage statistics to standard output.
+ ``False`` by default.
+
+ Example output:
+
+ .. code-block:: text
+
+ +-----------------------+----------+--------------+
+ | Module | Coverage | Undocumented |
+ +=======================+==========+==============+
+ | package.foo_module | 100.00% | 0 |
+ +-----------------------+----------+--------------+
+ | package.bar_module | 83.33% | 1 |
+ +-----------------------+----------+--------------+
+
+ .. versionadded:: 7.2
diff --git a/doc/usage/extensions/doctest.rst b/doc/usage/extensions/doctest.rst
new file mode 100644
index 0000000..1848e1f
--- /dev/null
+++ b/doc/usage/extensions/doctest.rst
@@ -0,0 +1,385 @@
+.. highlight:: rest
+
+:mod:`sphinx.ext.doctest` -- Test snippets in the documentation
+===============================================================
+
+.. module:: sphinx.ext.doctest
+ :synopsis: Test snippets in the documentation.
+
+.. index:: pair: automatic; testing
+ single: doctest
+ pair: testing; snippets
+
+
+It is often helpful to include snippets of code in your documentation and
+demonstrate the results of executing them. But it is important to ensure that
+the documentation stays up-to-date with the code.
+
+This extension allows you to test such code snippets in the documentation in
+a natural way. If you mark the code blocks as shown here, the ``doctest``
+builder will collect them and run them as doctest tests.
+
+Within each document, you can assign each snippet to a *group*. Each group
+consists of:
+
+* zero or more *setup code* blocks (e.g. importing the module to test)
+* one or more *test* blocks
+
+When building the docs with the ``doctest`` builder, groups are collected for
+each document and run one after the other, first executing setup code blocks,
+then the test blocks in the order they appear in the file.
+
+There are two kinds of test blocks:
+
+* *doctest-style* blocks mimic interactive sessions by interleaving Python code
+ (including the interpreter prompt) and output.
+
+* *code-output-style* blocks consist of an ordinary piece of Python code, and
+ optionally, a piece of output for that code.
+
+
+Directives
+----------
+
+The *group* argument below is interpreted as follows: if it is empty, the block
+is assigned to the group named ``default``. If it is ``*``, the block is
+assigned to all groups (including the ``default`` group). Otherwise, it must be
+a comma-separated list of group names.
+
+.. rst:directive:: .. testsetup:: [group]
+
+ A setup code block. This code is not shown in the output for other builders,
+ 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
+ controlling how actual output is compared with what you give as output. The
+ default set of flags is specified by the :confval:`doctest_default_flags`
+ configuration variable.
+
+ This directive supports five options:
+
+ * ``hide``, a flag option, hides the doctest block in other builders. By
+ default it is shown as a highlighted doctest block.
+
+ * ``options``, a string option, can be used to give a comma-separated list of
+ doctest flags that apply to each example in the tests. (You still can give
+ explicit flags per example, with doctest comments, but they will show up in
+ other builders too.)
+
+ * ``pyversion``, a string option, can be used to specify the required Python
+ version for the example to be tested. For instance, in the following case
+ the example will be tested only for Python versions greater than 3.10::
+
+ .. doctest::
+ :pyversion: > 3.10
+
+ The following operands are supported:
+
+ * ``~=``: Compatible release clause
+ * ``==``: Version matching clause
+ * ``!=``: Version exclusion clause
+ * ``<=``, ``>=``: Inclusive ordered comparison clause
+ * ``<``, ``>``: Exclusive ordered comparison clause
+ * ``===``: Arbitrary equality clause.
+
+ ``pyversion`` option is followed :pep:`PEP-440: Version Specifiers
+ <440#version-specifiers>`.
+
+ .. versionadded:: 1.6
+
+ .. versionchanged:: 1.7
+
+ Supported PEP-440 operands and notations
+
+ * ``trim-doctest-flags`` and ``no-trim-doctest-flags``, a flag option,
+ doctest flags (comments looking like ``# doctest: FLAG, ...``) at the
+ ends of lines and ``<BLANKLINE>`` markers are removed (or not removed)
+ individually. Default is ``trim-doctest-flags``.
+
+ Note that like with standard doctests, you have to use ``<BLANKLINE>`` to
+ signal a blank line in the expected output. The ``<BLANKLINE>`` is removed
+ when building presentation output (HTML, LaTeX etc.).
+
+ Also, you can give inline doctest options, like in doctest::
+
+ >>> datetime.date.now() # doctest: +SKIP
+ datetime.date(2008, 1, 1)
+
+ They will be respected when the test is run, but stripped from presentation
+ output.
+
+
+.. rst:directive:: .. testcode:: [group]
+
+ A code block for a code-output-style test.
+
+ This directive supports three options:
+
+ * ``hide``, a flag option, hides the code block in other builders. By
+ default it is shown as a highlighted code block.
+
+ * ``trim-doctest-flags`` and ``no-trim-doctest-flags``, a flag option,
+ doctest flags (comments looking like ``# doctest: FLAG, ...``) at the
+ ends of lines and ``<BLANKLINE>`` markers are removed (or not removed)
+ individually. Default is ``trim-doctest-flags``.
+
+ .. note::
+
+ Code in a ``testcode`` block is always executed all at once, no matter how
+ many statements it contains. Therefore, output will *not* be generated
+ for bare expressions -- use ``print``. Example::
+
+ .. testcode::
+
+ 1+1 # this will give no output!
+ print(2+2) # this will give output
+
+ .. testoutput::
+
+ 4
+
+ Also, please be aware that since the doctest module does not support
+ mixing regular output and an exception message in the same snippet, this
+ applies to testcode/testoutput as well.
+
+
+.. rst:directive:: .. testoutput:: [group]
+
+ The corresponding output, or the exception message, for the last
+ :rst:dir:`testcode` block.
+
+ This directive supports four options:
+
+ * ``hide``, a flag option, hides the output block in other builders. By
+ default it is shown as a literal block without highlighting.
+
+ * ``options``, a string option, can be used to give doctest flags
+ (comma-separated) just like in normal doctest blocks.
+
+ * ``trim-doctest-flags`` and ``no-trim-doctest-flags``, a flag option,
+ doctest flags (comments looking like ``# doctest: FLAG, ...``) at the
+ ends of lines and ``<BLANKLINE>`` markers are removed (or not removed)
+ individually. Default is ``trim-doctest-flags``.
+
+ Example::
+
+ .. testcode::
+
+ print('Output text.')
+
+ .. testoutput::
+ :hide:
+ :options: -ELLIPSIS, +NORMALIZE_WHITESPACE
+
+ Output text.
+
+The following is an example for the usage of the directives. The test via
+:rst:dir:`doctest` and the test via :rst:dir:`testcode` and
+:rst:dir:`testoutput` are equivalent. ::
+
+ The parrot module
+ =================
+
+ .. testsetup:: *
+
+ import parrot
+
+ The parrot module is a module about parrots.
+
+ Doctest example:
+
+ .. doctest::
+
+ >>> parrot.voom(3000)
+ This parrot wouldn't voom if you put 3000 volts through it!
+
+ Test-Output example:
+
+ .. testcode::
+
+ parrot.voom(3000)
+
+ This would output:
+
+ .. testoutput::
+
+ This parrot wouldn't voom if you put 3000 volts through it!
+
+
+Skipping tests conditionally
+----------------------------
+
+``skipif``, a string option, can be used to skip directives conditionally. This
+may be useful e.g. when a different set of tests should be run depending on the
+environment (hardware, network/VPN, optional dependencies or different versions
+of dependencies). The ``skipif`` option is supported by all of the doctest
+directives. Below are typical use cases for ``skipif`` when used for different
+directives:
+
+- :rst:dir:`testsetup` and :rst:dir:`testcleanup`
+
+ - conditionally skip test setup and/or cleanup
+ - customize setup/cleanup code per environment
+
+- :rst:dir:`doctest`
+
+ - conditionally skip both a test and its output verification
+
+- :rst:dir:`testcode`
+
+ - conditionally skip a test
+ - customize test code per environment
+
+- :rst:dir:`testoutput`
+
+ - conditionally skip output assertion for a skipped test
+ - expect different output depending on the environment
+
+The value of the ``skipif`` option is evaluated as a Python expression. If the
+result is a true value, the directive is omitted from the test run just as if
+it wasn't present in the file at all.
+
+Instead of repeating an expression, the :confval:`doctest_global_setup`
+configuration option can be used to assign it to a variable which can then be
+used instead.
+
+Here's an example which skips some tests if Pandas is not installed:
+
+.. code-block:: py
+ :caption: conf.py
+
+ extensions = ['sphinx.ext.doctest']
+ doctest_global_setup = '''
+ try:
+ import pandas as pd
+ except ImportError:
+ pd = None
+ '''
+
+.. code-block:: rst
+ :caption: contents.rst
+
+ .. testsetup::
+ :skipif: pd is None
+
+ data = pd.Series([42])
+
+ .. doctest::
+ :skipif: pd is None
+
+ >>> data.iloc[0]
+ 42
+
+ .. testcode::
+ :skipif: pd is None
+
+ print(data.iloc[-1])
+
+ .. testoutput::
+ :skipif: pd is None
+
+ 42
+
+
+Configuration
+-------------
+
+The doctest extension uses the following configuration values:
+
+.. confval:: doctest_default_flags
+
+ By default, these options are enabled:
+
+ - ``ELLIPSIS``, allowing you to put ellipses in the expected output that
+ match anything in the actual output;
+ - ``IGNORE_EXCEPTION_DETAIL``, causing everything following the leftmost
+ colon and any module information in the exception name to be ignored;
+ - ``DONT_ACCEPT_TRUE_FOR_1``, rejecting "True" in the output where "1" is
+ given -- the default behavior of accepting this substitution is a relic of
+ pre-Python 2.2 times.
+
+ .. versionadded:: 1.5
+
+.. confval:: doctest_show_successes
+
+ Defaults to ``True``.
+ Controls whether successes are reported.
+
+ For a project with many doctests,
+ it may be useful to set this to ``False`` to only highlight failures.
+
+ .. versionadded:: 7.2
+
+.. confval:: doctest_path
+
+ A list of directories that will be added to :data:`sys.path` when the doctest
+ builder is used. (Make sure it contains absolute paths.)
+
+.. confval:: doctest_global_setup
+
+ Python code that is treated like it were put in a ``testsetup`` directive for
+ *every* file that is tested, and for every group. You can use this to
+ e.g. import modules you will always need in your doctests.
+
+ .. 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
+ doctest blocks will be tested too. They will be assigned to the group name
+ given.
+
+ reST doctest blocks are simply doctests put into a paragraph of their own,
+ like so::
+
+ Some documentation text.
+
+ >>> print(1)
+ 1
+
+ Some more documentation text.
+
+ (Note that no special ``::`` is used to introduce a doctest block; docutils
+ recognizes them from the leading ``>>>``. Also, no additional indentation is
+ used, though it doesn't hurt.)
+
+ If this value is left at its default value, the above snippet is interpreted
+ by the doctest builder exactly like the following::
+
+ Some documentation text.
+
+ .. doctest::
+
+ >>> print(1)
+ 1
+
+ Some more documentation text.
+
+ This feature makes it easy for you to test doctests in docstrings included
+ with the :mod:`~sphinx.ext.autodoc` extension without marking them up with a
+ special directive.
+
+ Note though that you can't have blank lines in reST doctest blocks. They
+ 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 that in all code blocks with Python console content.
diff --git a/doc/usage/extensions/duration.rst b/doc/usage/extensions/duration.rst
new file mode 100644
index 0000000..1213811
--- /dev/null
+++ b/doc/usage/extensions/duration.rst
@@ -0,0 +1,11 @@
+:mod:`sphinx.ext.duration` -- Measure durations of Sphinx processing
+====================================================================
+
+.. module:: sphinx.ext.duration
+ :synopsis: Measure durations of Sphinx processing
+
+.. versionadded:: 2.4
+
+This extension measures durations of Sphinx processing and show its
+result at end of the build. It is useful for inspecting what document
+is slowly built.
diff --git a/doc/usage/extensions/example_google.py b/doc/usage/extensions/example_google.py
new file mode 100644
index 0000000..434fa3b
--- /dev/null
+++ b/doc/usage/extensions/example_google.py
@@ -0,0 +1,309 @@
+"""Example Google style docstrings.
+
+This module demonstrates documentation as specified by the `Google Python
+Style Guide`_. Docstrings may extend over multiple lines. Sections are created
+with a section header and a colon followed by a block of indented text.
+
+Example:
+ Examples can be given using either the ``Example`` or ``Examples``
+ sections. Sections support any reStructuredText formatting, including
+ literal blocks::
+
+ $ python example_google.py
+
+Section breaks are created by resuming unindented text. Section breaks
+are also implicitly created anytime a new section starts.
+
+Attributes:
+ module_level_variable1 (int): Module level variables may be documented in
+ either the ``Attributes`` section of the module docstring, or in an
+ inline docstring immediately following the variable.
+
+ Either form is acceptable, but the two should not be mixed. Choose
+ one convention to document module level variables and be consistent
+ with it.
+
+Todo:
+ * For module TODOs
+ * You have to also use ``sphinx.ext.todo`` extension
+
+.. _Google Python Style Guide:
+ https://google.github.io/styleguide/pyguide.html
+
+"""
+
+module_level_variable1 = 12345
+
+module_level_variable2 = 98765
+"""int: Module level variable documented inline.
+
+The docstring may span multiple lines. The type may optionally be specified
+on the first line, separated by a colon.
+"""
+
+
+def function_with_types_in_docstring(param1, param2):
+ """Example function with types documented in the docstring.
+
+ :pep:`484` type annotations are supported. If attribute, parameter, and
+ return types are annotated according to `PEP 484`_, they do not need to be
+ included in the docstring:
+
+ Args:
+ param1 (int): The first parameter.
+ param2 (str): The second parameter.
+
+ Returns:
+ bool: The return value. True for success, False otherwise.
+ """
+
+
+def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
+ """Example function with PEP 484 type annotations.
+
+ Args:
+ param1: The first parameter.
+ param2: The second parameter.
+
+ Returns:
+ The return value. True for success, False otherwise.
+
+ """
+
+
+def module_level_function(param1, param2=None, *args, **kwargs):
+ """This is an example of a module level function.
+
+ Function parameters should be documented in the ``Args`` section. The name
+ of each parameter is required. The type and description of each parameter
+ is optional, but should be included if not obvious.
+
+ If ``*args`` or ``**kwargs`` are accepted,
+ they should be listed as ``*args`` and ``**kwargs``.
+
+ The format for a parameter is::
+
+ name (type): description
+ The description may span multiple lines. Following
+ lines should be indented. The "(type)" is optional.
+
+ Multiple paragraphs are supported in parameter
+ descriptions.
+
+ Args:
+ param1 (int): The first parameter.
+ param2 (:obj:`str`, optional): The second parameter. Defaults to None.
+ Second line of description should be indented.
+ *args: Variable length argument list.
+ **kwargs: Arbitrary keyword arguments.
+
+ Returns:
+ bool: True if successful, False otherwise.
+
+ The return type is optional and may be specified at the beginning of
+ the ``Returns`` section followed by a colon.
+
+ The ``Returns`` section may span multiple lines and paragraphs.
+ Following lines should be indented to match the first line.
+
+ The ``Returns`` section supports any reStructuredText formatting,
+ including literal blocks::
+
+ {
+ 'param1': param1,
+ 'param2': param2
+ }
+
+ Raises:
+ AttributeError: The ``Raises`` section is a list of all exceptions
+ that are relevant to the interface.
+ ValueError: If `param2` is equal to `param1`.
+
+ """
+ if param1 == param2:
+ raise ValueError('param1 may not be equal to param2')
+ return True
+
+
+def example_generator(n):
+ """Generators have a ``Yields`` section instead of a ``Returns`` section.
+
+ Args:
+ n (int): The upper limit of the range to generate, from 0 to `n` - 1.
+
+ Yields:
+ int: The next number in the range of 0 to `n` - 1.
+
+ Examples:
+ Examples should be written in doctest format, and should illustrate how
+ to use the function.
+
+ >>> print([i for i in example_generator(4)])
+ [0, 1, 2, 3]
+
+ """
+ yield from range(n)
+
+
+class ExampleError(Exception):
+ """Exceptions are documented in the same way as classes.
+
+ The __init__ method may be documented in either the class level
+ docstring, or as a docstring on the __init__ method itself.
+
+ Either form is acceptable, but the two should not be mixed. Choose one
+ convention to document the __init__ method and be consistent with it.
+
+ Note:
+ Do not include the `self` parameter in the ``Args`` section.
+
+ Args:
+ msg (str): Human readable string describing the exception.
+ code (:obj:`int`, optional): Error code.
+
+ Attributes:
+ msg (str): Human readable string describing the exception.
+ code (int): Exception error code.
+
+ """
+
+ def __init__(self, msg, code):
+ self.msg = msg
+ self.code = code
+
+
+class ExampleClass:
+ """The summary line for a class docstring should fit on one line.
+
+ If the class has public attributes, they may be documented here
+ in an ``Attributes`` section and follow the same formatting as a
+ function's ``Args`` section. Alternatively, attributes may be documented
+ inline with the attribute's declaration (see __init__ method below).
+
+ Properties created with the ``@property`` decorator should be documented
+ in the property's getter method.
+
+ Attributes:
+ attr1 (str): Description of `attr1`.
+ attr2 (:obj:`int`, optional): Description of `attr2`.
+
+ """
+
+ def __init__(self, param1, param2, param3):
+ """Example of docstring on the __init__ method.
+
+ The __init__ method may be documented in either the class level
+ docstring, or as a docstring on the __init__ method itself.
+
+ Either form is acceptable, but the two should not be mixed. Choose one
+ convention to document the __init__ method and be consistent with it.
+
+ Note:
+ Do not include the `self` parameter in the ``Args`` section.
+
+ Args:
+ param1 (str): Description of `param1`.
+ param2 (:obj:`int`, optional): Description of `param2`. Multiple
+ lines are supported.
+ param3 (list(str)): Description of `param3`.
+
+ """
+ self.attr1 = param1
+ self.attr2 = param2
+ self.attr3 = param3 #: Doc comment *inline* with attribute
+
+ #: list(str): Doc comment *before* attribute, with type specified
+ self.attr4 = ['attr4']
+
+ self.attr5 = None
+ """str: Docstring *after* attribute, with type specified."""
+
+ @property
+ def readonly_property(self):
+ """str: Properties should be documented in their getter method."""
+ return 'readonly_property'
+
+ @property
+ def readwrite_property(self):
+ """list(str): Properties with both a getter and setter
+ should only be documented in their getter method.
+
+ If the setter method contains notable behavior, it should be
+ mentioned here.
+ """
+ return ['readwrite_property']
+
+ @readwrite_property.setter
+ def readwrite_property(self, value):
+ value
+
+ def example_method(self, param1, param2):
+ """Class methods are similar to regular functions.
+
+ Note:
+ Do not include the `self` parameter in the ``Args`` section.
+
+ Args:
+ param1: The first parameter.
+ param2: The second parameter.
+
+ Returns:
+ True if successful, False otherwise.
+
+ """
+ return True
+
+ def __special__(self):
+ """By default special members with docstrings are not included.
+
+ Special members are any methods or attributes that start with and
+ end with a double underscore. Any special member with a docstring
+ will be included in the output, if
+ ``napoleon_include_special_with_doc`` is set to True.
+
+ This behavior can be enabled by changing the following setting in
+ Sphinx's conf.py::
+
+ napoleon_include_special_with_doc = True
+
+ """
+ pass
+
+ def __special_without_docstring__(self):
+ pass
+
+ def _private(self):
+ """By default private members are not included.
+
+ Private members are any methods or attributes that start with an
+ underscore and are *not* special. By default they are not included
+ in the output.
+
+ This behavior can be changed such that private members *are* included
+ by changing the following setting in Sphinx's conf.py::
+
+ napoleon_include_private_with_doc = True
+
+ """
+ pass
+
+ def _private_without_docstring(self):
+ pass
+
+class ExamplePEP526Class:
+ """The summary line for a class docstring should fit on one line.
+
+ If the class has public attributes, they may be documented here
+ in an ``Attributes`` section and follow the same formatting as a
+ function's ``Args`` section. If ``napoleon_attr_annotations``
+ is True, types can be specified in the class body using ``PEP 526``
+ annotations.
+
+ Attributes:
+ attr1: Description of `attr1`.
+ attr2: Description of `attr2`.
+
+ """
+
+ attr1: str
+ attr2: int
diff --git a/doc/usage/extensions/example_google.rst b/doc/usage/extensions/example_google.rst
new file mode 100644
index 0000000..a06f161
--- /dev/null
+++ b/doc/usage/extensions/example_google.rst
@@ -0,0 +1,17 @@
+:orphan:
+
+.. _example_google:
+
+Example Google Style Python Docstrings
+======================================
+
+.. seealso::
+
+ :ref:`example_numpy`
+
+.. only:: builder_html
+
+ Download: :download:`example_google.py <example_google.py>`
+
+.. literalinclude:: example_google.py
+ :language: python
diff --git a/doc/usage/extensions/example_numpy.py b/doc/usage/extensions/example_numpy.py
new file mode 100644
index 0000000..2346b1e
--- /dev/null
+++ b/doc/usage/extensions/example_numpy.py
@@ -0,0 +1,350 @@
+"""Example NumPy style docstrings.
+
+This module demonstrates documentation as specified by the `NumPy
+Documentation HOWTO`_. Docstrings may extend over multiple lines. Sections
+are created with a section header followed by an underline of equal length.
+
+Example
+-------
+Examples can be given using either the ``Example`` or ``Examples``
+sections. Sections support any reStructuredText formatting, including
+literal blocks::
+
+ $ python example_numpy.py
+
+
+Section breaks are created with two blank lines. Section breaks are also
+implicitly created anytime a new section starts. Section bodies *may* be
+indented:
+
+Notes
+-----
+ This is an example of an indented section. It's like any other section,
+ but the body is indented to help it stand out from surrounding text.
+
+If a section is indented, then a section break is created by
+resuming unindented text.
+
+Attributes
+----------
+module_level_variable1 : int
+ Module level variables may be documented in either the ``Attributes``
+ section of the module docstring, or in an inline docstring immediately
+ following the variable.
+
+ Either form is acceptable, but the two should not be mixed. Choose
+ one convention to document module level variables and be consistent
+ with it.
+
+
+.. _NumPy docstring standard:
+ https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
+
+"""
+
+module_level_variable1 = 12345
+
+module_level_variable2 = 98765
+"""int: Module level variable documented inline.
+
+The docstring may span multiple lines. The type may optionally be specified
+on the first line, separated by a colon.
+"""
+
+
+def function_with_types_in_docstring(param1, param2):
+ """Example function with types documented in the docstring.
+
+ :pep:`484` type annotations are supported. If attribute, parameter, and
+ return types are annotated according to `PEP 484`_, they do not need to be
+ included in the docstring:
+
+ Parameters
+ ----------
+ param1 : int
+ The first parameter.
+ param2 : str
+ The second parameter.
+
+ Returns
+ -------
+ bool
+ True if successful, False otherwise.
+ """
+
+
+def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
+ """Example function with PEP 484 type annotations.
+
+ The return type must be duplicated in the docstring to comply
+ with the NumPy docstring style.
+
+ Parameters
+ ----------
+ param1
+ The first parameter.
+ param2
+ The second parameter.
+
+ Returns
+ -------
+ bool
+ True if successful, False otherwise.
+
+ """
+
+
+def module_level_function(param1, param2=None, *args, **kwargs):
+ """This is an example of a module level function.
+
+ Function parameters should be documented in the ``Parameters`` section.
+ The name of each parameter is required. The type and description of each
+ parameter is optional, but should be included if not obvious.
+
+ If ``*args`` or ``**kwargs`` are accepted,
+ they should be listed as ``*args`` and ``**kwargs``.
+
+ The format for a parameter is::
+
+ name : type
+ description
+
+ The description may span multiple lines. Following lines
+ should be indented to match the first line of the description.
+ The ": type" is optional.
+
+ Multiple paragraphs are supported in parameter
+ descriptions.
+
+ Parameters
+ ----------
+ param1 : int
+ The first parameter.
+ param2 : :obj:`str`, optional
+ The second parameter.
+ *args
+ Variable length argument list.
+ **kwargs
+ Arbitrary keyword arguments.
+
+ Returns
+ -------
+ bool
+ True if successful, False otherwise.
+
+ The return type is not optional. The ``Returns`` section may span
+ multiple lines and paragraphs. Following lines should be indented to
+ match the first line of the description.
+
+ The ``Returns`` section supports any reStructuredText formatting,
+ including literal blocks::
+
+ {
+ 'param1': param1,
+ 'param2': param2
+ }
+
+ Raises
+ ------
+ AttributeError
+ The ``Raises`` section is a list of all exceptions
+ that are relevant to the interface.
+ ValueError
+ If `param2` is equal to `param1`.
+
+ """
+ if param1 == param2:
+ raise ValueError('param1 may not be equal to param2')
+ return True
+
+
+def example_generator(n):
+ """Generators have a ``Yields`` section instead of a ``Returns`` section.
+
+ Parameters
+ ----------
+ n : int
+ The upper limit of the range to generate, from 0 to `n` - 1.
+
+ Yields
+ ------
+ int
+ The next number in the range of 0 to `n` - 1.
+
+ Examples
+ --------
+ Examples should be written in doctest format, and should illustrate how
+ to use the function.
+
+ >>> print([i for i in example_generator(4)])
+ [0, 1, 2, 3]
+
+ """
+ yield from range(n)
+
+
+class ExampleError(Exception):
+ """Exceptions are documented in the same way as classes.
+
+ The __init__ method may be documented in either the class level
+ docstring, or as a docstring on the __init__ method itself.
+
+ Either form is acceptable, but the two should not be mixed. Choose one
+ convention to document the __init__ method and be consistent with it.
+
+ Note
+ ----
+ Do not include the `self` parameter in the ``Parameters`` section.
+
+ Parameters
+ ----------
+ msg : str
+ Human readable string describing the exception.
+ code : :obj:`int`, optional
+ Numeric error code.
+
+ Attributes
+ ----------
+ msg : str
+ Human readable string describing the exception.
+ code : int
+ Numeric error code.
+
+ """
+
+ def __init__(self, msg, code):
+ self.msg = msg
+ self.code = code
+
+
+class ExampleClass:
+ """The summary line for a class docstring should fit on one line.
+
+ If the class has public attributes, they may be documented here
+ in an ``Attributes`` section and follow the same formatting as a
+ function's ``Args`` section. Alternatively, attributes may be documented
+ inline with the attribute's declaration (see __init__ method below).
+
+ Properties created with the ``@property`` decorator should be documented
+ in the property's getter method.
+
+ Attributes
+ ----------
+ attr1 : str
+ Description of `attr1`.
+ attr2 : :obj:`int`, optional
+ Description of `attr2`.
+
+ """
+
+ def __init__(self, param1, param2, param3):
+ """Example of docstring on the __init__ method.
+
+ The __init__ method may be documented in either the class level
+ docstring, or as a docstring on the __init__ method itself.
+
+ Either form is acceptable, but the two should not be mixed. Choose one
+ convention to document the __init__ method and be consistent with it.
+
+ Note
+ ----
+ Do not include the `self` parameter in the ``Parameters`` section.
+
+ Parameters
+ ----------
+ param1 : str
+ Description of `param1`.
+ param2 : list(str)
+ Description of `param2`. Multiple
+ lines are supported.
+ param3 : :obj:`int`, optional
+ Description of `param3`.
+
+ """
+ self.attr1 = param1
+ self.attr2 = param2
+ self.attr3 = param3 #: Doc comment *inline* with attribute
+
+ #: list(str): Doc comment *before* attribute, with type specified
+ self.attr4 = ["attr4"]
+
+ self.attr5 = None
+ """str: Docstring *after* attribute, with type specified."""
+
+ @property
+ def readonly_property(self):
+ """str: Properties should be documented in their getter method."""
+ return "readonly_property"
+
+ @property
+ def readwrite_property(self):
+ """list(str): Properties with both a getter and setter
+ should only be documented in their getter method.
+
+ If the setter method contains notable behavior, it should be
+ mentioned here.
+ """
+ return ["readwrite_property"]
+
+ @readwrite_property.setter
+ def readwrite_property(self, value):
+ value
+
+ def example_method(self, param1, param2):
+ """Class methods are similar to regular functions.
+
+ Note
+ ----
+ Do not include the `self` parameter in the ``Parameters`` section.
+
+ Parameters
+ ----------
+ param1
+ The first parameter.
+ param2
+ The second parameter.
+
+ Returns
+ -------
+ bool
+ True if successful, False otherwise.
+
+ """
+ return True
+
+ def __special__(self):
+ """By default special members with docstrings are not included.
+
+ Special members are any methods or attributes that start with and
+ end with a double underscore. Any special member with a docstring
+ will be included in the output, if
+ ``napoleon_include_special_with_doc`` is set to True.
+
+ This behavior can be enabled by changing the following setting in
+ Sphinx's conf.py::
+
+ napoleon_include_special_with_doc = True
+
+ """
+ pass
+
+ def __special_without_docstring__(self):
+ pass
+
+ def _private(self):
+ """By default private members are not included.
+
+ Private members are any methods or attributes that start with an
+ underscore and are *not* special. By default they are not included
+ in the output.
+
+ This behavior can be changed such that private members *are* included
+ by changing the following setting in Sphinx's conf.py::
+
+ napoleon_include_private_with_doc = True
+
+ """
+ pass
+
+ def _private_without_docstring(self):
+ pass
diff --git a/doc/usage/extensions/example_numpy.rst b/doc/usage/extensions/example_numpy.rst
new file mode 100644
index 0000000..38d3439
--- /dev/null
+++ b/doc/usage/extensions/example_numpy.rst
@@ -0,0 +1,17 @@
+:orphan:
+
+.. _example_numpy:
+
+Example NumPy Style Python Docstrings
+======================================
+
+.. seealso::
+
+ :ref:`example_google`
+
+.. only:: builder_html
+
+ Download: :download:`example_numpy.py <example_numpy.py>`
+
+.. literalinclude:: example_numpy.py
+ :language: python
diff --git a/doc/usage/extensions/extlinks.rst b/doc/usage/extensions/extlinks.rst
new file mode 100644
index 0000000..97359ab
--- /dev/null
+++ b/doc/usage/extensions/extlinks.rst
@@ -0,0 +1,69 @@
+:mod:`sphinx.ext.extlinks` -- Markup to shorten external links
+==============================================================
+
+.. module:: sphinx.ext.extlinks
+ :synopsis: Allow inserting external links with common base URLs easily.
+.. moduleauthor:: Georg Brandl
+
+.. versionadded:: 1.0
+
+This extension is meant to help with the common pattern of having many external
+links that point to URLs on one and the same site, e.g. links to bug trackers,
+version control web interfaces, or simply subpages in other websites. It does
+so by providing aliases to base URLs, so that you only need to give the subpage
+name when creating a link.
+
+Let's assume that you want to include many links to issues at the Sphinx
+tracker, at :samp:`https://github.com/sphinx-doc/sphinx/issues/{num}`. Typing
+this URL again and again is tedious, so you can use :mod:`~sphinx.ext.extlinks`
+to avoid repeating yourself.
+
+The extension adds a config value:
+
+.. confval:: extlinks
+
+ This config value must be a dictionary of external sites, mapping unique
+ short alias names to a *base URL* and a *caption*. For example, to create an
+ alias for the above mentioned issues, you would add ::
+
+ extlinks = {'issue': ('https://github.com/sphinx-doc/sphinx/issues/%s',
+ 'issue %s')}
+
+ Now, you can use the alias name as a new role, e.g. ``:issue:`123```. This
+ then inserts a link to https://github.com/sphinx-doc/sphinx/issues/123.
+ As you can see, the target given in the role is substituted in the *base URL*
+ in the place of ``%s``.
+
+ The link caption depends on the second item in the tuple, the *caption*:
+
+ - If *caption* is ``None``, the link caption is the full URL.
+ - If *caption* is a string, then it must contain ``%s`` exactly once. In
+ this case the link caption is *caption* with the partial URL substituted
+ for ``%s`` -- in the above example, the link caption would be
+ ``issue 123``.
+
+ To produce a literal ``%`` in either *base URL* or *caption*, use ``%%``::
+
+ extlinks = {'KnR': ('https://example.org/K%%26R/page/%s',
+ '[K&R; page %s]')}
+
+ You can also use the usual "explicit title" syntax supported by other roles
+ that generate links, i.e. ``:issue:`this issue <123>```. In this case, the
+ *caption* is not relevant.
+
+ .. versionchanged:: 4.0
+
+ Support to substitute by '%s' in the caption.
+
+.. note::
+
+ Since links are generated from the role in the reading stage, they appear as
+ ordinary links to e.g. the ``linkcheck`` builder.
+
+.. confval:: extlinks_detect_hardcoded_links
+
+ If enabled, extlinks emits a warning if a hardcoded link is replaceable
+ by an extlink, and suggests a replacement via warning. It defaults to
+ ``False``.
+
+ .. versionadded:: 4.5
diff --git a/doc/usage/extensions/githubpages.rst b/doc/usage/extensions/githubpages.rst
new file mode 100644
index 0000000..6d56a30
--- /dev/null
+++ b/doc/usage/extensions/githubpages.rst
@@ -0,0 +1,16 @@
+:mod:`sphinx.ext.githubpages` -- Publish HTML docs in GitHub Pages
+==================================================================
+
+.. module:: sphinx.ext.githubpages
+ :synopsis: Publish HTML docs in GitHub Pages
+
+.. versionadded:: 1.4
+
+.. versionchanged:: 2.0
+ Support ``CNAME`` file
+
+This extension creates ``.nojekyll`` file on generated HTML directory to publish
+the document on GitHub Pages.
+
+It also creates a ``CNAME`` file for custom domains when :confval:`html_baseurl`
+set.
diff --git a/doc/usage/extensions/graphviz.rst b/doc/usage/extensions/graphviz.rst
new file mode 100644
index 0000000..c134f6d
--- /dev/null
+++ b/doc/usage/extensions/graphviz.rst
@@ -0,0 +1,239 @@
+.. highlight:: rest
+
+:mod:`sphinx.ext.graphviz` -- Add Graphviz graphs
+=================================================
+
+.. module:: sphinx.ext.graphviz
+ :synopsis: Support for Graphviz graphs.
+
+.. versionadded:: 0.6
+
+This extension allows you to embed `Graphviz <https://graphviz.org/>`_ graphs in
+your documents.
+
+It adds these directives:
+
+.. rst:directive:: graphviz
+
+ Directive to embed graphviz code. The input code for ``dot`` is given as the
+ content. For example::
+
+ .. graphviz::
+
+ digraph foo {
+ "bar" -> "baz";
+ }
+
+ In HTML output, the code will be rendered to a PNG or SVG image (see
+ :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.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: alt: alternate text
+ :type: text
+
+ The alternate text of the graph. By default, the graph code is used to
+ the alternate text.
+
+ .. versionadded:: 1.0
+
+ .. rst:directive:option:: align: alignment of the graph
+ :type: left, center or right
+
+ The horizontal alignment of the graph.
+
+ .. versionadded:: 1.5
+
+ .. rst:directive:option:: caption: caption of the graph
+ :type: text
+
+ The caption of the graph.
+
+ .. versionadded:: 1.1
+
+ .. rst:directive:option:: layout: layout type of the graph
+ :type: text
+
+ The layout of the graph (ex. ``dot``, ``neato`` and so on). A path to the
+ graphviz commands are also allowed. By default, :confval:`graphviz_dot`
+ is used.
+
+ .. versionadded:: 1.4
+ .. versionchanged:: 2.2
+
+ Renamed from ``graphviz_dot``
+
+ .. rst:directive:option:: name: label
+ :type: text
+
+ The label of the graph.
+
+ .. versionadded:: 1.6
+
+ .. rst:directive:option:: class: class names
+ :type: a list of class names separated by spaces
+
+ The class name of the graph.
+
+ .. versionadded:: 2.4
+
+
+.. rst:directive:: graph
+
+ Directive for embedding a single undirected graph. The name is given as a
+ directive argument, the contents of the graph are the directive content.
+ This is a convenience directive to generate ``graph <name> { <content> }``.
+
+ For example::
+
+ .. graph:: foo
+
+ "bar" -- "baz";
+
+ .. note:: The graph name is passed unchanged to Graphviz. If it contains
+ non-alphanumeric characters (e.g. a dash), you will have to double-quote
+ it.
+
+ .. rubric:: options
+
+ Same as :rst:dir:`graphviz`.
+
+ .. rst:directive:option:: alt: alternate text
+ :type: text
+
+ .. versionadded:: 1.0
+
+ .. rst:directive:option:: align: alignment of the graph
+ :type: left, center or right
+
+ .. versionadded:: 1.5
+
+ .. rst:directive:option:: caption: caption of the graph
+ :type: text
+
+ .. versionadded:: 1.1
+
+ .. rst:directive:option:: layout: layout type of the graph
+ :type: text
+
+ .. versionadded:: 1.4
+ .. versionchanged:: 2.2
+
+ Renamed from ``graphviz_dot``
+
+ .. rst:directive:option:: name: label
+ :type: text
+
+ .. versionadded:: 1.6
+
+ .. rst:directive:option:: class: class names
+ :type: a list of class names separated by spaces
+
+ The class name of the graph.
+
+ .. versionadded:: 2.4
+
+
+.. rst:directive:: digraph
+
+ Directive for embedding a single directed graph. The name is given as a
+ directive argument, the contents of the graph are the directive content.
+ This is a convenience directive to generate ``digraph <name> { <content> }``.
+
+ For example::
+
+ .. digraph:: foo
+
+ "bar" -> "baz" -> "quux";
+
+ .. rubric:: options
+
+ Same as :rst:dir:`graphviz`.
+
+ .. rst:directive:option:: alt: alternate text
+ :type: text
+
+ .. versionadded:: 1.0
+
+ .. rst:directive:option:: align: alignment of the graph
+ :type: left, center or right
+
+ .. versionadded:: 1.5
+
+ .. rst:directive:option:: caption: caption of the graph
+ :type: text
+
+ .. versionadded:: 1.1
+
+ .. rst:directive:option:: layout: layout type of the graph
+ :type: text
+
+ .. versionadded:: 1.4
+ .. versionchanged:: 2.2
+
+ Renamed from ``graphviz_dot``
+
+ .. rst:directive:option:: name: label
+ :type: text
+
+ .. versionadded:: 1.6
+
+ .. rst:directive:option:: class: class names
+ :type: a list of class names separated by spaces
+
+ The class name of the graph.
+
+ .. versionadded:: 2.4
+
+
+There are also these config values:
+
+.. confval:: graphviz_dot
+
+ The command name with which to invoke ``dot``. The default is ``'dot'``; you
+ may need to set this to a full path if ``dot`` is not in the executable
+ search path.
+
+ Since this setting is not portable from system to system, it is normally not
+ useful to set it in ``conf.py``; rather, giving it on the
+ :program:`sphinx-build` command line via the :option:`-D <sphinx-build -D>`
+ option should be preferable, like this::
+
+ sphinx-build -b html -D graphviz_dot=C:\graphviz\bin\dot.exe . _build/html
+
+.. confval:: graphviz_dot_args
+
+ Additional command-line arguments to give to dot, as a list. The default is
+ an empty list. This is the right place to set global graph, node or edge
+ attributes via dot's ``-G``, ``-N`` and ``-E`` options.
+
+.. confval:: graphviz_output_format
+
+ The output format for Graphviz when building HTML files. This must be either
+ ``'png'`` or ``'svg'``; the default is ``'png'``. If ``'svg'`` is used, in
+ order to make the URL links work properly, an appropriate ``target``
+ attribute must be set, such as ``"_top"`` and ``"_blank"``. For example, the
+ link in the following graph should work in the svg output: ::
+
+ .. graphviz::
+
+ digraph example {
+ a [label="sphinx", href="https://www.sphinx-doc.org/", target="_top"];
+ b [label="other"];
+ a -> b;
+ }
+
+ .. versionadded:: 1.0
+ Previously, output always was PNG.
diff --git a/doc/usage/extensions/ifconfig.rst b/doc/usage/extensions/ifconfig.rst
new file mode 100644
index 0000000..837c0b3
--- /dev/null
+++ b/doc/usage/extensions/ifconfig.rst
@@ -0,0 +1,38 @@
+.. highlight:: rest
+
+:mod:`sphinx.ext.ifconfig` -- Include content based on configuration
+====================================================================
+
+.. module:: sphinx.ext.ifconfig
+ :synopsis: Include documentation content based on configuration values.
+
+This extension is quite simple, and features only one directive:
+
+.. warning::
+
+ This directive is designed to control only content of document. It could
+ not control sections, labels and so on.
+
+.. rst:directive:: ifconfig
+
+ Include content of the directive only if the Python expression given as an
+ argument is ``True``, evaluated in the namespace of the project's
+ configuration (that is, all registered variables from :file:`conf.py` are
+ available).
+
+ For example, one could write ::
+
+ .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc')
+
+ This stuff is only included in the built docs for unstable versions.
+
+ To make a custom config value known to Sphinx, use
+ :func:`~sphinx.application.Sphinx.add_config_value` in the setup function in
+ :file:`conf.py`, e.g.::
+
+ def setup(app):
+ app.add_config_value('releaselevel', '', 'env')
+
+ The second argument is the default value, the third should always be
+ ``'env'`` for such values (it selects if Sphinx re-reads the documents if the
+ value changes).
diff --git a/doc/usage/extensions/imgconverter.rst b/doc/usage/extensions/imgconverter.rst
new file mode 100644
index 0000000..b9af22d
--- /dev/null
+++ b/doc/usage/extensions/imgconverter.rst
@@ -0,0 +1,55 @@
+.. _sphinx.ext.imgconverter:
+
+:mod:`sphinx.ext.imgconverter` -- A reference image converter using Imagemagick
+===============================================================================
+
+.. module:: sphinx.ext.imgconverter
+ :synopsis: Convert images to appropriate format for builders
+
+.. versionadded:: 1.6
+
+This extension converts images in your document to appropriate format for
+builders. For example, it allows you to use SVG images with LaTeX builder.
+As a result, you don't mind what image format the builder supports.
+
+By default the extension uses ImageMagick_ to perform conversions,
+and will not work if ImageMagick is not installed.
+
+.. _ImageMagick: https://www.imagemagick.org
+
+.. note::
+
+ ImageMagick rasterizes a SVG image on conversion. As a result, the image
+ becomes not scalable. To avoid that, please use other image converters like
+ `sphinxcontrib-svg2pdfconverter`__ (which uses Inkscape or
+ ``rsvg-convert``).
+
+.. __: https://github.com/missinglinkelectronics/sphinxcontrib-svg2pdfconverter
+
+
+Configuration
+-------------
+
+.. confval:: image_converter
+
+ A path to a conversion command. By default, the imgconverter finds
+ the command from search paths.
+
+ On Unix platforms, the command :command:`convert` is used by default.
+
+ On Windows, the command :command:`magick` is used by default.
+
+ .. versionchanged:: 3.1
+
+ Use :command:`magick` command by default on windows
+
+.. confval:: image_converter_args
+
+ Additional command-line arguments to give to :command:`convert`, as a list.
+ The default is an empty list ``[]``.
+
+ On Windows, it defaults to ``["convert"]``.
+
+ .. versionchanged:: 3.1
+
+ Use ``["convert"]`` by default on Windows
diff --git a/doc/usage/extensions/index.rst b/doc/usage/extensions/index.rst
new file mode 100644
index 0000000..929f2b6
--- /dev/null
+++ b/doc/usage/extensions/index.rst
@@ -0,0 +1,81 @@
+==========
+Extensions
+==========
+
+Since many projects will need special features in their documentation, Sphinx
+allows adding "extensions" to the build process, each of which can modify
+almost any aspect of document processing.
+
+This chapter describes the extensions bundled with Sphinx. For the API
+documentation on writing your own extension, refer to :ref:`dev-extensions`.
+
+
+.. _builtin-extensions:
+
+Built-in extensions
+-------------------
+
+These extensions are built in and can be activated by respective entries in the
+:confval:`extensions` configuration value:
+
+.. toctree::
+ :maxdepth: 1
+
+ autodoc
+ autosectionlabel
+ autosummary
+ coverage
+ doctest
+ duration
+ extlinks
+ githubpages
+ graphviz
+ ifconfig
+ imgconverter
+ inheritance
+ intersphinx
+ linkcode
+ math
+ napoleon
+ todo
+ viewcode
+
+
+.. _third-party-extensions:
+
+Third-party extensions
+----------------------
+
+You can find several extensions contributed by users in the `sphinx-contrib`__
+organization. If you wish to include your extension in this organization,
+simply follow the instructions provided in the `github-administration`__
+project. This is optional and there are several extensions hosted elsewhere.
+The `awesome-sphinxdoc`__ and `sphinx-extensions`__ projects are both curated
+lists of Sphinx packages, and many packages use the
+`Framework :: Sphinx :: Extension`__ and
+`Framework :: Sphinx :: Theme`__ trove classifiers for Sphinx extensions and
+themes, respectively.
+
+.. __: https://github.com/sphinx-contrib/
+.. __: https://github.com/sphinx-contrib/github-administration
+.. __: https://github.com/yoloseem/awesome-sphinxdoc
+.. __: https://sphinx-extensions.readthedocs.io/en/latest/
+.. __: https://pypi.org/search/?c=Framework+%3A%3A+Sphinx+%3A%3A+Extension
+.. __: https://pypi.org/search/?c=Framework+%3A%3A+Sphinx+%3A%3A+Theme
+
+Where to put your own extensions?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Extensions local to a project should be put within the project's directory
+structure. Set Python's module search path, ``sys.path``, accordingly so that
+Sphinx can find them. For example, if your extension ``foo.py`` lies in the
+``exts`` subdirectory of the project root, put into :file:`conf.py`::
+
+ import sys, os
+
+ sys.path.append(os.path.abspath('exts'))
+
+ extensions = ['foo']
+
+You can also install extensions anywhere else on ``sys.path``, e.g. in the
+``site-packages`` directory.
diff --git a/doc/usage/extensions/inheritance.rst b/doc/usage/extensions/inheritance.rst
new file mode 100644
index 0000000..33284b5
--- /dev/null
+++ b/doc/usage/extensions/inheritance.rst
@@ -0,0 +1,174 @@
+.. highlight:: rest
+
+:mod:`sphinx.ext.inheritance_diagram` -- Include inheritance diagrams
+=====================================================================
+
+.. module:: sphinx.ext.inheritance_diagram
+ :synopsis: Support for displaying inheritance diagrams via graphviz.
+
+.. versionadded:: 0.6
+
+This extension allows you to include inheritance diagrams, rendered via the
+:mod:`Graphviz extension <sphinx.ext.graphviz>`.
+
+It adds this directive:
+
+.. rst:directive:: inheritance-diagram
+
+ This directive has one or more arguments, each giving a module or class
+ name. Class names can be unqualified; in that case they are taken to exist
+ in the currently described module (see :rst:dir:`py:module`).
+
+ For each given class, and each class in each given module, the base classes
+ are determined. Then, from all classes and their base classes, a graph is
+ generated which is then rendered via the graphviz extension to a directed
+ graph.
+
+ This directive supports an option called ``parts`` that, if given, must be an
+ integer, advising the directive to keep that many dot-separated parts
+ in the displayed names (from right to left). For example, ``parts=1`` will
+ only display class names, without the names of the modules that contain
+ them.
+
+ .. versionchanged:: 2.0
+ The value of for ``parts`` can also be negative, indicating how many
+ parts to drop from the left. For example, if all your class names start
+ with ``lib.``, you can give ``:parts: -1`` to remove that prefix from the
+ displayed node names.
+
+ The directive also supports a ``private-bases`` flag option; if given,
+ private base classes (those whose name starts with ``_``) will be included.
+
+ You can use ``caption`` option to give a caption to the diagram.
+
+ .. versionchanged:: 1.1
+ Added ``private-bases`` option; previously, all bases were always
+ included.
+
+ .. versionchanged:: 1.5
+ Added ``caption`` option
+
+ It also supports a ``top-classes`` option which requires one or more class
+ names separated by comma. If specified inheritance traversal will stop at the
+ specified class names. Given the following Python module::
+
+ """
+ A
+ / \
+ B C
+ / \ / \
+ E D F
+ """
+
+ class A:
+ pass
+
+ class B(A):
+ pass
+
+ class C(A):
+ pass
+
+ class D(B, C):
+ pass
+
+ class E(B):
+ pass
+
+ class F(C):
+ pass
+
+ If you have specified a module in the inheritance diagram like this::
+
+ .. inheritance-diagram:: dummy.test
+ :top-classes: dummy.test.B, dummy.test.C
+
+ any base classes which are ancestors to ``top-classes`` and are also defined
+ in the same module will be rendered as stand alone nodes. In this example
+ class A will be rendered as stand alone node in the graph. This is a known
+ issue due to how this extension works internally.
+
+ If you don't want class A (or any other ancestors) to be visible then specify
+ only the classes you would like to generate the diagram for like this::
+
+ .. inheritance-diagram:: dummy.test.D dummy.test.E dummy.test.F
+ :top-classes: dummy.test.B, dummy.test.C
+
+ .. versionchanged:: 1.7
+ Added ``top-classes`` option to limit the scope of inheritance graphs.
+
+
+Examples
+--------
+
+The following are different inheritance diagrams for the internal
+``InheritanceDiagram`` class that implements the directive.
+
+With full names::
+
+ .. inheritance-diagram:: sphinx.ext.inheritance_diagram.InheritanceDiagram
+
+.. inheritance-diagram:: sphinx.ext.inheritance_diagram.InheritanceDiagram
+
+
+Showing class names only::
+
+ .. inheritance-diagram:: sphinx.ext.inheritance_diagram.InheritanceDiagram
+ :parts: 1
+
+.. inheritance-diagram:: sphinx.ext.inheritance_diagram.InheritanceDiagram
+ :parts: 1
+
+Stopping the diagram at :class:`sphinx.util.docutils.SphinxDirective` (the
+highest superclass still part of Sphinx), and dropping the common left-most
+part (``sphinx``) from all names::
+
+ .. inheritance-diagram:: sphinx.ext.inheritance_diagram.InheritanceDiagram
+ :top-classes: sphinx.util.docutils.SphinxDirective
+ :parts: -1
+
+.. inheritance-diagram:: sphinx.ext.inheritance_diagram.InheritanceDiagram
+ :top-classes: sphinx.util.docutils.SphinxDirective
+ :parts: -1
+
+.. py:class:: sphinx.ext.inheritance_diagram.InheritanceDiagram
+ :no-contents-entry:
+ :no-index-entry:
+
+ The internal class that implements the ``inheritance-diagram`` directive.
+
+
+Configuration
+-------------
+
+.. confval:: inheritance_graph_attrs
+
+ A dictionary of graphviz graph attributes for inheritance diagrams.
+
+ For example::
+
+ inheritance_graph_attrs = dict(rankdir="LR", size='"6.0, 8.0"',
+ fontsize=14, ratio='compress')
+
+.. confval:: inheritance_node_attrs
+
+ A dictionary of graphviz node attributes for inheritance diagrams.
+
+ For example::
+
+ inheritance_node_attrs = dict(shape='ellipse', fontsize=14, height=0.75,
+ color='dodgerblue1', style='filled')
+
+.. confval:: inheritance_edge_attrs
+
+ A dictionary of graphviz edge attributes for inheritance diagrams.
+
+.. confval:: inheritance_alias
+
+ Allows mapping the full qualified name of the class to custom values
+ (useful when exposing the underlying path of a class is not desirable,
+ e.g. it's a private class and should not be instantiated by the user).
+
+ For example::
+
+ inheritance_alias = {'_pytest.Magic': 'pytest.Magic'}
diff --git a/doc/usage/extensions/intersphinx.rst b/doc/usage/extensions/intersphinx.rst
new file mode 100644
index 0000000..5aaaf9f
--- /dev/null
+++ b/doc/usage/extensions/intersphinx.rst
@@ -0,0 +1,250 @@
+:mod:`sphinx.ext.intersphinx` -- Link to other projects' documentation
+======================================================================
+
+.. module:: sphinx.ext.intersphinx
+ :synopsis: Link to other Sphinx documentation.
+
+.. index:: pair: automatic; linking
+
+.. versionadded:: 0.5
+
+This extension can generate links to the documentation of objects in external
+projects, either explicitly through the :rst:role:`external` role, or as a
+fallback resolution for any other cross-reference.
+
+Usage for fallback resolution is simple: whenever Sphinx encounters a
+cross-reference that has no matching target in the current documentation set,
+it looks for targets in the external documentation sets configured in
+:confval:`intersphinx_mapping`. A reference like
+``:py:class:`zipfile.ZipFile``` can then link to the Python documentation
+for the ZipFile class, without you having to specify where it is located
+exactly.
+
+When using the :rst:role:`external` role, you can force lookup to any external
+projects, and optionally to a specific external project.
+A link like ``:external:ref:`comparison manual <comparisons>``` will then link
+to the label "comparisons" in whichever configured external project, if it
+exists,
+and a link like ``:external+python:ref:`comparison manual <comparisons>``` will
+link to the label "comparisons" only in the doc set "python", if it exists.
+
+Behind the scenes, this works as follows:
+
+* Each Sphinx HTML build creates a file named :file:`objects.inv` that contains
+ a mapping from object names to URIs relative to the HTML set's root.
+
+* Projects using the Intersphinx extension can specify the location of such
+ mapping files in the :confval:`intersphinx_mapping` config value. The mapping
+ will then be used to resolve both :rst:role:`external` references, and also
+ otherwise missing references to objects into links to the other documentation.
+
+* By default, the mapping file is assumed to be at the same location as the rest
+ of the documentation; however, the location of the mapping file can also be
+ specified individually, e.g. if the docs should be buildable without Internet
+ access.
+
+
+Configuration
+-------------
+
+To use Intersphinx linking, add ``'sphinx.ext.intersphinx'`` to your
+:confval:`extensions` config value, and use these config values to activate
+linking:
+
+.. confval:: intersphinx_mapping
+
+ This config value contains the locations and names of other projects that
+ should be linked to in this documentation.
+
+ Relative local paths for target locations are taken as relative to the base
+ of the built documentation, while relative local paths for inventory
+ locations are taken as relative to the source directory.
+
+ When fetching remote inventory files, proxy settings will be read from
+ the ``$HTTP_PROXY`` environment variable.
+
+ **Format**
+
+ .. versionadded:: 1.0
+
+ A dictionary mapping unique identifiers to a tuple ``(target, inventory)``.
+ Each ``target`` is the base URI of a foreign Sphinx documentation set and can
+ be a local path or an HTTP URI. The ``inventory`` indicates where the
+ inventory file can be found: it can be ``None`` (an :file:`objects.inv` file
+ at the same location as the base URI) or another local file path or a full
+ HTTP URI to an inventory file.
+
+ The unique identifier can be used in the :rst:role:`external` role, so that
+ it is clear which intersphinx set the target belongs to. A link like
+ ``external:python+ref:`comparison manual <comparisons>``` will link to the
+ label "comparisons" in the doc set "python", if it exists.
+
+ **Example**
+
+ To add links to modules and objects in the Python standard library
+ documentation, use::
+
+ intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}
+
+ This will download the corresponding :file:`objects.inv` file from the
+ Internet and generate links to the pages under the given URI. The downloaded
+ inventory is cached in the Sphinx environment, so it must be re-downloaded
+ whenever you do a full rebuild.
+
+ A second example, showing the meaning of a non-``None`` value of the second
+ tuple item::
+
+ intersphinx_mapping = {'python': ('https://docs.python.org/3',
+ 'python-inv.txt')}
+
+ This will read the inventory from :file:`python-inv.txt` in the source
+ directory, but still generate links to the pages under
+ ``https://docs.python.org/3``. It is up to you to update the inventory file
+ as new objects are added to the Python documentation.
+
+ **Multiple targets for the inventory**
+
+ .. versionadded:: 1.3
+
+ Alternative files can be specified for each inventory. One can give a
+ tuple for the second inventory tuple item as shown in the following
+ example. This will read the inventory iterating through the (second)
+ tuple items until the first successful fetch. The primary use case for
+ this to specify mirror sites for server downtime of the primary
+ inventory::
+
+ intersphinx_mapping = {'python': ('https://docs.python.org/3',
+ (None, 'python-inv.txt'))}
+
+ For a set of books edited and tested locally and then published
+ together, it could be helpful to try a local inventory file first,
+ to check references before publication::
+
+ intersphinx_mapping = {
+ 'otherbook':
+ ('https://myproj.readthedocs.io/projects/otherbook/en/latest',
+ ('../../otherbook/build/html/objects.inv', None)),
+ }
+
+ **Old format for this config value**
+
+ .. deprecated:: 6.2
+
+ .. RemovedInSphinx80Warning
+
+ .. caution:: This is the format used before Sphinx 1.0.
+ It is deprecated and will be removed in Sphinx 8.0.
+
+ A dictionary mapping URIs to either ``None`` or an URI. The keys are the
+ base URI of the foreign Sphinx documentation sets and can be local paths or
+ HTTP URIs. The values indicate where the inventory file can be found: they
+ can be ``None`` (at the same location as the base URI) or another local or
+ HTTP URI.
+
+ Example:
+
+ .. code:: python
+
+ intersphinx_mapping = {'https://docs.python.org/': None}
+
+
+.. confval:: intersphinx_cache_limit
+
+ The maximum number of days to cache remote inventories. The default is
+ ``5``, meaning five days. Set this to a negative value to cache inventories
+ for unlimited time.
+
+.. confval:: intersphinx_timeout
+
+ The number of seconds for timeout. The default is ``None``, meaning do not
+ timeout.
+
+ .. note::
+
+ timeout is not a time limit on the entire response download; rather, an
+ exception is raised if the server has not issued a response for timeout
+ seconds.
+
+.. confval:: intersphinx_disabled_reftypes
+
+ .. versionadded:: 4.3
+
+ .. versionchanged:: 5.0
+
+ Changed default value from an empty list to ``['std:doc']``.
+
+ A list of strings being either:
+
+ - the name of a specific reference type in a domain,
+ e.g., ``std:doc``, ``py:func``, or ``cpp:class``,
+ - the name of a domain, and a wildcard, e.g.,
+ ``std:*``, ``py:*``, or ``cpp:*``, or
+ - simply a wildcard ``*``.
+
+ The default value is ``['std:doc']``.
+
+ When a non-:rst:role:`external` cross-reference is being resolved by
+ intersphinx, skip resolution if it matches one of the specifications in this
+ list.
+
+ For example, with ``intersphinx_disabled_reftypes = ['std:doc']``
+ a cross-reference ``:doc:`installation``` will not be attempted to be
+ resolved by intersphinx, but ``:external+otherbook:doc:`installation``` will
+ be attempted to be resolved in the inventory named ``otherbook`` in
+ :confval:`intersphinx_mapping`.
+ At the same time, all cross-references generated in, e.g., Python,
+ declarations will still be attempted to be resolved by intersphinx.
+
+ If ``*`` is in the list of domains, then no non-:rst:role:`external`
+ references will be resolved by intersphinx.
+
+Explicitly Reference External Objects
+-------------------------------------
+
+The Intersphinx extension provides the following role.
+
+.. rst:role:: external
+
+ .. versionadded:: 4.4
+
+ Use Intersphinx to perform lookup only in external projects, and not the
+ current project. Intersphinx still needs to know the type of object you
+ would like to find, so the general form of this role is to write the
+ cross-refererence as if the object is in the current project, but then prefix
+ it with ``:external``.
+ The two forms are then
+
+ - ``:external:domain:reftype:`target```,
+ e.g., ``:external:py:class:`zipfile.ZipFile```, or
+ - ``:external:reftype:`target```,
+ e.g., ``:external:doc:`installation```.
+
+ If you would like to constrain the lookup to a specific external project,
+ then the key of the project, as specified in :confval:`intersphinx_mapping`,
+ is added as well to get the two forms
+
+ - ``:external+invname:domain:reftype:`target```,
+ e.g., ``:external+python:py:class:`zipfile.ZipFile```, or
+ - ``:external+invname:reftype:`target```,
+ e.g., ``:external+python:doc:`installation```.
+
+Showing all links of an Intersphinx mapping file
+------------------------------------------------
+
+To show all Intersphinx links and their targets of an Intersphinx mapping file,
+run ``python -msphinx.ext.intersphinx url-or-path``. This is helpful when
+searching for the root cause of a broken Intersphinx link in a documentation
+project. The following example prints the Intersphinx mapping of the Python 3
+documentation::
+
+ $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
+
+Using Intersphinx with inventory file under Basic Authorization
+---------------------------------------------------------------
+
+Intersphinx supports Basic Authorization like this::
+
+ intersphinx_mapping = {'python': ('https://user:password@docs.python.org/3',
+ None)}
+
+The user and password will be stripped from the URL when generating the links.
diff --git a/doc/usage/extensions/linkcode.rst b/doc/usage/extensions/linkcode.rst
new file mode 100644
index 0000000..e65a0b7
--- /dev/null
+++ b/doc/usage/extensions/linkcode.rst
@@ -0,0 +1,51 @@
+:mod:`sphinx.ext.linkcode` -- Add external links to source code
+===============================================================
+
+.. module:: sphinx.ext.linkcode
+ :synopsis: Add external links to source code.
+.. moduleauthor:: Pauli Virtanen
+
+.. versionadded:: 1.2
+
+This extension looks at your object descriptions (``.. class::``,
+``.. function::`` etc.) and adds external links to code hosted
+somewhere on the web. The intent is similar to the
+``sphinx.ext.viewcode`` extension, but assumes the source code can be
+found somewhere on the Internet.
+
+In your configuration, you need to specify a :confval:`linkcode_resolve`
+function that returns an URL based on the object.
+
+
+Configuration
+-------------
+
+.. confval:: linkcode_resolve
+
+ This is a function ``linkcode_resolve(domain, info)``,
+ which should return the URL to source code corresponding to
+ the object in given domain with given information.
+
+ The function should return ``None`` if no link is to be added.
+
+ The argument ``domain`` specifies the language domain the object is
+ in. ``info`` is a dictionary with the following keys guaranteed to
+ be present (dependent on the domain):
+
+ - ``py``: ``module`` (name of the module), ``fullname`` (name of the object)
+ - ``c``: ``names`` (list of names for the object)
+ - ``cpp``: ``names`` (list of names for the object)
+ - ``javascript``: ``object`` (name of the object), ``fullname``
+ (name of the item)
+
+ Example:
+
+ .. code-block:: python
+
+ def linkcode_resolve(domain, info):
+ if domain != 'py':
+ return None
+ if not info['module']:
+ return None
+ filename = info['module'].replace('.', '/')
+ return "https://somesite/sourcerepo/%s.py" % filename
diff --git a/doc/usage/extensions/math.rst b/doc/usage/extensions/math.rst
new file mode 100644
index 0000000..df4fc6b
--- /dev/null
+++ b/doc/usage/extensions/math.rst
@@ -0,0 +1,320 @@
+.. highlight:: rest
+
+.. _math-support:
+
+Math support for HTML outputs in Sphinx
+=======================================
+
+.. module:: sphinx.ext.mathbase
+ :synopsis: Common math support for imgmath and mathjax / jsmath.
+
+.. versionadded:: 0.5
+.. versionchanged:: 1.8
+
+ Math support for non-HTML builders is integrated to sphinx-core.
+ So mathbase extension is no longer needed.
+
+Since mathematical notation isn't natively supported by HTML in any way, Sphinx
+gives a math support to HTML document with several extensions. These use the
+reStructuredText math :rst:dir:`directive <math>` and :rst:role:`role <math>`.
+
+:mod:`sphinx.ext.imgmath` -- Render math as images
+--------------------------------------------------
+
+.. module:: sphinx.ext.imgmath
+ :synopsis: Render math as PNG or SVG images.
+
+.. versionadded:: 1.4
+
+This extension renders math via LaTeX and dvipng_ or dvisvgm_ into PNG or SVG
+images. This of course means that the computer where the docs are built must
+have both programs available.
+
+There are various configuration values you can set to influence how the images
+are built:
+
+.. confval:: imgmath_image_format
+
+ The output image format. The default is ``'png'``. It should be either
+ ``'png'`` or ``'svg'``. The image is produced by first executing ``latex``
+ on the TeX mathematical mark-up then (depending on the requested format)
+ either `dvipng`_ or `dvisvgm`_.
+
+.. confval:: imgmath_use_preview
+
+ ``dvipng`` and ``dvisvgm`` both have the ability to collect from LaTeX the
+ "depth" of the rendered math: an inline image should use this "depth" in a
+ ``vertical-align`` style to get correctly aligned with surrounding text.
+
+ This mechanism requires the `LaTeX preview package`_ (available as
+ ``preview-latex-style`` on Ubuntu xenial). Therefore, the default for this
+ option is ``False`` but it is strongly recommended to set it to ``True``.
+
+ .. versionchanged:: 2.2
+
+ This option can be used with the ``'svg'`` :confval:`imgmath_image_format`.
+
+.. confval:: imgmath_add_tooltips
+
+ Default: ``True``. If false, do not add the LaTeX code as an "alt" attribute
+ for math images.
+
+.. confval:: imgmath_font_size
+
+ The font size (in ``pt``) of the displayed math. The default value is
+ ``12``. It must be a positive integer.
+
+.. confval:: imgmath_latex
+
+ The command name with which to invoke LaTeX. The default is ``'latex'``; you
+ may need to set this to a full path if ``latex`` is not in the executable
+ search path.
+
+ Since this setting is not portable from system to system, it is normally not
+ useful to set it in ``conf.py``; rather, giving it on the
+ :program:`sphinx-build` command line via the :option:`-D <sphinx-build -D>`
+ option should be preferable, like this::
+
+ sphinx-build -b html -D imgmath_latex=C:\tex\latex.exe . _build/html
+
+ This value should only contain the path to the latex executable, not further
+ arguments; use :confval:`imgmath_latex_args` for that purpose.
+
+ .. hint::
+
+ To use `OpenType Math fonts`__ with ``unicode-math``, via a custom
+ :confval:`imgmath_latex_preamble`, you can set :confval:`imgmath_latex`
+ to ``'dvilualatex'``, but must then set :confval:`imgmath_image_format`
+ to ``'svg'``. Note: this has only been tested with ``dvisvgm 3.0.3``.
+ It significantly increases image production duration compared to using
+ standard ``'latex'`` with traditional TeX math fonts.
+
+ __ https://tex.stackexchange.com/questions/425098/which-opentype-math-fonts-are-available
+
+
+ .. hint::
+
+ Some fancy LaTeX mark-up (an example was reported which used TikZ to add
+ various decorations to the equation) require multiple runs of the LaTeX
+ executable. To handle this, set this configuration setting to
+ ``'latexmk'`` (or a full path to it) as this Perl script reliably
+ chooses dynamically how many latex runs are needed.
+
+ .. versionchanged:: 6.2.0
+
+ Using ``'xelatex'`` (or a full path to it) is now supported. But you
+ must then add ``'-no-pdf'`` to the :confval:`imgmath_latex_args` list of
+ the command options. The ``'svg'`` :confval:`imgmath_image_format` is
+ required. Also, you may need the ``dvisvgm`` binary to be relatively
+ recent (testing was done only with its ``3.0.3`` release).
+
+ .. note::
+
+ Regarding the previous note, it is currently not supported to use
+ ``latexmk`` with option ``-xelatex``.
+
+.. confval:: imgmath_latex_args
+
+ Additional arguments to give to latex, as a list. The default is an empty
+ list.
+
+.. confval:: imgmath_latex_preamble
+
+ Additional LaTeX code to put into the preamble of the LaTeX files used to
+ translate the math snippets. This is left empty by default. Use it
+ e.g. to add packages which modify the fonts used for math, such as
+ ``'\\usepackage{newtxsf}'`` for sans-serif fonts, or
+ ``'\\usepackage{fouriernc}'`` for serif fonts. Indeed, the default LaTeX
+ math fonts have rather thin glyphs which (in HTML output) often do not
+ match well with the font for text.
+
+.. confval:: imgmath_dvipng
+
+ The command name to invoke ``dvipng``. The default is
+ ``'dvipng'``; you may need to set this to a full path if ``dvipng`` is not in
+ the executable search path. This option is only used when
+ ``imgmath_image_format`` is set to ``'png'``.
+
+.. confval:: imgmath_dvipng_args
+
+ Additional arguments to give to dvipng, as a list. The default value is
+ ``['-gamma', '1.5', '-D', '110', '-bg', 'Transparent']`` which makes the
+ image a bit darker and larger then it is by default (this compensates
+ somewhat for the thinness of default LaTeX math fonts), and produces PNGs with a
+ transparent background. This option is used only when
+ ``imgmath_image_format`` is ``'png'``.
+
+.. confval:: imgmath_dvisvgm
+
+ The command name to invoke ``dvisvgm``. The default is
+ ``'dvisvgm'``; you may need to set this to a full path if ``dvisvgm`` is not
+ in the executable search path. This option is only used when
+ ``imgmath_image_format`` is ``'svg'``.
+
+.. confval:: imgmath_dvisvgm_args
+
+ Additional arguments to give to dvisvgm, as a list. The default value is
+ ``['--no-fonts']``, which means that ``dvisvgm`` will render glyphs as path
+ elements (cf the `dvisvgm FAQ`_). This option is used only when
+ ``imgmath_image_format`` is ``'svg'``.
+
+.. confval:: imgmath_embed
+
+ Default: ``False``. If true, encode LaTeX output images within HTML files
+ (base64 encoded) and do not save separate png/svg files to disk.
+
+ .. versionadded:: 5.2
+
+:mod:`sphinx.ext.mathjax` -- Render math via JavaScript
+-------------------------------------------------------
+
+.. module:: sphinx.ext.mathjax
+ :synopsis: Render math using JavaScript via MathJax.
+
+.. warning::
+ Version 4.0 changes the version of MathJax used to version 3. You may need to
+ override ``mathjax_path`` to
+ ``https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js?config=TeX-AMS-MML_HTMLorMML``
+ or update your configuration options for version 3
+ (see :confval:`mathjax3_config`).
+
+.. versionadded:: 1.1
+
+This extension puts math as-is into the HTML files. The JavaScript package
+MathJax_ is then loaded and transforms the LaTeX markup to readable math live in
+the browser.
+
+Because MathJax (and the necessary fonts) is very large, it is not included in
+Sphinx but is set to automatically include it from a third-party site.
+
+.. attention::
+
+ You should use the math :rst:dir:`directive <math>` and
+ :rst:role:`role <math>`, not the native MathJax ``$$``, ``\(``, etc.
+
+
+.. confval:: mathjax_path
+
+ The path to the JavaScript file to include in the HTML files in order to load
+ MathJax.
+
+ The default is the ``https://`` URL that loads the JS files from the
+ `jsdelivr`__ Content Delivery Network. See the `MathJax Getting Started
+ page`__ for details. If you want MathJax to be available offline or
+ without including resources from a third-party site, you have to
+ download it and set this value to a different path.
+
+ __ https://www.jsdelivr.com/
+
+ __ https://www.mathjax.org/#gettingstarted
+
+ 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 ``https://`` URL different from the CDN URL.
+
+.. confval:: mathjax_options
+
+ The options to script tag for mathjax. For example, you can set integrity
+ option with following setting::
+
+ mathjax_options = {
+ 'integrity': 'sha384-......',
+ }
+
+ The default is empty (``{}``).
+
+ .. versionadded:: 1.8
+
+ .. versionchanged:: 4.4.1
+
+ Allow to change the loading method (async or defer) of MathJax if "async"
+ or "defer" key is set.
+
+.. confval:: mathjax3_config
+
+ The configuration options for MathJax v3 (which is used by default).
+ The given dictionary is assigned to the JavaScript variable
+ ``window.MathJax``.
+ For more information, please read `Configuring MathJax`__.
+
+ __ https://docs.mathjax.org/en/latest/web/configuration.html#configuration
+
+ The default is empty (not configured).
+
+ .. versionadded:: 4.0
+
+.. confval:: mathjax2_config
+
+ The configuration options for MathJax v2 (which can be loaded via
+ :confval:`mathjax_path`).
+ The value is used as a parameter of ``MathJax.Hub.Config()``.
+ For more information, please read `Using in-line configuration options`__.
+
+ __ https://docs.mathjax.org/en/v2.7-latest/
+ configuration.html#using-in-line-configuration-options
+
+ For example::
+
+ mathjax2_config = {
+ 'extensions': ['tex2jax.js'],
+ 'jax': ['input/TeX', 'output/HTML-CSS'],
+ }
+
+ The default is empty (not configured).
+
+ .. versionadded:: 4.0
+
+ :confval:`mathjax_config` has been renamed to :confval:`mathjax2_config`.
+
+.. confval:: mathjax_config
+
+ Former name of :confval:`mathjax2_config`.
+
+ For help converting your old MathJax configuration to to the new
+ :confval:`mathjax3_config`, see `Converting Your v2 Configuration to v3`__.
+
+ __ https://docs.mathjax.org/en/latest/web/
+ configuration.html#converting-your-v2-configuration-to-v3
+
+ .. versionadded:: 1.8
+
+ .. versionchanged:: 4.0
+
+ This has been renamed to :confval:`mathjax2_config`.
+ :confval:`mathjax_config` is still supported for backwards compatibility.
+
+: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
+
+ The path to the JavaScript file to include in the HTML files in order to load
+ JSMath. There is no default.
+
+ 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 JSMath into the static path of the Sphinx docs, this
+ value would be ``jsMath/easy/load.js``. If you host more than one
+ Sphinx documentation set on one server, it is advisable to install jsMath in
+ a shared location.
+
+
+.. _dvipng: https://savannah.nongnu.org/projects/dvipng/
+.. _dvisvgm: https://dvisvgm.de/
+.. _dvisvgm FAQ: https://dvisvgm.de/FAQ
+.. _MathJax: https://www.mathjax.org/
+.. _jsMath: http://www.math.union.edu/~dpvc/jsmath/
+.. _LaTeX preview package: https://www.gnu.org/software/auctex/preview-latex.html
diff --git a/doc/usage/extensions/napoleon.rst b/doc/usage/extensions/napoleon.rst
new file mode 100644
index 0000000..d2391da
--- /dev/null
+++ b/doc/usage/extensions/napoleon.rst
@@ -0,0 +1,574 @@
+:mod:`sphinx.ext.napoleon` -- Support for NumPy and Google style docstrings
+===========================================================================
+
+.. module:: sphinx.ext.napoleon
+ :synopsis: Support for NumPy and Google style docstrings
+
+.. moduleauthor:: Rob Ruana
+
+.. versionadded:: 1.3
+
+Overview
+--------
+
+.. highlight:: text
+
+Are you tired of writing docstrings that look like this::
+
+ :param path: The path of the file to wrap
+ :type path: str
+ :param field_storage: The :class:`FileStorage` instance to wrap
+ :type field_storage: FileStorage
+ :param temporary: Whether or not to delete the file when the File
+ instance is destructed
+ :type temporary: bool
+ :returns: A buffered writable file descriptor
+ :rtype: BufferedFileStorage
+
+`reStructuredText`_ is great, but it creates visually dense, hard to read
+:pep:`docstrings <287>`. Compare the jumble above to the same thing rewritten
+according to the `Google Python Style Guide`_::
+
+ Args:
+ path (str): The path of the file to wrap
+ field_storage (FileStorage): The :class:`FileStorage` instance to wrap
+ temporary (bool): Whether or not to delete the file when the File
+ instance is destructed
+
+ Returns:
+ BufferedFileStorage: A buffered writable file descriptor
+
+Much more legible, no?
+
+Napoleon is a :term:`extension` that enables Sphinx to parse both `NumPy`_ and
+`Google`_ style docstrings - the style recommended by `Khan Academy`_.
+
+Napoleon is a pre-processor that parses `NumPy`_ and `Google`_ style
+docstrings and converts them to reStructuredText before Sphinx attempts to
+parse them. This happens in an intermediate step while Sphinx is processing
+the documentation, so it doesn't modify any of the docstrings in your actual
+source code files.
+
+.. _ReStructuredText: https://docutils.sourceforge.io/rst.html
+.. _Google Python Style Guide:
+ https://google.github.io/styleguide/pyguide.html
+.. _Google:
+ https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings
+.. _NumPy:
+ https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
+.. _Khan Academy:
+ https://github.com/Khan/style-guides/blob/master/style/python.md#docstrings
+
+Getting Started
+~~~~~~~~~~~~~~~
+
+1. After :doc:`setting up Sphinx </usage/quickstart>` to build your docs,
+ enable napoleon in the Sphinx `conf.py` file::
+
+ # conf.py
+
+ # Add napoleon to the extensions list
+ extensions = ['sphinx.ext.napoleon']
+
+2. Use `sphinx-apidoc` to build your API documentation::
+
+ $ sphinx-apidoc -f -o docs/source projectdir
+
+
+Docstrings
+~~~~~~~~~~
+
+Napoleon interprets every docstring that :mod:`autodoc <sphinx.ext.autodoc>`
+can find, including docstrings on: ``modules``, ``classes``, ``attributes``,
+``methods``, ``functions``, and ``variables``. Inside each docstring,
+specially formatted `Sections`_ are parsed and converted to
+reStructuredText.
+
+All standard reStructuredText formatting still works as expected.
+
+
+.. _Sections:
+
+Docstring Sections
+~~~~~~~~~~~~~~~~~~
+
+All of the following section headers are supported:
+
+* ``Args`` *(alias of Parameters)*
+* ``Arguments`` *(alias of Parameters)*
+* ``Attention``
+* ``Attributes``
+* ``Caution``
+* ``Danger``
+* ``Error``
+* ``Example``
+* ``Examples``
+* ``Hint``
+* ``Important``
+* ``Keyword Args`` *(alias of Keyword Arguments)*
+* ``Keyword Arguments``
+* ``Methods``
+* ``Note``
+* ``Notes``
+* ``Other Parameters``
+* ``Parameters``
+* ``Return`` *(alias of Returns)*
+* ``Returns``
+* ``Raise`` *(alias of Raises)*
+* ``Raises``
+* ``References``
+* ``See Also``
+* ``Tip``
+* ``Todo``
+* ``Warning``
+* ``Warnings`` *(alias of Warning)*
+* ``Warn`` *(alias of Warns)*
+* ``Warns``
+* ``Yield`` *(alias of Yields)*
+* ``Yields``
+
+Google vs NumPy
+~~~~~~~~~~~~~~~
+
+Napoleon supports two styles of docstrings: `Google`_ and `NumPy`_. The
+main difference between the two styles is that Google uses indentation to
+separate sections, whereas NumPy uses underlines.
+
+Google style:
+
+.. code-block:: python
+
+ def func(arg1, arg2):
+ """Summary line.
+
+ Extended description of function.
+
+ Args:
+ arg1 (int): Description of arg1
+ arg2 (str): Description of arg2
+
+ Returns:
+ bool: Description of return value
+
+ """
+ return True
+
+NumPy style:
+
+.. code-block:: python
+
+ def func(arg1, arg2):
+ """Summary line.
+
+ Extended description of function.
+
+ Parameters
+ ----------
+ arg1 : int
+ Description of arg1
+ arg2 : str
+ Description of arg2
+
+ Returns
+ -------
+ bool
+ Description of return value
+
+ """
+ return True
+
+NumPy style tends to require more vertical space, whereas Google style
+tends to use more horizontal space. Google style tends to be easier to
+read for short and simple docstrings, whereas NumPy style tends be easier
+to read for long and in-depth docstrings.
+
+The choice between styles is largely aesthetic, but the two styles should
+not be mixed. Choose one style for your project and be consistent with it.
+
+.. seealso::
+
+ For complete examples:
+
+ * :ref:`example_google`
+ * :ref:`example_numpy`
+
+
+Type Annotations
+~~~~~~~~~~~~~~~~
+
+:pep:`484` introduced a standard way to express types in Python code.
+This is an alternative to expressing types directly in docstrings.
+One benefit of expressing types according to :pep:`484` is that
+type checkers and IDEs can take advantage of them for static code
+analysis. :pep:`484` was then extended by :pep:`526` which introduced
+a similar way to annotate variables (and attributes).
+
+Google style with Python 3 type annotations::
+
+ def func(arg1: int, arg2: str) -> bool:
+ """Summary line.
+
+ Extended description of function.
+
+ Args:
+ arg1: Description of arg1
+ arg2: Description of arg2
+
+ Returns:
+ Description of return value
+
+ """
+ return True
+
+ class Class:
+ """Summary line.
+
+ Extended description of class
+
+ Attributes:
+ attr1: Description of attr1
+ attr2: Description of attr2
+ """
+
+ attr1: int
+ attr2: str
+
+Google style with types in docstrings::
+
+ def func(arg1, arg2):
+ """Summary line.
+
+ Extended description of function.
+
+ Args:
+ arg1 (int): Description of arg1
+ arg2 (str): Description of arg2
+
+ Returns:
+ bool: Description of return value
+
+ """
+ return True
+
+ class Class:
+ """Summary line.
+
+ Extended description of class
+
+ Attributes:
+ attr1 (int): Description of attr1
+ attr2 (str): Description of attr2
+ """
+
+.. Note::
+ `Python 2/3 compatible annotations`_ aren't currently
+ supported by Sphinx and won't show up in the docs.
+
+.. _Python 2/3 compatible annotations: https://peps.python.org/pep-0484/#suggested-syntax-for-python-2-7-and-straddling-code
+
+
+Configuration
+-------------
+
+Listed below are all the settings used by napoleon and their default
+values. These settings can be changed in the Sphinx `conf.py` file. Make
+sure that "sphinx.ext.napoleon" is enabled in `conf.py`::
+
+ # conf.py
+
+ # Add any Sphinx extension module names here, as strings
+ extensions = ['sphinx.ext.napoleon']
+
+ # Napoleon settings
+ napoleon_google_docstring = True
+ napoleon_numpy_docstring = True
+ napoleon_include_init_with_doc = False
+ napoleon_include_private_with_doc = False
+ napoleon_include_special_with_doc = True
+ napoleon_use_admonition_for_examples = False
+ napoleon_use_admonition_for_notes = False
+ napoleon_use_admonition_for_references = False
+ napoleon_use_ivar = False
+ napoleon_use_param = True
+ napoleon_use_rtype = True
+ napoleon_preprocess_types = False
+ napoleon_type_aliases = None
+ napoleon_attr_annotations = True
+
+.. _Google style:
+ https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings
+.. _NumPy style:
+ https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
+
+.. confval:: napoleon_google_docstring
+
+ True to parse `Google style`_ docstrings. False to disable support
+ for Google style docstrings. *Defaults to True.*
+
+.. confval:: napoleon_numpy_docstring
+
+ True to parse `NumPy style`_ docstrings. False to disable support
+ for NumPy style docstrings. *Defaults to True.*
+
+.. confval:: napoleon_include_init_with_doc
+
+ True to list ``__init___`` docstrings separately from the class
+ docstring. False to fall back to Sphinx's default behavior, which
+ considers the ``__init___`` docstring as part of the class
+ documentation. *Defaults to False.*
+
+ **If True**::
+
+ def __init__(self):
+ """
+ This will be included in the docs because it has a docstring
+ """
+
+ def __init__(self):
+ # This will NOT be included in the docs
+
+.. confval:: napoleon_include_private_with_doc
+
+ True to include private members (like ``_membername``) with docstrings
+ in the documentation. False to fall back to Sphinx's default behavior.
+ *Defaults to False.*
+
+ **If True**::
+
+ def _included(self):
+ """
+ This will be included in the docs because it has a docstring
+ """
+ pass
+
+ def _skipped(self):
+ # This will NOT be included in the docs
+ pass
+
+.. confval:: napoleon_include_special_with_doc
+
+ True to include special members (like ``__membername__``) with
+ docstrings in the documentation. False to fall back to Sphinx's
+ default behavior. *Defaults to True.*
+
+ **If True**::
+
+ def __str__(self):
+ """
+ This will be included in the docs because it has a docstring
+ """
+ return unicode(self).encode('utf-8')
+
+ def __unicode__(self):
+ # This will NOT be included in the docs
+ return unicode(self.__class__.__name__)
+
+.. confval:: napoleon_use_admonition_for_examples
+
+ True to use the ``.. admonition::`` directive for the **Example** and
+ **Examples** sections. False to use the ``.. rubric::`` directive
+ instead. One may look better than the other depending on what HTML
+ theme is used. *Defaults to False.*
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Example
+ -------
+ This is just a quick example
+
+ **If True**::
+
+ .. admonition:: Example
+
+ This is just a quick example
+
+ **If False**::
+
+ .. rubric:: Example
+
+ This is just a quick example
+
+.. confval:: napoleon_use_admonition_for_notes
+
+ True to use the ``.. admonition::`` directive for **Notes** sections.
+ False to use the ``.. rubric::`` directive instead. *Defaults to False.*
+
+ .. note:: The singular **Note** section will always be converted to a
+ ``.. note::`` directive.
+
+ .. seealso::
+
+ :confval:`napoleon_use_admonition_for_examples`
+
+.. confval:: napoleon_use_admonition_for_references
+
+ True to use the ``.. admonition::`` directive for **References**
+ sections. False to use the ``.. rubric::`` directive instead.
+ *Defaults to False.*
+
+ .. seealso::
+
+ :confval:`napoleon_use_admonition_for_examples`
+
+.. confval:: napoleon_use_ivar
+
+ True to use the ``:ivar:`` role for instance variables. False to use
+ the ``.. attribute::`` directive instead. *Defaults to False.*
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Attributes
+ ----------
+ attr1 : int
+ Description of `attr1`
+
+ **If True**::
+
+ :ivar attr1: Description of `attr1`
+ :vartype attr1: int
+
+ **If False**::
+
+ .. attribute:: attr1
+
+ Description of `attr1`
+
+ :type: int
+
+.. confval:: napoleon_use_param
+
+ True to use a ``:param:`` role for each function parameter. False to
+ use a single ``:parameters:`` role for all the parameters.
+ *Defaults to True.*
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Parameters
+ ----------
+ arg1 : str
+ Description of `arg1`
+ arg2 : int, optional
+ Description of `arg2`, defaults to 0
+
+ **If True**::
+
+ :param arg1: Description of `arg1`
+ :type arg1: str
+ :param arg2: Description of `arg2`, defaults to 0
+ :type arg2: :class:`int`, *optional*
+
+ **If False**::
+
+ :parameters: * **arg1** (*str*) --
+ Description of `arg1`
+ * **arg2** (*int, optional*) --
+ Description of `arg2`, defaults to 0
+
+.. confval:: napoleon_use_keyword
+
+ True to use a ``:keyword:`` role for each function keyword argument.
+ False to use a single ``:keyword arguments:`` role for all the
+ keywords.
+ *Defaults to True.*
+
+ This behaves similarly to :confval:`napoleon_use_param`. Note unlike docutils,
+ ``:keyword:`` and ``:param:`` will not be treated the same way - there will
+ be a separate "Keyword Arguments" section, rendered in the same fashion as
+ "Parameters" section (type links created if possible)
+
+ .. seealso::
+
+ :confval:`napoleon_use_param`
+
+.. confval:: napoleon_use_rtype
+
+ True to use the ``:rtype:`` role for the return type. False to output
+ the return type inline with the description. *Defaults to True.*
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Returns
+ -------
+ bool
+ True if successful, False otherwise
+
+ **If True**::
+
+ :returns: True if successful, False otherwise
+ :rtype: bool
+
+ **If False**::
+
+ :returns: *bool* -- True if successful, False otherwise
+
+.. confval:: napoleon_preprocess_types
+
+ True to convert the type definitions in the docstrings as references.
+ Defaults to *False*.
+
+ .. versionadded:: 3.2.1
+ .. versionchanged:: 3.5
+
+ Do preprocess the Google style docstrings also.
+
+.. confval:: napoleon_type_aliases
+
+ A mapping to translate type names to other names or references. Works
+ only when ``napoleon_use_param = True``. *Defaults to None.*
+
+ With::
+
+ napoleon_type_aliases = {
+ "CustomType": "mypackage.CustomType",
+ "dict-like": ":term:`dict-like <mapping>`",
+ }
+
+ This `NumPy style`_ snippet::
+
+ Parameters
+ ----------
+ arg1 : CustomType
+ Description of `arg1`
+ arg2 : dict-like
+ Description of `arg2`
+
+ becomes::
+
+ :param arg1: Description of `arg1`
+ :type arg1: mypackage.CustomType
+ :param arg2: Description of `arg2`
+ :type arg2: :term:`dict-like <mapping>`
+
+ .. versionadded:: 3.2
+
+.. confval:: napoleon_attr_annotations
+
+ True to allow using :pep:`526` attributes annotations in classes.
+ If an attribute is documented in the docstring without a type and
+ has an annotation in the class body, that type is used.
+
+ .. versionadded:: 3.4
+
+.. confval:: napoleon_custom_sections
+
+ Add a list of custom sections to include, expanding the list of parsed sections.
+ *Defaults to None.*
+
+ The entries can either be strings or tuples, depending on the intention:
+
+ * To create a custom "generic" section, just pass a string.
+ * To create an alias for an existing section, pass a tuple containing the
+ alias name and the original, in that order.
+ * To create a custom section that displays like the parameters or returns
+ section, pass a tuple containing the custom section name and a string
+ value, "params_style" or "returns_style".
+
+ If an entry is just a string, it is interpreted as a header for a generic
+ section. If the entry is a tuple/list/indexed container, the first entry
+ is the name of the section, the second is the section key to emulate. If the
+ second entry value is "params_style" or "returns_style", the custom section
+ will be displayed like the parameters section or returns section.
+
+ .. versionadded:: 1.8
+ .. versionchanged:: 3.5
+ Support ``params_style`` and ``returns_style``
diff --git a/doc/usage/extensions/todo.rst b/doc/usage/extensions/todo.rst
new file mode 100644
index 0000000..bf8b922
--- /dev/null
+++ b/doc/usage/extensions/todo.rst
@@ -0,0 +1,62 @@
+:mod:`sphinx.ext.todo` -- Support for todo items
+================================================
+
+.. module:: sphinx.ext.todo
+ :synopsis: Allow inserting todo items into documents.
+.. moduleauthor:: Daniel Bültmann
+
+.. versionadded:: 0.5
+
+There are two additional directives when using this extension:
+
+.. rst:directive:: todo
+
+ Use this directive like, for example, :rst:dir:`note`.
+
+ It will only show up in the output if :confval:`todo_include_todos` is
+ ``True``.
+
+ .. versionadded:: 1.3.2
+ This directive supports an ``class`` option that determines the class
+ attribute for HTML output. If not given, the class defaults to
+ ``admonition-todo``.
+
+
+.. rst:directive:: todolist
+
+ This directive is replaced by a list of all todo directives in the whole
+ documentation, if :confval:`todo_include_todos` is ``True``.
+
+
+These can be configured as seen below.
+
+Configuration
+-------------
+
+.. confval:: todo_include_todos
+
+ If this is ``True``, :rst:dir:`todo` and :rst:dir:`todolist` produce output,
+ else they produce nothing. The default is ``False``.
+
+.. confval:: todo_emit_warnings
+
+ If this is ``True``, :rst:dir:`todo` emits a warning for each TODO entries.
+ The default is ``False``.
+
+ .. versionadded:: 1.5
+
+.. confval:: todo_link_only
+
+ If this is ``True``, :rst:dir:`todolist` produce output without file path and
+ line, The default is ``False``.
+
+ .. versionadded:: 1.4
+
+autodoc provides the following an additional event:
+
+.. event:: todo-defined (app, node)
+
+ .. versionadded:: 1.5
+
+ Emitted when a todo is defined. *node* is the defined
+ ``sphinx.ext.todo.todo_node`` node.
diff --git a/doc/usage/extensions/viewcode.rst b/doc/usage/extensions/viewcode.rst
new file mode 100644
index 0000000..c90d2ba
--- /dev/null
+++ b/doc/usage/extensions/viewcode.rst
@@ -0,0 +1,106 @@
+:mod:`sphinx.ext.viewcode` -- Add links to highlighted source code
+==================================================================
+
+.. module:: sphinx.ext.viewcode
+ :synopsis: Add links to a highlighted version of the source code.
+.. moduleauthor:: Georg Brandl
+
+.. versionadded:: 1.0
+
+This extension looks at your Python object descriptions (``.. class::``, ``..
+function::`` etc.) and tries to find the source files where the objects are
+contained. When found, a separate HTML page will be output for each module with
+a highlighted version of the source code, and a link will be added to all object
+descriptions that leads to the source code of the described object. A link back
+from the source to the description will also be inserted.
+
+.. warning::
+
+ Basically, ``viewcode`` extension will import the modules being linked to.
+ If any modules have side effects on import, these will be executed when
+ ``sphinx-build`` is run.
+
+ If you document scripts (as opposed to library modules), make sure their
+ main routine is protected by a ``if __name__ == '__main__'`` condition.
+
+ In addition, if you don't want to import the modules by ``viewcode``,
+ you can tell the location of the location of source code to ``viewcode``
+ using the :event:`viewcode-find-source` event.
+
+ If :confval:`viewcode_follow_imported_members` is enabled,
+ you will also need to resolve imported attributes
+ using the :event:`viewcode-follow-imported` event.
+
+This extension works only on HTML related builders like ``html``,
+``applehelp``, ``devhelp``, ``htmlhelp``, ``qthelp`` and so on except
+``singlehtml``. By default ``epub`` builder doesn't
+support this extension (see :confval:`viewcode_enable_epub`).
+
+Configuration
+-------------
+
+.. confval:: viewcode_follow_imported_members
+
+ If this is ``True``, viewcode extension will emit
+ :event:`viewcode-follow-imported` event to resolve the name of the module
+ by other extensions. The default is ``True``.
+
+ .. versionadded:: 1.3
+
+ .. versionchanged:: 1.8
+ Renamed from ``viewcode_import`` to ``viewcode_follow_imported_members``.
+
+.. confval:: viewcode_enable_epub
+
+ If this is ``True``, viewcode extension is also enabled even if you use
+ epub builders. This extension generates pages outside toctree, but this
+ is not preferred as epub format.
+
+ Until 1.4.x, this extension is always enabled. If you want to generate
+ epub as same as 1.4.x, you should set ``True``, but epub format checker's
+ score becomes worse.
+
+ The default is ``False``.
+
+ .. versionadded:: 1.5
+
+ .. warning::
+
+ Not all epub readers support pages generated by viewcode extension.
+ These readers ignore links to pages are not under toctree.
+
+ Some reader's rendering result are corrupted and
+ `epubcheck <https://github.com/IDPF/epubcheck>`_'s score
+ becomes worse even if the reader supports.
+
+.. confval:: viewcode_line_numbers
+
+ Default: ``False``.
+
+ If set to ``True``, inline line numbers will be added to the highlighted code.
+
+ .. versionadded:: 7.2
+
+.. event:: viewcode-find-source (app, modname)
+
+ .. versionadded:: 1.8
+
+ Find the source code for a module.
+ An event handler for this event should return
+ a tuple of the source code itself and a dictionary of tags.
+ The dictionary maps the name of a class, function, attribute, etc
+ to a tuple of its type, the start line number, and the end line number.
+ The type should be one of "class", "def", or "other".
+
+ :param app: The Sphinx application object.
+ :param modname: The name of the module to find source code for.
+
+.. event:: viewcode-follow-imported (app, modname, attribute)
+
+ .. versionadded:: 1.8
+
+ Find the name of the original module for an attribute.
+
+ :param app: The Sphinx application object.
+ :param modname: The name of the module that the attribute belongs to.
+ :param attribute: The name of the member to follow.
diff --git a/doc/usage/index.rst b/doc/usage/index.rst
new file mode 100644
index 0000000..fd8cdd8
--- /dev/null
+++ b/doc/usage/index.rst
@@ -0,0 +1,20 @@
+============
+Using Sphinx
+============
+
+This guide serves to demonstrate how one can get started with Sphinx and covers
+everything from installing Sphinx and configuring your first Sphinx project to
+using some of the advanced features Sphinx provides out-of-the-box. If you are
+looking for guidance on extending Sphinx, refer to :doc:`/development/index`.
+
+.. toctree::
+ :maxdepth: 2
+
+ restructuredtext/index
+ markdown
+ configuration
+ builders/index
+ extensions/index
+ theming
+ advanced/intl
+ advanced/websupport/index
diff --git a/doc/usage/installation.rst b/doc/usage/installation.rst
new file mode 100644
index 0000000..e85603e
--- /dev/null
+++ b/doc/usage/installation.rst
@@ -0,0 +1,282 @@
+=================
+Installing Sphinx
+=================
+
+.. contents::
+ :depth: 1
+ :local:
+ :backlinks: none
+
+.. highlight:: console
+
+Overview
+--------
+
+Sphinx is written in `Python`__ and supports Python 3.9+. It builds upon the
+shoulders of many third-party libraries such as `Docutils`__ and `Jinja`__,
+which are installed when Sphinx is installed.
+
+__ https://docs.python-guide.org/
+__ https://docutils.sourceforge.io/
+__ https://jinja.palletsprojects.com/
+
+
+Linux
+-----
+
+Debian/Ubuntu
+~~~~~~~~~~~~~
+
+Install either ``python3-sphinx`` using :command:`apt-get`:
+
+::
+
+ $ apt-get install python3-sphinx
+
+If it not already present, this will install Python for you.
+
+RHEL, CentOS
+~~~~~~~~~~~~
+
+Install ``python-sphinx`` using :command:`yum`:
+
+::
+
+ $ yum install python-sphinx
+
+If it not already present, this will install Python for you.
+
+Other distributions
+~~~~~~~~~~~~~~~~~~~
+
+Most Linux distributions have Sphinx in their package repositories. Usually
+the package is called ``python3-sphinx``, ``python-sphinx`` or ``sphinx``. Be
+aware that there are at least two other packages with ``sphinx`` in their name:
+a speech recognition toolkit (*CMU Sphinx*) and a full-text search database
+(*Sphinx search*).
+
+
+macOS
+-----
+
+Sphinx can be installed using `Homebrew`__, `MacPorts`__, or as part of
+a Python distribution such as `Anaconda`__.
+
+__ https://brew.sh/
+__ https://www.macports.org/
+__ https://www.anaconda.com/download/#macos
+
+Homebrew
+~~~~~~~~
+
+::
+
+ $ brew install sphinx-doc
+
+For more information, refer to the `package overview`__.
+
+__ https://formulae.brew.sh/formula/sphinx-doc
+
+MacPorts
+~~~~~~~~
+
+Install either ``python3x-sphinx`` using :command:`port`:
+
+::
+
+ $ sudo port install py39-sphinx
+
+To set up the executable paths, use the ``port select`` command:
+
+::
+
+ $ sudo port select --set python python39
+ $ sudo port select --set sphinx py39-sphinx
+
+For more information, refer to the `package overview`__.
+
+__ https://www.macports.org/ports.php?by=library&substr=py39-sphinx
+
+Anaconda
+~~~~~~~~
+
+::
+
+ $ conda install sphinx
+
+Windows
+-------
+
+Sphinx can be install using `Chocolatey`__ or
+:ref:`installed manually <windows-other-method>`.
+
+__ https://chocolatey.org/
+
+Chocolatey
+~~~~~~~~~~
+
+::
+
+ $ choco install sphinx
+
+You would need to `install Chocolatey
+<https://chocolatey.org/install>`_
+before running this.
+
+For more information, refer to the `chocolatey page`__.
+
+__ https://chocolatey.org/packages/sphinx/
+
+.. _windows-other-method:
+
+Other Methods
+~~~~~~~~~~~~~
+
+Most Windows users do not have Python installed by default, so we begin with
+the installation of Python itself. To check if you already have Python
+installed, open the *Command Prompt* (:kbd:`⊞Win-r` and type :command:`cmd`).
+Once the command prompt is open, type :command:`python --version` and press
+Enter. If Python is installed, you will see the version of Python printed to
+the screen. If you do not have Python installed, refer to the `Hitchhikers
+Guide to Python's`__ Python on Windows installation guides. You must install
+`Python 3`__.
+
+Once Python is installed, you can install Sphinx using :command:`pip`. Refer
+to the :ref:`pip installation instructions <install-pypi>` below for more
+information.
+
+__ https://docs.python-guide.org/
+__ https://docs.python-guide.org/starting/install3/win/
+
+
+.. _install-pypi:
+
+Installation from PyPI
+----------------------
+
+Sphinx packages are published on the `Python Package Index
+<https://pypi.org/project/Sphinx/>`_. The preferred tool for installing
+packages from *PyPI* is :command:`pip`. This tool is provided with all modern
+versions of Python.
+
+On Linux or MacOS, you should open your terminal and run the following command.
+
+::
+
+ $ pip install -U sphinx
+
+On Windows, you should open *Command Prompt* (:kbd:`⊞Win-r` and type
+:command:`cmd`) and run the same command.
+
+.. code-block:: doscon
+
+ C:\> pip install -U sphinx
+
+After installation, type :command:`sphinx-build --version` on the command
+prompt. If everything worked fine, you will see the version number for the
+Sphinx package you just installed.
+
+Installation from *PyPI* also allows you to install the latest development
+release. You will not generally need (or want) to do this, but it can be
+useful if you see a possible bug in the latest stable release. To do this, use
+the ``--pre`` flag.
+
+::
+
+ $ pip install -U --pre sphinx
+
+Using virtual environments
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When installing Sphinx using pip,
+it is highly recommended to use *virtual environments*,
+which isolate the installed packages from the system packages,
+thus removing the need to use administrator privileges.
+To create a virtual environment in the ``.venv`` directory,
+use the following command.
+
+::
+
+ $ python -m venv .venv
+
+You can read more about them in the `Python Packaging User Guide`_.
+
+.. _Python Packaging User Guide: https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment
+
+.. warning::
+
+ Note that in some Linux distributions, such as Debian and Ubuntu,
+ this might require an extra installation step as follows.
+
+ .. code-block:: console
+
+ $ apt-get install python3-venv
+
+Docker
+------
+
+Docker images for Sphinx are published on the `Docker Hub`_. There are two kind
+of images:
+
+- `sphinxdoc/sphinx`_
+- `sphinxdoc/sphinx-latexpdf`_
+
+.. _Docker Hub: https://hub.docker.com/
+.. _sphinxdoc/sphinx: https://hub.docker.com/r/sphinxdoc/sphinx
+.. _sphinxdoc/sphinx-latexpdf: https://hub.docker.com/r/sphinxdoc/sphinx-latexpdf
+
+Former one is used for standard usage of Sphinx, and latter one is mainly used for
+PDF builds using LaTeX. Please choose one for your purpose.
+
+.. note::
+
+ sphinxdoc/sphinx-latexpdf contains TeXLive packages. So the image is very large
+ (over 2GB!).
+
+.. hint::
+
+ When using docker images, please use ``docker run`` command to invoke sphinx
+ commands. For example, you can use following command to create a Sphinx
+ project:
+
+ .. code-block:: console
+
+ $ docker run -it --rm -v /path/to/document:/docs sphinxdoc/sphinx sphinx-quickstart
+
+ And you can use the following command to build HTML document:
+
+ .. code-block:: console
+
+ $ docker run --rm -v /path/to/document:/docs sphinxdoc/sphinx make html
+
+For more details, please read `README file`__ of docker images.
+
+.. __: https://hub.docker.com/r/sphinxdoc/sphinx
+
+
+Installation from source
+------------------------
+
+You can install Sphinx directly from a clone of the `Git repository`__. This
+can be done either by cloning the repo and installing from the local clone, on
+simply installing directly via :command:`git`.
+
+::
+
+ $ git clone https://github.com/sphinx-doc/sphinx
+ $ cd sphinx
+ $ pip install .
+
+::
+
+ $ pip install git+https://github.com/sphinx-doc/sphinx
+
+You can also download a snapshot of the Git repo in either `tar.gz`__ or
+`zip`__ format. Once downloaded and extracted, these can be installed with
+:command:`pip` as above.
+
+.. highlight:: default
+
+__ https://github.com/sphinx-doc/sphinx
+__ https://github.com/sphinx-doc/sphinx/archive/master.tar.gz
+__ https://github.com/sphinx-doc/sphinx/archive/master.zip
diff --git a/doc/usage/markdown.rst b/doc/usage/markdown.rst
new file mode 100644
index 0000000..ac24f8d
--- /dev/null
+++ b/doc/usage/markdown.rst
@@ -0,0 +1,52 @@
+.. highlight:: python
+
+.. _markdown:
+
+========
+Markdown
+========
+
+`Markdown`__ is a lightweight markup language with a simplistic plain text
+formatting syntax. It exists in many syntactically different *flavors*. To
+support Markdown-based documentation, Sphinx can use `MyST-Parser`__.
+MyST-Parser is a Docutils bridge to `markdown-it-py`__, a Python package for
+parsing the `CommonMark`__ Markdown flavor.
+
+__ https://daringfireball.net/projects/markdown/
+__ https://myst-parser.readthedocs.io/en/latest/
+__ https://github.com/executablebooks/markdown-it-py
+__ https://commonmark.org/
+
+Configuration
+-------------
+
+To configure your Sphinx project for Markdown support, proceed as follows:
+
+#. Install the Markdown parser *MyST-Parser*::
+
+ pip install --upgrade myst-parser
+
+#. Add *myst_parser* to the
+ :confval:`list of configured extensions <extensions>`::
+
+ extensions = ['myst_parser']
+
+ .. note::
+ MyST-Parser requires Sphinx 2.1 or newer.
+
+#. If you want to use Markdown files with extensions other than ``.md``, adjust
+ the :confval:`source_suffix` variable. The following example configures
+ Sphinx to parse all files with the extensions ``.md`` and ``.txt`` as
+ Markdown::
+
+ source_suffix = {
+ '.rst': 'restructuredtext',
+ '.txt': 'markdown',
+ '.md': 'markdown',
+ }
+
+#. You can further configure *MyST-Parser* to allow custom syntax that
+ standard *CommonMark* doesn't support. Read more in the `MyST-Parser
+ documentation`__.
+
+__ https://myst-parser.readthedocs.io/en/latest/using/syntax-optional.html
diff --git a/doc/usage/quickstart.rst b/doc/usage/quickstart.rst
new file mode 100644
index 0000000..0773f60
--- /dev/null
+++ b/doc/usage/quickstart.rst
@@ -0,0 +1,348 @@
+===============
+Getting Started
+===============
+
+Sphinx is a *documentation generator* or a tool that translates a set of plain
+text source files into various output formats, automatically producing
+cross-references, indices, etc. That is, if you have a directory containing a
+bunch of :doc:`/usage/restructuredtext/index` or :doc:`/usage/markdown`
+documents, Sphinx can generate a series of HTML files, a PDF file (via LaTeX),
+man pages and much more.
+
+Sphinx focuses on documentation, in particular handwritten documentation,
+however, Sphinx can also be used to generate blogs, homepages and even books.
+Much of Sphinx's power comes from the richness of its default plain-text markup
+format, :doc:`reStructuredText </usage/restructuredtext/index>`, along with
+its :doc:`significant extensibility capabilities </development/index>`.
+
+The goal of this document is to give you a quick taste of what Sphinx is and
+how you might use it. When you're done here, you can check out the
+:doc:`installation guide </usage/installation>` followed by the intro to the
+default markup format used by Sphinx, :doc:`reStucturedText
+</usage/restructuredtext/index>`.
+
+For a great "introduction" to writing docs in general -- the whys and hows, see
+also `Write the docs`__, written by Eric Holscher.
+
+.. __: https://www.writethedocs.org/guide/writing/beginners-guide-to-docs/
+
+
+Setting up the documentation sources
+------------------------------------
+
+The root directory of a Sphinx collection of plain-text document sources is
+called the :term:`source directory`. This directory also contains the Sphinx
+configuration file :file:`conf.py`, where you can configure all aspects of how
+Sphinx reads your sources and builds your documentation. [#]_
+
+Sphinx comes with a script called :program:`sphinx-quickstart` that sets up a
+source directory and creates a default :file:`conf.py` with the most useful
+configuration values from a few questions it asks you. To use this, run:
+
+.. code-block:: console
+
+ $ sphinx-quickstart
+
+
+Defining document structure
+---------------------------
+
+Let's assume you've run :program:`sphinx-quickstart`. It created a source
+directory with :file:`conf.py` and a root document, :file:`index.rst`. The
+main function of the :term:`root document` is to serve as a welcome page, and
+to contain the root of the "table of contents tree" (or *toctree*). This is one
+of the main things that Sphinx adds to reStructuredText, a way to connect
+multiple files to a single hierarchy of documents.
+
+.. sidebar:: reStructuredText directives
+
+ ``toctree`` is a reStructuredText :dfn:`directive`, a very versatile piece
+ of markup. Directives can have arguments, options and content.
+
+ *Arguments* are given directly after the double colon following the
+ directive's name. Each directive decides whether it can have arguments, and
+ how many.
+
+ *Options* are given after the arguments, in form of a "field list". The
+ ``maxdepth`` is such an option for the ``toctree`` directive.
+
+ *Content* follows the options or arguments after a blank line. Each
+ directive decides whether to allow content, and what to do with it.
+
+ A common gotcha with directives is that **the first line of the content must
+ be indented to the same level as the options are**.
+
+The ``toctree`` directive initially is empty, and looks like so:
+
+.. code-block:: rst
+
+ .. toctree::
+ :maxdepth: 2
+
+You add documents listing them in the *content* of the directive:
+
+.. code-block:: rst
+
+ .. toctree::
+ :maxdepth: 2
+
+ usage/installation
+ usage/quickstart
+ ...
+
+This is exactly how the ``toctree`` for this documentation looks. The
+documents to include are given as :term:`document name`\ s, which in short
+means that you leave off the file name extension and use forward slashes
+(``/``) as directory separators.
+
+|more| Read more about :ref:`the toctree directive <toctree-directive>`.
+
+You can now create the files you listed in the ``toctree`` and add content, and
+their section titles will be inserted (up to the ``maxdepth`` level) at the
+place where the ``toctree`` directive is placed. Also, Sphinx now knows about
+the order and hierarchy of your documents. (They may contain ``toctree``
+directives themselves, which means you can create deeply nested hierarchies if
+necessary.)
+
+
+Adding content
+--------------
+
+In Sphinx source files, you can use most features of standard
+:term:`reStructuredText`. There are also several features added by Sphinx.
+For example, you can add cross-file references in a portable way (which works
+for all output types) using the :rst:role:`ref` role.
+
+For an example, if you are viewing the HTML version, you can look at the source
+for this document -- use the "Show Source" link in the sidebar.
+
+.. todo:: Update the below link when we add new guides on these.
+
+|more| See :doc:`/usage/restructuredtext/index` for a more in-depth
+introduction to reStructuredText, including markup added by Sphinx.
+
+
+Running the build
+-----------------
+
+Now that you have added some files and content, let's make a first build of the
+docs. A build is started with the :program:`sphinx-build` program:
+
+.. code-block:: console
+
+ $ sphinx-build -b html sourcedir builddir
+
+where *sourcedir* is the :term:`source directory`, and *builddir* is the
+directory in which you want to place the built documentation.
+The :option:`-b <sphinx-build -b>` option selects a builder; in this example
+Sphinx will build HTML files.
+
+|more| Refer to the :doc:`sphinx-build man page </man/sphinx-build>` for all
+options that :program:`sphinx-build` supports.
+
+However, :program:`sphinx-quickstart` script creates a :file:`Makefile` and a
+:file:`make.bat` which make life even easier for you. These can be executed by
+running :command:`make` with the name of the builder. For example.
+
+.. code-block:: console
+
+ $ make html
+
+This will build HTML docs in the build directory you chose. Execute
+:command:`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.
+
+
+.. todo:: Move this whole section into a guide on rST or directives
+
+Documenting objects
+-------------------
+
+One of Sphinx's main objectives is easy documentation of :dfn:`objects` (in a
+very general sense) in any :dfn:`domain`. A domain is a collection of object
+types that belong together, complete with markup to create and reference
+descriptions of these objects.
+
+The most prominent domain is the Python domain. For example, to document
+Python's built-in function ``enumerate()``, you would add this to one of your
+source files.
+
+.. code-block:: rst
+
+ .. py:function:: enumerate(sequence[, start=0])
+
+ Return an iterator that yields tuples of an index and an item of the
+ *sequence*. (And so on.)
+
+This is rendered like this:
+
+.. py:function:: enumerate(sequence[, start=0])
+
+ Return an iterator that yields tuples of an index and an item of the
+ *sequence*. (And so on.)
+
+The argument of the directive is the :dfn:`signature` of the object you
+describe, the content is the documentation for it. Multiple signatures can be
+given, each in its own line.
+
+The Python domain also happens to be the default domain, so you don't need to
+prefix the markup with the domain name.
+
+.. code-block:: rst
+
+ .. function:: enumerate(sequence[, start=0])
+
+ ...
+
+does the same job if you keep the default setting for the default domain.
+
+There are several more directives for documenting other types of Python
+objects, for example :rst:dir:`py:class` or :rst:dir:`py:method`. There is
+also a cross-referencing :dfn:`role` for each of these object types. This
+markup will create a link to the documentation of ``enumerate()``.
+
+::
+
+ The :py:func:`enumerate` function can be used for ...
+
+And here is the proof: A link to :func:`enumerate`.
+
+Again, the ``py:`` can be left out if the Python domain is the default one. It
+doesn't matter which file contains the actual documentation for
+``enumerate()``; Sphinx will find it and create a link to it.
+
+Each domain will have special rules for how the signatures can look like, and
+make the formatted output look pretty, or add specific features like links to
+parameter types, e.g. in the C/C++ domains.
+
+|more| See :doc:`/usage/restructuredtext/domains` for all the available domains
+and their directives/roles.
+
+
+Basic configuration
+-------------------
+
+Earlier we mentioned that the :file:`conf.py` file controls how Sphinx
+processes your documents. In that file, which is executed as a Python source
+file, you assign configuration values. For advanced users: since it is
+executed by Sphinx, you can do non-trivial tasks in it, like extending
+:data:`sys.path` or importing a module to find out the version you are
+documenting.
+
+The config values that you probably want to change are already put into the
+:file:`conf.py` by :program:`sphinx-quickstart` and initially commented out
+(with standard Python syntax: a ``#`` comments the rest of the line). To
+change the default value, remove the hash sign and modify the value. To
+customize a config value that is not automatically added by
+:program:`sphinx-quickstart`, just add an additional assignment.
+
+Keep in mind that the file uses Python syntax for strings, numbers, lists and
+so on. The file is saved in UTF-8 by default, as indicated by the encoding
+declaration in the first line.
+
+|more| See :doc:`/usage/configuration` for documentation of all available
+config values.
+
+
+.. todo:: Move this entire doc to a different section
+
+Autodoc
+-------
+
+When documenting Python code, it is common to put a lot of documentation in the
+source files, in documentation strings. Sphinx supports the inclusion of
+docstrings from your modules with an :dfn:`extension` (an extension is a Python
+module that provides additional features for Sphinx projects) called *autodoc*.
+
+In order to use *autodoc*, you need to activate it in :file:`conf.py` by
+putting the string ``'sphinx.ext.autodoc'`` into the list assigned to the
+:confval:`extensions` config value::
+
+ extensions = ['sphinx.ext.autodoc']
+
+Then, you have a few additional directives at your disposal. For example, to
+document the function ``io.open()``, reading its signature and
+docstring from the source file, you'd write this::
+
+ .. autofunction:: io.open
+
+You can also document whole classes or even modules automatically, using member
+options for the auto directives, like ::
+
+ .. automodule:: io
+ :members:
+
+*autodoc* needs to import your modules in order to extract the docstrings.
+Therefore, you must add the appropriate path to :py:data:`sys.path` in your
+:file:`conf.py`.
+
+.. warning::
+
+ :mod:`~sphinx.ext.autodoc` **imports** the modules to be documented. If any
+ modules have side effects on import, these will be executed by ``autodoc``
+ when ``sphinx-build`` is run.
+
+ If you document scripts (as opposed to library modules), make sure their
+ main routine is protected by a ``if __name__ == '__main__'`` condition.
+
+|more| See :mod:`sphinx.ext.autodoc` for the complete description of the
+features of autodoc.
+
+
+.. todo:: Move this doc to another section
+
+Intersphinx
+-----------
+
+Many Sphinx documents including the `Python documentation`_ are published on
+the Internet. When you want to make links to such documents from your
+documentation, you can do it with :mod:`sphinx.ext.intersphinx`.
+
+.. _Python documentation: https://docs.python.org/3
+
+In order to use intersphinx, you need to activate it in :file:`conf.py` by
+putting the string ``'sphinx.ext.intersphinx'`` into the :confval:`extensions`
+list and set up the :confval:`intersphinx_mapping` config value.
+
+For example, to link to ``io.open()`` in the Python library manual, you need to
+setup your :confval:`intersphinx_mapping` like::
+
+ intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}
+
+And now, you can write a cross-reference like ``:py:func:`io.open```. Any
+cross-reference that has no matching target in the current documentation set,
+will be looked up in the documentation sets configured in
+:confval:`intersphinx_mapping` (this needs access to the URL in order to
+download the list of valid targets). Intersphinx also works for some other
+:term:`domain`\'s roles including ``:ref:``, however it doesn't work for
+``:doc:`` as that is non-domain role.
+
+|more| See :mod:`sphinx.ext.intersphinx` for the complete description of the
+features of intersphinx.
+
+
+More topics to be covered
+-------------------------
+
+- :doc:`Other extensions </usage/extensions/index>`:
+- Static files
+- :doc:`Selecting a theme </usage/theming>`
+- :ref:`Templating <templating>`
+- Using extensions
+- :ref:`Writing extensions <dev-extensions>`
+
+
+.. rubric:: Footnotes
+
+.. [#] This is the usual layout. However, :file:`conf.py` can also live in
+ another directory, the :term:`configuration directory`. Refer to the
+ :doc:`sphinx-build man page </man/sphinx-build>` for more information.
+
+.. |more| image:: /_static/more.png
+ :align: middle
+ :alt: more info
diff --git a/doc/usage/restructuredtext/basics.rst b/doc/usage/restructuredtext/basics.rst
new file mode 100644
index 0000000..cc3c615
--- /dev/null
+++ b/doc/usage/restructuredtext/basics.rst
@@ -0,0 +1,631 @@
+.. highlight:: rst
+
+.. _rst-primer:
+
+=======================
+reStructuredText Primer
+=======================
+
+reStructuredText is the default plaintext markup language used by Sphinx. This
+section is a brief introduction to reStructuredText (reST) concepts and syntax,
+intended to provide authors with enough information to author documents
+productively. Since reST was designed to be a simple, unobtrusive markup
+language, this will not take too long.
+
+.. seealso::
+
+ The authoritative `reStructuredText User Documentation
+ <https://docutils.sourceforge.io/rst.html>`_. The "ref" links in this
+ document link to the description of the individual constructs in the reST
+ reference.
+
+
+Paragraphs
+----------
+
+The paragraph (:duref:`ref <paragraphs>`) is the most basic block in a reST
+document. Paragraphs are simply chunks of text separated by one or more blank
+lines. As in Python, indentation is significant in reST, so all lines of the
+same paragraph must be left-aligned to the same level of indentation.
+
+
+.. _rst-inline-markup:
+
+Inline markup
+-------------
+
+The standard reST inline markup is quite simple: use
+
+* one asterisk: ``*text*`` for emphasis (italics),
+* two asterisks: ``**text**`` for strong emphasis (boldface), and
+* backquotes: ````text```` for code samples.
+
+If asterisks or backquotes appear in running text and could be confused with
+inline markup delimiters, they have to be escaped with a backslash.
+
+Be aware of some restrictions of this markup:
+
+* it may not be nested,
+* content may not start or end with whitespace: ``* text*`` is wrong,
+* it must be separated from surrounding text by non-word characters. Use a
+ backslash escaped space to work around that: ``thisis\ *one*\ word``.
+
+These restrictions may be lifted in future versions of the docutils.
+
+It is also possible to replace or expand upon some of this inline markup with
+roles. Refer to :ref:`rst-roles-alt` for more information.
+
+
+Lists and Quote-like blocks
+---------------------------
+
+List markup (:duref:`ref <bullet-lists>`) is natural: just place an asterisk at
+the start of a paragraph and indent properly. The same goes for numbered
+lists; they can also be autonumbered using a ``#`` sign::
+
+ * This is a bulleted list.
+ * It has two items, the second
+ item uses two lines.
+
+ 1. This is a numbered list.
+ 2. It has two items too.
+
+ #. This is a numbered list.
+ #. It has two items too.
+
+Nested lists are possible, but be aware that they must be separated from the
+parent list items by blank lines::
+
+ * this is
+ * a list
+
+ * with a nested list
+ * and some subitems
+
+ * and here the parent list continues
+
+Definition lists (:duref:`ref <definition-lists>`) are created as follows::
+
+ term (up to a line of text)
+ Definition of the term, which must be indented
+
+ and can even consist of multiple paragraphs
+
+ next term
+ Description.
+
+Note that the term cannot have more than one line of text.
+
+Quoted paragraphs (:duref:`ref <block-quotes>`) are created by just indenting
+them more than the surrounding paragraphs.
+
+Line blocks (:duref:`ref <line-blocks>`) are a way of preserving line breaks::
+
+ | These lines are
+ | broken exactly like in
+ | the source file.
+
+There are also several more special blocks available:
+
+* field lists (:duref:`ref <field-lists>`, with caveats noted in
+ :ref:`rst-field-lists`)
+* option lists (:duref:`ref <option-lists>`)
+* quoted literal blocks (:duref:`ref <quoted-literal-blocks>`)
+* doctest blocks (:duref:`ref <doctest-blocks>`)
+
+
+.. _rst-literal-blocks:
+
+Literal blocks
+--------------
+
+Literal code blocks (:duref:`ref <literal-blocks>`) are introduced by ending a
+paragraph with the special marker ``::``. The literal block must be indented
+(and, like all paragraphs, separated from the surrounding ones by blank
+lines)::
+
+ This is a normal text paragraph. The next paragraph is a code sample::
+
+ It is not processed in any way, except
+ that the indentation is removed.
+
+ It can span multiple lines.
+
+ This is a normal text paragraph again.
+
+The handling of the ``::`` marker is smart:
+
+* If it occurs as a paragraph of its own, that paragraph is completely left out
+ of the document.
+* If it is preceded by whitespace, the marker is removed.
+* If it is preceded by non-whitespace, the marker is replaced by a single
+ colon.
+
+That way, the second sentence in the above example's first paragraph would be
+rendered as "The next paragraph is a code sample:".
+
+Code highlighting can be enabled for these literal blocks on a document-wide
+basis using the :rst:dir:`highlight` directive and on a project-wide basis
+using the :confval:`highlight_language` configuration option. The
+:rst:dir:`code-block` directive can be used to set highlighting on a
+block-by-block basis. These directives are discussed later.
+
+
+.. _rst-doctest-blocks:
+
+Doctest blocks
+--------------
+
+Doctest blocks (:duref:`ref <doctest-blocks>`) are interactive Python sessions
+cut-and-pasted into docstrings. They do not require the
+:ref:`literal blocks <rst-literal-blocks>` syntax. The doctest block must end
+with a blank line and should *not* end with an unused prompt::
+
+ >>> 1 + 1
+ 2
+
+.. _rst-tables:
+
+Tables
+------
+
+For *grid tables* (:duref:`ref <grid-tables>`), you have to "paint" the cell
+grid yourself. They look like this::
+
+ +------------------------+------------+----------+----------+
+ | Header row, column 1 | Header 2 | Header 3 | Header 4 |
+ | (header rows optional) | | | |
+ +========================+============+==========+==========+
+ | body row 1, column 1 | column 2 | column 3 | column 4 |
+ +------------------------+------------+----------+----------+
+ | body row 2 | ... | ... | |
+ +------------------------+------------+----------+----------+
+
+*Simple tables* (:duref:`ref <simple-tables>`) are easier to write, but
+limited: they must contain more than one row, and the first column cells cannot
+contain multiple lines. They look like this::
+
+ ===== ===== =======
+ A B A and B
+ ===== ===== =======
+ False False False
+ True False False
+ False True False
+ True True True
+ ===== ===== =======
+
+Two more syntaxes are supported: *CSV tables* and *List tables*. They use an
+*explicit markup block*. Refer to :ref:`table-directives` for more information.
+
+
+Hyperlinks
+----------
+
+External links
+~~~~~~~~~~~~~~
+
+Use ```Link text <https://domain.invalid/>`_`` for inline web links. If the
+link text should be the web address, you don't need special markup at all, the
+parser finds links and mail addresses in ordinary text.
+
+.. important:: There must be a space between the link text and the opening \< for the URL.
+
+You can also separate the link and the target definition (:duref:`ref
+<hyperlink-targets>`), like this::
+
+ This is a paragraph that contains `a link`_.
+
+ .. _a link: https://domain.invalid/
+
+Internal links
+~~~~~~~~~~~~~~
+
+Internal linking is done via a special reST role provided by Sphinx, see the
+section on specific markup, :ref:`ref-role`.
+
+
+.. _rst-sections:
+
+Sections
+--------
+
+Section headers (:duref:`ref <sections>`) are created by underlining (and
+optionally overlining) the section title with a punctuation character, at least
+as long as the text::
+
+ =================
+ This is a heading
+ =================
+
+Normally, there are no heading levels assigned to certain characters as the
+structure is determined from the succession of headings. However, this
+convention is used in `Python Developer's Guide for documenting
+<https://devguide.python.org/documentation/markup/#sections>`_ which you may
+follow:
+
+* ``#`` with overline, for parts
+* ``*`` with overline, for chapters
+* ``=`` for sections
+* ``-`` for subsections
+* ``^`` for subsubsections
+* ``"`` for paragraphs
+
+Of course, you are free to use your own marker characters (see the reST
+documentation), and use a deeper nesting level, but keep in mind that most
+target formats (HTML, LaTeX) have a limited supported nesting depth.
+
+
+.. _rst-field-lists:
+
+Field Lists
+-----------
+
+Field lists (:duref:`ref <field-lists>`) are sequences of fields marked up like
+this::
+
+ :fieldname: Field content
+
+They are commonly used in Python documentation::
+
+ def my_function(my_arg, my_other_arg):
+ """A function just for me.
+
+ :param my_arg: The first of my arguments.
+ :param my_other_arg: The second of my arguments.
+
+ :returns: A message (just for me, of course).
+ """
+
+Sphinx extends standard docutils behavior and intercepts field lists specified
+at the beginning of documents. Refer to :doc:`field-lists` for more
+information.
+
+
+.. TODO This ref should be 'rst-roles', but that already exists. Rename the
+.. other ones
+
+.. _rst-roles-alt:
+
+Roles
+-----
+
+A role or "custom interpreted text role" (:duref:`ref <roles>`) is an inline
+piece of explicit markup. It signifies that the enclosed text should be
+interpreted in a specific way. Sphinx uses this to provide semantic markup and
+cross-referencing of identifiers, as described in the appropriate section. The
+general syntax is ``:rolename:`content```.
+
+Docutils supports the following roles:
+
+* :durole:`emphasis` -- equivalent of ``*emphasis*``
+* :durole:`strong` -- equivalent of ``**strong**``
+* :durole:`literal` -- equivalent of ````literal````
+* :durole:`subscript` -- subscript text
+* :durole:`superscript` -- superscript text
+* :durole:`title-reference` -- for titles of books, periodicals, and other
+ materials
+
+Refer to :doc:`roles` for roles added by Sphinx.
+
+
+Explicit Markup
+---------------
+
+"Explicit markup" (:duref:`ref <explicit-markup-blocks>`) is used in reST for
+most constructs that need special handling, such as footnotes,
+specially-highlighted paragraphs, comments, and generic directives.
+
+An explicit markup block begins with a line starting with ``..`` followed by
+whitespace and is terminated by the next paragraph at the same level of
+indentation. (There needs to be a blank line between explicit markup and
+normal paragraphs. This may all sound a bit complicated, but it is intuitive
+enough when you write it.)
+
+
+.. _rst-directives:
+
+Directives
+----------
+
+A directive (:duref:`ref <directives>`) is a generic block of explicit markup.
+Along with roles, it is one of the extension mechanisms of reST, and Sphinx
+makes heavy use of it.
+
+Docutils supports the following directives:
+
+* Admonitions: :dudir:`attention`, :dudir:`caution`, :dudir:`danger`,
+ :dudir:`error`, :dudir:`hint`, :dudir:`important`, :dudir:`note`,
+ :dudir:`tip`, :dudir:`warning` and the generic
+ :dudir:`admonition <admonitions>`. (Most themes style only "note" and
+ "warning" specially.)
+
+* Images:
+
+ - :dudir:`image` (see also Images_ below)
+ - :dudir:`figure` (an image with caption and optional legend)
+
+* Additional body elements:
+
+ - :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)
+ - :dudir:`topic`, :dudir:`sidebar` (special highlighted body elements)
+ - :dudir:`parsed-literal` (literal block that supports inline markup)
+ - :dudir:`epigraph` (a block quote with optional attribution line)
+ - :dudir:`highlights`, :dudir:`pull-quote` (block quotes with their own
+ class attribute)
+ - :dudir:`compound <compound-paragraph>` (a compound paragraph)
+
+* Special tables:
+
+ - :dudir:`table` (a table with title)
+ - :dudir:`csv-table` (a table generated from comma-separated values)
+ - :dudir:`list-table` (a table generated from a list of lists)
+
+* Special directives:
+
+ - :dudir:`raw <raw-data-pass-through>` (include raw target-format markup)
+ - :dudir:`include` (include reStructuredText from another file) -- in Sphinx,
+ when given an absolute include file path, this directive takes it as
+ relative to the source directory
+
+ .. _rstclass:
+
+ - :dudir:`class` (assign a class attribute to the next element)
+
+ .. note::
+
+ When the default domain contains a ``class`` directive, this directive
+ will be shadowed. Therefore, Sphinx re-exports it as ``rst-class``.
+
+* HTML specifics:
+
+ - :dudir:`meta`
+ (generation of HTML ``<meta>`` tags, see also :ref:`html-meta` below)
+ - :dudir:`title <metadata-document-title>` (override document title)
+
+* Influencing markup:
+
+ - :dudir:`default-role` (set a new default role)
+ - :dudir:`role` (create a new role)
+
+ Since these are only per-file, better use Sphinx's facilities for setting the
+ :confval:`default_role`.
+
+.. warning::
+
+ Do *not* use the directives :dudir:`sectnum`, :dudir:`header` and
+ :dudir:`footer`.
+
+Directives added by Sphinx are described in :doc:`directives`.
+
+Basically, a directive consists of a name, arguments, options and content.
+(Keep this terminology in mind, it is used in the next chapter describing
+custom directives.) Looking at this example, ::
+
+ .. function:: foo(x)
+ foo(y, z)
+ :module: some.module.name
+
+ Return a line of text input from the user.
+
+``function`` is the directive name. It is given two arguments here, the
+remainder of the first line and the second line, as well as one option
+``module`` (as you can see, options are given in the lines immediately
+following the arguments and indicated by the colons). Options must be indented
+to the same level as the directive content.
+
+The directive content follows after a blank line and is indented relative to
+the directive start or if options are present, by the same amount as the
+options.
+
+Be careful as the indent is not a fixed number of whitespace, e.g. three, but
+any number whitespace. This can be surprising when a fixed indent is used
+throughout the document and can make a difference for directives which are
+sensitive to whitespace. Compare::
+
+ .. code-block::
+ :caption: A cool example
+
+ The output of this line starts with four spaces.
+
+ .. code-block::
+
+ The output of this line has no spaces at the beginning.
+
+In the first code block, the indent for the content was fixated by the option
+line to three spaces, consequently the content starts with four spaces.
+In the latter the indent was fixed by the content itself to seven spaces, thus
+it does not start with a space.
+
+
+Images
+------
+
+reST supports an image directive (:dudir:`ref <image>`), used like so::
+
+ .. image:: gnu.png
+ (options)
+
+When used within Sphinx, the file name given (here ``gnu.png``) must either be
+relative to the source file, or absolute which means that they are relative to
+the top source directory. For example, the file ``sketch/spam.rst`` could
+refer to the image ``images/spam.png`` as ``../images/spam.png`` or
+``/images/spam.png``.
+
+Sphinx will automatically copy image files over to a subdirectory of the output
+directory on building (e.g. the ``_static`` directory for HTML output.)
+
+Interpretation of image size options (``width`` and ``height``) is as follows:
+if the size has no unit or the unit is pixels, the given size will only be
+respected for output channels that support pixels. Other units (like ``pt`` for
+points) will be used for HTML and LaTeX output (the latter replaces ``pt`` by
+``bp`` as this is the TeX unit such that ``72bp=1in``).
+
+Sphinx extends the standard docutils behavior by allowing an asterisk for the
+extension::
+
+ .. image:: gnu.*
+
+Sphinx then searches for all images matching the provided pattern and
+determines their type. Each builder then chooses the best image out of these
+candidates. For instance, if the file name ``gnu.*`` was given and two files
+:file:`gnu.pdf` and :file:`gnu.png` existed in the source tree, the LaTeX
+builder would choose the former, while the HTML builder would prefer the
+latter. Supported image types and choosing priority are defined at
+:doc:`/usage/builders/index`.
+
+Note that image file names should not contain spaces.
+
+.. versionchanged:: 0.4
+ Added the support for file names ending in an asterisk.
+
+.. versionchanged:: 0.6
+ Image paths can now be absolute.
+
+.. versionchanged:: 1.5
+ latex target supports pixels (default is ``96px=1in``).
+
+
+Footnotes
+---------
+
+For footnotes (:duref:`ref <footnotes>`), use ``[#name]_`` to mark the footnote
+location, and add the footnote body at the bottom of the document after a
+"Footnotes" rubric heading, like so::
+
+ Lorem ipsum [#f1]_ dolor sit amet ... [#f2]_
+
+ .. rubric:: Footnotes
+
+ .. [#f1] Text of the first footnote.
+ .. [#f2] Text of the second footnote.
+
+You can also explicitly number the footnotes (``[1]_``) or use auto-numbered
+footnotes without names (``[#]_``).
+
+
+Citations
+---------
+
+Standard reST citations (:duref:`ref <citations>`) are supported, with the
+additional feature that they are "global", i.e. all citations can be referenced
+from all files. Use them like so::
+
+ Lorem ipsum [Ref]_ dolor sit amet.
+
+ .. [Ref] Book or article reference, URL or whatever.
+
+Citation usage is similar to footnote usage, but with a label that is not
+numeric or begins with ``#``.
+
+
+Substitutions
+-------------
+
+reST supports "substitutions" (:duref:`ref <substitution-definitions>`), which
+are pieces of text and/or markup referred to in the text by ``|name|``. They
+are defined like footnotes with explicit markup blocks, like this::
+
+ .. |name| replace:: replacement *text*
+
+or this::
+
+ .. |caution| image:: warning.png
+ :alt: Warning!
+
+See the :duref:`reST reference for substitutions <substitution-definitions>`
+for details.
+
+.. index:: ! pair: global; substitutions
+
+If you want to use some substitutions for all documents, put them into
+:confval:`rst_prolog` or :confval:`rst_epilog` or put them into a separate file
+and include it into all documents you want to use them in, using the
+:dudir:`include` directive. (Be sure to give the include file a file name
+extension differing from that of other source files, to avoid Sphinx finding it
+as a standalone document.)
+
+Sphinx defines some default substitutions, see :ref:`default-substitutions`.
+
+
+Comments
+--------
+
+Every explicit markup block which isn't a valid markup construct (like the
+footnotes above) is regarded as a comment (:duref:`ref <comments>`). For
+example::
+
+ .. This is a comment.
+
+You can indent text after a comment start to form multiline comments::
+
+ ..
+ This whole indented block
+ is a comment.
+
+ Still in the comment.
+
+
+.. _html-meta:
+
+HTML Metadata
+-------------
+
+The :dudir:`meta` directive allows specifying the HTML
+`metadata element`_ of a Sphinx documentation page. For example, the
+directive::
+
+ .. meta::
+ :description: The Sphinx documentation builder
+ :keywords: Sphinx, documentation, builder
+
+will generate the following HTML output:
+
+.. code:: html
+
+ <meta name="description" content="The Sphinx documentation builder">
+ <meta name="keywords" content="Sphinx, documentation, builder">
+
+Also, Sphinx will add the keywords as specified in the meta directive to the
+search index. Thereby, the ``lang`` attribute of the meta element is
+considered. For example, the directive::
+
+ .. meta::
+ :keywords: backup
+ :keywords lang=en: pleasefindthiskey pleasefindthiskeytoo
+ :keywords lang=de: bittediesenkeyfinden
+
+adds the following words to the search indices of builds with different language
+configurations:
+
+* ``pleasefindthiskey``, ``pleasefindthiskeytoo`` to *English* builds;
+* ``bittediesenkeyfinden`` to *German* builds;
+* ``backup`` to builds in all languages.
+
+.. _metadata element: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta
+
+
+Source encoding
+---------------
+
+Since the easiest way to include special characters like em dashes or copyright
+signs in reST is to directly write them as Unicode characters, one has to
+specify an encoding. Sphinx assumes source files to be encoded in UTF-8 by
+default; you can change this with the :confval:`source_encoding` config value.
+
+
+Gotchas
+-------
+
+There are some problems one commonly runs into while authoring reST documents:
+
+* **Separation of inline markup:** As said above, inline markup spans must be
+ separated from the surrounding text by non-word characters, you have to use a
+ backslash-escaped space to get around that. See :duref:`the reference
+ <substitution-definitions>` for the details.
+
+* **No nested inline markup:** Something like ``*see :func:`foo`*`` is not
+ possible.
diff --git a/doc/usage/restructuredtext/directives.rst b/doc/usage/restructuredtext/directives.rst
new file mode 100644
index 0000000..1fd5b66
--- /dev/null
+++ b/doc/usage/restructuredtext/directives.rst
@@ -0,0 +1,1311 @@
+.. highlight:: rst
+
+==========
+Directives
+==========
+
+:ref:`As previously discussed <rst-directives>`, a directive is a generic block
+of explicit markup. While Docutils provides a number of directives, Sphinx
+provides many more and uses directives as one of the primary extension
+mechanisms.
+
+See :doc:`/usage/restructuredtext/domains` for roles added by domains.
+
+.. seealso::
+
+ Refer to the :ref:`reStructuredText Primer <rst-directives>` for an overview
+ of the directives provided by Docutils.
+
+
+.. _toctree-directive:
+
+Table of contents
+-----------------
+
+.. index:: pair: table of; contents
+
+Since reST does not have facilities to interconnect several documents, or split
+documents into multiple output files, Sphinx uses a custom directive to add
+relations between the single files the documentation is made of, as well as
+tables of contents. The ``toctree`` directive is the central element.
+
+.. note::
+
+ Simple "inclusion" of one file in another can be done with the
+ :dudir:`include` directive.
+
+.. note::
+
+ To create table of contents for current document (.rst file), use the
+ standard reST :dudir:`contents directive <table-of-contents>`.
+
+.. rst:directive:: toctree
+
+ This directive inserts a "TOC tree" at the current location, using the
+ individual TOCs (including "sub-TOC trees") of the documents given in the
+ directive body. Relative document names (not beginning with a slash) are
+ relative to the document the directive occurs in, absolute names are relative
+ to the source directory. A numeric ``maxdepth`` option may be given to
+ indicate the depth of the tree; by default, all levels are included. [#]_
+
+ The representation of "TOC tree" is changed in each output format. The
+ builders that output multiple files (ex. HTML) treat it as a collection of
+ hyperlinks. On the other hand, the builders that output a single file (ex.
+ LaTeX, man page, etc.) replace it with the content of the documents on the
+ TOC tree.
+
+ Consider this example (taken from the Python docs' library reference index)::
+
+ .. toctree::
+ :maxdepth: 2
+
+ intro
+ strings
+ datatypes
+ numeric
+ (many more documents listed here)
+
+ This accomplishes two things:
+
+ * Tables of contents from all those documents are inserted, with a maximum
+ depth of two, that means one nested heading. ``toctree`` directives in
+ those documents are also taken into account.
+ * Sphinx knows the relative order of the documents ``intro``,
+ ``strings`` and so forth, and it knows that they are children of the shown
+ 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
+ hyperlinks (and Sphinx's :ref:`cross-referencing syntax <xref-syntax>`). This
+ looks like::
+
+ .. toctree::
+
+ intro
+ All about strings <strings>
+ datatypes
+
+ The second line above will link to the ``strings`` document, but will use the
+ title "All about strings" instead of the title of the ``strings`` document.
+
+ 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
+ **toplevel** toctree a ``numbered`` option. For example::
+
+ .. toctree::
+ :numbered:
+
+ foo
+ bar
+
+ 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**
+
+ You can use the ``caption`` option to provide a toctree caption and you can
+ use the ``name`` option to provide an implicit target name that can be
+ referenced by using :rst:role:`ref`::
+
+ .. toctree::
+ :caption: Table of Contents
+ :name: mastertoc
+
+ foo
+
+ 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::
+
+ .. toctree::
+ :titlesonly:
+
+ foo
+ bar
+
+ You can use "globbing" in toctree directives, by giving the ``glob`` flag
+ option. All entries are then matched against the list of available
+ documents, and matches are inserted into the list alphabetically. Example::
+
+ .. toctree::
+ :glob:
+
+ intro*
+ recipe/*
+ *
+
+ This includes first all documents whose names start with ``intro``, then all
+ documents in the ``recipe`` folder, then all remaining documents (except the
+ one containing the directive, of course.) [#]_
+
+ The special entry name ``self`` stands for the document containing the
+ toctree directive. This is useful if you want to generate a "sitemap" from
+ the toctree.
+
+ You can use the ``reversed`` flag option to reverse the order of the entries
+ in the list. This can be useful when using the ``glob`` flag option to
+ reverse the ordering of the files. Example::
+
+ .. toctree::
+ :glob:
+ :reversed:
+
+ recipe/*
+
+ You can also give a "hidden" option to the directive, like this::
+
+ .. toctree::
+ :hidden:
+
+ doc_1
+ doc_2
+
+ This will still notify Sphinx of the document hierarchy, but not insert links
+ into the document at the location of the directive -- this makes sense if you
+ intend to insert these links yourself, in a different style, or in the HTML
+ sidebar.
+
+ In cases where you want to have only one top-level toctree and hide all other
+ lower level toctrees you can add the "includehidden" option to the top-level
+ toctree entry::
+
+ .. toctree::
+ :includehidden:
+
+ doc_1
+ doc_2
+
+ All other toctree entries can then be eliminated by the "hidden" option.
+
+ In the end, all documents in the :term:`source directory` (or subdirectories)
+ must occur in some ``toctree`` directive; Sphinx will emit a warning if it
+ finds a file that is not included, because that means that this file will not
+ be reachable through standard navigation.
+
+ Use :confval:`exclude_patterns` to explicitly exclude documents or
+ directories from building completely. Use :ref:`the "orphan" metadata
+ <metadata>` to let a document be built, but notify Sphinx that it is not
+ reachable via a toctree.
+
+ The "root document" (selected by :confval:`root_doc`) is the "root" of the TOC
+ tree hierarchy. It can be used as the documentation's main page, or as a
+ "full table of contents" if you don't give a ``maxdepth`` option.
+
+ .. versionchanged:: 0.3
+ Added "globbing" option.
+
+ .. versionchanged:: 0.6
+ Added "numbered" and "hidden" options as well as external links and
+ support for "self" references.
+
+ .. versionchanged:: 1.0
+ Added "titlesonly" option.
+
+ .. versionchanged:: 1.1
+ Added numeric argument to "numbered".
+
+ .. versionchanged:: 1.2
+ Added "includehidden" option.
+
+ .. versionchanged:: 1.3
+ Added "caption" and "name" option.
+
+Special names
+^^^^^^^^^^^^^
+
+Sphinx reserves some document names for its own use; you should not try to
+create documents with these names -- it will cause problems.
+
+The special document names (and pages generated for them) are:
+
+* ``genindex``, ``modindex``, ``search``
+
+ These are used for the general index, the Python module index, and the search
+ page, respectively.
+
+ The general index is populated with entries from modules, all
+ index-generating :ref:`object descriptions <basic-domain-markup>`, and from
+ :rst:dir:`index` directives.
+
+ The Python module index contains one entry per :rst:dir:`py:module`
+ directive.
+
+ The search page contains a form that uses the generated JSON search index and
+ JavaScript to full-text search the generated documents for search words; it
+ should work on every major browser that supports modern JavaScript.
+
+* every name beginning with ``_``
+
+ Though few such names are currently used by Sphinx, you should not
+ create documents or document-containing directories with such names. (Using
+ ``_`` as a prefix for a custom template directory is fine.)
+
+.. warning::
+
+ Be careful with unusual characters in filenames. Some formats may interpret
+ these characters in unexpected ways:
+
+ * Do not use the colon ``:`` for HTML based formats. Links to other parts
+ may not work.
+
+ * Do not use the plus ``+`` for the ePub format. Some resources may not be
+ found.
+
+
+Paragraph-level markup
+----------------------
+
+.. index:: note, warning
+ pair: changes; in version
+
+These directives create short paragraphs and can be used inside information
+units as well as normal text.
+
+.. rst:directive:: .. note::
+
+ An especially important bit of information about an API that a user should be
+ aware of when using whatever bit of API the note pertains to. The content of
+ the directive should be written in complete sentences and include all
+ appropriate punctuation.
+
+ Example::
+
+ .. note::
+
+ This function is not suitable for sending spam e-mails.
+
+.. rst:directive:: .. warning::
+
+ An important bit of information about an API that a user should be very aware
+ of when using whatever bit of API the warning pertains to. The content of
+ the directive should be written in complete sentences and include all
+ appropriate punctuation. This differs from :rst:dir:`note` in that it is
+ recommended over :rst:dir:`note` for information regarding security.
+
+.. rst:directive:: .. versionadded:: version
+
+ This directive documents the version of the project which added the described
+ feature to the library or C API. When this applies to an entire module, it
+ should be placed at the top of the module section before any prose.
+
+ The first argument must be given and is the version in question; you can add
+ a second argument consisting of a *brief* explanation of the change.
+
+ Example::
+
+ .. versionadded:: 2.5
+ The *spam* parameter.
+
+ Note that there must be no blank line between the directive head and the
+ explanation; this is to make these blocks visually continuous in the markup.
+
+.. rst:directive:: .. versionchanged:: version
+
+ 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:: version
+
+ Similar to :rst:dir:`versionchanged`, but describes when the feature was
+ deprecated. An explanation can also be given, for example to inform the
+ reader what should be used instead. Example::
+
+ .. deprecated:: 3.1
+ Use :func:`spam` instead.
+
+.. rst:directive:: seealso
+
+ Many sections include a list of references to module documentation or
+ external documents. These lists are created using the :rst:dir:`seealso`
+ directive.
+
+ The :rst:dir:`seealso` directive is typically placed in a section just before
+ any subsections. For the HTML output, it is shown boxed off from the main
+ flow of the text.
+
+ The content of the :rst:dir:`seealso` directive should be a reST definition
+ list. Example::
+
+ .. seealso::
+
+ Module :py:mod:`zipfile`
+ Documentation of the :py:mod:`zipfile` standard module.
+
+ `GNU tar manual, Basic Tar Format <http://link>`_
+ Documentation for tar archive files, including GNU tar extensions.
+
+ There's also a "short form" allowed that looks like this::
+
+ .. seealso:: modules :py:mod:`zipfile`, :py:mod:`tarfile`
+
+ .. versionadded:: 0.5
+ The short form.
+
+.. rst:directive:: .. rubric:: title
+
+ This directive creates a paragraph heading that is not used to create a
+ table of contents node.
+
+ .. note::
+
+ If the *title* of the rubric is "Footnotes" (or the selected language's
+ equivalent), this rubric is ignored by the LaTeX writer, since it is
+ assumed to only contain footnote definitions and therefore would create an
+ empty heading.
+
+.. rst:directive:: centered
+
+ This directive creates a centered boldfaced line of text. Use it as
+ follows::
+
+ .. centered:: LICENSE AGREEMENT
+
+ .. deprecated:: 1.1
+ This presentation-only directive is a legacy from older versions.
+ Use a :ref:`rst-class <rstclass>` directive instead and add an
+ appropriate style.
+
+.. rst:directive:: hlist
+
+ This directive must contain a bullet list. It will transform it into a more
+ compact list by either distributing more than one item horizontally, or
+ reducing spacing between items, depending on the builder.
+
+ For builders that support the horizontal distribution, there is a ``columns``
+ option that specifies the number of columns; it defaults to 2. Example::
+
+ .. hlist::
+ :columns: 3
+
+ * A list of
+ * short items
+ * that should be
+ * displayed
+ * horizontally
+
+ .. versionadded:: 0.6
+
+
+.. _code-examples:
+
+Showing code examples
+---------------------
+
+.. index:: pair: code; examples
+ single: sourcecode
+
+There are multiple ways to show syntax-highlighted literal code blocks in
+Sphinx:
+
+* using :ref:`reST doctest blocks <rst-doctest-blocks>`;
+* using :ref:`reST literal blocks <rst-literal-blocks>`, optionally in
+ combination with the :rst:dir:`highlight` directive;
+* using the :rst:dir:`code-block` directive;
+* and using the :rst:dir:`literalinclude` directive.
+
+Doctest blocks can only be used
+to show interactive Python sessions, while the remaining three can be used for
+other languages. Of these three, literal blocks are useful when an entire
+document, or at least large sections of it, use code blocks with the same
+syntax and which should be styled in the same manner. On the other hand, the
+:rst:dir:`code-block` directive makes more sense when you want more fine-tuned
+control over the styling of each block or when you have a document containing
+code blocks using multiple varied syntaxes. Finally, the
+:rst:dir:`literalinclude` directive is useful for including entire code files
+in your documentation.
+
+In all cases, Syntax highlighting is provided by `Pygments
+<https://pygments.org>`_. When using literal blocks, this is configured using
+any :rst:dir:`highlight` directives in the source file. When a ``highlight``
+directive is encountered, it is used until the next ``highlight`` directive is
+encountered. If there is no ``highlight`` directive in the file, the global
+highlighting language is used. This defaults to ``python`` but can be
+configured using the :confval:`highlight_language` config value. The following
+values are supported:
+
+* ``none`` (no highlighting)
+* ``default`` (similar to ``python3`` but with a fallback to ``none`` without
+ warning highlighting fails; the default when :confval:`highlight_language`
+ isn't set)
+* ``guess`` (let Pygments guess the lexer based on contents, only works with
+ certain well-recognizable languages)
+* ``python``
+* ``rest``
+* ``c``
+* ... and any other `lexer alias that Pygments supports`__
+
+If highlighting with the selected language fails (i.e. Pygments emits an
+"Error" token), the block is not highlighted in any way.
+
+.. important::
+
+ The list of lexer aliases supported is tied to the Pygment version. If you
+ want to ensure consistent highlighting, you should fix your version of
+ Pygments.
+
+__ https://pygments.org/docs/lexers
+
+.. rst:directive:: .. highlight:: language
+
+ Example::
+
+ .. highlight:: c
+
+ This language is used until the next ``highlight`` directive is encountered.
+ As discussed previously, *language* can be any lexer alias supported by
+ Pygments.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: linenothreshold: threshold
+ :type: number (optional)
+
+ Enable to generate line numbers for code blocks.
+
+ This option takes an optional number as threshold parameter. If any
+ threshold given, the directive will produce line numbers only for the code
+ blocks longer than N lines. If not given, line numbers will be produced
+ for all of code blocks.
+
+ Example::
+
+ .. highlight:: python
+ :linenothreshold: 5
+
+ .. rst:directive:option:: force
+ :type: no value
+
+ If given, minor errors on highlighting are ignored.
+
+ .. versionadded:: 2.1
+
+.. rst:directive:: .. code-block:: [language]
+ .. sourcecode:: [language]
+
+ Example::
+
+ .. code-block:: ruby
+
+ Some Ruby code.
+
+ The directive's alias name :rst:dir:`sourcecode` works as well. This
+ directive takes a language name as an argument. It can be `any lexer alias
+ supported by Pygments <https://pygments.org/docs/lexers/>`_. If it is not
+ given, the setting of :rst:dir:`highlight` directive will be used. If not
+ set, :confval:`highlight_language` will be used. To display a code example
+ *inline* within other text, rather than as a separate block, you can use the
+ :rst:role:`code` role instead.
+
+ .. versionchanged:: 2.0
+ The ``language`` argument becomes optional.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: linenos
+ :type: no value
+
+ Enable to generate line numbers for the code block::
+
+ .. code-block:: ruby
+ :linenos:
+
+ Some more Ruby code.
+
+ .. rst:directive:option:: lineno-start: number
+ :type: number
+
+ Set the first line number of the code block. If present, ``linenos``
+ option is also automatically activated::
+
+ .. code-block:: ruby
+ :lineno-start: 10
+
+ Some more Ruby code, with line numbering starting at 10.
+
+ .. versionadded:: 1.3
+
+ .. rst:directive:option:: emphasize-lines: line numbers
+ :type: comma separated numbers
+
+ Emphasize particular lines of the code block::
+
+ .. 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.'
+
+ .. versionadded:: 1.1
+ .. versionchanged:: 1.6.6
+ LaTeX supports the ``emphasize-lines`` option.
+
+ .. rst:directive:option: force
+ :type: no value
+
+ Ignore minor errors on highlighting
+
+ .. versionchanged:: 2.1
+
+ .. rst:directive:option:: caption: caption of code block
+ :type: text
+
+ Set a caption to the code block.
+
+ .. versionadded:: 1.3
+
+ .. rst:directive:option:: name: a label for hyperlink
+ :type: text
+
+ Define implicit target name that can be referenced by using
+ :rst:role:`ref`. For example::
+
+ .. code-block:: python
+ :caption: this.py
+ :name: this-py
+
+ print 'Explicit is better than implicit.'
+
+ In order to cross-reference a code-block using either the
+ :rst:role:`ref` or the :rst:role:`numref` role, it is necessary
+ that both :strong:`name` and :strong:`caption` be defined. The
+ argument of :strong:`name` can then be given to :rst:role:`numref`
+ to generate the cross-reference. Example::
+
+ See :numref:`this-py` for an example.
+
+ When using :rst:role:`ref`, it is possible to generate a cross-reference
+ with only :strong:`name` defined, provided an explicit title is
+ given. Example::
+
+ See :ref:`this code snippet <this-py>` for an example.
+
+ .. versionadded:: 1.3
+
+ .. rst:directive:option:: class: class names
+ :type: a list of class names separated by spaces
+
+ The class name of the graph.
+
+ .. versionadded:: 1.4
+
+ .. rst:directive:option:: dedent: number
+ :type: number or no value
+
+ Strip indentation characters from the code block. When number given,
+ leading N characters are removed. When no argument given, leading spaces
+ are removed via :func:`textwrap.dedent()`. For example::
+
+ .. code-block:: ruby
+ :linenos:
+ :dedent: 4
+
+ some ruby code
+
+ .. versionadded:: 1.3
+ .. versionchanged:: 3.5
+ Support automatic dedent.
+
+ .. rst:directive:option:: force
+ :type: no value
+
+ If given, minor errors on highlighting are ignored.
+
+ .. versionadded:: 2.1
+
+.. rst:directive:: .. literalinclude:: filename
+
+ Longer displays of verbatim text may be included by storing the example text
+ in an external file containing only plain text. The file may be included
+ using the ``literalinclude`` directive. [#]_ For example, to include the
+ Python source file :file:`example.py`, use::
+
+ .. literalinclude:: example.py
+
+ The file name is usually relative to the current file's path. However, if
+ it is absolute (starting with ``/``), it is relative to the top source
+ directory.
+
+ **Additional options**
+
+ Like :rst:dir:`code-block`, the directive supports the ``linenos`` flag
+ option to switch on line numbers, the ``lineno-start`` option to select the
+ first line number, the ``emphasize-lines`` option to emphasize particular
+ lines, the ``name`` option to provide an implicit target name, the
+ ``dedent`` option to strip indentation characters for the code block, and a
+ ``language`` option to select a language different from the current file's
+ standard language. In addition, it supports the ``caption`` option; however,
+ this can be provided with no argument to use the filename as the caption.
+ Example with options::
+
+ .. literalinclude:: example.rb
+ :language: ruby
+ :emphasize-lines: 12,15-18
+ :linenos:
+
+ Tabs in the input are expanded if you give a ``tab-width`` option with the
+ desired tab width.
+
+ Include files are assumed to be encoded in the :confval:`source_encoding`.
+ If the file has a different encoding, you can specify it with the
+ ``encoding`` option::
+
+ .. literalinclude:: example.py
+ :encoding: latin-1
+
+ The directive also supports including only parts of the file. If it is a
+ Python module, you can select a class, function or method to include using
+ the ``pyobject`` option::
+
+ .. literalinclude:: example.py
+ :pyobject: Timer.start
+
+ This would only include the code lines belonging to the ``start()`` method
+ in the ``Timer`` class within the file.
+
+ Alternately, you can specify exactly which lines to include by giving a
+ ``lines`` option::
+
+ .. literalinclude:: example.py
+ :lines: 1,3,5-10,20-
+
+ This includes the lines 1, 3, 5 to 10 and lines 20 to the last line.
+
+ Another way to control which part of the file is included is to use the
+ ``start-after`` and ``end-before`` options (or only one of them). If
+ ``start-after`` is given as a string option, only lines that follow the
+ first line containing that string are included. If ``end-before`` is given
+ as a string option, only lines that precede the first lines containing that
+ string are included. The ``start-at`` and ``end-at`` options behave in a
+ similar way, but the lines containing the matched string are included.
+
+ ``start-after``/``start-at`` and ``end-before``/``end-at`` can have same string.
+ ``start-after``/``start-at`` filter lines before the line that contains
+ option string (``start-at`` will keep the line). Then ``end-before``/``end-at``
+ filter lines after the line that contains option string (``end-at`` will keep
+ the line and ``end-before`` skip the first line).
+
+ .. note::
+
+ If you want to select only ``[second-section]`` of ini file like the
+ following, you can use ``:start-at: [second-section]`` and
+ ``:end-before: [third-section]``:
+
+ .. code-block:: ini
+
+ [first-section]
+
+ var_in_first=true
+
+ [second-section]
+
+ var_in_second=true
+
+ [third-section]
+
+ var_in_third=true
+
+ Useful cases of these option is working with tag comments.
+ ``:start-after: [initialize]`` and ``:end-before: [initialized]`` options
+ keep lines between comments:
+
+ .. code-block:: py
+
+ if __name__ == "__main__":
+ # [initialize]
+ app.start(":8000")
+ # [initialized]
+
+
+ When lines have been selected in any of the ways described above, the line
+ numbers in ``emphasize-lines`` refer to those selected lines, counted
+ consecutively starting at ``1``.
+
+ When specifying particular parts of a file to display, it can be useful to
+ display the original line numbers. This can be done using the
+ ``lineno-match`` option, which is however allowed only when the selection
+ consists of contiguous lines.
+
+ You can prepend and/or append a line to the included code, using the
+ ``prepend`` and ``append`` option, respectively. This is useful e.g. for
+ highlighting PHP code that doesn't include the ``<?php``/``?>`` markers.
+
+ If you want to show the diff of the code, you can specify the old file by
+ giving a ``diff`` option::
+
+ .. literalinclude:: example.py
+ :diff: example.py.orig
+
+ This shows the diff between ``example.py`` and ``example.py.orig`` with
+ unified diff format.
+
+ A ``force`` option can ignore minor errors on highlighting.
+
+ .. versionchanged:: 0.4.3
+ Added the ``encoding`` option.
+
+ .. versionchanged:: 0.6
+ Added the ``pyobject``, ``lines``, ``start-after`` and ``end-before``
+ options, as well as support for absolute filenames.
+
+ .. versionchanged:: 1.0
+ Added the ``prepend``, ``append``, and ``tab-width`` options.
+
+ .. versionchanged:: 1.3
+ Added the ``diff``, ``lineno-match``, ``caption``, ``name``, and
+ ``dedent`` options.
+
+ .. versionchanged:: 1.4
+ Added the ``class`` option.
+
+ .. versionchanged:: 1.5
+ Added the ``start-at``, and ``end-at`` options.
+
+ .. versionchanged:: 1.6
+ With both ``start-after`` and ``lines`` in use, the first line as per
+ ``start-after`` is considered to be with line number ``1`` for ``lines``.
+
+ .. versionchanged:: 2.1
+ Added the ``force`` option.
+
+ .. versionchanged:: 3.5
+ Support automatic dedent.
+
+.. _glossary-directive:
+
+Glossary
+--------
+
+.. rst:directive:: .. glossary::
+
+ This directive must contain a reST definition-list-like markup with terms and
+ definitions. The definitions will then be referenceable with the
+ :rst:role:`term` role. Example::
+
+ .. glossary::
+
+ environment
+ A structure where information about all documents under the root is
+ saved, and used for cross-referencing. The environment is pickled
+ after the parsing stage, so that successive runs only need to read
+ and parse new and changed documents.
+
+ source directory
+ 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.)
+
+ If you want to specify "grouping key" for general index entries, you can put
+ a "key" as "term : key". For example::
+
+ .. glossary::
+
+ term 1 : A
+ term 2 : B
+ Definition of both terms.
+
+ Note that "key" is used for grouping key as is.
+ The "key" isn't normalized; key "A" and "a" become different groups.
+ The whole characters in "key" is used instead of a first character; it is
+ used for "Combining Character Sequence" and "Surrogate Pairs" grouping key.
+
+ In i18n situation, you can specify "localized term : key" even if original
+ text only have "term" part. In this case, translated "localized term" will be
+ categorized in "key" group.
+
+ .. 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.
+
+ .. versionchanged:: 1.4
+ Index key for glossary term should be considered *experimental*.
+
+ .. versionchanged:: 4.4
+ In internationalized documentation, the ``:sorted:`` flag sorts
+ according to translated terms.
+
+Meta-information markup
+-----------------------
+
+.. rst:directive:: .. sectionauthor:: name <email>
+
+ Identifies the author of the current section. The argument should include
+ the author's name such that it can be used for presentation and email
+ address. The domain name portion of the address should be lower case.
+ Example::
+
+ .. sectionauthor:: Guido van Rossum <guido@python.org>
+
+ By default, this markup isn't reflected in the output in any way (it helps
+ keep track of contributions), but you can set the configuration value
+ :confval:`show_authors` to ``True`` to make them produce a paragraph in the
+ output.
+
+
+.. rst:directive:: .. codeauthor:: name <email>
+
+ The :rst:dir:`codeauthor` directive, which can appear multiple times, names
+ the authors of the described code, just like :rst:dir:`sectionauthor` names
+ the author(s) of a piece of documentation. It too only produces output if
+ the :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
+:doc:`/usage/restructuredtext/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
+ pair: module; __main__
+ pair: module; sys
+ triple: module; search; path
+ seealso: scope
+
+ 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 sub-entry by separating the sub-entry text with a semicolon
+ (this notation is also used below to describe what entries are created).
+ Examples:
+
+ .. code:: reStructuredText
+
+ .. index:: single: execution
+ single: execution; context
+
+ - ``single: execution`` creates an index entry labelled ``execution``.
+ - ``single: execution; context`` creates an sub-entry of ``execution``
+ labelled ``context``.
+ pair
+ A shortcut to create two index entries.
+ The pair of values must be separated by a semicolon.
+ Example:
+
+ .. code:: reStructuredText
+
+ .. index:: pair: loop; statement
+
+ This would create two index entries; ``loop; statement`` and ``statement; loop``.
+ triple
+ A shortcut to create three index entries.
+ All three values must be separated by a semicolon.
+ Example:
+
+ .. code:: reStructuredText
+
+ .. index:: triple: module; search; path
+
+ This would create three index entries; ``module; search path``,
+ ``search; path, module``, and ``path; module search``.
+ see
+ A shortcut to create an index entry that refers to another entry.
+ Example:
+
+ .. code:: reStructuredText
+
+ .. index:: see: entry; other
+
+ This would create an index entry referring from ``entry`` to ``other``
+ (i.e. 'entry': See 'other').
+ seealso
+ Like ``see``, but inserts 'see also' instead of 'see'.
+ module, keyword, operator, object, exception, statement, builtin
+ These **deprecated** shortcuts all create two index entries.
+ For example, ``module: hashlib`` creates the entries ``module; hashlib``
+ and ``hashlib; module``.
+
+ .. deprecated:: 1.0
+ These Python-specific entry types are deprecated.
+
+ .. versionchanged:: 7.1
+ Removal version set to Sphinx 9.0.
+ Using these entry types will now emit warnings with the ``index`` category.
+
+ 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.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: name: a label for hyperlink
+ :type: text
+
+ Define implicit target name that can be referenced by using
+ :rst:role:`ref`. For example::
+
+ .. index:: Python
+ :name: py-index
+
+ .. versionadded:: 3.0
+
+.. 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
+-------------------------------
+
+.. rst:directive:: .. only:: <expression>
+
+ Include the content of the directive only if the *expression* is true. The
+ expression should consist of tags, like this::
+
+ .. only:: html and draft
+
+ Undefined tags are false, defined tags (via the ``-t`` command-line option or
+ within :file:`conf.py`, see :ref:`here <conf-tags>`) are true. Boolean
+ expressions, also using parentheses (like ``html and (latex or draft)``) are
+ supported.
+
+ The *format* and the *name* of the current builder (``html``, ``latex`` or
+ ``text``) are always set as a tag [#]_. To make the distinction between
+ format and name explicit, they are also added with the prefix ``format_`` and
+ ``builder_``, e.g. the epub builder defines the tags ``html``, ``epub``,
+ ``format_html`` and ``builder_epub``.
+
+ These standard tags are set *after* the configuration file is read, so they
+ are not available there.
+
+ All tags must follow the standard Python identifier syntax as set out in
+ the `Identifiers and keywords
+ <https://docs.python.org/3/reference/lexical_analysis.html#identifiers>`_
+ documentation. That is, a tag expression may only consist of tags that
+ conform to the syntax of Python variables. In ASCII, this consists of the
+ uppercase and lowercase letters ``A`` through ``Z``, the underscore ``_``
+ and, except for the first character, the digits ``0`` through ``9``.
+
+ .. versionadded:: 0.6
+ .. versionchanged:: 1.2
+ Added the name of the builder and the prefixes.
+
+ .. warning::
+
+ This directive is designed to control only content of document. It could
+ not control sections, labels and so on.
+
+.. _table-directives:
+
+Tables
+------
+
+Use :ref:`reStructuredText tables <rst-tables>`, i.e. either
+
+- grid table syntax (:duref:`ref <grid-tables>`),
+- simple table syntax (:duref:`ref <simple-tables>`),
+- :dudir:`csv-table` syntax,
+- or :dudir:`list-table` syntax.
+
+The :dudir:`table` directive serves as optional wrapper of the *grid* and
+*simple* syntaxes.
+
+They work fine in HTML output, but rendering tables to LaTeX is complex.
+Check the :confval:`latex_table_style`.
+
+.. versionchanged:: 1.6
+ Merged cells (multi-row, multi-column, both) from grid tables containing
+ complex contents such as multiple paragraphs, blockquotes, lists, literal
+ blocks, will render correctly to LaTeX output.
+
+.. rst:directive:: .. tabularcolumns:: column spec
+
+ This directive influences only the LaTeX output for the next table in
+ source. The mandatory argument is a column specification (known as an
+ "alignment preamble" in LaTeX idiom). Please refer to a LaTeX
+ documentation, such as the `wiki page`_, for basics of such a column
+ specification.
+
+ .. _wiki page: https://en.wikibooks.org/wiki/LaTeX/Tables
+
+ .. versionadded:: 0.3
+
+ .. note::
+
+ :rst:dir:`tabularcolumns` conflicts with ``:widths:`` option of table
+ directives. If both are specified, ``:widths:`` option will be ignored.
+
+ Sphinx will render tables with more than 30 rows with ``longtable``.
+ Besides the ``l``, ``r``, ``c`` and ``p{width}`` column specifiers, one can
+ also use ``\X{a}{b}`` (new in version 1.5) which configures the column
+ width to be a fraction ``a/b`` of the total line width and ``\Y{f}`` (new
+ in version 1.6) where ``f`` is a decimal: for example ``\Y{0.2}`` means that
+ the column will occupy ``0.2`` times the line width.
+
+ When this directive is used for a table with at most 30 rows, Sphinx will
+ render it with ``tabulary``. One can then use specific column types ``L``
+ (left), ``R`` (right), ``C`` (centered) and ``J`` (justified). They have
+ the effect of a ``p{width}`` (i.e. each cell is a LaTeX ``\parbox``) with
+ the specified internal text alignment and an automatically computed
+ ``width``.
+
+ .. warning::
+
+ - Cells that contain list-like elements such as object descriptions,
+ blockquotes or any kind of lists are not compatible with the ``LRCJ``
+ column types. The column type must then be some ``p{width}`` with an
+ explicit ``width`` (or ``\X{a}{b}`` or ``\Y{f}``).
+
+ - Literal blocks do not work with ``tabulary`` at all. Sphinx will
+ fall back to ``tabular`` or ``longtable`` environments and generate a
+ suitable column specification.
+
+In absence of the :rst:dir:`tabularcolumns` directive, and for a table with at
+most 30 rows and no problematic cells as described in the above warning,
+Sphinx uses ``tabulary`` and the ``J`` column-type for every column.
+
+.. versionchanged:: 1.6
+
+ Formerly, the ``L`` column-type was used (text is flushed-left). To revert
+ to this, include ``\newcolumntype{T}{L}`` in the LaTeX preamble, as in fact
+ Sphinx uses ``T`` and sets it by default to be an alias of ``J``.
+
+.. hint::
+
+ A frequent issue with ``tabulary`` is that columns with little contents
+ appear to be "squeezed". One can add to the LaTeX preamble for example
+ ``\setlength{\tymin}{40pt}`` to ensure a minimal column width of ``40pt``,
+ the ``tabulary`` default of ``10pt`` being too small.
+
+.. hint::
+
+ To force usage of the LaTeX ``longtable`` environment pass ``longtable`` as
+ a ``:class:`` option to :dudir:`table`, :dudir:`csv-table`, or
+ :dudir:`list-table`. Use :ref:`rst-class <rstclass>` for other tables.
+
+Math
+----
+
+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
+further translation is necessary when building LaTeX output.
+
+Keep in mind that when you put math markup in **Python docstrings** read by
+:mod:`autodoc <sphinx.ext.autodoc>`, you either have to double all backslashes,
+or use Python raw strings (``r"raw"``).
+
+.. rst:directive:: math
+
+ Directive for displayed math (math that takes the whole line for itself).
+
+ The directive supports multiple equations, which should be separated by a
+ blank line::
+
+ .. math::
+
+ (a + b)^2 = a^2 + 2ab + b^2
+
+ (a - b)^2 = a^2 - 2ab + b^2
+
+ In addition, each single equation is set within a ``split`` environment,
+ which means that you can have multiple aligned lines in an equation,
+ aligned at ``&`` and separated by ``\\``::
+
+ .. math::
+
+ (a + b)^2 &= (a + b)(a + b) \\
+ &= a^2 + 2ab + b^2
+
+ For more details, look into the documentation of the `AmSMath LaTeX
+ package`_.
+
+ When the math is only one line of text, it can also be given as a directive
+ argument::
+
+ .. 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 an internal label
+ for the equation, by which it can be cross-referenced, and causes an equation
+ number to be issued. See :rst:role:`eq` 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
+ yourself that the math is properly set up. For example::
+
+ .. math::
+ :nowrap:
+
+ \begin{eqnarray}
+ y & = & ax^2 + bx + c \\
+ f(x) & = & x^2 + 2xy + y^2
+ \end{eqnarray}
+
+.. _AmSMath LaTeX package: https://www.ams.org/publications/authors/tex/amslatex
+
+.. seealso::
+
+ :ref:`math-support`
+ Rendering options for math with HTML builders.
+
+ :confval:`latex_engine`
+ Explains how to configure LaTeX builder to support Unicode literals in
+ math mark-up.
+
+
+Grammar production displays
+---------------------------
+
+Special markup is available for displaying the productions of a formal grammar.
+The markup is simple and does not attempt to model all aspects of BNF (or any
+derived forms), but provides enough to allow context-free grammars to be
+displayed in a way that causes uses of a symbol to be rendered as hyperlinks to
+the definition of the symbol. There is this directive:
+
+.. rst:directive:: .. productionlist:: [productionGroup]
+
+ This directive is used to enclose a group of productions. Each production
+ is given on a single line and consists of a name, separated by a colon from
+ the following definition. If the definition spans multiple lines, each
+ continuation line must begin with a colon placed at the same column as in
+ the first line.
+ Blank lines are not allowed within ``productionlist`` directive arguments.
+
+ The definition can contain token names which are marked as interpreted text
+ (e.g., "``sum ::= `integer` "+" `integer```") -- this generates
+ cross-references to the productions of these tokens. Outside of the
+ production list, you can reference to token productions using
+ :rst:role:`token`.
+
+ The *productionGroup* argument to :rst:dir:`productionlist` serves to
+ distinguish different sets of production lists that belong to different
+ grammars. Multiple production lists with the same *productionGroup* thus
+ define rules in the same scope.
+
+ Inside of the production list, tokens implicitly refer to productions
+ from the current group. You can refer to the production of another
+ grammar by prefixing the token with its group name and a colon, e.g,
+ "``otherGroup:sum``". If the group of the token should not be shown in
+ the production, it can be prefixed by a tilde, e.g.,
+ "``~otherGroup:sum``". To refer to a production from an unnamed
+ grammar, the token should be prefixed by a colon, e.g., "``:sum``".
+
+ Outside of the production list,
+ if you have given a *productionGroup* argument you must prefix the
+ token name in the cross-reference with the group name and a colon,
+ e.g., "``myGroup:sum``" instead of just "``sum``".
+ If the group should not be shown in the title of the link either
+ an explicit title can be given (e.g., "``myTitle <myGroup:sum>``"),
+ or the target can be prefixed with a tilde (e.g., "``~myGroup:sum``").
+
+ Note that no further reST parsing is done in the production, so that you
+ don't have to escape ``*`` or ``|`` characters.
+
+The following is an example taken from the Python Reference Manual::
+
+ .. productionlist::
+ try_stmt: try1_stmt | try2_stmt
+ try1_stmt: "try" ":" `suite`
+ : ("except" [`expression` ["," `target`]] ":" `suite`)+
+ : ["else" ":" `suite`]
+ : ["finally" ":" `suite`]
+ try2_stmt: "try" ":" `suite`
+ : "finally" ":" `suite`
+
+
+.. rubric:: Footnotes
+
+.. [#] The LaTeX writer only refers the ``maxdepth`` option of first toctree
+ directive in the document.
+
+.. [#] A note on available globbing syntax: you can use the standard shell
+ constructs ``*``, ``?``, ``[...]`` and ``[!...]`` with the feature that
+ these all don't match slashes. A double star ``**`` can be used to
+ match any sequence of characters *including* slashes.
+
+.. [#] There is a standard ``.. include`` directive, but it raises errors if the
+ file is not found. This one only emits a warning.
+
+.. [#] For most builders name and format are the same. At the moment only
+ builders derived from the html builder distinguish between the builder
+ format and the builder name.
+
+ Note that the current builder tag is not available in ``conf.py``, it is
+ only available after the builder is initialized.
diff --git a/doc/usage/restructuredtext/domains.rst b/doc/usage/restructuredtext/domains.rst
new file mode 100644
index 0000000..729e651
--- /dev/null
+++ b/doc/usage/restructuredtext/domains.rst
@@ -0,0 +1,2303 @@
+.. highlight:: rst
+
+=======
+Domains
+=======
+
+.. versionadded:: 1.0
+
+Originally, Sphinx was conceived for a single project, the documentation of the
+Python language. Shortly afterwards, it was made available for everyone as a
+documentation tool, but the documentation of Python modules remained deeply
+built in -- the most fundamental directives, like ``function``, were designed
+for Python objects. Since Sphinx has become somewhat popular, interest
+developed in using it for many different purposes: C/C++ projects, JavaScript,
+or even reStructuredText markup (like in this documentation).
+
+While this was always possible, it is now much easier to easily support
+documentation of projects using different programming languages or even ones
+not supported by the main Sphinx distribution, by providing a **domain** for
+every such purpose.
+
+A domain is a collection of markup (reStructuredText :term:`directive`\ s and
+:term:`role`\ s) to describe and link to :term:`object`\ s belonging together,
+e.g. elements of a programming language. Directive and role names in a domain
+have names like ``domain:name``, e.g. ``py:function``. Domains can also
+provide custom indices (like the Python Module Index).
+
+Having domains means that there are no naming problems when one set of
+documentation wants to refer to e.g. C++ and Python classes. It also means
+that extensions that support the documentation of whole new languages are much
+easier to write.
+
+This section describes what the domains that are included with Sphinx provide.
+The domain API is documented as well, in the section :ref:`domain-api`.
+
+
+.. _basic-domain-markup:
+
+Basic Markup
+------------
+
+Most domains provide a number of :dfn:`object description directives`, used to
+describe specific objects provided by modules. Each directive requires one or
+more signatures to provide basic information about what is being described, and
+the content should be the description.
+
+A domain will typically keep an internal index of all entities to aid
+cross-referencing.
+Typically it will also add entries in the shown general index.
+If you want to suppress the addition of an entry in the shown index, you can
+give the directive option flag ``:no-index-entry:``.
+If you want to exclude the object description from the table of contents, you
+can give the directive option flag ``:no-contents-entry:``.
+If you want to typeset an object description, without even making it available
+for cross-referencing, you can give the directive option flag ``:no-index:``
+(which implies ``:no-index-entry:``).
+If you do not want to typeset anything, you can give the directive option flag
+``:no-typesetting:``. This can for example be used to create only a target and
+index entry for later reference.
+Though, note that not every directive in every domain may support these
+options.
+
+.. versionadded:: 3.2
+ The directive option ``noindexentry`` in the Python, C, C++, and Javascript
+ domains.
+
+.. versionadded:: 5.2.3
+ The directive option ``:nocontentsentry:`` in the Python, C, C++, Javascript,
+ and reStructuredText domains.
+
+.. versionadded:: 7.2
+ The directive option ``no-typesetting`` in the Python, C, C++, Javascript,
+ and reStructuredText domains.
+
+.. versionchanged:: 7.2
+
+ * The directive option ``:noindex:`` was renamed
+ to ``:no-index:``.
+ * The directive option ``:noindexentry:`` was renamed
+ to ``:no-index-entry:``.
+ * The directive option ``:nocontentsentry:`` was renamed
+ to ``:no-contents-entry:``.
+
+ The previous names are retained as aliases,
+ but will be deprecated and removed
+ in a future version of Sphinx.
+
+An example using a Python domain directive::
+
+ .. py:function:: spam(eggs)
+ ham(eggs)
+
+ Spam or ham the foo.
+
+This describes the two Python functions ``spam`` and ``ham``. (Note that when
+signatures become too long, you can break them if you add a backslash to lines
+that are continued in the next line. Example::
+
+ .. py:function:: filterwarnings(action, message='', category=Warning, \
+ module='', lineno=0, append=False)
+ :no-index:
+
+(This example also shows how to use the ``:no-index:`` flag.)
+
+The domains also provide roles that link back to these object descriptions.
+For example, to link to one of the functions described in the example above,
+you could say ::
+
+ The function :py:func:`spam` does a similar thing.
+
+As you can see, both directive and role names contain the domain name and the
+directive name.
+
+The directive option ``:no-typesetting:`` can be used to create a target
+(and index entry) which can later be referenced
+by the roles provided by the domain.
+This is particularly useful for literate programming:
+
+.. code-block:: rst
+
+ .. py:function:: spam(eggs)
+ :no-typesetting:
+
+ .. code::
+
+ def spam(eggs):
+ pass
+
+ The function :py:func:`spam` does nothing.
+
+.. rubric:: Default Domain
+
+For documentation describing objects from solely one domain, authors will not
+have to state again its name at each directive, role, etc... after
+having specified a default. This can be done either via the config
+value :confval:`primary_domain` or via this directive:
+
+.. rst:directive:: .. default-domain:: name
+
+ Select a new default domain. While the :confval:`primary_domain` selects a
+ global default, this only has an effect within the same file.
+
+If no other default is selected, the Python domain (named ``py``) is the
+default one, mostly for compatibility with documentation written for older
+versions of Sphinx.
+
+Directives and roles that belong to the default domain can be mentioned without
+giving the domain name, i.e. ::
+
+ .. function:: pyfunc()
+
+ Describes a Python function.
+
+ Reference to :func:`pyfunc`.
+
+Cross-referencing syntax
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+For cross-reference roles provided by domains, the same facilities exist as for
+general cross-references. See :ref:`xref-syntax`.
+
+In short:
+
+* You may supply an explicit title and reference target: ``:role:`title
+ <target>``` will refer to *target*, but the link text will be *title*.
+
+* If you prefix the content with ``!``, no reference/hyperlink will be created.
+
+* If you prefix the content with ``~``, the link text will only be the last
+ component of the target. For example, ``:py:meth:`~Queue.Queue.get``` will
+ refer to ``Queue.Queue.get`` but only display ``get`` as the link text.
+
+.. _python-domain:
+
+The Python Domain
+-----------------
+
+The Python domain (name **py**) provides the following directives for module
+declarations:
+
+.. rst:directive:: .. py:module:: name
+
+ This directive marks the beginning of the description of a module (or package
+ submodule, in which case the name should be fully qualified, including the
+ package name). A description of the module such as the docstring can be
+ placed in the body of the directive.
+
+ This directive will also cause an entry in the global module index.
+
+ .. versionchanged:: 5.2
+
+ Module directives support body content.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: platform: platforms
+ :type: comma separated list
+
+ Indicate platforms which the module is available (if it is available on
+ all platforms, the option should be omitted). The keys are short
+ identifiers; examples that are in use include "IRIX", "Mac", "Windows"
+ and "Unix". It is important to use a key which has already been used when
+ applicable.
+
+ .. rst:directive:option:: synopsis: purpose
+ :type: text
+
+ Consist of one sentence describing the module's purpose -- it is currently
+ only used in the Global Module Index.
+
+ .. rst:directive:option:: deprecated
+ :type: no argument
+
+ Mark a module as deprecated; it will be designated as such in various
+ locations then.
+
+
+
+.. rst:directive:: .. py:currentmodule:: name
+
+ This directive tells Sphinx that the classes, functions etc. documented from
+ here are in the given module (like :rst:dir:`py:module`), but it will not
+ create index entries, an entry in the Global Module Index, or a link target
+ for :rst:role:`py:mod`. This is helpful in situations where documentation
+ for things in a module is spread over multiple files or sections -- one
+ location has the :rst:dir:`py:module` directive, the others only
+ :rst:dir:`py:currentmodule`.
+
+The following directives are provided for module and class contents:
+
+.. rst:directive:: .. py:function:: name(parameters)
+ .. py:function:: name[type parameters](parameters)
+
+ Describes a module-level function.
+ The signature should include the parameters,
+ together with optional type parameters,
+ as given in the Python function definition, see :ref:`signatures`.
+ For example::
+
+ .. py:function:: Timer.repeat(repeat=3, number=1_000_000)
+ .. py:function:: add[T](a: T, b: T) -> T
+
+ For methods you should use :rst:dir:`py:method`.
+
+ The description normally includes information about the parameters required
+ and how they are used (especially whether mutable objects passed as
+ parameters are modified), side effects, and possible exceptions.
+
+ This information can (in any ``py`` directive) optionally be given in a
+ structured form, see :ref:`info-field-lists`.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: async
+ :type: no value
+
+ Indicate the function is an async function.
+
+ .. versionadded:: 2.1
+
+ .. rst:directive:option:: canonical
+ :type: full qualified name including module name
+
+ Describe the location where the object is defined if the object is
+ imported from other modules
+
+ .. versionadded:: 4.0
+
+ .. rst::directive:option:: module
+ :type: text
+
+ Describe the location where the object is defined. The default value is
+ the module specified by :rst:dir:`py:currentmodule`.
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the function's arguments will be emitted on a single logical
+ line, overriding :confval:`python_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+ .. rst:directive:option:: single-line-type-parameter-list
+ :type: no value
+
+ Ensure that the function's type parameters are emitted on a single
+ logical line, overriding :confval:`python_maximum_signature_line_length`
+ and :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+
+.. rst:directive:: .. py:data:: name
+
+ Describes global data in a module, including both variables and values used
+ as "defined constants." Class and object attributes are not documented
+ using this environment.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: type: type of the variable
+ :type: text
+
+ .. versionadded:: 2.4
+
+ .. rst:directive:option:: value: initial value of the variable
+ :type: text
+
+ .. versionadded:: 2.4
+
+ .. rst:directive:option:: canonical
+ :type: full qualified name including module name
+
+ Describe the location where the object is defined if the object is
+ imported from other modules
+
+ .. versionadded:: 4.0
+
+ .. rst::directive:option:: module
+ :type: text
+
+ Describe the location where the object is defined. The default value is
+ the module specified by :rst:dir:`py:currentmodule`.
+
+.. rst:directive:: .. py:exception:: name
+ .. py:exception:: name(parameters)
+ .. py:exception:: name[type parmeters](parameters)
+
+ Describes an exception class.
+ The signature can, but need not include parentheses with constructor arguments,
+ or may optionally include type parameters (see :pep:`695`).
+
+ .. rubric:: options
+
+ .. rst:directive:option:: final
+ :type: no value
+
+ Indicate the class is a final class.
+
+ .. versionadded:: 3.1
+
+ .. rst::directive:option:: module
+ :type: text
+
+ Describe the location where the object is defined. The default value is
+ the module specified by :rst:dir:`py:currentmodule`.
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ See :rst:dir:`py:class:single-line-parameter-list`.
+
+ .. versionadded:: 7.1
+
+ .. rst:directive:option:: single-line-type-parameter-list
+ :type: no value
+
+ See :rst:dir:`py:class:single-line-type-parameter-list`.
+
+ .. versionadded:: 7.1
+
+.. rst:directive:: .. py:class:: name
+ .. py:class:: name(parameters)
+ .. py:class:: name[type parmeters](parameters)
+
+ Describes a class.
+ The signature can optionally include type parameters (see :pep:`695`)
+ or parentheses with parameters which will be shown as the constructor arguments.
+ See also :ref:`signatures`.
+
+ Methods and attributes belonging to the class should be placed in this
+ directive's body. If they are placed outside, the supplied name should
+ contain the class name so that cross-references still work. Example::
+
+ .. py:class:: Foo
+
+ .. py:method:: quux()
+
+ -- or --
+
+ .. py:class:: Bar
+
+ .. py:method:: Bar.quux()
+
+ The first way is the preferred one.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: canonical
+ :type: full qualified name including module name
+
+ Describe the location where the object is defined if the object is
+ imported from other modules
+
+ .. versionadded:: 4.0
+
+ .. rst:directive:option:: final
+ :type: no value
+
+ Indicate the class is a final class.
+
+ .. versionadded:: 3.1
+
+ .. rst::directive:option:: module
+ :type: text
+
+ Describe the location where the object is defined. The default value is
+ the module specified by :rst:dir:`py:currentmodule`.
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the class constructor's arguments will be emitted on a single
+ logical line, overriding :confval:`python_maximum_signature_line_length`
+ and :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+ .. rst:directive:option:: single-line-type-parameter-list
+ :type: no value
+
+ Ensure that the class type parameters are emitted on a single logical
+ line, overriding :confval:`python_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+.. rst:directive:: .. py:attribute:: name
+
+ Describes an object data attribute. The description should include
+ information about the type of the data to be expected and whether it may be
+ changed directly.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: type: type of the attribute
+ :type: text
+
+ .. versionadded:: 2.4
+
+ .. rst:directive:option:: value: initial value of the attribute
+ :type: text
+
+ .. versionadded:: 2.4
+
+ .. rst:directive:option:: canonical
+ :type: full qualified name including module name
+
+ Describe the location where the object is defined if the object is
+ imported from other modules
+
+ .. versionadded:: 4.0
+
+ .. rst::directive:option:: module
+ :type: text
+
+ Describe the location where the object is defined. The default value is
+ the module specified by :rst:dir:`py:currentmodule`.
+
+.. rst:directive:: .. py:property:: name
+
+ Describes an object property.
+
+ .. versionadded:: 4.0
+
+ .. rubric:: options
+
+ .. rst:directive:option:: abstractmethod
+ :type: no value
+
+ Indicate the property is abstract.
+
+ .. rst:directive:option:: classmethod
+ :type: no value
+
+ Indicate the property is a classmethod.
+
+ .. versionaddedd: 4.2
+
+ .. rst:directive:option:: type: type of the property
+ :type: text
+
+ .. rst::directive:option:: module
+ :type: text
+
+ Describe the location where the object is defined. The default value is
+ the module specified by :rst:dir:`py:currentmodule`.
+
+.. rst:directive:: .. py:method:: name(parameters)
+ .. py:method:: name[type parameters](parameters)
+
+ Describes an object method. The parameters should not include the ``self``
+ parameter. The description should include similar information to that
+ described for ``function``. See also :ref:`signatures` and
+ :ref:`info-field-lists`.
+
+ .. rubric:: options
+
+ .. rst:directive:option:: abstractmethod
+ :type: no value
+
+ Indicate the method is an abstract method.
+
+ .. versionadded:: 2.1
+
+ .. rst:directive:option:: async
+ :type: no value
+
+ Indicate the method is an async method.
+
+ .. versionadded:: 2.1
+
+ .. rst:directive:option:: canonical
+ :type: full qualified name including module name
+
+ Describe the location where the object is defined if the object is
+ imported from other modules
+
+ .. versionadded:: 4.0
+
+ .. rst:directive:option:: classmethod
+ :type: no value
+
+ Indicate the method is a class method.
+
+ .. versionadded:: 2.1
+
+ .. rst:directive:option:: final
+ :type: no value
+
+ Indicate the class is a final method.
+
+ .. versionadded:: 3.1
+
+ .. rst::directive:option:: module
+ :type: text
+
+ Describe the location where the object is defined. The default value is
+ the module specified by :rst:dir:`py:currentmodule`.
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the method's arguments will be emitted on a single logical
+ line, overriding :confval:`python_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+ .. rst:directive:option:: single-line-type-parameter-list
+ :type: no value
+
+ Ensure that the method's type parameters are emitted on a single logical
+ line, overriding :confval:`python_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.2
+
+ .. rst:directive:option:: staticmethod
+ :type: no value
+
+ Indicate the method is a static method.
+
+ .. versionadded:: 2.1
+
+
+.. rst:directive:: .. py:staticmethod:: name(parameters)
+ .. py:staticmethod:: name[type parameters](parameters)
+
+ Like :rst:dir:`py:method`, but indicates that the method is a static method.
+
+ .. versionadded:: 0.4
+
+.. rst:directive:: .. py:classmethod:: name(parameters)
+ .. py:classmethod:: name[type parameters](parameters)
+
+ Like :rst:dir:`py:method`, but indicates that the method is a class method.
+
+ .. versionadded:: 0.6
+
+.. rst:directive:: .. py:decorator:: name
+ .. py:decorator:: name(parameters)
+ .. py:decorator:: name[type parameters](parameters)
+
+ Describes a decorator function. The signature should represent 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*.
+
+ (as opposed to ``.. py:decorator:: removename(func)``.)
+
+ 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:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the decorator's arguments will be emitted on a single logical
+ line, overriding :confval:`python_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+ .. rst:directive:option:: single-line-type-parameter-list
+ :type: no value
+
+ Ensure that the decorator's type parameters are emitted on a single
+ logical line, overriding :confval:`python_maximum_signature_line_length`
+ and :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.2
+
+.. rst:directive:: .. py:decoratormethod:: name
+ .. py:decoratormethod:: name(signature)
+ .. py:decoratormethod:: name[type parameters](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:
+
+Python Signatures
+~~~~~~~~~~~~~~~~~
+
+Signatures of functions, methods and class constructors can be given like they
+would be written in Python.
+
+Default values for optional arguments can be given (but if they contain commas,
+they will confuse the signature parser). Python 3-style argument annotations
+can also be given as well as return type annotations::
+
+ .. py:function:: compile(source : string, filename, symbol='file') -> ast object
+
+For functions with optional parameters that don't have default values
+(typically functions implemented in C extension modules without keyword
+argument support), you can use brackets to specify the optional parts:
+
+.. py:function:: compile(source[, filename[, symbol]])
+ :no-index:
+
+It is customary to put the opening bracket before the comma.
+
+Python 3.12 introduced *type parameters*, which are type variables
+declared directly within the class or function definition:
+
+.. code:: python
+
+ class AnimalList[AnimalT](list[AnimalT]):
+ ...
+
+ def add[T](a: T, b: T) -> T:
+ return a + b
+
+The corresponding reStructuredText documentation would be:
+
+.. code:: rst
+
+ .. py:class:: AnimalList[AnimalT]
+
+ .. py:function:: add[T](a: T, b: T) -> T
+
+See :pep:`695` and :pep:`696` for details and the full specification.
+
+.. _info-field-lists:
+
+Info field lists
+~~~~~~~~~~~~~~~~
+
+.. versionadded:: 0.4
+.. versionchanged:: 3.0
+
+ meta fields are added.
+
+Inside Python object description directives, reST field lists with these fields
+are recognized and formatted nicely:
+
+* ``param``, ``parameter``, ``arg``, ``argument``, ``key``, ``keyword``:
+ Description of a parameter.
+* ``type``: Type of a parameter. Creates a link if possible.
+* ``raises``, ``raise``, ``except``, ``exception``: That (and when) a specific
+ exception is raised.
+* ``var``, ``ivar``, ``cvar``: Description of a variable.
+* ``vartype``: Type of a variable. Creates a link if possible.
+* ``returns``, ``return``: Description of the return value.
+* ``rtype``: Return type. Creates a link if possible.
+* ``meta``: Add metadata to description of the python object. The metadata will
+ not be shown on output document. For example, ``:meta private:`` indicates
+ the python object is private member. It is used in
+ :py:mod:`sphinx.ext.autodoc` for filtering members.
+
+.. note::
+
+ In current release, all ``var``, ``ivar`` and ``cvar`` are represented as
+ "Variable". There is no difference at all.
+
+The field names must consist of one of these keywords and an argument (except
+for ``returns`` and ``rtype``, which do not need an argument). This is best
+explained by an example::
+
+ .. py:function:: send_message(sender, recipient, message_body, [priority=1])
+
+ Send a message to a recipient
+
+ :param str sender: The person sending the message
+ :param str recipient: The recipient of the message
+ :param str message_body: The body of the message
+ :param priority: The priority of the message, can be a number 1-5
+ :type priority: integer or None
+ :return: the message id
+ :rtype: int
+ :raises ValueError: if the message_body exceeds 160 characters
+ :raises TypeError: if the message_body is not a basestring
+
+This will render like this:
+
+.. py:function:: send_message(sender, recipient, message_body, [priority=1])
+ :no-index:
+
+ Send a message to a recipient
+
+ :param str sender: The person sending the message
+ :param str recipient: The recipient of the message
+ :param str message_body: The body of the message
+ :param priority: The priority of the message, can be a number 1-5
+ :type priority: int or None
+ :return: the message id
+ :rtype: int
+ :raises ValueError: if the message_body exceeds 160 characters
+ :raises TypeError: if the message_body is not a basestring
+
+It is also possible to combine parameter type and description, if the type is a
+single word, like this::
+
+ :param int priority: The priority of the message, can be a number 1-5
+
+.. versionadded:: 1.5
+
+Container types such as lists and dictionaries can be linked automatically
+using the following syntax::
+
+ :type priorities: list(int)
+ :type priorities: list[int]
+ :type mapping: dict(str, int)
+ :type mapping: dict[str, int]
+ :type point: tuple(float, float)
+ :type point: tuple[float, float]
+
+Multiple types in a type field will be linked automatically if separated by the
+word "or"::
+
+ :type an_arg: int or None
+ :vartype a_var: str or int
+ :rtype: float or str
+
+.. _python-roles:
+
+Cross-referencing Python objects
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following roles refer to objects in modules and are possibly hyperlinked if
+a matching identifier is found:
+
+.. rst:role:: py:mod
+
+ Reference a module; a dotted name may be used. This should also be used for
+ package names.
+
+.. rst:role:: py:func
+
+ Reference a Python function; dotted names may be used. The role text needs
+ not include trailing parentheses to enhance readability; they will be added
+ automatically by Sphinx if the :confval:`add_function_parentheses` config
+ value is ``True`` (the default).
+
+.. rst:role:: py:data
+
+ Reference a module-level variable.
+
+.. rst:role:: py:const
+
+ Reference a "defined" constant. This may be a Python variable that is not
+ intended to be changed.
+
+.. rst:role:: py:class
+
+ Reference a class; a dotted name may be used.
+
+.. rst:role:: py:meth
+
+ Reference a method of an object. The role text can include the type name
+ and the method name; if it occurs within the description of a type, the type
+ name can be omitted. A dotted name may be used.
+
+.. rst:role:: py:attr
+
+ Reference a data attribute of an object.
+
+ .. note:: The role is also able to refer to property.
+
+.. rst:role:: py:exc
+
+ Reference an exception. A dotted name may be used.
+
+.. rst:role:: py:obj
+
+ Reference an object of unspecified type. Useful e.g. as the
+ :confval:`default_role`.
+
+ .. versionadded:: 0.4
+
+The name enclosed in this markup can include a module name and/or a class name.
+For example, ``:py:func:`filter``` could refer to a function named ``filter``
+in the current module, or the built-in function of that name. In contrast,
+``:py:func:`foo.filter``` clearly refers to the ``filter`` function in the
+``foo`` module.
+
+Normally, names in these roles are searched first without any further
+qualification, then with the current module name prepended, then with the
+current module and class name (if any) prepended. If you prefix the name with
+a dot, this order is reversed. For example, in the documentation of Python's
+:mod:`codecs` module, ``:py:func:`open``` always refers to the built-in
+function, while ``:py:func:`.open``` refers to :func:`codecs.open`.
+
+A similar heuristic is used to determine whether the name is an attribute of
+the currently documented class.
+
+Also, if the name is prefixed with a dot, and no exact match is found, the
+target is taken as a suffix and all object names with that suffix are searched.
+For example, ``:py:meth:`.TarFile.close``` references the
+``tarfile.TarFile.close()`` function, even if the current module is not
+``tarfile``. Since this can get ambiguous, if there is more than one possible
+match, you will get a warning from Sphinx.
+
+Note that you can combine the ``~`` and ``.`` prefixes:
+``:py:meth:`~.TarFile.close``` will reference the ``tarfile.TarFile.close()``
+method, but the visible link caption will only be ``close()``.
+
+
+.. _c-domain:
+
+The C Domain
+------------
+
+The C domain (name **c**) is suited for documentation of C API.
+
+.. rst:directive:: .. c:member:: declaration
+ .. c:var:: declaration
+
+ Describes a C struct member or variable. Example signature::
+
+ .. c:member:: PyObject *PyTypeObject.tp_bases
+
+ The difference between the two directives is only cosmetic.
+
+.. rst:directive:: .. c:function:: function prototype
+
+ Describes a C function. The signature should be given as in C, e.g.::
+
+ .. c:function:: PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
+
+ Note that you don't have to backslash-escape asterisks in the signature, as
+ it is not parsed by the reST inliner.
+
+ In the description of a function you can use the following info fields
+ (see also :ref:`info-field-lists`).
+
+ * ``param``, ``parameter``, ``arg``, ``argument``,
+ Description of a parameter.
+ * ``type``: Type of a parameter,
+ written as if passed to the :rst:role:`c:expr` role.
+ * ``returns``, ``return``: Description of the return value.
+ * ``rtype``: Return type,
+ written as if passed to the :rst:role:`c:expr` role.
+ * ``retval``, ``retvals``: An alternative to ``returns`` for describing
+ the result of the function.
+
+ .. versionadded:: 4.3
+ The ``retval`` field type.
+
+ For example::
+
+ .. c:function:: PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
+
+ :param type: description of the first parameter.
+ :param nitems: description of the second parameter.
+ :returns: a result.
+ :retval NULL: under some conditions.
+ :retval NULL: under some other conditions as well.
+
+ which renders as
+
+ .. c:function:: PyObject *PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
+
+ ..
+ ** for some editors (e.g., vim) to stop bold-highlighting the source
+
+ :param type: description of the first parameter.
+ :param nitems: description of the second parameter.
+ :returns: a result.
+ :retval NULL: under some conditions.
+ :retval NULL: under some other conditions as well.
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the function's parameters will be emitted on a single logical
+ line, overriding :confval:`c_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+
+.. rst:directive:: .. c:macro:: name
+ .. c:macro:: name(arg list)
+
+ Describes a C macro, i.e., a C-language ``#define``, without the replacement
+ text.
+
+ In the description of a macro you can use the same info fields as for the
+ :rst:dir:`c:function` directive.
+
+ .. versionadded:: 3.0
+ The function style variant.
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the macro's parameters will be emitted on a single logical
+ line, overriding :confval:`c_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+.. rst:directive:: .. c:struct:: name
+
+ Describes a C struct.
+
+ .. versionadded:: 3.0
+
+.. rst:directive:: .. c:union:: name
+
+ Describes a C union.
+
+ .. versionadded:: 3.0
+
+.. rst:directive:: .. c:enum:: name
+
+ Describes a C enum.
+
+ .. versionadded:: 3.0
+
+.. rst:directive:: .. c:enumerator:: name
+
+ Describes a C enumerator.
+
+ .. versionadded:: 3.0
+
+.. rst:directive:: .. c:type:: typedef-like declaration
+ .. c:type:: name
+
+ Describes a C type, either as a typedef, or the alias for an unspecified
+ type.
+
+.. _c-roles:
+
+Cross-referencing C constructs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following roles create cross-references to C-language constructs if they
+are defined in the documentation:
+
+.. rst:role:: c:member
+ c:data
+ c:var
+ c:func
+ c:macro
+ c:struct
+ c:union
+ c:enum
+ c:enumerator
+ c:type
+
+ Reference a C declaration, as defined above.
+ Note that :rst:role:`c:member`, :rst:role:`c:data`, and
+ :rst:role:`c:var` are equivalent.
+
+ .. versionadded:: 3.0
+ The var, struct, union, enum, and enumerator roles.
+
+
+Anonymous Entities
+~~~~~~~~~~~~~~~~~~
+
+C supports anonymous structs, enums, and unions.
+For the sake of documentation they must be given some name that starts with
+``@``, e.g., ``@42`` or ``@data``.
+These names can also be used in cross-references,
+though nested symbols will be found even when omitted.
+The ``@...`` name will always be rendered as **[anonymous]** (possibly as a
+link).
+
+Example::
+
+ .. c:struct:: Data
+
+ .. c:union:: @data
+
+ .. c:var:: int a
+
+ .. c:var:: double b
+
+ Explicit ref: :c:var:`Data.@data.a`. Short-hand ref: :c:var:`Data.a`.
+
+This will be rendered as:
+
+.. c:struct:: Data
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. c:union:: @data
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. c:var:: int a
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. c:var:: double b
+ :no-contents-entry:
+ :no-index-entry:
+
+Explicit ref: :c:var:`Data.@data.a`. Short-hand ref: :c:var:`Data.a`.
+
+.. versionadded:: 3.0
+
+
+Aliasing Declarations
+~~~~~~~~~~~~~~~~~~~~~
+
+.. c:namespace-push:: @alias
+
+Sometimes it may be helpful list declarations elsewhere than their main
+documentation, e.g., when creating a synopsis of an interface.
+The following directive can be used for this purpose.
+
+.. rst:directive:: .. c:alias:: name
+
+ Insert one or more alias declarations. Each entity can be specified
+ as they can in the :rst:role:`c:any` role.
+
+ For example::
+
+ .. c:var:: int data
+ .. c:function:: int f(double k)
+
+ .. c:alias:: data
+ f
+
+ becomes
+
+ .. c:var:: int data
+ .. c:function:: int f(double k)
+
+ .. c:alias:: data
+ f
+
+ .. versionadded:: 3.2
+
+
+ .. rubric:: Options
+
+ .. rst:directive:option:: maxdepth: int
+
+ Insert nested declarations as well, up to the total depth given.
+ Use 0 for infinite depth and 1 for just the mentioned declaration.
+ Defaults to 1.
+
+ .. versionadded:: 3.3
+
+ .. rst:directive:option:: noroot
+
+ Skip the mentioned declarations and only render nested declarations.
+ Requires ``maxdepth`` either 0 or at least 2.
+
+ .. versionadded:: 3.5
+
+
+.. c:namespace-pop::
+
+
+Inline Expressions and Types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. rst:role:: c:expr
+ c:texpr
+
+ Insert a C expression or type either as inline code (``cpp:expr``)
+ or inline text (``cpp:texpr``). For example::
+
+ .. c:var:: int a = 42
+
+ .. c:function:: int f(int i)
+
+ An expression: :c:expr:`a * f(a)` (or as text: :c:texpr:`a * f(a)`).
+
+ A type: :c:expr:`const Data*`
+ (or as text :c:texpr:`const Data*`).
+
+ will be rendered as follows:
+
+ .. c:var:: int a = 42
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. c:function:: int f(int i)
+ :no-contents-entry:
+ :no-index-entry:
+
+ An expression: :c:expr:`a * f(a)` (or as text: :c:texpr:`a * f(a)`).
+
+ A type: :c:expr:`const Data*`
+ (or as text :c:texpr:`const Data*`).
+
+ .. versionadded:: 3.0
+
+
+Namespacing
+~~~~~~~~~~~
+
+.. versionadded:: 3.1
+
+The C language it self does not support namespacing, but it can sometimes be
+useful to emulate it in documentation, e.g., to show alternate declarations.
+The feature may also be used to document members of structs/unions/enums
+separate from their parent declaration.
+
+The current scope can be changed using three namespace directives. They manage
+a stack declarations where ``c:namespace`` resets the stack and changes a given
+scope.
+
+The ``c:namespace-push`` directive changes the scope to a given inner scope
+of the current one.
+
+The ``c:namespace-pop`` directive undoes the most recent
+``c:namespace-push`` directive.
+
+.. rst:directive:: .. c:namespace:: scope specification
+
+ Changes the current scope for the subsequent objects to the given scope, and
+ resets the namespace directive stack. Note that nested scopes can be
+ specified by separating with a dot, e.g.::
+
+ .. c:namespace:: Namespace1.Namespace2.SomeStruct.AnInnerStruct
+
+ All subsequent objects will be defined as if their name were declared with
+ the scope prepended. The subsequent cross-references will be searched for
+ starting in the current scope.
+
+ Using ``NULL`` or ``0`` as the scope will change to global scope.
+
+.. rst:directive:: .. c:namespace-push:: scope specification
+
+ Change the scope relatively to the current scope. For example, after::
+
+ .. c:namespace:: A.B
+
+ .. c:namespace-push:: C.D
+
+ the current scope will be ``A.B.C.D``.
+
+.. rst:directive:: .. c:namespace-pop::
+
+ Undo the previous ``c:namespace-push`` directive (*not* just pop a scope).
+ For example, after::
+
+ .. c:namespace:: A.B
+
+ .. c:namespace-push:: C.D
+
+ .. c:namespace-pop::
+
+ the current scope will be ``A.B`` (*not* ``A.B.C``).
+
+ If no previous ``c:namespace-push`` directive has been used, but only a
+ ``c:namespace`` directive, then the current scope will be reset to global
+ scope. That is, ``.. c:namespace:: A.B`` is equivalent to::
+
+ .. c:namespace:: NULL
+
+ .. c:namespace-push:: A.B
+
+Configuration Variables
+~~~~~~~~~~~~~~~~~~~~~~~
+
+See :ref:`c-config`.
+
+
+.. _cpp-domain:
+
+The C++ Domain
+--------------
+
+The C++ domain (name **cpp**) supports documenting C++ projects.
+
+Directives for Declaring Entities
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following directives are available. All declarations can start with a
+visibility statement (``public``, ``private`` or ``protected``).
+
+.. rst:directive:: .. cpp:class:: class specifier
+ .. cpp:struct:: class specifier
+
+ Describe a class/struct, possibly with specification of inheritance, e.g.,::
+
+ .. cpp:class:: MyClass : public MyBase, MyOtherBase
+
+ The difference between :rst:dir:`cpp:class` and :rst:dir:`cpp:struct` is
+ only cosmetic: the prefix rendered in the output, and the specifier shown
+ in the index.
+
+ The class can be directly declared inside a nested scope, e.g.,::
+
+ .. cpp:class:: OuterScope::MyClass : public MyBase, MyOtherBase
+
+ A class template can be declared::
+
+ .. cpp:class:: template<typename T, std::size_t N> std::array
+
+ or with a line break::
+
+ .. cpp:class:: template<typename T, std::size_t N> \
+ std::array
+
+ Full and partial template specialisations can be declared::
+
+ .. cpp:class:: template<> \
+ std::array<bool, 256>
+
+ .. cpp:class:: template<typename T> \
+ std::array<T, 42>
+
+ .. versionadded:: 2.0
+ The :rst:dir:`cpp:struct` directive.
+
+.. rst:directive:: .. cpp:function:: (member) function prototype
+
+ Describe a function or member function, e.g.,::
+
+ .. cpp:function:: bool myMethod(int arg1, std::string arg2)
+
+ A function with parameters and types.
+
+ .. cpp:function:: bool myMethod(int, double)
+
+ A function with unnamed parameters.
+
+ .. cpp:function:: const T &MyClass::operator[](std::size_t i) const
+
+ An overload for the indexing operator.
+
+ .. cpp:function:: operator bool() const
+
+ A casting operator.
+
+ .. cpp:function:: constexpr void foo(std::string &bar[2]) noexcept
+
+ A constexpr function.
+
+ .. cpp:function:: MyClass::MyClass(const MyClass&) = default
+
+ A copy constructor with default implementation.
+
+ Function templates can also be described::
+
+ .. cpp:function:: template<typename U> \
+ void print(U &&u)
+
+ and function template specialisations::
+
+ .. cpp:function:: template<> \
+ void print(int i)
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the function's parameters will be emitted on a single logical
+ line, overriding :confval:`cpp_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+.. rst:directive:: .. cpp:member:: (member) variable declaration
+ .. cpp:var:: (member) variable declaration
+
+ Describe a variable or member variable, e.g.,::
+
+ .. cpp:member:: std::string MyClass::myMember
+
+ .. cpp:var:: std::string MyClass::myOtherMember[N][M]
+
+ .. cpp:member:: int a = 42
+
+ Variable templates can also be described::
+
+ .. cpp:member:: template<class T> \
+ constexpr T pi = T(3.1415926535897932385)
+
+.. rst:directive:: .. cpp:type:: typedef declaration
+ .. cpp:type:: name
+ .. cpp:type:: type alias declaration
+
+ Describe a type as in a typedef declaration, a type alias declaration, or
+ simply the name of a type with unspecified type, e.g.,::
+
+ .. cpp:type:: std::vector<int> MyList
+
+ A typedef-like declaration of a type.
+
+ .. cpp:type:: MyContainer::const_iterator
+
+ Declaration of a type alias with unspecified type.
+
+ .. cpp:type:: MyType = std::unordered_map<int, std::string>
+
+ Declaration of a type alias.
+
+ A type alias can also be templated::
+
+ .. cpp:type:: template<typename T> \
+ MyContainer = std::vector<T>
+
+ The example are rendered as follows.
+
+ .. cpp:type:: std::vector<int> MyList
+ :no-contents-entry:
+ :no-index-entry:
+
+ A typedef-like declaration of a type.
+
+ .. cpp:type:: MyContainer::const_iterator
+ :no-contents-entry:
+ :no-index-entry:
+
+ Declaration of a type alias with unspecified type.
+
+ .. cpp:type:: MyType = std::unordered_map<int, std::string>
+ :no-contents-entry:
+ :no-index-entry:
+
+ Declaration of a type alias.
+
+ .. cpp:type:: template<typename T> \
+ MyContainer = std::vector<T>
+ :no-contents-entry:
+ :no-index-entry:
+
+.. rst:directive:: .. cpp:enum:: unscoped enum declaration
+ .. cpp:enum-struct:: scoped enum declaration
+ .. cpp:enum-class:: scoped enum declaration
+
+ Describe a (scoped) enum, possibly with the underlying type specified. Any
+ enumerators declared inside an unscoped enum will be declared both in the
+ enum scope and in the parent scope. Examples::
+
+ .. cpp:enum:: MyEnum
+
+ An unscoped enum.
+
+ .. cpp:enum:: MySpecificEnum : long
+
+ An unscoped enum with specified underlying type.
+
+ .. cpp:enum-class:: MyScopedEnum
+
+ A scoped enum.
+
+ .. cpp:enum-struct:: protected MyScopedVisibilityEnum : std::underlying_type<MySpecificEnum>::type
+
+ A scoped enum with non-default visibility, and with a specified
+ underlying type.
+
+.. rst:directive:: .. cpp:enumerator:: name
+ .. cpp:enumerator:: name = constant
+
+ Describe an enumerator, optionally with its value defined, e.g.,::
+
+ .. cpp:enumerator:: MyEnum::myEnumerator
+
+ .. cpp:enumerator:: MyEnum::myOtherEnumerator = 42
+
+.. rst:directive:: .. cpp:union:: name
+
+ Describe a union.
+
+ .. versionadded:: 1.8
+
+.. rst:directive:: .. cpp:concept:: template-parameter-list name
+
+ .. warning:: The support for concepts is experimental. It is based on the
+ current draft standard and the Concepts Technical Specification.
+ The features may change as they evolve.
+
+ Describe a concept. It must have exactly 1 template parameter list. The name
+ may be a nested name. Example::
+
+ .. cpp:concept:: template<typename It> std::Iterator
+
+ Proxy to an element of a notional sequence that can be compared,
+ indirected, or incremented.
+
+ **Notation**
+
+ .. cpp:var:: It r
+
+ An lvalue.
+
+ **Valid Expressions**
+
+ - :cpp:expr:`*r`, when :cpp:expr:`r` is dereferenceable.
+ - :cpp:expr:`++r`, with return type :cpp:expr:`It&`, when
+ :cpp:expr:`r` is incrementable.
+
+ This will render as follows:
+
+ .. cpp:concept:: template<typename It> std::Iterator
+
+ Proxy to an element of a notional sequence that can be compared,
+ indirected, or incremented.
+
+ **Notation**
+
+ .. cpp:var:: It r
+
+ An lvalue.
+
+ **Valid Expressions**
+
+ - :cpp:expr:`*r`, when :cpp:expr:`r` is dereferenceable.
+ - :cpp:expr:`++r`, with return type :cpp:expr:`It&`, when :cpp:expr:`r`
+ is incrementable.
+
+ .. versionadded:: 1.5
+
+
+Options
+^^^^^^^
+
+Some directives support options:
+
+- ``:no-index-entry:`` and ``:no-contents-entry:``, see :ref:`basic-domain-markup`.
+- ``:tparam-line-spec:``, for templated declarations.
+ If specified, each template parameter will be rendered on a separate line.
+
+ .. versionadded:: 1.6
+
+Anonymous Entities
+~~~~~~~~~~~~~~~~~~
+
+C++ supports anonymous namespaces, classes, enums, and unions.
+For the sake of documentation they must be given some name that starts with
+``@``, e.g., ``@42`` or ``@data``.
+These names can also be used in cross-references and (type) expressions,
+though nested symbols will be found even when omitted.
+The ``@...`` name will always be rendered as **[anonymous]** (possibly as a
+link).
+
+Example::
+
+ .. cpp:class:: Data
+
+ .. cpp:union:: @data
+
+ .. cpp:var:: int a
+
+ .. cpp:var:: double b
+
+ Explicit ref: :cpp:var:`Data::@data::a`. Short-hand ref: :cpp:var:`Data::a`.
+
+This will be rendered as:
+
+.. cpp:class:: Data
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. cpp:union:: @data
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. cpp:var:: int a
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. cpp:var:: double b
+ :no-contents-entry:
+ :no-index-entry:
+
+Explicit ref: :cpp:var:`Data::@data::a`. Short-hand ref: :cpp:var:`Data::a`.
+
+.. versionadded:: 1.8
+
+
+Aliasing Declarations
+~~~~~~~~~~~~~~~~~~~~~
+
+Sometimes it may be helpful list declarations elsewhere than their main
+documentation, e.g., when creating a synopsis of a class interface.
+The following directive can be used for this purpose.
+
+.. rst:directive:: .. cpp:alias:: name or function signature
+
+ Insert one or more alias declarations. Each entity can be specified
+ as they can in the :rst:role:`cpp:any` role.
+ If the name of a function is given (as opposed to the complete signature),
+ then all overloads of the function will be listed.
+
+ For example::
+
+ .. cpp:alias:: Data::a
+ overload_example::C::f
+
+ becomes
+
+ .. cpp:alias:: Data::a
+ overload_example::C::f
+
+ whereas::
+
+ .. cpp:alias:: void overload_example::C::f(double d) const
+ void overload_example::C::f(double d)
+
+ becomes
+
+ .. cpp:alias:: void overload_example::C::f(double d) const
+ void overload_example::C::f(double d)
+
+ .. versionadded:: 2.0
+
+
+ .. rubric:: Options
+
+ .. rst:directive:option:: maxdepth: int
+
+ Insert nested declarations as well, up to the total depth given.
+ Use 0 for infinite depth and 1 for just the mentioned declaration.
+ Defaults to 1.
+
+ .. versionadded:: 3.5
+
+ .. rst:directive:option:: noroot
+
+ Skip the mentioned declarations and only render nested declarations.
+ Requires ``maxdepth`` either 0 or at least 2.
+
+ .. versionadded:: 3.5
+
+
+Constrained Templates
+~~~~~~~~~~~~~~~~~~~~~
+
+.. warning:: The support for concepts is experimental. It is based on the
+ current draft standard and the Concepts Technical Specification.
+ The features may change as they evolve.
+
+.. note:: Sphinx does not currently support ``requires`` clauses.
+
+Placeholders
+^^^^^^^^^^^^
+
+Declarations may use the name of a concept to introduce constrained template
+parameters, or the keyword ``auto`` to introduce unconstrained template
+parameters::
+
+ .. cpp:function:: void f(auto &&arg)
+
+ A function template with a single unconstrained template parameter.
+
+ .. cpp:function:: void f(std::Iterator it)
+
+ A function template with a single template parameter, constrained by the
+ Iterator concept.
+
+Template Introductions
+^^^^^^^^^^^^^^^^^^^^^^
+
+Simple constrained function or class templates can be declared with a `template
+introduction` instead of a template parameter list::
+
+ .. cpp:function:: std::Iterator{It} void advance(It &it)
+
+ A function template with a template parameter constrained to be an
+ Iterator.
+
+ .. cpp:class:: std::LessThanComparable{T} MySortedContainer
+
+ A class template with a template parameter constrained to be
+ LessThanComparable.
+
+They are rendered as follows.
+
+.. cpp:function:: std::Iterator{It} void advance(It &it)
+ :no-contents-entry:
+ :no-index-entry:
+
+ A function template with a template parameter constrained to be an Iterator.
+
+.. cpp:class:: std::LessThanComparable{T} MySortedContainer
+ :no-contents-entry:
+ :no-index-entry:
+
+ A class template with a template parameter constrained to be
+ LessThanComparable.
+
+Note however that no checking is performed with respect to parameter
+compatibility. E.g., ``Iterator{A, B, C}`` will be accepted as an introduction
+even though it would not be valid C++.
+
+Inline Expressions and Types
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. rst:role:: cpp:expr
+ cpp:texpr
+
+ Insert a C++ expression or type either as inline code (``cpp:expr``)
+ or inline text (``cpp:texpr``). For example::
+
+ .. cpp:var:: int a = 42
+
+ .. cpp:function:: int f(int i)
+
+ An expression: :cpp:expr:`a * f(a)` (or as text: :cpp:texpr:`a * f(a)`).
+
+ A type: :cpp:expr:`const MySortedContainer<int>&`
+ (or as text :cpp:texpr:`const MySortedContainer<int>&`).
+
+ will be rendered as follows:
+
+ .. cpp:var:: int a = 42
+ :no-contents-entry:
+ :no-index-entry:
+
+ .. cpp:function:: int f(int i)
+ :no-contents-entry:
+ :no-index-entry:
+
+ An expression: :cpp:expr:`a * f(a)` (or as text: :cpp:texpr:`a * f(a)`).
+
+ A type: :cpp:expr:`const MySortedContainer<int>&`
+ (or as text :cpp:texpr:`const MySortedContainer<int>&`).
+
+ .. versionadded:: 1.7
+ The :rst:role:`cpp:expr` role.
+
+ .. versionadded:: 1.8
+ The :rst:role:`cpp:texpr` role.
+
+Namespacing
+~~~~~~~~~~~
+
+Declarations in the C++ domain are as default placed in global scope. The
+current scope can be changed using three namespace directives. They manage a
+stack declarations where ``cpp:namespace`` resets the stack and changes a given
+scope.
+
+The ``cpp:namespace-push`` directive changes the scope to a given inner scope
+of the current one.
+
+The ``cpp:namespace-pop`` directive undoes the most recent
+``cpp:namespace-push`` directive.
+
+.. rst:directive:: .. cpp:namespace:: scope specification
+
+ Changes the current scope for the subsequent objects to the given scope, and
+ resets the namespace directive stack. Note that the namespace does not need
+ to correspond to C++ namespaces, but can end in names of classes, e.g.,::
+
+ .. cpp:namespace:: Namespace1::Namespace2::SomeClass::AnInnerClass
+
+ All subsequent objects will be defined as if their name were declared with
+ the scope prepended. The subsequent cross-references will be searched for
+ starting in the current scope.
+
+ Using ``NULL``, ``0``, or ``nullptr`` as the scope will change to global
+ scope.
+
+ A namespace declaration can also be templated, e.g.,::
+
+ .. cpp:class:: template<typename T> \
+ std::vector
+
+ .. cpp:namespace:: template<typename T> std::vector
+
+ .. cpp:function:: std::size_t size() const
+
+ declares ``size`` as a member function of the class template
+ ``std::vector``. Equivalently this could have been declared using::
+
+ .. cpp:class:: template<typename T> \
+ std::vector
+
+ .. cpp:function:: std::size_t size() const
+
+ or::
+
+ .. cpp:class:: template<typename T> \
+ std::vector
+
+.. rst:directive:: .. cpp:namespace-push:: scope specification
+
+ Change the scope relatively to the current scope. For example, after::
+
+ .. cpp:namespace:: A::B
+
+ .. cpp:namespace-push:: C::D
+
+ the current scope will be ``A::B::C::D``.
+
+ .. versionadded:: 1.4
+
+.. rst:directive:: .. cpp:namespace-pop::
+
+ Undo the previous ``cpp:namespace-push`` directive (*not* just pop a scope).
+ For example, after::
+
+ .. cpp:namespace:: A::B
+
+ .. cpp:namespace-push:: C::D
+
+ .. cpp:namespace-pop::
+
+ the current scope will be ``A::B`` (*not* ``A::B::C``).
+
+ If no previous ``cpp:namespace-push`` directive has been used, but only a
+ ``cpp:namespace`` directive, then the current scope will be reset to global
+ scope. That is, ``.. cpp:namespace:: A::B`` is equivalent to::
+
+ .. cpp:namespace:: nullptr
+
+ .. cpp:namespace-push:: A::B
+
+ .. versionadded:: 1.4
+
+Info field lists
+~~~~~~~~~~~~~~~~~
+
+All the C++ directives for declaring entities support the following
+info fields (see also :ref:`info-field-lists`):
+
+* ``tparam``: Description of a template parameter.
+
+The :rst:dir:`cpp:function` directive additionally supports the
+following fields:
+
+* ``param``, ``parameter``, ``arg``, ``argument``: Description of a parameter.
+* ``returns``, ``return``: Description of a return value.
+* ``retval``, ``retvals``: An alternative to ``returns`` for describing
+ the result of the function.
+* `throws`, `throw`, `exception`: Description of a possibly thrown exception.
+
+.. versionadded:: 4.3
+ The ``retval`` field type.
+
+.. _cpp-roles:
+
+Cross-referencing
+~~~~~~~~~~~~~~~~~
+
+These roles link to the given declaration types:
+
+.. rst:role:: cpp:any
+ cpp:class
+ cpp:struct
+ cpp:func
+ cpp:member
+ cpp:var
+ cpp:type
+ cpp:concept
+ cpp:enum
+ cpp:enumerator
+
+ Reference a C++ declaration by name (see below for details). The name must
+ be properly qualified relative to the position of the link.
+
+ .. versionadded:: 2.0
+ The :rst:role:`cpp:struct` role as alias for the :rst:role:`cpp:class`
+ role.
+
+.. admonition:: Note on References with Templates Parameters/Arguments
+
+ These roles follow the Sphinx :ref:`xref-syntax` rules. This means care must
+ be taken when referencing a (partial) template specialization, e.g. if the
+ link looks like this: ``:cpp:class:`MyClass<int>```.
+ This is interpreted as a link to ``int`` with a title of ``MyClass``.
+ In this case, escape the opening angle bracket with a backslash,
+ like this: ``:cpp:class:`MyClass\<int>```.
+
+ When a custom title is not needed it may be useful to use the roles for
+ inline expressions, :rst:role:`cpp:expr` and :rst:role:`cpp:texpr`, where
+ angle brackets do not need escaping.
+
+Declarations without template parameters and template arguments
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+For linking to non-templated declarations the name must be a nested name, e.g.,
+``f`` or ``MyClass::f``.
+
+
+Overloaded (member) functions
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When a (member) function is referenced using just its name, the reference
+will point to an arbitrary matching overload.
+The :rst:role:`cpp:any` and :rst:role:`cpp:func` roles use an alternative
+format, which simply is a complete function declaration.
+This will resolve to the exact matching overload.
+As example, consider the following class declaration:
+
+.. cpp:namespace-push:: overload_example
+.. cpp:class:: C
+
+ .. cpp:function:: void f(double d) const
+ .. cpp:function:: void f(double d)
+ .. cpp:function:: void f(int i)
+ .. cpp:function:: void f()
+
+References using the :rst:role:`cpp:func` role:
+
+- Arbitrary overload: ``C::f``, :cpp:func:`C::f`
+- Also arbitrary overload: ``C::f()``, :cpp:func:`C::f()`
+- Specific overload: ``void C::f()``, :cpp:func:`void C::f()`
+- Specific overload: ``void C::f(int)``, :cpp:func:`void C::f(int)`
+- Specific overload: ``void C::f(double)``, :cpp:func:`void C::f(double)`
+- Specific overload: ``void C::f(double) const``,
+ :cpp:func:`void C::f(double) const`
+
+Note that the :confval:`add_function_parentheses` configuration variable
+does not influence specific overload references.
+
+.. cpp:namespace-pop::
+
+
+Templated declarations
+^^^^^^^^^^^^^^^^^^^^^^
+
+Assume the following declarations.
+
+.. cpp:class:: Wrapper
+
+ .. cpp:class:: template<typename TOuter> \
+ Outer
+
+ .. cpp:class:: template<typename TInner> \
+ Inner
+
+In general the reference must include the template parameter declarations,
+and template arguments for the prefix of qualified names. For example:
+
+- ``template\<typename TOuter> Wrapper::Outer``
+ (:cpp:class:`template\<typename TOuter> Wrapper::Outer`)
+- ``template\<typename TOuter> template\<typename TInner> Wrapper::Outer<TOuter>::Inner``
+ (:cpp:class:`template\<typename TOuter> template\<typename TInner> Wrapper::Outer<TOuter>::Inner`)
+
+Currently the lookup only succeed if the template parameter identifiers are
+equal strings. That is, ``template\<typename UOuter> Wrapper::Outer`` will not
+work.
+
+As a shorthand notation, if a template parameter list is omitted,
+then the lookup will assume either a primary template or a non-template,
+but not a partial template specialisation.
+This means the following references work as well:
+
+- ``Wrapper::Outer``
+ (:cpp:class:`Wrapper::Outer`)
+- ``Wrapper::Outer::Inner``
+ (:cpp:class:`Wrapper::Outer::Inner`)
+- ``template\<typename TInner> Wrapper::Outer::Inner``
+ (:cpp:class:`template\<typename TInner> Wrapper::Outer::Inner`)
+
+(Full) Template Specialisations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Assume the following declarations.
+
+.. cpp:class:: template<typename TOuter> \
+ Outer
+
+ .. cpp:class:: template<typename TInner> \
+ Inner
+
+.. cpp:class:: template<> \
+ Outer<int>
+
+ .. cpp:class:: template<typename TInner> \
+ Inner
+
+ .. cpp:class:: template<> \
+ Inner<bool>
+
+In general the reference must include a template parameter list for each
+template argument list. The full specialisation above can therefore be
+referenced with ``template\<> Outer\<int>`` (:cpp:class:`template\<>
+Outer\<int>`) and ``template\<> template\<> Outer\<int>::Inner\<bool>``
+(:cpp:class:`template\<> template\<> Outer\<int>::Inner\<bool>`). As a
+shorthand the empty template parameter list can be omitted, e.g.,
+``Outer\<int>`` (:cpp:class:`Outer\<int>`) and ``Outer\<int>::Inner\<bool>``
+(:cpp:class:`Outer\<int>::Inner\<bool>`).
+
+Partial Template Specialisations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Assume the following declaration.
+
+.. cpp:class:: template<typename T> \
+ Outer<T*>
+
+References to partial specialisations must always include the template
+parameter lists, e.g., ``template\<typename T> Outer\<T*>``
+(:cpp:class:`template\<typename T> Outer\<T*>`). Currently the lookup only
+succeed if the template parameter identifiers are equal strings.
+
+Configuration Variables
+~~~~~~~~~~~~~~~~~~~~~~~
+
+See :ref:`cpp-config`.
+
+.. _domains-std:
+
+The Standard Domain
+-------------------
+
+The so-called "standard" domain collects all markup that doesn't warrant a
+domain of its own. Its directives and roles are not prefixed with a domain
+name.
+
+The standard domain is also where custom object descriptions, added using the
+:func:`~sphinx.application.Sphinx.add_object_type` API, are placed.
+
+There is a set of directives allowing documenting command-line programs:
+
+.. rst:directive:: .. option:: name args, name args, ...
+
+ Describes a command line argument or switch. Option argument names should
+ be enclosed in angle brackets. Examples::
+
+ .. option:: dest_dir
+
+ Destination directory.
+
+ .. option:: -m <module>, --module <module>
+
+ Run a module as a script.
+
+ The directive will create cross-reference targets for the given options,
+ referenceable by :rst:role:`option` (in the example case, you'd use something
+ like ``:option:`dest_dir```, ``:option:`-m```, or ``:option:`--module```).
+
+ .. versionchanged:: 5.3
+
+ One can cross-reference including an option value: ``:option:`--module=foobar```,
+ ,``:option:`--module[=foobar]``` or ``:option:`--module foobar```.
+
+ Use :confval:`option_emphasise_placeholders` for parsing of
+ "variable part" of a literal text (similarly to the :rst:role:`samp` role).
+
+ ``cmdoption`` directive is a deprecated alias for the ``option`` directive.
+
+.. rst:directive:: .. envvar:: name
+
+ Describes an environment variable that the documented code or program uses
+ or defines. Referenceable by :rst:role:`envvar`.
+
+.. rst:directive:: .. program:: name
+
+ Like :rst:dir:`py:currentmodule`, this directive produces no output.
+ Instead, it serves to notify Sphinx that all following :rst:dir:`option`
+ directives document options for the program called *name*.
+
+ If you use :rst:dir:`program`, you have to qualify the references in your
+ :rst:role:`option` roles by the program name, so if you have the following
+ situation ::
+
+ .. program:: rm
+
+ .. option:: -r
+
+ Work recursively.
+
+ .. program:: svn
+
+ .. option:: -r <revision>
+
+ Specify the revision to work upon.
+
+ then ``:option:`rm -r``` would refer to the first option, while
+ ``:option:`svn -r``` would refer to the second one.
+
+ If ``None`` is passed to the argument, the directive will reset the
+ current program name.
+
+ The program name may contain spaces (in case you want to document
+ subcommands like ``svn add`` and ``svn commit`` separately).
+
+ .. versionadded:: 0.5
+
+There is also a very generic object description directive, which is not tied to
+any domain:
+
+.. rst:directive:: .. describe:: text
+ .. object:: text
+
+ This directive produces the same formatting as the specific ones provided by
+ domains, but does not create index entries or cross-referencing targets.
+ Example::
+
+ .. describe:: PAPER
+
+ You can set this variable to select a paper size.
+
+
+The JavaScript Domain
+---------------------
+
+The JavaScript domain (name **js**) provides the following directives:
+
+.. rst:directive:: .. js:module:: name
+
+ This directive sets the module name for object declarations that follow
+ after. The module name is used in the global module index and in cross
+ references. This directive does not create an object heading like
+ :rst:dir:`py:class` would, for example.
+
+ By default, this directive will create a linkable entity and will cause an
+ entry in the global module index, unless the ``no-index`` option is
+ specified. If this option is specified, the directive will only update the
+ current module name.
+
+ .. versionadded:: 1.6
+ .. versionchanged:: 5.2
+
+ Module directives support body content.
+
+.. rst:directive:: .. js:function:: name(signature)
+
+ Describes a JavaScript function or method. If you want to describe
+ arguments as optional use square brackets as :ref:`documented <signatures>`
+ for Python signatures.
+
+ You can use fields to give more details about arguments and their expected
+ types, errors which may be thrown by the function, and the value being
+ returned::
+
+ .. js:function:: $.getJSON(href, callback[, errback])
+
+ :param string href: An URI to the location of the resource.
+ :param callback: Gets called with the object.
+ :param errback:
+ Gets called in case the request fails. And a lot of other
+ text so we need multiple lines.
+ :throws SomeError: For whatever reason in that case.
+ :returns: Something.
+
+ This is rendered as:
+
+ .. js:function:: $.getJSON(href, callback[, errback])
+ :no-index:
+
+ :param string href: An URI to the location of the resource.
+ :param callback: Gets called with the object.
+ :param errback:
+ Gets called in case the request fails. And a lot of other
+ text so we need multiple lines.
+ :throws SomeError: For whatever reason in that case.
+ :returns: Something.
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the function's parameters will be emitted on a single logical
+ line, overriding :confval:`javascript_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+.. rst:directive:: .. js:method:: name(signature)
+
+ This directive is an alias for :rst:dir:`js:function`, however it describes
+ a function that is implemented as a method on a class object.
+
+ .. versionadded:: 1.6
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the function's parameters will be emitted on a single logical
+ line, overriding :confval:`javascript_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+.. rst:directive:: .. js:class:: name
+
+ Describes a constructor that creates an object. This is basically like a
+ function but will show up with a `class` prefix::
+
+ .. js:class:: MyAnimal(name[, age])
+
+ :param string name: The name of the animal
+ :param number age: an optional age for the animal
+
+ This is rendered as:
+
+ .. js:class:: MyAnimal(name[, age])
+ :no-index:
+
+ :param string name: The name of the animal
+ :param number age: an optional age for the animal
+
+ .. rst:directive:option:: single-line-parameter-list
+ :type: no value
+
+ Ensures that the function's parameters will be emitted on a single logical
+ line, overriding :confval:`javascript_maximum_signature_line_length` and
+ :confval:`maximum_signature_line_length`.
+
+ .. versionadded:: 7.1
+
+.. rst:directive:: .. js:data:: name
+
+ Describes a global variable or constant.
+
+.. rst:directive:: .. js:attribute:: object.name
+
+ Describes the attribute *name* of *object*.
+
+.. _js-roles:
+
+These roles are provided to refer to the described objects:
+
+.. rst:role:: js:mod
+ js:func
+ js:meth
+ js:class
+ js:data
+ js:attr
+
+
+The reStructuredText domain
+---------------------------
+
+The reStructuredText domain (name **rst**) provides the following directives:
+
+.. rst:directive:: .. rst:directive:: name
+
+ Describes a reST directive. The *name* can be a single directive name or
+ actual directive syntax (`..` prefix and `::` suffix) with arguments that
+ will be rendered differently. For example::
+
+ .. rst:directive:: foo
+
+ Foo description.
+
+ .. rst:directive:: .. bar:: baz
+
+ Bar description.
+
+ will be rendered as:
+
+ .. rst:directive:: foo
+ :no-index:
+
+ Foo description.
+
+ .. rst:directive:: .. bar:: baz
+ :no-index:
+
+ Bar description.
+
+.. rst:directive:: .. rst:directive:option:: name
+
+ Describes an option for reST directive. The *name* can be a single option
+ name or option name with arguments which separated with colon (``:``).
+ For example::
+
+ .. rst:directive:: toctree
+
+ .. rst:directive:option:: caption: caption of ToC
+
+ .. rst:directive:option:: glob
+
+ will be rendered as:
+
+ .. rst:directive:: toctree
+ :no-index:
+
+ .. rst:directive:option:: caption: caption of ToC
+ :no-index:
+
+ .. rst:directive:option:: glob
+ :no-index:
+
+ .. rubric:: options
+
+ .. rst:directive:option:: type: description of argument
+ :type: text
+
+ Describe the type of option value.
+
+ For example::
+
+ .. rst:directive:: toctree
+
+ .. rst:directive:option:: maxdepth
+ :type: integer or no value
+
+ .. versionadded:: 2.1
+
+.. rst:directive:: .. rst:role:: name
+
+ Describes a reST role. For example::
+
+ .. rst:role:: foo
+
+ Foo description.
+
+ will be rendered as:
+
+ .. rst:role:: foo
+ :no-index:
+
+ Foo description.
+
+.. _rst-roles:
+
+These roles are provided to refer to the described objects:
+
+.. rst:role:: rst:dir
+ rst:role
+
+.. _math-domain:
+
+The Math Domain
+---------------
+
+The math domain (name **math**) provides the following roles:
+
+.. rst:role:: math:numref
+
+ Role for cross-referencing equations defined by :rst:dir:`math` directive
+ via their label. Example::
+
+ .. math:: e^{i\pi} + 1 = 0
+ :label: euler
+
+ Euler's identity, equation :math:numref:`euler`, was elected one of the
+ most beautiful mathematical formulas.
+
+ .. versionadded:: 1.8
+
+More domains
+------------
+
+The sphinx-contrib_ repository contains more domains available as extensions;
+currently Ada_, CoffeeScript_, Erlang_, HTTP_, Lasso_, MATLAB_, PHP_, and Ruby_
+domains. Also available are domains for `Chapel`_, `Common Lisp`_, dqn_, Go_,
+Jinja_, Operation_, and Scala_.
+
+.. _sphinx-contrib: https://github.com/sphinx-contrib
+
+.. _Ada: https://pypi.org/project/sphinxcontrib-adadomain/
+.. _Chapel: https://pypi.org/project/sphinxcontrib-chapeldomain/
+.. _CoffeeScript: https://pypi.org/project/sphinxcontrib-coffee/
+.. _Common Lisp: https://pypi.org/project/sphinxcontrib-cldomain/
+.. _dqn: https://pypi.org/project/sphinxcontrib-dqndomain/
+.. _Erlang: https://pypi.org/project/sphinxcontrib-erlangdomain/
+.. _Go: https://pypi.org/project/sphinxcontrib-golangdomain/
+.. _HTTP: https://pypi.org/project/sphinxcontrib-httpdomain/
+.. _Jinja: https://pypi.org/project/sphinxcontrib-jinjadomain/
+.. _Lasso: https://pypi.org/project/sphinxcontrib-lassodomain/
+.. _MATLAB: https://pypi.org/project/sphinxcontrib-matlabdomain/
+.. _Operation: https://pypi.org/project/sphinxcontrib-operationdomain/
+.. _PHP: https://pypi.org/project/sphinxcontrib-phpdomain/
+.. _Ruby: https://github.com/sphinx-contrib/rubydomain
+.. _Scala: https://pypi.org/project/sphinxcontrib-scaladomain/
diff --git a/doc/usage/restructuredtext/field-lists.rst b/doc/usage/restructuredtext/field-lists.rst
new file mode 100644
index 0000000..5fc897d
--- /dev/null
+++ b/doc/usage/restructuredtext/field-lists.rst
@@ -0,0 +1,78 @@
+.. highlight:: rst
+
+===========
+Field Lists
+===========
+
+:ref:`As previously discussed <rst-field-lists>`, field lists are sequences of
+fields marked up like this::
+
+ :fieldname: Field content
+
+Sphinx extends standard docutils behavior for field lists and adds some extra
+functionality that is covered in this section.
+
+.. note::
+
+ The values of field lists will be parsed as
+ strings. You cannot use Python collections such as lists or dictionaries.
+
+
+.. _metadata:
+
+File-wide metadata
+------------------
+
+A field list near the top of a file is normally parsed by docutils as the
+*docinfo* and shown on the page. However, in Sphinx, a field list preceding
+any other markup is moved from the *docinfo* to the Sphinx environment as
+document metadata, and is not displayed in the output.
+
+.. note::
+
+ A field list appearing after the document title *will* be part of the
+ *docinfo* as normal and will be displayed in the output.
+
+
+Special metadata fields
+-----------------------
+
+Sphinx provides custom behavior for bibliographic fields compared to docutils.
+
+At the moment, these metadata fields are recognized:
+
+``tocdepth``
+ The maximum depth for a table of contents of this file. ::
+
+ :tocdepth: 2
+
+ .. note::
+
+ This metadata effects to the depth of local toctree. But it does not
+ effect to the depth of *global* toctree. So this would not be change
+ the sidebar of some themes which uses global one.
+
+ .. versionadded:: 0.4
+
+``nocomments``
+ If set, the web application won't display a comment form for a page
+ generated from this source file. ::
+
+ :nocomments:
+
+``orphan``
+ If set, warnings about this file not being included in any toctree will be
+ suppressed. ::
+
+ :orphan:
+
+ .. versionadded:: 1.0
+
+``nosearch``
+ If set, full text search for this file is disabled. ::
+
+ :nosearch:
+
+ .. note:: object search is still available even if `nosearch` option is set.
+
+ .. versionadded:: 3.0
diff --git a/doc/usage/restructuredtext/index.rst b/doc/usage/restructuredtext/index.rst
new file mode 100644
index 0000000..87b6ed6
--- /dev/null
+++ b/doc/usage/restructuredtext/index.rst
@@ -0,0 +1,24 @@
+.. _rst-index:
+
+================
+reStructuredText
+================
+
+reStructuredText (reST) is the default plaintext markup language used by both
+Docutils and Sphinx. Docutils provides the basic reStructuredText syntax, while
+Sphinx extends this to support additional functionality.
+
+The below guides go through the most important aspects of reST. For the
+authoritative reStructuredText reference, refer to the `docutils
+documentation`__.
+
+__ https://docutils.sourceforge.io/rst.html
+
+.. toctree::
+ :maxdepth: 2
+
+ basics
+ roles
+ directives
+ field-lists
+ domains
diff --git a/doc/usage/restructuredtext/roles.rst b/doc/usage/restructuredtext/roles.rst
new file mode 100644
index 0000000..e468de9
--- /dev/null
+++ b/doc/usage/restructuredtext/roles.rst
@@ -0,0 +1,536 @@
+.. highlight:: rst
+
+=====
+Roles
+=====
+
+Sphinx uses interpreted text roles to insert semantic markup into documents.
+They are written as ``:rolename:`content```.
+
+.. note::
+
+ The default role (```content```) has no special meaning by default. You are
+ free to use it for anything you like, e.g. variable names; use the
+ :confval:`default_role` config value to set it to a known role -- the
+ :rst:role:`any` role to find anything or the :rst:role:`py:obj` role to find
+ Python objects are very useful for this.
+
+See :doc:`/usage/restructuredtext/domains` for roles added by domains.
+
+
+.. _xref-syntax:
+
+Cross-referencing syntax
+------------------------
+
+Cross-references are generated by many semantic interpreted text roles.
+Basically, you only need to write ``:role:`target```, and a link will be
+created to the item named *target* of the type indicated by *role*. The link's
+text will be the same as *target*.
+
+There are some additional facilities, however, that make cross-referencing
+roles more versatile:
+
+* You may supply an explicit title and reference target, like in reST direct
+ hyperlinks: ``:role:`title <target>``` will refer to *target*, but the link
+ text will be *title*.
+
+* If you prefix the content with ``!``, no reference/hyperlink will be created.
+
+* If you prefix the content with ``~``, the link text will only be the last
+ component of the target. For example, ``:py:meth:`~Queue.Queue.get``` will
+ refer to ``Queue.Queue.get`` but only display ``get`` as the link text. This
+ does not work with all cross-reference roles, but is domain specific.
+
+ In HTML output, the link's ``title`` attribute (that is e.g. shown as a
+ tool-tip on mouse-hover) will always be the full target name.
+
+
+.. _any-role:
+
+Cross-referencing anything
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. rst:role:: any
+
+ .. versionadded:: 1.3
+
+ This convenience role tries to do its best to find a valid target for its
+ reference text.
+
+ * First, it tries standard cross-reference targets that would be referenced
+ by :rst:role:`doc`, :rst:role:`ref` or :rst:role:`option`.
+
+ Custom objects added to the standard domain by extensions (see
+ :meth:`.Sphinx.add_object_type`) are also searched.
+
+ * Then, it looks for objects (targets) in all loaded domains. It is up to
+ the domains how specific a match must be. For example, in the Python
+ domain a reference of ``:any:`Builder``` would match the
+ ``sphinx.builders.Builder`` class.
+
+ If none or multiple targets are found, a warning will be emitted. In the
+ case of multiple targets, you can change "any" to a specific role.
+
+ This role is a good candidate for setting :confval:`default_role`. If you
+ do, you can write cross-references without a lot of markup overhead. For
+ example, in this Python function documentation::
+
+ .. function:: install()
+
+ This function installs a `handler` for every signal known by the
+ `signal` module. See the section `about-signals` for more information.
+
+ there could be references to a glossary term (usually ``:term:`handler```), a
+ Python module (usually ``:py:mod:`signal``` or ``:mod:`signal```) and a
+ section (usually ``:ref:`about-signals```).
+
+ The :rst:role:`any` role also works together with the
+ :mod:`~sphinx.ext.intersphinx` extension: when no local cross-reference is
+ found, all object types of intersphinx inventories are also searched.
+
+Cross-referencing objects
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+These roles are described with their respective domains:
+
+* :ref:`Python <python-roles>`
+* :ref:`C <c-roles>`
+* :ref:`C++ <cpp-roles>`
+* :ref:`JavaScript <js-roles>`
+* :ref:`ReST <rst-roles>`
+
+
+.. _ref-role:
+
+Cross-referencing arbitrary locations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. rst:role:: ref
+
+ To support cross-referencing to arbitrary locations in any document, the
+ standard reST labels are used. For this to work label names must be unique
+ throughout the entire documentation. There are two ways in which you can
+ refer to labels:
+
+ * If you place a label directly before a section title, you can reference to
+ it with ``:ref:`label-name```. For example::
+
+ .. _my-reference-label:
+
+ Section to cross-reference
+ --------------------------
+
+ This is the text of the section.
+
+ It refers to the section itself, see :ref:`my-reference-label`.
+
+ The ``:ref:`` role would then generate a link to the section, with the
+ link title being "Section to cross-reference". This works just as well
+ when section and reference are in different source files.
+
+ Automatic labels also work with figures. For example::
+
+ .. _my-figure:
+
+ .. figure:: whatever
+
+ Figure caption
+
+ In this case, a reference ``:ref:`my-figure``` would insert a reference
+ to the figure with link text "Figure caption".
+
+ The same works for tables that are given an explicit caption using the
+ :dudir:`table` directive.
+
+ * Labels that aren't placed before a section title can still be referenced,
+ but you must give the link an explicit title, using this syntax:
+ ``:ref:`Link title <label-name>```.
+
+ .. note::
+
+ Reference labels must start with an underscore. When referencing a label,
+ the underscore must be omitted (see examples above).
+
+ Using :rst:role:`ref` is advised over standard reStructuredText links to
+ sections (like ```Section title`_``) because it works across files, when
+ section headings are changed, will raise warnings if incorrect, and works
+ for all builders that support cross-references.
+
+
+Cross-referencing documents
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 0.6
+
+There is also a way to directly link to documents:
+
+.. rst:role:: doc
+
+ Link to the specified document; the document name can be specified in
+ absolute or relative fashion. For example, if the reference
+ ``:doc:`parrot``` occurs in the document ``sketches/index``, then the link
+ refers to ``sketches/parrot``. If the reference is ``:doc:`/people``` or
+ ``:doc:`../people```, the link refers to ``people``.
+
+ If no explicit link text is given (like usual: ``:doc:`Monty Python members
+ </people>```), the link caption will be the title of the given document.
+
+
+Referencing downloadable files
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 0.6
+
+.. rst:role:: download
+
+ This role lets you link to files within your source tree that are not reST
+ documents that can be viewed, but files that can be downloaded.
+
+ When you use this role, the referenced file is automatically marked for
+ inclusion in the output when building (obviously, for HTML output only).
+ All downloadable files are put into a ``_downloads/<unique hash>/``
+ subdirectory of the output directory; duplicate filenames are handled.
+
+ An example::
+
+ See :download:`this example script <../example.py>`.
+
+ The given filename is usually relative to the directory the current source
+ file is contained in, but if it absolute (starting with ``/``), it is taken
+ as relative to the top source directory.
+
+ The ``example.py`` file will be copied to the output directory, and a
+ suitable link generated to it.
+
+ Not to show unavailable download links, you should wrap whole paragraphs that
+ have this role::
+
+ .. only:: builder_html
+
+ See :download:`this example script <../example.py>`.
+
+Cross-referencing figures by figure number
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. versionadded:: 1.3
+
+.. versionchanged:: 1.5
+ `numref` role can also refer sections.
+ And `numref` allows `{name}` for the link text.
+
+.. rst:role:: numref
+
+ Link to the specified figures, tables, code-blocks and sections; the standard
+ reST labels are used. When you use this role, it will insert a reference to
+ the figure with link text by its figure number like "Fig. 1.1".
+
+ If an explicit link text is given (as usual: ``:numref:`Image of Sphinx (Fig.
+ %s) <my-figure>```), the link caption will serve as title of the reference.
+ As placeholders, `%s` and `{number}` get replaced by the figure
+ number and `{name}` by the figure caption.
+ If no explicit link text is given, the :confval:`numfig_format` setting is
+ used as fall-back default.
+
+ If :confval:`numfig` is ``False``, figures are not numbered,
+ so this role inserts not a reference but the label or the link text.
+
+Cross-referencing other items of interest
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The following roles do possibly create a cross-reference, but do not refer to
+objects:
+
+.. rst:role:: envvar
+
+ An environment variable. Index entries are generated. Also generates a link
+ to the matching :rst:dir:`envvar` directive, if it exists.
+
+.. rst:role:: token
+
+ The name of a grammar token (used to create links between
+ :rst:dir:`productionlist` directives).
+
+.. rst:role:: keyword
+
+ The name of a keyword in Python. This creates a link to a reference label
+ with that name, if it exists.
+
+.. rst:role:: option
+
+ A command-line option to an executable program. This generates a link to
+ a :rst:dir:`option` directive, if it exists.
+
+
+The following role creates a cross-reference to a term in a
+:ref:`glossary <glossary-directive>`:
+
+.. rst:role:: term
+
+ Reference to a term in a glossary. A glossary is created using the
+ ``glossary`` directive containing a definition list with terms and
+ definitions. It does not have to be in the same file as the ``term`` markup,
+ for example the Python docs have one global glossary in the ``glossary.rst``
+ file.
+
+ If you use a term that's not explained in a glossary, you'll get a warning
+ during build.
+
+Inline code highlighting
+------------------------
+
+.. rst:role:: code
+
+ An *inline* code example. When used directly, this role just displays the
+ text *without* syntax highlighting, as a literal.
+
+ .. code-block:: rst
+
+ By default, inline code such as :code:`1 + 2` just displays without
+ highlighting.
+
+ Displays: By default, inline code such as :code:`1 + 2` just displays without
+ highlighting.
+
+ Unlike the :rst:dir:`code-block` directive, this role does not respect the
+ default language set by the :rst:dir:`highlight` directive.
+
+ To enable syntax highlighting, you must first use the Docutils :dudir:`role`
+ directive to define a custom role associated with a specific language:
+
+ .. code-block:: rst
+
+ .. role:: python(code)
+ :language: python
+
+ In Python, :python:`1 + 2` is equal to :python:`3`.
+
+ To display a multi-line code example, use the :rst:dir:`code-block` directive
+ instead.
+
+Math
+----
+
+.. rst:role:: math
+
+ Role for inline math. Use like this::
+
+ Since Pythagoras, we know that :math:`a^2 + b^2 = c^2`.
+
+ Displays: Since Pythagoras, we know that :math:`a^2 + b^2 = c^2`.
+
+.. rst:role:: eq
+
+ Same as :rst:role:`math:numref`.
+
+
+Other semantic markup
+---------------------
+
+The following roles don't do anything special except formatting the text in a
+different style:
+
+.. rst:role:: abbr
+
+ An abbreviation. If the role content contains a parenthesized explanation,
+ it will be treated specially: it will be shown in a tool-tip in HTML, and
+ output only once in LaTeX.
+
+ For example: ``:abbr:`LIFO (last-in, first-out)``` displays
+ :abbr:`LIFO (last-in, first-out)`.
+
+ .. versionadded:: 0.6
+
+.. rst:role:: command
+
+ The name of an OS-level command, such as ``rm``.
+
+ For example: :command:`rm`
+
+.. rst:role:: dfn
+
+ Mark the defining instance of a term in the text. (No index entries are
+ generated.)
+
+ For example: :dfn:`binary mode`
+
+.. rst:role:: file
+
+ The name of a file or directory. Within the contents, you can use curly
+ braces to indicate a "variable" part, for example::
+
+ ... is installed in :file:`/usr/lib/python3.{x}/site-packages` ...
+
+ Displays: ... is installed in :file:`/usr/lib/python3.{x}/site-packages` ...
+
+ In the built documentation, the ``x`` will be displayed differently to
+ indicate that it is to be replaced by the Python minor version.
+
+.. rst:role:: guilabel
+
+ Labels presented as part of an interactive user interface should be marked
+ using ``guilabel``. This includes labels from text-based interfaces such as
+ those created using :mod:`curses` or other text-based libraries. Any label
+ used in the interface should be marked with this role, including button
+ labels, window titles, field names, menu and menu selection names, and even
+ values in selection lists.
+
+ .. versionchanged:: 1.0
+ An accelerator key for the GUI label can be included using an ampersand;
+ this will be stripped and displayed underlined in the output (for example:
+ ``:guilabel:`&Cancel``` displays :guilabel:`&Cancel`). To include a literal
+ ampersand, double it.
+
+.. rst:role:: kbd
+
+ Mark a sequence of keystrokes. What form the key sequence takes may depend
+ on platform- or application-specific conventions. When there are no
+ relevant conventions, the names of modifier keys should be spelled out, to
+ improve accessibility for new users and non-native speakers. For example,
+ an *xemacs* key sequence may be marked like ``:kbd:`C-x C-f```, but without
+ reference to a specific application or platform, the same sequence should be
+ marked as ``:kbd:`Control-x Control-f```, displaying :kbd:`C-x C-f` and
+ :kbd:`Control-x Control-f` respectively.
+
+.. rst:role:: mailheader
+
+ The name of an RFC 822-style mail header. This markup does not imply that
+ the header is being used in an email message, but can be used to refer to
+ any header of the same "style." This is also used for headers defined by
+ the various MIME specifications. The header name should be entered in the
+ same way it would normally be found in practice, with the camel-casing
+ conventions being preferred where there is more than one common usage. For
+ example: ``:mailheader:`Content-Type``` displays :mailheader:`Content-Type`.
+
+.. rst:role:: makevar
+
+ The name of a :command:`make` variable.
+
+ For example: :makevar:`help`
+
+.. rst:role:: manpage
+
+ A reference to a Unix manual page including the section, e.g.
+ ``:manpage:`ls(1)``` displays :manpage:`ls(1)`. Creates a hyperlink to an
+ external site rendering the manpage if :confval:`manpages_url` is defined.
+
+.. rst:role:: menuselection
+
+ Menu selections should be marked using the ``menuselection`` role. This is
+ used to mark a complete sequence of menu selections, including selecting
+ submenus and choosing a specific operation, or any subsequence of such a
+ sequence. The names of individual selections should be separated by
+ ``-->``.
+
+ For example, to mark the selection "Start > Programs", use this markup::
+
+ :menuselection:`Start --> Programs`
+
+ Displays: :menuselection:`Start --> Programs`
+
+ When including a selection that includes some trailing indicator, such as
+ the ellipsis some operating systems use to indicate that the command opens a
+ dialog, the indicator should be omitted from the selection name.
+
+ ``menuselection`` also supports ampersand accelerators just like
+ :rst:role:`guilabel`.
+
+.. rst:role:: mimetype
+
+ The name of a MIME type, or a component of a MIME type (the major or minor
+ portion, taken alone).
+
+ For example: :mimetype:`text/plain`
+
+.. rst:role:: newsgroup
+
+ The name of a Usenet newsgroup.
+
+ For example: :newsgroup:`comp.lang.python`
+
+.. todo:: Is this not part of the standard domain?
+
+.. rst:role:: program
+
+ The name of an executable program. This may differ from the file name for
+ the executable for some platforms. In particular, the ``.exe`` (or other)
+ extension should be omitted for Windows programs.
+
+ For example: :program:`curl`
+
+.. rst:role:: regexp
+
+ A regular expression. Quotes should not be included.
+
+ For example: :regexp:`([abc])+`
+
+.. rst:role:: samp
+
+ A piece of literal text, such as code. Within the contents, you can use
+ curly braces to indicate a "variable" part, as in :rst:role:`file`. For
+ example, in ``:samp:`print 1+{variable}```, the part ``variable`` would be
+ emphasized: :samp:`print 1+{variable}`
+
+ If you don't need the "variable part" indication, use the standard
+ :rst:role:`code` role instead.
+
+ .. versionchanged:: 1.8
+ Allowed to escape curly braces with backslash
+
+There is also an :rst:role:`index` role to generate index entries.
+
+The following roles generate external links:
+
+.. rst:role:: pep
+
+ A reference to a Python Enhancement Proposal. This generates appropriate
+ index entries. The text "PEP *number*\ " is generated; in the HTML output,
+ this text is a hyperlink to an online copy of the specified PEP. You can
+ link to a specific section by saying ``:pep:`number#anchor```.
+
+ For example: :pep:`8`
+
+.. rst:role:: rfc
+
+ A reference to an Internet Request for Comments. This generates appropriate
+ index entries. The text "RFC *number*\ " is generated; in the HTML output,
+ this text is a hyperlink to an online copy of the specified RFC. You can
+ link to a specific section by saying ``:rfc:`number#anchor```.
+
+ For example: :rfc:`2324`
+
+Note that there are no special roles for including hyperlinks as you can use
+the standard reST markup for that purpose.
+
+
+.. _default-substitutions:
+
+Substitutions
+-------------
+
+The documentation system provides three substitutions that are defined by
+default. They are set in the build configuration file.
+
+.. describe:: |release|
+
+ Replaced by the project release the documentation refers to. This is meant
+ to be the full version string including alpha/beta/release candidate tags,
+ e.g. ``2.5.2b3``. Set by :confval:`release`.
+
+.. describe:: |version|
+
+ Replaced by the project version the documentation refers to. This is meant to
+ consist only of the major and minor version parts, e.g. ``2.5``, even for
+ version 2.5.1. Set by :confval:`version`.
+
+.. describe:: |today|
+
+ Replaced by either today's date (the date on which the document is read), or
+ the date set in the build configuration file. Normally has the format
+ ``April 14, 2007``. Set by :confval:`today_fmt` and :confval:`today`.
+
+.. describe:: |translation progress|
+
+ Replaced by the translation progress of the document.
+ This substitution is intented for use by document translators
+ as a marker for the translation progress of the document.
diff --git a/doc/usage/theming.rst b/doc/usage/theming.rst
new file mode 100644
index 0000000..c33c7d4
--- /dev/null
+++ b/doc/usage/theming.rst
@@ -0,0 +1,364 @@
+.. highlight:: python
+
+.. _html-themes:
+
+HTML Theming
+============
+
+Sphinx provides a number of builders for HTML and HTML-based formats.
+
+Builders
+--------
+
+.. todo:: Populate when the 'builders' document is split up.
+
+
+Themes
+------
+
+.. versionadded:: 0.6
+
+.. note::
+
+ This section provides information about using pre-existing HTML themes. If
+ you wish to create your own theme, refer to
+ :doc:`/development/theming`.
+
+Sphinx supports changing the appearance of its HTML output via *themes*. A
+theme is a collection of HTML templates, stylesheet(s) and other static files.
+Additionally, it has a configuration file which specifies from which theme to
+inherit, which highlighting style to use, and what options exist for customizing
+the theme's look and feel.
+
+Themes are meant to be project-unaware, so they can be used for different
+projects without change.
+
+Using a theme
+~~~~~~~~~~~~~
+
+Using a :ref:`theme provided with Sphinx <builtin-themes>` is easy. Since these
+do not need to be installed, you only need to set the :confval:`html_theme`
+config value. For example, to enable the ``classic`` theme, add the following
+to :file:`conf.py`::
+
+ html_theme = "classic"
+
+You can also set theme-specific options using the :confval:`html_theme_options`
+config value. These options are generally used to change the look and feel of
+the theme. For example, to place the sidebar on the right side and a black
+background for the relation bar (the bar with the navigation links at the
+page's top and bottom), add the following :file:`conf.py`::
+
+ html_theme_options = {
+ "rightsidebar": "true",
+ "relbarbgcolor": "black"
+ }
+
+If the theme does not come with Sphinx, it can be in two static forms or as a
+Python package. For the static forms, either a directory (containing
+:file:`theme.conf` and other needed files), or a zip file with the same
+contents is supported. The directory or zipfile must be put where Sphinx can
+find it; for this there is the config value :confval:`html_theme_path`. This
+can be a list of directories, relative to the directory containing
+:file:`conf.py`, that can contain theme directories or zip files. For example,
+if you have a theme in the file :file:`blue.zip`, you can put it right in the
+directory containing :file:`conf.py` and use this configuration::
+
+ html_theme = "blue"
+ html_theme_path = ["."]
+
+The third form is a Python package. If a theme you want to use is distributed
+as a Python package, you can use it after installing
+
+.. code-block:: console
+
+ # installing theme package
+ $ pip install sphinxjp.themes.dotted
+
+Once installed, this can be used in the same manner as a directory or
+zipfile-based theme::
+
+ html_theme = "dotted"
+
+For more information on the design of themes, including information about
+writing your own themes, refer to :doc:`/development/theming`.
+
+.. _builtin-themes:
+
+Builtin themes
+~~~~~~~~~~~~~~
+
+.. cssclass:: longtable, standard
+
++--------------------+--------------------+
+| **Theme overview** | |
++--------------------+--------------------+
+| |alabaster| | |classic| |
+| | |
+| *alabaster* | *classic* |
++--------------------+--------------------+
+| |sphinxdoc| | |scrolls| |
+| | |
+| *sphinxdoc* | *scrolls* |
++--------------------+--------------------+
+| |agogo| | |traditional| |
+| | |
+| *agogo* | *traditional* |
++--------------------+--------------------+
+| |nature| | |haiku| |
+| | |
+| *nature* | *haiku* |
++--------------------+--------------------+
+| |pyramid| | |bizstyle| |
+| | |
+| *pyramid* | *bizstyle* |
++--------------------+--------------------+
+
+.. |alabaster| image:: /_static/themes/alabaster.png
+.. |classic| image:: /_static/themes/classic.png
+.. |sphinxdoc| image:: /_static/themes/sphinxdoc.png
+.. |scrolls| image:: /_static/themes/scrolls.png
+.. |agogo| image:: /_static/themes/agogo.png
+.. |traditional| image:: /_static/themes/traditional.png
+.. |nature| image:: /_static/themes/nature.png
+.. |haiku| image:: /_static/themes/haiku.png
+.. |pyramid| image:: /_static/themes/pyramid.png
+.. |bizstyle| image:: /_static/themes/bizstyle.png
+
+Sphinx comes with a selection of themes to choose from.
+
+Note that from these themes only the Alabaster and Scrolls themes are
+mobile-optimated, the other themes resort to horizontal scrolling
+if the screen is too narrow.
+
+.. cssclass:: clear
+
+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 are
+ these options (which are inherited by the other themes):
+
+ - **nosidebar** (true or false): Don't include the sidebar. Defaults to
+ ``False``.
+
+ - **sidebarwidth** (int or str): Width of the sidebar in pixels.
+ This can be an int, which is interpreted as pixels or a valid CSS
+ dimension string such as '70em' or '50%'. Defaults to 230 pixels.
+
+ - **body_min_width** (int or str): Minimal width of the document body.
+ This can be an int, which is interpreted as pixels or a valid CSS
+ dimension string such as '70em' or '50%'. Use 0 if you don't want
+ a width limit. Defaults may depend on the theme (often 450px).
+
+ - **body_max_width** (int or str): Maximal width of the document body.
+ This can be an int, which is interpreted as pixels or a valid CSS
+ dimension string such as '70em' or '50%'. Use 'none' if you don't
+ want a width limit. Defaults may depend on the theme (often 800px).
+
+ - **navigation_with_keys** (true or false): Allow navigating
+ with the following keyboard shortcuts:
+
+ - :kbd:`Left arrow`: previous page
+ - :kbd:`Right arrow`: next page
+
+ Defaults to ``False``.
+
+ - **enable_search_shortcuts** (true or false): Allow jumping to the search box
+ with :kbd:`/` and allow removal of search highlighting with :kbd:`Esc`.
+
+ Defaults to ``True``.
+
+ - **globaltoc_collapse** (true or false): Only expand subsections
+ of the current document in ``globaltoc.html``
+ (see :confval:`html_sidebars`).
+ Defaults to ``True``.
+
+ .. versionadded:: 3.1
+
+ - **globaltoc_includehidden** (true or false): Show even those
+ subsections in ``globaltoc.html`` (see :confval:`html_sidebars`)
+ which have been included with the ``:hidden:`` flag of the
+ :rst:dir:`toctree` directive.
+ Defaults to ``False``.
+
+ .. versionadded:: 3.1
+
+ - **globaltoc_maxdepth** (int): The maximum depth of the toctree in
+ ``globaltoc.html`` (see :confval:`html_sidebars`). Set it to -1 to allow
+ unlimited depth. Defaults to the max depth selected in the toctree directive.
+
+ .. versionadded:: 3.2
+
+**alabaster**
+ `Alabaster theme`_ is a modified "Kr" Sphinx theme from @kennethreitz
+ (especially as used in his Requests project), which was itself originally
+ based on @mitsuhiko's theme used for Flask & related projects. Refer to its
+ `installation page`_ for information on how to configure
+ :confval:`html_sidebars` for its use.
+
+ .. _Alabaster theme: https://pypi.org/project/alabaster/
+ .. _installation page: https://alabaster.readthedocs.io/en/latest/installation.html
+
+**classic**
+ This is the classic theme, which looks like `the Python 2
+ documentation <https://docs.python.org/2/>`_. It can be customized via
+ these options:
+
+ - **rightsidebar** (true or false): Put the sidebar on the right side.
+ Defaults to ``False``.
+
+ - **stickysidebar** (true or false): Make the sidebar "fixed" so that it
+ doesn't scroll out of view for long body content. This may not work well
+ with all browsers. Defaults to ``False``.
+
+ - **collapsiblesidebar** (true or false): Add an *experimental* JavaScript
+ snippet that makes the sidebar collapsible via a button on its side.
+ Defaults to ``False``.
+
+ - **externalrefs** (true or false): Display external links differently from
+ internal links. Defaults to ``False``.
+
+ There are also various color and font options that can change the color scheme
+ without having to write a custom stylesheet:
+
+ - **footerbgcolor** (CSS color): Background color for the footer line.
+ - **footertextcolor** (CSS color): Text color for the footer line.
+ - **sidebarbgcolor** (CSS color): Background color for the sidebar.
+ - **sidebarbtncolor** (CSS color): Background color for the sidebar collapse
+ button (used when *collapsiblesidebar* is ``True``).
+ - **sidebartextcolor** (CSS color): Text color for the sidebar.
+ - **sidebarlinkcolor** (CSS color): Link color for the sidebar.
+ - **relbarbgcolor** (CSS color): Background color for the relation bar.
+ - **relbartextcolor** (CSS color): Text color for the relation bar.
+ - **relbarlinkcolor** (CSS color): Link color for the relation bar.
+ - **bgcolor** (CSS color): Body background color.
+ - **textcolor** (CSS color): Body text color.
+ - **linkcolor** (CSS color): Body link color.
+ - **visitedlinkcolor** (CSS color): Body color for visited links.
+ - **headbgcolor** (CSS color): Background color for headings.
+ - **headtextcolor** (CSS color): Text color for headings.
+ - **headlinkcolor** (CSS color): Link color for headings.
+ - **codebgcolor** (CSS color): Background color for code blocks.
+ - **codetextcolor** (CSS color): Default text color for code blocks, if not
+ set differently by the highlighting style.
+
+ - **bodyfont** (CSS font-family): Font for normal text.
+ - **headfont** (CSS font-family): Font for headings.
+
+**sphinxdoc**
+ The theme originally used by this documentation. It features
+ a sidebar on the right side. There are currently no options beyond
+ *nosidebar* and *sidebarwidth*.
+
+ .. note::
+
+ The Sphinx documentation now uses
+ `an adjusted version of the sphinxdoc theme
+ <https://github.com/sphinx-doc/sphinx/tree/master/doc/_themes/sphinx13>`_.
+
+**scrolls**
+ A more lightweight theme, based on `the Jinja documentation
+ <https://jinja.palletsprojects.com/>`_. The following color options are
+ available:
+
+ - **headerbordercolor**
+ - **subheadlinecolor**
+ - **linkcolor**
+ - **visitedlinkcolor**
+ - **admonitioncolor**
+
+**agogo**
+ A theme created by Andi Albrecht. The following options are supported:
+
+ - **bodyfont** (CSS font family): Font for normal text.
+ - **headerfont** (CSS font family): Font for headings.
+ - **pagewidth** (CSS length): Width of the page content, default 70em.
+ - **documentwidth** (CSS length): Width of the document (without sidebar),
+ default 50em.
+ - **sidebarwidth** (CSS length): Width of the sidebar, default 20em.
+ - **rightsidebar** (true or false): Put the sidebar on the right side.
+ Defaults to ``True``.
+ - **bgcolor** (CSS color): Background color.
+ - **headerbg** (CSS value for "background"): background for the header area,
+ default a grayish gradient.
+ - **footerbg** (CSS value for "background"): background for the footer area,
+ default a light gray gradient.
+ - **linkcolor** (CSS color): Body link color.
+ - **headercolor1**, **headercolor2** (CSS color): colors for <h1> and <h2>
+ headings.
+ - **headerlinkcolor** (CSS color): Color for the backreference link in
+ headings.
+ - **textalign** (CSS *text-align* value): Text alignment for the body, default
+ is ``justify``.
+
+**nature**
+ A greenish theme. There are currently no options beyond
+ *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
+ <https://www.haiku-os.org/docs/userguide/en/contents.html>`_. The following
+ options are supported:
+
+ - **full_logo** (true or false, default ``False``): If this is true, the
+ header will only show the :confval:`html_logo`. Use this for large logos.
+ If this is false, the logo (if present) will be shown floating right, and
+ the documentation title will be put in the header.
+
+ - **textcolor**, **headingcolor**, **linkcolor**, **visitedlinkcolor**,
+ **hoverlinkcolor** (CSS colors): Colors for various body elements.
+
+**traditional**
+ A theme resembling the old Python documentation. There are
+ currently no options beyond *nosidebar* and *sidebarwidth*.
+
+**epub**
+ A theme for the epub builder. This theme tries to save visual
+ space which is a sparse resource on ebook readers. The following options
+ are supported:
+
+ - **relbar1** (true or false, default ``True``): If this is true, the
+ `relbar1` block is inserted in the epub output, otherwise it is omitted.
+
+ - **footer** (true or false, default ``True``): If this is true, the
+ `footer` block is inserted in the epub output, otherwise it is omitted.
+
+**bizstyle**
+ A simple bluish theme. The following options are supported
+ beyond *nosidebar* and *sidebarwidth*:
+
+ - **rightsidebar** (true or false): Put the sidebar on the right side.
+ Defaults to ``False``.
+
+.. versionadded:: 1.3
+ 'alabaster', 'sphinx_rtd_theme' and 'bizstyle' theme.
+
+.. versionchanged:: 1.3
+ The 'default' theme has been renamed to 'classic'. 'default' is still
+ available, however it will emit a notice that it is an alias for the new
+ 'alabaster' theme.
+
+.. _third-party-themes:
+
+Third Party Themes
+~~~~~~~~~~~~~~~~~~
+
+There are many third-party themes created for Sphinx. Some of these are for
+general use, while others are specific to an individual project.
+
+sphinx-themes.org__ is a gallery that showcases various themes for Sphinx,
+with demo documentation rendered under each theme. Themes can also be found
+on PyPI__ (using the classifier ``Framework :: Sphinx :: Theme``), GitHub__
+and GitLab__.
+
+.. __: https://sphinx-themes.org/
+.. __: https://pypi.org/search/?q=&o=&c=Framework+%3A%3A+Sphinx+%3A%3A+Theme
+.. __: https://github.com/search?utf8=%E2%9C%93&q=sphinx+theme
+.. __: https://gitlab.com/explore?name=sphinx+theme
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..0a9bc9e
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,463 @@
+[build-system]
+requires = ["flit_core>=3.7"]
+build-backend = "flit_core.buildapi"
+
+# project metadata
+[project]
+name = "Sphinx"
+description = "Python documentation generator"
+readme = "README.rst"
+urls.Changelog = "https://www.sphinx-doc.org/en/master/changes.html"
+urls.Code = "https://github.com/sphinx-doc/sphinx"
+urls.Download = "https://pypi.org/project/Sphinx/"
+urls.Homepage = "https://www.sphinx-doc.org/"
+urls."Issue tracker" = "https://github.com/sphinx-doc/sphinx/issues"
+license.text = "BSD-2-Clause"
+requires-python = ">=3.9"
+
+# Classifiers list: https://pypi.org/classifiers/
+classifiers = [
+ "Development Status :: 5 - Production/Stable",
+ "Environment :: Console",
+ "Environment :: Web Environment",
+ "Intended Audience :: Developers",
+ "Intended Audience :: Education",
+ "Intended Audience :: End Users/Desktop",
+ "Intended Audience :: Science/Research",
+ "Intended Audience :: System Administrators",
+ "License :: OSI Approved :: BSD License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3 :: Only",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Framework :: Sphinx",
+ "Framework :: Sphinx :: Extension",
+ "Framework :: Sphinx :: Theme",
+ "Topic :: Documentation",
+ "Topic :: Documentation :: Sphinx",
+ "Topic :: Internet :: WWW/HTTP :: Site Management",
+ "Topic :: Printing",
+ "Topic :: Software Development",
+ "Topic :: Software Development :: Documentation",
+ "Topic :: Text Processing",
+ "Topic :: Text Processing :: General",
+ "Topic :: Text Processing :: Indexing",
+ "Topic :: Text Processing :: Markup",
+ "Topic :: Text Processing :: Markup :: HTML",
+ "Topic :: Text Processing :: Markup :: LaTeX",
+ "Topic :: Utilities",
+]
+dependencies = [
+ "sphinxcontrib-applehelp",
+ "sphinxcontrib-devhelp",
+ "sphinxcontrib-jsmath",
+ "sphinxcontrib-htmlhelp>=2.0.0",
+ "sphinxcontrib-serializinghtml>=1.1.9",
+ "sphinxcontrib-qthelp",
+ "Jinja2>=3.0",
+ "Pygments>=2.14",
+ "docutils>=0.18.1,<0.21",
+ "snowballstemmer>=2.0",
+ "babel>=2.9",
+ "alabaster>=0.7,<0.8",
+ "imagesize>=1.3",
+ "requests>=2.25.0",
+ "packaging>=21.0",
+ "importlib-metadata>=4.8; python_version < '3.10'",
+ "colorama>=0.4.5; sys_platform == 'win32'",
+]
+dynamic = ["version"]
+
+[project.optional-dependencies]
+docs = [
+ "sphinxcontrib-websupport",
+]
+lint = [
+ "flake8>=3.5.0",
+ "flake8-simplify",
+ "isort",
+ "ruff",
+ "mypy>=0.990",
+ "sphinx-lint",
+ "docutils-stubs",
+ "types-requests",
+]
+test = [
+ "pytest>=4.6",
+ "html5lib",
+ "cython>=3.0",
+ "setuptools>=67.0", # for Cython compilation
+ "filelock",
+]
+
+[[project.authors]]
+name = "Georg Brandl"
+email = "georg@python.org"
+
+[project.scripts]
+sphinx-build = "sphinx.cmd.build:main"
+sphinx-quickstart = "sphinx.cmd.quickstart:main"
+sphinx-apidoc = "sphinx.ext.apidoc:main"
+sphinx-autogen = "sphinx.ext.autosummary.generate:main"
+
+[tool.flit.module]
+name = "sphinx"
+
+[tool.flit.sdist]
+include = [
+ "LICENSE",
+ "AUTHORS",
+ "CHANGES",
+ # Documentation
+ "doc/",
+ "CODE_OF_CONDUCT", # used as an include in the Documentation
+ "EXAMPLES", # used as an include in the Documentation
+ # Tests
+ "tests/",
+ "tox.ini",
+ # Utilities
+ "utils/",
+ "babel.cfg",
+]
+exclude = [
+ "doc/_build",
+]
+
+[tool.isort]
+line_length = 95
+profile = "black"
+remove_redundant_aliases = true
+
+[tool.ruff]
+target-version = "py39" # Pin Ruff to Python 3.9
+line-length = 95
+show-source = true
+exclude = [
+ ".git",
+ ".tox",
+ ".venv",
+ "tests/roots/*",
+ "build/*",
+ "doc/_build/*",
+ "sphinx/search/*",
+ "doc/usage/extensions/example*.py",
+]
+ignore = [
+ # pycodestyle
+ "E251", # unexpected spaces around equals
+ "E721", # do not compare types, use isinstance()
+ "E741", # ambiguous variable name
+ "F821", # undefined name
+ "W291", # trailing whitespace
+ # flake8-builtins
+ "A001", # variable is shadowing a python builtin
+ "A002", # argument is shadowing a python builtin
+ "A003", # class attribute is shadowing a python builtin
+ # flake8-annotations
+ "ANN001", # missing type annotation for function argument
+ "ANN002", # missing type annotation for *args
+ "ANN003", # missing type annotation for **kwargs
+ "ANN101", # missing type annotation for self in method
+ "ANN102", # missing type annotation for cls in classmethod
+ "ANN201", # missing type annotation for public function
+ "ANN202", # missing type annotation for private function
+ "ANN204", # missing type annotation for special method
+ "ANN205", # missing type annotation for static method
+ "ANN206", # missing type annotation for classmethod
+ "ANN401", # dynamically typed expressions (typing.Any) are disallowed
+ # flake8-unused-arguments
+ "ARG001", # unused function argument
+ "ARG002", # unused method argument
+ "ARG003", # unused class method argument
+ "ARG005", # unused lambda argument
+ # flake8-blind-except
+ "BLE001", # do not catch blind exception
+ # mccabe
+ "C901", # ... is too complex
+ # pydocstyle
+ "D",
+ # flake8-django
+ "DJ", # Django is not used in Sphinx
+ # eradicate
+ "ERA001", # found commented-out code
+ # flake8-future-annotations
+ "FA100", # missing from __future__ import annotations
+ "FA102", # missing from __future__ import annotations
+ # flake8-boolean-trap
+ "FBT001", # boolean positional arg in function definition
+ "FBT002", # boolean default value in function definition
+ "FBT003", # boolean positional value in function call
+ # flake8-fixme
+ "FIX001", # line contains FIXME
+ "FIX002", # line contains TODO
+ "FIX003", # line contains XXX
+ "FIX004", # line contains HACK
+ # flynt
+ "FLY002", # Consider f-string instead of string join
+ # flake8-logging-format
+ "G002", # logging statement uses `%`
+ "G003", # logging statement uses `+`
+ # flake8-implicit-str-concat
+ "ISC001", # implicitly concatenated string literals on one line
+ "ISC002", # implicitly concatenated string literals over multiple lines
+ "ISC003", # explicitly concatenated string should be implicitly concatenated
+ # pep8-naming
+ "N",
+ # NumPy-specific rules
+ "NPY", # numpy is not used in Sphinx
+ # pandas-vet
+ "PD", # pandas is not used in Sphinx
+ # Perflint
+ "PERF101", # do not cast an iterable to list before iterating over it
+ "PERF102", # use either dict.keys() or dict.values()
+ "PERF203", # try-except within a loop incurs performance overhead
+ "PERF401", # Use a list comprehension to create a transformed list
+ "PERF402", # Use list or list.copy to create a copy of a list
+ # flake8-pie
+ "PIE790", # unnecessary 'pass' statement
+ # pylint
+ "PLC0205", # Class __slots__ should be a non-string iterable
+ "PLC0208", # Use a sequence type instead of a set when iterating over values
+ "PLC1901", # simplify truthy/falsey string comparisons
+ "PLR0124", # Name compared with itself
+ "PLR1714", # Consider merging multiple comparisons
+ "PLR2004", # avoid magic values
+ "PLR0911", # too many return statements
+ "PLR0912", # too many branches
+ "PLR0913", # too many arguments to function call
+ "PLR0915", # too many statements
+ "PLR5501", # consider using elif to remove an indentation level
+ "PLW0603", # using the global statement to update variables is discouraged
+ "PLW2901", # outer loop variable overwritten by inner assignment
+ # flake8-use-pathlib
+ "PTH",
+ # flake8-pyi
+ "PYI",
+ # flake8-quotes
+ "Q000", # double quotes found but single quotes preferred
+ "Q001", # single quote docstring found but double quotes preferred
+ # flake8-return
+ "RET503", # missing explicit return at the end of function able to return non-None value
+ "RET504", # unnecessary variable assignment before `return` statement
+ "RET505", # unnecessary `else` after `return` statement
+ "RET506", # Unnecessary {branch} after raise statement
+ # Ruff-specific rules
+ "RUF001", # string contains ambiguous unicode character
+ "RUF003", # comment contains ambiguous unicode character
+ "RUF005", # consider unpacking instead of concatenation
+ "RUF012", # mutable class attributes should be annotated with typing.ClassVar
+ "RUF013", # PEP 484 prohibits implicit Optional
+ "RUF015", # prefer next({iterable}) over single element slice
+ "RUF100", # unused noqa directive
+ # flake8-bandit
+ "S101", # assert used
+ "S105", # possible hardcoded password
+ "S110", # try/except/pass detected
+ "S113", # probable use of requests call without timeout
+ "S301", # 'pickle' unsafe when loading untrusted data
+ "S307", # use of possibly insecure function (eval)
+ "S324", # probable use of insecure hash functions
+ "S603", # subprocess call: check for execution of untrusted input
+ "S607", # Starting a process with a partial executable path
+ "S701", # use autoescape=True for Jinja
+ # flake8-simplify
+ "SIM102", # nested 'if' statements
+ "SIM103", # return condition directly
+ "SIM108", # use ternary operator
+ # flake8-self
+ "SLF001", # private member accessed
+ # flake8-todo
+ "TD001", # invalid TODO tag
+ "TD002", # missing author in TODO
+ "TD003", # missing issue link on the line following this TODO
+ "TD004", # missing colon in TODO
+ "TD005", # missing issue description after TODO
+ # tryceratops
+ "TRY",
+ # pyupgrade
+ "UP031", # replace with format specifiers
+ "UP032", # use f-string instead of format call
+]
+external = [ # Whitelist for RUF100 unknown code warnings
+ "E704",
+ "SIM113",
+]
+select = [
+ "ALL", # every check supported by Ruff
+ # nursery rules
+ "E111", # Indentation is not a multiple of {indent_size}
+ "E112", # Expected an indented block
+ "E113", # Unexpected indentation
+ "E114", # Indentation is not a multiple of {indent_size} (comment)
+ "E115", # Expected an indented block (comment)
+ "E116", # Unexpected indentation (comment)
+ "E117", # Over-indented (comment)
+ "E201", # Whitespace after '{symbol}'
+ "E201", # Whitespace after '{symbol}'
+ "E202", # Whitespace before '{symbol}'
+ "E203", # Whitespace before '{punctuation}'
+ "E211", # Whitespace before '{bracket}'
+ "E221", # Multiple spaces before operator
+ "E222", # Multiple spaces after operator
+ "E223", # Tab before operator
+ "E224", # Tab after operator
+ "E225", # Missing whitespace around operator
+ "E226", # Missing whitespace around arithmetic operator
+ "E227", # Missing whitespace around bitwise or shift operator
+ "E228", # Missing whitespace around modulo operator
+ "E231", # Missing whitespace after '{token}'
+ "E241", # Multiple spaces after comma
+ "E242", # Tab after comma
+ "E252", # Missing whitespace around parameter equals
+ "E261", # Insert at least two spaces before an inline comment
+ "E262", # Inline comment should start with `# `
+ "E265", # Block comment should start with `# `
+ "E266", # Too many leading `#` before block comment
+ "E271", # Multiple spaces after keyword
+ "E272", # Multiple spaces before keyword
+ "E273", # Tab after keyword
+ "E274", # Tab before keyword
+ "E275", # Missing whitespace after keyword
+]
+
+[tool.ruff.per-file-ignores]
+"doc/conf.py" = ["INP001"]
+"doc/development/tutorials/examples/*" = ["INP001"]
+# allow print() in the tutorial
+"doc/development/tutorials/examples/recipe.py" = ["T201"]
+
+# from .flake8
+"sphinx/*" = ["E241"]
+
+# whitelist ``print`` for stdout messages
+"sphinx/cmd/build.py" = ["T201"]
+"sphinx/cmd/make_mode.py" = ["T201"]
+"sphinx/cmd/quickstart.py" = ["T201"]
+
+"sphinx/environment/collectors/toctree.py" = ["B026"]
+"sphinx/environment/adapters/toctree.py" = ["B026"]
+
+# whitelist ``print`` for stdout messages
+"sphinx/ext/intersphinx.py" = ["T201"]
+
+# whitelist ``print`` for stdout messages
+"sphinx/testing/fixtures.py" = ["T201"]
+
+# Ruff bug: https://github.com/astral-sh/ruff/issues/6540
+"sphinx/transforms/i18n.py" = ["PGH004"]
+
+"tests/*" = [
+ "E501",
+ "T201" # whitelist ``print`` for tests
+]
+
+# these tests need old ``typing`` generic aliases
+"tests/test_util_typing.py" = ["UP006", "UP035"]
+"tests/typing_test_data.py" = ["UP006", "UP035"]
+
+# whitelist ``print`` for stdout messages
+"utils/*" = ["T201"]
+
+[tool.ruff.flake8-quotes]
+inline-quotes = "single"
+
+[tool.mypy]
+check_untyped_defs = true
+disallow_incomplete_defs = true
+follow_imports = "skip"
+ignore_missing_imports = true
+no_implicit_optional = true
+python_version = "3.9"
+show_column_numbers = true
+show_error_codes = true
+show_error_context = true
+strict_optional = true
+warn_redundant_casts = true
+warn_unused_ignores = true
+disallow_any_generics = true
+
+[[tool.mypy.overrides]]
+module = [
+ "sphinx.domains.c",
+ "sphinx.domains.cpp",
+]
+strict_optional = false
+
+[[tool.mypy.overrides]]
+module = [
+ "sphinx.application",
+ "sphinx.builders._epub_base",
+ "sphinx.builders.html",
+ "sphinx.builders.linkcheck",
+ "sphinx.cmd.quickstart",
+ "sphinx.config",
+ "sphinx.domains",
+ "sphinx.domains.c",
+ "sphinx.domains.cpp",
+ "sphinx.environment.*",
+ "sphinx.events",
+ "sphinx.ext.*",
+ "sphinx.highlighting",
+ "sphinx.jinja2glue",
+ "sphinx.registry",
+ "sphinx.roles",
+ "sphinx.search.*",
+ "sphinx.testing.*",
+ "sphinx.util",
+ "sphinx.util.display",
+ "sphinx.util.docfields",
+ "sphinx.util.docutils",
+ "sphinx.util.fileutil",
+ "sphinx.util.i18n",
+ "sphinx.util.inspect",
+ "sphinx.util.inventory",
+ "sphinx.util.logging",
+ "sphinx.util.nodes",
+ "sphinx.util.parallel",
+ "sphinx.util.template",
+]
+disallow_any_generics = false
+
+[tool.pytest.ini_options]
+minversion = 4.6
+addopts = [
+ "--import-mode=importlib",
+# "--pythonwarnings=error",
+ "--strict-config",
+ "--strict-markers",
+]
+empty_parameter_set_mark = "xfail"
+filterwarnings = [
+ "all",
+ "ignore::DeprecationWarning:docutils.io",
+ "ignore::DeprecationWarning:pyximport.pyximport",
+ "ignore::ImportWarning:importlib._bootstrap",
+]
+markers = [
+ "apidoc",
+]
+testpaths = ["tests"]
+xfail_strict = true
+
+[tool.coverage.run]
+branch = true
+parallel = true
+source = ['sphinx']
+
+[tool.coverage.report]
+exclude_lines = [
+ # Have to re-enable the standard pragma
+ 'pragma: no cover',
+ # Don't complain if tests don't hit defensive assertion code:
+ 'raise NotImplementedError',
+ # Don't complain if non-runnable code isn't run:
+ 'if __name__ == .__main__.:',
+]
+ignore_errors = true
diff --git a/sphinx/__init__.py b/sphinx/__init__.py
new file mode 100644
index 0000000..d4b2178
--- /dev/null
+++ b/sphinx/__init__.py
@@ -0,0 +1,54 @@
+"""The Sphinx documentation toolchain."""
+
+# Keep this file executable as-is in Python 3!
+# (Otherwise getting the version out of it when packaging is impossible.)
+
+import os
+import warnings
+from os import path
+
+from .deprecation import RemovedInNextVersionWarning
+
+# by default, all DeprecationWarning under sphinx package will be emit.
+# Users can avoid this by using environment variable: PYTHONWARNINGS=
+if 'PYTHONWARNINGS' not in os.environ:
+ warnings.filterwarnings('default', category=RemovedInNextVersionWarning)
+# docutils.io using mode='rU' for open
+warnings.filterwarnings('ignore', "'U' mode is deprecated",
+ DeprecationWarning, module='docutils.io')
+warnings.filterwarnings('ignore', 'The frontend.Option class .*',
+ DeprecationWarning, module='docutils.frontend')
+
+__version__ = '7.2.6'
+__display_version__ = __version__ # used for command line version
+
+#: Version info for better programmatic use.
+#:
+#: A tuple of five elements; for Sphinx version 1.2.1 beta 3 this would be
+#: ``(1, 2, 1, 'beta', 3)``. The fourth element can be one of: ``alpha``,
+#: ``beta``, ``rc``, ``final``. ``final`` always has 0 as the last element.
+#:
+#: .. versionadded:: 1.2
+#: Before version 1.2, check the string ``sphinx.__version__``.
+version_info = (7, 2, 6, 'final', 0)
+
+package_dir = path.abspath(path.dirname(__file__))
+
+_in_development = False
+if _in_development:
+ # Only import subprocess if needed
+ import subprocess
+
+ try:
+ if ret := subprocess.run(
+ ['git', 'rev-parse', '--short', 'HEAD'],
+ cwd=package_dir,
+ capture_output=True,
+ encoding='ascii',
+ errors='surrogateescape',
+ ).stdout:
+ __display_version__ += '+/' + ret.strip()
+ del ret
+ finally:
+ del subprocess
+del _in_development
diff --git a/sphinx/__main__.py b/sphinx/__main__.py
new file mode 100644
index 0000000..dd0df10
--- /dev/null
+++ b/sphinx/__main__.py
@@ -0,0 +1,7 @@
+"""The Sphinx documentation toolchain."""
+
+import sys
+
+from sphinx.cmd.build import main
+
+raise SystemExit(main(sys.argv[1:]))
diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py
new file mode 100644
index 0000000..d51d600
--- /dev/null
+++ b/sphinx/addnodes.py
@@ -0,0 +1,605 @@
+"""Document tree nodes that Sphinx defines on top of those in Docutils."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from docutils.nodes import Element
+
+ from sphinx.application import Sphinx
+
+# deprecated name -> (object to return, canonical path or empty string)
+_DEPRECATED_OBJECTS = {
+ 'meta': (nodes.meta, 'docutils.nodes.meta'), # type: ignore[attr-defined]
+ 'docutils_meta': (nodes.meta, 'docutils.nodes.meta'), # type: ignore[attr-defined]
+}
+
+
+def __getattr__(name):
+ if name not in _DEPRECATED_OBJECTS:
+ msg = f'module {__name__!r} has no attribute {name!r}'
+ raise AttributeError(msg)
+
+ from sphinx.deprecation import _deprecation_warning
+
+ deprecated_object, canonical_name = _DEPRECATED_OBJECTS[name]
+ _deprecation_warning(__name__, name, canonical_name, remove=(7, 0))
+ return deprecated_object
+
+
+class document(nodes.document):
+ """The document root element patched by Sphinx.
+
+ This fixes that document.set_id() does not support a node having multiple node Ids.
+ see https://sourceforge.net/p/docutils/patches/167/
+
+ .. important:: This is only for Sphinx internal use. Please don't use this
+ in your extensions. It will be removed without deprecation period.
+ """
+
+ def set_id(self, node: Element, msgnode: Element | None = None,
+ suggested_prefix: str = '') -> str:
+ return super().set_id(node, msgnode, suggested_prefix) # type: ignore[call-arg]
+
+
+class translatable(nodes.Node):
+ """Node which supports translation.
+
+ The translation goes forward with following steps:
+
+ 1. Preserve original translatable messages
+ 2. Apply translated messages from message catalog
+ 3. Extract preserved messages (for gettext builder)
+
+ The translatable nodes MUST preserve original messages.
+ And these messages should not be overridden at applying step.
+ Because they are used at final step; extraction.
+ """
+
+ def preserve_original_messages(self) -> None:
+ """Preserve original translatable messages."""
+ raise NotImplementedError
+
+ def apply_translated_message(self, original_message: str, translated_message: str) -> None:
+ """Apply translated message."""
+ raise NotImplementedError
+
+ def extract_original_messages(self) -> Sequence[str]:
+ """Extract translation messages.
+
+ :returns: list of extracted messages or messages generator
+ """
+ raise NotImplementedError
+
+
+class not_smartquotable:
+ """A node which does not support smart-quotes."""
+ support_smartquotes = False
+
+
+class toctree(nodes.General, nodes.Element, translatable):
+ """Node for inserting a "TOC tree"."""
+
+ def preserve_original_messages(self) -> None:
+ # toctree entries
+ rawentries = self.setdefault('rawentries', [])
+ for title, _docname in self['entries']:
+ if title:
+ rawentries.append(title)
+
+ # :caption: option
+ if self.get('caption'):
+ self['rawcaption'] = self['caption']
+
+ def apply_translated_message(self, original_message: str, translated_message: str) -> None:
+ # toctree entries
+ for i, (title, docname) in enumerate(self['entries']):
+ if title == original_message:
+ self['entries'][i] = (translated_message, docname)
+
+ # :caption: option
+ if self.get('rawcaption') == original_message:
+ self['caption'] = translated_message
+
+ def extract_original_messages(self) -> list[str]:
+ messages: list[str] = []
+
+ # toctree entries
+ messages.extend(self.get('rawentries', []))
+
+ # :caption: option
+ if 'rawcaption' in self:
+ messages.append(self['rawcaption'])
+ return messages
+
+
+#############################################################
+# Domain-specific object descriptions (class, function etc.)
+#############################################################
+
+class _desc_classes_injector(nodes.Element, not_smartquotable):
+ """Helper base class for injecting a fixed list of classes.
+
+ Use as the first base class.
+ """
+
+ classes: list[str] = []
+
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ super().__init__(*args, **kwargs)
+ self['classes'].extend(self.classes)
+
+
+# Top-level nodes
+#################
+
+class desc(nodes.Admonition, nodes.Element):
+ """Node for a list of object signatures and a common description of them.
+
+ Contains one or more :py:class:`desc_signature` nodes
+ and then a single :py:class:`desc_content` node.
+
+ This node always has two classes:
+
+ - The name of the domain it belongs to, e.g., ``py`` or ``cpp``.
+ - The name of the object type in the domain, e.g., ``function``.
+ """
+
+ # TODO: can we introduce a constructor
+ # that forces the specification of the domain and objtyp?
+
+
+class desc_signature(_desc_classes_injector, nodes.Part, nodes.Inline, nodes.TextElement):
+ """Node for a single object signature.
+
+ As default the signature is a single-line signature.
+ Set ``is_multiline = True`` to describe a multi-line signature.
+ In that case all child nodes must be :py:class:`desc_signature_line` nodes.
+
+ This node always has the classes ``sig``, ``sig-object``, and the domain it belongs to.
+ """
+ # Note: the domain name is being added through a post-transform DescSigAddDomainAsClass
+ classes = ['sig', 'sig-object']
+
+ @property
+ def child_text_separator(self):
+ if self.get('is_multiline'):
+ return ' '
+ else:
+ return super().child_text_separator
+
+
+class desc_signature_line(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for a line in a multi-line object signature.
+
+ It should only be used as a child of a :py:class:`desc_signature`
+ with ``is_multiline`` set to ``True``.
+ Set ``add_permalink = True`` for the line that should get the permalink.
+ """
+ sphinx_line_type = ''
+
+
+class desc_content(nodes.General, nodes.Element):
+ """Node for object description content.
+
+ Must be the last child node in a :py:class:`desc` node.
+ """
+
+
+class desc_inline(_desc_classes_injector, nodes.Inline, nodes.TextElement):
+ """Node for a signature fragment in inline text.
+
+ This is for example used for roles like :rst:role:`cpp:expr`.
+
+ This node always has the classes ``sig``, ``sig-inline``,
+ and the name of the domain it belongs to.
+ """
+ classes = ['sig', 'sig-inline']
+
+ def __init__(self, domain: str, *args: Any, **kwargs: Any) -> None:
+ super().__init__(*args, **kwargs, domain=domain)
+ self['classes'].append(domain)
+
+
+# Nodes for high-level structure in signatures
+##############################################
+
+# nodes to use within a desc_signature or desc_signature_line
+
+class desc_name(_desc_classes_injector, nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for the main object name.
+
+ For example, in the declaration of a Python class ``MyModule.MyClass``,
+ the main name is ``MyClass``.
+
+ This node always has the class ``sig-name``.
+ """
+ classes = ['sig-name', 'descname'] # 'descname' is for backwards compatibility
+
+
+class desc_addname(_desc_classes_injector, nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for additional name parts for an object.
+
+ For example, in the declaration of a Python class ``MyModule.MyClass``,
+ the additional name part is ``MyModule.``.
+
+ This node always has the class ``sig-prename``.
+ """
+ # 'descclassname' is for backwards compatibility
+ classes = ['sig-prename', 'descclassname']
+
+
+# compatibility alias
+desc_classname = desc_addname
+
+
+class desc_type(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """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) -> str:
+ return ' -> ' + super().astext()
+
+
+class desc_parameterlist(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for a general parameter list.
+
+ As default the parameter list is written in line with the rest of the signature.
+ Set ``multi_line_parameter_list = True`` to describe a multi-line parameter list.
+ In that case each parameter will then be written on its own, indented line.
+ """
+ child_text_separator = ', '
+
+ def astext(self):
+ return f'({super().astext()})'
+
+
+class desc_type_parameter_list(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for a general type parameter list.
+
+ As default the type parameters list is written in line with the rest of the signature.
+ Set ``multi_line_parameter_list = True`` to describe a multi-line type parameters list.
+ In that case each type parameter will then be written on its own, indented line.
+ """
+ child_text_separator = ', '
+
+ def astext(self):
+ return f'[{super().astext()}]'
+
+
+class desc_parameter(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for a single parameter."""
+
+
+class desc_type_parameter(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for a single type parameter."""
+
+
+class desc_optional(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for marking optional parts of the parameter list."""
+ child_text_separator = ', '
+
+ def astext(self) -> str:
+ return '[' + super().astext() + ']'
+
+
+class desc_annotation(nodes.Part, nodes.Inline, nodes.FixedTextElement):
+ """Node for signature annotations (not Python 3-style annotations)."""
+
+
+# Leaf nodes for markup of text fragments
+#########################################
+
+#: A set of classes inheriting :class:`desc_sig_element`. Each node class
+#: is expected to be handled by the builder's translator class if the latter
+#: does not inherit from SphinxTranslator.
+#:
+#: This set can be extended manually by third-party extensions or
+#: by subclassing :class:`desc_sig_element` and using the class
+#: keyword argument `_sig_element=True`.
+SIG_ELEMENTS: set[type[desc_sig_element]] = set()
+
+
+# Signature text elements, generally translated to node.inline
+# in SigElementFallbackTransform.
+# When adding a new one, add it to SIG_ELEMENTS via the class
+# keyword argument `_sig_element=True` (e.g., see `desc_sig_space`).
+
+class desc_sig_element(nodes.inline, _desc_classes_injector):
+ """Common parent class of nodes for inline text of a signature."""
+ classes: list[str] = []
+
+ def __init__(self, rawsource: str = '', text: str = '',
+ *children: Element, **attributes: Any) -> None:
+ super().__init__(rawsource, text, *children, **attributes)
+ self['classes'].extend(self.classes)
+
+ def __init_subclass__(cls, *, _sig_element=False, **kwargs):
+ super().__init_subclass__(**kwargs)
+ if _sig_element:
+ # add the class to the SIG_ELEMENTS set if asked
+ SIG_ELEMENTS.add(cls)
+
+
+# to not reinvent the wheel, the classes in the following desc_sig classes
+# are based on those used in Pygments
+
+class desc_sig_space(desc_sig_element, _sig_element=True):
+ """Node for a space in a signature."""
+ classes = ["w"]
+
+ def __init__(self, rawsource: str = '', text: str = ' ',
+ *children: Element, **attributes: Any) -> None:
+ super().__init__(rawsource, text, *children, **attributes)
+
+
+class desc_sig_name(desc_sig_element, _sig_element=True):
+ """Node for an identifier in a signature."""
+ classes = ["n"]
+
+
+class desc_sig_operator(desc_sig_element, _sig_element=True):
+ """Node for an operator in a signature."""
+ classes = ["o"]
+
+
+class desc_sig_punctuation(desc_sig_element, _sig_element=True):
+ """Node for punctuation in a signature."""
+ classes = ["p"]
+
+
+class desc_sig_keyword(desc_sig_element, _sig_element=True):
+ """Node for a general keyword in a signature."""
+ classes = ["k"]
+
+
+class desc_sig_keyword_type(desc_sig_element, _sig_element=True):
+ """Node for a keyword which is a built-in type in a signature."""
+ classes = ["kt"]
+
+
+class desc_sig_literal_number(desc_sig_element, _sig_element=True):
+ """Node for a numeric literal in a signature."""
+ classes = ["m"]
+
+
+class desc_sig_literal_string(desc_sig_element, _sig_element=True):
+ """Node for a string literal in a signature."""
+ classes = ["s"]
+
+
+class desc_sig_literal_char(desc_sig_element, _sig_element=True):
+ """Node for a character literal in a signature."""
+ classes = ["sc"]
+
+
+###############################################################
+# 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.FixedTextElement):
+ """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 5-tuples of ``(entrytype, entryname,
+ target, ignored, key)``.
+
+ *entrytype* is one of "single", "pair", "double", "triple".
+
+ *key* is categorization characters (usually a single character) for
+ general index page. For the details of this, please see also:
+ :rst:dir:`glossary` and issue #2320.
+ """
+
+
+class centered(nodes.Part, nodes.TextElement):
+ """This node is 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."""
+
+
+class compact_paragraph(nodes.paragraph):
+ """Node for a compact paragraph (which never makes a <p> node)."""
+
+
+class glossary(nodes.Element):
+ """Node to insert a glossary."""
+
+
+class only(nodes.Element):
+ """Node for "only" directives (conditional inclusion based on tags)."""
+
+
+# meta-information nodes
+
+class start_of_file(nodes.Element):
+ """Node to mark start of a new file, used in the LaTeX builder only."""
+
+
+class highlightlang(nodes.Element):
+ """Inserted to set the highlight language and line number options for
+ subsequent code blocks.
+ """
+
+
+class tabular_col_spec(nodes.Element):
+ """Node for specifying tabular columns, used for LaTeX output."""
+
+
+# inline nodes
+
+class pending_xref(nodes.Inline, nodes.Element):
+ """Node for cross-references that cannot be resolved without complete
+ information about all documents.
+
+ These nodes are resolved before writing output, in
+ BuildEnvironment.resolve_references.
+ """
+ child_text_separator = ''
+
+
+class pending_xref_condition(nodes.Inline, nodes.TextElement):
+ """Node representing a potential way to create a cross-reference and the
+ condition in which this way should be used.
+
+ This node is only allowed to be placed under a :py:class:`pending_xref`
+ node. A **pending_xref** node must contain either no **pending_xref_condition**
+ nodes or it must only contains **pending_xref_condition** nodes.
+
+ The cross-reference resolver will replace a :py:class:`pending_xref` which
+ contains **pending_xref_condition** nodes by the content of exactly one of
+ those **pending_xref_condition** nodes' content. It uses the **condition**
+ attribute to decide which **pending_xref_condition** node's content to
+ use. For example, let us consider how the cross-reference resolver acts on::
+
+ <pending_xref refdomain="py" reftarget="io.StringIO ...>
+ <pending_xref_condition condition="resolved">
+ <literal>
+ StringIO
+ <pending_xref_condition condition="*">
+ <literal>
+ io.StringIO
+
+ If the cross-reference resolver successfully resolves the cross-reference,
+ then it rewrites the **pending_xref** as::
+
+ <reference>
+ <literal>
+ StringIO
+
+ Otherwise, if the cross-reference resolution failed, it rewrites the
+ **pending_xref** as::
+
+ <reference>
+ <literal>
+ io.StringIO
+
+ The **pending_xref_condition** node should have **condition** attribute.
+ Domains can be store their individual conditions into the attribute to
+ filter contents on resolving phase. As a reserved condition name,
+ ``condition="*"`` is used for the fallback of resolution failure.
+ Additionally, as a recommended condition name, ``condition="resolved"``
+ represents a resolution success in the intersphinx module.
+
+ .. versionadded:: 4.0
+ """
+
+
+class number_reference(nodes.reference):
+ """Node for number references, similar to pending_xref."""
+
+
+class download_reference(nodes.reference):
+ """Node for download references, similar to pending_xref."""
+
+
+class literal_emphasis(nodes.emphasis, not_smartquotable):
+ """Node that behaves like `emphasis`, but further text processors are not
+ applied (e.g. smartypants for HTML output).
+ """
+
+
+class literal_strong(nodes.strong, not_smartquotable):
+ """Node that behaves like `strong`, but further text processors are not
+ applied (e.g. smartypants for HTML output).
+ """
+
+
+class manpage(nodes.Inline, nodes.FixedTextElement):
+ """Node for references to manpages."""
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_node(toctree)
+
+ app.add_node(desc)
+ app.add_node(desc_signature)
+ app.add_node(desc_signature_line)
+ app.add_node(desc_content)
+ app.add_node(desc_inline)
+
+ app.add_node(desc_name)
+ app.add_node(desc_addname)
+ app.add_node(desc_type)
+ app.add_node(desc_returns)
+ app.add_node(desc_parameterlist)
+ app.add_node(desc_type_parameter_list)
+ app.add_node(desc_parameter)
+ app.add_node(desc_type_parameter)
+ app.add_node(desc_optional)
+ app.add_node(desc_annotation)
+
+ for n in SIG_ELEMENTS:
+ app.add_node(n)
+
+ app.add_node(versionmodified)
+ app.add_node(seealso)
+ app.add_node(productionlist)
+ app.add_node(production)
+ app.add_node(index)
+ app.add_node(centered)
+ app.add_node(acks)
+ app.add_node(hlist)
+ app.add_node(hlistcol)
+ app.add_node(compact_paragraph)
+ app.add_node(glossary)
+ app.add_node(only)
+ app.add_node(start_of_file)
+ app.add_node(highlightlang)
+ app.add_node(tabular_col_spec)
+ app.add_node(pending_xref)
+ app.add_node(number_reference)
+ app.add_node(download_reference)
+ app.add_node(literal_emphasis)
+ app.add_node(literal_strong)
+ app.add_node(manpage)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/application.py b/sphinx/application.py
new file mode 100644
index 0000000..d5fbaa9
--- /dev/null
+++ b/sphinx/application.py
@@ -0,0 +1,1371 @@
+"""Sphinx application class and extensibility interface.
+
+Gracefully adapted from the TextPress system by Armin.
+"""
+
+from __future__ import annotations
+
+import contextlib
+import os
+import pickle
+import sys
+from collections import deque
+from collections.abc import Sequence # NoQA: TCH003
+from io import StringIO
+from os import path
+from typing import IO, TYPE_CHECKING, Any, Callable
+
+from docutils.nodes import TextElement # NoQA: TCH002
+from docutils.parsers.rst import Directive, roles
+from docutils.transforms import Transform # NoQA: TCH002
+from pygments.lexer import Lexer # NoQA: TCH002
+
+import sphinx
+from sphinx import locale, package_dir
+from sphinx.config import Config
+from sphinx.environment import BuildEnvironment
+from sphinx.errors import ApplicationError, ConfigError, VersionRequirementError
+from sphinx.events import EventManager
+from sphinx.highlighting import lexer_classes
+from sphinx.locale import __
+from sphinx.project import Project
+from sphinx.registry import SphinxComponentRegistry
+from sphinx.util import docutils, logging
+from sphinx.util._pathlib import _StrPath
+from sphinx.util.build_phase import BuildPhase
+from sphinx.util.console import bold # type: ignore[attr-defined]
+from sphinx.util.display import progress_message
+from sphinx.util.i18n import CatalogRepository
+from sphinx.util.logging import prefixed_warnings
+from sphinx.util.osutil import ensuredir, relpath
+from sphinx.util.tags import Tags
+
+if TYPE_CHECKING:
+ from docutils import nodes
+ from docutils.nodes import Element
+ from docutils.parsers import Parser
+
+ from sphinx.builders import Builder
+ from sphinx.domains import Domain, Index
+ from sphinx.environment.collectors import EnvironmentCollector
+ from sphinx.extension import Extension
+ from sphinx.roles import XRefRole
+ from sphinx.theming import Theme
+ from sphinx.util.typing import RoleFunction, TitleGetter
+
+
+builtin_extensions: tuple[str, ...] = (
+ 'sphinx.addnodes',
+ 'sphinx.builders.changes',
+ 'sphinx.builders.epub3',
+ 'sphinx.builders.dirhtml',
+ 'sphinx.builders.dummy',
+ 'sphinx.builders.gettext',
+ 'sphinx.builders.html',
+ 'sphinx.builders.latex',
+ 'sphinx.builders.linkcheck',
+ 'sphinx.builders.manpage',
+ 'sphinx.builders.singlehtml',
+ 'sphinx.builders.texinfo',
+ 'sphinx.builders.text',
+ 'sphinx.builders.xml',
+ 'sphinx.config',
+ 'sphinx.domains.c',
+ 'sphinx.domains.changeset',
+ 'sphinx.domains.citation',
+ 'sphinx.domains.cpp',
+ 'sphinx.domains.index',
+ 'sphinx.domains.javascript',
+ 'sphinx.domains.math',
+ 'sphinx.domains.python',
+ 'sphinx.domains.rst',
+ 'sphinx.domains.std',
+ 'sphinx.directives',
+ 'sphinx.directives.code',
+ 'sphinx.directives.other',
+ 'sphinx.directives.patches',
+ 'sphinx.extension',
+ 'sphinx.parsers',
+ 'sphinx.registry',
+ 'sphinx.roles',
+ 'sphinx.transforms',
+ 'sphinx.transforms.compact_bullet_list',
+ 'sphinx.transforms.i18n',
+ 'sphinx.transforms.references',
+ 'sphinx.transforms.post_transforms',
+ 'sphinx.transforms.post_transforms.code',
+ 'sphinx.transforms.post_transforms.images',
+ 'sphinx.versioning',
+ # collectors should be loaded by specific order
+ 'sphinx.environment.collectors.dependencies',
+ 'sphinx.environment.collectors.asset',
+ 'sphinx.environment.collectors.metadata',
+ 'sphinx.environment.collectors.title',
+ 'sphinx.environment.collectors.toctree',
+)
+_first_party_extensions = (
+ # 1st party extensions
+ 'sphinxcontrib.applehelp',
+ 'sphinxcontrib.devhelp',
+ 'sphinxcontrib.htmlhelp',
+ 'sphinxcontrib.serializinghtml',
+ 'sphinxcontrib.qthelp',
+)
+_first_party_themes = (
+ # Alabaster is loaded automatically to be used as the default theme
+ 'alabaster',
+)
+builtin_extensions += _first_party_themes
+builtin_extensions += _first_party_extensions
+
+ENV_PICKLE_FILENAME = 'environment.pickle'
+
+logger = logging.getLogger(__name__)
+
+
+class Sphinx:
+ """The main application class and extensibility interface.
+
+ :ivar srcdir: Directory containing source.
+ :ivar confdir: Directory containing ``conf.py``.
+ :ivar doctreedir: Directory for storing pickled doctrees.
+ :ivar outdir: Directory for storing build documents.
+ """
+
+ warningiserror: bool
+ _warncount: int
+
+ def __init__(self, srcdir: str | os.PathLike[str], confdir: str | os.PathLike[str] | None,
+ outdir: str | os.PathLike[str], doctreedir: str | os.PathLike[str],
+ buildername: str, confoverrides: dict | None = None,
+ status: IO | None = sys.stdout, warning: IO | None = sys.stderr,
+ freshenv: bool = False, warningiserror: bool = False,
+ tags: list[str] | None = None,
+ verbosity: int = 0, parallel: int = 0, keep_going: bool = False,
+ pdb: bool = False) -> None:
+ self.phase = BuildPhase.INITIALIZATION
+ self.verbosity = verbosity
+ self.extensions: dict[str, Extension] = {}
+ self.registry = SphinxComponentRegistry()
+
+ # validate provided directories
+ self.srcdir = _StrPath(srcdir).resolve()
+ self.outdir = _StrPath(outdir).resolve()
+ self.doctreedir = _StrPath(doctreedir).resolve()
+
+ if not path.isdir(self.srcdir):
+ raise ApplicationError(__('Cannot find source directory (%s)') %
+ self.srcdir)
+
+ if path.exists(self.outdir) and not path.isdir(self.outdir):
+ raise ApplicationError(__('Output directory (%s) is not a directory') %
+ self.outdir)
+
+ if self.srcdir == self.outdir:
+ raise ApplicationError(__('Source directory and destination '
+ 'directory cannot be identical'))
+
+ self.parallel = parallel
+
+ if status is None:
+ self._status: IO = StringIO()
+ self.quiet: bool = True
+ else:
+ self._status = status
+ self.quiet = False
+
+ if warning is None:
+ self._warning: IO = StringIO()
+ else:
+ self._warning = warning
+ self._warncount = 0
+ self.keep_going = warningiserror and keep_going
+ if self.keep_going:
+ self.warningiserror = False
+ else:
+ self.warningiserror = warningiserror
+ self.pdb = pdb
+ logging.setup(self, self._status, self._warning)
+
+ self.events = EventManager(self)
+
+ # keep last few messages for traceback
+ # This will be filled by sphinx.util.logging.LastMessagesWriter
+ self.messagelog: deque = deque(maxlen=10)
+
+ # say hello to the world
+ logger.info(bold(__('Running Sphinx v%s') % sphinx.__display_version__))
+
+ # status code for command-line application
+ self.statuscode = 0
+
+ # read config
+ self.tags = Tags(tags)
+ if confdir is None:
+ # set confdir to srcdir if -C given (!= no confdir); a few pieces
+ # of code expect a confdir to be set
+ self.confdir = self.srcdir
+ self.config = Config({}, confoverrides or {})
+ else:
+ self.confdir = _StrPath(confdir).resolve()
+ self.config = Config.read(self.confdir, confoverrides or {}, self.tags)
+
+ # initialize some limited config variables before initialize i18n and loading
+ # extensions
+ self.config.pre_init_values()
+
+ # set up translation infrastructure
+ self._init_i18n()
+
+ # check the Sphinx version if requested
+ if self.config.needs_sphinx and self.config.needs_sphinx > sphinx.__display_version__:
+ raise VersionRequirementError(
+ __('This project needs at least Sphinx v%s and therefore cannot '
+ 'be built with this version.') % self.config.needs_sphinx)
+
+ # load all built-in extension modules, first-party extension modules,
+ # and first-party themes
+ for extension in builtin_extensions:
+ self.setup_extension(extension)
+
+ # load all user-given extension modules
+ for extension in self.config.extensions:
+ self.setup_extension(extension)
+
+ # preload builder module (before init config values)
+ self.preload_builder(buildername)
+
+ if not path.isdir(outdir):
+ with progress_message(__('making output directory')):
+ ensuredir(outdir)
+
+ # the config file itself can be an extension
+ if self.config.setup:
+ prefix = __('while setting up extension %s:') % "conf.py"
+ with prefixed_warnings(prefix):
+ if callable(self.config.setup):
+ self.config.setup(self)
+ else:
+ raise ConfigError(
+ __("'setup' as currently defined in conf.py isn't a Python callable. "
+ "Please modify its definition to make it a callable function. "
+ "This is needed for conf.py to behave as a Sphinx extension."),
+ )
+
+ # now that we know all config values, collect them from conf.py
+ self.config.init_values()
+ self.events.emit('config-inited', self.config)
+
+ # create the project
+ self.project = Project(self.srcdir, self.config.source_suffix)
+
+ # set up the build environment
+ self.env = self._init_env(freshenv)
+
+ # create the builder
+ self.builder = self.create_builder(buildername)
+
+ # build environment post-initialisation, after creating the builder
+ self._post_init_env()
+
+ # set up the builder
+ self._init_builder()
+
+ def _init_i18n(self) -> None:
+ """Load translated strings from the configured localedirs if enabled in
+ the configuration.
+ """
+ if self.config.language == 'en':
+ self.translator, _ = locale.init([], None)
+ else:
+ logger.info(bold(__('loading translations [%s]... ') % self.config.language),
+ nonl=True)
+
+ # compile mo files if sphinx.po file in user locale directories are updated
+ repo = CatalogRepository(self.srcdir, self.config.locale_dirs,
+ self.config.language, self.config.source_encoding)
+ for catalog in repo.catalogs:
+ if catalog.domain == 'sphinx' and catalog.is_outdated():
+ catalog.write_mo(self.config.language,
+ self.config.gettext_allow_fuzzy_translations)
+
+ locale_dirs: list[str | None] = list(repo.locale_dirs)
+ locale_dirs += [None]
+ locale_dirs += [path.join(package_dir, 'locale')]
+
+ self.translator, has_translation = locale.init(locale_dirs, self.config.language)
+ if has_translation:
+ logger.info(__('done'))
+ else:
+ logger.info(__('not available for built-in messages'))
+
+ def _init_env(self, freshenv: bool) -> BuildEnvironment:
+ filename = path.join(self.doctreedir, ENV_PICKLE_FILENAME)
+ if freshenv or not os.path.exists(filename):
+ return self._create_fresh_env()
+ else:
+ return self._load_existing_env(filename)
+
+ def _create_fresh_env(self) -> BuildEnvironment:
+ env = BuildEnvironment(self)
+ self._fresh_env_used = True
+ return env
+
+ @progress_message(__('loading pickled environment'))
+ def _load_existing_env(self, filename: str) -> BuildEnvironment:
+ try:
+ with open(filename, 'rb') as f:
+ env = pickle.load(f)
+ env.setup(self)
+ self._fresh_env_used = False
+ except Exception as err:
+ logger.info(__('failed: %s'), err)
+ env = self._create_fresh_env()
+ return env
+
+ def _post_init_env(self) -> None:
+ if self._fresh_env_used:
+ self.env.find_files(self.config, self.builder)
+ del self._fresh_env_used
+
+ def preload_builder(self, name: str) -> None:
+ self.registry.preload_builder(self, name)
+
+ def create_builder(self, name: str) -> Builder:
+ if name is None:
+ logger.info(__('No builder selected, using default: html'))
+ name = 'html'
+
+ return self.registry.create_builder(self, name, self.env)
+
+ def _init_builder(self) -> None:
+ self.builder.init()
+ self.events.emit('builder-inited')
+
+ # ---- main "build" method -------------------------------------------------
+
+ def build(self, force_all: bool = False, filenames: list[str] | None = None) -> None:
+ self.phase = BuildPhase.READING
+ try:
+ if force_all:
+ self.builder.build_all()
+ elif filenames:
+ self.builder.build_specific(filenames)
+ else:
+ self.builder.build_update()
+
+ self.events.emit('build-finished', None)
+ except Exception as err:
+ # delete the saved env to force a fresh build next time
+ envfile = path.join(self.doctreedir, ENV_PICKLE_FILENAME)
+ if path.isfile(envfile):
+ os.unlink(envfile)
+ self.events.emit('build-finished', err)
+ raise
+
+ if self._warncount and self.keep_going:
+ self.statuscode = 1
+
+ status = (__('succeeded') if self.statuscode == 0
+ else __('finished with problems'))
+ if self._warncount:
+ if self.warningiserror:
+ if self._warncount == 1:
+ msg = __('build %s, %s warning (with warnings treated as errors).')
+ else:
+ msg = __('build %s, %s warnings (with warnings treated as errors).')
+ else:
+ if self._warncount == 1:
+ msg = __('build %s, %s warning.')
+ else:
+ msg = __('build %s, %s warnings.')
+
+ logger.info(bold(msg % (status, self._warncount)))
+ else:
+ logger.info(bold(__('build %s.') % status))
+
+ if self.statuscode == 0 and self.builder.epilog:
+ logger.info('')
+ logger.info(self.builder.epilog % {
+ 'outdir': relpath(self.outdir),
+ 'project': self.config.project,
+ })
+
+ self.builder.cleanup()
+
+ # ---- general extensibility interface -------------------------------------
+
+ def setup_extension(self, extname: str) -> None:
+ """Import and setup a Sphinx extension module.
+
+ Load the extension given by the module *name*. Use this if your
+ extension needs the features provided by another extension. No-op if
+ called twice.
+ """
+ logger.debug('[app] setting up extension: %r', extname)
+ self.registry.load_extension(self, extname)
+
+ @staticmethod
+ def require_sphinx(version: tuple[int, int] | str) -> None:
+ """Check the Sphinx version if requested.
+
+ Compare *version* with the version of the running Sphinx, and abort the
+ build when it is too old.
+
+ :param version: The required version in the form of ``major.minor`` or
+ ``(major, minor)``.
+
+ .. versionadded:: 1.0
+ .. versionchanged:: 7.1
+ Type of *version* now allows ``(major, minor)`` form.
+ """
+ if isinstance(version, tuple):
+ major, minor = version
+ else:
+ major, minor = map(int, version.split('.')[:2])
+ if (major, minor) > sphinx.version_info[:2]:
+ req = f'{major}.{minor}'
+ raise VersionRequirementError(req)
+
+ # event interface
+ def connect(self, event: str, callback: Callable, priority: int = 500) -> int:
+ """Register *callback* to be called when *event* is emitted.
+
+ For details on available core events and the arguments of callback
+ functions, please see :ref:`events`.
+
+ :param event: The name of target event
+ :param callback: Callback function for the event
+ :param priority: The priority of the callback. The callbacks will be invoked
+ in order of *priority* (ascending).
+ :return: A listener ID. It can be used for :meth:`disconnect`.
+
+ .. versionchanged:: 3.0
+
+ Support *priority*
+ """
+ listener_id = self.events.connect(event, callback, priority)
+ logger.debug('[app] connecting event %r (%d): %r [id=%s]',
+ event, priority, callback, listener_id)
+ return listener_id
+
+ def disconnect(self, listener_id: int) -> None:
+ """Unregister callback by *listener_id*.
+
+ :param listener_id: A listener_id that :meth:`connect` returns
+ """
+ logger.debug('[app] disconnecting event: [id=%s]', listener_id)
+ self.events.disconnect(listener_id)
+
+ def emit(self, event: str, *args: Any,
+ allowed_exceptions: tuple[type[Exception], ...] = ()) -> list:
+ """Emit *event* and pass *arguments* to the callback functions.
+
+ Return the return values of all callbacks as a list. Do not emit core
+ Sphinx events in extensions!
+
+ :param event: The name of event that will be emitted
+ :param args: The arguments for the event
+ :param allowed_exceptions: The list of exceptions that are allowed in the callbacks
+
+ .. versionchanged:: 3.1
+
+ Added *allowed_exceptions* to specify path-through exceptions
+ """
+ return self.events.emit(event, *args, allowed_exceptions=allowed_exceptions)
+
+ def emit_firstresult(self, event: str, *args: Any,
+ allowed_exceptions: tuple[type[Exception], ...] = ()) -> Any:
+ """Emit *event* and pass *arguments* to the callback functions.
+
+ Return the result of the first callback that doesn't return ``None``.
+
+ :param event: The name of event that will be emitted
+ :param args: The arguments for the event
+ :param allowed_exceptions: The list of exceptions that are allowed in the callbacks
+
+ .. versionadded:: 0.5
+ .. versionchanged:: 3.1
+
+ Added *allowed_exceptions* to specify path-through exceptions
+ """
+ return self.events.emit_firstresult(event, *args,
+ allowed_exceptions=allowed_exceptions)
+
+ # registering addon parts
+
+ def add_builder(self, builder: type[Builder], override: bool = False) -> None:
+ """Register a new builder.
+
+ :param builder: A builder class
+ :param override: If true, install the builder forcedly even if another builder
+ is already installed as the same name
+
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_builder(builder, override=override)
+
+ # TODO(stephenfin): Describe 'types' parameter
+ def add_config_value(self, name: str, default: Any, rebuild: bool | str,
+ types: Any = ()) -> None:
+ """Register a configuration value.
+
+ This is necessary for Sphinx to recognize new values and set default
+ values accordingly.
+
+
+ :param name: The name of the configuration value. It is recommended to be prefixed
+ with the extension name (ex. ``html_logo``, ``epub_title``)
+ :param default: The default value of the configuration.
+ :param rebuild: The condition of rebuild. It must be one of those values:
+
+ * ``'env'`` if a change in the setting only takes effect when a
+ document is parsed -- this means that the whole environment must be
+ rebuilt.
+ * ``'html'`` if a change in the setting needs a full rebuild of HTML
+ documents.
+ * ``''`` if a change in the setting will not need any special rebuild.
+ :param types: The type of configuration value. A list of types can be specified. For
+ example, ``[str]`` is used to describe a configuration that takes string
+ value.
+
+ .. versionchanged:: 0.4
+ If the *default* value is a callable, it will be called with the
+ config object as its argument in order to get the default value.
+ This can be used to implement config values whose default depends on
+ other values.
+
+ .. versionchanged:: 0.6
+ Changed *rebuild* from a simple boolean (equivalent to ``''`` or
+ ``'env'``) to a string. However, booleans are still accepted and
+ converted internally.
+ """
+ logger.debug('[app] adding config value: %r', (name, default, rebuild, types))
+ if rebuild in (False, True):
+ rebuild = 'env' if rebuild else ''
+ self.config.add(name, default, rebuild, types)
+
+ def add_event(self, name: str) -> None:
+ """Register an event called *name*.
+
+ This is needed to be able to emit it.
+
+ :param name: The name of the event
+ """
+ logger.debug('[app] adding event: %r', name)
+ self.events.add(name)
+
+ def set_translator(self, name: str, translator_class: type[nodes.NodeVisitor],
+ override: bool = False) -> None:
+ """Register or override a Docutils translator class.
+
+ This is used to register a custom output translator or to replace a
+ builtin translator. This allows extensions to use a custom translator
+ and define custom nodes for the translator (see :meth:`add_node`).
+
+ :param name: The name of the builder for the translator
+ :param translator_class: A translator class
+ :param override: If true, install the translator forcedly even if another translator
+ is already installed as the same name
+
+ .. versionadded:: 1.3
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_translator(name, translator_class, override=override)
+
+ def add_node(self, node: type[Element], override: bool = False,
+ **kwargs: tuple[Callable, Callable | None]) -> None:
+ """Register a Docutils node class.
+
+ This is necessary for Docutils internals. It may also be used in the
+ future to validate nodes in the parsed documents.
+
+ :param node: A node class
+ :param kwargs: Visitor functions for each builder (see below)
+ :param override: If true, install the node forcedly even if another node is already
+ installed as the same name
+
+ Node visitor functions for the Sphinx HTML, LaTeX, text and manpage
+ writers can be given as keyword arguments: the keyword should be one or
+ more of ``'html'``, ``'latex'``, ``'text'``, ``'man'``, ``'texinfo'``
+ or any other supported translators, 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
+
+ class math(docutils.nodes.Element): pass
+
+ def visit_math_html(self, node):
+ self.body.append(self.starttag(node, 'math'))
+ def depart_math_html(self, node):
+ self.body.append('</math>')
+
+ app.add_node(math, html=(visit_math_html, depart_math_html))
+
+ Obviously, translators for which you don't specify visitor methods will
+ choke on the node when encountered in a document to translate.
+
+ .. versionchanged:: 0.5
+ Added the support for keyword arguments giving visit functions.
+ """
+ logger.debug('[app] adding node: %r', (node, kwargs))
+ if not override and docutils.is_node_registered(node):
+ logger.warning(__('node class %r is already registered, '
+ 'its visitors will be overridden'),
+ node.__name__, type='app', subtype='add_node')
+ docutils.register_node(node)
+ self.registry.add_translation_handlers(node, **kwargs)
+
+ def add_enumerable_node(self, node: type[Element], figtype: str,
+ title_getter: TitleGetter | None = None, override: bool = False,
+ **kwargs: tuple[Callable, Callable]) -> None:
+ """Register a Docutils node class as a numfig target.
+
+ Sphinx numbers the node automatically. And then the users can refer it
+ using :rst:role:`numref`.
+
+ :param node: A node class
+ :param figtype: The type of enumerable nodes. Each figtype has individual numbering
+ sequences. As system figtypes, ``figure``, ``table`` and
+ ``code-block`` are defined. It is possible to add custom nodes to
+ these default figtypes. It is also possible to define new custom
+ figtype if a new figtype is given.
+ :param title_getter: A getter function to obtain the title of node. It takes an
+ instance of the enumerable node, and it must return its title as
+ string. The title is used to the default title of references for
+ :rst:role:`ref`. By default, Sphinx searches
+ ``docutils.nodes.caption`` or ``docutils.nodes.title`` from the
+ node as a title.
+ :param kwargs: Visitor functions for each builder (same as :meth:`add_node`)
+ :param override: If true, install the node forcedly even if another node is already
+ installed as the same name
+
+ .. versionadded:: 1.4
+ """
+ self.registry.add_enumerable_node(node, figtype, title_getter, override=override)
+ self.add_node(node, override=override, **kwargs)
+
+ def add_directive(self, name: str, cls: type[Directive], override: bool = False) -> None:
+ """Register a Docutils directive.
+
+ :param name: The name of the directive
+ :param cls: A directive class
+ :param override: If false, do not install it if another directive
+ is already installed as the same name
+ If true, unconditionally install the directive.
+
+ For example, a custom directive named ``my-directive`` would be added
+ like this:
+
+ .. code-block:: python
+
+ from docutils.parsers.rst import Directive, directives
+
+ class MyDirective(Directive):
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec = {
+ 'class': directives.class_option,
+ 'name': directives.unchanged,
+ }
+
+ def run(self):
+ ...
+
+ def setup(app):
+ app.add_directive('my-directive', MyDirective)
+
+ For more details, see `the Docutils docs
+ <https://docutils.sourceforge.io/docs/howto/rst-directives.html>`__ .
+
+ .. versionchanged:: 0.6
+ Docutils 0.5-style directive classes are now supported.
+ .. deprecated:: 1.8
+ Docutils 0.4-style (function based) directives support is deprecated.
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ logger.debug('[app] adding directive: %r', (name, cls))
+ if not override and docutils.is_directive_registered(name):
+ logger.warning(__('directive %r is already registered, it will be overridden'),
+ name, type='app', subtype='add_directive')
+
+ docutils.register_directive(name, cls)
+
+ def add_role(self, name: str, role: Any, override: bool = False) -> None:
+ """Register a Docutils role.
+
+ :param name: The name of role
+ :param role: A role function
+ :param override: If false, do not install it if another role
+ is already installed as the same name
+ If true, unconditionally install the role.
+
+ For more details about role functions, see `the Docutils docs
+ <https://docutils.sourceforge.io/docs/howto/rst-roles.html>`__ .
+
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ logger.debug('[app] adding role: %r', (name, role))
+ if not override and docutils.is_role_registered(name):
+ logger.warning(__('role %r is already registered, it will be overridden'),
+ name, type='app', subtype='add_role')
+ docutils.register_role(name, role)
+
+ def add_generic_role(self, name: str, nodeclass: Any, override: bool = False) -> None:
+ """Register a generic Docutils role.
+
+ Register a Docutils role that does nothing but wrap its contents in the
+ node given by *nodeclass*.
+
+ :param override: If false, do not install it if another role
+ is already installed as the same name
+ If true, unconditionally install the role.
+
+ .. versionadded:: 0.6
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ # Don't use ``roles.register_generic_role`` because it uses
+ # ``register_canonical_role``.
+ logger.debug('[app] adding generic role: %r', (name, nodeclass))
+ if not override and docutils.is_role_registered(name):
+ logger.warning(__('role %r is already registered, it will be overridden'),
+ name, type='app', subtype='add_generic_role')
+ role = roles.GenericRole(name, nodeclass)
+ docutils.register_role(name, role) # type: ignore[arg-type]
+
+ def add_domain(self, domain: type[Domain], override: bool = False) -> None:
+ """Register a domain.
+
+ :param domain: A domain class
+ :param override: If false, do not install it if another domain
+ is already installed as the same name
+ If true, unconditionally install the domain.
+
+ .. versionadded:: 1.0
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_domain(domain, override=override)
+
+ def add_directive_to_domain(self, domain: str, name: str,
+ cls: type[Directive], override: bool = False) -> None:
+ """Register a Docutils directive in a domain.
+
+ Like :meth:`add_directive`, but the directive is added to the domain
+ named *domain*.
+
+ :param domain: The name of target domain
+ :param name: A name of directive
+ :param cls: A directive class
+ :param override: If false, do not install it if another directive
+ is already installed as the same name
+ If true, unconditionally install the directive.
+
+ .. versionadded:: 1.0
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_directive_to_domain(domain, name, cls, override=override)
+
+ def add_role_to_domain(self, domain: str, name: str, role: RoleFunction | XRefRole,
+ override: bool = False) -> None:
+ """Register a Docutils role in a domain.
+
+ Like :meth:`add_role`, but the role is added to the domain named
+ *domain*.
+
+ :param domain: The name of the target domain
+ :param name: The name of the role
+ :param role: The role function
+ :param override: If false, do not install it if another role
+ is already installed as the same name
+ If true, unconditionally install the role.
+
+ .. versionadded:: 1.0
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_role_to_domain(domain, name, role, override=override)
+
+ def add_index_to_domain(self, domain: str, index: type[Index], override: bool = False,
+ ) -> None:
+ """Register a custom index for a domain.
+
+ Add a custom *index* class to the domain named *domain*.
+
+ :param domain: The name of the target domain
+ :param index: The index class
+ :param override: If false, do not install it if another index
+ is already installed as the same name
+ If true, unconditionally install the index.
+
+ .. versionadded:: 1.0
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_index_to_domain(domain, index)
+
+ def add_object_type(self, directivename: str, rolename: str, indextemplate: str = '',
+ parse_node: Callable | None = None,
+ ref_nodeclass: type[TextElement] | None = None,
+ objname: str = '', doc_field_types: Sequence = (),
+ override: bool = False,
+ ) -> None:
+ """Register a new object type.
+
+ This method is a very convenient way to add a new :term:`object` type
+ that can be cross-referenced. It will do this:
+
+ - Create a new directive (called *directivename*) for documenting an
+ object. It will automatically add index entries if *indextemplate*
+ is nonempty; if given, it must contain exactly one instance of
+ ``%s``. See the example below for how the template will be
+ interpreted.
+ - Create a new role (called *rolename*) to cross-reference to these
+ object descriptions.
+ - If you provide *parse_node*, it must be a function that takes a
+ string and a docutils node, and it must populate the node with
+ children parsed from the string. It must then return the name of the
+ item to be used in cross-referencing and index entries. See the
+ :file:`conf.py` file in the source for this documentation for an
+ example.
+ - The *objname* (if not given, will default to *directivename*) names
+ the type of object. It is used when listing objects, e.g. in search
+ results.
+
+ For example, if you have this call in a custom Sphinx extension::
+
+ app.add_object_type('directive', 'dir', 'pair: %s; directive')
+
+ you can use this markup in your documents::
+
+ .. rst:directive:: function
+
+ Document a function.
+
+ <...>
+
+ See also the :rst:dir:`function` directive.
+
+ For the directive, an index entry will be generated as if you had prepended ::
+
+ .. index:: pair: function; directive
+
+ The reference node will be of class ``literal`` (so it will be rendered
+ in a proportional font, as appropriate for code) unless you give the
+ *ref_nodeclass* argument, which must be a docutils node class. Most
+ useful are ``docutils.nodes.emphasis`` or ``docutils.nodes.strong`` --
+ you can also use ``docutils.nodes.generated`` if you want no further
+ text decoration. If the text should be treated as literal (e.g. no
+ smart quote replacement), but not have typewriter styling, use
+ ``sphinx.addnodes.literal_emphasis`` or
+ ``sphinx.addnodes.literal_strong``.
+
+ For the role content, you have the same syntactical possibilities as
+ for standard Sphinx roles (see :ref:`xref-syntax`).
+
+ If *override* is True, the given object_type is forcedly installed even if
+ an object_type having the same name is already installed.
+
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_object_type(directivename, rolename, indextemplate, parse_node,
+ ref_nodeclass, objname, doc_field_types,
+ override=override)
+
+ def add_crossref_type(self, directivename: str, rolename: str, indextemplate: str = '',
+ ref_nodeclass: type[TextElement] | None = None, objname: str = '',
+ override: bool = False) -> None:
+ """Register a new crossref object type.
+
+ This method is very similar to :meth:`~Sphinx.add_object_type` except that the
+ directive it generates must be empty, and will produce no output.
+
+ That means that you can add semantic targets to your sources, and refer
+ to them using custom roles instead of generic ones (like
+ :rst:role:`ref`). Example call::
+
+ app.add_crossref_type('topic', 'topic', 'single: %s',
+ docutils.nodes.emphasis)
+
+ Example usage::
+
+ .. topic:: application API
+
+ The application API
+ -------------------
+
+ Some random text here.
+
+ See also :topic:`this section <application API>`.
+
+ (Of course, the element following the ``topic`` directive needn't be a
+ section.)
+
+
+ :param override: If false, do not install it if another cross-reference type
+ is already installed as the same name
+ If true, unconditionally install the cross-reference type.
+
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_crossref_type(directivename, rolename,
+ indextemplate, ref_nodeclass, objname,
+ override=override)
+
+ def add_transform(self, transform: type[Transform]) -> None:
+ """Register a Docutils transform to be applied after parsing.
+
+ Add the standard docutils :class:`~docutils.transforms.Transform`
+ subclass *transform* to the list of transforms that are applied after
+ Sphinx parses a reST document.
+
+ :param transform: A transform class
+
+ .. list-table:: priority range categories for Sphinx transforms
+ :widths: 20,80
+
+ * - Priority
+ - Main purpose in Sphinx
+ * - 0-99
+ - Fix invalid nodes by docutils. Translate a doctree.
+ * - 100-299
+ - Preparation
+ * - 300-399
+ - early
+ * - 400-699
+ - main
+ * - 700-799
+ - Post processing. Deadline to modify text and referencing.
+ * - 800-899
+ - Collect referencing and referenced nodes. Domain processing.
+ * - 900-999
+ - Finalize and clean up.
+
+ refs: `Transform Priority Range Categories`__
+
+ __ https://docutils.sourceforge.io/docs/ref/transforms.html#transform-priority-range-categories
+ """ # NoQA: E501,RUF100 # Flake8 thinks the URL is too long, Ruff special cases URLs.
+ self.registry.add_transform(transform)
+
+ def add_post_transform(self, transform: type[Transform]) -> None:
+ """Register a Docutils transform to be applied before writing.
+
+ Add the standard docutils :class:`~docutils.transforms.Transform`
+ subclass *transform* to the list of transforms that are applied before
+ Sphinx writes a document.
+
+ :param transform: A transform class
+ """
+ self.registry.add_post_transform(transform)
+
+ def add_js_file(self, filename: str | None, priority: int = 500,
+ loading_method: str | None = None, **kwargs: Any) -> None:
+ """Register a JavaScript file to include in the HTML output.
+
+ :param filename: The name of a JavaScript file that the default HTML
+ template will include. It must be relative to the HTML
+ static path, or a full URI with scheme, or ``None`` .
+ The ``None`` value is used to create an inline
+ ``<script>`` tag. See the description of *kwargs*
+ below.
+ :param priority: Files are included in ascending order of priority. If
+ multiple JavaScript files have the same priority,
+ those files will be included in order of registration.
+ See list of "priority range for JavaScript files" below.
+ :param loading_method: The loading method for the JavaScript file.
+ Either ``'async'`` or ``'defer'`` are allowed.
+ :param kwargs: Extra keyword arguments are included as attributes of the
+ ``<script>`` tag. If the special keyword argument
+ ``body`` is given, its value will be added as the content
+ of the ``<script>`` tag.
+
+ Example::
+
+ app.add_js_file('example.js')
+ # => <script src="_static/example.js"></script>
+
+ app.add_js_file('example.js', loading_method="async")
+ # => <script src="_static/example.js" async="async"></script>
+
+ app.add_js_file(None, body="var myVariable = 'foo';")
+ # => <script>var myVariable = 'foo';</script>
+
+ .. list-table:: priority range for JavaScript files
+ :widths: 20,80
+
+ * - Priority
+ - Main purpose in Sphinx
+ * - 200
+ - default priority for built-in JavaScript files
+ * - 500
+ - default priority for extensions
+ * - 800
+ - default priority for :confval:`html_js_files`
+
+ A JavaScript file can be added to the specific HTML page when an extension
+ calls this method on :event:`html-page-context` event.
+
+ .. versionadded:: 0.5
+
+ .. versionchanged:: 1.8
+ Renamed from ``app.add_javascript()``.
+ And it allows keyword arguments as attributes of script tag.
+
+ .. versionchanged:: 3.5
+ Take priority argument. Allow to add a JavaScript file to the specific page.
+ .. versionchanged:: 4.4
+ Take loading_method argument. Allow to change the loading method of the
+ JavaScript file.
+ """
+ if loading_method == 'async':
+ kwargs['async'] = 'async'
+ elif loading_method == 'defer':
+ kwargs['defer'] = 'defer'
+
+ self.registry.add_js_file(filename, priority=priority, **kwargs)
+ with contextlib.suppress(AttributeError):
+ self.builder.add_js_file( # type: ignore[attr-defined]
+ filename, priority=priority, **kwargs,
+ )
+
+ def add_css_file(self, filename: str, priority: int = 500, **kwargs: Any) -> None:
+ """Register a stylesheet to include in the HTML output.
+
+ :param filename: The name of a CSS file that the default HTML
+ template will include. It must be relative to the HTML
+ static path, or a full URI with scheme.
+ :param priority: Files are included in ascending order of priority. If
+ multiple CSS files have the same priority,
+ those files will be included in order of registration.
+ See list of "priority range for CSS files" below.
+ :param kwargs: Extra keyword arguments are included as attributes of the
+ ``<link>`` tag.
+
+ Example::
+
+ app.add_css_file('custom.css')
+ # => <link rel="stylesheet" href="_static/custom.css" type="text/css" />
+
+ app.add_css_file('print.css', media='print')
+ # => <link rel="stylesheet" href="_static/print.css"
+ # type="text/css" media="print" />
+
+ app.add_css_file('fancy.css', rel='alternate stylesheet', title='fancy')
+ # => <link rel="alternate stylesheet" href="_static/fancy.css"
+ # type="text/css" title="fancy" />
+
+ .. list-table:: priority range for CSS files
+ :widths: 20,80
+
+ * - Priority
+ - Main purpose in Sphinx
+ * - 200
+ - default priority for built-in CSS files
+ * - 500
+ - default priority for extensions
+ * - 800
+ - default priority for :confval:`html_css_files`
+
+ A CSS file can be added to the specific HTML page when an extension calls
+ this method on :event:`html-page-context` event.
+
+ .. versionadded:: 1.0
+
+ .. versionchanged:: 1.6
+ Optional ``alternate`` and/or ``title`` attributes can be supplied
+ with the arguments *alternate* (a Boolean) and *title* (a string).
+ The default is no title and *alternate* = ``False``. For
+ more information, refer to the `documentation
+ <https://mdn.io/Web/CSS/Alternative_style_sheets>`__.
+
+ .. versionchanged:: 1.8
+ Renamed from ``app.add_stylesheet()``.
+ And it allows keyword arguments as attributes of link tag.
+
+ .. versionchanged:: 3.5
+ Take priority argument. Allow to add a CSS file to the specific page.
+ """
+ logger.debug('[app] adding stylesheet: %r', filename)
+ self.registry.add_css_files(filename, priority=priority, **kwargs)
+ with contextlib.suppress(AttributeError):
+ self.builder.add_css_file( # type: ignore[attr-defined]
+ filename, priority=priority, **kwargs,
+ )
+
+ def add_latex_package(self, packagename: str, options: str | None = None,
+ after_hyperref: bool = False) -> None:
+ r"""Register a package to include in the LaTeX source code.
+
+ Add *packagename* to the list of packages that LaTeX source code will
+ include. If you provide *options*, it will be taken to the `\usepackage`
+ declaration. If you set *after_hyperref* truthy, the package will be
+ loaded after ``hyperref`` package.
+
+ .. code-block:: python
+
+ app.add_latex_package('mypackage')
+ # => \usepackage{mypackage}
+ app.add_latex_package('mypackage', 'foo,bar')
+ # => \usepackage[foo,bar]{mypackage}
+
+ .. versionadded:: 1.3
+ .. versionadded:: 3.1
+
+ *after_hyperref* option.
+ """
+ self.registry.add_latex_package(packagename, options, after_hyperref)
+
+ def add_lexer(self, alias: str, lexer: type[Lexer]) -> None:
+ """Register a new lexer for source code.
+
+ Use *lexer* to highlight code blocks with the given language *alias*.
+
+ .. versionadded:: 0.6
+ .. versionchanged:: 2.1
+ Take a lexer class as an argument.
+ .. versionchanged:: 4.0
+ Removed support for lexer instances as an argument.
+ """
+ logger.debug('[app] adding lexer: %r', (alias, lexer))
+ lexer_classes[alias] = lexer
+
+ def add_autodocumenter(self, cls: Any, override: bool = False) -> None:
+ """Register a new documenter class for the autodoc extension.
+
+ Add *cls* as a new documenter class for the :mod:`sphinx.ext.autodoc`
+ extension. It must be a subclass of
+ :class:`sphinx.ext.autodoc.Documenter`. This allows auto-documenting
+ new types of objects. See the source of the autodoc module for
+ examples on how to subclass :class:`~sphinx.ext.autodoc.Documenter`.
+
+ If *override* is True, the given *cls* is forcedly installed even if
+ a documenter having the same name is already installed.
+
+ See :ref:`autodoc_ext_tutorial`.
+
+ .. versionadded:: 0.6
+ .. versionchanged:: 2.2
+ Add *override* keyword.
+ """
+ logger.debug('[app] adding autodocumenter: %r', cls)
+ from sphinx.ext.autodoc.directive import AutodocDirective
+ self.registry.add_documenter(cls.objtype, cls)
+ self.add_directive('auto' + cls.objtype, AutodocDirective, override=override)
+
+ def add_autodoc_attrgetter(self, typ: type, getter: Callable[[Any, str, Any], Any],
+ ) -> None:
+ """Register a new ``getattr``-like function for the autodoc extension.
+
+ Add *getter*, which must be a function with an interface compatible to
+ the :func:`getattr` builtin, as the autodoc attribute getter for
+ objects that are instances of *typ*. All cases where autodoc needs to
+ get an attribute of a type are then handled by this function instead of
+ :func:`getattr`.
+
+ .. versionadded:: 0.6
+ """
+ logger.debug('[app] adding autodoc attrgetter: %r', (typ, getter))
+ self.registry.add_autodoc_attrgetter(typ, getter)
+
+ def add_search_language(self, cls: Any) -> None:
+ """Register a new language for the HTML search index.
+
+ 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
+ """
+ logger.debug('[app] adding search language: %r', cls)
+ from sphinx.search import SearchLanguage, languages
+ assert issubclass(cls, SearchLanguage)
+ languages[cls.lang] = cls
+
+ def add_source_suffix(self, suffix: str, filetype: str, override: bool = False) -> None:
+ """Register a suffix of source files.
+
+ Same as :confval:`source_suffix`. The users can override this
+ using the config setting.
+
+ :param override: If false, do not install it the same suffix
+ is already installed.
+ If true, unconditionally install the suffix.
+
+ .. versionadded:: 1.8
+ """
+ self.registry.add_source_suffix(suffix, filetype, override=override)
+
+ def add_source_parser(self, parser: type[Parser], override: bool = False) -> None:
+ """Register a parser class.
+
+ :param override: If false, do not install it if another parser
+ is already installed for the same suffix.
+ If true, unconditionally install the parser.
+
+ .. versionadded:: 1.4
+ .. versionchanged:: 1.8
+ *suffix* argument is deprecated. It only accepts *parser* argument.
+ Use :meth:`add_source_suffix` API to register suffix instead.
+ .. versionchanged:: 1.8
+ Add *override* keyword.
+ """
+ self.registry.add_source_parser(parser, override=override)
+
+ def add_env_collector(self, collector: type[EnvironmentCollector]) -> None:
+ """Register an environment collector class.
+
+ Refer to :ref:`collector-api`.
+
+ .. versionadded:: 1.6
+ """
+ logger.debug('[app] adding environment collector: %r', collector)
+ collector().enable(self)
+
+ def add_html_theme(self, name: str, theme_path: str) -> None:
+ """Register a HTML Theme.
+
+ The *name* is a name of theme, and *theme_path* is a full path to the
+ theme (refs: :ref:`distribute-your-theme`).
+
+ .. versionadded:: 1.6
+ """
+ logger.debug('[app] adding HTML theme: %r, %r', name, theme_path)
+ self.registry.add_html_theme(name, theme_path)
+
+ def add_html_math_renderer(
+ self,
+ name: str,
+ inline_renderers: tuple[Callable, Callable | None] | None = None,
+ block_renderers: tuple[Callable, Callable | None] | None = None,
+ ) -> None:
+ """Register a math renderer for HTML.
+
+ The *name* is a name of math renderer. Both *inline_renderers* and
+ *block_renderers* are used as visitor functions for the HTML writer:
+ the former for inline math node (``nodes.math``), the latter for
+ block math node (``nodes.math_block``). Regarding visitor functions,
+ see :meth:`add_node` for details.
+
+ .. versionadded:: 1.8
+
+ """
+ self.registry.add_html_math_renderer(name, inline_renderers, block_renderers)
+
+ def add_message_catalog(self, catalog: str, locale_dir: str) -> None:
+ """Register a message catalog.
+
+ :param catalog: The name of the catalog
+ :param locale_dir: The base path of the message catalog
+
+ For more details, see :func:`sphinx.locale.get_translation()`.
+
+ .. versionadded:: 1.8
+ """
+ locale.init([locale_dir], self.config.language, catalog)
+ locale.init_console(locale_dir, catalog)
+
+ # ---- other methods -------------------------------------------------
+ def is_parallel_allowed(self, typ: str) -> bool:
+ """Check whether parallel processing is allowed or not.
+
+ :param typ: A type of processing; ``'read'`` or ``'write'``.
+ """
+ if typ == 'read':
+ attrname = 'parallel_read_safe'
+ message_not_declared = __("the %s extension does not declare if it "
+ "is safe for parallel reading, assuming "
+ "it isn't - please ask the extension author "
+ "to check and make it explicit")
+ message_not_safe = __("the %s extension is not safe for parallel reading")
+ elif typ == 'write':
+ attrname = 'parallel_write_safe'
+ message_not_declared = __("the %s extension does not declare if it "
+ "is safe for parallel writing, assuming "
+ "it isn't - please ask the extension author "
+ "to check and make it explicit")
+ message_not_safe = __("the %s extension is not safe for parallel writing")
+ else:
+ raise ValueError('parallel type %s is not supported' % typ)
+
+ for ext in self.extensions.values():
+ allowed = getattr(ext, attrname, None)
+ if allowed is None:
+ logger.warning(message_not_declared, ext.name)
+ logger.warning(__('doing serial %s'), typ)
+ return False
+ elif not allowed:
+ logger.warning(message_not_safe, ext.name)
+ logger.warning(__('doing serial %s'), typ)
+ return False
+
+ return True
+
+ def set_html_assets_policy(self, policy):
+ """Set the policy to include assets in HTML pages.
+
+ - always: include the assets in all the pages
+ - per_page: include the assets only in pages where they are used
+
+ .. versionadded: 4.1
+ """
+ if policy not in ('always', 'per_page'):
+ raise ValueError('policy %s is not supported' % policy)
+ self.registry.html_assets_policy = policy
+
+
+class TemplateBridge:
+ """
+ This class defines the interface for a "template bridge", that is, a class
+ that renders templates given a template name and a context.
+ """
+
+ def init(
+ self,
+ builder: Builder,
+ theme: Theme | None = None,
+ dirs: list[str] | None = None,
+ ) -> None:
+ """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``.
+
+ *theme* is a :class:`sphinx.theming.Theme` object or None; in the latter
+ case, *dirs* can be list of fixed directories to look for templates.
+ """
+ msg = 'must be implemented in subclasses'
+ raise NotImplementedError(msg)
+
+ def newest_template_mtime(self) -> float:
+ """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: str, context: dict) -> None:
+ """Called by the builder to render a template given as a filename with
+ a specified context (a Python dictionary).
+ """
+ msg = 'must be implemented in subclasses'
+ raise NotImplementedError(msg)
+
+ def render_string(self, template: str, context: dict) -> str:
+ """Called by the builder to render a template given as a string with a
+ specified context (a Python dictionary).
+ """
+ msg = 'must be implemented in subclasses'
+ raise NotImplementedError(msg)
diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py
new file mode 100644
index 0000000..805ee13
--- /dev/null
+++ b/sphinx/builders/__init__.py
@@ -0,0 +1,667 @@
+"""Builder superclass for all builders."""
+
+from __future__ import annotations
+
+import codecs
+import pickle
+import time
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.utils import DependencyList
+
+from sphinx.environment import CONFIG_CHANGED_REASON, CONFIG_OK, BuildEnvironment
+from sphinx.environment.adapters.asset import ImageAdapter
+from sphinx.errors import SphinxError
+from sphinx.locale import __
+from sphinx.util import UnicodeDecodeErrorHandler, get_filetype, import_object, logging, rst
+from sphinx.util.build_phase import BuildPhase
+from sphinx.util.console import bold # type: ignore[attr-defined]
+from sphinx.util.display import progress_message, status_iterator
+from sphinx.util.docutils import sphinx_domains
+from sphinx.util.i18n import CatalogInfo, CatalogRepository, docname_to_domain
+from sphinx.util.osutil import SEP, ensuredir, relative_uri, relpath
+from sphinx.util.parallel import ParallelTasks, SerialTasks, make_chunks, parallel_available
+
+# side effect: registers roles and directives
+from sphinx import directives # noqa: F401 isort:skip
+from sphinx import roles # noqa: F401 isort:skip
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Sequence
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+ from sphinx.events import EventManager
+ from sphinx.util.tags import Tags
+ from sphinx.util.typing import NoneType
+
+
+logger = logging.getLogger(__name__)
+
+
+class Builder:
+ """
+ Builds target formats from the reST sources.
+ """
+
+ #: The builder's name, for the -b command line option.
+ name = ''
+ #: The builder's output format, or '' if no document output is produced.
+ format = ''
+ #: The message emitted upon successful build completion. This can be a
+ #: printf-style template string with the following keys: ``outdir``,
+ #: ``project``
+ epilog = ''
+
+ #: default translator class for the builder. This can be overridden by
+ #: :py:meth:`~sphinx.application.Sphinx.set_translator`.
+ default_translator_class: type[nodes.NodeVisitor]
+ # doctree versioning method
+ versioning_method = 'none'
+ versioning_compare = False
+ #: allow parallel write_doc() calls
+ allow_parallel = False
+ # support translation
+ use_message_catalog = True
+
+ #: The list of MIME types of image formats supported by the builder.
+ #: Image files are searched in the order in which they appear here.
+ supported_image_types: list[str] = []
+ #: The builder supports remote images or not.
+ supported_remote_images = False
+ #: The builder supports data URIs or not.
+ supported_data_uri_images = False
+
+ def __init__(self, app: Sphinx, env: BuildEnvironment) -> None:
+ self.srcdir = app.srcdir
+ self.confdir = app.confdir
+ self.outdir = app.outdir
+ self.doctreedir = app.doctreedir
+ ensuredir(self.doctreedir)
+
+ self.app: Sphinx = app
+ self.env: BuildEnvironment = env
+ self.env.set_versioning_method(self.versioning_method,
+ self.versioning_compare)
+ self.events: EventManager = app.events
+ self.config: Config = app.config
+ self.tags: Tags = app.tags
+ self.tags.add(self.format)
+ self.tags.add(self.name)
+ self.tags.add("format_%s" % self.format)
+ self.tags.add("builder_%s" % self.name)
+
+ # images that need to be copied over (source -> dest)
+ self.images: dict[str, str] = {}
+ # basename of images directory
+ self.imagedir = ""
+ # relative path to image directory from current docname (used at writing docs)
+ self.imgpath = ""
+
+ # these get set later
+ self.parallel_ok = False
+ self.finish_tasks: Any = None
+
+ def get_translator_class(self, *args: Any) -> type[nodes.NodeVisitor]:
+ """Return a class of translator."""
+ return self.app.registry.get_translator_class(self)
+
+ def create_translator(self, *args: Any) -> nodes.NodeVisitor:
+ """Return an instance of translator.
+
+ This method returns an instance of ``default_translator_class`` by default.
+ Users can replace the translator class with ``app.set_translator()`` API.
+ """
+ return self.app.registry.create_translator(self, *args)
+
+ # helper methods
+ def init(self) -> None:
+ """Load necessary templates and perform initialization. The default
+ implementation does nothing.
+ """
+ pass
+
+ def create_template_bridge(self) -> None:
+ """Return the template bridge configured."""
+ if self.config.template_bridge:
+ self.templates = import_object(self.config.template_bridge,
+ 'template_bridge setting')()
+ else:
+ from sphinx.jinja2glue import BuiltinTemplateLoader
+ self.templates = BuiltinTemplateLoader()
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ """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_: str, to: str, typ: str | None = None) -> str:
+ """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) -> str | Iterable[str]:
+ """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
+ source files, return a string here. If it does, return an iterable
+ of those files that need to be written.
+ """
+ raise NotImplementedError
+
+ def get_asset_paths(self) -> list[str]:
+ """Return list of paths for assets (ex. templates, CSS, etc.)."""
+ return []
+
+ def post_process_images(self, doctree: Node) -> None:
+ """Pick the best candidate for all image URIs."""
+ images = ImageAdapter(self.env)
+ for node in doctree.findall(nodes.image):
+ if '?' in node['candidates']:
+ # don't rewrite nonlocal image URIs
+ continue
+ if '*' not in node['candidates']:
+ for imgtype in self.supported_image_types:
+ candidate = node['candidates'].get(imgtype, None)
+ if candidate:
+ break
+ else:
+ mimetypes = sorted(node['candidates'])
+ image_uri = images.get_original_image_uri(node['uri'])
+ if mimetypes:
+ logger.warning(__('a suitable image for %s builder not found: '
+ '%s (%s)'),
+ self.name, mimetypes, image_uri, location=node)
+ else:
+ logger.warning(__('a suitable image for %s builder not found: %s'),
+ self.name, image_uri, location=node)
+ continue
+ node['uri'] = candidate
+ else:
+ candidate = node['uri']
+ if candidate not in self.env.images:
+ # non-existing URI; let it alone
+ continue
+ self.images[candidate] = self.env.images[candidate][1]
+
+ # compile po methods
+
+ def compile_catalogs(self, catalogs: set[CatalogInfo], message: str) -> None:
+ if not self.config.gettext_auto_build:
+ return
+
+ def cat2relpath(cat: CatalogInfo) -> str:
+ return relpath(cat.mo_path, self.env.srcdir).replace(path.sep, SEP)
+
+ logger.info(bold(__('building [mo]: ')) + message)
+ for catalog in status_iterator(catalogs, __('writing output... '), "darkgreen",
+ len(catalogs), self.app.verbosity,
+ stringify_func=cat2relpath):
+ catalog.write_mo(self.config.language,
+ self.config.gettext_allow_fuzzy_translations)
+
+ def compile_all_catalogs(self) -> None:
+ repo = CatalogRepository(self.srcdir, self.config.locale_dirs,
+ self.config.language, self.config.source_encoding)
+ message = __('all of %d po files') % len(list(repo.catalogs))
+ self.compile_catalogs(set(repo.catalogs), message)
+
+ def compile_specific_catalogs(self, specified_files: list[str]) -> None:
+ def to_domain(fpath: str) -> str | None:
+ docname = self.env.path2doc(path.abspath(fpath))
+ if docname:
+ return docname_to_domain(docname, self.config.gettext_compact)
+ else:
+ return None
+
+ catalogs = set()
+ domains = set(map(to_domain, specified_files))
+ repo = CatalogRepository(self.srcdir, self.config.locale_dirs,
+ self.config.language, self.config.source_encoding)
+ for catalog in repo.catalogs:
+ if catalog.domain in domains and catalog.is_outdated():
+ catalogs.add(catalog)
+ message = __('targets for %d po files that are specified') % len(catalogs)
+ self.compile_catalogs(catalogs, message)
+
+ # TODO(stephenfin): This would make more sense as 'compile_outdated_catalogs'
+ def compile_update_catalogs(self) -> None:
+ repo = CatalogRepository(self.srcdir, self.config.locale_dirs,
+ self.config.language, self.config.source_encoding)
+ catalogs = {c for c in repo.catalogs if c.is_outdated()}
+ message = __('targets for %d po files that are out of date') % len(catalogs)
+ self.compile_catalogs(catalogs, message)
+
+ # build methods
+
+ def build_all(self) -> None:
+ """Build all source files."""
+ self.compile_all_catalogs()
+
+ self.build(None, summary=__('all source files'), method='all')
+
+ def build_specific(self, filenames: list[str]) -> None:
+ """Only rebuild as much as needed for changes in the *filenames*."""
+ docnames: list[str] = []
+
+ for filename in filenames:
+ filename = path.normpath(path.abspath(filename))
+
+ if not path.isfile(filename):
+ logger.warning(__('file %r given on command line does not exist, '),
+ filename)
+ continue
+
+ if not filename.startswith(str(self.srcdir)):
+ logger.warning(__('file %r given on command line is not under the '
+ 'source directory, ignoring'), filename)
+ continue
+
+ docname = self.env.path2doc(filename)
+ if not docname:
+ logger.warning(__('file %r given on command line is not a valid '
+ 'document, ignoring'), filename)
+ continue
+
+ docnames.append(docname)
+
+ self.compile_specific_catalogs(filenames)
+
+ self.build(docnames, method='specific',
+ summary=__('%d source files given on command line') % len(docnames))
+
+ def build_update(self) -> None:
+ """Only rebuild what was changed or added since last build."""
+ self.compile_update_catalogs()
+
+ to_build = self.get_outdated_docs()
+ if isinstance(to_build, str):
+ self.build(['__all__'], to_build)
+ else:
+ to_build = list(to_build)
+ self.build(to_build,
+ summary=__('targets for %d source files that are out of date') %
+ len(to_build))
+
+ def build(
+ self,
+ docnames: Iterable[str] | None,
+ summary: str | None = None,
+ method: str = 'update',
+ ) -> None:
+ """Main build method.
+
+ First updates the environment, and then calls
+ :meth:`!write`.
+ """
+ if summary:
+ logger.info(bold(__('building [%s]: ') % self.name) + summary)
+
+ # while reading, collect all warnings from docutils
+ with logging.pending_warnings():
+ updated_docnames = set(self.read())
+
+ doccount = len(updated_docnames)
+ logger.info(bold(__('looking for now-outdated files... ')), nonl=True)
+ for docname in self.env.check_dependents(self.app, updated_docnames):
+ updated_docnames.add(docname)
+ outdated = len(updated_docnames) - doccount
+ if outdated:
+ logger.info(__('%d found'), outdated)
+ else:
+ logger.info(__('none found'))
+
+ if updated_docnames:
+ # save the environment
+ from sphinx.application import ENV_PICKLE_FILENAME
+ with progress_message(__('pickling environment')), \
+ open(path.join(self.doctreedir, ENV_PICKLE_FILENAME), 'wb') as f:
+ pickle.dump(self.env, f, pickle.HIGHEST_PROTOCOL)
+
+ # global actions
+ self.app.phase = BuildPhase.CONSISTENCY_CHECK
+ with progress_message(__('checking consistency')):
+ self.env.check_consistency()
+ else:
+ if method == 'update' and not docnames:
+ logger.info(bold(__('no targets are out of date.')))
+ return
+
+ self.app.phase = BuildPhase.RESOLVING
+
+ # filter "docnames" (list of outdated files) by the updated
+ # found_docs of the environment; this will remove docs that
+ # have since been removed
+ if docnames and docnames != ['__all__']:
+ docnames = set(docnames) & self.env.found_docs
+
+ # determine if we can write in parallel
+ if parallel_available and self.app.parallel > 1 and self.allow_parallel:
+ self.parallel_ok = self.app.is_parallel_allowed('write')
+ else:
+ self.parallel_ok = False
+
+ # create a task executor to use for misc. "finish-up" tasks
+ # if self.parallel_ok:
+ # self.finish_tasks = ParallelTasks(self.app.parallel)
+ # else:
+ # for now, just execute them serially
+ self.finish_tasks = SerialTasks()
+
+ # write all "normal" documents (or everything for some builders)
+ self.write(docnames, list(updated_docnames), method)
+
+ # finish (write static files etc.)
+ self.finish()
+
+ # wait for all tasks
+ self.finish_tasks.join()
+
+ def read(self) -> list[str]:
+ """(Re-)read all files new or changed since last update.
+
+ Store all environment docnames in the canonical format (ie using SEP as
+ a separator in place of os.path.sep).
+ """
+ logger.info(bold(__('updating environment: ')), nonl=True)
+
+ self.env.find_files(self.config, self)
+ updated = (self.env.config_status != CONFIG_OK)
+ added, changed, removed = self.env.get_outdated_files(updated)
+
+ # allow user intervention as well
+ for docs in self.events.emit('env-get-outdated', self.env, added, changed, removed):
+ changed.update(set(docs) & self.env.found_docs)
+
+ # if files were added or removed, all documents with globbed toctrees
+ # must be reread
+ if added or removed:
+ # ... but not those that already were removed
+ changed.update(self.env.glob_toctrees & self.env.found_docs)
+
+ if updated: # explain the change iff build config status was not ok
+ reason = (CONFIG_CHANGED_REASON.get(self.env.config_status, '') +
+ (self.env.config_status_extra or ''))
+ logger.info('[%s] ', reason, nonl=True)
+
+ logger.info(__('%s added, %s changed, %s removed'),
+ len(added), len(changed), len(removed))
+
+ # clear all files no longer present
+ for docname in removed:
+ self.events.emit('env-purge-doc', self.env, docname)
+ self.env.clear_doc(docname)
+
+ # read all new and changed files
+ docnames = sorted(added | changed)
+ # allow changing and reordering the list of docs to read
+ self.events.emit('env-before-read-docs', self.env, docnames)
+
+ # check if we should do parallel or serial read
+ if parallel_available and len(docnames) > 5 and self.app.parallel > 1:
+ par_ok = self.app.is_parallel_allowed('read')
+ else:
+ par_ok = False
+
+ if par_ok:
+ self._read_parallel(docnames, nproc=self.app.parallel)
+ else:
+ self._read_serial(docnames)
+
+ if self.config.root_doc not in self.env.all_docs:
+ raise SphinxError('root file %s not found' %
+ self.env.doc2path(self.config.root_doc))
+
+ for retval in self.events.emit('env-updated', self.env):
+ if retval is not None:
+ docnames.extend(retval)
+
+ # workaround: marked as okay to call builder.read() twice in same process
+ self.env.config_status = CONFIG_OK
+
+ return sorted(docnames)
+
+ def _read_serial(self, docnames: list[str]) -> None:
+ for docname in status_iterator(docnames, __('reading sources... '), "purple",
+ len(docnames), self.app.verbosity):
+ # remove all inventory entries for that file
+ self.events.emit('env-purge-doc', self.env, docname)
+ self.env.clear_doc(docname)
+ self.read_doc(docname)
+
+ def _read_parallel(self, docnames: list[str], nproc: int) -> None:
+ chunks = make_chunks(docnames, nproc)
+
+ # create a status_iterator to step progressbar after reading a document
+ # (see: ``merge()`` function)
+ progress = status_iterator(chunks, __('reading sources... '), "purple",
+ len(chunks), self.app.verbosity)
+
+ # clear all outdated docs at once
+ for docname in docnames:
+ self.events.emit('env-purge-doc', self.env, docname)
+ self.env.clear_doc(docname)
+
+ def read_process(docs: list[str]) -> bytes:
+ self.env.app = self.app
+ for docname in docs:
+ self.read_doc(docname, _cache=False)
+ # allow pickling self to send it back
+ return pickle.dumps(self.env, pickle.HIGHEST_PROTOCOL)
+
+ def merge(docs: list[str], otherenv: bytes) -> None:
+ env = pickle.loads(otherenv)
+ self.env.merge_info_from(docs, env, self.app)
+
+ next(progress)
+
+ tasks = ParallelTasks(nproc)
+ for chunk in chunks:
+ tasks.add_task(read_process, chunk, merge)
+
+ # make sure all threads have finished
+ tasks.join()
+ logger.info('')
+
+ def read_doc(self, docname: str, *, _cache: bool = True) -> None:
+ """Parse a file and add/update inventory entries for the doctree."""
+ self.env.prepare_settings(docname)
+
+ # Add confdir/docutils.conf to dependencies list if exists
+ docutilsconf = path.join(self.confdir, 'docutils.conf')
+ if path.isfile(docutilsconf):
+ self.env.note_dependency(docutilsconf)
+
+ filename = self.env.doc2path(docname)
+ filetype = get_filetype(self.app.config.source_suffix, filename)
+ publisher = self.app.registry.get_publisher(self.app, filetype)
+ # record_dependencies is mutable even though it is in settings,
+ # explicitly re-initialise for each document
+ publisher.settings.record_dependencies = DependencyList()
+ with sphinx_domains(self.env), rst.default_role(docname, self.config.default_role):
+ # set up error_handler for the target document
+ codecs.register_error('sphinx',
+ UnicodeDecodeErrorHandler(docname)) # type: ignore[arg-type]
+
+ publisher.set_source(source_path=filename)
+ publisher.publish()
+ doctree = publisher.document
+
+ # store time of reading, for outdated files detection
+ self.env.all_docs[docname] = time.time_ns() // 1_000
+
+ # cleanup
+ self.env.temp_data.clear()
+ self.env.ref_context.clear()
+
+ self.write_doctree(docname, doctree, _cache=_cache)
+
+ def write_doctree(
+ self, docname: str, doctree: nodes.document, *, _cache: bool = True,
+ ) -> None:
+ """Write the doctree to a file."""
+ # make it picklable
+ doctree.reporter = None # type: ignore[assignment]
+ doctree.transformer = None # type: ignore[assignment]
+
+ # Create a copy of settings object before modification because it is
+ # shared with other documents.
+ doctree.settings = doctree.settings.copy()
+ doctree.settings.warning_stream = None
+ doctree.settings.env = None
+ doctree.settings.record_dependencies = None # type: ignore[assignment]
+
+ doctree_filename = path.join(self.doctreedir, docname + '.doctree')
+ ensuredir(path.dirname(doctree_filename))
+ with open(doctree_filename, 'wb') as f:
+ pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL)
+
+ # When Sphinx is running in parallel mode, ``write_doctree()`` is invoked
+ # in the context of a process worker, and thus it does not make sense to
+ # pickle the doctree and send it to the main process
+ if _cache:
+ self.env._write_doc_doctree_cache[docname] = doctree
+
+ def write(
+ self,
+ build_docnames: Iterable[str] | None,
+ updated_docnames: Sequence[str],
+ method: str = 'update',
+ ) -> None:
+ if build_docnames is None or build_docnames == ['__all__']:
+ # build_all
+ build_docnames = self.env.found_docs
+ if method == 'update':
+ # build updated ones as well
+ docnames = set(build_docnames) | set(updated_docnames)
+ else:
+ docnames = set(build_docnames)
+ logger.debug(__('docnames to write: %s'), ', '.join(sorted(docnames)))
+
+ # add all toctree-containing files that may have changed
+ for docname in list(docnames):
+ for tocdocname in self.env.files_to_rebuild.get(docname, set()):
+ if tocdocname in self.env.found_docs:
+ docnames.add(tocdocname)
+ docnames.add(self.config.root_doc)
+
+ with progress_message(__('preparing documents')):
+ self.prepare_writing(docnames)
+
+ with progress_message(__('copying assets')):
+ self.copy_assets()
+
+ if self.parallel_ok:
+ # number of subprocesses is parallel-1 because the main process
+ # is busy loading doctrees and doing write_doc_serialized()
+ self._write_parallel(sorted(docnames),
+ nproc=self.app.parallel - 1)
+ else:
+ self._write_serial(sorted(docnames))
+
+ def _write_serial(self, docnames: Sequence[str]) -> None:
+ with logging.pending_warnings():
+ for docname in status_iterator(docnames, __('writing output... '), "darkgreen",
+ len(docnames), self.app.verbosity):
+ self.app.phase = BuildPhase.RESOLVING
+ doctree = self.env.get_and_resolve_doctree(docname, self)
+ self.app.phase = BuildPhase.WRITING
+ self.write_doc_serialized(docname, doctree)
+ self.write_doc(docname, doctree)
+
+ def _write_parallel(self, docnames: Sequence[str], nproc: int) -> None:
+ def write_process(docs: list[tuple[str, nodes.document]]) -> None:
+ self.app.phase = BuildPhase.WRITING
+ for docname, doctree in docs:
+ self.write_doc(docname, doctree)
+
+ # warm up caches/compile templates using the first document
+ firstname, docnames = docnames[0], docnames[1:]
+ self.app.phase = BuildPhase.RESOLVING
+ doctree = self.env.get_and_resolve_doctree(firstname, self)
+ self.app.phase = BuildPhase.WRITING
+ self.write_doc_serialized(firstname, doctree)
+ self.write_doc(firstname, doctree)
+
+ tasks = ParallelTasks(nproc)
+ chunks = make_chunks(docnames, nproc)
+
+ # create a status_iterator to step progressbar after writing a document
+ # (see: ``on_chunk_done()`` function)
+ progress = status_iterator(chunks, __('writing output... '), "darkgreen",
+ len(chunks), self.app.verbosity)
+
+ def on_chunk_done(args: list[tuple[str, NoneType]], result: NoneType) -> None:
+ next(progress)
+
+ self.app.phase = BuildPhase.RESOLVING
+ for chunk in chunks:
+ arg = []
+ for docname in chunk:
+ doctree = self.env.get_and_resolve_doctree(docname, self)
+ self.write_doc_serialized(docname, doctree)
+ arg.append((docname, doctree))
+ tasks.add_task(write_process, arg, on_chunk_done)
+
+ # make sure all threads have finished
+ tasks.join()
+ logger.info('')
+
+ def prepare_writing(self, docnames: set[str]) -> None:
+ """A place where you can add logic before :meth:`write_doc` is run"""
+ raise NotImplementedError
+
+ def copy_assets(self) -> None:
+ """Where assets (images, static files, etc) are copied before writing"""
+ pass
+
+ def write_doc(self, docname: str, doctree: nodes.document) -> None:
+ """Where you actually write something to the filesystem."""
+ raise NotImplementedError
+
+ def write_doc_serialized(self, docname: str, doctree: nodes.document) -> None:
+ """Handle parts of write_doc that must be called in the main process
+ if parallel build is active.
+ """
+ pass
+
+ def finish(self) -> None:
+ """Finish the building process.
+
+ The default implementation does nothing.
+ """
+ pass
+
+ def cleanup(self) -> None:
+ """Cleanup any resources.
+
+ The default implementation does nothing.
+ """
+ pass
+
+ def get_builder_config(self, option: str, default: str) -> Any:
+ """Return a builder specific option.
+
+ This method allows customization of common builder settings by
+ inserting the name of the current builder in the option key.
+ If the key does not exist, use default as builder name.
+ """
+ # At the moment, only XXX_use_index is looked up this way.
+ # Every new builder variant must be registered in Config.config_values.
+ try:
+ optname = f'{self.name}_{option}'
+ return getattr(self.config, optname)
+ except AttributeError:
+ optname = f'{default}_{option}'
+ return getattr(self.config, optname)
diff --git a/sphinx/builders/_epub_base.py b/sphinx/builders/_epub_base.py
new file mode 100644
index 0000000..f0db49b
--- /dev/null
+++ b/sphinx/builders/_epub_base.py
@@ -0,0 +1,710 @@
+"""Base class of epub2/epub3 builders."""
+
+from __future__ import annotations
+
+import html
+import os
+import re
+import time
+from os import path
+from typing import TYPE_CHECKING, Any, NamedTuple
+from urllib.parse import quote
+from zipfile import ZIP_DEFLATED, ZIP_STORED, ZipFile
+
+from docutils import nodes
+from docutils.utils import smartquotes
+
+from sphinx import addnodes
+from sphinx.builders.html import BuildInfo, StandaloneHTMLBuilder
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.display import status_iterator
+from sphinx.util.fileutil import copy_asset_file
+from sphinx.util.osutil import copyfile, ensuredir, relpath
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node
+
+try:
+ from PIL import Image
+except ImportError:
+ Image = None
+
+
+logger = logging.getLogger(__name__)
+
+
+# (Fragment) templates from which the metainfo files content.opf and
+# toc.ncx are created.
+# This template section also defines strings that are embedded in the html
+# output but that may be customized by (re-)setting module attributes,
+# e.g. from conf.py.
+
+COVERPAGE_NAME = 'epub-cover.xhtml'
+
+TOCTREE_TEMPLATE = 'toctree-l%d'
+
+LINK_TARGET_TEMPLATE = ' [%(uri)s]'
+
+FOOTNOTE_LABEL_TEMPLATE = '#%d'
+
+FOOTNOTES_RUBRIC_NAME = 'Footnotes'
+
+CSS_LINK_TARGET_CLASS = 'link-target'
+
+# XXX These strings should be localized according to epub_language
+GUIDE_TITLES = {
+ 'toc': 'Table of Contents',
+ 'cover': 'Cover',
+}
+
+MEDIA_TYPES = {
+ '.xhtml': 'application/xhtml+xml',
+ '.css': 'text/css',
+ '.png': 'image/png',
+ '.webp': 'image/webp',
+ '.gif': 'image/gif',
+ '.svg': 'image/svg+xml',
+ '.jpg': 'image/jpeg',
+ '.jpeg': 'image/jpeg',
+ '.otf': 'font/otf',
+ '.ttf': 'font/ttf',
+ '.woff': 'font/woff',
+}
+
+VECTOR_GRAPHICS_EXTENSIONS = ('.svg',)
+
+# Regular expression to match colons only in local fragment identifiers.
+# If the URI contains a colon before the #,
+# it is an external link that should not change.
+REFURI_RE = re.compile("([^#:]*#)(.*)")
+
+
+class ManifestItem(NamedTuple):
+ href: str
+ id: str
+ media_type: str
+
+
+class Spine(NamedTuple):
+ idref: str
+ linear: bool
+
+
+class Guide(NamedTuple):
+ type: str
+ title: str
+ uri: str
+
+
+class NavPoint(NamedTuple):
+ navpoint: str
+ playorder: int
+ text: str
+ refuri: str
+ children: list[NavPoint]
+
+
+def sphinx_smarty_pants(t: str, language: str = 'en') -> str:
+ t = t.replace('&quot;', '"')
+ t = smartquotes.educateDashesOldSchool(t)
+ t = smartquotes.educateQuotes(t, language)
+ t = t.replace('"', '&quot;')
+ return t
+
+
+ssp = sphinx_smarty_pants
+
+
+# The epub publisher
+
+class EpubBuilder(StandaloneHTMLBuilder):
+ """
+ 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
+ epub file.
+ """
+
+ # don't copy the reST source
+ copysource = False
+ supported_image_types = ['image/svg+xml', 'image/png', 'image/gif',
+ 'image/jpeg']
+ supported_remote_images = False
+
+ # don't add links
+ add_permalinks = False
+ # don't use # as current path. ePub check reject it.
+ allow_sharp_as_current_path = False
+ # don't add sidebar etc.
+ embedded = True
+ # disable download role
+ download_support = False
+ # don't create links to original images from images
+ html_scaled_image_link = False
+ # don't generate search index or include search page
+ search = False
+
+ coverpage_name = COVERPAGE_NAME
+ toctree_template = TOCTREE_TEMPLATE
+ link_target_template = LINK_TARGET_TEMPLATE
+ css_link_target_class = CSS_LINK_TARGET_CLASS
+ guide_titles = GUIDE_TITLES
+ media_types = MEDIA_TYPES
+ refuri_re = REFURI_RE
+ template_dir = ""
+ doctype = ""
+
+ def init(self) -> None:
+ super().init()
+ # the output files for epub must be .html only
+ self.out_suffix = '.xhtml'
+ self.link_suffix = '.xhtml'
+ self.playorder = 0
+ self.tocid = 0
+ self.id_cache: dict[str, str] = {}
+ self.use_index = self.get_builder_config('use_index', 'epub')
+ self.refnodes: list[dict[str, Any]] = []
+
+ def create_build_info(self) -> BuildInfo:
+ return BuildInfo(self.config, self.tags, ['html', 'epub'])
+
+ def get_theme_config(self) -> tuple[str, dict]:
+ return self.config.epub_theme, self.config.epub_theme_options
+
+ # generic support functions
+ def make_id(self, name: str) -> str:
+ # id_cache is intentionally mutable
+ """Return a unique id for name."""
+ id = self.id_cache.get(name)
+ if not id:
+ id = 'epub-%d' % self.env.new_serialno('epub')
+ self.id_cache[name] = id
+ return id
+
+ def get_refnodes(
+ self, doctree: Node, result: list[dict[str, Any]],
+ ) -> list[dict[str, Any]]:
+ """Collect section titles, their depth in the toc and the refuri."""
+ # XXX: is there a better way than checking the attribute
+ # toctree-l[1-8] on the parent node?
+ if isinstance(doctree, nodes.reference) and doctree.get('refuri'):
+ refuri = doctree['refuri']
+ if refuri.startswith(('http://', 'https://', 'irc:', 'mailto:')):
+ return result
+ classes = doctree.parent.attributes['classes']
+ for level in range(8, 0, -1): # or range(1, 8)?
+ if (self.toctree_template % level) in classes:
+ result.append({
+ 'level': level,
+ 'refuri': html.escape(refuri),
+ 'text': ssp(html.escape(doctree.astext())),
+ })
+ break
+ elif isinstance(doctree, nodes.Element):
+ for elem in doctree:
+ result = self.get_refnodes(elem, result)
+ return result
+
+ def check_refnodes(self, nodes: list[dict[str, Any]]) -> None:
+ appeared: set[str] = set()
+ for node in nodes:
+ if node['refuri'] in appeared:
+ logger.warning(
+ __('duplicated ToC entry found: %s'),
+ node['refuri'],
+ type="epub",
+ subtype="duplicated_toc_entry",
+ )
+ else:
+ appeared.add(node['refuri'])
+
+ def get_toc(self) -> None:
+ """Get the total table of contents, containing the root_doc
+ and pre and post files not managed by sphinx.
+ """
+ doctree = self.env.get_and_resolve_doctree(self.config.root_doc,
+ self, prune_toctrees=False,
+ includehidden=True)
+ self.refnodes = self.get_refnodes(doctree, [])
+ master_dir = path.dirname(self.config.root_doc)
+ if master_dir:
+ master_dir += '/' # XXX or os.sep?
+ for item in self.refnodes:
+ item['refuri'] = master_dir + item['refuri']
+ self.toc_add_files(self.refnodes)
+
+ def toc_add_files(self, refnodes: list[dict[str, Any]]) -> None:
+ """Add the root_doc, pre and post files to a list of refnodes.
+ """
+ refnodes.insert(0, {
+ 'level': 1,
+ 'refuri': html.escape(self.config.root_doc + self.out_suffix),
+ 'text': ssp(html.escape(
+ self.env.titles[self.config.root_doc].astext())),
+ })
+ for file, text in reversed(self.config.epub_pre_files):
+ refnodes.insert(0, {
+ 'level': 1,
+ 'refuri': html.escape(file),
+ 'text': ssp(html.escape(text)),
+ })
+ for file, text in self.config.epub_post_files:
+ refnodes.append({
+ 'level': 1,
+ 'refuri': html.escape(file),
+ 'text': ssp(html.escape(text)),
+ })
+
+ def fix_fragment(self, prefix: str, fragment: str) -> str:
+ """Return a href/id attribute with colons replaced by hyphens."""
+ return prefix + fragment.replace(':', '-')
+
+ def fix_ids(self, tree: nodes.document) -> None:
+ """Replace colons with hyphens in href and id attributes.
+
+ Some readers crash because they interpret the part as a
+ transport protocol specification.
+ """
+ def update_node_id(node: Element) -> None:
+ """Update IDs of given *node*."""
+ new_ids: list[str] = []
+ for node_id in node['ids']:
+ new_id = self.fix_fragment('', node_id)
+ if new_id not in new_ids:
+ new_ids.append(new_id)
+ node['ids'] = new_ids
+
+ for reference in tree.findall(nodes.reference):
+ if 'refuri' in reference:
+ m = self.refuri_re.match(reference['refuri'])
+ if m:
+ reference['refuri'] = self.fix_fragment(m.group(1), m.group(2))
+ if 'refid' in reference:
+ reference['refid'] = self.fix_fragment('', reference['refid'])
+
+ for target in tree.findall(nodes.target):
+ update_node_id(target)
+
+ next_node: Node = target.next_node(ascend=True)
+ if isinstance(next_node, nodes.Element):
+ update_node_id(next_node)
+
+ for desc_signature in tree.findall(addnodes.desc_signature):
+ update_node_id(desc_signature)
+
+ def add_visible_links(self, tree: nodes.document, show_urls: str = 'inline') -> None:
+ """Add visible link targets for external links"""
+
+ def make_footnote_ref(doc: nodes.document, label: str) -> nodes.footnote_reference:
+ """Create a footnote_reference node with children"""
+ footnote_ref = nodes.footnote_reference('[#]_')
+ footnote_ref.append(nodes.Text(label))
+ doc.note_autofootnote_ref(footnote_ref)
+ return footnote_ref
+
+ def make_footnote(doc: nodes.document, label: str, uri: str) -> nodes.footnote:
+ """Create a footnote node with children"""
+ footnote = nodes.footnote(uri)
+ para = nodes.paragraph()
+ para.append(nodes.Text(uri))
+ footnote.append(para)
+ footnote.insert(0, nodes.label('', label))
+ doc.note_autofootnote(footnote)
+ return footnote
+
+ def footnote_spot(tree: nodes.document) -> tuple[Element, int]:
+ """Find or create a spot to place footnotes.
+
+ The function returns the tuple (parent, index)."""
+ # The code uses the following heuristic:
+ # a) place them after the last existing footnote
+ # b) place them after an (empty) Footnotes rubric
+ # c) create an empty Footnotes rubric at the end of the document
+ fns = list(tree.findall(nodes.footnote))
+ if fns:
+ fn = fns[-1]
+ return fn.parent, fn.parent.index(fn) + 1
+ for node in tree.findall(nodes.rubric):
+ if len(node) == 1 and node.astext() == FOOTNOTES_RUBRIC_NAME:
+ return node.parent, node.parent.index(node) + 1
+ doc = next(tree.findall(nodes.document))
+ rub = nodes.rubric()
+ rub.append(nodes.Text(FOOTNOTES_RUBRIC_NAME))
+ doc.append(rub)
+ return doc, doc.index(rub) + 1
+
+ if show_urls == 'no':
+ return
+ if show_urls == 'footnote':
+ doc = next(tree.findall(nodes.document))
+ fn_spot, fn_idx = footnote_spot(tree)
+ nr = 1
+ for node in list(tree.findall(nodes.reference)):
+ uri = node.get('refuri', '')
+ if uri.startswith(('http:', 'https:', 'ftp:')) and uri not in node.astext():
+ idx = node.parent.index(node) + 1
+ if show_urls == 'inline':
+ uri = self.link_target_template % {'uri': uri}
+ link = nodes.inline(uri, uri)
+ link['classes'].append(self.css_link_target_class)
+ node.parent.insert(idx, link)
+ elif show_urls == 'footnote':
+ label = FOOTNOTE_LABEL_TEMPLATE % nr
+ nr += 1
+ footnote_ref = make_footnote_ref(doc, label)
+ node.parent.insert(idx, footnote_ref)
+ footnote = make_footnote(doc, label, uri)
+ fn_spot.insert(fn_idx, footnote)
+ footnote_ref['refid'] = footnote['ids'][0]
+ footnote.add_backref(footnote_ref['ids'][0])
+ fn_idx += 1
+
+ def write_doc(self, docname: str, doctree: nodes.document) -> None:
+ """Write one document file.
+
+ This method is overwritten in order to fix fragment identifiers
+ and to add visible external links.
+ """
+ self.fix_ids(doctree)
+ self.add_visible_links(doctree, self.config.epub_show_urls)
+ super().write_doc(docname, doctree)
+
+ def fix_genindex(self, tree: list[tuple[str, list[tuple[str, Any]]]]) -> None:
+ """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, _key) in columns:
+ for (i, (ismain, link)) in enumerate(links):
+ m = self.refuri_re.match(link)
+ if m:
+ links[i] = (ismain,
+ self.fix_fragment(m.group(1), m.group(2)))
+ for _subentryname, subentrylinks in subitems:
+ for (i, (ismain, link)) in enumerate(subentrylinks):
+ m = self.refuri_re.match(link)
+ if m:
+ subentrylinks[i] = (ismain,
+ self.fix_fragment(m.group(1), m.group(2)))
+
+ def is_vector_graphics(self, filename: str) -> bool:
+ """Does the filename extension indicate a vector graphic format?"""
+ ext = path.splitext(filename)[-1]
+ return ext in VECTOR_GRAPHICS_EXTENSIONS
+
+ def copy_image_files_pil(self) -> None:
+ """Copy images using Pillow, the Python Imaging Library.
+ The method tries to read and write the files with Pillow, converting
+ the format and resizing the image if necessary/possible.
+ """
+ ensuredir(path.join(self.outdir, self.imagedir))
+ for src in status_iterator(self.images, __('copying images... '), "brown",
+ len(self.images), self.app.verbosity):
+ dest = self.images[src]
+ try:
+ img = Image.open(path.join(self.srcdir, src))
+ except OSError:
+ if not self.is_vector_graphics(src):
+ logger.warning(__('cannot read image file %r: copying it instead'),
+ path.join(self.srcdir, src))
+ try:
+ copyfile(path.join(self.srcdir, src),
+ path.join(self.outdir, self.imagedir, dest))
+ except OSError as err:
+ logger.warning(__('cannot copy image file %r: %s'),
+ path.join(self.srcdir, src), err)
+ continue
+ if self.config.epub_fix_images:
+ if img.mode in ('P',):
+ # See the Pillow documentation for Image.convert()
+ # https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.convert
+ img = img.convert()
+ if self.config.epub_max_image_width > 0:
+ (width, height) = img.size
+ nw = self.config.epub_max_image_width
+ if width > nw:
+ nh = round((height * nw) / width)
+ img = img.resize((nw, nh), Image.BICUBIC)
+ try:
+ img.save(path.join(self.outdir, self.imagedir, dest))
+ except OSError as err:
+ logger.warning(__('cannot write image file %r: %s'),
+ path.join(self.srcdir, src), err)
+
+ def copy_image_files(self) -> None:
+ """Copy image files to destination directory.
+ This overwritten method can use Pillow to convert image files.
+ """
+ if self.images:
+ if self.config.epub_fix_images or self.config.epub_max_image_width:
+ if not Image:
+ logger.warning(__('Pillow not found - copying image files'))
+ super().copy_image_files()
+ else:
+ self.copy_image_files_pil()
+ else:
+ super().copy_image_files()
+
+ def copy_download_files(self) -> None:
+ pass
+
+ def handle_page(self, pagename: str, addctx: dict, templatename: str = 'page.html',
+ outfilename: str | None = None, event_arg: Any = None) -> None:
+ """Create a rendered page.
+
+ This method is overwritten for genindex pages in order to fix href link
+ attributes.
+ """
+ if pagename.startswith('genindex') and 'genindexentries' in addctx:
+ if not self.use_index:
+ return
+ self.fix_genindex(addctx['genindexentries'])
+ addctx['doctype'] = self.doctype
+ super().handle_page(pagename, addctx, templatename, outfilename, event_arg)
+
+ def build_mimetype(self) -> None:
+ """Write the metainfo file mimetype."""
+ logger.info(__('writing mimetype file...'))
+ copy_asset_file(path.join(self.template_dir, 'mimetype'), self.outdir)
+
+ def build_container(self, outname: str = 'META-INF/container.xml') -> None:
+ """Write the metainfo file META-INF/container.xml."""
+ logger.info(__('writing META-INF/container.xml file...'))
+ outdir = path.join(self.outdir, 'META-INF')
+ ensuredir(outdir)
+ copy_asset_file(path.join(self.template_dir, 'container.xml'), outdir)
+
+ def content_metadata(self) -> dict[str, Any]:
+ """Create a dictionary with all metadata for the content.opf
+ file properly escaped.
+ """
+
+ if (source_date_epoch := os.getenv('SOURCE_DATE_EPOCH')) is not None:
+ time_tuple = time.gmtime(int(source_date_epoch))
+ else:
+ time_tuple = time.gmtime()
+
+ metadata: dict[str, Any] = {}
+ metadata['title'] = html.escape(self.config.epub_title)
+ metadata['author'] = html.escape(self.config.epub_author)
+ metadata['uid'] = html.escape(self.config.epub_uid)
+ metadata['lang'] = html.escape(self.config.epub_language)
+ metadata['publisher'] = html.escape(self.config.epub_publisher)
+ metadata['copyright'] = html.escape(self.config.epub_copyright)
+ metadata['scheme'] = html.escape(self.config.epub_scheme)
+ metadata['id'] = html.escape(self.config.epub_identifier)
+ metadata['date'] = html.escape(time.strftime('%Y-%m-%d', time_tuple))
+ metadata['manifest_items'] = []
+ metadata['spines'] = []
+ metadata['guides'] = []
+ return metadata
+
+ def build_content(self) -> None:
+ """Write the metainfo file content.opf It contains bibliographic data,
+ a file list and the spine (the reading order).
+ """
+ logger.info(__('writing content.opf file...'))
+ metadata = self.content_metadata()
+
+ # files
+ self.files: list[str] = []
+ self.ignored_files = ['.buildinfo', 'mimetype', 'content.opf',
+ 'toc.ncx', 'META-INF/container.xml',
+ 'Thumbs.db', 'ehthumbs.db', '.DS_Store',
+ 'nav.xhtml', self.config.epub_basename + '.epub'] + \
+ self.config.epub_exclude_files
+ if not self.use_index:
+ self.ignored_files.append('genindex' + self.out_suffix)
+ for root, dirs, files in os.walk(self.outdir):
+ dirs.sort()
+ for fn in sorted(files):
+ filename = relpath(path.join(root, fn), self.outdir)
+ if filename in self.ignored_files:
+ continue
+ ext = path.splitext(filename)[-1]
+ if ext not in self.media_types:
+ # we always have JS and potentially OpenSearch files, don't
+ # always warn about them
+ if ext not in ('.js', '.xml'):
+ logger.warning(__('unknown mimetype for %s, ignoring'), filename,
+ type='epub', subtype='unknown_project_files')
+ continue
+ filename = filename.replace(os.sep, '/')
+ item = ManifestItem(html.escape(quote(filename)),
+ html.escape(self.make_id(filename)),
+ html.escape(self.media_types[ext]))
+ metadata['manifest_items'].append(item)
+ self.files.append(filename)
+
+ # spine
+ spinefiles = set()
+ for refnode in self.refnodes:
+ if '#' in refnode['refuri']:
+ continue
+ if refnode['refuri'] in self.ignored_files:
+ continue
+ spine = Spine(html.escape(self.make_id(refnode['refuri'])), True)
+ metadata['spines'].append(spine)
+ spinefiles.add(refnode['refuri'])
+ for info in self.domain_indices:
+ spine = Spine(html.escape(self.make_id(info[0] + self.out_suffix)), True)
+ metadata['spines'].append(spine)
+ spinefiles.add(info[0] + self.out_suffix)
+ if self.use_index:
+ spine = Spine(html.escape(self.make_id('genindex' + self.out_suffix)), True)
+ metadata['spines'].append(spine)
+ spinefiles.add('genindex' + self.out_suffix)
+ # add auto generated files
+ for name in self.files:
+ if name not in spinefiles and name.endswith(self.out_suffix):
+ spine = Spine(html.escape(self.make_id(name)), False)
+ metadata['spines'].append(spine)
+
+ # add the optional cover
+ html_tmpl = None
+ if self.config.epub_cover:
+ image, html_tmpl = self.config.epub_cover
+ image = image.replace(os.sep, '/')
+ metadata['cover'] = html.escape(self.make_id(image))
+ if html_tmpl:
+ spine = Spine(html.escape(self.make_id(self.coverpage_name)), True)
+ metadata['spines'].insert(0, spine)
+ if self.coverpage_name not in self.files:
+ ext = path.splitext(self.coverpage_name)[-1]
+ self.files.append(self.coverpage_name)
+ item = ManifestItem(html.escape(self.coverpage_name),
+ html.escape(self.make_id(self.coverpage_name)),
+ html.escape(self.media_types[ext]))
+ metadata['manifest_items'].append(item)
+ ctx = {'image': html.escape(image), 'title': self.config.project}
+ self.handle_page(
+ path.splitext(self.coverpage_name)[0], ctx, html_tmpl)
+ spinefiles.add(self.coverpage_name)
+
+ auto_add_cover = True
+ auto_add_toc = True
+ if self.config.epub_guide:
+ for type, uri, title in self.config.epub_guide:
+ file = uri.split('#')[0]
+ if file not in self.files:
+ self.files.append(file)
+ if type == 'cover':
+ auto_add_cover = False
+ if type == 'toc':
+ auto_add_toc = False
+ metadata['guides'].append(Guide(html.escape(type),
+ html.escape(title),
+ html.escape(uri)))
+ if auto_add_cover and html_tmpl:
+ metadata['guides'].append(Guide('cover',
+ self.guide_titles['cover'],
+ html.escape(self.coverpage_name)))
+ if auto_add_toc and self.refnodes:
+ metadata['guides'].append(Guide('toc',
+ self.guide_titles['toc'],
+ html.escape(self.refnodes[0]['refuri'])))
+
+ # write the project file
+ copy_asset_file(path.join(self.template_dir, 'content.opf_t'), self.outdir, metadata)
+
+ def new_navpoint(self, node: dict[str, Any], level: int, incr: bool = True) -> NavPoint:
+ """Create a new entry in the toc from the node at given level."""
+ # XXX Modifies the node
+ if incr:
+ self.playorder += 1
+ self.tocid += 1
+ return NavPoint('navPoint%d' % self.tocid, self.playorder,
+ node['text'], node['refuri'], [])
+
+ def build_navpoints(self, nodes: list[dict[str, Any]]) -> list[NavPoint]:
+ """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.
+ """
+ navstack: list[NavPoint] = []
+ navstack.append(NavPoint('dummy', 0, '', '', []))
+ level = 0
+ lastnode = None
+ for node in nodes:
+ if not node['text']:
+ continue
+ file = node['refuri'].split('#')[0]
+ if file in self.ignored_files:
+ continue
+ if node['level'] > self.config.epub_tocdepth:
+ continue
+ if node['level'] == level:
+ navpoint = self.new_navpoint(node, level)
+ navstack.pop()
+ navstack[-1].children.append(navpoint)
+ navstack.append(navpoint)
+ elif node['level'] == level + 1:
+ level += 1
+ if lastnode and self.config.epub_tocdup:
+ # Insert starting point in subtoc with same playOrder
+ navstack[-1].children.append(self.new_navpoint(lastnode, level, False))
+ navpoint = self.new_navpoint(node, level)
+ navstack[-1].children.append(navpoint)
+ navstack.append(navpoint)
+ elif node['level'] < level:
+ while node['level'] < len(navstack):
+ navstack.pop()
+ level = node['level']
+ navpoint = self.new_navpoint(node, level)
+ navstack[-1].children.append(navpoint)
+ navstack.append(navpoint)
+ else:
+ raise
+ lastnode = node
+
+ return navstack[0].children
+
+ def toc_metadata(self, level: int, navpoints: list[NavPoint]) -> dict[str, Any]:
+ """Create a dictionary with all metadata for the toc.ncx file
+ properly escaped.
+ """
+ metadata: dict[str, Any] = {}
+ metadata['uid'] = self.config.epub_uid
+ metadata['title'] = html.escape(self.config.epub_title)
+ metadata['level'] = level
+ metadata['navpoints'] = navpoints
+ return metadata
+
+ def build_toc(self) -> None:
+ """Write the metainfo file toc.ncx."""
+ logger.info(__('writing toc.ncx file...'))
+
+ if self.config.epub_tocscope == 'default':
+ doctree = self.env.get_and_resolve_doctree(self.config.root_doc,
+ self, prune_toctrees=False,
+ includehidden=False)
+ refnodes = self.get_refnodes(doctree, [])
+ self.toc_add_files(refnodes)
+ else:
+ # 'includehidden'
+ refnodes = self.refnodes
+ self.check_refnodes(refnodes)
+ navpoints = self.build_navpoints(refnodes)
+ level = max(item['level'] for item in self.refnodes)
+ level = min(level, self.config.epub_tocdepth)
+ copy_asset_file(path.join(self.template_dir, 'toc.ncx_t'), self.outdir,
+ self.toc_metadata(level, navpoints))
+
+ def build_epub(self) -> None:
+ """Write the epub file.
+
+ It is a zip file with the mimetype file stored uncompressed as the first
+ entry.
+ """
+ outname = self.config.epub_basename + '.epub'
+ logger.info(__('writing %s file...'), outname)
+ epub_filename = path.join(self.outdir, outname)
+ with ZipFile(epub_filename, 'w', ZIP_DEFLATED) as epub:
+ epub.write(path.join(self.outdir, 'mimetype'), 'mimetype', ZIP_STORED)
+ for filename in ('META-INF/container.xml', 'content.opf', 'toc.ncx'):
+ epub.write(path.join(self.outdir, filename), filename, ZIP_DEFLATED)
+ for filename in self.files:
+ epub.write(path.join(self.outdir, filename), filename, ZIP_DEFLATED)
diff --git a/sphinx/builders/changes.py b/sphinx/builders/changes.py
new file mode 100644
index 0000000..3e24e7d
--- /dev/null
+++ b/sphinx/builders/changes.py
@@ -0,0 +1,161 @@
+"""Changelog builder."""
+
+from __future__ import annotations
+
+import html
+from os import path
+from typing import TYPE_CHECKING, Any, cast
+
+from sphinx import package_dir
+from sphinx.builders import Builder
+from sphinx.domains.changeset import ChangeSetDomain
+from sphinx.locale import _, __
+from sphinx.theming import HTMLThemeFactory
+from sphinx.util import logging
+from sphinx.util.console import bold # type: ignore[attr-defined]
+from sphinx.util.fileutil import copy_asset_file
+from sphinx.util.osutil import ensuredir, os_path
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class ChangesBuilder(Builder):
+ """
+ Write a summary with all versionadded/changed directives.
+ """
+ name = 'changes'
+ epilog = __('The overview file is in %(outdir)s.')
+
+ def init(self) -> None:
+ self.create_template_bridge()
+ theme_factory = HTMLThemeFactory(self.app)
+ self.theme = theme_factory.create('default')
+ self.templates.init(self, self.theme)
+
+ def get_outdated_docs(self) -> str:
+ return str(self.outdir)
+
+ typemap = {
+ 'versionadded': 'added',
+ 'versionchanged': 'changed',
+ 'deprecated': 'deprecated',
+ }
+
+ def write(self, *ignored: Any) -> None:
+ version = self.config.version
+ domain = cast(ChangeSetDomain, self.env.get_domain('changeset'))
+ libchanges: dict[str, list[tuple[str, str, int]]] = {}
+ apichanges: list[tuple[str, str, int]] = []
+ otherchanges: dict[tuple[str, str], list[tuple[str, str, int]]] = {}
+
+ changesets = domain.get_changesets_for(version)
+ if not changesets:
+ logger.info(bold(__('no changes in version %s.') % version))
+ return
+ logger.info(bold(__('writing summary file...')))
+ for changeset in changesets:
+ if isinstance(changeset.descname, tuple):
+ descname = changeset.descname[0]
+ else:
+ descname = changeset.descname
+ ttext = self.typemap[changeset.type]
+ context = changeset.content.replace('\n', ' ')
+ if descname and changeset.docname.startswith('c-api'):
+ if context:
+ entry = f'<b>{descname}</b>: <i>{ttext}:</i> {context}'
+ else:
+ entry = f'<b>{descname}</b>: <i>{ttext}</i>.'
+ apichanges.append((entry, changeset.docname, changeset.lineno))
+ elif descname or changeset.module:
+ module = changeset.module or _('Builtins')
+ if not descname:
+ descname = _('Module level')
+ if context:
+ entry = f'<b>{descname}</b>: <i>{ttext}:</i> {context}'
+ else:
+ entry = f'<b>{descname}</b>: <i>{ttext}</i>.'
+ libchanges.setdefault(module, []).append((entry, changeset.docname,
+ changeset.lineno))
+ else:
+ if not context:
+ continue
+ entry = f'<i>{ttext.capitalize()}:</i> {context}'
+ title = self.env.titles[changeset.docname].astext()
+ otherchanges.setdefault((changeset.docname, title), []).append(
+ (entry, changeset.docname, changeset.lineno))
+
+ ctx = {
+ 'project': self.config.project,
+ 'version': version,
+ 'docstitle': self.config.html_title,
+ 'shorttitle': self.config.html_short_title,
+ 'libchanges': sorted(libchanges.items()),
+ 'apichanges': sorted(apichanges),
+ 'otherchanges': sorted(otherchanges.items()),
+ 'show_copyright': self.config.html_show_copyright,
+ 'show_sphinx': self.config.html_show_sphinx,
+ }
+ with open(path.join(self.outdir, 'index.html'), 'w', encoding='utf8') as f:
+ f.write(self.templates.render('changes/frameset.html', ctx))
+ with open(path.join(self.outdir, 'changes.html'), 'w', encoding='utf8') as f:
+ f.write(self.templates.render('changes/versionchanges.html', ctx))
+
+ hltext = ['.. versionadded:: %s' % version,
+ '.. versionchanged:: %s' % version,
+ '.. deprecated:: %s' % version]
+
+ def hl(no: int, line: str) -> str:
+ line = '<a name="L%s"> </a>' % no + html.escape(line)
+ for x in hltext:
+ if x in line:
+ line = '<span class="hl">%s</span>' % line
+ break
+ return line
+
+ logger.info(bold(__('copying source files...')))
+ for docname in self.env.all_docs:
+ with open(self.env.doc2path(docname),
+ encoding=self.env.config.source_encoding) as f:
+ try:
+ lines = f.readlines()
+ except UnicodeDecodeError:
+ logger.warning(__('could not read %r for changelog creation'), docname)
+ continue
+ targetfn = path.join(self.outdir, 'rst', os_path(docname)) + '.html'
+ ensuredir(path.dirname(targetfn))
+ with open(targetfn, 'w', encoding='utf-8') as f:
+ text = ''.join(hl(i + 1, line) for (i, line) in enumerate(lines))
+ ctx = {
+ 'filename': self.env.doc2path(docname, False),
+ 'text': text,
+ }
+ f.write(self.templates.render('changes/rstsource.html', ctx))
+ themectx = {'theme_' + key: val for (key, val) in
+ self.theme.get_options({}).items()}
+ copy_asset_file(path.join(package_dir, 'themes', 'default', 'static', 'default.css_t'),
+ self.outdir, context=themectx, renderer=self.templates)
+ copy_asset_file(path.join(package_dir, 'themes', 'basic', 'static', 'basic.css'),
+ self.outdir)
+
+ def hl(self, text: str, version: str) -> str:
+ text = html.escape(text)
+ for directive in ('versionchanged', 'versionadded', 'deprecated'):
+ text = text.replace(f'.. {directive}:: {version}',
+ f'<b>.. {directive}:: {version}</b>')
+ return text
+
+ def finish(self) -> None:
+ pass
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(ChangesBuilder)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/dirhtml.py b/sphinx/builders/dirhtml.py
new file mode 100644
index 0000000..9683ee6
--- /dev/null
+++ b/sphinx/builders/dirhtml.py
@@ -0,0 +1,53 @@
+"""Directory HTML builders."""
+
+from __future__ import annotations
+
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.util import logging
+from sphinx.util.osutil import SEP, os_path
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class DirectoryHTMLBuilder(StandaloneHTMLBuilder):
+ """
+ A StandaloneHTMLBuilder that creates all HTML pages as "index.html" in
+ a directory given by their pagename, so that generated URLs don't have
+ ``.html`` in them.
+ """
+ name = 'dirhtml'
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ if docname == 'index':
+ return ''
+ if docname.endswith(SEP + 'index'):
+ return docname[:-5] # up to sep
+ return docname + SEP
+
+ def get_outfilename(self, pagename: str) -> str:
+ if pagename == 'index' or pagename.endswith(SEP + 'index'):
+ outfilename = path.join(self.outdir, os_path(pagename) +
+ self.out_suffix)
+ else:
+ outfilename = path.join(self.outdir, os_path(pagename),
+ 'index' + self.out_suffix)
+
+ return outfilename
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.setup_extension('sphinx.builders.html')
+
+ app.add_builder(DirectoryHTMLBuilder)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/dummy.py b/sphinx/builders/dummy.py
new file mode 100644
index 0000000..f025311
--- /dev/null
+++ b/sphinx/builders/dummy.py
@@ -0,0 +1,48 @@
+"""Do syntax checks, but no writing."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from sphinx.builders import Builder
+from sphinx.locale import __
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+
+class DummyBuilder(Builder):
+ name = 'dummy'
+ epilog = __('The dummy builder generates no files.')
+
+ allow_parallel = True
+
+ def init(self) -> None:
+ pass
+
+ def get_outdated_docs(self) -> set[str]:
+ return self.env.found_docs
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ return ''
+
+ def prepare_writing(self, docnames: set[str]) -> None:
+ pass
+
+ def write_doc(self, docname: str, doctree: Node) -> None:
+ pass
+
+ def finish(self) -> None:
+ pass
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(DummyBuilder)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/epub3.py b/sphinx/builders/epub3.py
new file mode 100644
index 0000000..40d3ce7
--- /dev/null
+++ b/sphinx/builders/epub3.py
@@ -0,0 +1,301 @@
+"""Build epub3 files.
+
+Originally derived from epub.py.
+"""
+
+from __future__ import annotations
+
+import html
+import os
+import re
+import time
+from os import path
+from typing import TYPE_CHECKING, Any, NamedTuple
+
+from sphinx import package_dir
+from sphinx.builders import _epub_base
+from sphinx.config import ENUM, Config
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.fileutil import copy_asset_file
+from sphinx.util.osutil import make_filename
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class NavPoint(NamedTuple):
+ text: str
+ refuri: str
+ children: list[NavPoint]
+
+
+# writing modes
+PAGE_PROGRESSION_DIRECTIONS = {
+ 'horizontal': 'ltr',
+ 'vertical': 'rtl',
+}
+IBOOK_SCROLL_AXIS = {
+ 'horizontal': 'vertical',
+ 'vertical': 'horizontal',
+}
+THEME_WRITING_MODES = {
+ 'vertical': 'vertical-rl',
+ 'horizontal': 'horizontal-tb',
+}
+
+DOCTYPE = '''<!DOCTYPE html>'''
+
+HTML_TAG = (
+ '<html xmlns="http://www.w3.org/1999/xhtml" '
+ 'xmlns:epub="http://www.idpf.org/2007/ops">'
+)
+
+# https://www.w3.org/TR/REC-xml/#NT-Name
+_xml_name_start_char = (
+ ':|[A-Z]|_|[a-z]|[\u00C0-\u00D6]'
+ '|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]'
+ '|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]'
+ '|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]'
+ '|[\uFDF0-\uFFFD]|[\U00010000-\U000EFFFF]'
+)
+_xml_name_char = (
+ _xml_name_start_char + r'\-|\.' '|[0-9]|\u00B7|[\u0300-\u036F]|[\u203F-\u2040]'
+)
+_XML_NAME_PATTERN = re.compile(f'({_xml_name_start_char})({_xml_name_char})*')
+
+
+class Epub3Builder(_epub_base.EpubBuilder):
+ """
+ Builder that outputs epub3 files.
+
+ It creates the metainfo files content.opf, nav.xhtml, toc.ncx, mimetype,
+ and META-INF/container.xml. Afterwards, all necessary files are zipped to
+ an epub file.
+ """
+ name = 'epub'
+ epilog = __('The ePub file is in %(outdir)s.')
+
+ supported_remote_images = False
+ template_dir = path.join(package_dir, 'templates', 'epub3')
+ doctype = DOCTYPE
+ html_tag = HTML_TAG
+ use_meta_charset = True
+
+ # Finish by building the epub file
+ def handle_finish(self) -> None:
+ """Create the metainfo files and finally the epub."""
+ self.get_toc()
+ self.build_mimetype()
+ self.build_container()
+ self.build_content()
+ self.build_navigation_doc()
+ self.build_toc()
+ self.build_epub()
+
+ def content_metadata(self) -> dict[str, Any]:
+ """Create a dictionary with all metadata for the content.opf
+ file properly escaped.
+ """
+ writing_mode = self.config.epub_writing_mode
+
+ if (source_date_epoch := os.getenv('SOURCE_DATE_EPOCH')) is not None:
+ time_tuple = time.gmtime(int(source_date_epoch))
+ else:
+ time_tuple = time.gmtime()
+
+ metadata = super().content_metadata()
+ metadata['description'] = html.escape(self.config.epub_description)
+ metadata['contributor'] = html.escape(self.config.epub_contributor)
+ metadata['page_progression_direction'] = PAGE_PROGRESSION_DIRECTIONS.get(writing_mode)
+ metadata['ibook_scroll_axis'] = IBOOK_SCROLL_AXIS.get(writing_mode)
+ metadata['date'] = html.escape(time.strftime("%Y-%m-%dT%H:%M:%SZ", time_tuple))
+ metadata['version'] = html.escape(self.config.version)
+ metadata['epub_version'] = self.config.epub_version
+ return metadata
+
+ def prepare_writing(self, docnames: set[str]) -> None:
+ super().prepare_writing(docnames)
+
+ writing_mode = self.config.epub_writing_mode
+ self.globalcontext['theme_writing_mode'] = THEME_WRITING_MODES.get(writing_mode)
+ self.globalcontext['html_tag'] = self.html_tag
+ self.globalcontext['use_meta_charset'] = self.use_meta_charset
+ self.globalcontext['skip_ua_compatible'] = True
+
+ def build_navlist(self, navnodes: list[dict[str, Any]]) -> list[NavPoint]:
+ """Create the toc navigation structure.
+
+ This method is almost same as build_navpoints method in epub.py.
+ This is because the logical navigation structure of epub3 is not
+ different from one of epub2.
+
+ The difference from build_navpoints method is templates which are used
+ when generating navigation documents.
+ """
+ navstack: list[NavPoint] = []
+ navstack.append(NavPoint('', '', []))
+ level = 0
+ for node in navnodes:
+ if not node['text']:
+ continue
+ file = node['refuri'].split('#')[0]
+ if file in self.ignored_files:
+ continue
+ if node['level'] > self.config.epub_tocdepth:
+ continue
+
+ navpoint = NavPoint(node['text'], node['refuri'], [])
+ if node['level'] == level:
+ navstack.pop()
+ navstack[-1].children.append(navpoint)
+ navstack.append(navpoint)
+ elif node['level'] == level + 1:
+ level += 1
+ navstack[-1].children.append(navpoint)
+ navstack.append(navpoint)
+ elif node['level'] < level:
+ while node['level'] < len(navstack):
+ navstack.pop()
+ level = node['level']
+ navstack[-1].children.append(navpoint)
+ navstack.append(navpoint)
+ else:
+ unreachable = 'Should never reach here. It might be a bug.'
+ raise RuntimeError(unreachable)
+
+ return navstack[0].children
+
+ def navigation_doc_metadata(self, navlist: list[NavPoint]) -> dict[str, Any]:
+ """Create a dictionary with all metadata for the nav.xhtml file
+ properly escaped.
+ """
+ return {
+ 'lang': html.escape(self.config.epub_language),
+ 'toc_locale': html.escape(self.guide_titles['toc']),
+ 'navlist': navlist,
+ }
+
+ def build_navigation_doc(self) -> None:
+ """Write the metainfo file nav.xhtml."""
+ logger.info(__('writing nav.xhtml file...'))
+
+ if self.config.epub_tocscope == 'default':
+ doctree = self.env.get_and_resolve_doctree(
+ self.config.root_doc, self,
+ prune_toctrees=False, includehidden=False)
+ refnodes = self.get_refnodes(doctree, [])
+ self.toc_add_files(refnodes)
+ else:
+ # 'includehidden'
+ refnodes = self.refnodes
+ navlist = self.build_navlist(refnodes)
+ copy_asset_file(path.join(self.template_dir, 'nav.xhtml_t'), self.outdir,
+ self.navigation_doc_metadata(navlist))
+
+ # Add nav.xhtml to epub file
+ if 'nav.xhtml' not in self.files:
+ self.files.append('nav.xhtml')
+
+
+def validate_config_values(app: Sphinx) -> None:
+ if app.builder.name != 'epub':
+ return
+
+ # <package> lang attribute, dc:language
+ if not app.config.epub_language:
+ logger.warning(__('conf value "epub_language" (or "language") '
+ 'should not be empty for EPUB3'))
+ # <package> unique-identifier attribute
+ if not _XML_NAME_PATTERN.match(app.config.epub_uid):
+ logger.warning(__('conf value "epub_uid" should be XML NAME for EPUB3'))
+ # dc:title
+ if not app.config.epub_title:
+ logger.warning(__('conf value "epub_title" (or "html_title") '
+ 'should not be empty for EPUB3'))
+ # dc:creator
+ if not app.config.epub_author:
+ logger.warning(__('conf value "epub_author" should not be empty for EPUB3'))
+ # dc:contributor
+ if not app.config.epub_contributor:
+ logger.warning(__('conf value "epub_contributor" should not be empty for EPUB3'))
+ # dc:description
+ if not app.config.epub_description:
+ logger.warning(__('conf value "epub_description" should not be empty for EPUB3'))
+ # dc:publisher
+ if not app.config.epub_publisher:
+ logger.warning(__('conf value "epub_publisher" should not be empty for EPUB3'))
+ # dc:rights
+ if not app.config.epub_copyright:
+ logger.warning(__('conf value "epub_copyright" (or "copyright")'
+ 'should not be empty for EPUB3'))
+ # dc:identifier
+ if not app.config.epub_identifier:
+ logger.warning(__('conf value "epub_identifier" should not be empty for EPUB3'))
+ # meta ibooks:version
+ if not app.config.version:
+ logger.warning(__('conf value "version" should not be empty for EPUB3'))
+
+
+def convert_epub_css_files(app: Sphinx, config: Config) -> None:
+ """This converts string styled epub_css_files to tuple styled one."""
+ epub_css_files: list[tuple[str, dict[str, Any]]] = []
+ for entry in config.epub_css_files:
+ if isinstance(entry, str):
+ epub_css_files.append((entry, {}))
+ else:
+ try:
+ filename, attrs = entry
+ epub_css_files.append((filename, attrs))
+ except Exception:
+ logger.warning(__('invalid css_file: %r, ignored'), entry)
+ continue
+
+ config.epub_css_files = epub_css_files # type: ignore[attr-defined]
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(Epub3Builder)
+
+ # config values
+ app.add_config_value('epub_basename', lambda self: make_filename(self.project), False)
+ app.add_config_value('epub_version', 3.0, 'epub') # experimental
+ app.add_config_value('epub_theme', 'epub', 'epub')
+ app.add_config_value('epub_theme_options', {}, 'epub')
+ app.add_config_value('epub_title', lambda self: self.project, 'epub')
+ app.add_config_value('epub_author', lambda self: self.author, 'epub')
+ app.add_config_value('epub_language', lambda self: self.language or 'en', 'epub')
+ app.add_config_value('epub_publisher', lambda self: self.author, 'epub')
+ app.add_config_value('epub_copyright', lambda self: self.copyright, 'epub')
+ app.add_config_value('epub_identifier', 'unknown', 'epub')
+ app.add_config_value('epub_scheme', 'unknown', 'epub')
+ app.add_config_value('epub_uid', 'unknown', 'env')
+ app.add_config_value('epub_cover', (), 'env')
+ app.add_config_value('epub_guide', (), 'env')
+ app.add_config_value('epub_pre_files', [], 'env')
+ app.add_config_value('epub_post_files', [], 'env')
+ app.add_config_value('epub_css_files', lambda config: config.html_css_files, 'epub')
+ app.add_config_value('epub_exclude_files', [], 'env')
+ app.add_config_value('epub_tocdepth', 3, 'env')
+ app.add_config_value('epub_tocdup', True, 'env')
+ app.add_config_value('epub_tocscope', 'default', 'env')
+ app.add_config_value('epub_fix_images', False, 'env')
+ app.add_config_value('epub_max_image_width', 0, 'env')
+ app.add_config_value('epub_show_urls', 'inline', 'epub')
+ app.add_config_value('epub_use_index', lambda self: self.html_use_index, 'epub')
+ app.add_config_value('epub_description', 'unknown', 'epub')
+ app.add_config_value('epub_contributor', 'unknown', 'epub')
+ app.add_config_value('epub_writing_mode', 'horizontal', 'epub',
+ ENUM('horizontal', 'vertical'))
+
+ # event handlers
+ app.connect('config-inited', convert_epub_css_files, priority=800)
+ app.connect('builder-inited', validate_config_values)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py
new file mode 100644
index 0000000..0b2bede
--- /dev/null
+++ b/sphinx/builders/gettext.py
@@ -0,0 +1,306 @@
+"""The MessageCatalogBuilder class."""
+
+from __future__ import annotations
+
+import time
+from codecs import open
+from collections import defaultdict
+from os import getenv, path, walk
+from typing import TYPE_CHECKING, Any
+from uuid import uuid4
+
+from docutils import nodes
+
+from sphinx import addnodes, package_dir
+from sphinx.builders import Builder
+from sphinx.errors import ThemeError
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.console import bold # type: ignore[attr-defined]
+from sphinx.util.display import status_iterator
+from sphinx.util.i18n import CatalogInfo, docname_to_domain
+from sphinx.util.index_entries import split_index_msg
+from sphinx.util.nodes import extract_messages, traverse_translatable_index
+from sphinx.util.osutil import canon_path, ensuredir, relpath
+from sphinx.util.tags import Tags
+from sphinx.util.template import SphinxRenderer
+
+if TYPE_CHECKING:
+ import os
+ from collections.abc import Generator, Iterable
+
+ from docutils.nodes import Element
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class Message:
+ """An entry of translatable message."""
+ def __init__(self, text: str, locations: list[tuple[str, int]], uuids: list[str]):
+ self.text = text
+ self.locations = locations
+ self.uuids = uuids
+
+
+class Catalog:
+ """Catalog of translatable messages."""
+
+ def __init__(self) -> None:
+ self.messages: list[str] = [] # retain insertion order
+
+ # msgid -> file, line, uid
+ self.metadata: dict[str, list[tuple[str, int, str]]] = {}
+
+ def add(self, msg: str, origin: Element | MsgOrigin) -> None:
+ if not hasattr(origin, 'uid'):
+ # Nodes that are replicated like todo don't have a uid,
+ # however i18n is also unnecessary.
+ return
+ if msg not in self.metadata: # faster lookup in hash
+ self.messages.append(msg)
+ self.metadata[msg] = []
+ line = origin.line
+ if line is None:
+ line = -1
+ self.metadata[msg].append((origin.source, line, origin.uid))
+
+ def __iter__(self) -> Generator[Message, None, None]:
+ for message in self.messages:
+ positions = sorted({(source, line) for source, line, uuid
+ in self.metadata[message]})
+ uuids = [uuid for source, line, uuid in self.metadata[message]]
+ yield Message(message, positions, uuids)
+
+
+class MsgOrigin:
+ """
+ Origin holder for Catalog message origin.
+ """
+
+ def __init__(self, source: str, line: int) -> None:
+ self.source = source
+ self.line = line
+ self.uid = uuid4().hex
+
+
+class GettextRenderer(SphinxRenderer):
+ def __init__(
+ self, template_path: list[str | os.PathLike[str]] | None = None,
+ outdir: str | os.PathLike[str] | None = None,
+ ) -> None:
+ self.outdir = outdir
+ if template_path is None:
+ template_path = [path.join(package_dir, 'templates', 'gettext')]
+ super().__init__(template_path)
+
+ def escape(s: str) -> str:
+ s = s.replace('\\', r'\\')
+ s = s.replace('"', r'\"')
+ return s.replace('\n', '\\n"\n"')
+
+ # use texescape as escape filter
+ self.env.filters['e'] = escape
+ self.env.filters['escape'] = escape
+
+ def render(self, filename: str, context: dict[str, Any]) -> str:
+ def _relpath(s: str) -> str:
+ return canon_path(relpath(s, self.outdir))
+
+ context['relpath'] = _relpath
+ return super().render(filename, context)
+
+
+class I18nTags(Tags):
+ """Dummy tags module for I18nBuilder.
+
+ To translate all text inside of only nodes, this class
+ always returns True value even if no tags are defined.
+ """
+ def eval_condition(self, condition: Any) -> bool:
+ return True
+
+
+class I18nBuilder(Builder):
+ """
+ General i18n builder.
+ """
+ name = 'i18n'
+ versioning_method = 'text'
+ use_message_catalog = False
+
+ def init(self) -> None:
+ super().init()
+ self.env.set_versioning_method(self.versioning_method,
+ self.env.config.gettext_uuid)
+ self.tags = I18nTags()
+ self.catalogs: defaultdict[str, Catalog] = defaultdict(Catalog)
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ return ''
+
+ def get_outdated_docs(self) -> set[str]:
+ return self.env.found_docs
+
+ def prepare_writing(self, docnames: set[str]) -> None:
+ return
+
+ def compile_catalogs(self, catalogs: set[CatalogInfo], message: str) -> None:
+ return
+
+ def write_doc(self, docname: str, doctree: nodes.document) -> None:
+ catalog = self.catalogs[docname_to_domain(docname, self.config.gettext_compact)]
+
+ for toctree in self.env.tocs[docname].findall(addnodes.toctree):
+ for node, msg in extract_messages(toctree):
+ node.uid = '' # type: ignore[attr-defined] # Hack UUID model
+ catalog.add(msg, node)
+
+ for node, msg in extract_messages(doctree):
+ # Do not extract messages from within substitution definitions.
+ if not _is_node_in_substitution_definition(node):
+ catalog.add(msg, node)
+
+ if 'index' in self.env.config.gettext_additional_targets:
+ # Extract translatable messages from index entries.
+ for node, entries in traverse_translatable_index(doctree):
+ for entry_type, value, _target_id, _main, _category_key in entries:
+ for m in split_index_msg(entry_type, value):
+ catalog.add(m, node)
+
+
+# If set, use the timestamp from SOURCE_DATE_EPOCH
+# https://reproducible-builds.org/specs/source-date-epoch/
+if (source_date_epoch := getenv('SOURCE_DATE_EPOCH')) is not None:
+ timestamp = time.gmtime(float(source_date_epoch))
+else:
+ # determine timestamp once to remain unaffected by DST changes during build
+ timestamp = time.localtime()
+ctime = time.strftime('%Y-%m-%d %H:%M%z', timestamp)
+
+
+def should_write(filepath: str, new_content: str) -> bool:
+ if not path.exists(filepath):
+ return True
+ try:
+ with open(filepath, encoding='utf-8') as oldpot:
+ old_content = oldpot.read()
+ old_header_index = old_content.index('"POT-Creation-Date:')
+ new_header_index = new_content.index('"POT-Creation-Date:')
+ old_body_index = old_content.index('"PO-Revision-Date:')
+ new_body_index = new_content.index('"PO-Revision-Date:')
+ return ((old_content[:old_header_index] != new_content[:new_header_index]) or
+ (new_content[new_body_index:] != old_content[old_body_index:]))
+ except ValueError:
+ pass
+
+ return True
+
+
+def _is_node_in_substitution_definition(node: nodes.Node) -> bool:
+ """Check "node" to test if it is in a substitution definition."""
+ while node.parent:
+ if isinstance(node, nodes.substitution_definition):
+ return True
+ node = node.parent
+ return False
+
+
+class MessageCatalogBuilder(I18nBuilder):
+ """
+ Builds gettext-style message catalogs (.pot files).
+ """
+ name = 'gettext'
+ epilog = __('The message catalogs are in %(outdir)s.')
+
+ def init(self) -> None:
+ super().init()
+ self.create_template_bridge()
+ self.templates.init(self)
+
+ def _collect_templates(self) -> set[str]:
+ template_files = set()
+ for template_path in self.config.templates_path:
+ tmpl_abs_path = path.join(self.app.srcdir, template_path)
+ for dirpath, _dirs, files in walk(tmpl_abs_path):
+ for fn in files:
+ if fn.endswith('.html'):
+ filename = canon_path(path.join(dirpath, fn))
+ template_files.add(filename)
+ return template_files
+
+ def _extract_from_template(self) -> None:
+ files = list(self._collect_templates())
+ files.sort()
+ logger.info(bold(__('building [%s]: ') % self.name), nonl=True)
+ logger.info(__('targets for %d template files'), len(files))
+
+ extract_translations = self.templates.environment.extract_translations
+
+ for template in status_iterator(files, __('reading templates... '), "purple",
+ len(files), self.app.verbosity):
+ try:
+ with open(template, encoding='utf-8') as f:
+ context = f.read()
+ for line, _meth, msg in extract_translations(context):
+ origin = MsgOrigin(template, line)
+ self.catalogs['sphinx'].add(msg, origin)
+ except Exception as exc:
+ msg = f'{template}: {exc!r}'
+ raise ThemeError(msg) from exc
+
+ def build(
+ self,
+ docnames: Iterable[str] | None,
+ summary: str | None = None,
+ method: str = 'update',
+ ) -> None:
+ self._extract_from_template()
+ super().build(docnames, summary, method)
+
+ def finish(self) -> None:
+ super().finish()
+ context = {
+ 'version': self.config.version,
+ 'copyright': self.config.copyright,
+ 'project': self.config.project,
+ 'last_translator': self.config.gettext_last_translator,
+ 'language_team': self.config.gettext_language_team,
+ 'ctime': ctime,
+ 'display_location': self.config.gettext_location,
+ 'display_uuid': self.config.gettext_uuid,
+ }
+ for textdomain, catalog in status_iterator(self.catalogs.items(),
+ __("writing message catalogs... "),
+ "darkgreen", len(self.catalogs),
+ self.app.verbosity,
+ lambda textdomain__: textdomain__[0]):
+ # noop if config.gettext_compact is set
+ ensuredir(path.join(self.outdir, path.dirname(textdomain)))
+
+ context['messages'] = list(catalog)
+ content = GettextRenderer(outdir=self.outdir).render('message.pot_t', context)
+
+ pofn = path.join(self.outdir, textdomain + '.pot')
+ if should_write(pofn, content):
+ with open(pofn, 'w', encoding='utf-8') as pofile:
+ pofile.write(content)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(MessageCatalogBuilder)
+
+ app.add_config_value('gettext_compact', True, 'gettext', {bool, str})
+ app.add_config_value('gettext_location', True, 'gettext')
+ app.add_config_value('gettext_uuid', False, 'gettext')
+ app.add_config_value('gettext_auto_build', True, 'env')
+ app.add_config_value('gettext_additional_targets', [], 'env')
+ app.add_config_value('gettext_last_translator', 'FULL NAME <EMAIL@ADDRESS>', 'gettext')
+ app.add_config_value('gettext_language_team', 'LANGUAGE <LL@li.org>', 'gettext')
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/html/__init__.py b/sphinx/builders/html/__init__.py
new file mode 100644
index 0000000..85067be
--- /dev/null
+++ b/sphinx/builders/html/__init__.py
@@ -0,0 +1,1399 @@
+"""Several HTML builders."""
+
+from __future__ import annotations
+
+import contextlib
+import hashlib
+import html
+import os
+import posixpath
+import re
+import sys
+import time
+import warnings
+from os import path
+from typing import IO, TYPE_CHECKING, Any
+from urllib.parse import quote
+
+import docutils.readers.doctree
+from docutils import nodes
+from docutils.core import Publisher
+from docutils.frontend import OptionParser
+from docutils.io import DocTreeInput, StringOutput
+from docutils.utils import relative_path
+
+from sphinx import __display_version__, package_dir
+from sphinx import version_info as sphinx_version
+from sphinx.builders import Builder
+from sphinx.builders.html._assets import _CascadingStyleSheet, _file_checksum, _JavaScript
+from sphinx.config import ENUM, Config
+from sphinx.deprecation import _deprecation_warning
+from sphinx.domains import Domain, Index, IndexEntry
+from sphinx.environment.adapters.asset import ImageAdapter
+from sphinx.environment.adapters.indexentries import IndexEntries
+from sphinx.environment.adapters.toctree import document_toc, global_toctree_for_doc
+from sphinx.errors import ConfigError, ThemeError
+from sphinx.highlighting import PygmentsBridge
+from sphinx.locale import _, __
+from sphinx.search import js_index
+from sphinx.theming import HTMLThemeFactory
+from sphinx.util import isurl, logging
+from sphinx.util.display import progress_message, status_iterator
+from sphinx.util.docutils import new_document
+from sphinx.util.fileutil import copy_asset
+from sphinx.util.i18n import format_date
+from sphinx.util.inventory import InventoryFile
+from sphinx.util.matching import DOTFILES, Matcher, patmatch
+from sphinx.util.osutil import SEP, copyfile, ensuredir, os_path, relative_uri
+from sphinx.writers.html import HTMLWriter
+from sphinx.writers.html5 import HTML5Translator
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Iterator, Sequence
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.tags import Tags
+
+#: the filename for the inventory of objects
+INVENTORY_FILENAME = 'objects.inv'
+
+logger = logging.getLogger(__name__)
+return_codes_re = re.compile('[\r\n]+')
+
+DOMAIN_INDEX_TYPE = tuple[
+ # Index name (e.g. py-modindex)
+ str,
+ # Index class
+ type[Index],
+ # list of (heading string, list of index entries) pairs.
+ list[tuple[str, list[IndexEntry]]],
+ # whether sub-entries should start collapsed
+ bool,
+]
+
+
+def get_stable_hash(obj: Any) -> str:
+ """
+ Return a stable hash for a Python data structure. We can't just use
+ the md5 of str(obj) since for example dictionary items are enumerated
+ in unpredictable order due to hash randomization in newer Pythons.
+ """
+ if isinstance(obj, dict):
+ return get_stable_hash(list(obj.items()))
+ elif isinstance(obj, (list, tuple)):
+ obj = sorted(get_stable_hash(o) for o in obj)
+ return hashlib.md5(str(obj).encode(), usedforsecurity=False).hexdigest()
+
+
+def convert_locale_to_language_tag(locale: str | None) -> str | None:
+ """Convert a locale string to a language tag (ex. en_US -> en-US).
+
+ refs: BCP 47 (:rfc:`5646`)
+ """
+ if locale:
+ return locale.replace('_', '-')
+ else:
+ return None
+
+
+class BuildInfo:
+ """buildinfo file manipulator.
+
+ HTMLBuilder and its family are storing their own envdata to ``.buildinfo``.
+ This class is a manipulator for the file.
+ """
+
+ @classmethod
+ def load(cls, f: IO) -> BuildInfo:
+ try:
+ lines = f.readlines()
+ assert lines[0].rstrip() == '# Sphinx build info version 1'
+ assert lines[2].startswith('config: ')
+ assert lines[3].startswith('tags: ')
+
+ build_info = BuildInfo()
+ build_info.config_hash = lines[2].split()[1].strip()
+ build_info.tags_hash = lines[3].split()[1].strip()
+ return build_info
+ except Exception as exc:
+ raise ValueError(__('build info file is broken: %r') % exc) from exc
+
+ def __init__(
+ self,
+ config: Config | None = None,
+ tags: Tags | None = None,
+ config_categories: Sequence[str] = (),
+ ) -> None:
+ self.config_hash = ''
+ self.tags_hash = ''
+
+ if config:
+ values = {c.name: c.value for c in config.filter(config_categories)}
+ self.config_hash = get_stable_hash(values)
+
+ if tags:
+ self.tags_hash = get_stable_hash(sorted(tags))
+
+ def __eq__(self, other: BuildInfo) -> bool: # type: ignore[override]
+ return (self.config_hash == other.config_hash and
+ self.tags_hash == other.tags_hash)
+
+ def dump(self, f: IO) -> None:
+ f.write('# Sphinx build info version 1\n'
+ '# This file hashes the configuration used when building these files.'
+ ' When it is not found, a full rebuild will be done.\n'
+ 'config: %s\n'
+ 'tags: %s\n' %
+ (self.config_hash, self.tags_hash))
+
+
+class StandaloneHTMLBuilder(Builder):
+ """
+ Builds standalone HTML docs.
+ """
+ name = 'html'
+ format = 'html'
+ epilog = __('The HTML pages are in %(outdir)s.')
+
+ default_translator_class = HTML5Translator
+ copysource = True
+ allow_parallel = True
+ out_suffix = '.html'
+ link_suffix = '.html' # defaults to matching out_suffix
+ indexer_format: Any = js_index
+ indexer_dumps_unicode = True
+ # create links to original images from images [True/False]
+ html_scaled_image_link = True
+ supported_image_types = ['image/svg+xml', 'image/png',
+ 'image/gif', 'image/jpeg']
+ supported_remote_images = True
+ supported_data_uri_images = True
+ searchindex_filename = 'searchindex.js'
+ add_permalinks = True
+ allow_sharp_as_current_path = True
+ embedded = False # for things like HTML help or Qt help: suppresses sidebar
+ search = True # for things like HTML help and Apple help: suppress search
+ use_index = False
+ download_support = True # enable download role
+
+ imgpath: str = ''
+ domain_indices: list[DOMAIN_INDEX_TYPE] = []
+
+ def __init__(self, app: Sphinx, env: BuildEnvironment) -> None:
+ super().__init__(app, env)
+
+ # CSS files
+ self._css_files: list[_CascadingStyleSheet] = []
+
+ # JS files
+ self._js_files: list[_JavaScript] = []
+
+ # Cached Publisher for writing doctrees to HTML
+ reader = docutils.readers.doctree.Reader(parser_name='restructuredtext')
+ pub = Publisher(
+ reader=reader,
+ parser=reader.parser,
+ writer=HTMLWriter(self),
+ source_class=DocTreeInput,
+ destination=StringOutput(encoding='unicode'),
+ )
+ if docutils.__version_info__[:2] >= (0, 19):
+ pub.get_settings(output_encoding='unicode', traceback=True)
+ else:
+ op = pub.setup_option_parser(output_encoding='unicode', traceback=True)
+ pub.settings = op.get_default_values()
+ self._publisher = pub
+
+ def init(self) -> None:
+ self.build_info = self.create_build_info()
+ # basename of images directory
+ self.imagedir = '_images'
+ # section numbers for headings in the currently visited document
+ self.secnumbers: dict[str, tuple[int, ...]] = {}
+ # currently written docname
+ self.current_docname: str = ''
+
+ self.init_templates()
+ self.init_highlighter()
+ self.init_css_files()
+ self.init_js_files()
+
+ html_file_suffix = self.get_builder_config('file_suffix', 'html')
+ if html_file_suffix is not None:
+ self.out_suffix = html_file_suffix
+
+ html_link_suffix = self.get_builder_config('link_suffix', 'html')
+ if html_link_suffix is not None:
+ self.link_suffix = html_link_suffix
+ else:
+ self.link_suffix = self.out_suffix
+
+ self.use_index = self.get_builder_config('use_index', 'html')
+
+ def create_build_info(self) -> BuildInfo:
+ return BuildInfo(self.config, self.tags, ['html'])
+
+ def _get_translations_js(self) -> str:
+ candidates = [path.join(dir, self.config.language,
+ 'LC_MESSAGES', 'sphinx.js')
+ for dir in self.config.locale_dirs] + \
+ [path.join(package_dir, 'locale', self.config.language,
+ 'LC_MESSAGES', 'sphinx.js'),
+ path.join(sys.prefix, 'share/sphinx/locale',
+ self.config.language, 'sphinx.js')]
+
+ for jsfile in candidates:
+ if path.isfile(jsfile):
+ return jsfile
+ return ''
+
+ def _get_style_filenames(self) -> Iterator[str]:
+ if isinstance(self.config.html_style, str):
+ yield self.config.html_style
+ elif self.config.html_style is not None:
+ yield from self.config.html_style
+ elif self.theme:
+ stylesheet = self.theme.get_config('theme', 'stylesheet')
+ yield from map(str.strip, stylesheet.split(','))
+ else:
+ yield 'default.css'
+
+ def get_theme_config(self) -> tuple[str, dict]:
+ return self.config.html_theme, self.config.html_theme_options
+
+ def init_templates(self) -> None:
+ theme_factory = HTMLThemeFactory(self.app)
+ themename, themeoptions = self.get_theme_config()
+ self.theme = theme_factory.create(themename)
+ self.theme_options = themeoptions.copy()
+ self.create_template_bridge()
+ self.templates.init(self, self.theme)
+
+ def init_highlighter(self) -> None:
+ # determine Pygments style and create the highlighter
+ if self.config.pygments_style is not None:
+ style = self.config.pygments_style
+ elif self.theme:
+ style = self.theme.get_config('theme', 'pygments_style', 'none')
+ else:
+ style = 'sphinx'
+ self.highlighter = PygmentsBridge('html', style)
+
+ if self.theme:
+ dark_style = self.theme.get_config('theme', 'pygments_dark_style', None)
+ else:
+ dark_style = None
+
+ self.dark_highlighter: PygmentsBridge | None
+ if dark_style is not None:
+ self.dark_highlighter = PygmentsBridge('html', dark_style)
+ self.app.add_css_file('pygments_dark.css',
+ media='(prefers-color-scheme: dark)',
+ id='pygments_dark_css')
+ else:
+ self.dark_highlighter = None
+
+ @property
+ def css_files(self) -> list[_CascadingStyleSheet]:
+ _deprecation_warning(__name__, f'{self.__class__.__name__}.css_files', '',
+ remove=(9, 0))
+ return self._css_files
+
+ def init_css_files(self) -> None:
+ self._css_files = []
+ self.add_css_file('pygments.css', priority=200)
+
+ for filename in self._get_style_filenames():
+ self.add_css_file(filename, priority=200)
+
+ for filename, attrs in self.app.registry.css_files:
+ self.add_css_file(filename, **attrs)
+
+ for filename, attrs in self.get_builder_config('css_files', 'html'):
+ attrs.setdefault('priority', 800) # User's CSSs are loaded after extensions'
+ self.add_css_file(filename, **attrs)
+
+ def add_css_file(self, filename: str, **kwargs: Any) -> None:
+ if '://' not in filename:
+ filename = posixpath.join('_static', filename)
+
+ if (asset := _CascadingStyleSheet(filename, **kwargs)) not in self._css_files:
+ self._css_files.append(asset)
+
+ @property
+ def script_files(self) -> list[_JavaScript]:
+ _deprecation_warning(__name__, f'{self.__class__.__name__}.script_files', '',
+ remove=(9, 0))
+ return self._js_files
+
+ def init_js_files(self) -> None:
+ self._js_files = []
+ self.add_js_file('documentation_options.js', priority=200)
+ self.add_js_file('doctools.js', priority=200)
+ self.add_js_file('sphinx_highlight.js', priority=200)
+
+ for filename, attrs in self.app.registry.js_files:
+ self.add_js_file(filename or '', **attrs)
+
+ for filename, attrs in self.get_builder_config('js_files', 'html'):
+ attrs.setdefault('priority', 800) # User's JSs are loaded after extensions'
+ self.add_js_file(filename or '', **attrs)
+
+ if self._get_translations_js():
+ self.add_js_file('translations.js')
+
+ def add_js_file(self, filename: str, **kwargs: Any) -> None:
+ if filename and '://' not in filename:
+ filename = posixpath.join('_static', filename)
+
+ if (asset := _JavaScript(filename, **kwargs)) not in self._js_files:
+ self._js_files.append(asset)
+
+ @property
+ def math_renderer_name(self) -> str | None:
+ name = self.get_builder_config('math_renderer', 'html')
+ if name is not None:
+ # use given name
+ return name
+ else:
+ # not given: choose a math_renderer from registered ones as possible
+ renderers = list(self.app.registry.html_inline_math_renderers)
+ if len(renderers) == 1:
+ # only default math_renderer (mathjax) is registered
+ return renderers[0]
+ elif len(renderers) == 2:
+ # default and another math_renderer are registered; prior the another
+ renderers.remove('mathjax')
+ return renderers[0]
+ else:
+ # many math_renderers are registered. can't choose automatically!
+ return None
+
+ def get_outdated_docs(self) -> Iterator[str]:
+ try:
+ with open(path.join(self.outdir, '.buildinfo'), encoding="utf-8") as fp:
+ buildinfo = BuildInfo.load(fp)
+
+ if self.build_info != buildinfo:
+ logger.debug('[build target] did not match: build_info ')
+ yield from self.env.found_docs
+ return
+ except ValueError as exc:
+ logger.warning(__('Failed to read build info file: %r'), exc)
+ except OSError:
+ # ignore errors on reading
+ pass
+
+ if self.templates:
+ template_mtime = self.templates.newest_template_mtime()
+ else:
+ template_mtime = 0
+ for docname in self.env.found_docs:
+ if docname not in self.env.all_docs:
+ logger.debug('[build target] did not in env: %r', docname)
+ yield docname
+ continue
+ targetname = self.get_outfilename(docname)
+ try:
+ targetmtime = path.getmtime(targetname)
+ except Exception:
+ targetmtime = 0
+ try:
+ srcmtime = max(path.getmtime(self.env.doc2path(docname)), template_mtime)
+ if srcmtime > targetmtime:
+ logger.debug(
+ '[build target] targetname %r(%s), template(%s), docname %r(%s)',
+ targetname,
+ _format_modified_time(targetmtime),
+ _format_modified_time(template_mtime),
+ docname,
+ _format_modified_time(path.getmtime(self.env.doc2path(docname))),
+ )
+ yield docname
+ except OSError:
+ # source doesn't exist anymore
+ pass
+
+ def get_asset_paths(self) -> list[str]:
+ return self.config.html_extra_path + self.config.html_static_path
+
+ def render_partial(self, node: Node | None) -> dict[str, str]:
+ """Utility: Render a lone doctree node."""
+ if node is None:
+ return {'fragment': ''}
+
+ doc = new_document('<partial node>')
+ doc.append(node)
+ self._publisher.set_source(doc)
+ self._publisher.publish()
+ return self._publisher.writer.parts # type: ignore[union-attr]
+
+ def prepare_writing(self, docnames: set[str]) -> None:
+ # create the search indexer
+ self.indexer = None
+ if self.search:
+ from sphinx.search import IndexBuilder
+ lang = self.config.html_search_language or self.config.language
+ self.indexer = IndexBuilder(self.env, lang,
+ self.config.html_search_options,
+ self.config.html_search_scorer)
+ self.load_indexer(docnames)
+
+ self.docwriter = HTMLWriter(self)
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ # DeprecationWarning: The frontend.OptionParser class will be replaced
+ # by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
+ self.docsettings: Any = OptionParser(
+ defaults=self.env.settings,
+ components=(self.docwriter,),
+ read_config_files=True).get_default_values()
+ self.docsettings.compact_lists = bool(self.config.html_compact_lists)
+
+ # determine the additional indices to include
+ self.domain_indices = []
+ # html_domain_indices can be False/True or a list of index names
+ indices_config = self.config.html_domain_indices
+ if indices_config:
+ for domain_name in sorted(self.env.domains):
+ domain: Domain = self.env.domains[domain_name]
+ for indexcls in domain.indices:
+ indexname = f'{domain.name}-{indexcls.name}'
+ if isinstance(indices_config, list):
+ if indexname not in indices_config:
+ continue
+ content, collapse = indexcls(domain).generate()
+ if content:
+ self.domain_indices.append(
+ (indexname, indexcls, content, collapse))
+
+ # format the "last updated on" string, only once is enough since it
+ # typically doesn't include the time of day
+ self.last_updated: str | None
+ lufmt = self.config.html_last_updated_fmt
+ if lufmt is not None:
+ self.last_updated = format_date(lufmt or _('%b %d, %Y'),
+ language=self.config.language)
+ else:
+ self.last_updated = None
+
+ # If the logo or favicon are urls, keep them as-is, otherwise
+ # strip the relative path as the files will be copied into _static.
+ logo = self.config.html_logo or ''
+ favicon = self.config.html_favicon or ''
+
+ if not isurl(logo):
+ logo = path.basename(logo)
+ if not isurl(favicon):
+ favicon = path.basename(favicon)
+
+ self.relations = self.env.collect_relations()
+
+ rellinks: list[tuple[str, str, str, str]] = []
+ if self.use_index:
+ rellinks.append(('genindex', _('General Index'), 'I', _('index')))
+ for indexname, indexcls, _content, _collapse in self.domain_indices:
+ # if it has a short name
+ if indexcls.shortname:
+ rellinks.append((indexname, indexcls.localname,
+ '', indexcls.shortname))
+
+ # add assets registered after ``Builder.init()``.
+ for css_filename, attrs in self.app.registry.css_files:
+ self.add_css_file(css_filename, **attrs)
+ for js_filename, attrs in self.app.registry.js_files:
+ self.add_js_file(js_filename or '', **attrs)
+
+ # back up _css_files and _js_files to allow adding CSS/JS files to a specific page.
+ self._orig_css_files = list(dict.fromkeys(self._css_files))
+ self._orig_js_files = list(dict.fromkeys(self._js_files))
+ styles = list(self._get_style_filenames())
+
+ self.globalcontext = {
+ 'embedded': self.embedded,
+ 'project': self.config.project,
+ 'release': return_codes_re.sub('', self.config.release),
+ 'version': self.config.version,
+ 'last_updated': self.last_updated,
+ 'copyright': self.config.copyright,
+ 'master_doc': self.config.root_doc,
+ 'root_doc': self.config.root_doc,
+ 'use_opensearch': self.config.html_use_opensearch,
+ 'docstitle': self.config.html_title,
+ 'shorttitle': self.config.html_short_title,
+ 'show_copyright': self.config.html_show_copyright,
+ 'show_search_summary': self.config.html_show_search_summary,
+ 'show_sphinx': self.config.html_show_sphinx,
+ 'has_source': self.config.html_copy_source,
+ 'show_source': self.config.html_show_sourcelink,
+ 'sourcelink_suffix': self.config.html_sourcelink_suffix,
+ 'file_suffix': self.out_suffix,
+ 'link_suffix': self.link_suffix,
+ 'script_files': self._js_files,
+ 'language': convert_locale_to_language_tag(self.config.language),
+ 'css_files': self._css_files,
+ 'sphinx_version': __display_version__,
+ 'sphinx_version_tuple': sphinx_version,
+ 'docutils_version_info': docutils.__version_info__[:5],
+ 'styles': styles,
+ 'rellinks': rellinks,
+ 'builder': self.name,
+ 'parents': [],
+ 'logo_url': logo,
+ 'favicon_url': favicon,
+ 'html5_doctype': True,
+ }
+ if self.theme:
+ self.globalcontext.update(
+ ('theme_' + key, val) for (key, val) in
+ self.theme.get_options(self.theme_options).items())
+ self.globalcontext.update(self.config.html_context)
+
+ def get_doc_context(self, docname: str, body: str, metatags: str) -> dict[str, Any]:
+ """Collect items for the template context of a page."""
+ # find out relations
+ prev = next = None
+ parents = []
+ rellinks = self.globalcontext['rellinks'][:]
+ related = self.relations.get(docname)
+ titles = self.env.titles
+ if related and related[2]:
+ try:
+ next = {
+ 'link': self.get_relative_uri(docname, related[2]),
+ 'title': self.render_partial(titles[related[2]])['title'],
+ }
+ rellinks.append((related[2], next['title'], 'N', _('next')))
+ except KeyError:
+ next = None
+ if related and related[1]:
+ try:
+ prev = {
+ 'link': self.get_relative_uri(docname, related[1]),
+ 'title': self.render_partial(titles[related[1]])['title'],
+ }
+ rellinks.append((related[1], prev['title'], 'P', _('previous')))
+ except KeyError:
+ # the relation is (somehow) not in the TOC tree, handle
+ # that gracefully
+ prev = None
+ while related and related[0]:
+ with contextlib.suppress(KeyError):
+ parents.append(
+ {'link': self.get_relative_uri(docname, related[0]),
+ 'title': self.render_partial(titles[related[0]])['title']})
+
+ related = self.relations.get(related[0])
+ if parents:
+ # remove link to the master file; we have a generic
+ # "back to index" link already
+ parents.pop()
+ parents.reverse()
+
+ # title rendered as HTML
+ title_node = self.env.longtitles.get(docname)
+ title = self.render_partial(title_node)['title'] if title_node else ''
+
+ # Suffix for the document
+ source_suffix = self.env.doc2path(docname, False)[len(docname):]
+
+ # the name for the copied source
+ if self.config.html_copy_source:
+ sourcename = docname + source_suffix
+ if source_suffix != self.config.html_sourcelink_suffix:
+ sourcename += self.config.html_sourcelink_suffix
+ else:
+ sourcename = ''
+
+ # metadata for the document
+ meta = self.env.metadata.get(docname)
+
+ # local TOC and global TOC tree
+ self_toc = document_toc(self.env, docname, self.tags)
+ toc = self.render_partial(self_toc)['fragment']
+
+ return {
+ 'parents': parents,
+ 'prev': prev,
+ 'next': next,
+ 'title': title,
+ 'meta': meta,
+ 'body': body,
+ 'metatags': metatags,
+ 'rellinks': rellinks,
+ 'sourcename': sourcename,
+ 'toc': toc,
+ # only display a TOC if there's more than one item to show
+ 'display_toc': (self.env.toc_num_entries[docname] > 1),
+ 'page_source_suffix': source_suffix,
+ }
+
+ def copy_assets(self) -> None:
+ self.finish_tasks.add_task(self.copy_download_files)
+ self.finish_tasks.add_task(self.copy_static_files)
+ self.finish_tasks.add_task(self.copy_extra_files)
+ self.finish_tasks.join()
+
+ def write_doc(self, docname: str, doctree: nodes.document) -> None:
+ destination = StringOutput(encoding='utf-8')
+ doctree.settings = self.docsettings
+
+ self.secnumbers = self.env.toc_secnumbers.get(docname, {})
+ self.fignumbers = self.env.toc_fignumbers.get(docname, {})
+ self.imgpath = relative_uri(self.get_target_uri(docname), '_images')
+ self.dlpath = relative_uri(self.get_target_uri(docname), '_downloads')
+ self.current_docname = docname
+ 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.handle_page(docname, ctx, event_arg=doctree)
+
+ def write_doc_serialized(self, docname: str, doctree: nodes.document) -> None:
+ self.imgpath = relative_uri(self.get_target_uri(docname), self.imagedir)
+ self.post_process_images(doctree)
+ title_node = self.env.longtitles.get(docname)
+ title = self.render_partial(title_node)['title'] if title_node else ''
+ self.index_page(docname, doctree, title)
+
+ def finish(self) -> None:
+ self.finish_tasks.add_task(self.gen_indices)
+ self.finish_tasks.add_task(self.gen_pages_from_extensions)
+ self.finish_tasks.add_task(self.gen_additional_pages)
+ self.finish_tasks.add_task(self.copy_image_files)
+ self.finish_tasks.add_task(self.write_buildinfo)
+
+ # dump the search index
+ self.handle_finish()
+
+ @progress_message(__('generating indices'))
+ def gen_indices(self) -> None:
+ # the global general index
+ if self.use_index:
+ self.write_genindex()
+
+ # the global domain-specific indices
+ self.write_domain_indices()
+
+ def gen_pages_from_extensions(self) -> None:
+ # pages from extensions
+ for pagelist in self.events.emit('html-collect-pages'):
+ for pagename, context, template in pagelist:
+ self.handle_page(pagename, context, template)
+
+ @progress_message(__('writing additional pages'))
+ def gen_additional_pages(self) -> None:
+ # additional pages from conf.py
+ for pagename, template in self.config.html_additional_pages.items():
+ logger.info(pagename + ' ', nonl=True)
+ self.handle_page(pagename, {}, template)
+
+ # the search page
+ if self.search:
+ logger.info('search ', nonl=True)
+ self.handle_page('search', {}, 'search.html')
+
+ # the opensearch xml file
+ if self.config.html_use_opensearch and self.search:
+ logger.info('opensearch ', nonl=True)
+ fn = path.join(self.outdir, '_static', 'opensearch.xml')
+ self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn)
+
+ def write_genindex(self) -> None:
+ # the total count of lines for each index letter, used to distribute
+ # the entries into two columns
+ genindex = IndexEntries(self.env).create_index(self)
+ indexcounts = []
+ for _k, entries in genindex:
+ indexcounts.append(sum(1 + len(subitems)
+ for _, (_, subitems, _) in entries))
+
+ genindexcontext = {
+ 'genindexentries': genindex,
+ 'genindexcounts': indexcounts,
+ 'split_index': self.config.html_split_index,
+ }
+ logger.info('genindex ', nonl=True)
+
+ if self.config.html_split_index:
+ self.handle_page('genindex', genindexcontext,
+ 'genindex-split.html')
+ self.handle_page('genindex-all', genindexcontext,
+ 'genindex.html')
+ for (key, entries), count in zip(genindex, indexcounts):
+ ctx = {'key': key, 'entries': entries, 'count': count,
+ 'genindexentries': genindex}
+ self.handle_page('genindex-' + key, ctx,
+ 'genindex-single.html')
+ else:
+ self.handle_page('genindex', genindexcontext, 'genindex.html')
+
+ def write_domain_indices(self) -> None:
+ for indexname, indexcls, content, collapse in self.domain_indices:
+ indexcontext = {
+ 'indextitle': indexcls.localname,
+ 'content': content,
+ 'collapse_index': collapse,
+ }
+ logger.info(indexname + ' ', nonl=True)
+ self.handle_page(indexname, indexcontext, 'domainindex.html')
+
+ def copy_image_files(self) -> None:
+ if self.images:
+ stringify_func = ImageAdapter(self.app.env).get_original_image_uri
+ ensuredir(path.join(self.outdir, self.imagedir))
+ for src in status_iterator(self.images, __('copying images... '), "brown",
+ len(self.images), self.app.verbosity,
+ stringify_func=stringify_func):
+ dest = self.images[src]
+ try:
+ copyfile(path.join(self.srcdir, src),
+ path.join(self.outdir, self.imagedir, dest))
+ except Exception as err:
+ logger.warning(__('cannot copy image file %r: %s'),
+ path.join(self.srcdir, src), err)
+
+ def copy_download_files(self) -> None:
+ def to_relpath(f: str) -> str:
+ return relative_path(self.srcdir, f) # type: ignore[arg-type]
+
+ # copy downloadable files
+ if self.env.dlfiles:
+ ensuredir(path.join(self.outdir, '_downloads'))
+ for src in status_iterator(self.env.dlfiles, __('copying downloadable files... '),
+ "brown", len(self.env.dlfiles), self.app.verbosity,
+ stringify_func=to_relpath):
+ try:
+ dest = path.join(self.outdir, '_downloads', self.env.dlfiles[src][1])
+ ensuredir(path.dirname(dest))
+ copyfile(path.join(self.srcdir, src), dest)
+ except OSError as err:
+ logger.warning(__('cannot copy downloadable file %r: %s'),
+ path.join(self.srcdir, src), err)
+
+ def create_pygments_style_file(self) -> None:
+ """create a style file for pygments."""
+ with open(path.join(self.outdir, '_static', 'pygments.css'), 'w',
+ encoding="utf-8") as f:
+ f.write(self.highlighter.get_stylesheet())
+
+ if self.dark_highlighter:
+ with open(path.join(self.outdir, '_static', 'pygments_dark.css'), 'w',
+ encoding="utf-8") as f:
+ f.write(self.dark_highlighter.get_stylesheet())
+
+ def copy_translation_js(self) -> None:
+ """Copy a JavaScript file for translations."""
+ jsfile = self._get_translations_js()
+ if jsfile:
+ copyfile(jsfile, path.join(self.outdir, '_static', 'translations.js'))
+
+ def copy_stemmer_js(self) -> None:
+ """Copy a JavaScript file for stemmer."""
+ if self.indexer is not None:
+ if hasattr(self.indexer, 'get_js_stemmer_rawcodes'):
+ for jsfile in self.indexer.get_js_stemmer_rawcodes():
+ copyfile(jsfile, path.join(self.outdir, '_static', path.basename(jsfile)))
+ else:
+ if js_stemmer_rawcode := self.indexer.get_js_stemmer_rawcode():
+ copyfile(js_stemmer_rawcode,
+ path.join(self.outdir, '_static', '_stemmer.js'))
+
+ def copy_theme_static_files(self, context: dict[str, Any]) -> None:
+ def onerror(filename: str, error: Exception) -> None:
+ logger.warning(__('Failed to copy a file in html_static_file: %s: %r'),
+ filename, error)
+
+ if self.theme:
+ for entry in self.theme.get_theme_dirs()[::-1]:
+ copy_asset(path.join(entry, 'static'),
+ path.join(self.outdir, '_static'),
+ excluded=DOTFILES, context=context,
+ renderer=self.templates, onerror=onerror)
+
+ def copy_html_static_files(self, context: dict) -> None:
+ def onerror(filename: str, error: Exception) -> None:
+ logger.warning(__('Failed to copy a file in html_static_file: %s: %r'),
+ filename, error)
+
+ excluded = Matcher(self.config.exclude_patterns + ["**/.*"])
+ for entry in self.config.html_static_path:
+ copy_asset(path.join(self.confdir, entry),
+ path.join(self.outdir, '_static'),
+ excluded, context=context, renderer=self.templates, onerror=onerror)
+
+ def copy_html_logo(self) -> None:
+ if self.config.html_logo and not isurl(self.config.html_logo):
+ copy_asset(path.join(self.confdir, self.config.html_logo),
+ path.join(self.outdir, '_static'))
+
+ def copy_html_favicon(self) -> None:
+ if self.config.html_favicon and not isurl(self.config.html_favicon):
+ copy_asset(path.join(self.confdir, self.config.html_favicon),
+ path.join(self.outdir, '_static'))
+
+ def copy_static_files(self) -> None:
+ try:
+ with progress_message(__('copying static files')):
+ ensuredir(path.join(self.outdir, '_static'))
+
+ # prepare context for templates
+ context = self.globalcontext.copy()
+ if self.indexer is not None:
+ context.update(self.indexer.context_for_searchtool())
+
+ self.create_pygments_style_file()
+ self.copy_translation_js()
+ self.copy_stemmer_js()
+ self.copy_theme_static_files(context)
+ self.copy_html_static_files(context)
+ self.copy_html_logo()
+ self.copy_html_favicon()
+ except OSError as err:
+ logger.warning(__('cannot copy static file %r'), err)
+
+ def copy_extra_files(self) -> None:
+ """copy html_extra_path files."""
+ try:
+ with progress_message(__('copying extra files')):
+ excluded = Matcher(self.config.exclude_patterns)
+ for extra_path in self.config.html_extra_path:
+ entry = path.join(self.confdir, extra_path)
+ copy_asset(entry, self.outdir, excluded)
+ except OSError as err:
+ logger.warning(__('cannot copy extra file %r'), err)
+
+ def write_buildinfo(self) -> None:
+ try:
+ with open(path.join(self.outdir, '.buildinfo'), 'w', encoding="utf-8") as fp:
+ self.build_info.dump(fp)
+ except OSError as exc:
+ logger.warning(__('Failed to write build info file: %r'), exc)
+
+ def cleanup(self) -> None:
+ # clean up theme stuff
+ if self.theme:
+ self.theme.cleanup()
+
+ def post_process_images(self, doctree: Node) -> None:
+ """Pick the best candidate for an image and link down-scaled images to
+ their high res version.
+ """
+ super().post_process_images(doctree)
+
+ if self.config.html_scaled_image_link and self.html_scaled_image_link:
+ for node in doctree.findall(nodes.image):
+ if not any((key in node) for key in ['scale', 'width', 'height']):
+ # resizing options are not given. scaled image link is available
+ # only for resized images.
+ continue
+ if isinstance(node.parent, nodes.reference):
+ # A image having hyperlink target
+ continue
+ if 'no-scaled-link' in node['classes']:
+ # scaled image link is disabled for this node
+ continue
+
+ uri = node['uri']
+ reference = nodes.reference('', '', internal=True)
+ if uri in self.images:
+ reference['refuri'] = posixpath.join(self.imgpath,
+ self.images[uri])
+ else:
+ reference['refuri'] = uri
+ node.replace_self(reference)
+ reference.append(node)
+
+ def load_indexer(self, docnames: Iterable[str]) -> None:
+ assert self.indexer is not None
+ keep = set(self.env.all_docs) - set(docnames)
+ try:
+ searchindexfn = path.join(self.outdir, self.searchindex_filename)
+ if self.indexer_dumps_unicode:
+ with open(searchindexfn, encoding='utf-8') as ft:
+ self.indexer.load(ft, self.indexer_format)
+ else:
+ with open(searchindexfn, 'rb') as fb:
+ self.indexer.load(fb, self.indexer_format)
+ except (OSError, ValueError):
+ if keep:
+ logger.warning(__("search index couldn't be loaded, but not all "
+ 'documents will be built: the index will be '
+ 'incomplete.'))
+ # delete all entries for files that will be rebuilt
+ self.indexer.prune(keep)
+
+ def index_page(self, pagename: str, doctree: nodes.document, title: str) -> None:
+ # only index pages with title
+ if self.indexer is not None and title:
+ filename = self.env.doc2path(pagename, base=False)
+ metadata = self.env.metadata.get(pagename, {})
+ if 'nosearch' in metadata:
+ self.indexer.feed(pagename, filename, '', new_document(''))
+ else:
+ self.indexer.feed(pagename, filename, title, doctree)
+
+ def _get_local_toctree(self, docname: str, collapse: bool = True, **kwargs: Any) -> str:
+ if 'includehidden' not in kwargs:
+ kwargs['includehidden'] = False
+ if kwargs.get('maxdepth') == '':
+ kwargs.pop('maxdepth')
+ toctree = global_toctree_for_doc(self.env, docname, self, collapse=collapse, **kwargs)
+ return self.render_partial(toctree)['fragment']
+
+ def get_outfilename(self, pagename: str) -> str:
+ return path.join(self.outdir, os_path(pagename) + self.out_suffix)
+
+ def add_sidebars(self, pagename: str, ctx: dict) -> None:
+ def has_wildcard(pattern: str) -> bool:
+ return any(char in pattern for char in '*?[')
+
+ sidebars = None
+ matched = None
+ customsidebar = None
+
+ # default sidebars settings for selected theme
+ if self.theme.name == 'alabaster':
+ # provide default settings for alabaster (for compatibility)
+ # Note: this will be removed before Sphinx-2.0
+ try:
+ # get default sidebars settings from alabaster (if defined)
+ theme_default_sidebars = self.theme.config.get('theme', 'sidebars')
+ if theme_default_sidebars:
+ sidebars = [name.strip() for name in theme_default_sidebars.split(',')]
+ except Exception:
+ # fallback to better default settings
+ sidebars = ['about.html', 'navigation.html', 'relations.html',
+ 'searchbox.html', 'donate.html']
+ else:
+ theme_default_sidebars = self.theme.get_config('theme', 'sidebars', None)
+ if theme_default_sidebars:
+ sidebars = [name.strip() for name in theme_default_sidebars.split(',')]
+
+ # user sidebar settings
+ html_sidebars = self.get_builder_config('sidebars', 'html')
+ for pattern, patsidebars in html_sidebars.items():
+ if patmatch(pagename, pattern):
+ if matched:
+ if has_wildcard(pattern):
+ # warn if both patterns contain wildcards
+ if has_wildcard(matched):
+ logger.warning(__('page %s matches two patterns in '
+ 'html_sidebars: %r and %r'),
+ pagename, matched, pattern)
+ # else the already matched pattern is more specific
+ # than the present one, because it contains no wildcard
+ continue
+ matched = pattern
+ sidebars = patsidebars
+
+ if sidebars is None:
+ # keep defaults
+ pass
+
+ ctx['sidebars'] = sidebars
+ ctx['customsidebar'] = customsidebar
+
+ # --------- these are overwritten by the serialization builder
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ return quote(docname) + self.link_suffix
+
+ def handle_page(self, pagename: str, addctx: dict, templatename: str = 'page.html',
+ outfilename: str | None = None, event_arg: Any = None) -> None:
+ ctx = self.globalcontext.copy()
+ # current_page_name is backwards compatibility
+ ctx['pagename'] = ctx['current_page_name'] = pagename
+ ctx['encoding'] = self.config.html_output_encoding
+ default_baseuri = self.get_target_uri(pagename)
+ # in the singlehtml builder, default_baseuri still contains an #anchor
+ # part, which relative_uri doesn't really like...
+ default_baseuri = default_baseuri.rsplit('#', 1)[0]
+
+ if self.config.html_baseurl:
+ ctx['pageurl'] = posixpath.join(self.config.html_baseurl,
+ pagename + self.out_suffix)
+ else:
+ ctx['pageurl'] = None
+
+ def pathto(
+ otheruri: str, resource: bool = False, baseuri: str = default_baseuri,
+ ) -> str:
+ if resource and '://' in otheruri:
+ # allow non-local resources given by scheme
+ return otheruri
+ elif not resource:
+ otheruri = self.get_target_uri(otheruri)
+ uri = relative_uri(baseuri, otheruri) or '#'
+ if uri == '#' and not self.allow_sharp_as_current_path:
+ uri = baseuri
+ return uri
+ ctx['pathto'] = pathto
+
+ def hasdoc(name: str) -> bool:
+ if name in self.env.all_docs:
+ return True
+ if name == 'search' and self.search:
+ return True
+ if name == 'genindex' and self.get_builder_config('use_index', 'html'):
+ return True
+ return False
+ ctx['hasdoc'] = hasdoc
+
+ ctx['toctree'] = lambda **kwargs: self._get_local_toctree(pagename, **kwargs)
+ self.add_sidebars(pagename, ctx)
+ ctx.update(addctx)
+
+ # 'blah.html' should have content_root = './' not ''.
+ ctx['content_root'] = (f'..{SEP}' * default_baseuri.count(SEP)) or f'.{SEP}'
+
+ outdir = self.app.outdir
+
+ def css_tag(css: _CascadingStyleSheet) -> str:
+ attrs = []
+ for key, value in css.attributes.items():
+ if value is not None:
+ attrs.append(f'{key}="{html.escape(value, quote=True)}"')
+ uri = pathto(os.fspath(css.filename), resource=True)
+ if checksum := _file_checksum(outdir, css.filename):
+ uri += f'?v={checksum}'
+ return f'<link {" ".join(sorted(attrs))} href="{uri}" />'
+
+ ctx['css_tag'] = css_tag
+
+ def js_tag(js: _JavaScript | str) -> str:
+ if not isinstance(js, _JavaScript):
+ # str value (old styled)
+ return f'<script src="{pathto(js, resource=True)}"></script>'
+
+ attrs = []
+ body = js.attributes.get('body', '')
+ for key, value in js.attributes.items():
+ if key == 'body':
+ continue
+ if value is not None:
+ attrs.append(f'{key}="{html.escape(value, quote=True)}"')
+
+ if not js.filename:
+ if attrs:
+ return f'<script {" ".join(sorted(attrs))}>{body}</script>'
+ return f'<script>{body}</script>'
+
+ uri = pathto(os.fspath(js.filename), resource=True)
+ if 'MathJax.js?' in os.fspath(js.filename):
+ # MathJax v2 reads a ``?config=...`` query parameter,
+ # special case this and just skip adding the checksum.
+ # https://docs.mathjax.org/en/v2.7-latest/configuration.html#considerations-for-using-combined-configuration-files
+ # https://github.com/sphinx-doc/sphinx/issues/11658
+ pass
+ elif checksum := _file_checksum(outdir, js.filename):
+ uri += f'?v={checksum}'
+ if attrs:
+ return f'<script {" ".join(sorted(attrs))} src="{uri}"></script>'
+ return f'<script src="{uri}"></script>'
+
+ ctx['js_tag'] = js_tag
+
+ # revert _css_files and _js_files
+ self._css_files[:] = self._orig_css_files
+ self._js_files[:] = self._orig_js_files
+
+ self.update_page_context(pagename, templatename, ctx, event_arg)
+ newtmpl = self.app.emit_firstresult('html-page-context', pagename,
+ templatename, ctx, event_arg)
+ if newtmpl:
+ templatename = newtmpl
+
+ # sort JS/CSS before rendering HTML
+ try: # NoQA: SIM105
+ # Convert script_files to list to support non-list script_files (refs: #8889)
+ ctx['script_files'] = sorted(ctx['script_files'], key=lambda js: js.priority)
+ except AttributeError:
+ # Skip sorting if users modifies script_files directly (maybe via `html_context`).
+ # refs: #8885
+ #
+ # Note: priority sorting feature will not work in this case.
+ pass
+
+ with contextlib.suppress(AttributeError):
+ ctx['css_files'] = sorted(ctx['css_files'], key=lambda css: css.priority)
+
+ try:
+ output = self.templates.render(templatename, ctx)
+ except UnicodeError:
+ logger.warning(__("a Unicode error occurred when rendering the page %s. "
+ "Please make sure all config values that contain "
+ "non-ASCII content are Unicode strings."), pagename)
+ return
+ except Exception as exc:
+ raise ThemeError(__("An error happened in rendering the page %s.\nReason: %r") %
+ (pagename, exc)) from exc
+
+ if not outfilename:
+ outfilename = self.get_outfilename(pagename)
+ # outfilename's path is in general different from self.outdir
+ ensuredir(path.dirname(outfilename))
+ try:
+ with open(outfilename, 'w', encoding=ctx['encoding'],
+ errors='xmlcharrefreplace') as f:
+ f.write(output)
+ except OSError as err:
+ logger.warning(__("error writing file %s: %s"), outfilename, err)
+ if self.copysource and ctx.get('sourcename'):
+ # copy the source file for the "show source" link
+ source_name = path.join(self.outdir, '_sources',
+ os_path(ctx['sourcename']))
+ ensuredir(path.dirname(source_name))
+ copyfile(self.env.doc2path(pagename), source_name)
+
+ def update_page_context(self, pagename: str, templatename: str,
+ ctx: dict, event_arg: Any) -> None:
+ pass
+
+ def handle_finish(self) -> None:
+ self.finish_tasks.add_task(self.dump_search_index)
+ self.finish_tasks.add_task(self.dump_inventory)
+
+ @progress_message(__('dumping object inventory'))
+ def dump_inventory(self) -> None:
+ InventoryFile.dump(path.join(self.outdir, INVENTORY_FILENAME), self.env, self)
+
+ def dump_search_index(self) -> None:
+ if self.indexer is None:
+ return
+
+ with progress_message(__('dumping search index in %s') % self.indexer.label()):
+ self.indexer.prune(self.env.all_docs)
+ 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
+ if self.indexer_dumps_unicode:
+ with open(searchindexfn + '.tmp', 'w', encoding='utf-8') as ft:
+ self.indexer.dump(ft, self.indexer_format)
+ else:
+ with open(searchindexfn + '.tmp', 'wb') as fb:
+ self.indexer.dump(fb, self.indexer_format)
+ os.replace(searchindexfn + '.tmp', searchindexfn)
+
+
+def convert_html_css_files(app: Sphinx, config: Config) -> None:
+ """This converts string styled html_css_files to tuple styled one."""
+ html_css_files: list[tuple[str, dict]] = []
+ for entry in config.html_css_files:
+ if isinstance(entry, str):
+ html_css_files.append((entry, {}))
+ else:
+ try:
+ filename, attrs = entry
+ html_css_files.append((filename, attrs))
+ except Exception:
+ logger.warning(__('invalid css_file: %r, ignored'), entry)
+ continue
+
+ config.html_css_files = html_css_files # type: ignore[attr-defined]
+
+
+def _format_modified_time(timestamp: float) -> str:
+ """Return an RFC 3339 formatted string representing the given timestamp."""
+ seconds, fraction = divmod(timestamp, 1)
+ return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(seconds)) + f'.{fraction:.3f}'
+
+
+def convert_html_js_files(app: Sphinx, config: Config) -> None:
+ """This converts string styled html_js_files to tuple styled one."""
+ html_js_files: list[tuple[str, dict]] = []
+ for entry in config.html_js_files:
+ if isinstance(entry, str):
+ html_js_files.append((entry, {}))
+ else:
+ try:
+ filename, attrs = entry
+ html_js_files.append((filename, attrs))
+ except Exception:
+ logger.warning(__('invalid js_file: %r, ignored'), entry)
+ continue
+
+ config.html_js_files = html_js_files # type: ignore[attr-defined]
+
+
+def setup_resource_paths(app: Sphinx, pagename: str, templatename: str,
+ context: dict, doctree: Node) -> None:
+ """Set up relative resource paths."""
+ pathto = context['pathto']
+
+ # favicon_url
+ favicon_url = context.get('favicon_url')
+ if favicon_url and not isurl(favicon_url):
+ context['favicon_url'] = pathto('_static/' + favicon_url, resource=True)
+
+ # logo_url
+ logo_url = context.get('logo_url')
+ if logo_url and not isurl(logo_url):
+ context['logo_url'] = pathto('_static/' + logo_url, resource=True)
+
+
+def validate_math_renderer(app: Sphinx) -> None:
+ if app.builder.format != 'html':
+ return
+
+ name = app.builder.math_renderer_name # type: ignore[attr-defined]
+ if name is None:
+ raise ConfigError(__('Many math_renderers are registered. '
+ 'But no math_renderer is selected.'))
+ if name not in app.registry.html_inline_math_renderers:
+ raise ConfigError(__('Unknown math_renderer %r is given.') % name)
+
+
+def validate_html_extra_path(app: Sphinx, config: Config) -> None:
+ """Check html_extra_paths setting."""
+ for entry in config.html_extra_path[:]:
+ extra_path = path.normpath(path.join(app.confdir, entry))
+ if not path.exists(extra_path):
+ logger.warning(__('html_extra_path entry %r does not exist'), entry)
+ config.html_extra_path.remove(entry)
+ elif (path.splitdrive(app.outdir)[0] == path.splitdrive(extra_path)[0] and
+ path.commonpath((app.outdir, extra_path)) == path.normpath(app.outdir)):
+ logger.warning(__('html_extra_path entry %r is placed inside outdir'), entry)
+ config.html_extra_path.remove(entry)
+
+
+def validate_html_static_path(app: Sphinx, config: Config) -> None:
+ """Check html_static_paths setting."""
+ for entry in config.html_static_path[:]:
+ static_path = path.normpath(path.join(app.confdir, entry))
+ if not path.exists(static_path):
+ logger.warning(__('html_static_path entry %r does not exist'), entry)
+ config.html_static_path.remove(entry)
+ elif (path.splitdrive(app.outdir)[0] == path.splitdrive(static_path)[0] and
+ path.commonpath((app.outdir, static_path)) == path.normpath(app.outdir)):
+ logger.warning(__('html_static_path entry %r is placed inside outdir'), entry)
+ config.html_static_path.remove(entry)
+
+
+def validate_html_logo(app: Sphinx, config: Config) -> None:
+ """Check html_logo setting."""
+ if (config.html_logo and
+ not path.isfile(path.join(app.confdir, config.html_logo)) and
+ not isurl(config.html_logo)):
+ logger.warning(__('logo file %r does not exist'), config.html_logo)
+ config.html_logo = None # type: ignore[attr-defined]
+
+
+def validate_html_favicon(app: Sphinx, config: Config) -> None:
+ """Check html_favicon setting."""
+ if (config.html_favicon and
+ not path.isfile(path.join(app.confdir, config.html_favicon)) and
+ not isurl(config.html_favicon)):
+ logger.warning(__('favicon file %r does not exist'), config.html_favicon)
+ config.html_favicon = None # type: ignore[attr-defined]
+
+
+def error_on_html_4(_app: Sphinx, config: Config) -> None:
+ """Error on HTML 4."""
+ if config.html4_writer:
+ raise ConfigError(_(
+ 'HTML 4 is no longer supported by Sphinx. '
+ '("html4_writer=True" detected in configuration options)',
+ ))
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ # builders
+ app.add_builder(StandaloneHTMLBuilder)
+
+ # config values
+ app.add_config_value('html_theme', 'alabaster', 'html')
+ app.add_config_value('html_theme_path', [], 'html')
+ app.add_config_value('html_theme_options', {}, 'html')
+ app.add_config_value('html_title',
+ lambda self: _('%s %s documentation') % (self.project, self.release),
+ 'html', [str])
+ app.add_config_value('html_short_title', lambda self: self.html_title, 'html')
+ app.add_config_value('html_style', None, 'html', [list, str])
+ app.add_config_value('html_logo', None, 'html', [str])
+ app.add_config_value('html_favicon', None, 'html', [str])
+ app.add_config_value('html_css_files', [], 'html')
+ app.add_config_value('html_js_files', [], 'html')
+ app.add_config_value('html_static_path', [], 'html')
+ app.add_config_value('html_extra_path', [], 'html')
+ app.add_config_value('html_last_updated_fmt', None, 'html', [str])
+ app.add_config_value('html_sidebars', {}, 'html')
+ app.add_config_value('html_additional_pages', {}, 'html')
+ app.add_config_value('html_domain_indices', True, 'html', [list])
+ app.add_config_value('html_permalinks', True, 'html')
+ app.add_config_value('html_permalinks_icon', '¶', 'html')
+ app.add_config_value('html_use_index', True, 'html')
+ app.add_config_value('html_split_index', False, 'html')
+ app.add_config_value('html_copy_source', True, 'html')
+ app.add_config_value('html_show_sourcelink', True, 'html')
+ app.add_config_value('html_sourcelink_suffix', '.txt', 'html')
+ app.add_config_value('html_use_opensearch', '', 'html')
+ app.add_config_value('html_file_suffix', None, 'html', [str])
+ app.add_config_value('html_link_suffix', None, 'html', [str])
+ app.add_config_value('html_show_copyright', True, 'html')
+ app.add_config_value('html_show_search_summary', True, 'html')
+ app.add_config_value('html_show_sphinx', True, 'html')
+ app.add_config_value('html_context', {}, 'html')
+ app.add_config_value('html_output_encoding', 'utf-8', 'html')
+ app.add_config_value('html_compact_lists', True, 'html')
+ app.add_config_value('html_secnumber_suffix', '. ', 'html')
+ app.add_config_value('html_search_language', None, 'html', [str])
+ app.add_config_value('html_search_options', {}, 'html')
+ app.add_config_value('html_search_scorer', '', '')
+ app.add_config_value('html_scaled_image_link', True, 'html')
+ app.add_config_value('html_baseurl', '', 'html')
+ app.add_config_value('html_codeblock_linenos_style', 'inline', 'html', # RemovedInSphinx70Warning # noqa: E501
+ ENUM('table', 'inline'))
+ app.add_config_value('html_math_renderer', None, 'env')
+ app.add_config_value('html4_writer', False, 'html')
+
+ # events
+ app.add_event('html-collect-pages')
+ app.add_event('html-page-context')
+
+ # event handlers
+ app.connect('config-inited', convert_html_css_files, priority=800)
+ app.connect('config-inited', convert_html_js_files, priority=800)
+ app.connect('config-inited', validate_html_extra_path, priority=800)
+ app.connect('config-inited', validate_html_static_path, priority=800)
+ app.connect('config-inited', validate_html_logo, priority=800)
+ app.connect('config-inited', validate_html_favicon, priority=800)
+ app.connect('config-inited', error_on_html_4, priority=800)
+ app.connect('builder-inited', validate_math_renderer)
+ app.connect('html-page-context', setup_resource_paths)
+
+ # load default math renderer
+ app.setup_extension('sphinx.ext.mathjax')
+
+ # load transforms for HTML builder
+ app.setup_extension('sphinx.builders.html.transforms')
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
+
+
+# deprecated name -> (object to return, canonical path or empty string)
+_DEPRECATED_OBJECTS = {
+ 'Stylesheet': (_CascadingStyleSheet, 'sphinx.builders.html._assets._CascadingStyleSheet', (9, 0)), # NoQA: E501
+ 'JavaScript': (_JavaScript, 'sphinx.builders.html._assets._JavaScript', (9, 0)),
+}
+
+
+def __getattr__(name):
+ if name not in _DEPRECATED_OBJECTS:
+ msg = f'module {__name__!r} has no attribute {name!r}'
+ raise AttributeError(msg)
+
+ from sphinx.deprecation import _deprecation_warning
+
+ deprecated_object, canonical_name, remove = _DEPRECATED_OBJECTS[name]
+ _deprecation_warning(__name__, name, canonical_name, remove=remove)
+ return deprecated_object
diff --git a/sphinx/builders/html/_assets.py b/sphinx/builders/html/_assets.py
new file mode 100644
index 0000000..a72c500
--- /dev/null
+++ b/sphinx/builders/html/_assets.py
@@ -0,0 +1,146 @@
+from __future__ import annotations
+
+import os
+import warnings
+import zlib
+from typing import TYPE_CHECKING
+
+from sphinx.deprecation import RemovedInSphinx90Warning
+from sphinx.errors import ThemeError
+
+if TYPE_CHECKING:
+ from pathlib import Path
+
+
+class _CascadingStyleSheet:
+ filename: str | os.PathLike[str]
+ priority: int
+ attributes: dict[str, str]
+
+ def __init__(
+ self,
+ filename: str | os.PathLike[str], /, *,
+ priority: int = 500,
+ rel: str = 'stylesheet',
+ type: str = 'text/css',
+ **attributes: str,
+ ) -> None:
+ object.__setattr__(self, 'filename', filename)
+ object.__setattr__(self, 'priority', priority)
+ object.__setattr__(self, 'attributes', {'rel': rel, 'type': type, **attributes})
+
+ def __str__(self):
+ attr = ', '.join(f'{k}={v!r}' for k, v in self.attributes.items())
+ return (f'{self.__class__.__name__}({self.filename!r}, '
+ f'priority={self.priority}, '
+ f'{attr})')
+
+ def __eq__(self, other):
+ if isinstance(other, str):
+ warnings.warn('The str interface for _CascadingStyleSheet objects is deprecated. '
+ 'Use css.filename instead.', RemovedInSphinx90Warning, stacklevel=2)
+ return self.filename == other
+ if not isinstance(other, _CascadingStyleSheet):
+ return NotImplemented
+ return (self.filename == other.filename
+ and self.priority == other.priority
+ and self.attributes == other.attributes)
+
+ def __hash__(self):
+ return hash((self.filename, self.priority, *sorted(self.attributes.items())))
+
+ def __setattr__(self, key, value):
+ msg = f'{self.__class__.__name__} is immutable'
+ raise AttributeError(msg)
+
+ def __delattr__(self, key):
+ msg = f'{self.__class__.__name__} is immutable'
+ raise AttributeError(msg)
+
+ def __getattr__(self, key):
+ warnings.warn('The str interface for _CascadingStyleSheet objects is deprecated. '
+ 'Use css.filename instead.', RemovedInSphinx90Warning, stacklevel=2)
+ return getattr(os.fspath(self.filename), key)
+
+ def __getitem__(self, key):
+ warnings.warn('The str interface for _CascadingStyleSheet objects is deprecated. '
+ 'Use css.filename instead.', RemovedInSphinx90Warning, stacklevel=2)
+ return os.fspath(self.filename)[key]
+
+
+class _JavaScript:
+ filename: str | os.PathLike[str]
+ priority: int
+ attributes: dict[str, str]
+
+ def __init__(
+ self,
+ filename: str | os.PathLike[str], /, *,
+ priority: int = 500,
+ **attributes: str,
+ ) -> None:
+ object.__setattr__(self, 'filename', filename)
+ object.__setattr__(self, 'priority', priority)
+ object.__setattr__(self, 'attributes', attributes)
+
+ def __str__(self):
+ attr = ''
+ if self.attributes:
+ attr = ', ' + ', '.join(f'{k}={v!r}' for k, v in self.attributes.items())
+ return (f'{self.__class__.__name__}({self.filename!r}, '
+ f'priority={self.priority}'
+ f'{attr})')
+
+ def __eq__(self, other):
+ if isinstance(other, str):
+ warnings.warn('The str interface for _JavaScript objects is deprecated. '
+ 'Use js.filename instead.', RemovedInSphinx90Warning, stacklevel=2)
+ return self.filename == other
+ if not isinstance(other, _JavaScript):
+ return NotImplemented
+ return (self.filename == other.filename
+ and self.priority == other.priority
+ and self.attributes == other.attributes)
+
+ def __hash__(self):
+ return hash((self.filename, self.priority, *sorted(self.attributes.items())))
+
+ def __setattr__(self, key, value):
+ msg = f'{self.__class__.__name__} is immutable'
+ raise AttributeError(msg)
+
+ def __delattr__(self, key):
+ msg = f'{self.__class__.__name__} is immutable'
+ raise AttributeError(msg)
+
+ def __getattr__(self, key):
+ warnings.warn('The str interface for _JavaScript objects is deprecated. '
+ 'Use js.filename instead.', RemovedInSphinx90Warning, stacklevel=2)
+ return getattr(os.fspath(self.filename), key)
+
+ def __getitem__(self, key):
+ warnings.warn('The str interface for _JavaScript objects is deprecated. '
+ 'Use js.filename instead.', RemovedInSphinx90Warning, stacklevel=2)
+ return os.fspath(self.filename)[key]
+
+
+def _file_checksum(outdir: Path, filename: str | os.PathLike[str]) -> str:
+ filename = os.fspath(filename)
+ # Don't generate checksums for HTTP URIs
+ if '://' in filename:
+ return ''
+ # Some themes and extensions have used query strings
+ # for a similar asset checksum feature.
+ # As we cannot safely strip the query string,
+ # raise an error to the user.
+ if '?' in filename:
+ msg = f'Local asset file paths must not contain query strings: {filename!r}'
+ raise ThemeError(msg)
+ try:
+ # Remove all carriage returns to avoid checksum differences
+ content = outdir.joinpath(filename).read_bytes().translate(None, b'\r')
+ except FileNotFoundError:
+ return ''
+ if not content:
+ return ''
+ return f'{zlib.crc32(content):08x}'
diff --git a/sphinx/builders/html/transforms.py b/sphinx/builders/html/transforms.py
new file mode 100644
index 0000000..18a8d38
--- /dev/null
+++ b/sphinx/builders/html/transforms.py
@@ -0,0 +1,86 @@
+"""Transforms for HTML builder."""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+from sphinx.transforms.post_transforms import SphinxPostTransform
+from sphinx.util.nodes import NodeMatcher
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+
+class KeyboardTransform(SphinxPostTransform):
+ """Transform :kbd: role to more detailed form.
+
+ Before::
+
+ <literal class="kbd">
+ Control-x
+
+ After::
+
+ <literal class="kbd compound">
+ <literal class="kbd">
+ Control
+ -
+ <literal class="kbd">
+ x
+ """
+ default_priority = 400
+ formats = ('html',)
+ pattern = re.compile(r'(?<=.)(-|\+|\^|\s+)(?=.)')
+ multiwords_keys = (('caps', 'lock'),
+ ('page', 'down'),
+ ('page', 'up'),
+ ('scroll', 'lock'),
+ ('num', 'lock'),
+ ('sys', 'rq'),
+ ('back', 'space'))
+
+ def run(self, **kwargs: Any) -> None:
+ matcher = NodeMatcher(nodes.literal, classes=["kbd"])
+ # this list must be pre-created as during iteration new nodes
+ # are added which match the condition in the NodeMatcher.
+ for node in list(self.document.findall(matcher)): # type: nodes.literal
+ parts = self.pattern.split(node[-1].astext())
+ if len(parts) == 1 or self.is_multiwords_key(parts):
+ continue
+
+ node['classes'].append('compound')
+ node.pop()
+ while parts:
+ if self.is_multiwords_key(parts):
+ key = ''.join(parts[:3])
+ parts[:3] = []
+ else:
+ key = parts.pop(0)
+ node += nodes.literal('', key, classes=["kbd"])
+
+ try:
+ # key separator (ex. -, +, ^)
+ sep = parts.pop(0)
+ node += nodes.Text(sep)
+ except IndexError:
+ pass
+
+ def is_multiwords_key(self, parts: list[str]) -> bool:
+ if len(parts) >= 3 and parts[1].strip() == '':
+ name = parts[0].lower(), parts[2].lower()
+ return name in self.multiwords_keys
+ else:
+ return False
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_post_transform(KeyboardTransform)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/latex/__init__.py b/sphinx/builders/latex/__init__.py
new file mode 100644
index 0000000..3ece571
--- /dev/null
+++ b/sphinx/builders/latex/__init__.py
@@ -0,0 +1,551 @@
+"""LaTeX builder."""
+
+from __future__ import annotations
+
+import os
+import warnings
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils.frontend import OptionParser
+
+import sphinx.builders.latex.nodes # noqa: F401,E501 # Workaround: import this before writer to avoid ImportError
+from sphinx import addnodes, highlighting, package_dir
+from sphinx.builders import Builder
+from sphinx.builders.latex.constants import ADDITIONAL_SETTINGS, DEFAULT_SETTINGS, SHORTHANDOFF
+from sphinx.builders.latex.theming import Theme, ThemeFactory
+from sphinx.builders.latex.util import ExtBabel
+from sphinx.config import ENUM, Config
+from sphinx.environment.adapters.asset import ImageAdapter
+from sphinx.errors import NoUri, SphinxError
+from sphinx.locale import _, __
+from sphinx.util import logging, texescape
+from sphinx.util.console import bold, darkgreen # type: ignore[attr-defined]
+from sphinx.util.display import progress_message, status_iterator
+from sphinx.util.docutils import SphinxFileOutput, new_document
+from sphinx.util.fileutil import copy_asset_file
+from sphinx.util.i18n import format_date
+from sphinx.util.nodes import inline_all_toctrees
+from sphinx.util.osutil import SEP, make_filename_from_project
+from sphinx.util.template import LaTeXRenderer
+from sphinx.writers.latex import LaTeXTranslator, LaTeXWriter
+
+# load docutils.nodes after loading sphinx.builders.latex.nodes
+from docutils import nodes # isort:skip
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+XINDY_LANG_OPTIONS = {
+ # language codes from docutils.writers.latex2e.Babel
+ # ! xindy language names may differ from those in use by LaTeX/babel
+ # ! xindy does not support all Latin scripts as recognized by LaTeX/babel
+ # ! not all xindy-supported languages appear in Babel.language_codes
+ # cd /usr/local/texlive/2018/texmf-dist/xindy/modules/lang
+ # find . -name '*utf8.xdy'
+ # LATIN
+ 'sq': '-L albanian -C utf8 ',
+ 'hr': '-L croatian -C utf8 ',
+ 'cs': '-L czech -C utf8 ',
+ 'da': '-L danish -C utf8 ',
+ 'nl': '-L dutch-ij-as-ij -C utf8 ',
+ 'en': '-L english -C utf8 ',
+ 'eo': '-L esperanto -C utf8 ',
+ 'et': '-L estonian -C utf8 ',
+ 'fi': '-L finnish -C utf8 ',
+ 'fr': '-L french -C utf8 ',
+ 'de': '-L german-din5007 -C utf8 ',
+ 'is': '-L icelandic -C utf8 ',
+ 'it': '-L italian -C utf8 ',
+ 'la': '-L latin -C utf8 ',
+ 'lv': '-L latvian -C utf8 ',
+ 'lt': '-L lithuanian -C utf8 ',
+ 'dsb': '-L lower-sorbian -C utf8 ',
+ 'ds': '-L lower-sorbian -C utf8 ', # trick, no conflict
+ 'nb': '-L norwegian -C utf8 ',
+ 'no': '-L norwegian -C utf8 ', # and what about nynorsk?
+ 'pl': '-L polish -C utf8 ',
+ 'pt': '-L portuguese -C utf8 ',
+ 'ro': '-L romanian -C utf8 ',
+ 'sk': '-L slovak-small -C utf8 ', # there is also slovak-large
+ 'sl': '-L slovenian -C utf8 ',
+ 'es': '-L spanish-modern -C utf8 ', # there is also spanish-traditional
+ 'sv': '-L swedish -C utf8 ',
+ 'tr': '-L turkish -C utf8 ',
+ 'hsb': '-L upper-sorbian -C utf8 ',
+ 'hs': '-L upper-sorbian -C utf8 ', # trick, no conflict
+ 'vi': '-L vietnamese -C utf8 ',
+ # CYRILLIC
+ # for usage with pdflatex, needs also cyrLICRutf8.xdy module
+ 'be': '-L belarusian -C utf8 ',
+ 'bg': '-L bulgarian -C utf8 ',
+ 'mk': '-L macedonian -C utf8 ',
+ 'mn': '-L mongolian-cyrillic -C utf8 ',
+ 'ru': '-L russian -C utf8 ',
+ 'sr': '-L serbian -C utf8 ',
+ 'sh-cyrl': '-L serbian -C utf8 ',
+ 'sh': '-L serbian -C utf8 ', # trick, no conflict
+ 'uk': '-L ukrainian -C utf8 ',
+ # GREEK
+ # can work only with xelatex/lualatex, not supported by texindy+pdflatex
+ 'el': '-L greek -C utf8 ',
+ # FIXME, not compatible with [:2] slice but does Sphinx support Greek ?
+ 'el-polyton': '-L greek-polytonic -C utf8 ',
+}
+
+XINDY_CYRILLIC_SCRIPTS = [
+ 'be', 'bg', 'mk', 'mn', 'ru', 'sr', 'sh', 'uk',
+]
+
+logger = logging.getLogger(__name__)
+
+
+class LaTeXBuilder(Builder):
+ """
+ Builds LaTeX output to create PDF.
+ """
+ name = 'latex'
+ format = 'latex'
+ epilog = __('The LaTeX files are in %(outdir)s.')
+ if os.name == 'posix':
+ epilog += __("\nRun 'make' in that directory to run these through "
+ "(pdf)latex\n"
+ "(use `make latexpdf' here to do that automatically).")
+
+ supported_image_types = ['application/pdf', 'image/png', 'image/jpeg']
+ supported_remote_images = False
+ default_translator_class = LaTeXTranslator
+
+ def init(self) -> None:
+ self.babel: ExtBabel
+ self.context: dict[str, Any] = {}
+ self.docnames: Iterable[str] = {}
+ self.document_data: list[tuple[str, str, str, str, str, bool]] = []
+ self.themes = ThemeFactory(self.app)
+ texescape.init()
+
+ self.init_context()
+ self.init_babel()
+ self.init_multilingual()
+
+ def get_outdated_docs(self) -> str | list[str]:
+ return 'all documents' # for now
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ if docname not in self.docnames:
+ raise NoUri(docname, typ)
+ return '%' + docname
+
+ def get_relative_uri(self, from_: str, to: str, typ: str | None = None) -> str:
+ # ignore source path
+ return self.get_target_uri(to, typ)
+
+ def init_document_data(self) -> None:
+ preliminary_document_data = [list(x) for x in self.config.latex_documents]
+ if not preliminary_document_data:
+ logger.warning(__('no "latex_documents" config value found; no documents '
+ 'will be written'))
+ return
+ # assign subdirs to titles
+ self.titles: list[tuple[str, str]] = []
+ for entry in preliminary_document_data:
+ docname = entry[0]
+ if docname not in self.env.all_docs:
+ logger.warning(__('"latex_documents" config value references unknown '
+ 'document %s'), docname)
+ continue
+ self.document_data.append(entry) # type: ignore[arg-type]
+ if docname.endswith(SEP + 'index'):
+ docname = docname[:-5]
+ self.titles.append((docname, entry[2]))
+
+ def init_context(self) -> None:
+ self.context = DEFAULT_SETTINGS.copy()
+
+ # Add special settings for latex_engine
+ self.context.update(ADDITIONAL_SETTINGS.get(self.config.latex_engine, {}))
+
+ # Add special settings for (latex_engine, language_code)
+ key = (self.config.latex_engine, self.config.language[:2])
+ self.context.update(ADDITIONAL_SETTINGS.get(key, {}))
+
+ # Apply user settings to context
+ self.context.update(self.config.latex_elements)
+ self.context['release'] = self.config.release
+ self.context['use_xindy'] = self.config.latex_use_xindy
+ self.context['booktabs'] = 'booktabs' in self.config.latex_table_style
+ self.context['borderless'] = 'borderless' in self.config.latex_table_style
+ self.context['colorrows'] = 'colorrows' in self.config.latex_table_style
+
+ if self.config.today:
+ self.context['date'] = self.config.today
+ else:
+ self.context['date'] = format_date(self.config.today_fmt or _('%b %d, %Y'),
+ language=self.config.language)
+
+ if self.config.latex_logo:
+ self.context['logofilename'] = path.basename(self.config.latex_logo)
+
+ # for compatibilities
+ self.context['indexname'] = _('Index')
+ if self.config.release:
+ # Show the release label only if release value exists
+ self.context.setdefault('releasename', _('Release'))
+
+ def update_context(self) -> None:
+ """Update template variables for .tex file just before writing."""
+ # Apply extension settings to context
+ registry = self.app.registry
+ self.context['packages'] = registry.latex_packages
+ self.context['packages_after_hyperref'] = registry.latex_packages_after_hyperref
+
+ def init_babel(self) -> None:
+ self.babel = ExtBabel(self.config.language, not self.context['babel'])
+ if not self.babel.is_supported_language():
+ # emit warning if specified language is invalid
+ # (only emitting, nothing changed to processing)
+ logger.warning(__('no Babel option known for language %r'),
+ self.config.language)
+
+ def init_multilingual(self) -> None:
+ if self.context['latex_engine'] == 'pdflatex':
+ if not self.babel.uses_cyrillic():
+ if 'X2' in self.context['fontenc']:
+ self.context['substitutefont'] = '\\usepackage{substitutefont}'
+ self.context['textcyrillic'] = ('\\usepackage[Xtwo]'
+ '{sphinxpackagecyrillic}')
+ elif 'T2A' in self.context['fontenc']:
+ self.context['substitutefont'] = '\\usepackage{substitutefont}'
+ self.context['textcyrillic'] = ('\\usepackage[TtwoA]'
+ '{sphinxpackagecyrillic}')
+ if 'LGR' in self.context['fontenc']:
+ self.context['substitutefont'] = '\\usepackage{substitutefont}'
+ else:
+ self.context['textgreek'] = ''
+ if self.context['substitutefont'] == '':
+ self.context['fontsubstitution'] = ''
+
+ # 'babel' key is public and user setting must be obeyed
+ if self.context['babel']:
+ self.context['classoptions'] += ',' + self.babel.get_language()
+ # this branch is not taken for xelatex/lualatex if default settings
+ self.context['multilingual'] = self.context['babel']
+ self.context['shorthandoff'] = SHORTHANDOFF
+
+ # Times fonts don't work with Cyrillic languages
+ if self.babel.uses_cyrillic() and 'fontpkg' not in self.config.latex_elements:
+ self.context['fontpkg'] = ''
+ elif self.context['polyglossia']:
+ self.context['classoptions'] += ',' + self.babel.get_language()
+ options = self.babel.get_mainlanguage_options()
+ if options:
+ language = fr'\setmainlanguage[{options}]{{{self.babel.get_language()}}}'
+ else:
+ language = r'\setmainlanguage{%s}' % self.babel.get_language()
+
+ self.context['multilingual'] = f'{self.context["polyglossia"]}\n{language}'
+
+ def write_stylesheet(self) -> None:
+ highlighter = highlighting.PygmentsBridge('latex', self.config.pygments_style)
+ stylesheet = path.join(self.outdir, 'sphinxhighlight.sty')
+ with open(stylesheet, 'w', encoding="utf-8") as f:
+ f.write('\\NeedsTeXFormat{LaTeX2e}[1995/12/01]\n')
+ f.write('\\ProvidesPackage{sphinxhighlight}'
+ '[2022/06/30 stylesheet for highlighting with pygments]\n')
+ f.write('% Its contents depend on pygments_style configuration variable.\n\n')
+ f.write(highlighter.get_stylesheet())
+
+ def copy_assets(self) -> None:
+ self.copy_support_files()
+
+ if self.config.latex_additional_files:
+ self.copy_latex_additional_files()
+
+ def write(self, *ignored: Any) -> None:
+ docwriter = LaTeXWriter(self)
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ # DeprecationWarning: The frontend.OptionParser class will be replaced
+ # by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
+ docsettings: Any = OptionParser(
+ defaults=self.env.settings,
+ components=(docwriter,),
+ read_config_files=True).get_default_values()
+
+ self.init_document_data()
+ self.write_stylesheet()
+ self.copy_assets()
+
+ for entry in self.document_data:
+ docname, targetname, title, author, themename = entry[:5]
+ theme = self.themes.get(themename)
+ toctree_only = False
+ if len(entry) > 5:
+ toctree_only = entry[5]
+ destination = SphinxFileOutput(destination_path=path.join(self.outdir, targetname),
+ encoding='utf-8', overwrite_if_changed=True)
+ with progress_message(__("processing %s") % targetname):
+ doctree = self.env.get_doctree(docname)
+ toctree = next(doctree.findall(addnodes.toctree), None)
+ if toctree and toctree.get('maxdepth') > 0:
+ tocdepth = toctree.get('maxdepth')
+ else:
+ tocdepth = None
+
+ doctree = self.assemble_doctree(
+ docname, toctree_only,
+ appendices=(self.config.latex_appendices if theme.name != 'howto' else []))
+ doctree['docclass'] = theme.docclass
+ doctree['contentsname'] = self.get_contentsname(docname)
+ doctree['tocdepth'] = tocdepth
+ self.post_process_images(doctree)
+ self.update_doc_context(title, author, theme)
+ self.update_context()
+
+ with progress_message(__("writing")):
+ docsettings._author = author
+ docsettings._title = title
+ docsettings._contentsname = doctree['contentsname']
+ docsettings._docname = docname
+ docsettings._docclass = theme.name
+
+ doctree.settings = docsettings
+ docwriter.theme = theme
+ docwriter.write(doctree, destination)
+
+ def get_contentsname(self, indexfile: str) -> str:
+ tree = self.env.get_doctree(indexfile)
+ contentsname = ''
+ for toctree in tree.findall(addnodes.toctree):
+ if 'caption' in toctree:
+ contentsname = toctree['caption']
+ break
+
+ return contentsname
+
+ def update_doc_context(self, title: str, author: str, theme: Theme) -> None:
+ self.context['title'] = title
+ self.context['author'] = author
+ self.context['docclass'] = theme.docclass
+ self.context['papersize'] = theme.papersize
+ self.context['pointsize'] = theme.pointsize
+ self.context['wrapperclass'] = theme.wrapperclass
+
+ def assemble_doctree(
+ self, indexfile: str, toctree_only: bool, appendices: list[str],
+ ) -> nodes.document:
+ self.docnames = set([indexfile] + appendices)
+ logger.info(darkgreen(indexfile) + " ", nonl=True)
+ 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('<latex output>')
+ new_sect = nodes.section()
+ new_sect += nodes.title('<Set title in conf.py>',
+ '<Set title in conf.py>')
+ new_tree += new_sect
+ for node in tree.findall(addnodes.toctree):
+ new_sect += node
+ tree = new_tree
+ largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
+ darkgreen, [indexfile])
+ largetree['docname'] = indexfile
+ for docname in appendices:
+ appendix = self.env.get_doctree(docname)
+ appendix['docname'] = docname
+ largetree.append(appendix)
+ logger.info('')
+ logger.info(__("resolving references..."))
+ self.env.resolve_references(largetree, indexfile, self)
+ # resolve :ref:s to distant tex files -- we can't add a cross-reference,
+ # but append the document name
+ for pendingnode in largetree.findall(addnodes.pending_xref):
+ docname = pendingnode['refdocname']
+ sectname = pendingnode['refsectname']
+ newnodes: list[Node] = [nodes.emphasis(sectname, sectname)]
+ for subdir, title in self.titles:
+ if docname.startswith(subdir):
+ newnodes.append(nodes.Text(_(' (in ')))
+ newnodes.append(nodes.emphasis(title, title))
+ newnodes.append(nodes.Text(')'))
+ break
+ else:
+ pass
+ pendingnode.replace_self(newnodes)
+ return largetree
+
+ def finish(self) -> None:
+ self.copy_image_files()
+ self.write_message_catalog()
+
+ @progress_message(__('copying TeX support files'))
+ def copy_support_files(self) -> None:
+ """copy TeX support files from texinputs."""
+ # configure usage of xindy (impacts Makefile and latexmkrc)
+ # FIXME: convert this rather to a confval with suitable default
+ # according to language ? but would require extra documentation
+ xindy_lang_option = XINDY_LANG_OPTIONS.get(self.config.language[:2],
+ '-L general -C utf8 ')
+ xindy_cyrillic = self.config.language[:2] in XINDY_CYRILLIC_SCRIPTS
+
+ context = {
+ 'latex_engine': self.config.latex_engine,
+ 'xindy_use': self.config.latex_use_xindy,
+ 'xindy_lang_option': xindy_lang_option,
+ 'xindy_cyrillic': xindy_cyrillic,
+ }
+ logger.info(bold(__('copying TeX support files...')))
+ staticdirname = path.join(package_dir, 'texinputs')
+ for filename in os.listdir(staticdirname):
+ if not filename.startswith('.'):
+ copy_asset_file(path.join(staticdirname, filename),
+ self.outdir, context=context)
+
+ # use pre-1.6.x Makefile for make latexpdf on Windows
+ if os.name == 'nt':
+ staticdirname = path.join(package_dir, 'texinputs_win')
+ copy_asset_file(path.join(staticdirname, 'Makefile_t'),
+ self.outdir, context=context)
+
+ @progress_message(__('copying additional files'))
+ def copy_latex_additional_files(self) -> None:
+ for filename in self.config.latex_additional_files:
+ logger.info(' ' + filename, nonl=True)
+ copy_asset_file(path.join(self.confdir, filename), self.outdir)
+
+ def copy_image_files(self) -> None:
+ if self.images:
+ stringify_func = ImageAdapter(self.app.env).get_original_image_uri
+ for src in status_iterator(self.images, __('copying images... '), "brown",
+ len(self.images), self.app.verbosity,
+ stringify_func=stringify_func):
+ dest = self.images[src]
+ try:
+ copy_asset_file(path.join(self.srcdir, src),
+ path.join(self.outdir, dest))
+ except Exception as err:
+ logger.warning(__('cannot copy image file %r: %s'),
+ path.join(self.srcdir, src), err)
+ if self.config.latex_logo:
+ if not path.isfile(path.join(self.confdir, self.config.latex_logo)):
+ raise SphinxError(__('logo file %r does not exist') % self.config.latex_logo)
+ copy_asset_file(path.join(self.confdir, self.config.latex_logo), self.outdir)
+
+ def write_message_catalog(self) -> None:
+ formats = self.config.numfig_format
+ context = {
+ 'addtocaptions': r'\@iden',
+ 'figurename': formats.get('figure', '').split('%s', 1),
+ 'tablename': formats.get('table', '').split('%s', 1),
+ 'literalblockname': formats.get('code-block', '').split('%s', 1),
+ }
+
+ if self.context['babel'] or self.context['polyglossia']:
+ context['addtocaptions'] = r'\addto\captions%s' % self.babel.get_language()
+
+ filename = path.join(package_dir, 'templates', 'latex', 'sphinxmessages.sty_t')
+ copy_asset_file(filename, self.outdir, context=context, renderer=LaTeXRenderer())
+
+
+def validate_config_values(app: Sphinx, config: Config) -> None:
+ for key in list(config.latex_elements):
+ if key not in DEFAULT_SETTINGS:
+ msg = __("Unknown configure key: latex_elements[%r], ignored.")
+ logger.warning(msg % (key,))
+ config.latex_elements.pop(key)
+
+
+def validate_latex_theme_options(app: Sphinx, config: Config) -> None:
+ for key in list(config.latex_theme_options):
+ if key not in Theme.UPDATABLE_KEYS:
+ msg = __("Unknown theme option: latex_theme_options[%r], ignored.")
+ logger.warning(msg % (key,))
+ config.latex_theme_options.pop(key)
+
+
+def install_packages_for_ja(app: Sphinx) -> None:
+ """Install packages for Japanese."""
+ if app.config.language == 'ja' and app.config.latex_engine in ('platex', 'uplatex'):
+ app.add_latex_package('pxjahyper', after_hyperref=True)
+
+
+def default_latex_engine(config: Config) -> str:
+ """ Better default latex_engine settings for specific languages. """
+ if config.language == 'ja':
+ return 'uplatex'
+ if config.language.startswith('zh'):
+ return 'xelatex'
+ if config.language == 'el':
+ return 'xelatex'
+ return 'pdflatex'
+
+
+def default_latex_docclass(config: Config) -> dict[str, str]:
+ """ Better default latex_docclass settings for specific languages. """
+ if config.language == 'ja':
+ if config.latex_engine == 'uplatex':
+ return {'manual': 'ujbook',
+ 'howto': 'ujreport'}
+ else:
+ return {'manual': 'jsbook',
+ 'howto': 'jreport'}
+ else:
+ return {}
+
+
+def default_latex_use_xindy(config: Config) -> bool:
+ """ Better default latex_use_xindy settings for specific engines. """
+ return config.latex_engine in {'xelatex', 'lualatex'}
+
+
+def default_latex_documents(config: Config) -> list[tuple[str, str, str, str, str]]:
+ """ Better default latex_documents settings. """
+ project = texescape.escape(config.project, config.latex_engine)
+ author = texescape.escape(config.author, config.latex_engine)
+ return [(config.root_doc,
+ make_filename_from_project(config.project) + '.tex',
+ texescape.escape_abbr(project),
+ texescape.escape_abbr(author),
+ config.latex_theme)]
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.setup_extension('sphinx.builders.latex.transforms')
+
+ app.add_builder(LaTeXBuilder)
+ app.connect('config-inited', validate_config_values, priority=800)
+ app.connect('config-inited', validate_latex_theme_options, priority=800)
+ app.connect('builder-inited', install_packages_for_ja)
+
+ app.add_config_value('latex_engine', default_latex_engine, False,
+ ENUM('pdflatex', 'xelatex', 'lualatex', 'platex', 'uplatex'))
+ app.add_config_value('latex_documents', default_latex_documents, False)
+ app.add_config_value('latex_logo', None, False, [str])
+ app.add_config_value('latex_appendices', [], False)
+ app.add_config_value('latex_use_latex_multicolumn', False, False)
+ app.add_config_value('latex_use_xindy', default_latex_use_xindy, False, [bool])
+ app.add_config_value('latex_toplevel_sectioning', None, False,
+ ENUM(None, 'part', 'chapter', 'section'))
+ app.add_config_value('latex_domain_indices', True, False, [list])
+ app.add_config_value('latex_show_urls', 'no', False)
+ app.add_config_value('latex_show_pagerefs', False, False)
+ app.add_config_value('latex_elements', {}, False)
+ app.add_config_value('latex_additional_files', [], False)
+ app.add_config_value('latex_table_style', ['booktabs', 'colorrows'], False, [list])
+ app.add_config_value('latex_theme', 'manual', False, [str])
+ app.add_config_value('latex_theme_options', {}, False)
+ app.add_config_value('latex_theme_path', [], False, [list])
+
+ app.add_config_value('latex_docclass', default_latex_docclass, False)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/latex/constants.py b/sphinx/builders/latex/constants.py
new file mode 100644
index 0000000..ce646d0
--- /dev/null
+++ b/sphinx/builders/latex/constants.py
@@ -0,0 +1,210 @@
+"""constants for LaTeX builder."""
+
+from __future__ import annotations
+
+from typing import Any
+
+PDFLATEX_DEFAULT_FONTPKG = r'''
+\usepackage{tgtermes}
+\usepackage{tgheros}
+\renewcommand{\ttdefault}{txtt}
+'''
+
+PDFLATEX_DEFAULT_FONTSUBSTITUTION = r'''
+\expandafter\ifx\csname T@LGR\endcsname\relax
+\else
+% LGR was declared as font encoding
+ \substitutefont{LGR}{\rmdefault}{cmr}
+ \substitutefont{LGR}{\sfdefault}{cmss}
+ \substitutefont{LGR}{\ttdefault}{cmtt}
+\fi
+\expandafter\ifx\csname T@X2\endcsname\relax
+ \expandafter\ifx\csname T@T2A\endcsname\relax
+ \else
+ % T2A was declared as font encoding
+ \substitutefont{T2A}{\rmdefault}{cmr}
+ \substitutefont{T2A}{\sfdefault}{cmss}
+ \substitutefont{T2A}{\ttdefault}{cmtt}
+ \fi
+\else
+% X2 was declared as font encoding
+ \substitutefont{X2}{\rmdefault}{cmr}
+ \substitutefont{X2}{\sfdefault}{cmss}
+ \substitutefont{X2}{\ttdefault}{cmtt}
+\fi
+'''
+
+XELATEX_DEFAULT_FONTPKG = r'''
+\setmainfont{FreeSerif}[
+ Extension = .otf,
+ UprightFont = *,
+ ItalicFont = *Italic,
+ BoldFont = *Bold,
+ BoldItalicFont = *BoldItalic
+]
+\setsansfont{FreeSans}[
+ Extension = .otf,
+ UprightFont = *,
+ ItalicFont = *Oblique,
+ BoldFont = *Bold,
+ BoldItalicFont = *BoldOblique,
+]
+\setmonofont{FreeMono}[
+ Extension = .otf,
+ UprightFont = *,
+ ItalicFont = *Oblique,
+ BoldFont = *Bold,
+ BoldItalicFont = *BoldOblique,
+]
+'''
+
+XELATEX_GREEK_DEFAULT_FONTPKG = (XELATEX_DEFAULT_FONTPKG +
+ '\n\\newfontfamily\\greekfont{FreeSerif}' +
+ '\n\\newfontfamily\\greekfontsf{FreeSans}' +
+ '\n\\newfontfamily\\greekfonttt{FreeMono}')
+
+LUALATEX_DEFAULT_FONTPKG = XELATEX_DEFAULT_FONTPKG
+
+DEFAULT_SETTINGS: dict[str, Any] = {
+ 'latex_engine': 'pdflatex',
+ 'papersize': '',
+ 'pointsize': '',
+ 'pxunit': '.75bp',
+ 'classoptions': '',
+ 'extraclassoptions': '',
+ 'maxlistdepth': '',
+ 'sphinxpkgoptions': '',
+ 'sphinxsetup': '',
+ 'fvset': '\\fvset{fontsize=auto}',
+ 'passoptionstopackages': '',
+ 'geometry': '\\usepackage{geometry}',
+ 'inputenc': '',
+ 'utf8extra': '',
+ 'cmappkg': '\\usepackage{cmap}',
+ 'fontenc': '\\usepackage[T1]{fontenc}',
+ 'amsmath': '\\usepackage{amsmath,amssymb,amstext}',
+ 'multilingual': '',
+ 'babel': '\\usepackage{babel}',
+ 'polyglossia': '',
+ 'fontpkg': PDFLATEX_DEFAULT_FONTPKG,
+ 'fontsubstitution': PDFLATEX_DEFAULT_FONTSUBSTITUTION,
+ 'substitutefont': '',
+ 'textcyrillic': '',
+ 'textgreek': '\\usepackage{textalpha}',
+ 'fncychap': '\\usepackage[Bjarne]{fncychap}',
+ 'hyperref': ('% Include hyperref last.\n'
+ '\\usepackage{hyperref}\n'
+ '% Fix anchor placement for figures with captions.\n'
+ '\\usepackage{hypcap}% it must be loaded after hyperref.\n'
+ '% Set up styles of URL: it should be placed after hyperref.\n'
+ '\\urlstyle{same}'),
+ 'contentsname': '',
+ 'extrapackages': '',
+ 'preamble': '',
+ 'title': '',
+ 'release': '',
+ 'author': '',
+ 'releasename': '',
+ 'makeindex': '\\makeindex',
+ 'shorthandoff': '',
+ 'maketitle': '\\sphinxmaketitle',
+ 'tableofcontents': '\\sphinxtableofcontents',
+ 'atendofbody': '',
+ 'printindex': '\\printindex',
+ 'transition': '\n\n\\bigskip\\hrule\\bigskip\n\n',
+ 'figure_align': 'htbp',
+ 'tocdepth': '',
+ 'secnumdepth': '',
+}
+
+ADDITIONAL_SETTINGS: dict[Any, dict[str, Any]] = {
+ 'pdflatex': {
+ 'inputenc': '\\usepackage[utf8]{inputenc}',
+ 'utf8extra': ('\\ifdefined\\DeclareUnicodeCharacter\n'
+ '% support both utf8 and utf8x syntaxes\n'
+ ' \\ifdefined\\DeclareUnicodeCharacterAsOptional\n'
+ ' \\def\\sphinxDUC#1{\\DeclareUnicodeCharacter{"#1}}\n'
+ ' \\else\n'
+ ' \\let\\sphinxDUC\\DeclareUnicodeCharacter\n'
+ ' \\fi\n'
+ ' \\sphinxDUC{00A0}{\\nobreakspace}\n'
+ ' \\sphinxDUC{2500}{\\sphinxunichar{2500}}\n'
+ ' \\sphinxDUC{2502}{\\sphinxunichar{2502}}\n'
+ ' \\sphinxDUC{2514}{\\sphinxunichar{2514}}\n'
+ ' \\sphinxDUC{251C}{\\sphinxunichar{251C}}\n'
+ ' \\sphinxDUC{2572}{\\textbackslash}\n'
+ '\\fi'),
+ },
+ 'xelatex': {
+ 'latex_engine': 'xelatex',
+ 'polyglossia': '\\usepackage{polyglossia}',
+ 'babel': '',
+ 'fontenc': ('\\usepackage{fontspec}\n'
+ '\\defaultfontfeatures[\\rmfamily,\\sffamily,\\ttfamily]{}'),
+ 'fontpkg': XELATEX_DEFAULT_FONTPKG,
+ 'fvset': '\\fvset{fontsize=\\small}',
+ 'fontsubstitution': '',
+ 'textgreek': '',
+ 'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0'
+ '{\\leavevmode\\nobreak\\ }'),
+ },
+ 'lualatex': {
+ 'latex_engine': 'lualatex',
+ 'polyglossia': '\\usepackage{polyglossia}',
+ 'babel': '',
+ 'fontenc': ('\\usepackage{fontspec}\n'
+ '\\defaultfontfeatures[\\rmfamily,\\sffamily,\\ttfamily]{}'),
+ 'fontpkg': LUALATEX_DEFAULT_FONTPKG,
+ 'fvset': '\\fvset{fontsize=\\small}',
+ 'fontsubstitution': '',
+ 'textgreek': '',
+ 'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0'
+ '{\\leavevmode\\nobreak\\ }'),
+ },
+ 'platex': {
+ 'latex_engine': 'platex',
+ 'babel': '',
+ 'classoptions': ',dvipdfmx',
+ 'fontpkg': PDFLATEX_DEFAULT_FONTPKG,
+ 'fontsubstitution': '',
+ 'textgreek': '',
+ 'fncychap': '',
+ 'geometry': '\\usepackage[dvipdfm]{geometry}',
+ },
+ 'uplatex': {
+ 'latex_engine': 'uplatex',
+ 'babel': '',
+ 'classoptions': ',dvipdfmx',
+ 'fontpkg': PDFLATEX_DEFAULT_FONTPKG,
+ 'fontsubstitution': '',
+ 'textgreek': '',
+ 'fncychap': '',
+ 'geometry': '\\usepackage[dvipdfm]{geometry}',
+ },
+
+ # special settings for latex_engine + language_code
+ ('xelatex', 'fr'): {
+ # use babel instead of polyglossia by default
+ 'polyglossia': '',
+ 'babel': '\\usepackage{babel}',
+ },
+ ('xelatex', 'zh'): {
+ 'polyglossia': '',
+ 'babel': '\\usepackage{babel}',
+ 'fontenc': '\\usepackage{xeCJK}',
+ # set formatcom=\xeCJKVerbAddon to prevent xeCJK from adding extra spaces in
+ # fancyvrb Verbatim environment.
+ 'fvset': '\\fvset{fontsize=\\small,formatcom=\\xeCJKVerbAddon}',
+ },
+ ('xelatex', 'el'): {
+ 'fontpkg': XELATEX_GREEK_DEFAULT_FONTPKG,
+ },
+}
+
+
+SHORTHANDOFF = r'''
+\ifdefined\shorthandoff
+ \ifnum\catcode`\=\string=\active\shorthandoff{=}\fi
+ \ifnum\catcode`\"=\active\shorthandoff{"}\fi
+\fi
+'''
diff --git a/sphinx/builders/latex/nodes.py b/sphinx/builders/latex/nodes.py
new file mode 100644
index 0000000..2c008b9
--- /dev/null
+++ b/sphinx/builders/latex/nodes.py
@@ -0,0 +1,37 @@
+"""Additional nodes for LaTeX writer."""
+
+from docutils import nodes
+
+
+class captioned_literal_block(nodes.container):
+ """A node for a container of literal_block having a caption."""
+ pass
+
+
+class footnotemark(nodes.Inline, nodes.Referential, nodes.TextElement):
+ """A node represents ``\footnotemark``."""
+ pass
+
+
+class footnotetext(nodes.General, nodes.BackLinkable, nodes.Element,
+ nodes.Labeled, nodes.Targetable):
+ """A node represents ``\footnotetext``."""
+
+
+class math_reference(nodes.Inline, nodes.Referential, nodes.TextElement):
+ """A node for a reference for equation."""
+ pass
+
+
+class thebibliography(nodes.container):
+ """A node for wrapping bibliographies."""
+ pass
+
+
+HYPERLINK_SUPPORT_NODES = (
+ nodes.figure,
+ nodes.literal_block,
+ nodes.table,
+ nodes.section,
+ captioned_literal_block,
+)
diff --git a/sphinx/builders/latex/theming.py b/sphinx/builders/latex/theming.py
new file mode 100644
index 0000000..21b49e8
--- /dev/null
+++ b/sphinx/builders/latex/theming.py
@@ -0,0 +1,135 @@
+"""Theming support for LaTeX builder."""
+
+from __future__ import annotations
+
+import configparser
+from os import path
+from typing import TYPE_CHECKING
+
+from sphinx.errors import ThemeError
+from sphinx.locale import __
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+
+logger = logging.getLogger(__name__)
+
+
+class Theme:
+ """A set of LaTeX configurations."""
+
+ LATEX_ELEMENTS_KEYS = ['papersize', 'pointsize']
+ UPDATABLE_KEYS = ['papersize', 'pointsize']
+
+ def __init__(self, name: str) -> None:
+ self.name = name
+ self.docclass = name
+ self.wrapperclass = name
+ self.papersize = 'letterpaper'
+ self.pointsize = '10pt'
+ self.toplevel_sectioning = 'chapter'
+
+ def update(self, config: Config) -> None:
+ """Override theme settings by user's configuration."""
+ for key in self.LATEX_ELEMENTS_KEYS:
+ if config.latex_elements.get(key):
+ value = config.latex_elements[key]
+ setattr(self, key, value)
+
+ for key in self.UPDATABLE_KEYS:
+ if key in config.latex_theme_options:
+ value = config.latex_theme_options[key]
+ setattr(self, key, value)
+
+
+class BuiltInTheme(Theme):
+ """A built-in LaTeX theme."""
+
+ def __init__(self, name: str, config: Config) -> None:
+ super().__init__(name)
+
+ if name == 'howto':
+ self.docclass = config.latex_docclass.get('howto', 'article')
+ else:
+ self.docclass = config.latex_docclass.get('manual', 'report')
+
+ if name in ('manual', 'howto'):
+ self.wrapperclass = 'sphinx' + name
+ else:
+ self.wrapperclass = name
+
+ # we assume LaTeX class provides \chapter command except in case
+ # of non-Japanese 'howto' case
+ if name == 'howto' and not self.docclass.startswith('j'):
+ self.toplevel_sectioning = 'section'
+ else:
+ self.toplevel_sectioning = 'chapter'
+
+
+class UserTheme(Theme):
+ """A user defined LaTeX theme."""
+
+ REQUIRED_CONFIG_KEYS = ['docclass', 'wrapperclass']
+ OPTIONAL_CONFIG_KEYS = ['papersize', 'pointsize', 'toplevel_sectioning']
+
+ def __init__(self, name: str, filename: str) -> None:
+ super().__init__(name)
+ self.config = configparser.RawConfigParser()
+ self.config.read(path.join(filename), encoding='utf-8')
+
+ for key in self.REQUIRED_CONFIG_KEYS:
+ try:
+ value = self.config.get('theme', key)
+ setattr(self, key, value)
+ except configparser.NoSectionError as exc:
+ raise ThemeError(__('%r doesn\'t have "theme" setting') %
+ filename) from exc
+ except configparser.NoOptionError as exc:
+ raise ThemeError(__('%r doesn\'t have "%s" setting') %
+ (filename, exc.args[0])) from exc
+
+ for key in self.OPTIONAL_CONFIG_KEYS:
+ try:
+ value = self.config.get('theme', key)
+ setattr(self, key, value)
+ except configparser.NoOptionError:
+ pass
+
+
+class ThemeFactory:
+ """A factory class for LaTeX Themes."""
+
+ def __init__(self, app: Sphinx) -> None:
+ self.themes: dict[str, Theme] = {}
+ self.theme_paths = [path.join(app.srcdir, p) for p in app.config.latex_theme_path]
+ self.config = app.config
+ self.load_builtin_themes(app.config)
+
+ def load_builtin_themes(self, config: Config) -> None:
+ """Load built-in themes."""
+ self.themes['manual'] = BuiltInTheme('manual', config)
+ self.themes['howto'] = BuiltInTheme('howto', config)
+
+ def get(self, name: str) -> Theme:
+ """Get a theme for given *name*."""
+ if name in self.themes:
+ theme = self.themes[name]
+ else:
+ theme = self.find_user_theme(name) or Theme(name)
+
+ theme.update(self.config)
+ return theme
+
+ def find_user_theme(self, name: str) -> Theme | None:
+ """Find a theme named as *name* from latex_theme_path."""
+ for theme_path in self.theme_paths:
+ config_path = path.join(theme_path, name, 'theme.conf')
+ if path.isfile(config_path):
+ try:
+ return UserTheme(name, config_path)
+ except ThemeError as exc:
+ logger.warning(exc)
+
+ return None
diff --git a/sphinx/builders/latex/transforms.py b/sphinx/builders/latex/transforms.py
new file mode 100644
index 0000000..ca1e4f3
--- /dev/null
+++ b/sphinx/builders/latex/transforms.py
@@ -0,0 +1,642 @@
+"""Transforms for LaTeX builder."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.transforms.references import Substitutions
+
+from sphinx import addnodes
+from sphinx.builders.latex.nodes import (
+ captioned_literal_block,
+ footnotemark,
+ footnotetext,
+ math_reference,
+ thebibliography,
+)
+from sphinx.domains.citation import CitationDomain
+from sphinx.locale import __
+from sphinx.transforms import SphinxTransform
+from sphinx.transforms.post_transforms import SphinxPostTransform
+from sphinx.util.nodes import NodeMatcher
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node
+
+ from sphinx.application import Sphinx
+
+URI_SCHEMES = ('mailto:', 'http:', 'https:', 'ftp:')
+
+
+class FootnoteDocnameUpdater(SphinxTransform):
+ """Add docname to footnote and footnote_reference nodes."""
+ default_priority = 700
+ TARGET_NODES = (nodes.footnote, nodes.footnote_reference)
+
+ def apply(self, **kwargs: Any) -> None:
+ matcher = NodeMatcher(*self.TARGET_NODES)
+ for node in self.document.findall(matcher): # type: Element
+ node['docname'] = self.env.docname
+
+
+class SubstitutionDefinitionsRemover(SphinxPostTransform):
+ """Remove ``substitution_definition`` nodes from doctrees."""
+
+ # should be invoked after Substitutions process
+ default_priority = Substitutions.default_priority + 1
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ for node in list(self.document.findall(nodes.substitution_definition)):
+ node.parent.remove(node)
+
+
+class ShowUrlsTransform(SphinxPostTransform):
+ """Expand references to inline text or footnotes.
+
+ For more information, see :confval:`latex_show_urls`.
+
+ .. note:: This transform is used for integrated doctree
+ """
+ default_priority = 400
+ formats = ('latex',)
+
+ # references are expanded to footnotes (or not)
+ expanded = False
+
+ def run(self, **kwargs: Any) -> None:
+ try:
+ # replace id_prefix temporarily
+ settings: Any = self.document.settings
+ id_prefix = settings.id_prefix
+ settings.id_prefix = 'show_urls'
+
+ self.expand_show_urls()
+ if self.expanded:
+ self.renumber_footnotes()
+ finally:
+ # restore id_prefix
+ settings.id_prefix = id_prefix
+
+ def expand_show_urls(self) -> None:
+ show_urls = self.config.latex_show_urls
+ if show_urls is False or show_urls == 'no':
+ return
+
+ for node in list(self.document.findall(nodes.reference)):
+ uri = node.get('refuri', '')
+ if uri.startswith(URI_SCHEMES):
+ if uri.startswith('mailto:'):
+ uri = uri[7:]
+ if node.astext() != uri:
+ index = node.parent.index(node)
+ docname = self.get_docname_for_node(node)
+ if show_urls == 'footnote':
+ fn, fnref = self.create_footnote(uri, docname)
+ node.parent.insert(index + 1, fn)
+ node.parent.insert(index + 2, fnref)
+
+ self.expanded = True
+ else: # all other true values (b/w compat)
+ textnode = nodes.Text(" (%s)" % uri)
+ node.parent.insert(index + 1, textnode)
+
+ def get_docname_for_node(self, node: Node) -> str:
+ while node:
+ if isinstance(node, nodes.document):
+ return self.env.path2doc(node['source']) or ''
+ elif isinstance(node, addnodes.start_of_file):
+ return node['docname']
+ else:
+ node = node.parent
+
+ try:
+ source = node['source'] # type: ignore[index]
+ except TypeError:
+ raise ValueError(__('Failed to get a docname!')) from None
+ raise ValueError(__('Failed to get a docname '
+ 'for source {source!r}!').format(source=source))
+
+ def create_footnote(
+ self, uri: str, docname: str,
+ ) -> tuple[nodes.footnote, nodes.footnote_reference]:
+ reference = nodes.reference('', nodes.Text(uri), refuri=uri, nolinkurl=True)
+ footnote = nodes.footnote(uri, auto=1, docname=docname)
+ footnote['names'].append('#')
+ footnote += nodes.label('', '#')
+ footnote += nodes.paragraph('', '', reference)
+ self.document.note_autofootnote(footnote)
+
+ footnote_ref = nodes.footnote_reference('[#]_', auto=1,
+ refid=footnote['ids'][0], docname=docname)
+ footnote_ref += nodes.Text('#')
+ self.document.note_autofootnote_ref(footnote_ref)
+ footnote.add_backref(footnote_ref['ids'][0])
+
+ return footnote, footnote_ref
+
+ def renumber_footnotes(self) -> None:
+ collector = FootnoteCollector(self.document)
+ self.document.walkabout(collector)
+
+ num = 0
+ for footnote in collector.auto_footnotes:
+ # search unused footnote number
+ while True:
+ num += 1
+ if str(num) not in collector.used_footnote_numbers:
+ break
+
+ # assign new footnote number
+ old_label = cast(nodes.label, footnote[0])
+ old_label.replace_self(nodes.label('', str(num)))
+ if old_label in footnote['names']:
+ footnote['names'].remove(old_label.astext())
+ footnote['names'].append(str(num))
+
+ # update footnote_references by new footnote number
+ docname = footnote['docname']
+ for ref in collector.footnote_refs:
+ if docname == ref['docname'] and footnote['ids'][0] == ref['refid']:
+ ref.remove(ref[0])
+ ref += nodes.Text(str(num))
+
+
+class FootnoteCollector(nodes.NodeVisitor):
+ """Collect footnotes and footnote references on the document"""
+
+ def __init__(self, document: nodes.document) -> None:
+ self.auto_footnotes: list[nodes.footnote] = []
+ self.used_footnote_numbers: set[str] = set()
+ self.footnote_refs: list[nodes.footnote_reference] = []
+ super().__init__(document)
+
+ def unknown_visit(self, node: Node) -> None:
+ pass
+
+ def unknown_departure(self, node: Node) -> None:
+ pass
+
+ def visit_footnote(self, node: nodes.footnote) -> None:
+ if node.get('auto'):
+ self.auto_footnotes.append(node)
+ else:
+ for name in node['names']:
+ self.used_footnote_numbers.add(name)
+
+ def visit_footnote_reference(self, node: nodes.footnote_reference) -> None:
+ self.footnote_refs.append(node)
+
+
+class LaTeXFootnoteTransform(SphinxPostTransform):
+ """Convert footnote definitions and references to appropriate form to LaTeX.
+
+ * Replace footnotes on restricted zone (e.g. headings) by footnotemark node.
+ In addition, append a footnotetext node after the zone.
+
+ Before::
+
+ <section>
+ <title>
+ headings having footnotes
+ <footnote_reference>
+ 1
+ <footnote ids="id1">
+ <label>
+ 1
+ <paragraph>
+ footnote body
+
+ After::
+
+ <section>
+ <title>
+ headings having footnotes
+ <footnotemark refid="id1">
+ 1
+ <footnotetext ids="id1">
+ <label>
+ 1
+ <paragraph>
+ footnote body
+
+ * Integrate footnote definitions and footnote references to single footnote node
+
+ Before::
+
+ blah blah blah
+ <footnote_reference refid="id1">
+ 1
+ blah blah blah ...
+
+ <footnote ids="id1">
+ <label>
+ 1
+ <paragraph>
+ footnote body
+
+ After::
+
+ blah blah blah
+ <footnote ids="id1">
+ <label>
+ 1
+ <paragraph>
+ footnote body
+ blah blah blah ...
+
+ * Replace second and subsequent footnote references which refers same footnote definition
+ by footnotemark node. Additionally, the footnote definition node is marked as
+ "referred".
+
+ Before::
+
+ blah blah blah
+ <footnote_reference refid="id1">
+ 1
+ blah blah blah
+ <footnote_reference refid="id1">
+ 1
+ blah blah blah ...
+
+ <footnote ids="id1">
+ <label>
+ 1
+ <paragraph>
+ footnote body
+
+ After::
+
+ blah blah blah
+ <footnote ids="id1" referred=True>
+ <label>
+ 1
+ <paragraph>
+ footnote body
+ blah blah blah
+ <footnotemark refid="id1">
+ 1
+ blah blah blah ...
+
+ * Remove unreferenced footnotes
+
+ Before::
+
+ <footnote ids="id1">
+ <label>
+ 1
+ <paragraph>
+ Unreferenced footnote!
+
+ After::
+
+ <!-- nothing! -->
+
+ * Move footnotes in a title of table or thead to head of tbody
+
+ Before::
+
+ <table>
+ <title>
+ title having footnote_reference
+ <footnote_reference refid="id1">
+ 1
+ <tgroup>
+ <thead>
+ <row>
+ <entry>
+ header having footnote_reference
+ <footnote_reference refid="id2">
+ 2
+ <tbody>
+ <row>
+ ...
+
+ <footnote ids="id1">
+ <label>
+ 1
+ <paragraph>
+ footnote body
+
+ <footnote ids="id2">
+ <label>
+ 2
+ <paragraph>
+ footnote body
+
+ After::
+
+ <table>
+ <title>
+ title having footnote_reference
+ <footnotemark refid="id1">
+ 1
+ <tgroup>
+ <thead>
+ <row>
+ <entry>
+ header having footnote_reference
+ <footnotemark refid="id2">
+ 2
+ <tbody>
+ <footnotetext ids="id1">
+ <label>
+ 1
+ <paragraph>
+ footnote body
+
+ <footnotetext ids="id2">
+ <label>
+ 2
+ <paragraph>
+ footnote body
+ <row>
+ ...
+ """
+
+ default_priority = 600
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ footnotes = list(self.document.findall(nodes.footnote))
+ for node in footnotes:
+ node.parent.remove(node)
+
+ visitor = LaTeXFootnoteVisitor(self.document, footnotes)
+ self.document.walkabout(visitor)
+
+
+class LaTeXFootnoteVisitor(nodes.NodeVisitor):
+ def __init__(self, document: nodes.document, footnotes: list[nodes.footnote]) -> None:
+ self.appeared: dict[tuple[str, str], nodes.footnote] = {}
+ self.footnotes: list[nodes.footnote] = footnotes
+ self.pendings: list[nodes.footnote] = []
+ self.table_footnotes: list[nodes.footnote] = []
+ self.restricted: Element | None = None
+ super().__init__(document)
+
+ def unknown_visit(self, node: Node) -> None:
+ pass
+
+ def unknown_departure(self, node: Node) -> None:
+ pass
+
+ def restrict(self, node: Element) -> None:
+ if self.restricted is None:
+ self.restricted = node
+
+ def unrestrict(self, node: Element) -> None:
+ if self.restricted == node:
+ self.restricted = None
+ pos = node.parent.index(node)
+ for i, footnote, in enumerate(self.pendings):
+ fntext = footnotetext('', *footnote.children, ids=footnote['ids'])
+ node.parent.insert(pos + i + 1, fntext)
+ self.pendings = []
+
+ def visit_figure(self, node: nodes.figure) -> None:
+ self.restrict(node)
+
+ def depart_figure(self, node: nodes.figure) -> None:
+ self.unrestrict(node)
+
+ def visit_term(self, node: nodes.term) -> None:
+ self.restrict(node)
+
+ def depart_term(self, node: nodes.term) -> None:
+ self.unrestrict(node)
+
+ def visit_caption(self, node: nodes.caption) -> None:
+ self.restrict(node)
+
+ def depart_caption(self, node: nodes.caption) -> None:
+ self.unrestrict(node)
+
+ def visit_title(self, node: nodes.title) -> None:
+ if isinstance(node.parent, (nodes.section, nodes.table)):
+ self.restrict(node)
+
+ def depart_title(self, node: nodes.title) -> None:
+ if isinstance(node.parent, nodes.section):
+ self.unrestrict(node)
+ elif isinstance(node.parent, nodes.table):
+ self.table_footnotes += self.pendings
+ self.pendings = []
+ self.unrestrict(node)
+
+ def visit_thead(self, node: nodes.thead) -> None:
+ self.restrict(node)
+
+ def depart_thead(self, node: nodes.thead) -> None:
+ self.table_footnotes += self.pendings
+ self.pendings = []
+ self.unrestrict(node)
+
+ def depart_table(self, node: nodes.table) -> None:
+ tbody = next(node.findall(nodes.tbody))
+ for footnote in reversed(self.table_footnotes):
+ fntext = footnotetext('', *footnote.children, ids=footnote['ids'])
+ tbody.insert(0, fntext)
+
+ self.table_footnotes = []
+
+ def visit_footnote(self, node: nodes.footnote) -> None:
+ self.restrict(node)
+
+ def depart_footnote(self, node: nodes.footnote) -> None:
+ self.unrestrict(node)
+
+ def visit_footnote_reference(self, node: nodes.footnote_reference) -> None:
+ number = node.astext().strip()
+ docname = node['docname']
+ if (docname, number) in self.appeared:
+ footnote = self.appeared[(docname, number)]
+ footnote["referred"] = True
+
+ mark = footnotemark('', number, refid=node['refid'])
+ node.replace_self(mark)
+ else:
+ footnote = self.get_footnote_by_reference(node)
+ if self.restricted:
+ mark = footnotemark('', number, refid=node['refid'])
+ node.replace_self(mark)
+ self.pendings.append(footnote)
+ else:
+ self.footnotes.remove(footnote)
+ node.replace_self(footnote)
+ footnote.walkabout(self)
+
+ self.appeared[(docname, number)] = footnote
+ raise nodes.SkipNode
+
+ def get_footnote_by_reference(self, node: nodes.footnote_reference) -> nodes.footnote:
+ docname = node['docname']
+ for footnote in self.footnotes:
+ if docname == footnote['docname'] and footnote['ids'][0] == node['refid']:
+ return footnote
+
+ raise ValueError(__('No footnote was found for given reference node %r') % node)
+
+
+class BibliographyTransform(SphinxPostTransform):
+ """Gather bibliography entries to tail of document.
+
+ Before::
+
+ <document>
+ <paragraph>
+ blah blah blah
+ <citation>
+ ...
+ <paragraph>
+ blah blah blah
+ <citation>
+ ...
+ ...
+
+ After::
+
+ <document>
+ <paragraph>
+ blah blah blah
+ <paragraph>
+ blah blah blah
+ ...
+ <thebibliography>
+ <citation>
+ ...
+ <citation>
+ ...
+ """
+ default_priority = 750
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ citations = thebibliography()
+ for node in list(self.document.findall(nodes.citation)):
+ node.parent.remove(node)
+ citations += node
+
+ if len(citations) > 0:
+ self.document += citations
+
+
+class CitationReferenceTransform(SphinxPostTransform):
+ """Replace pending_xref nodes for citation by citation_reference.
+
+ To handle citation reference easily on LaTeX writer, this converts
+ pending_xref nodes to citation_reference.
+ """
+ default_priority = 5 # before ReferencesResolver
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ domain = cast(CitationDomain, self.env.get_domain('citation'))
+ matcher = NodeMatcher(addnodes.pending_xref, refdomain='citation', reftype='ref')
+ for node in self.document.findall(matcher): # type: addnodes.pending_xref
+ docname, labelid, _ = domain.citations.get(node['reftarget'], ('', '', 0))
+ if docname:
+ citation_ref = nodes.citation_reference('', '', *node.children,
+ docname=docname, refname=labelid)
+ node.replace_self(citation_ref)
+
+
+class MathReferenceTransform(SphinxPostTransform):
+ """Replace pending_xref nodes for math by math_reference.
+
+ To handle math reference easily on LaTeX writer, this converts pending_xref
+ nodes to math_reference.
+ """
+ default_priority = 5 # before ReferencesResolver
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ equations = self.env.get_domain('math').data['objects']
+ for node in self.document.findall(addnodes.pending_xref):
+ if node['refdomain'] == 'math' and node['reftype'] in ('eq', 'numref'):
+ docname, _ = equations.get(node['reftarget'], (None, None))
+ if docname:
+ refnode = math_reference('', docname=docname, target=node['reftarget'])
+ node.replace_self(refnode)
+
+
+class LiteralBlockTransform(SphinxPostTransform):
+ """Replace container nodes for literal_block by captioned_literal_block."""
+ default_priority = 400
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ matcher = NodeMatcher(nodes.container, literal_block=True)
+ for node in self.document.findall(matcher): # type: nodes.container
+ newnode = captioned_literal_block('', *node.children, **node.attributes)
+ node.replace_self(newnode)
+
+
+class DocumentTargetTransform(SphinxPostTransform):
+ """Add :doc label to the first section of each document."""
+ default_priority = 400
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ for node in self.document.findall(addnodes.start_of_file):
+ section = node.next_node(nodes.section)
+ if section:
+ section['ids'].append(':doc') # special label for :doc:
+
+
+class IndexInSectionTitleTransform(SphinxPostTransform):
+ """Move index nodes in section title to outside of the title.
+
+ LaTeX index macro is not compatible with some handling of section titles
+ such as uppercasing done on LaTeX side (cf. fncychap handling of ``\\chapter``).
+ Moving the index node to after the title node fixes that.
+
+ Before::
+
+ <section>
+ <title>
+ blah blah <index entries=[...]/>blah
+ <paragraph>
+ blah blah blah
+ ...
+
+ After::
+
+ <section>
+ <title>
+ blah blah blah
+ <index entries=[...]/>
+ <paragraph>
+ blah blah blah
+ ...
+ """
+ default_priority = 400
+ formats = ('latex',)
+
+ def run(self, **kwargs: Any) -> None:
+ for node in list(self.document.findall(nodes.title)):
+ if isinstance(node.parent, nodes.section):
+ for i, index in enumerate(node.findall(addnodes.index)):
+ # move the index node next to the section title
+ node.remove(index)
+ node.parent.insert(i + 1, index)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_transform(FootnoteDocnameUpdater)
+ app.add_post_transform(SubstitutionDefinitionsRemover)
+ app.add_post_transform(BibliographyTransform)
+ app.add_post_transform(CitationReferenceTransform)
+ app.add_post_transform(DocumentTargetTransform)
+ app.add_post_transform(IndexInSectionTitleTransform)
+ app.add_post_transform(LaTeXFootnoteTransform)
+ app.add_post_transform(LiteralBlockTransform)
+ app.add_post_transform(MathReferenceTransform)
+ app.add_post_transform(ShowUrlsTransform)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/latex/util.py b/sphinx/builders/latex/util.py
new file mode 100644
index 0000000..01597f9
--- /dev/null
+++ b/sphinx/builders/latex/util.py
@@ -0,0 +1,48 @@
+"""Utilities for LaTeX builder."""
+
+from __future__ import annotations
+
+from docutils.writers.latex2e import Babel
+
+
+class ExtBabel(Babel):
+ cyrillic_languages = ('bulgarian', 'kazakh', 'mongolian', 'russian', 'ukrainian')
+
+ def __init__(self, language_code: str, use_polyglossia: bool = False) -> None:
+ self.language_code = language_code
+ self.use_polyglossia = use_polyglossia
+ self.supported = True
+ super().__init__(language_code)
+
+ def uses_cyrillic(self) -> bool:
+ return self.language in self.cyrillic_languages
+
+ def is_supported_language(self) -> bool:
+ return self.supported
+
+ def language_name(self, language_code: str) -> str:
+ language = super().language_name(language_code)
+ if language == 'ngerman' and self.use_polyglossia:
+ # polyglossia calls new orthography (Neue Rechtschreibung) as
+ # german (with new spelling option).
+ return 'german'
+ elif language:
+ return language
+ elif language_code.startswith('zh'):
+ return 'english' # fallback to english (behaves like supported)
+ else:
+ self.supported = False
+ return 'english' # fallback to english
+
+ def get_mainlanguage_options(self) -> str | None:
+ """Return options for polyglossia's ``\\setmainlanguage``."""
+ if self.use_polyglossia is False:
+ return None
+ elif self.language == 'german':
+ language = super().language_name(self.language_code)
+ if language == 'ngerman':
+ return 'spelling=new'
+ else:
+ return 'spelling=old'
+ else:
+ return None
diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py
new file mode 100644
index 0000000..f250958
--- /dev/null
+++ b/sphinx/builders/linkcheck.py
@@ -0,0 +1,641 @@
+"""The CheckExternalLinksBuilder class."""
+
+from __future__ import annotations
+
+import contextlib
+import json
+import re
+import socket
+import time
+from html.parser import HTMLParser
+from os import path
+from queue import PriorityQueue, Queue
+from threading import Thread
+from typing import TYPE_CHECKING, NamedTuple, cast
+from urllib.parse import unquote, urlparse, urlsplit, urlunparse
+
+from docutils import nodes
+from requests.exceptions import ConnectionError, HTTPError, SSLError, TooManyRedirects
+
+from sphinx.builders.dummy import DummyBuilder
+from sphinx.locale import __
+from sphinx.transforms.post_transforms import SphinxPostTransform
+from sphinx.util import encode_uri, logging, requests
+from sphinx.util.console import ( # type: ignore[attr-defined]
+ darkgray,
+ darkgreen,
+ purple,
+ red,
+ turquoise,
+)
+from sphinx.util.http_date import rfc1123_to_epoch
+from sphinx.util.nodes import get_node_line
+
+if TYPE_CHECKING:
+ from collections.abc import Generator, Iterator
+ from typing import Any, Callable
+
+ from requests import Response
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+
+logger = logging.getLogger(__name__)
+
+uri_re = re.compile('([a-z]+:)?//') # matches to foo:// and // (a protocol relative URL)
+
+DEFAULT_REQUEST_HEADERS = {
+ 'Accept': 'text/html,application/xhtml+xml;q=0.9,*/*;q=0.8',
+}
+CHECK_IMMEDIATELY = 0
+QUEUE_POLL_SECS = 1
+DEFAULT_DELAY = 60.0
+
+
+class CheckExternalLinksBuilder(DummyBuilder):
+ """
+ Checks for broken external links.
+ """
+ name = 'linkcheck'
+ epilog = __('Look for any errors in the above output or in '
+ '%(outdir)s/output.txt')
+
+ def init(self) -> None:
+ self.broken_hyperlinks = 0
+ self.hyperlinks: dict[str, Hyperlink] = {}
+ # set a timeout for non-responding servers
+ socket.setdefaulttimeout(5.0)
+
+ def finish(self) -> None:
+ checker = HyperlinkAvailabilityChecker(self.config)
+ logger.info('')
+
+ output_text = path.join(self.outdir, 'output.txt')
+ output_json = path.join(self.outdir, 'output.json')
+ with open(output_text, 'w', encoding='utf-8') as self.txt_outfile, \
+ open(output_json, 'w', encoding='utf-8') as self.json_outfile:
+ for result in checker.check(self.hyperlinks):
+ self.process_result(result)
+
+ if self.broken_hyperlinks:
+ self.app.statuscode = 1
+
+ def process_result(self, result: CheckResult) -> None:
+ filename = self.env.doc2path(result.docname, False)
+
+ linkstat = {'filename': filename, 'lineno': result.lineno,
+ 'status': result.status, 'code': result.code, 'uri': result.uri,
+ 'info': result.message}
+ self.write_linkstat(linkstat)
+
+ if result.status == 'unchecked':
+ return
+ if result.status == 'working' and result.message == 'old':
+ return
+ if result.lineno:
+ logger.info('(%16s: line %4d) ', result.docname, result.lineno, nonl=True)
+ if result.status == 'ignored':
+ if result.message:
+ logger.info(darkgray('-ignored- ') + result.uri + ': ' + result.message)
+ else:
+ logger.info(darkgray('-ignored- ') + result.uri)
+ elif result.status == 'local':
+ logger.info(darkgray('-local- ') + result.uri)
+ self.write_entry('local', result.docname, filename, result.lineno, result.uri)
+ elif result.status == 'working':
+ logger.info(darkgreen('ok ') + result.uri + result.message)
+ elif result.status == 'broken':
+ if self.app.quiet or self.app.warningiserror:
+ logger.warning(__('broken link: %s (%s)'), result.uri, result.message,
+ location=(result.docname, result.lineno))
+ else:
+ logger.info(red('broken ') + result.uri + red(' - ' + result.message))
+ self.write_entry('broken', result.docname, filename, result.lineno,
+ result.uri + ': ' + result.message)
+ self.broken_hyperlinks += 1
+ elif result.status == 'redirected':
+ try:
+ text, color = {
+ 301: ('permanently', purple),
+ 302: ('with Found', purple),
+ 303: ('with See Other', purple),
+ 307: ('temporarily', turquoise),
+ 308: ('permanently', purple),
+ }[result.code]
+ except KeyError:
+ text, color = ('with unknown code', purple)
+ linkstat['text'] = text
+ if self.config.linkcheck_allowed_redirects:
+ logger.warning('redirect ' + result.uri + ' - ' + text + ' to ' +
+ result.message, location=(result.docname, result.lineno))
+ else:
+ logger.info(color('redirect ') + result.uri +
+ color(' - ' + text + ' to ' + result.message))
+ self.write_entry('redirected ' + text, result.docname, filename,
+ result.lineno, result.uri + ' to ' + result.message)
+ else:
+ raise ValueError('Unknown status %s.' % result.status)
+
+ def write_linkstat(self, data: dict) -> None:
+ self.json_outfile.write(json.dumps(data))
+ self.json_outfile.write('\n')
+
+ def write_entry(self, what: str, docname: str, filename: str, line: int,
+ uri: str) -> None:
+ self.txt_outfile.write(f'{filename}:{line}: [{what}] {uri}\n')
+
+
+class HyperlinkCollector(SphinxPostTransform):
+ builders = ('linkcheck',)
+ default_priority = 800
+
+ def run(self, **kwargs: Any) -> None:
+ builder = cast(CheckExternalLinksBuilder, self.app.builder)
+ hyperlinks = builder.hyperlinks
+ docname = self.env.docname
+
+ # reference nodes
+ for refnode in self.document.findall(nodes.reference):
+ if 'refuri' in refnode:
+ uri = refnode['refuri']
+ _add_uri(self.app, uri, refnode, hyperlinks, docname)
+
+ # image nodes
+ for imgnode in self.document.findall(nodes.image):
+ uri = imgnode['candidates'].get('?')
+ if uri and '://' in uri:
+ _add_uri(self.app, uri, imgnode, hyperlinks, docname)
+
+ # raw nodes
+ for rawnode in self.document.findall(nodes.raw):
+ uri = rawnode.get('source')
+ if uri and '://' in uri:
+ _add_uri(self.app, uri, rawnode, hyperlinks, docname)
+
+
+def _add_uri(app: Sphinx, uri: str, node: nodes.Element,
+ hyperlinks: dict[str, Hyperlink], docname: str) -> None:
+ if newuri := app.emit_firstresult('linkcheck-process-uri', uri):
+ uri = newuri
+
+ try:
+ lineno = get_node_line(node)
+ except ValueError:
+ lineno = -1
+
+ if uri not in hyperlinks:
+ hyperlinks[uri] = Hyperlink(uri, docname, app.env.doc2path(docname), lineno)
+
+
+class Hyperlink(NamedTuple):
+ uri: str
+ docname: str
+ docpath: str
+ lineno: int
+
+
+class HyperlinkAvailabilityChecker:
+ def __init__(self, config: Config) -> None:
+ self.config = config
+ self.rate_limits: dict[str, RateLimit] = {}
+ self.rqueue: Queue[CheckResult] = Queue()
+ self.workers: list[Thread] = []
+ self.wqueue: PriorityQueue[CheckRequest] = PriorityQueue()
+ self.num_workers: int = config.linkcheck_workers
+
+ self.to_ignore: list[re.Pattern[str]] = list(map(re.compile,
+ self.config.linkcheck_ignore))
+
+ def check(self, hyperlinks: dict[str, Hyperlink]) -> Generator[CheckResult, None, None]:
+ self.invoke_threads()
+
+ total_links = 0
+ for hyperlink in hyperlinks.values():
+ if self.is_ignored_uri(hyperlink.uri):
+ yield CheckResult(hyperlink.uri, hyperlink.docname, hyperlink.lineno,
+ 'ignored', '', 0)
+ else:
+ self.wqueue.put(CheckRequest(CHECK_IMMEDIATELY, hyperlink), False)
+ total_links += 1
+
+ done = 0
+ while done < total_links:
+ yield self.rqueue.get()
+ done += 1
+
+ self.shutdown_threads()
+
+ def invoke_threads(self) -> None:
+ for _i in range(self.num_workers):
+ thread = HyperlinkAvailabilityCheckWorker(self.config,
+ self.rqueue, self.wqueue,
+ self.rate_limits)
+ thread.start()
+ self.workers.append(thread)
+
+ def shutdown_threads(self) -> None:
+ self.wqueue.join()
+ for _worker in self.workers:
+ self.wqueue.put(CheckRequest(CHECK_IMMEDIATELY, None), False)
+
+ def is_ignored_uri(self, uri: str) -> bool:
+ return any(pat.match(uri) for pat in self.to_ignore)
+
+
+class CheckRequest(NamedTuple):
+ next_check: float
+ hyperlink: Hyperlink | None
+
+
+class CheckResult(NamedTuple):
+ uri: str
+ docname: str
+ lineno: int
+ status: str
+ message: str
+ code: int
+
+
+class HyperlinkAvailabilityCheckWorker(Thread):
+ """A worker class for checking the availability of hyperlinks."""
+
+ def __init__(self, config: Config,
+ rqueue: Queue[CheckResult],
+ wqueue: Queue[CheckRequest],
+ rate_limits: dict[str, RateLimit]) -> None:
+ self.rate_limits = rate_limits
+ self.rqueue = rqueue
+ self.wqueue = wqueue
+
+ self.anchors_ignore: list[re.Pattern[str]] = list(
+ map(re.compile, config.linkcheck_anchors_ignore))
+ self.anchors_ignore_for_url: list[re.Pattern[str]] = list(
+ map(re.compile, config.linkcheck_anchors_ignore_for_url))
+ self.documents_exclude: list[re.Pattern[str]] = list(
+ map(re.compile, config.linkcheck_exclude_documents))
+ self.auth = [(re.compile(pattern), auth_info) for pattern, auth_info
+ in config.linkcheck_auth]
+
+ self.timeout: int | float | None = config.linkcheck_timeout
+ self.request_headers: dict[str, dict[str, str]] = config.linkcheck_request_headers
+ self.check_anchors: bool = config.linkcheck_anchors
+ self.allowed_redirects: dict[re.Pattern[str], re.Pattern[str]]
+ self.allowed_redirects = config.linkcheck_allowed_redirects
+ self.retries: int = config.linkcheck_retries
+ self.rate_limit_timeout = config.linkcheck_rate_limit_timeout
+
+ self.user_agent = config.user_agent
+ self.tls_verify = config.tls_verify
+ self.tls_cacerts = config.tls_cacerts
+
+ self._session = requests._Session()
+
+ super().__init__(daemon=True)
+
+ def run(self) -> None:
+ while True:
+ next_check, hyperlink = self.wqueue.get()
+ if hyperlink is None:
+ # An empty hyperlink is a signal to shutdown the worker; cleanup resources here
+ self._session.close()
+ break
+
+ uri, docname, _docpath, lineno = hyperlink
+ if uri is None:
+ break
+
+ netloc = urlsplit(uri).netloc
+ with contextlib.suppress(KeyError):
+ # Refresh rate limit.
+ # When there are many links in the queue, workers are all stuck waiting
+ # for responses, but the builder keeps queuing. Links in the queue may
+ # have been queued before rate limits were discovered.
+ next_check = self.rate_limits[netloc].next_check
+ if next_check > time.time():
+ # Sleep before putting message back in the queue to avoid
+ # waking up other threads.
+ time.sleep(QUEUE_POLL_SECS)
+ self.wqueue.put(CheckRequest(next_check, hyperlink), False)
+ self.wqueue.task_done()
+ continue
+ status, info, code = self._check(docname, uri, hyperlink)
+ if status == 'rate-limited':
+ logger.info(darkgray('-rate limited- ') + uri + darkgray(' | sleeping...'))
+ else:
+ self.rqueue.put(CheckResult(uri, docname, lineno, status, info, code))
+ self.wqueue.task_done()
+
+ def _check(self, docname: str, uri: str, hyperlink: Hyperlink) -> tuple[str, str, int]:
+ # check for various conditions without bothering the network
+
+ for doc_matcher in self.documents_exclude:
+ if doc_matcher.match(docname):
+ info = (
+ f'{docname} matched {doc_matcher.pattern} from '
+ 'linkcheck_exclude_documents'
+ )
+ return 'ignored', info, 0
+
+ if len(uri) == 0 or uri.startswith(('#', 'mailto:', 'tel:')):
+ return 'unchecked', '', 0
+ if not uri.startswith(('http:', 'https:')):
+ if uri_re.match(uri):
+ # Non-supported URI schemes (ex. ftp)
+ return 'unchecked', '', 0
+
+ src_dir = path.dirname(hyperlink.docpath)
+ if path.exists(path.join(src_dir, uri)):
+ return 'working', '', 0
+ return 'broken', '', 0
+
+ # need to actually check the URI
+ status, info, code = '', '', 0
+ for _ in range(self.retries):
+ status, info, code = self._check_uri(uri, hyperlink)
+ if status != 'broken':
+ break
+
+ return status, info, code
+
+ def _retrieval_methods(self,
+ check_anchors: bool,
+ anchor: str) -> Iterator[tuple[Callable, dict]]:
+ if not check_anchors or not anchor:
+ yield self._session.head, {'allow_redirects': True}
+ yield self._session.get, {'stream': True}
+
+ def _check_uri(self, uri: str, hyperlink: Hyperlink) -> tuple[str, str, int]:
+ req_url, delimiter, anchor = uri.partition('#')
+ if delimiter and anchor:
+ for rex in self.anchors_ignore:
+ if rex.match(anchor):
+ anchor = ''
+ break
+ else:
+ for rex in self.anchors_ignore_for_url:
+ if rex.match(req_url):
+ anchor = ''
+ break
+
+ # handle non-ASCII URIs
+ try:
+ req_url.encode('ascii')
+ except UnicodeError:
+ req_url = encode_uri(req_url)
+
+ # Get auth info, if any
+ for pattern, auth_info in self.auth: # noqa: B007 (false positive)
+ if pattern.match(uri):
+ break
+ else:
+ auth_info = None
+
+ # update request headers for the URL
+ headers = _get_request_headers(uri, self.request_headers)
+
+ # Linkcheck HTTP request logic:
+ #
+ # - Attempt HTTP HEAD before HTTP GET unless page content is required.
+ # - Follow server-issued HTTP redirects.
+ # - Respect server-issued HTTP 429 back-offs.
+ error_message = ''
+ status_code = -1
+ response_url = retry_after = ''
+ for retrieval_method, kwargs in self._retrieval_methods(self.check_anchors, anchor):
+ try:
+ with retrieval_method(
+ url=req_url, auth=auth_info,
+ headers=headers,
+ timeout=self.timeout,
+ **kwargs,
+ _user_agent=self.user_agent,
+ _tls_info=(self.tls_verify, self.tls_cacerts),
+ ) as response:
+ if (self.check_anchors and response.ok and anchor
+ and not contains_anchor(response, anchor)):
+ raise Exception(__(f'Anchor {anchor!r} not found'))
+
+ # Copy data we need from the (closed) response
+ status_code = response.status_code
+ redirect_status_code = response.history[-1].status_code if response.history else None # NoQA: E501
+ retry_after = response.headers.get('Retry-After')
+ response_url = f'{response.url}'
+ response.raise_for_status()
+ del response
+ break
+
+ except SSLError as err:
+ # SSL failure; report that the link is broken.
+ return 'broken', str(err), 0
+
+ except (ConnectionError, TooManyRedirects) as err:
+ # Servers drop the connection on HEAD requests, causing
+ # ConnectionError.
+ error_message = str(err)
+ continue
+
+ except HTTPError as err:
+ error_message = str(err)
+
+ # Unauthorised: the reference probably exists
+ if status_code == 401:
+ return 'working', 'unauthorized', 0
+
+ # Rate limiting; back-off if allowed, or report failure otherwise
+ if status_code == 429:
+ if next_check := self.limit_rate(response_url, retry_after):
+ self.wqueue.put(CheckRequest(next_check, hyperlink), False)
+ return 'rate-limited', '', 0
+ return 'broken', error_message, 0
+
+ # Don't claim success/failure during server-side outages
+ if status_code == 503:
+ return 'ignored', 'service unavailable', 0
+
+ # For most HTTP failures, continue attempting alternate retrieval methods
+ continue
+
+ except Exception as err:
+ # Unhandled exception (intermittent or permanent); report that
+ # the link is broken.
+ return 'broken', str(err), 0
+
+ else:
+ # All available retrieval methods have been exhausted; report
+ # that the link is broken.
+ return 'broken', error_message, 0
+
+ # Success; clear rate limits for the origin
+ netloc = urlsplit(req_url).netloc
+ self.rate_limits.pop(netloc, None)
+
+ if ((response_url.rstrip('/') == req_url.rstrip('/'))
+ or _allowed_redirect(req_url, response_url,
+ self.allowed_redirects)):
+ return 'working', '', 0
+ elif redirect_status_code is not None:
+ return 'redirected', response_url, redirect_status_code
+ else:
+ return 'redirected', response_url, 0
+
+ def limit_rate(self, response_url: str, retry_after: str) -> float | None:
+ delay = DEFAULT_DELAY
+ next_check = None
+ if retry_after:
+ try:
+ # Integer: time to wait before next attempt.
+ delay = float(retry_after)
+ except ValueError:
+ try:
+ # An HTTP-date: time of next attempt.
+ next_check = rfc1123_to_epoch(retry_after)
+ except (ValueError, TypeError):
+ # TypeError: Invalid date format.
+ # ValueError: Invalid date, e.g. Oct 52th.
+ pass
+ else:
+ delay = next_check - time.time()
+ else:
+ next_check = time.time() + delay
+ netloc = urlsplit(response_url).netloc
+ if next_check is None:
+ max_delay = self.rate_limit_timeout
+ try:
+ rate_limit = self.rate_limits[netloc]
+ except KeyError:
+ delay = DEFAULT_DELAY
+ else:
+ last_wait_time = rate_limit.delay
+ delay = 2.0 * last_wait_time
+ if delay > max_delay > last_wait_time:
+ delay = max_delay
+ if delay > max_delay:
+ return None
+ next_check = time.time() + delay
+ self.rate_limits[netloc] = RateLimit(delay, next_check)
+ return next_check
+
+
+def _get_request_headers(
+ uri: str,
+ request_headers: dict[str, dict[str, str]],
+) -> dict[str, str]:
+ url = urlsplit(uri)
+ candidates = (f'{url.scheme}://{url.netloc}',
+ f'{url.scheme}://{url.netloc}/',
+ uri,
+ '*')
+
+ for u in candidates:
+ if u in request_headers:
+ return {**DEFAULT_REQUEST_HEADERS, **request_headers[u]}
+ return {}
+
+
+def contains_anchor(response: Response, anchor: str) -> bool:
+ """Determine if an anchor is contained within an HTTP response."""
+
+ parser = AnchorCheckParser(unquote(anchor))
+ # Read file in chunks. If we find a matching anchor, we break
+ # the loop early in hopes not to have to download the whole thing.
+ for chunk in response.iter_content(chunk_size=4096, decode_unicode=True):
+ if isinstance(chunk, bytes): # requests failed to decode
+ chunk = chunk.decode() # manually try to decode it
+
+ parser.feed(chunk)
+ if parser.found:
+ break
+ parser.close()
+ return parser.found
+
+
+class AnchorCheckParser(HTMLParser):
+ """Specialised HTML parser that looks for a specific anchor."""
+
+ def __init__(self, search_anchor: str) -> None:
+ super().__init__()
+
+ self.search_anchor = search_anchor
+ self.found = False
+
+ def handle_starttag(self, tag: Any, attrs: Any) -> None:
+ for key, value in attrs:
+ if key in ('id', 'name') and value == self.search_anchor:
+ self.found = True
+ break
+
+
+def _allowed_redirect(url: str, new_url: str,
+ allowed_redirects: dict[re.Pattern[str], re.Pattern[str]]) -> bool:
+ return any(
+ from_url.match(url) and to_url.match(new_url)
+ for from_url, to_url
+ in allowed_redirects.items()
+ )
+
+
+class RateLimit(NamedTuple):
+ delay: float
+ next_check: float
+
+
+def rewrite_github_anchor(app: Sphinx, uri: str) -> str | None:
+ """Rewrite anchor name of the hyperlink to github.com
+
+ The hyperlink anchors in github.com are dynamically generated. This rewrites
+ them before checking and makes them comparable.
+ """
+ parsed = urlparse(uri)
+ if parsed.hostname == 'github.com' and parsed.fragment:
+ prefixed = parsed.fragment.startswith('user-content-')
+ if not prefixed:
+ fragment = f'user-content-{parsed.fragment}'
+ return urlunparse(parsed._replace(fragment=fragment))
+ return None
+
+
+def compile_linkcheck_allowed_redirects(app: Sphinx, config: Config) -> None:
+ """Compile patterns in linkcheck_allowed_redirects to the regexp objects."""
+ for url, pattern in list(app.config.linkcheck_allowed_redirects.items()):
+ try:
+ app.config.linkcheck_allowed_redirects[re.compile(url)] = re.compile(pattern)
+ except re.error as exc:
+ logger.warning(__('Failed to compile regex in linkcheck_allowed_redirects: %r %s'),
+ exc.pattern, exc.msg)
+ finally:
+ # Remove the original regexp-string
+ app.config.linkcheck_allowed_redirects.pop(url)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(CheckExternalLinksBuilder)
+ app.add_post_transform(HyperlinkCollector)
+
+ app.add_config_value('linkcheck_ignore', [], False)
+ app.add_config_value('linkcheck_exclude_documents', [], False)
+ app.add_config_value('linkcheck_allowed_redirects', {}, False)
+ app.add_config_value('linkcheck_auth', [], False)
+ app.add_config_value('linkcheck_request_headers', {}, False)
+ app.add_config_value('linkcheck_retries', 1, False)
+ app.add_config_value('linkcheck_timeout', None, False, [int, float])
+ app.add_config_value('linkcheck_workers', 5, False)
+ app.add_config_value('linkcheck_anchors', True, False)
+ # Anchors starting with ! are ignored since they are
+ # commonly used for dynamic pages
+ app.add_config_value('linkcheck_anchors_ignore', ['^!'], False)
+ app.add_config_value('linkcheck_anchors_ignore_for_url', (), False, (tuple, list))
+ app.add_config_value('linkcheck_rate_limit_timeout', 300.0, False)
+
+ app.add_event('linkcheck-process-uri')
+
+ app.connect('config-inited', compile_linkcheck_allowed_redirects, priority=800)
+
+ # FIXME: Disable URL rewrite handler for github.com temporarily.
+ # ref: https://github.com/sphinx-doc/sphinx/issues/9435
+ # app.connect('linkcheck-process-uri', rewrite_github_anchor)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/manpage.py b/sphinx/builders/manpage.py
new file mode 100644
index 0000000..2d35d20
--- /dev/null
+++ b/sphinx/builders/manpage.py
@@ -0,0 +1,127 @@
+"""Manual pages builder."""
+
+from __future__ import annotations
+
+import warnings
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils.frontend import OptionParser
+from docutils.io import FileOutput
+
+from sphinx import addnodes
+from sphinx.builders import Builder
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.console import darkgreen # type: ignore[attr-defined]
+from sphinx.util.display import progress_message
+from sphinx.util.nodes import inline_all_toctrees
+from sphinx.util.osutil import ensuredir, make_filename_from_project
+from sphinx.writers.manpage import ManualPageTranslator, ManualPageWriter
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+
+logger = logging.getLogger(__name__)
+
+
+class ManualPageBuilder(Builder):
+ """
+ Builds groff output in manual page format.
+ """
+ name = 'man'
+ format = 'man'
+ epilog = __('The manual pages are in %(outdir)s.')
+
+ default_translator_class = ManualPageTranslator
+ supported_image_types: list[str] = []
+
+ def init(self) -> None:
+ if not self.config.man_pages:
+ logger.warning(__('no "man_pages" config value found; no manual pages '
+ 'will be written'))
+
+ def get_outdated_docs(self) -> str | list[str]:
+ return 'all manpages' # for now
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ return ''
+
+ @progress_message(__('writing'))
+ def write(self, *ignored: Any) -> None:
+ docwriter = ManualPageWriter(self)
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ # DeprecationWarning: The frontend.OptionParser class will be replaced
+ # by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
+ docsettings: Any = OptionParser(
+ defaults=self.env.settings,
+ components=(docwriter,),
+ read_config_files=True).get_default_values()
+
+ for info in self.config.man_pages:
+ docname, name, description, authors, section = info
+ if docname not in self.env.all_docs:
+ logger.warning(__('"man_pages" config value references unknown '
+ 'document %s'), docname)
+ continue
+ if isinstance(authors, str):
+ if authors:
+ authors = [authors]
+ else:
+ authors = []
+
+ docsettings.title = name
+ docsettings.subtitle = description
+ docsettings.authors = authors
+ docsettings.section = section
+
+ if self.config.man_make_section_directory:
+ dirname = 'man%s' % section
+ ensuredir(path.join(self.outdir, dirname))
+ targetname = f'{dirname}/{name}.{section}'
+ else:
+ targetname = f'{name}.{section}'
+
+ logger.info(darkgreen(targetname) + ' { ', nonl=True)
+ destination = FileOutput(
+ destination_path=path.join(self.outdir, targetname),
+ encoding='utf-8')
+
+ tree = self.env.get_doctree(docname)
+ docnames: set[str] = set()
+ largetree = inline_all_toctrees(self, docnames, docname, tree,
+ darkgreen, [docname])
+ largetree.settings = docsettings
+ logger.info('} ', nonl=True)
+ self.env.resolve_references(largetree, docname, self)
+ # remove pending_xref nodes
+ for pendingnode in largetree.findall(addnodes.pending_xref):
+ pendingnode.replace_self(pendingnode.children)
+
+ docwriter.write(largetree, destination)
+
+ def finish(self) -> None:
+ pass
+
+
+def default_man_pages(config: Config) -> list[tuple[str, str, str, list[str], int]]:
+ """ Better default man_pages settings. """
+ filename = make_filename_from_project(config.project)
+ return [(config.root_doc, filename, f'{config.project} {config.release}',
+ [config.author], 1)]
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(ManualPageBuilder)
+
+ app.add_config_value('man_pages', default_man_pages, False)
+ app.add_config_value('man_show_urls', False, False)
+ app.add_config_value('man_make_section_directory', False, False)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/singlehtml.py b/sphinx/builders/singlehtml.py
new file mode 100644
index 0000000..cd66953
--- /dev/null
+++ b/sphinx/builders/singlehtml.py
@@ -0,0 +1,202 @@
+"""Single HTML builders."""
+
+from __future__ import annotations
+
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.environment.adapters.toctree import global_toctree_for_doc
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.console import darkgreen # type: ignore[attr-defined]
+from sphinx.util.display import progress_message
+from sphinx.util.nodes import inline_all_toctrees
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class SingleFileHTMLBuilder(StandaloneHTMLBuilder):
+ """
+ A StandaloneHTMLBuilder subclass that puts the whole document tree on one
+ HTML page.
+ """
+ name = 'singlehtml'
+ epilog = __('The HTML page is in %(outdir)s.')
+
+ copysource = False
+
+ def get_outdated_docs(self) -> str | list[str]: # type: ignore[override]
+ return 'all documents'
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ if docname in self.env.all_docs:
+ # all references are on the same page...
+ return self.config.root_doc + self.out_suffix + \
+ '#document-' + docname
+ else:
+ # chances are this is a html_additional_page
+ return docname + self.out_suffix
+
+ def get_relative_uri(self, from_: str, to: str, typ: str | None = None) -> str:
+ # ignore source
+ return self.get_target_uri(to, typ)
+
+ def fix_refuris(self, tree: Node) -> None:
+ # fix refuris with double anchor
+ fname = self.config.root_doc + self.out_suffix
+ for refnode in tree.findall(nodes.reference):
+ if 'refuri' not in refnode:
+ continue
+ refuri = refnode['refuri']
+ hashindex = refuri.find('#')
+ if hashindex < 0:
+ continue
+ hashindex = refuri.find('#', hashindex + 1)
+ if hashindex >= 0:
+ refnode['refuri'] = fname + refuri[hashindex:]
+
+ def _get_local_toctree(self, docname: str, collapse: bool = True, **kwargs: Any) -> str:
+ if isinstance(includehidden := kwargs.get('includehidden'), str):
+ if includehidden.lower() == 'false':
+ kwargs['includehidden'] = False
+ elif includehidden.lower() == 'true':
+ kwargs['includehidden'] = True
+ if kwargs.get('maxdepth') == '':
+ kwargs.pop('maxdepth')
+ toctree = global_toctree_for_doc(self.env, docname, self, collapse=collapse, **kwargs)
+ if toctree is not None:
+ self.fix_refuris(toctree)
+ return self.render_partial(toctree)['fragment']
+
+ def assemble_doctree(self) -> nodes.document:
+ master = self.config.root_doc
+ tree = self.env.get_doctree(master)
+ tree = inline_all_toctrees(self, set(), master, tree, darkgreen, [master])
+ tree['docname'] = master
+ self.env.resolve_references(tree, master, self)
+ self.fix_refuris(tree)
+ return tree
+
+ def assemble_toc_secnumbers(self) -> dict[str, dict[str, tuple[int, ...]]]:
+ # Assemble toc_secnumbers to resolve section numbers on SingleHTML.
+ # Merge all secnumbers to single secnumber.
+ #
+ # Note: current Sphinx has refid confliction in singlehtml mode.
+ # To avoid the problem, it replaces key of secnumbers to
+ # tuple of docname and refid.
+ #
+ # There are related codes in inline_all_toctres() and
+ # HTMLTranslter#add_secnumber().
+ new_secnumbers: dict[str, tuple[int, ...]] = {}
+ for docname, secnums in self.env.toc_secnumbers.items():
+ for id, secnum in secnums.items():
+ alias = f"{docname}/{id}"
+ new_secnumbers[alias] = secnum
+
+ return {self.config.root_doc: new_secnumbers}
+
+ def assemble_toc_fignumbers(self) -> dict[str, dict[str, dict[str, tuple[int, ...]]]]:
+ # Assemble toc_fignumbers to resolve figure numbers on SingleHTML.
+ # Merge all fignumbers to single fignumber.
+ #
+ # Note: current Sphinx has refid confliction in singlehtml mode.
+ # To avoid the problem, it replaces key of secnumbers to
+ # tuple of docname and refid.
+ #
+ # There are related codes in inline_all_toctres() and
+ # HTMLTranslter#add_fignumber().
+ new_fignumbers: dict[str, dict[str, tuple[int, ...]]] = {}
+ # {'foo': {'figure': {'id2': (2,), 'id1': (1,)}}, 'bar': {'figure': {'id1': (3,)}}}
+ for docname, fignumlist in self.env.toc_fignumbers.items():
+ for figtype, fignums in fignumlist.items():
+ alias = f"{docname}/{figtype}"
+ new_fignumbers.setdefault(alias, {})
+ for id, fignum in fignums.items():
+ new_fignumbers[alias][id] = fignum
+
+ return {self.config.root_doc: new_fignumbers}
+
+ def get_doc_context(self, docname: str, body: str, metatags: str) -> dict[str, Any]:
+ # no relation links...
+ toctree = global_toctree_for_doc(self.env, self.config.root_doc, self, collapse=False)
+ # if there is no toctree, toc is None
+ if toctree:
+ self.fix_refuris(toctree)
+ toc = self.render_partial(toctree)['fragment']
+ display_toc = True
+ else:
+ toc = ''
+ display_toc = False
+ return {
+ 'parents': [],
+ 'prev': None,
+ 'next': None,
+ 'docstitle': None,
+ 'title': self.config.html_title,
+ 'meta': None,
+ 'body': body,
+ 'metatags': metatags,
+ 'rellinks': [],
+ 'sourcename': '',
+ 'toc': toc,
+ 'display_toc': display_toc,
+ }
+
+ def write(self, *ignored: Any) -> None:
+ docnames = self.env.all_docs
+
+ with progress_message(__('preparing documents')):
+ self.prepare_writing(docnames) # type: ignore[arg-type]
+
+ with progress_message(__('assembling single document')):
+ doctree = self.assemble_doctree()
+ self.env.toc_secnumbers = self.assemble_toc_secnumbers()
+ self.env.toc_fignumbers = self.assemble_toc_fignumbers()
+
+ with progress_message(__('writing')):
+ self.write_doc_serialized(self.config.root_doc, doctree)
+ self.write_doc(self.config.root_doc, doctree)
+
+ def finish(self) -> None:
+ self.write_additional_files()
+ self.copy_image_files()
+ self.copy_download_files()
+ self.copy_static_files()
+ self.copy_extra_files()
+ self.write_buildinfo()
+ self.dump_inventory()
+
+ @progress_message(__('writing additional files'))
+ def write_additional_files(self) -> None:
+ # no indices or search pages are supported
+
+ # additional pages from conf.py
+ for pagename, template in self.config.html_additional_pages.items():
+ logger.info(' ' + pagename, nonl=True)
+ self.handle_page(pagename, {}, template)
+
+ if self.config.html_use_opensearch:
+ logger.info(' opensearch', nonl=True)
+ fn = path.join(self.outdir, '_static', 'opensearch.xml')
+ self.handle_page('opensearch', {}, 'opensearch.xml', outfilename=fn)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.setup_extension('sphinx.builders.html')
+
+ app.add_builder(SingleFileHTMLBuilder)
+ app.add_config_value('singlehtml_sidebars', lambda self: self.html_sidebars, 'html')
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py
new file mode 100644
index 0000000..441b598
--- /dev/null
+++ b/sphinx/builders/texinfo.py
@@ -0,0 +1,229 @@
+"""Texinfo builder."""
+
+from __future__ import annotations
+
+import os
+import warnings
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.frontend import OptionParser
+from docutils.io import FileOutput
+
+from sphinx import addnodes, package_dir
+from sphinx.builders import Builder
+from sphinx.environment.adapters.asset import ImageAdapter
+from sphinx.errors import NoUri
+from sphinx.locale import _, __
+from sphinx.util import logging
+from sphinx.util.console import darkgreen # type: ignore[attr-defined]
+from sphinx.util.display import progress_message, status_iterator
+from sphinx.util.docutils import new_document
+from sphinx.util.fileutil import copy_asset_file
+from sphinx.util.nodes import inline_all_toctrees
+from sphinx.util.osutil import SEP, ensuredir, make_filename_from_project
+from sphinx.writers.texinfo import TexinfoTranslator, TexinfoWriter
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+
+logger = logging.getLogger(__name__)
+template_dir = os.path.join(package_dir, 'templates', 'texinfo')
+
+
+class TexinfoBuilder(Builder):
+ """
+ Builds Texinfo output to create Info documentation.
+ """
+ name = 'texinfo'
+ format = 'texinfo'
+ epilog = __('The Texinfo files are in %(outdir)s.')
+ if os.name == 'posix':
+ epilog += __("\nRun 'make' in that directory to run these through "
+ "makeinfo\n"
+ "(use 'make info' here to do that automatically).")
+
+ supported_image_types = ['image/png', 'image/jpeg',
+ 'image/gif']
+ default_translator_class = TexinfoTranslator
+
+ def init(self) -> None:
+ self.docnames: Iterable[str] = []
+ self.document_data: list[tuple[str, str, str, str, str, str, str, bool]] = []
+
+ def get_outdated_docs(self) -> str | list[str]:
+ return 'all documents' # for now
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ if docname not in self.docnames:
+ raise NoUri(docname, typ)
+ return '%' + docname
+
+ def get_relative_uri(self, from_: str, to: str, typ: str | None = None) -> str:
+ # ignore source path
+ return self.get_target_uri(to, typ)
+
+ def init_document_data(self) -> None:
+ preliminary_document_data = [list(x) for x in self.config.texinfo_documents]
+ if not preliminary_document_data:
+ logger.warning(__('no "texinfo_documents" config value found; no documents '
+ 'will be written'))
+ return
+ # assign subdirs to titles
+ self.titles: list[tuple[str, str]] = []
+ for entry in preliminary_document_data:
+ docname = entry[0]
+ if docname not in self.env.all_docs:
+ logger.warning(__('"texinfo_documents" config value references unknown '
+ 'document %s'), docname)
+ continue
+ self.document_data.append(entry) # type: ignore[arg-type]
+ if docname.endswith(SEP + 'index'):
+ docname = docname[:-5]
+ self.titles.append((docname, entry[2]))
+
+ def write(self, *ignored: Any) -> None:
+ self.init_document_data()
+ self.copy_assets()
+ 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')
+ with progress_message(__("processing %s") % targetname):
+ appendices = self.config.texinfo_appendices or []
+ doctree = self.assemble_doctree(docname, toctree_only, appendices=appendices)
+
+ with progress_message(__("writing")):
+ self.post_process_images(doctree)
+ docwriter = TexinfoWriter(self)
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ # DeprecationWarning: The frontend.OptionParser class will be replaced
+ # by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
+ settings: Any = OptionParser(
+ defaults=self.env.settings,
+ components=(docwriter,),
+ read_config_files=True).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.copy_image_files(targetname[:-5])
+
+ def assemble_doctree(
+ self, indexfile: str, toctree_only: bool, appendices: list[str],
+ ) -> nodes.document:
+ self.docnames = set([indexfile] + appendices)
+ logger.info(darkgreen(indexfile) + " ", nonl=True)
+ 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('<Set title in conf.py>',
+ '<Set title in conf.py>')
+ new_tree += new_sect
+ for node in tree.findall(addnodes.toctree):
+ new_sect += node
+ tree = new_tree
+ largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
+ darkgreen, [indexfile])
+ largetree['docname'] = indexfile
+ for docname in appendices:
+ appendix = self.env.get_doctree(docname)
+ appendix['docname'] = docname
+ largetree.append(appendix)
+ logger.info('')
+ logger.info(__("resolving references..."))
+ self.env.resolve_references(largetree, indexfile, self)
+ # TODO: add support for external :ref:s
+ for pendingnode in largetree.findall(addnodes.pending_xref):
+ docname = pendingnode['refdocname']
+ sectname = pendingnode['refsectname']
+ newnodes: list[Node] = [nodes.emphasis(sectname, sectname)]
+ for subdir, title in self.titles:
+ if docname.startswith(subdir):
+ newnodes.append(nodes.Text(_(' (in ')))
+ newnodes.append(nodes.emphasis(title, title))
+ newnodes.append(nodes.Text(')'))
+ break
+ else:
+ pass
+ pendingnode.replace_self(newnodes)
+ return largetree
+
+ def copy_assets(self) -> None:
+ self.copy_support_files()
+
+ def copy_image_files(self, targetname: str) -> None:
+ if self.images:
+ stringify_func = ImageAdapter(self.app.env).get_original_image_uri
+ for src in status_iterator(self.images, __('copying images... '), "brown",
+ len(self.images), self.app.verbosity,
+ stringify_func=stringify_func):
+ dest = self.images[src]
+ try:
+ imagedir = path.join(self.outdir, targetname + '-figures')
+ ensuredir(imagedir)
+ copy_asset_file(path.join(self.srcdir, src),
+ path.join(imagedir, dest))
+ except Exception as err:
+ logger.warning(__('cannot copy image file %r: %s'),
+ path.join(self.srcdir, src), err)
+
+ def copy_support_files(self) -> None:
+ try:
+ with progress_message(__('copying Texinfo support files')):
+ logger.info('Makefile ', nonl=True)
+ copy_asset_file(os.path.join(template_dir, 'Makefile'), self.outdir)
+ except OSError as err:
+ logger.warning(__("error writing file Makefile: %s"), err)
+
+
+def default_texinfo_documents(
+ config: Config,
+) -> list[tuple[str, str, str, str, str, str, str]]:
+ """ Better default texinfo_documents settings. """
+ filename = make_filename_from_project(config.project)
+ return [(config.root_doc, filename, config.project, config.author, filename,
+ 'One line description of project', 'Miscellaneous')]
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(TexinfoBuilder)
+
+ app.add_config_value('texinfo_documents', default_texinfo_documents, False)
+ app.add_config_value('texinfo_appendices', [], False)
+ app.add_config_value('texinfo_elements', {}, False)
+ app.add_config_value('texinfo_domain_indices', True, False, [list])
+ app.add_config_value('texinfo_show_urls', 'footnote', False)
+ app.add_config_value('texinfo_no_detailmenu', False, False)
+ app.add_config_value('texinfo_cross_references', True, False)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/text.py b/sphinx/builders/text.py
new file mode 100644
index 0000000..43a8d1f
--- /dev/null
+++ b/sphinx/builders/text.py
@@ -0,0 +1,94 @@
+"""Plain-text Sphinx builder."""
+
+from __future__ import annotations
+
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils.io import StringOutput
+
+from sphinx.builders import Builder
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.osutil import ensuredir, os_path
+from sphinx.writers.text import TextTranslator, TextWriter
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class TextBuilder(Builder):
+ name = 'text'
+ format = 'text'
+ epilog = __('The text files are in %(outdir)s.')
+
+ out_suffix = '.txt'
+ allow_parallel = True
+ default_translator_class = TextTranslator
+
+ current_docname: str | None = None
+
+ def init(self) -> None:
+ # section numbers for headings in the currently visited document
+ self.secnumbers: dict[str, tuple[int, ...]] = {}
+
+ def get_outdated_docs(self) -> Iterator[str]:
+ for docname in self.env.found_docs:
+ if docname not in self.env.all_docs:
+ yield docname
+ continue
+ targetname = path.join(self.outdir, docname + self.out_suffix)
+ try:
+ targetmtime = path.getmtime(targetname)
+ except Exception:
+ targetmtime = 0
+ try:
+ srcmtime = path.getmtime(self.env.doc2path(docname))
+ if srcmtime > targetmtime:
+ yield docname
+ except OSError:
+ # source doesn't exist anymore
+ pass
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ return ''
+
+ def prepare_writing(self, docnames: set[str]) -> None:
+ self.writer = TextWriter(self)
+
+ def write_doc(self, docname: str, doctree: Node) -> None:
+ self.current_docname = docname
+ self.secnumbers = self.env.toc_secnumbers.get(docname, {})
+ destination = StringOutput(encoding='utf-8')
+ self.writer.write(doctree, destination)
+ outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix)
+ ensuredir(path.dirname(outfilename))
+ try:
+ with open(outfilename, 'w', encoding='utf-8') as f:
+ f.write(self.writer.output)
+ except OSError as err:
+ logger.warning(__("error writing file %s: %s"), outfilename, err)
+
+ def finish(self) -> None:
+ pass
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(TextBuilder)
+
+ app.add_config_value('text_sectionchars', '*=-~"+`', 'env')
+ app.add_config_value('text_newlines', 'unix', 'env')
+ app.add_config_value('text_add_secnumbers', True, 'env')
+ app.add_config_value('text_secnumber_suffix', '. ', 'env')
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/builders/xml.py b/sphinx/builders/xml.py
new file mode 100644
index 0000000..5b88531
--- /dev/null
+++ b/sphinx/builders/xml.py
@@ -0,0 +1,123 @@
+"""Docutils-native XML and pseudo-XML builders."""
+
+from __future__ import annotations
+
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.io import StringOutput
+from docutils.writers.docutils_xml import XMLTranslator
+
+from sphinx.builders import Builder
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.osutil import ensuredir, os_path
+from sphinx.writers.xml import PseudoXMLWriter, XMLWriter
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class XMLBuilder(Builder):
+ """
+ Builds Docutils-native XML.
+ """
+ name = 'xml'
+ format = 'xml'
+ epilog = __('The XML files are in %(outdir)s.')
+
+ out_suffix = '.xml'
+ allow_parallel = True
+
+ _writer_class: type[XMLWriter] | type[PseudoXMLWriter] = XMLWriter
+ writer: XMLWriter | PseudoXMLWriter
+ default_translator_class = XMLTranslator
+
+ def init(self) -> None:
+ pass
+
+ def get_outdated_docs(self) -> Iterator[str]:
+ for docname in self.env.found_docs:
+ if docname not in self.env.all_docs:
+ yield docname
+ continue
+ targetname = path.join(self.outdir, docname + self.out_suffix)
+ try:
+ targetmtime = path.getmtime(targetname)
+ except Exception:
+ targetmtime = 0
+ try:
+ srcmtime = path.getmtime(self.env.doc2path(docname))
+ if srcmtime > targetmtime:
+ yield docname
+ except OSError:
+ # source doesn't exist anymore
+ pass
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ return docname
+
+ def prepare_writing(self, docnames: set[str]) -> None:
+ self.writer = self._writer_class(self)
+
+ def write_doc(self, docname: str, doctree: Node) -> None:
+ # work around multiple string % tuple issues in docutils;
+ # replace tuples in attribute values with lists
+ doctree = doctree.deepcopy()
+ for domain in self.env.domains.values():
+ xmlns = "xmlns:" + domain.name
+ doctree[xmlns] = "https://www.sphinx-doc.org/" # type: ignore[index]
+ for node in doctree.findall(nodes.Element):
+ for att, value in node.attributes.items():
+ if isinstance(value, tuple):
+ node.attributes[att] = list(value)
+ value = node.attributes[att]
+ if isinstance(value, list):
+ for i, val in enumerate(value):
+ if isinstance(val, tuple):
+ value[i] = list(val)
+ destination = StringOutput(encoding='utf-8')
+ self.writer.write(doctree, destination)
+ outfilename = path.join(self.outdir, os_path(docname) + self.out_suffix)
+ ensuredir(path.dirname(outfilename))
+ try:
+ with open(outfilename, 'w', encoding='utf-8') as f:
+ f.write(self.writer.output)
+ except OSError as err:
+ logger.warning(__("error writing file %s: %s"), outfilename, err)
+
+ def finish(self) -> None:
+ pass
+
+
+class PseudoXMLBuilder(XMLBuilder):
+ """
+ Builds pseudo-XML for display purposes.
+ """
+ name = 'pseudoxml'
+ format = 'pseudoxml'
+ epilog = __('The pseudo-XML files are in %(outdir)s.')
+
+ out_suffix = '.pseudoxml'
+
+ _writer_class = PseudoXMLWriter
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(XMLBuilder)
+ app.add_builder(PseudoXMLBuilder)
+
+ app.add_config_value('xml_pretty', True, 'env')
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/cmd/__init__.py b/sphinx/cmd/__init__.py
new file mode 100644
index 0000000..4d277c5
--- /dev/null
+++ b/sphinx/cmd/__init__.py
@@ -0,0 +1 @@
+"""Modules for command line executables."""
diff --git a/sphinx/cmd/build.py b/sphinx/cmd/build.py
new file mode 100644
index 0000000..3ee0ceb
--- /dev/null
+++ b/sphinx/cmd/build.py
@@ -0,0 +1,345 @@
+"""Build documentation from a provided source."""
+
+from __future__ import annotations
+
+import argparse
+import bdb
+import contextlib
+import locale
+import multiprocessing
+import os
+import pdb # NoQA: T100
+import sys
+import traceback
+from os import path
+from typing import TYPE_CHECKING, Any, TextIO
+
+from docutils.utils import SystemMessage
+
+import sphinx.locale
+from sphinx import __display_version__
+from sphinx.application import Sphinx
+from sphinx.errors import SphinxError, SphinxParallelError
+from sphinx.locale import __
+from sphinx.util import Tee
+from sphinx.util.console import ( # type: ignore[attr-defined]
+ color_terminal,
+ nocolor,
+ red,
+ terminal_safe,
+)
+from sphinx.util.docutils import docutils_namespace, patch_docutils
+from sphinx.util.exceptions import format_exception_cut_frames, save_traceback
+from sphinx.util.osutil import ensuredir
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+
+def handle_exception(
+ app: Sphinx | None, args: Any, exception: BaseException, stderr: TextIO = sys.stderr,
+) -> None:
+ if isinstance(exception, bdb.BdbQuit):
+ return
+
+ if args.pdb:
+ print(red(__('Exception occurred while building, starting debugger:')),
+ file=stderr)
+ traceback.print_exc()
+ pdb.post_mortem(sys.exc_info()[2])
+ else:
+ print(file=stderr)
+ if args.verbosity or args.traceback:
+ exc = sys.exc_info()[1]
+ if isinstance(exc, SphinxParallelError):
+ exc_format = '(Error in parallel process)\n' + exc.traceback
+ print(exc_format, file=stderr)
+ else:
+ traceback.print_exc(None, stderr)
+ print(file=stderr)
+ if isinstance(exception, KeyboardInterrupt):
+ print(__('Interrupted!'), file=stderr)
+ elif isinstance(exception, SystemMessage):
+ print(red(__('reST markup error:')), file=stderr)
+ print(terminal_safe(exception.args[0]), file=stderr)
+ elif isinstance(exception, SphinxError):
+ print(red('%s:' % exception.category), file=stderr)
+ print(str(exception), file=stderr)
+ elif isinstance(exception, UnicodeError):
+ print(red(__('Encoding error:')), file=stderr)
+ print(terminal_safe(str(exception)), file=stderr)
+ tbpath = save_traceback(app, exception)
+ print(red(__('The full traceback has been saved in %s, if you want '
+ 'to report the issue to the developers.') % tbpath),
+ file=stderr)
+ elif isinstance(exception, RuntimeError) and 'recursion depth' in str(exception):
+ print(red(__('Recursion error:')), file=stderr)
+ print(terminal_safe(str(exception)), file=stderr)
+ print(file=stderr)
+ print(__('This can happen with very large or deeply nested source '
+ 'files. You can carefully increase the default Python '
+ 'recursion limit of 1000 in conf.py with e.g.:'), file=stderr)
+ print(' import sys; sys.setrecursionlimit(1500)', file=stderr)
+ else:
+ print(red(__('Exception occurred:')), file=stderr)
+ print(format_exception_cut_frames().rstrip(), file=stderr)
+ tbpath = save_traceback(app, exception)
+ print(red(__('The full traceback has been saved in %s, if you '
+ 'want to report the issue to the developers.') % tbpath),
+ file=stderr)
+ print(__('Please also report this if it was a user error, so '
+ 'that a better error message can be provided next time.'),
+ file=stderr)
+ print(__('A bug report can be filed in the tracker at '
+ '<https://github.com/sphinx-doc/sphinx/issues>. Thanks!'),
+ file=stderr)
+
+
+def jobs_argument(value: str) -> int:
+ """
+ Special type to handle 'auto' flags passed to 'sphinx-build' via -j flag. Can
+ be expanded to handle other special scaling requests, such as setting job count
+ to cpu_count.
+ """
+ if value == 'auto':
+ return multiprocessing.cpu_count()
+ else:
+ jobs = int(value)
+ if jobs <= 0:
+ raise argparse.ArgumentTypeError(__('job number should be a positive number'))
+ else:
+ return jobs
+
+
+def get_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser(
+ usage='%(prog)s [OPTIONS] SOURCEDIR OUTPUTDIR [FILENAMES...]',
+ epilog=__('For more information, visit <https://www.sphinx-doc.org/>.'),
+ description=__("""
+Generate documentation from source files.
+
+sphinx-build generates documentation from the files in SOURCEDIR and places it
+in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration
+settings. The 'sphinx-quickstart' tool may be used to generate template files,
+including 'conf.py'
+
+sphinx-build can create documentation in different formats. A format is
+selected by specifying the builder name on the command line; it defaults to
+HTML. Builders can also perform other tasks related to documentation
+processing.
+
+By default, everything that is outdated is built. Output only for selected
+files can be built by specifying individual filenames.
+"""))
+
+ parser.add_argument('--version', action='version', dest='show_version',
+ version='%%(prog)s %s' % __display_version__)
+
+ parser.add_argument('sourcedir',
+ help=__('path to documentation source files'))
+ parser.add_argument('outputdir',
+ help=__('path to output directory'))
+ parser.add_argument('filenames', nargs='*',
+ help=__('a list of specific files to rebuild. Ignored '
+ 'if -a is specified'))
+
+ group = parser.add_argument_group(__('general options'))
+ group.add_argument('-b', metavar='BUILDER', dest='builder',
+ default='html',
+ help=__('builder to use (default: html)'))
+ group.add_argument('-a', action='store_true', dest='force_all',
+ help=__('write all files (default: only write new and '
+ 'changed files)'))
+ group.add_argument('-E', action='store_true', dest='freshenv',
+ help=__("don't use a saved environment, always read "
+ 'all files'))
+ group.add_argument('-d', metavar='PATH', dest='doctreedir',
+ help=__('path for the cached environment and doctree '
+ 'files (default: OUTPUTDIR/.doctrees)'))
+ group.add_argument('-j', '--jobs', metavar='N', default=1, type=jobs_argument,
+ dest='jobs',
+ help=__('build in parallel with N processes where '
+ 'possible (special value "auto" will set N to cpu-count)'))
+ group = parser.add_argument_group('build configuration options')
+ group.add_argument('-c', metavar='PATH', dest='confdir',
+ help=__('path where configuration file (conf.py) is '
+ 'located (default: same as SOURCEDIR)'))
+ group.add_argument('-C', action='store_true', dest='noconfig',
+ help=__('use no config file at all, only -D options'))
+ group.add_argument('-D', metavar='setting=value', action='append',
+ dest='define', default=[],
+ help=__('override a setting in configuration file'))
+ group.add_argument('-A', metavar='name=value', action='append',
+ dest='htmldefine', default=[],
+ help=__('pass a value into HTML templates'))
+ group.add_argument('-t', metavar='TAG', action='append',
+ dest='tags', default=[],
+ help=__('define tag: include "only" blocks with TAG'))
+ group.add_argument('-n', action='store_true', dest='nitpicky',
+ help=__('nit-picky mode, warn about all missing '
+ 'references'))
+
+ group = parser.add_argument_group(__('console output options'))
+ group.add_argument('-v', action='count', dest='verbosity', default=0,
+ help=__('increase verbosity (can be repeated)'))
+ group.add_argument('-q', action='store_true', dest='quiet',
+ help=__('no output on stdout, just warnings on stderr'))
+ group.add_argument('-Q', action='store_true', dest='really_quiet',
+ help=__('no output at all, not even warnings'))
+ group.add_argument('--color', action='store_const', const='yes',
+ default='auto',
+ help=__('do emit colored output (default: auto-detect)'))
+ group.add_argument('-N', '--no-color', dest='color', action='store_const',
+ const='no',
+ help=__('do not emit colored output (default: '
+ 'auto-detect)'))
+ group.add_argument('-w', metavar='FILE', dest='warnfile',
+ help=__('write warnings (and errors) to given file'))
+ group.add_argument('-W', action='store_true', dest='warningiserror',
+ help=__('turn warnings into errors'))
+ group.add_argument('--keep-going', action='store_true', dest='keep_going',
+ help=__("with -W, keep going when getting warnings"))
+ group.add_argument('-T', action='store_true', dest='traceback',
+ help=__('show full traceback on exception'))
+ group.add_argument('-P', action='store_true', dest='pdb',
+ help=__('run Pdb on exception'))
+
+ return parser
+
+
+def make_main(argv: Sequence[str]) -> int:
+ """Sphinx build "make mode" entry."""
+ from sphinx.cmd import make_mode
+ return make_mode.run_make_mode(argv[1:])
+
+
+def _parse_arguments(argv: Sequence[str]) -> argparse.Namespace:
+ parser = get_parser()
+ args = parser.parse_args(argv)
+
+ if args.noconfig:
+ args.confdir = None
+ elif not args.confdir:
+ args.confdir = args.sourcedir
+
+ if not args.doctreedir:
+ args.doctreedir = os.path.join(args.outputdir, '.doctrees')
+
+ if args.force_all and args.filenames:
+ parser.error(__('cannot combine -a option and filenames'))
+
+ if args.color == 'no' or (args.color == 'auto' and not color_terminal()):
+ nocolor()
+
+ status: TextIO | None = sys.stdout
+ warning: TextIO | None = sys.stderr
+ error = sys.stderr
+
+ if args.quiet:
+ status = None
+
+ if args.really_quiet:
+ status = warning = None
+
+ if warning and args.warnfile:
+ try:
+ warnfile = path.abspath(args.warnfile)
+ ensuredir(path.dirname(warnfile))
+ warnfp = open(args.warnfile, 'w', encoding="utf-8") # NoQA: SIM115
+ except Exception as exc:
+ parser.error(__('cannot open warning file %r: %s') % (
+ args.warnfile, exc))
+ warning = Tee(warning, warnfp) # type: ignore[assignment]
+ error = warning
+
+ args.status = status
+ args.warning = warning
+ args.error = error
+
+ confoverrides = {}
+ for val in args.define:
+ try:
+ key, val = val.split('=', 1)
+ except ValueError:
+ parser.error(__('-D option argument must be in the form name=value'))
+ confoverrides[key] = val
+
+ for val in args.htmldefine:
+ try:
+ key, val = val.split('=')
+ except ValueError:
+ parser.error(__('-A option argument must be in the form name=value'))
+ with contextlib.suppress(ValueError):
+ val = int(val)
+
+ confoverrides['html_context.%s' % key] = val
+
+ if args.nitpicky:
+ confoverrides['nitpicky'] = True
+
+ args.confoverrides = confoverrides
+
+ return args
+
+
+def build_main(argv: Sequence[str]) -> int:
+ """Sphinx build "main" command-line entry."""
+ args = _parse_arguments(argv)
+
+ app = None
+ try:
+ confdir = args.confdir or args.sourcedir
+ with patch_docutils(confdir), docutils_namespace():
+ app = Sphinx(args.sourcedir, args.confdir, args.outputdir,
+ args.doctreedir, args.builder, args.confoverrides, args.status,
+ args.warning, args.freshenv, args.warningiserror,
+ args.tags, args.verbosity, args.jobs, args.keep_going,
+ args.pdb)
+ app.build(args.force_all, args.filenames)
+ return app.statuscode
+ except (Exception, KeyboardInterrupt) as exc:
+ handle_exception(app, args, exc, args.error)
+ return 2
+
+
+def _bug_report_info() -> int:
+ from platform import platform, python_implementation
+
+ import docutils
+ import jinja2
+ import pygments
+
+ print('Please paste all output below into the bug report template\n\n')
+ print('```text')
+ print(f'Platform: {sys.platform}; ({platform()})')
+ print(f'Python version: {sys.version})')
+ print(f'Python implementation: {python_implementation()}')
+ print(f'Sphinx version: {sphinx.__display_version__}')
+ print(f'Docutils version: {docutils.__version__}')
+ print(f'Jinja2 version: {jinja2.__version__}')
+ print(f'Pygments version: {pygments.__version__}')
+ print('```')
+ return 0
+
+
+def main(argv: Sequence[str] = (), /) -> int:
+ locale.setlocale(locale.LC_ALL, '')
+ sphinx.locale.init_console()
+
+ if not argv:
+ argv = sys.argv[1:]
+
+ # Allow calling as 'python -m sphinx build …'
+ if argv[:1] == ['build']:
+ argv = argv[1:]
+
+ if argv[:1] == ['--bug-report']:
+ return _bug_report_info()
+ if argv[:1] == ['-M']:
+ return make_main(argv)
+ else:
+ return build_main(argv)
+
+
+if __name__ == '__main__':
+ raise SystemExit(main(sys.argv[1:]))
diff --git a/sphinx/cmd/make_mode.py b/sphinx/cmd/make_mode.py
new file mode 100644
index 0000000..8b26d9d
--- /dev/null
+++ b/sphinx/cmd/make_mode.py
@@ -0,0 +1,181 @@
+"""sphinx-build -M command-line handling.
+
+This replaces the old, platform-dependent and once-generated content
+of Makefile / make.bat.
+
+This is in its own module so that importing it is fast. It should not
+import the main Sphinx modules (like sphinx.applications, sphinx.builders).
+"""
+
+from __future__ import annotations
+
+import os
+import subprocess
+import sys
+from os import path
+from typing import TYPE_CHECKING
+
+import sphinx
+from sphinx.cmd.build import build_main
+from sphinx.util.console import ( # type: ignore[attr-defined]
+ blue,
+ bold,
+ color_terminal,
+ nocolor,
+)
+from sphinx.util.osutil import rmtree
+
+try:
+ from contextlib import chdir # type: ignore[attr-defined]
+except ImportError:
+ from sphinx.util.osutil import _chdir as chdir
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+BUILDERS = [
+ ("", "html", "to make standalone HTML files"),
+ ("", "dirhtml", "to make HTML files named index.html in directories"),
+ ("", "singlehtml", "to make a single large HTML file"),
+ ("", "pickle", "to make pickle files"),
+ ("", "json", "to make JSON files"),
+ ("", "htmlhelp", "to make HTML files and an HTML help project"),
+ ("", "qthelp", "to make HTML files and a qthelp project"),
+ ("", "devhelp", "to make HTML files and a Devhelp project"),
+ ("", "epub", "to make an epub"),
+ ("", "latex", "to make LaTeX files, you can set PAPER=a4 or PAPER=letter"),
+ ("posix", "latexpdf", "to make LaTeX and PDF files (default pdflatex)"),
+ ("posix", "latexpdfja", "to make LaTeX files and run them through platex/dvipdfmx"),
+ ("", "text", "to make text files"),
+ ("", "man", "to make manual pages"),
+ ("", "texinfo", "to make Texinfo files"),
+ ("posix", "info", "to make Texinfo files and run them through makeinfo"),
+ ("", "gettext", "to make PO message catalogs"),
+ ("", "changes", "to make an overview of all changed/added/deprecated items"),
+ ("", "xml", "to make Docutils-native XML files"),
+ ("", "pseudoxml", "to make pseudoxml-XML files for display purposes"),
+ ("", "linkcheck", "to check all external links for integrity"),
+ ("", "doctest", "to run all doctests embedded in the documentation "
+ "(if enabled)"),
+ ("", "coverage", "to run coverage check of the documentation (if enabled)"),
+ ("", "clean", "to remove everything in the build directory"),
+]
+
+
+class Make:
+ def __init__(self, srcdir: str, builddir: str, opts: Sequence[str]) -> None:
+ self.srcdir = srcdir
+ self.builddir = builddir
+ self.opts = [*opts]
+
+ def builddir_join(self, *comps: str) -> str:
+ return path.join(self.builddir, *comps)
+
+ def build_clean(self) -> int:
+ srcdir = path.abspath(self.srcdir)
+ builddir = path.abspath(self.builddir)
+ if not path.exists(self.builddir):
+ return 0
+ elif not path.isdir(self.builddir):
+ print("Error: %r is not a directory!" % self.builddir)
+ return 1
+ elif srcdir == builddir:
+ print("Error: %r is same as source directory!" % self.builddir)
+ return 1
+ elif path.commonpath([srcdir, builddir]) == builddir:
+ print("Error: %r directory contains source directory!" % self.builddir)
+ return 1
+ print("Removing everything under %r..." % self.builddir)
+ for item in os.listdir(self.builddir):
+ rmtree(self.builddir_join(item))
+ return 0
+
+ def build_help(self) -> None:
+ if not color_terminal():
+ nocolor()
+
+ print(bold("Sphinx v%s" % sphinx.__display_version__))
+ print("Please use `make %s' where %s is one of" % ((blue('target'),) * 2))
+ for osname, bname, description in BUILDERS:
+ if not osname or os.name == osname:
+ print(f' {blue(bname.ljust(10))} {description}')
+
+ def build_latexpdf(self) -> int:
+ if self.run_generic_build('latex') > 0:
+ return 1
+
+ # Use $MAKE to determine the make command
+ make_fallback = 'make.bat' if sys.platform == 'win32' else 'make'
+ makecmd = os.environ.get('MAKE', make_fallback)
+ if not makecmd.lower().startswith('make'):
+ raise RuntimeError('Invalid $MAKE command: %r' % makecmd)
+ try:
+ with chdir(self.builddir_join('latex')):
+ return subprocess.call([makecmd, 'all-pdf'])
+ except OSError:
+ print('Error: Failed to run: %s' % makecmd)
+ return 1
+
+ def build_latexpdfja(self) -> int:
+ if self.run_generic_build('latex') > 0:
+ return 1
+
+ # Use $MAKE to determine the make command
+ make_fallback = 'make.bat' if sys.platform == 'win32' else 'make'
+ makecmd = os.environ.get('MAKE', make_fallback)
+ if not makecmd.lower().startswith('make'):
+ raise RuntimeError('Invalid $MAKE command: %r' % makecmd)
+ try:
+ with chdir(self.builddir_join('latex')):
+ return subprocess.call([makecmd, 'all-pdf'])
+ except OSError:
+ print('Error: Failed to run: %s' % makecmd)
+ return 1
+
+ def build_info(self) -> int:
+ if self.run_generic_build('texinfo') > 0:
+ return 1
+
+ # Use $MAKE to determine the make command
+ makecmd = os.environ.get('MAKE', 'make')
+ if not makecmd.lower().startswith('make'):
+ raise RuntimeError('Invalid $MAKE command: %r' % makecmd)
+ try:
+ with chdir(self.builddir_join('texinfo')):
+ return subprocess.call([makecmd, 'info'])
+ except OSError:
+ print('Error: Failed to run: %s' % makecmd)
+ return 1
+
+ def build_gettext(self) -> int:
+ dtdir = self.builddir_join('gettext', '.doctrees')
+ if self.run_generic_build('gettext', doctreedir=dtdir) > 0:
+ return 1
+ return 0
+
+ def run_generic_build(self, builder: str, doctreedir: str | None = None) -> int:
+ # compatibility with old Makefile
+ papersize = os.getenv('PAPER', '')
+ opts = self.opts
+ if papersize in ('a4', 'letter'):
+ opts.extend(['-D', 'latex_elements.papersize=' + papersize + 'paper'])
+ if doctreedir is None:
+ doctreedir = self.builddir_join('doctrees')
+
+ args = ['-b', builder,
+ '-d', doctreedir,
+ self.srcdir,
+ self.builddir_join(builder)]
+ return build_main(args + opts)
+
+
+def run_make_mode(args: Sequence[str]) -> int:
+ if len(args) < 3:
+ print('Error: at least 3 arguments (builder, source '
+ 'dir, build dir) are required.', file=sys.stderr)
+ return 1
+ make = Make(args[1], args[2], args[3:])
+ run_method = 'build_' + args[0]
+ if hasattr(make, run_method):
+ return getattr(make, run_method)()
+ return make.run_generic_build(args[0])
diff --git a/sphinx/cmd/quickstart.py b/sphinx/cmd/quickstart.py
new file mode 100644
index 0000000..89aec45
--- /dev/null
+++ b/sphinx/cmd/quickstart.py
@@ -0,0 +1,617 @@
+"""Quickly setup documentation source to work with Sphinx."""
+
+from __future__ import annotations
+
+import argparse
+import locale
+import os
+import sys
+import time
+from os import path
+from typing import TYPE_CHECKING, Any, Callable
+
+# try to import readline, unix specific enhancement
+try:
+ import readline
+ if TYPE_CHECKING and sys.platform == "win32": # always false, for type checking
+ raise ImportError
+ READLINE_AVAILABLE = True
+ if readline.__doc__ and 'libedit' in readline.__doc__:
+ readline.parse_and_bind("bind ^I rl_complete")
+ USE_LIBEDIT = True
+ else:
+ readline.parse_and_bind("tab: complete")
+ USE_LIBEDIT = False
+except ImportError:
+ READLINE_AVAILABLE = False
+ USE_LIBEDIT = False
+
+from docutils.utils import column_width
+
+import sphinx.locale
+from sphinx import __display_version__, package_dir
+from sphinx.locale import __
+from sphinx.util.console import ( # type: ignore[attr-defined]
+ bold,
+ color_terminal,
+ colorize,
+ nocolor,
+ red,
+)
+from sphinx.util.osutil import ensuredir
+from sphinx.util.template import SphinxRenderer
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+EXTENSIONS = {
+ 'autodoc': __('automatically insert docstrings from modules'),
+ 'doctest': __('automatically test code snippets in doctest blocks'),
+ 'intersphinx': __('link between Sphinx documentation of different projects'),
+ 'todo': __('write "todo" entries that can be shown or hidden on build'),
+ 'coverage': __('checks for documentation coverage'),
+ 'imgmath': __('include math, rendered as PNG or SVG images'),
+ 'mathjax': __('include math, rendered in the browser by MathJax'),
+ 'ifconfig': __('conditional inclusion of content based on config values'),
+ 'viewcode': __('include links to the source code of documented Python objects'),
+ 'githubpages': __('create .nojekyll file to publish the document on GitHub pages'),
+}
+
+DEFAULTS = {
+ 'path': '.',
+ 'sep': False,
+ 'dot': '_',
+ 'language': None,
+ 'suffix': '.rst',
+ 'master': 'index',
+ 'makefile': True,
+ 'batchfile': True,
+}
+
+PROMPT_PREFIX = '> '
+
+if sys.platform == 'win32':
+ # On Windows, show questions as bold because of color scheme of PowerShell (refs: #5294).
+ COLOR_QUESTION = 'bold'
+else:
+ COLOR_QUESTION = 'purple'
+
+
+# function to get input from terminal -- overridden by the test suite
+def term_input(prompt: str) -> str:
+ if sys.platform == 'win32':
+ # Important: On windows, readline is not enabled by default. In these
+ # environment, escape sequences have been broken. To avoid the
+ # problem, quickstart uses ``print()`` to show prompt.
+ print(prompt, end='')
+ return input('')
+ else:
+ return input(prompt)
+
+
+class ValidationError(Exception):
+ """Raised for validation errors."""
+
+
+def is_path(x: str) -> str:
+ x = path.expanduser(x)
+ if not path.isdir(x):
+ raise ValidationError(__("Please enter a valid path name."))
+ return x
+
+
+def is_path_or_empty(x: str) -> str:
+ if x == '':
+ return x
+ return is_path(x)
+
+
+def allow_empty(x: str) -> str:
+ return x
+
+
+def nonempty(x: str) -> str:
+ if not x:
+ raise ValidationError(__("Please enter some text."))
+ return x
+
+
+def choice(*l: str) -> Callable[[str], str]:
+ def val(x: str) -> str:
+ if x not in l:
+ raise ValidationError(__('Please enter one of %s.') % ', '.join(l))
+ return x
+ return val
+
+
+def boolean(x: str) -> bool:
+ if x.upper() not in ('Y', 'YES', 'N', 'NO'):
+ raise ValidationError(__("Please enter either 'y' or 'n'."))
+ return x.upper() in ('Y', 'YES')
+
+
+def suffix(x: str) -> str:
+ if not (x[0:1] == '.' and len(x) > 1):
+ raise ValidationError(__("Please enter a file suffix, e.g. '.rst' or '.txt'."))
+ return x
+
+
+def ok(x: str) -> str:
+ return x
+
+
+def do_prompt(
+ text: str, default: str | None = None, validator: Callable[[str], Any] = nonempty,
+) -> str | bool:
+ while True:
+ if default is not None:
+ prompt = PROMPT_PREFIX + f'{text} [{default}]: '
+ else:
+ prompt = PROMPT_PREFIX + text + ': '
+ if USE_LIBEDIT:
+ # Note: libedit has a problem for combination of ``input()`` and escape
+ # sequence (see #5335). To avoid the problem, all prompts are not colored
+ # on libedit.
+ pass
+ elif READLINE_AVAILABLE:
+ # pass input_mode=True if readline available
+ prompt = colorize(COLOR_QUESTION, prompt, input_mode=True)
+ else:
+ prompt = colorize(COLOR_QUESTION, prompt, input_mode=False)
+ x = term_input(prompt).strip()
+ if default and not x:
+ x = default
+ try:
+ x = validator(x)
+ except ValidationError as err:
+ print(red('* ' + str(err)))
+ continue
+ break
+ return x
+
+
+class QuickstartRenderer(SphinxRenderer):
+ def __init__(self, templatedir: str = '') -> None:
+ self.templatedir = templatedir
+ super().__init__()
+
+ def _has_custom_template(self, template_name: str) -> bool:
+ """Check if custom template file exists.
+
+ Note: Please don't use this function from extensions.
+ It will be removed in the future without deprecation period.
+ """
+ template = path.join(self.templatedir, path.basename(template_name))
+ return bool(self.templatedir) and path.exists(template)
+
+ def render(self, template_name: str, context: dict[str, Any]) -> str:
+ if self._has_custom_template(template_name):
+ custom_template = path.join(self.templatedir, path.basename(template_name))
+ return self.render_from_file(custom_template, context)
+ else:
+ return super().render(template_name, context)
+
+
+def ask_user(d: dict[str, Any]) -> None:
+ """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
+ * language: document language
+ * suffix: source file suffix
+ * master: master document name
+ * extensions: extensions to use (list)
+ * makefile: make Makefile
+ * batchfile: make command file
+ """
+
+ print(bold(__('Welcome to the Sphinx %s quickstart utility.')) % __display_version__)
+ print()
+ print(__('Please enter values for the following settings (just press Enter to\n'
+ 'accept a default value, if one is given in brackets).'))
+
+ if 'path' in d:
+ print()
+ print(bold(__('Selected root path: %s')) % d['path'])
+ else:
+ print()
+ print(__('Enter the root path for documentation.'))
+ d['path'] = do_prompt(__('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')):
+ print()
+ print(bold(__('Error: an existing conf.py has been found in the '
+ 'selected root path.')))
+ print(__('sphinx-quickstart will not overwrite existing Sphinx projects.'))
+ print()
+ d['path'] = do_prompt(__('Please enter a new root path (or just Enter to exit)'),
+ '', is_path_or_empty)
+ if not d['path']:
+ raise SystemExit(1)
+
+ if 'sep' not in d:
+ print()
+ print(__('You have two options for placing the build directory for Sphinx output.\n'
+ 'Either, you use a directory "_build" within the root path, or you separate\n'
+ '"source" and "build" directories within the root path.'))
+ d['sep'] = do_prompt(__('Separate source and build directories (y/n)'), 'n', boolean)
+
+ if 'dot' not in d:
+ print()
+ print(__('Inside the root directory, two more directories will be created; "_templates"\n' # noqa: E501
+ 'for custom HTML templates and "_static" for custom stylesheets and other static\n' # noqa: E501
+ 'files. You can enter another prefix (such as ".") to replace the underscore.')) # noqa: E501
+ d['dot'] = do_prompt(__('Name prefix for templates and static dir'), '_', ok)
+
+ if 'project' not in d:
+ print()
+ print(__('The project name will occur in several places in the built documentation.'))
+ d['project'] = do_prompt(__('Project name'))
+ if 'author' not in d:
+ d['author'] = do_prompt(__('Author name(s)'))
+
+ if 'version' not in d:
+ print()
+ print(__('Sphinx has the notion of a "version" and a "release" for the\n'
+ 'software. Each version can have multiple releases. For example, for\n'
+ 'Python the version is something like 2.5 or 3.0, while the release is\n'
+ "something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+ 'just set both to the same value.'))
+ d['version'] = do_prompt(__('Project version'), '', allow_empty)
+ if 'release' not in d:
+ d['release'] = do_prompt(__('Project release'), d['version'], allow_empty)
+
+ if 'language' not in d:
+ print()
+ print(__(
+ 'If the documents are to be written in a language other than English,\n'
+ 'you can select a language here by its language code. Sphinx will then\n'
+ 'translate text that it generates into that language.\n'
+ '\n'
+ 'For a list of supported codes, see\n'
+ 'https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language.',
+ ))
+ d['language'] = do_prompt(__('Project language'), 'en')
+ if d['language'] == 'en':
+ d['language'] = None
+
+ if 'suffix' not in d:
+ print()
+ print(__('The file name suffix for source files. Commonly, this is either ".txt"\n'
+ 'or ".rst". Only files with this suffix are considered documents.'))
+ d['suffix'] = do_prompt(__('Source file suffix'), '.rst', suffix)
+
+ if 'master' not in d:
+ print()
+ print(__('One document is special in that it is considered the top node of the\n'
+ '"contents tree", that is, it is the root of the hierarchical structure\n'
+ 'of the documents. Normally, this is "index", but if your "index"\n'
+ 'document is a custom template, you can also set this to another filename.'))
+ d['master'] = do_prompt(__('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'])):
+ print()
+ print(bold(__('Error: the master file %s has already been found in the '
+ 'selected root path.') % (d['master'] + d['suffix'])))
+ print(__('sphinx-quickstart will not overwrite the existing file.'))
+ print()
+ d['master'] = do_prompt(__('Please enter a new file name, or rename the '
+ 'existing file and press Enter'), d['master'])
+
+ if 'extensions' not in d:
+ print(__('Indicate which of the following Sphinx extensions should be enabled:'))
+ d['extensions'] = []
+ for name, description in EXTENSIONS.items():
+ if do_prompt(f'{name}: {description} (y/n)', 'n', boolean):
+ d['extensions'].append('sphinx.ext.%s' % name)
+
+ # Handle conflicting options
+ if {'sphinx.ext.imgmath', 'sphinx.ext.mathjax'}.issubset(d['extensions']):
+ print(__('Note: imgmath and mathjax cannot be enabled at the same time. '
+ 'imgmath has been deselected.'))
+ d['extensions'].remove('sphinx.ext.imgmath')
+
+ if 'makefile' not in d:
+ print()
+ print(__('A Makefile and a Windows command file can be generated for you so that you\n'
+ "only have to run e.g. `make html' instead of invoking sphinx-build\n"
+ 'directly.'))
+ d['makefile'] = do_prompt(__('Create Makefile? (y/n)'), 'y', boolean)
+
+ if 'batchfile' not in d:
+ d['batchfile'] = do_prompt(__('Create Windows command file? (y/n)'), 'y', boolean)
+ print()
+
+
+def generate(
+ d: dict, overwrite: bool = True, silent: bool = False, templatedir: str | None = None,
+) -> None:
+ """Generate project based on values in *d*."""
+ template = QuickstartRenderer(templatedir or '')
+
+ if 'mastertoctree' not in d:
+ d['mastertoctree'] = ''
+ if 'mastertocmaxdepth' not in d:
+ d['mastertocmaxdepth'] = 2
+
+ d['root_doc'] = d['master']
+ d['now'] = time.asctime()
+ d['project_underline'] = column_width(d['project']) * '='
+ d.setdefault('extensions', [])
+ d['copyright'] = time.strftime('%Y') + ', ' + d['author']
+
+ d["path"] = os.path.abspath(d['path'])
+ ensuredir(d['path'])
+
+ srcdir = path.join(d['path'], 'source') if d['sep'] else d['path']
+
+ ensuredir(srcdir)
+ if d['sep']:
+ builddir = path.join(d['path'], 'build')
+ d['exclude_patterns'] = ''
+ else:
+ builddir = path.join(srcdir, d['dot'] + 'build')
+ exclude_patterns = map(repr, [
+ d['dot'] + 'build',
+ 'Thumbs.db', '.DS_Store',
+ ])
+ d['exclude_patterns'] = ', '.join(exclude_patterns)
+ ensuredir(builddir)
+ ensuredir(path.join(srcdir, d['dot'] + 'templates'))
+ ensuredir(path.join(srcdir, d['dot'] + 'static'))
+
+ def write_file(fpath: str, content: str, newline: str | None = None) -> None:
+ if overwrite or not path.isfile(fpath):
+ if 'quiet' not in d:
+ print(__('Creating file %s.') % fpath)
+ with open(fpath, 'w', encoding='utf-8', newline=newline) as f:
+ f.write(content)
+ else:
+ if 'quiet' not in d:
+ print(__('File %s already exists, skipping.') % fpath)
+
+ conf_path = os.path.join(templatedir, 'conf.py_t') if templatedir else None
+ if not conf_path or not path.isfile(conf_path):
+ conf_path = os.path.join(package_dir, 'templates', 'quickstart', 'conf.py_t')
+ with open(conf_path, encoding="utf-8") as f:
+ conf_text = f.read()
+
+ write_file(path.join(srcdir, 'conf.py'), template.render_string(conf_text, d))
+
+ masterfile = path.join(srcdir, d['master'] + d['suffix'])
+ if template._has_custom_template('quickstart/master_doc.rst_t'):
+ msg = ('A custom template `master_doc.rst_t` found. It has been renamed to '
+ '`root_doc.rst_t`. Please rename it on your project too.')
+ print(colorize('red', msg))
+ write_file(masterfile, template.render('quickstart/master_doc.rst_t', d))
+ else:
+ write_file(masterfile, template.render('quickstart/root_doc.rst_t', d))
+
+ if d.get('make_mode') is True:
+ makefile_template = 'quickstart/Makefile.new_t'
+ batchfile_template = 'quickstart/make.bat.new_t'
+ else:
+ makefile_template = 'quickstart/Makefile_t'
+ batchfile_template = 'quickstart/make.bat_t'
+
+ if d['makefile'] is True:
+ d['rsrcdir'] = 'source' if d['sep'] else '.'
+ d['rbuilddir'] = 'build' if d['sep'] else d['dot'] + 'build'
+ # use binary mode, to avoid writing \r\n on Windows
+ write_file(path.join(d['path'], 'Makefile'),
+ template.render(makefile_template, d), '\n')
+
+ if d['batchfile'] is True:
+ d['rsrcdir'] = 'source' if d['sep'] else '.'
+ d['rbuilddir'] = 'build' if d['sep'] else d['dot'] + 'build'
+ write_file(path.join(d['path'], 'make.bat'),
+ template.render(batchfile_template, d), '\r\n')
+
+ if silent:
+ return
+ print()
+ print(bold(__('Finished: An initial directory structure has been created.')))
+ print()
+ print(__('You should now populate your master file %s and create other documentation\n'
+ 'source files. ') % masterfile, end='')
+ if d['makefile'] or d['batchfile']:
+ print(__('Use the Makefile to build the docs, like so:\n'
+ ' make builder'))
+ else:
+ print(__('Use the sphinx-build command to build the docs, like so:\n'
+ ' sphinx-build -b builder %s %s') % (srcdir, builddir))
+ print(__('where "builder" is one of the supported builders, '
+ 'e.g. html, latex or linkcheck.'))
+ print()
+
+
+def valid_dir(d: dict) -> bool:
+ dir = d['path']
+ if not path.exists(dir):
+ return True
+ if not path.isdir(dir):
+ return False
+
+ if {'Makefile', 'make.bat'} & set(os.listdir(dir)):
+ return False
+
+ if d['sep']:
+ dir = os.path.join('source', dir)
+ if not path.exists(dir):
+ return True
+ if not path.isdir(dir):
+ return False
+
+ reserved_names = [
+ 'conf.py',
+ d['dot'] + 'static',
+ d['dot'] + 'templates',
+ d['master'] + d['suffix'],
+ ]
+ if set(reserved_names) & set(os.listdir(dir)):
+ return False
+
+ return True
+
+
+def get_parser() -> argparse.ArgumentParser:
+ description = __(
+ "\n"
+ "Generate required files for a Sphinx project.\n"
+ "\n"
+ "sphinx-quickstart is an interactive tool that asks some questions about your\n"
+ "project and then generates a complete documentation directory and sample\n"
+ "Makefile to be used with sphinx-build.\n",
+ )
+ parser = argparse.ArgumentParser(
+ usage='%(prog)s [OPTIONS] <PROJECT_DIR>',
+ epilog=__("For more information, visit <https://www.sphinx-doc.org/>."),
+ description=description)
+
+ parser.add_argument('-q', '--quiet', action='store_true', dest='quiet',
+ default=None,
+ help=__('quiet mode'))
+ parser.add_argument('--version', action='version', dest='show_version',
+ version='%%(prog)s %s' % __display_version__)
+
+ parser.add_argument('path', metavar='PROJECT_DIR', default='.', nargs='?',
+ help=__('project root'))
+
+ group = parser.add_argument_group(__('Structure options'))
+ group.add_argument('--sep', action='store_true', dest='sep', default=None,
+ help=__('if specified, separate source and build dirs'))
+ group.add_argument('--no-sep', action='store_false', dest='sep',
+ help=__('if specified, create build dir under source dir'))
+ group.add_argument('--dot', metavar='DOT', default='_',
+ help=__('replacement for dot in _templates etc.'))
+
+ group = parser.add_argument_group(__('Project basic options'))
+ group.add_argument('-p', '--project', metavar='PROJECT', dest='project',
+ help=__('project name'))
+ group.add_argument('-a', '--author', metavar='AUTHOR', dest='author',
+ help=__('author names'))
+ group.add_argument('-v', metavar='VERSION', dest='version', default='',
+ help=__('version of project'))
+ group.add_argument('-r', '--release', metavar='RELEASE', dest='release',
+ help=__('release of project'))
+ group.add_argument('-l', '--language', metavar='LANGUAGE', dest='language',
+ help=__('document language'))
+ group.add_argument('--suffix', metavar='SUFFIX', default='.rst',
+ help=__('source file suffix'))
+ group.add_argument('--master', metavar='MASTER', default='index',
+ help=__('master document name'))
+ group.add_argument('--epub', action='store_true', default=False,
+ help=__('use epub'))
+
+ group = parser.add_argument_group(__('Extension options'))
+ for ext in EXTENSIONS:
+ group.add_argument('--ext-%s' % ext, action='append_const',
+ const='sphinx.ext.%s' % ext, dest='extensions',
+ help=__('enable %s extension') % ext)
+ group.add_argument('--extensions', metavar='EXTENSIONS', dest='extensions',
+ action='append', help=__('enable arbitrary extensions'))
+
+ group = parser.add_argument_group(__('Makefile and Batchfile creation'))
+ group.add_argument('--makefile', action='store_true', dest='makefile', default=True,
+ help=__('create makefile'))
+ group.add_argument('--no-makefile', action='store_false', dest='makefile',
+ help=__('do not create makefile'))
+ group.add_argument('--batchfile', action='store_true', dest='batchfile', default=True,
+ help=__('create batchfile'))
+ group.add_argument('--no-batchfile', action='store_false',
+ dest='batchfile',
+ help=__('do not create batchfile'))
+ group.add_argument('-m', '--use-make-mode', action='store_true',
+ dest='make_mode', default=True,
+ help=__('use make-mode for Makefile/make.bat'))
+ group.add_argument('-M', '--no-use-make-mode', action='store_false',
+ dest='make_mode',
+ help=__('do not use make-mode for Makefile/make.bat'))
+
+ group = parser.add_argument_group(__('Project templating'))
+ group.add_argument('-t', '--templatedir', metavar='TEMPLATEDIR',
+ dest='templatedir',
+ help=__('template directory for template files'))
+ group.add_argument('-d', metavar='NAME=VALUE', action='append',
+ dest='variables',
+ help=__('define a template variable'))
+
+ return parser
+
+
+def main(argv: Sequence[str] = (), /) -> int:
+ locale.setlocale(locale.LC_ALL, '')
+ sphinx.locale.init_console()
+
+ if not color_terminal():
+ nocolor()
+
+ # parse options
+ parser = get_parser()
+ try:
+ args = parser.parse_args(argv or sys.argv[1:])
+ except SystemExit as err:
+ return err.code # type: ignore[return-value]
+
+ d = vars(args)
+ # delete None or False value
+ d = {k: v for k, v in d.items() if v is not None}
+
+ # handle use of CSV-style extension values
+ d.setdefault('extensions', [])
+ for ext in d['extensions'][:]:
+ if ',' in ext:
+ d['extensions'].remove(ext)
+ d['extensions'].extend(ext.split(','))
+
+ try:
+ if 'quiet' in d:
+ if not {'project', 'author'}.issubset(d):
+ print(__('"quiet" is specified, but any of "project" or '
+ '"author" is not specified.'))
+ return 1
+
+ if {'quiet', 'project', 'author'}.issubset(d):
+ # quiet mode with all required params satisfied, use default
+ d.setdefault('version', '')
+ d.setdefault('release', d['version'])
+ d2 = DEFAULTS.copy()
+ d2.update(d)
+ d = d2
+
+ if not valid_dir(d):
+ print()
+ print(bold(__('Error: specified path is not a directory, or sphinx'
+ ' files already exist.')))
+ print(__('sphinx-quickstart only generate into a empty directory.'
+ ' Please specify a new root path.'))
+ return 1
+ else:
+ ask_user(d)
+ except (KeyboardInterrupt, EOFError):
+ print()
+ print('[Interrupted.]')
+ return 130 # 128 + SIGINT
+
+ for variable in d.get('variables', []):
+ try:
+ name, value = variable.split('=')
+ d[name] = value
+ except ValueError:
+ print(__('Invalid template variable: %s') % variable)
+
+ generate(d, overwrite=False, templatedir=args.templatedir)
+ return 0
+
+
+if __name__ == '__main__':
+ raise SystemExit(main(sys.argv[1:]))
diff --git a/sphinx/config.py b/sphinx/config.py
new file mode 100644
index 0000000..405ca5e
--- /dev/null
+++ b/sphinx/config.py
@@ -0,0 +1,561 @@
+"""Build configuration file handling."""
+
+from __future__ import annotations
+
+import time
+import traceback
+import types
+from os import getenv, path
+from typing import TYPE_CHECKING, Any, Callable, NamedTuple
+
+from sphinx.errors import ConfigError, ExtensionError
+from sphinx.locale import _, __
+from sphinx.util import logging
+from sphinx.util.osutil import fs_encoding
+from sphinx.util.typing import NoneType
+
+try:
+ from contextlib import chdir # type: ignore[attr-defined]
+except ImportError:
+ from sphinx.util.osutil import _chdir as chdir
+
+if TYPE_CHECKING:
+ import os
+ from collections.abc import Generator, Iterator, Sequence
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.tags import Tags
+
+logger = logging.getLogger(__name__)
+
+CONFIG_FILENAME = 'conf.py'
+UNSERIALIZABLE_TYPES = (type, types.ModuleType, types.FunctionType)
+
+
+class ConfigValue(NamedTuple):
+ name: str
+ value: Any
+ rebuild: bool | str
+
+
+def is_serializable(obj: Any) -> bool:
+ """Check if object is serializable or not."""
+ if isinstance(obj, UNSERIALIZABLE_TYPES):
+ return False
+ elif isinstance(obj, dict):
+ for key, value in obj.items():
+ if not is_serializable(key) or not is_serializable(value):
+ return False
+ elif isinstance(obj, (list, tuple, set)):
+ return all(is_serializable(i) for i in obj)
+
+ return True
+
+
+class ENUM:
+ """Represents the candidates which a config value should be one of.
+
+ Example:
+ app.add_config_value('latex_show_urls', 'no', None, ENUM('no', 'footnote', 'inline'))
+ """
+ def __init__(self, *candidates: str | bool | None) -> None:
+ self.candidates = candidates
+
+ def match(self, value: str | list | tuple) -> bool:
+ if isinstance(value, (list, tuple)):
+ return all(item in self.candidates for item in value)
+ else:
+ return value in self.candidates
+
+
+class Config:
+ r"""Configuration file abstraction.
+
+ The config object makes the values of all config values available as
+ attributes.
+
+ It is exposed via the :py:class:`~sphinx.application.Sphinx`\ ``.config``
+ and :py:class:`sphinx.environment.BuildEnvironment`\ ``.config`` attributes.
+ For example, to get the value of :confval:`language`, use either
+ ``app.config.language`` or ``env.config.language``.
+ """
+
+ # the values are: (default, what needs to be rebuilt if changed)
+
+ # If you add a value here, don't forget to include it in the
+ # quickstart.py file template as well as in the docs!
+
+ config_values: dict[str, tuple] = {
+ # general options
+ 'project': ('Python', 'env', []),
+ 'author': ('unknown', 'env', []),
+ 'project_copyright': ('', 'html', [str, tuple, list]),
+ 'copyright': (lambda c: c.project_copyright, 'html', [str, tuple, list]),
+ 'version': ('', 'env', []),
+ 'release': ('', 'env', []),
+ 'today': ('', 'env', []),
+ # the real default is locale-dependent
+ 'today_fmt': (None, 'env', [str]),
+
+ 'language': ('en', 'env', [str]),
+ 'locale_dirs': (['locales'], 'env', []),
+ 'figure_language_filename': ('{root}.{language}{ext}', 'env', [str]),
+ 'gettext_allow_fuzzy_translations': (False, 'gettext', []),
+ 'translation_progress_classes': (False, 'env',
+ ENUM(True, False, 'translated', 'untranslated')),
+
+ 'master_doc': ('index', 'env', []),
+ 'root_doc': (lambda config: config.master_doc, 'env', []),
+ 'source_suffix': ({'.rst': 'restructuredtext'}, 'env', Any),
+ 'source_encoding': ('utf-8-sig', 'env', []),
+ 'exclude_patterns': ([], 'env', [str]),
+ 'include_patterns': (["**"], 'env', [str]),
+ 'default_role': (None, 'env', [str]),
+ 'add_function_parentheses': (True, 'env', []),
+ 'add_module_names': (True, 'env', []),
+ 'toc_object_entries': (True, 'env', [bool]),
+ 'toc_object_entries_show_parents': ('domain', 'env',
+ ENUM('domain', 'all', 'hide')),
+ 'trim_footnote_reference_space': (False, 'env', []),
+ 'show_authors': (False, 'env', []),
+ 'pygments_style': (None, 'html', [str]),
+ 'highlight_language': ('default', 'env', []),
+ 'highlight_options': ({}, 'env', []),
+ 'templates_path': ([], 'html', []),
+ 'template_bridge': (None, 'html', [str]),
+ 'keep_warnings': (False, 'env', []),
+ 'suppress_warnings': ([], 'env', []),
+ 'modindex_common_prefix': ([], 'html', []),
+ 'rst_epilog': (None, 'env', [str]),
+ 'rst_prolog': (None, 'env', [str]),
+ 'trim_doctest_flags': (True, 'env', []),
+ 'primary_domain': ('py', 'env', [NoneType]),
+ 'needs_sphinx': (None, None, [str]),
+ 'needs_extensions': ({}, None, []),
+ 'manpages_url': (None, 'env', []),
+ 'nitpicky': (False, None, []),
+ 'nitpick_ignore': ([], None, [set, list, tuple]),
+ 'nitpick_ignore_regex': ([], None, [set, list, tuple]),
+ 'numfig': (False, 'env', []),
+ 'numfig_secnum_depth': (1, 'env', []),
+ 'numfig_format': ({}, 'env', []), # will be initialized in init_numfig_format()
+ 'maximum_signature_line_length': (None, 'env', {int, None}),
+ 'math_number_all': (False, 'env', []),
+ 'math_eqref_format': (None, 'env', [str]),
+ 'math_numfig': (True, 'env', []),
+ 'tls_verify': (True, 'env', []),
+ 'tls_cacerts': (None, 'env', []),
+ 'user_agent': (None, 'env', [str]),
+ 'smartquotes': (True, 'env', []),
+ 'smartquotes_action': ('qDe', 'env', []),
+ 'smartquotes_excludes': ({'languages': ['ja'],
+ 'builders': ['man', 'text']},
+ 'env', []),
+ 'option_emphasise_placeholders': (False, 'env', []),
+ }
+
+ def __init__(self, config: dict[str, Any] | None = None,
+ overrides: dict[str, Any] | None = None) -> None:
+ config = config or {}
+ self.overrides = dict(overrides) if overrides is not None else {}
+ self.values = Config.config_values.copy()
+ self._raw_config = config
+ self.setup: Callable | None = config.get('setup', None)
+
+ if 'extensions' in self.overrides:
+ if isinstance(self.overrides['extensions'], str):
+ config['extensions'] = self.overrides.pop('extensions').split(',')
+ else:
+ config['extensions'] = self.overrides.pop('extensions')
+ self.extensions: list[str] = config.get('extensions', [])
+
+ @classmethod
+ def read(cls, confdir: str | os.PathLike[str], overrides: dict | None = None,
+ tags: Tags | None = None) -> Config:
+ """Create a Config object from configuration file."""
+ filename = path.join(confdir, CONFIG_FILENAME)
+ if not path.isfile(filename):
+ raise ConfigError(__("config directory doesn't contain a conf.py file (%s)") %
+ confdir)
+ namespace = eval_config_file(filename, tags)
+
+ # Note: Old sphinx projects have been configured as "language = None" because
+ # sphinx-quickstart previously generated this by default.
+ # To keep compatibility, they should be fallback to 'en' for a while
+ # (This conversion should not be removed before 2025-01-01).
+ if namespace.get("language", ...) is None:
+ logger.warning(__("Invalid configuration value found: 'language = None'. "
+ "Update your configuration to a valid language code. "
+ "Falling back to 'en' (English)."))
+ namespace["language"] = "en"
+
+ return cls(namespace, overrides or {})
+
+ def convert_overrides(self, name: str, value: Any) -> Any:
+ if not isinstance(value, str):
+ return value
+ else:
+ defvalue = self.values[name][0]
+ if self.values[name][2] == Any:
+ return value
+ elif self.values[name][2] == {bool, str}:
+ if value == '0':
+ # given falsy string from command line option
+ return False
+ elif value == '1':
+ return True
+ else:
+ return value
+ elif type(defvalue) is bool or self.values[name][2] == [bool]:
+ if value == '0':
+ # given falsy string from command line option
+ return False
+ else:
+ return bool(value)
+ elif isinstance(defvalue, dict):
+ raise ValueError(__('cannot override dictionary config setting %r, '
+ 'ignoring (use %r to set individual elements)') %
+ (name, name + '.key=value'))
+ elif isinstance(defvalue, list):
+ return value.split(',')
+ elif isinstance(defvalue, int):
+ try:
+ return int(value)
+ except ValueError as exc:
+ raise ValueError(__('invalid number %r for config value %r, ignoring') %
+ (value, name)) from exc
+ elif callable(defvalue):
+ return value
+ elif defvalue is not None and not isinstance(defvalue, str):
+ raise ValueError(__('cannot override config setting %r with unsupported '
+ 'type, ignoring') % name)
+ else:
+ return value
+
+ def pre_init_values(self) -> None:
+ """
+ Initialize some limited config variables before initializing i18n and loading
+ extensions.
+ """
+ variables = ['needs_sphinx', 'suppress_warnings', 'language', 'locale_dirs']
+ for name in variables:
+ try:
+ if name in self.overrides:
+ self.__dict__[name] = self.convert_overrides(name, self.overrides[name])
+ elif name in self._raw_config:
+ self.__dict__[name] = self._raw_config[name]
+ except ValueError as exc:
+ logger.warning("%s", exc)
+
+ def init_values(self) -> None:
+ config = self._raw_config
+ for valname, value in self.overrides.items():
+ try:
+ if '.' in valname:
+ realvalname, key = valname.split('.', 1)
+ config.setdefault(realvalname, {})[key] = value
+ continue
+ if valname not in self.values:
+ logger.warning(__('unknown config value %r in override, ignoring'),
+ valname)
+ continue
+ if isinstance(value, str):
+ config[valname] = self.convert_overrides(valname, value)
+ else:
+ config[valname] = value
+ except ValueError as exc:
+ logger.warning("%s", exc)
+ for name in config:
+ if name in self.values:
+ self.__dict__[name] = config[name]
+
+ def post_init_values(self) -> None:
+ """
+ Initialize additional config variables that are added after init_values() called.
+ """
+ config = self._raw_config
+ for name in config:
+ if name not in self.__dict__ and name in self.values:
+ self.__dict__[name] = config[name]
+
+ check_confval_types(None, self)
+
+ def __getattr__(self, name: str) -> Any:
+ if name.startswith('_'):
+ raise AttributeError(name)
+ if name not in self.values:
+ raise AttributeError(__('No such config value: %s') % name)
+ default = self.values[name][0]
+ if callable(default):
+ return default(self)
+ return default
+
+ def __getitem__(self, name: str) -> Any:
+ return getattr(self, name)
+
+ def __setitem__(self, name: str, value: Any) -> None:
+ setattr(self, name, value)
+
+ def __delitem__(self, name: str) -> None:
+ delattr(self, name)
+
+ def __contains__(self, name: str) -> bool:
+ return name in self.values
+
+ def __iter__(self) -> Generator[ConfigValue, None, None]:
+ for name, value in self.values.items():
+ yield ConfigValue(name, getattr(self, name), value[1])
+
+ def add(self, name: str, default: Any, rebuild: bool | str, types: Any) -> None:
+ if name in self.values:
+ raise ExtensionError(__('Config value %r already present') % name)
+ self.values[name] = (default, rebuild, types)
+
+ def filter(self, rebuild: str | Sequence[str]) -> Iterator[ConfigValue]:
+ if isinstance(rebuild, str):
+ rebuild = [rebuild]
+ return (value for value in self if value.rebuild in rebuild)
+
+ def __getstate__(self) -> dict:
+ """Obtains serializable data for pickling."""
+ # remove potentially pickling-problematic values from config
+ __dict__ = {}
+ for key, value in self.__dict__.items():
+ if key.startswith('_') or not is_serializable(value):
+ pass
+ else:
+ __dict__[key] = value
+
+ # create a picklable copy of values list
+ __dict__['values'] = {}
+ for key, value in self.values.items():
+ real_value = getattr(self, key)
+ if not is_serializable(real_value):
+ # omit unserializable value
+ real_value = None
+
+ # types column is also omitted
+ __dict__['values'][key] = (real_value, value[1], None)
+
+ return __dict__
+
+ def __setstate__(self, state: dict) -> None:
+ self.__dict__.update(state)
+
+
+def eval_config_file(filename: str, tags: Tags | None) -> dict[str, Any]:
+ """Evaluate a config file."""
+ namespace: dict[str, Any] = {}
+ namespace['__file__'] = filename
+ namespace['tags'] = tags
+
+ with chdir(path.dirname(filename)):
+ # during executing config file, current dir is changed to ``confdir``.
+ try:
+ with open(filename, 'rb') as f:
+ code = compile(f.read(), filename.encode(fs_encoding), 'exec')
+ exec(code, namespace) # NoQA: S102
+ except SyntaxError as err:
+ msg = __("There is a syntax error in your configuration file: %s\n")
+ raise ConfigError(msg % err) from err
+ except SystemExit as exc:
+ msg = __("The configuration file (or one of the modules it imports) "
+ "called sys.exit()")
+ raise ConfigError(msg) from exc
+ except ConfigError:
+ # pass through ConfigError from conf.py as is. It will be shown in console.
+ raise
+ except Exception as exc:
+ msg = __("There is a programmable error in your configuration file:\n\n%s")
+ raise ConfigError(msg % traceback.format_exc()) from exc
+
+ return namespace
+
+
+def convert_source_suffix(app: Sphinx, config: Config) -> None:
+ """Convert old styled source_suffix to new styled one.
+
+ * old style: str or list
+ * new style: a dict which maps from fileext to filetype
+ """
+ source_suffix = config.source_suffix
+ if isinstance(source_suffix, str):
+ # if str, considers as default filetype (None)
+ #
+ # The default filetype is determined on later step.
+ # By default, it is considered as restructuredtext.
+ config.source_suffix = {source_suffix: None} # type: ignore[attr-defined]
+ elif isinstance(source_suffix, (list, tuple)):
+ # if list, considers as all of them are default filetype
+ config.source_suffix = {s: None for s in source_suffix} # type: ignore[attr-defined]
+ elif not isinstance(source_suffix, dict):
+ logger.warning(__("The config value `source_suffix' expects "
+ "a string, list of strings, or dictionary. "
+ "But `%r' is given." % source_suffix))
+
+
+def convert_highlight_options(app: Sphinx, config: Config) -> None:
+ """Convert old styled highlight_options to new styled one.
+
+ * old style: options
+ * new style: a dict which maps from language name to options
+ """
+ options = config.highlight_options
+ if options and not all(isinstance(v, dict) for v in options.values()):
+ # old styled option detected because all values are not dictionary.
+ config.highlight_options = {config.highlight_language: # type: ignore[attr-defined]
+ options}
+
+
+def init_numfig_format(app: Sphinx, config: Config) -> None:
+ """Initialize :confval:`numfig_format`."""
+ numfig_format = {'section': _('Section %s'),
+ 'figure': _('Fig. %s'),
+ 'table': _('Table %s'),
+ 'code-block': _('Listing %s')}
+
+ # override default labels by configuration
+ numfig_format.update(config.numfig_format)
+ config.numfig_format = numfig_format # type: ignore[attr-defined]
+
+
+def correct_copyright_year(_app: Sphinx, config: Config) -> None:
+ """Correct values of copyright year that are not coherent with
+ the SOURCE_DATE_EPOCH environment variable (if set)
+
+ See https://reproducible-builds.org/specs/source-date-epoch/
+ """
+ if (source_date_epoch := getenv('SOURCE_DATE_EPOCH')) is None:
+ return
+
+ source_date_epoch_year = str(time.gmtime(int(source_date_epoch)).tm_year)
+
+ for k in ('copyright', 'epub_copyright'):
+ if k in config:
+ value: str | Sequence[str] = config[k]
+ if isinstance(value, str):
+ config[k] = _substitute_copyright_year(value, source_date_epoch_year)
+ else:
+ items = (_substitute_copyright_year(x, source_date_epoch_year) for x in value)
+ config[k] = type(value)(items) # type: ignore[call-arg]
+
+
+def _substitute_copyright_year(copyright_line: str, replace_year: str) -> str:
+ """Replace the year in a single copyright line.
+
+ Legal formats are:
+
+ * ``YYYY``
+ * ``YYYY,``
+ * ``YYYY ``
+ * ``YYYY-YYYY,``
+ * ``YYYY-YYYY ``
+
+ The final year in the string is replaced with ``replace_year``.
+ """
+ if len(copyright_line) < 4 or not copyright_line[:4].isdigit():
+ return copyright_line
+
+ if copyright_line[4:5] in {'', ' ', ','}:
+ return replace_year + copyright_line[4:]
+
+ if copyright_line[4] != '-':
+ return copyright_line
+
+ if copyright_line[5:9].isdigit() and copyright_line[9] in ' ,':
+ return copyright_line[:5] + replace_year + copyright_line[9:]
+
+ return copyright_line
+
+
+def check_confval_types(app: Sphinx | None, config: Config) -> None:
+ """Check all values for deviation from the default value's type, since
+ that can result in TypeErrors all over the place NB.
+ """
+ for confval in config:
+ default, rebuild, annotations = config.values[confval.name]
+
+ if callable(default):
+ default = default(config) # evaluate default value
+ if default is None and not annotations:
+ continue # neither inferable nor expliclitly annotated types
+
+ if annotations is Any:
+ # any type of value is accepted
+ pass
+ elif isinstance(annotations, ENUM):
+ if not annotations.match(confval.value):
+ msg = __("The config value `{name}` has to be a one of {candidates}, "
+ "but `{current}` is given.")
+ logger.warning(msg.format(name=confval.name,
+ current=confval.value,
+ candidates=annotations.candidates), once=True)
+ else:
+ if type(confval.value) is type(default):
+ continue
+ if type(confval.value) in annotations:
+ continue
+
+ common_bases = (set(type(confval.value).__bases__ + (type(confval.value),)) &
+ set(type(default).__bases__))
+ common_bases.discard(object)
+ if common_bases:
+ continue # at least we share a non-trivial base class
+
+ if annotations:
+ msg = __("The config value `{name}' has type `{current.__name__}'; "
+ "expected {permitted}.")
+ wrapped_annotations = [f"`{c.__name__}'" for c in annotations]
+ if len(wrapped_annotations) > 2:
+ permitted = (", ".join(wrapped_annotations[:-1])
+ + f", or {wrapped_annotations[-1]}")
+ else:
+ permitted = " or ".join(wrapped_annotations)
+ logger.warning(msg.format(name=confval.name,
+ current=type(confval.value),
+ permitted=permitted), once=True)
+ else:
+ msg = __("The config value `{name}' has type `{current.__name__}', "
+ "defaults to `{default.__name__}'.")
+ logger.warning(msg.format(name=confval.name,
+ current=type(confval.value),
+ default=type(default)), once=True)
+
+
+def check_primary_domain(app: Sphinx, config: Config) -> None:
+ primary_domain = config.primary_domain
+ if primary_domain and not app.registry.has_domain(primary_domain):
+ logger.warning(__('primary_domain %r not found, ignored.'), primary_domain)
+ config.primary_domain = None # type: ignore[attr-defined]
+
+
+def check_root_doc(app: Sphinx, env: BuildEnvironment, added: set[str],
+ changed: set[str], removed: set[str]) -> set[str]:
+ """Adjust root_doc to 'contents' to support an old project which does not have
+ any root_doc setting.
+ """
+ if (app.config.root_doc == 'index' and
+ 'index' not in app.project.docnames and
+ 'contents' in app.project.docnames):
+ logger.warning(__('Since v2.0, Sphinx uses "index" as root_doc by default. '
+ 'Please add "root_doc = \'contents\'" to your conf.py.'))
+ app.config.root_doc = "contents" # type: ignore[attr-defined]
+
+ return changed
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.connect('config-inited', convert_source_suffix, priority=800)
+ app.connect('config-inited', convert_highlight_options, priority=800)
+ app.connect('config-inited', init_numfig_format, priority=800)
+ app.connect('config-inited', correct_copyright_year, priority=800)
+ app.connect('config-inited', check_confval_types, priority=800)
+ app.connect('config-inited', check_primary_domain, priority=800)
+ app.connect('env-get-outdated', check_root_doc)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/deprecation.py b/sphinx/deprecation.py
new file mode 100644
index 0000000..8a242d7
--- /dev/null
+++ b/sphinx/deprecation.py
@@ -0,0 +1,66 @@
+"""Sphinx deprecation classes and utilities."""
+
+from __future__ import annotations
+
+import warnings
+
+
+class RemovedInSphinx80Warning(DeprecationWarning):
+ pass
+
+
+class RemovedInSphinx90Warning(PendingDeprecationWarning):
+ pass
+
+
+RemovedInNextVersionWarning = RemovedInSphinx80Warning
+
+
+def _deprecation_warning(
+ module: str,
+ attribute: str,
+ canonical_name: str,
+ *,
+ remove: tuple[int, int],
+) -> None:
+ """Helper function for module-level deprecations using __getattr__
+
+ Exemplar usage:
+
+ .. code:: python
+
+ # deprecated name -> (object to return, canonical path or empty string)
+ _DEPRECATED_OBJECTS = {
+ 'deprecated_name': (object_to_return, 'fully_qualified_replacement_name', (8, 0)),
+ }
+
+
+ def __getattr__(name):
+ if name not in _DEPRECATED_OBJECTS:
+ msg = f'module {__name__!r} has no attribute {name!r}'
+ raise AttributeError(msg)
+
+ from sphinx.deprecation import _deprecation_warning
+
+ deprecated_object, canonical_name, remove = _DEPRECATED_OBJECTS[name]
+ _deprecation_warning(__name__, name, canonical_name, remove=remove)
+ return deprecated_object
+ """
+
+ if remove == (8, 0):
+ warning_class: type[Warning] = RemovedInSphinx80Warning
+ elif remove == (9, 0):
+ warning_class = RemovedInSphinx90Warning
+ else:
+ msg = f'removal version {remove!r} is invalid!'
+ raise RuntimeError(msg)
+
+ qualified_name = f'{module}.{attribute}'
+ if canonical_name:
+ message = (f'The alias {qualified_name!r} is deprecated, '
+ f'use {canonical_name!r} instead.')
+ else:
+ message = f'{qualified_name!r} is deprecated.'
+
+ warnings.warn(message + " Check CHANGES for Sphinx API modifications.",
+ warning_class, stacklevel=3)
diff --git a/sphinx/directives/__init__.py b/sphinx/directives/__init__.py
new file mode 100644
index 0000000..d4cf28e
--- /dev/null
+++ b/sphinx/directives/__init__.py
@@ -0,0 +1,373 @@
+"""Handlers for additional ReST directives."""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any, Generic, TypeVar, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives, roles
+
+from sphinx import addnodes
+from sphinx.addnodes import desc_signature # NoQA: TCH001
+from sphinx.util import docutils
+from sphinx.util.docfields import DocFieldTransformer, Field, TypedField
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import nested_parse_with_titles
+from sphinx.util.typing import OptionSpec # NoQA: TCH001
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+
+# RE to strip backslash escapes
+nl_escape_re = re.compile(r'\\\n')
+strip_backslash_re = re.compile(r'\\(.)')
+
+
+def optional_int(argument: str) -> int | None:
+ """
+ Check for an integer argument or None value; raise ``ValueError`` if not.
+ """
+ if argument is None:
+ return None
+ else:
+ value = int(argument)
+ if value < 0:
+ msg = 'negative value; must be positive or zero'
+ raise ValueError(msg)
+ return value
+
+
+ObjDescT = TypeVar('ObjDescT')
+
+
+class ObjectDescription(SphinxDirective, Generic[ObjDescT]):
+ """
+ Directive to describe a class, function or similar object. Not used
+ directly, but subclassed (in domain-specific directives) to add custom
+ behavior.
+ """
+
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {
+ 'no-index': directives.flag,
+ 'no-index-entry': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindex': directives.flag,
+ 'noindexentry': directives.flag,
+ 'nocontentsentry': directives.flag,
+ }
+
+ # types of doc fields that this directive handles, see sphinx.util.docfields
+ doc_field_types: list[Field] = []
+ domain: str | None = None
+ objtype: str # set when `run` method is called
+ indexnode: addnodes.index
+
+ # Warning: this might be removed in future version. Don't touch this from extensions.
+ _doc_field_type_map: dict[str, tuple[Field, bool]] = {}
+
+ def get_field_type_map(self) -> dict[str, tuple[Field, bool]]:
+ if self._doc_field_type_map == {}:
+ self._doc_field_type_map = {}
+ for field in self.doc_field_types:
+ for name in field.names:
+ self._doc_field_type_map[name] = (field, False)
+
+ if field.is_typed:
+ typed_field = cast(TypedField, field)
+ for name in typed_field.typenames:
+ self._doc_field_type_map[name] = (field, True)
+
+ return self._doc_field_type_map
+
+ def get_signatures(self) -> list[str]:
+ """
+ Retrieve the signatures to document from the directive arguments. By
+ default, signatures are given as arguments, one per line.
+ """
+ lines = nl_escape_re.sub('', self.arguments[0]).split('\n')
+ if self.config.strip_signature_backslash:
+ # remove backslashes to support (dummy) escapes; helps Vim highlighting
+ return [strip_backslash_re.sub(r'\1', line.strip()) for line in lines]
+ else:
+ return [line.strip() for line in lines]
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> ObjDescT:
+ """
+ Parse the signature *sig* into individual nodes and append them to
+ *signode*. If ValueError is raised, parsing is aborted and the whole
+ *sig* is put into a single desc_name node.
+
+ The return value should be a value that identifies the object. It is
+ passed to :meth:`add_target_and_index()` unchanged, and otherwise only
+ used to skip duplicates.
+ """
+ raise ValueError
+
+ def add_target_and_index(self, name: ObjDescT, sig: str, signode: desc_signature) -> None:
+ """
+ Add cross-reference IDs and entries to self.indexnode, if applicable.
+
+ *name* is whatever :meth:`handle_signature()` returned.
+ """
+ return # do nothing by default
+
+ def before_content(self) -> None:
+ """
+ Called before parsing content. Used to set information about the current
+ directive context on the build environment.
+ """
+ pass
+
+ def transform_content(self, contentnode: addnodes.desc_content) -> None:
+ """
+ Called after creating the content through nested parsing,
+ but before the ``object-description-transform`` event is emitted,
+ and before the info-fields are transformed.
+ Can be used to manipulate the content.
+ """
+ pass
+
+ def after_content(self) -> None:
+ """
+ Called after parsing content. Used to reset information about the
+ current directive context on the build environment.
+ """
+ pass
+
+ def _object_hierarchy_parts(self, sig_node: desc_signature) -> tuple[str, ...]:
+ """
+ Returns a tuple of strings, one entry for each part of the object's
+ hierarchy (e.g. ``('module', 'submodule', 'Class', 'method')``). The
+ returned tuple is used to properly nest children within parents in the
+ table of contents, and can also be used within the
+ :py:meth:`_toc_entry_name` method.
+
+ This method must not be used outwith table of contents generation.
+ """
+ return ()
+
+ def _toc_entry_name(self, sig_node: desc_signature) -> str:
+ """
+ Returns the text of the table of contents entry for the object.
+
+ This function is called once, in :py:meth:`run`, to set the name for the
+ table of contents entry (a special attribute ``_toc_name`` is set on the
+ object node, later used in
+ ``environment.collectors.toctree.TocTreeCollector.process_doc().build_toc()``
+ when the table of contents entries are collected).
+
+ To support table of contents entries for their objects, domains must
+ override this method, also respecting the configuration setting
+ ``toc_object_entries_show_parents``. Domains must also override
+ :py:meth:`_object_hierarchy_parts`, with one (string) entry for each part of the
+ object's hierarchy. The result of this method is set on the signature
+ node, and can be accessed as ``sig_node['_toc_parts']`` for use within
+ this method. The resulting tuple is also used to properly nest children
+ within parents in the table of contents.
+
+ An example implementations of this method is within the python domain
+ (:meth:`!PyObject._toc_entry_name`). The python domain sets the
+ ``_toc_parts`` attribute within the :py:meth:`handle_signature()`
+ method.
+ """
+ return ''
+
+ def run(self) -> list[Node]:
+ """
+ Main directive entry function, called by docutils upon encountering the
+ directive.
+
+ This directive is meant to be quite easily subclassable, so it delegates
+ to several additional methods. What it does:
+
+ * find out if called as a domain-specific directive, set self.domain
+ * create a `desc` node to fit all description inside
+ * parse standard options, currently `no-index`
+ * create an index node if needed as self.indexnode
+ * parse all given signatures (as returned by self.get_signatures())
+ using self.handle_signature(), which should either return a name
+ or raise ValueError
+ * add index entries using self.add_target_and_index()
+ * parse the content and handle doc fields in it
+ """
+ if ':' in self.name:
+ self.domain, self.objtype = self.name.split(':', 1)
+ else:
+ self.domain, self.objtype = '', self.name
+ self.indexnode = addnodes.index(entries=[])
+
+ node = addnodes.desc()
+ node.document = self.state.document
+ source, line = self.get_source_info()
+ # If any options were specified to the directive,
+ # self.state.document.current_line will at this point be set to
+ # None. To ensure nodes created as part of the signature have a line
+ # number set, set the document's line number correctly.
+ #
+ # Note that we need to subtract one from the line number since
+ # note_source uses 0-based line numbers.
+ if line is not None:
+ line -= 1
+ self.state.document.note_source(source, line)
+ node['domain'] = self.domain
+ # 'desctype' is a backwards compatible attribute
+ node['objtype'] = node['desctype'] = self.objtype
+ node['no-index'] = node['noindex'] = no_index = (
+ 'no-index' in self.options
+ # xref RemovedInSphinx90Warning
+ # deprecate noindex in Sphinx 9.0
+ or 'noindex' in self.options)
+ node['no-index-entry'] = node['noindexentry'] = (
+ 'no-index-entry' in self.options
+ # xref RemovedInSphinx90Warning
+ # deprecate noindexentry in Sphinx 9.0
+ or 'noindexentry' in self.options)
+ node['no-contents-entry'] = node['nocontentsentry'] = (
+ 'no-contents-entry' in self.options
+ # xref RemovedInSphinx90Warning
+ # deprecate nocontentsentry in Sphinx 9.0
+ or 'nocontentsentry' in self.options)
+ node['no-typesetting'] = ('no-typesetting' in self.options)
+ if self.domain:
+ node['classes'].append(self.domain)
+ node['classes'].append(node['objtype'])
+
+ self.names: list[ObjDescT] = []
+ signatures = self.get_signatures()
+ for sig in signatures:
+ # add a signature node for each signature in the current unit
+ # and add a reference target for it
+ signode = addnodes.desc_signature(sig, '')
+ self.set_source_info(signode)
+ node.append(signode)
+ try:
+ # name can also be a tuple, e.g. (classname, objname);
+ # this is strictly domain-specific (i.e. no assumptions may
+ # be made in this base class)
+ name = self.handle_signature(sig, signode)
+ except ValueError:
+ # signature parsing failed
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+ continue # we don't want an index entry here
+ finally:
+ # Private attributes for ToC generation. Will be modified or removed
+ # without notice.
+ if self.env.app.config.toc_object_entries:
+ signode['_toc_parts'] = self._object_hierarchy_parts(signode)
+ signode['_toc_name'] = self._toc_entry_name(signode)
+ else:
+ signode['_toc_parts'] = ()
+ signode['_toc_name'] = ''
+ if name not in self.names:
+ self.names.append(name)
+ if not no_index:
+ # only add target and index entry if this is the first
+ # description of the object with this name in this desc block
+ self.add_target_and_index(name, sig, signode)
+
+ contentnode = addnodes.desc_content()
+ node.append(contentnode)
+
+ if self.names:
+ # needed for association of version{added,changed} directives
+ self.env.temp_data['object'] = self.names[0]
+ self.before_content()
+ nested_parse_with_titles(self.state, self.content, contentnode, self.content_offset)
+ self.transform_content(contentnode)
+ self.env.app.emit('object-description-transform',
+ self.domain, self.objtype, contentnode)
+ DocFieldTransformer(self).transform_all(contentnode)
+ self.env.temp_data['object'] = None
+ self.after_content()
+
+ if node['no-typesetting']:
+ # Attempt to return the index node, and a new target node
+ # containing all the ids of this node and its children.
+ # If ``:no-index:`` is set, or there are no ids on the node
+ # or any of its children, then just return the index node,
+ # as Docutils expects a target node to have at least one id.
+ if node_ids := [node_id for el in node.findall(nodes.Element)
+ for node_id in el.get('ids', ())]:
+ target_node = nodes.target(ids=node_ids)
+ self.set_source_info(target_node)
+ return [self.indexnode, target_node]
+ return [self.indexnode]
+ return [self.indexnode, node]
+
+
+class DefaultRole(SphinxDirective):
+ """
+ Set the default interpreted text role. Overridden from docutils.
+ """
+
+ optional_arguments = 1
+ final_argument_whitespace = False
+
+ def run(self) -> list[Node]:
+ if not self.arguments:
+ docutils.unregister_role('')
+ return []
+ role_name = self.arguments[0]
+ role, messages = roles.role(role_name, self.state_machine.language,
+ self.lineno, self.state.reporter)
+ if role: # type: ignore[truthy-function]
+ docutils.register_role('', role) # type: ignore[arg-type]
+ self.env.temp_data['default_role'] = role_name
+ else:
+ literal_block = nodes.literal_block(self.block_text, self.block_text)
+ reporter = self.state.reporter
+ error = reporter.error('Unknown interpreted text role "%s".' % role_name,
+ literal_block, line=self.lineno)
+ messages += [error]
+
+ return cast(list[nodes.Node], messages)
+
+
+class DefaultDomain(SphinxDirective):
+ """
+ Directive to (re-)set the default domain for this source file.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ domain_name = self.arguments[0].lower()
+ # if domain_name not in env.domains:
+ # # try searching by label
+ # for domain in env.domains.values():
+ # if domain.label.lower() == domain_name:
+ # domain_name = domain.name
+ # break
+ self.env.temp_data['default_domain'] = self.env.domains.get(domain_name)
+ return []
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_config_value("strip_signature_backslash", False, 'env')
+ directives.register_directive('default-role', DefaultRole)
+ directives.register_directive('default-domain', DefaultDomain)
+ directives.register_directive('describe', ObjectDescription)
+ # new, more consistent, name
+ directives.register_directive('object', ObjectDescription)
+
+ app.add_event('object-description-transform')
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py
new file mode 100644
index 0000000..8de1661
--- /dev/null
+++ b/sphinx/directives/code.py
@@ -0,0 +1,482 @@
+from __future__ import annotations
+
+import sys
+import textwrap
+from difflib import unified_diff
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.statemachine import StringList
+
+from sphinx import addnodes
+from sphinx.directives import optional_int
+from sphinx.locale import __
+from sphinx.util import logging, parselinenos
+from sphinx.util.docutils import SphinxDirective
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+ from sphinx.util.typing import OptionSpec
+
+logger = logging.getLogger(__name__)
+
+
+class Highlight(SphinxDirective):
+ """
+ Directive to set the highlighting language for code blocks, as well
+ as the threshold for line numbers.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'force': directives.flag,
+ 'linenothreshold': directives.positive_int,
+ }
+
+ def run(self) -> list[Node]:
+ language = self.arguments[0].strip()
+ linenothreshold = self.options.get('linenothreshold', sys.maxsize)
+ force = 'force' in self.options
+
+ self.env.temp_data['highlight_language'] = language
+ return [addnodes.highlightlang(lang=language,
+ force=force,
+ linenothreshold=linenothreshold)]
+
+
+def dedent_lines(
+ lines: list[str], dedent: int | None, location: tuple[str, int] | None = None,
+) -> list[str]:
+ if dedent is None:
+ return textwrap.dedent(''.join(lines)).splitlines(True)
+
+ if any(s[:dedent].strip() for s in lines):
+ logger.warning(__('non-whitespace stripped by dedent'), location=location)
+
+ new_lines = []
+ for line in lines:
+ new_line = line[dedent:]
+ if line.endswith('\n') and not new_line:
+ new_line = '\n' # keep CRLF
+ new_lines.append(new_line)
+
+ return new_lines
+
+
+def container_wrapper(
+ directive: SphinxDirective, literal_node: Node, caption: str,
+) -> nodes.container:
+ container_node = nodes.container('', literal_block=True,
+ classes=['literal-block-wrapper'])
+ parsed = nodes.Element()
+ directive.state.nested_parse(StringList([caption], source=''),
+ directive.content_offset, parsed)
+ if isinstance(parsed[0], nodes.system_message):
+ msg = __('Invalid caption: %s' % parsed[0].astext())
+ raise ValueError(msg)
+ if isinstance(parsed[0], nodes.Element):
+ caption_node = nodes.caption(parsed[0].rawsource, '',
+ *parsed[0].children)
+ caption_node.source = literal_node.source
+ caption_node.line = literal_node.line
+ container_node += caption_node
+ container_node += literal_node
+ return container_node
+ raise RuntimeError # never reached
+
+
+class CodeBlock(SphinxDirective):
+ """
+ Directive for a code block with special highlighting or line numbering
+ settings.
+ """
+
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 1
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'force': directives.flag,
+ 'linenos': directives.flag,
+ 'dedent': optional_int,
+ 'lineno-start': int,
+ 'emphasize-lines': directives.unchanged_required,
+ 'caption': directives.unchanged_required,
+ 'class': directives.class_option,
+ 'name': directives.unchanged,
+ }
+
+ def run(self) -> list[Node]:
+ document = self.state.document
+ code = '\n'.join(self.content)
+ location = self.state_machine.get_source_and_line(self.lineno)
+
+ linespec = self.options.get('emphasize-lines')
+ if linespec:
+ try:
+ nlines = len(self.content)
+ hl_lines = parselinenos(linespec, nlines)
+ if any(i >= nlines for i in hl_lines):
+ logger.warning(__('line number spec is out of range(1-%d): %r') %
+ (nlines, self.options['emphasize-lines']),
+ location=location)
+
+ hl_lines = [x + 1 for x in hl_lines if x < nlines]
+ except ValueError as err:
+ return [document.reporter.warning(err, line=self.lineno)]
+ else:
+ hl_lines = None
+
+ if 'dedent' in self.options:
+ location = self.state_machine.get_source_and_line(self.lineno)
+ lines = code.splitlines(True)
+ lines = dedent_lines(lines, self.options['dedent'], location=location)
+ code = ''.join(lines)
+
+ literal: Element = nodes.literal_block(code, code)
+ if 'linenos' in self.options or 'lineno-start' in self.options:
+ literal['linenos'] = True
+ literal['classes'] += self.options.get('class', [])
+ literal['force'] = 'force' in self.options
+ if self.arguments:
+ # highlight language specified
+ literal['language'] = self.arguments[0]
+ else:
+ # no highlight language specified. Then this directive refers the current
+ # highlight setting via ``highlight`` directive or ``highlight_language``
+ # configuration.
+ literal['language'] = self.env.temp_data.get('highlight_language',
+ self.config.highlight_language)
+ extra_args = literal['highlight_args'] = {}
+ if hl_lines is not None:
+ extra_args['hl_lines'] = hl_lines
+ if 'lineno-start' in self.options:
+ extra_args['linenostart'] = self.options['lineno-start']
+ self.set_source_info(literal)
+
+ caption = self.options.get('caption')
+ if caption:
+ try:
+ literal = container_wrapper(self, literal, caption)
+ except ValueError as exc:
+ return [document.reporter.warning(exc, line=self.lineno)]
+
+ # literal will be note_implicit_target that is linked from caption and numref.
+ # when options['name'] is provided, it should be primary ID.
+ self.add_name(literal)
+
+ return [literal]
+
+
+class LiteralIncludeReader:
+ INVALID_OPTIONS_PAIR = [
+ ('lineno-match', 'lineno-start'),
+ ('lineno-match', 'append'),
+ ('lineno-match', 'prepend'),
+ ('start-after', 'start-at'),
+ ('end-before', 'end-at'),
+ ('diff', 'pyobject'),
+ ('diff', 'lineno-start'),
+ ('diff', 'lineno-match'),
+ ('diff', 'lines'),
+ ('diff', 'start-after'),
+ ('diff', 'end-before'),
+ ('diff', 'start-at'),
+ ('diff', 'end-at'),
+ ]
+
+ def __init__(self, filename: str, options: dict[str, Any], config: Config) -> None:
+ self.filename = filename
+ self.options = options
+ self.encoding = options.get('encoding', config.source_encoding)
+ self.lineno_start = self.options.get('lineno-start', 1)
+
+ self.parse_options()
+
+ def parse_options(self) -> None:
+ for option1, option2 in self.INVALID_OPTIONS_PAIR:
+ if option1 in self.options and option2 in self.options:
+ raise ValueError(__('Cannot use both "%s" and "%s" options') %
+ (option1, option2))
+
+ def read_file(
+ self, filename: str, location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ try:
+ with open(filename, encoding=self.encoding, errors='strict') as f:
+ text = f.read()
+ if 'tab-width' in self.options:
+ text = text.expandtabs(self.options['tab-width'])
+
+ return text.splitlines(True)
+ except OSError as exc:
+ raise OSError(__('Include file %r not found or reading it failed') %
+ filename) from exc
+ except UnicodeError as exc:
+ raise UnicodeError(__('Encoding %r used for reading included file %r seems to '
+ 'be wrong, try giving an :encoding: option') %
+ (self.encoding, filename)) from exc
+
+ def read(self, location: tuple[str, int] | None = None) -> tuple[str, int]:
+ if 'diff' in self.options:
+ lines = self.show_diff()
+ else:
+ filters = [self.pyobject_filter,
+ self.start_filter,
+ self.end_filter,
+ self.lines_filter,
+ self.dedent_filter,
+ self.prepend_filter,
+ self.append_filter]
+ lines = self.read_file(self.filename, location=location)
+ for func in filters:
+ lines = func(lines, location=location)
+
+ return ''.join(lines), len(lines)
+
+ def show_diff(self, location: tuple[str, int] | None = None) -> list[str]:
+ new_lines = self.read_file(self.filename)
+ old_filename = self.options['diff']
+ old_lines = self.read_file(old_filename)
+ diff = unified_diff(old_lines, new_lines, str(old_filename), str(self.filename))
+ return list(diff)
+
+ def pyobject_filter(
+ self, lines: list[str], location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ pyobject = self.options.get('pyobject')
+ if pyobject:
+ from sphinx.pycode import ModuleAnalyzer
+ analyzer = ModuleAnalyzer.for_file(self.filename, '')
+ tags = analyzer.find_tags()
+ if pyobject not in tags:
+ raise ValueError(__('Object named %r not found in include file %r') %
+ (pyobject, self.filename))
+ start = tags[pyobject][1]
+ end = tags[pyobject][2]
+ lines = lines[start - 1:end]
+ if 'lineno-match' in self.options:
+ self.lineno_start = start
+
+ return lines
+
+ def lines_filter(
+ self, lines: list[str], location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ linespec = self.options.get('lines')
+ if linespec:
+ linelist = parselinenos(linespec, len(lines))
+ if any(i >= len(lines) for i in linelist):
+ logger.warning(__('line number spec is out of range(1-%d): %r') %
+ (len(lines), linespec), location=location)
+
+ if 'lineno-match' in self.options:
+ # make sure the line list is not "disjoint".
+ first = linelist[0]
+ if all(first + i == n for i, n in enumerate(linelist)):
+ self.lineno_start += linelist[0]
+ else:
+ raise ValueError(__('Cannot use "lineno-match" with a disjoint '
+ 'set of "lines"'))
+
+ lines = [lines[n] for n in linelist if n < len(lines)]
+ if lines == []:
+ raise ValueError(__('Line spec %r: no lines pulled from include file %r') %
+ (linespec, self.filename))
+
+ return lines
+
+ def start_filter(
+ self, lines: list[str], location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ if 'start-at' in self.options:
+ start = self.options.get('start-at')
+ inclusive = False
+ elif 'start-after' in self.options:
+ start = self.options.get('start-after')
+ inclusive = True
+ else:
+ start = None
+
+ if start:
+ for lineno, line in enumerate(lines):
+ if start in line:
+ if inclusive:
+ if 'lineno-match' in self.options:
+ self.lineno_start += lineno + 1
+
+ return lines[lineno + 1:]
+ else:
+ if 'lineno-match' in self.options:
+ self.lineno_start += lineno
+
+ return lines[lineno:]
+
+ if inclusive is True:
+ raise ValueError('start-after pattern not found: %s' % start)
+ else:
+ raise ValueError('start-at pattern not found: %s' % start)
+
+ return lines
+
+ def end_filter(
+ self, lines: list[str], location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ if 'end-at' in self.options:
+ end = self.options.get('end-at')
+ inclusive = True
+ elif 'end-before' in self.options:
+ end = self.options.get('end-before')
+ inclusive = False
+ else:
+ end = None
+
+ if end:
+ for lineno, line in enumerate(lines):
+ if end in line:
+ if inclusive:
+ return lines[:lineno + 1]
+ else:
+ if lineno == 0:
+ pass # end-before ignores first line
+ else:
+ return lines[:lineno]
+ if inclusive is True:
+ raise ValueError('end-at pattern not found: %s' % end)
+ else:
+ raise ValueError('end-before pattern not found: %s' % end)
+
+ return lines
+
+ def prepend_filter(
+ self, lines: list[str], location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ prepend = self.options.get('prepend')
+ if prepend:
+ lines.insert(0, prepend + '\n')
+
+ return lines
+
+ def append_filter(
+ self, lines: list[str], location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ append = self.options.get('append')
+ if append:
+ lines.append(append + '\n')
+
+ return lines
+
+ def dedent_filter(
+ self, lines: list[str], location: tuple[str, int] | None = None,
+ ) -> list[str]:
+ if 'dedent' in self.options:
+ return dedent_lines(lines, self.options.get('dedent'), location=location)
+ else:
+ return lines
+
+
+class LiteralInclude(SphinxDirective):
+ """
+ Like ``.. include:: :literal:``, but only warns if the include file is
+ not found, and does not raise errors. Also has several options for
+ selecting what to include.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {
+ 'dedent': optional_int,
+ 'linenos': directives.flag,
+ 'lineno-start': int,
+ 'lineno-match': directives.flag,
+ 'tab-width': int,
+ 'language': directives.unchanged_required,
+ 'force': directives.flag,
+ 'encoding': directives.encoding,
+ 'pyobject': directives.unchanged_required,
+ 'lines': directives.unchanged_required,
+ 'start-after': directives.unchanged_required,
+ 'end-before': directives.unchanged_required,
+ 'start-at': directives.unchanged_required,
+ 'end-at': directives.unchanged_required,
+ 'prepend': directives.unchanged_required,
+ 'append': directives.unchanged_required,
+ 'emphasize-lines': directives.unchanged_required,
+ 'caption': directives.unchanged,
+ 'class': directives.class_option,
+ 'name': directives.unchanged,
+ 'diff': directives.unchanged_required,
+ }
+
+ def run(self) -> list[Node]:
+ document = self.state.document
+ if not document.settings.file_insertion_enabled:
+ return [document.reporter.warning('File insertion disabled',
+ line=self.lineno)]
+ # convert options['diff'] to absolute path
+ if 'diff' in self.options:
+ _, path = self.env.relfn2path(self.options['diff'])
+ self.options['diff'] = path
+
+ try:
+ location = self.state_machine.get_source_and_line(self.lineno)
+ rel_filename, filename = self.env.relfn2path(self.arguments[0])
+ self.env.note_dependency(rel_filename)
+
+ reader = LiteralIncludeReader(filename, self.options, self.config)
+ text, lines = reader.read(location=location)
+
+ retnode: Element = nodes.literal_block(text, text, source=filename)
+ retnode['force'] = 'force' in self.options
+ self.set_source_info(retnode)
+ if self.options.get('diff'): # if diff is set, set udiff
+ retnode['language'] = 'udiff'
+ elif 'language' in self.options:
+ retnode['language'] = self.options['language']
+ if ('linenos' in self.options or 'lineno-start' in self.options or
+ 'lineno-match' in self.options):
+ retnode['linenos'] = True
+ retnode['classes'] += self.options.get('class', [])
+ extra_args = retnode['highlight_args'] = {}
+ if 'emphasize-lines' in self.options:
+ hl_lines = parselinenos(self.options['emphasize-lines'], lines)
+ if any(i >= lines for i in hl_lines):
+ logger.warning(__('line number spec is out of range(1-%d): %r') %
+ (lines, self.options['emphasize-lines']),
+ location=location)
+ extra_args['hl_lines'] = [x + 1 for x in hl_lines if x < lines]
+ extra_args['linenostart'] = reader.lineno_start
+
+ if 'caption' in self.options:
+ caption = self.options['caption'] or self.arguments[0]
+ retnode = container_wrapper(self, retnode, caption)
+
+ # retnode will be note_implicit_target that is linked from caption and numref.
+ # when options['name'] is provided, it should be primary ID.
+ self.add_name(retnode)
+
+ return [retnode]
+ except Exception as exc:
+ return [document.reporter.warning(exc, line=self.lineno)]
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ directives.register_directive('highlight', Highlight)
+ directives.register_directive('code-block', CodeBlock)
+ directives.register_directive('sourcecode', CodeBlock)
+ directives.register_directive('literalinclude', LiteralInclude)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/directives/other.py b/sphinx/directives/other.py
new file mode 100644
index 0000000..65cd90b
--- /dev/null
+++ b/sphinx/directives/other.py
@@ -0,0 +1,443 @@
+from __future__ import annotations
+
+import re
+from os.path import abspath, relpath
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.directives.admonitions import BaseAdmonition
+from docutils.parsers.rst.directives.misc import Class
+from docutils.parsers.rst.directives.misc import Include as BaseInclude
+from docutils.statemachine import StateMachine
+
+from sphinx import addnodes
+from sphinx.domains.changeset import VersionChange # noqa: F401 # for compatibility
+from sphinx.domains.std import StandardDomain
+from sphinx.locale import _, __
+from sphinx.util import docname_join, logging, url_re
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.matching import Matcher, patfilter
+from sphinx.util.nodes import explicit_title_re
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node
+
+ from sphinx.application import Sphinx
+ from sphinx.util.typing import OptionSpec
+
+
+glob_re = re.compile(r'.*[*?\[].*')
+logger = logging.getLogger(__name__)
+
+
+def int_or_nothing(argument: str) -> int:
+ if not argument:
+ return 999
+ return int(argument)
+
+
+class TocTree(SphinxDirective):
+ """
+ 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
+ final_argument_whitespace = False
+ option_spec = {
+ 'maxdepth': int,
+ 'name': directives.unchanged,
+ 'caption': directives.unchanged_required,
+ 'glob': directives.flag,
+ 'hidden': directives.flag,
+ 'includehidden': directives.flag,
+ 'numbered': int_or_nothing,
+ 'titlesonly': directives.flag,
+ 'reversed': directives.flag,
+ }
+
+ def run(self) -> list[Node]:
+ subnode = addnodes.toctree()
+ subnode['parent'] = self.env.docname
+
+ # (title, ref) pairs, where ref may be a document, or an external link,
+ # and title may be None if the document's title is to be used
+ subnode['entries'] = []
+ subnode['includefiles'] = []
+ subnode['maxdepth'] = self.options.get('maxdepth', -1)
+ subnode['caption'] = self.options.get('caption')
+ subnode['glob'] = 'glob' in self.options
+ subnode['hidden'] = 'hidden' in self.options
+ subnode['includehidden'] = 'includehidden' in self.options
+ subnode['numbered'] = self.options.get('numbered', 0)
+ subnode['titlesonly'] = 'titlesonly' in self.options
+ self.set_source_info(subnode)
+ wrappernode = nodes.compound(classes=['toctree-wrapper'])
+ wrappernode.append(subnode)
+ self.add_name(wrappernode)
+
+ ret = self.parse_content(subnode)
+ ret.append(wrappernode)
+ return ret
+
+ def parse_content(self, toctree: addnodes.toctree) -> list[Node]:
+ generated_docnames = frozenset(StandardDomain._virtual_doc_names)
+ suffixes = self.config.source_suffix
+ current_docname = self.env.docname
+ glob = toctree['glob']
+
+ # glob target documents
+ all_docnames = self.env.found_docs.copy() | generated_docnames
+ all_docnames.remove(current_docname) # remove current document
+ frozen_all_docnames = frozenset(all_docnames)
+
+ ret: list[Node] = []
+ excluded = Matcher(self.config.exclude_patterns)
+ for entry in self.content:
+ if not entry:
+ continue
+
+ # look for explicit titles ("Some Title <document>")
+ explicit = explicit_title_re.match(entry)
+ url_match = url_re.match(entry) is not None
+ if glob and glob_re.match(entry) and not explicit and not url_match:
+ pat_name = docname_join(current_docname, entry)
+ doc_names = sorted(patfilter(all_docnames, pat_name))
+ for docname in doc_names:
+ if docname in generated_docnames:
+ # don't include generated documents in globs
+ continue
+ all_docnames.remove(docname) # don't include it again
+ toctree['entries'].append((None, docname))
+ toctree['includefiles'].append(docname)
+ if not doc_names:
+ logger.warning(__("toctree glob pattern %r didn't match any documents"),
+ entry, location=toctree)
+ continue
+
+ if explicit:
+ ref = explicit.group(2)
+ title = explicit.group(1)
+ docname = ref
+ else:
+ ref = docname = entry
+ title = None
+
+ # remove suffixes (backwards compatibility)
+ for suffix in suffixes:
+ if docname.endswith(suffix):
+ docname = docname.removesuffix(suffix)
+ break
+
+ # absolutise filenames
+ docname = docname_join(current_docname, docname)
+ if url_match or ref == 'self':
+ toctree['entries'].append((title, ref))
+ continue
+
+ if docname not in frozen_all_docnames:
+ if excluded(self.env.doc2path(docname, False)):
+ message = __('toctree contains reference to excluded document %r')
+ subtype = 'excluded'
+ else:
+ message = __('toctree contains reference to nonexisting document %r')
+ subtype = 'not_readable'
+
+ logger.warning(message, docname, type='toc', subtype=subtype,
+ location=toctree)
+ self.env.note_reread()
+ continue
+
+ if docname in all_docnames:
+ all_docnames.remove(docname)
+ else:
+ logger.warning(__('duplicated entry found in toctree: %s'), docname,
+ location=toctree)
+
+ toctree['entries'].append((title, docname))
+ toctree['includefiles'].append(docname)
+
+ # entries contains all entries (self references, external links etc.)
+ if 'reversed' in self.options:
+ toctree['entries'] = list(reversed(toctree['entries']))
+ toctree['includefiles'] = list(reversed(toctree['includefiles']))
+
+ return ret
+
+
+class Author(SphinxDirective):
+ """
+ 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
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ if not self.config.show_authors:
+ return []
+ para: Element = nodes.paragraph(translatable=False)
+ emph = nodes.emphasis()
+ para += emph
+ if self.name == 'sectionauthor':
+ text = _('Section author: ')
+ elif self.name == 'moduleauthor':
+ text = _('Module author: ')
+ elif self.name == 'codeauthor':
+ text = _('Code author: ')
+ else:
+ text = _('Author: ')
+ emph += nodes.Text(text)
+ inodes, messages = self.state.inline_text(self.arguments[0], self.lineno)
+ emph.extend(inodes)
+
+ ret: list[Node] = [para]
+ ret += messages
+ return ret
+
+
+class SeeAlso(BaseAdmonition):
+ """
+ An admonition mentioning things to look at as reference.
+ """
+ node_class = addnodes.seealso
+
+
+class TabularColumns(SphinxDirective):
+ """
+ Directive to give an explicit tabulary column definition to LaTeX.
+ """
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ node = addnodes.tabular_col_spec()
+ node['spec'] = self.arguments[0]
+ self.set_source_info(node)
+ return [node]
+
+
+class Centered(SphinxDirective):
+ """
+ Directive to create a centered line of bold text.
+ """
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ if not self.arguments:
+ return []
+ subnode: Element = addnodes.centered()
+ inodes, messages = self.state.inline_text(self.arguments[0], self.lineno)
+ subnode.extend(inodes)
+
+ ret: list[Node] = [subnode]
+ ret += messages
+ return ret
+
+
+class Acks(SphinxDirective):
+ """
+ Directive for a list of names.
+ """
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ node = addnodes.acks()
+ node.document = self.state.document
+ self.state.nested_parse(self.content, self.content_offset, node)
+ if len(node.children) != 1 or not isinstance(node.children[0],
+ nodes.bullet_list):
+ logger.warning(__('.. acks content is not a list'),
+ location=(self.env.docname, self.lineno))
+ return []
+ return [node]
+
+
+class HList(SphinxDirective):
+ """
+ Directive for a list that gets compacted horizontally.
+ """
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'columns': int,
+ }
+
+ def run(self) -> list[Node]:
+ ncolumns = self.options.get('columns', 2)
+ node = nodes.paragraph()
+ node.document = self.state.document
+ self.state.nested_parse(self.content, self.content_offset, node)
+ if len(node.children) != 1 or not isinstance(node.children[0],
+ nodes.bullet_list):
+ logger.warning(__('.. hlist content is not a list'),
+ location=(self.env.docname, self.lineno))
+ return []
+ fulllist = node.children[0]
+ # create a hlist node where the items are distributed
+ npercol, nmore = divmod(len(fulllist), ncolumns)
+ index = 0
+ newnode = addnodes.hlist()
+ newnode['ncolumns'] = str(ncolumns)
+ for column in range(ncolumns):
+ endindex = index + ((npercol + 1) if column < nmore else npercol)
+ bullet_list = nodes.bullet_list()
+ bullet_list += fulllist.children[index:endindex]
+ newnode += addnodes.hlistcol('', bullet_list)
+ index = endindex
+ return [newnode]
+
+
+class Only(SphinxDirective):
+ """
+ Directive to only include text if the given tag(s) are enabled.
+ """
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ node = addnodes.only()
+ node.document = self.state.document
+ self.set_source_info(node)
+ node['expr'] = self.arguments[0]
+
+ # Same as util.nested_parse_with_titles but try to handle nested
+ # sections which should be raised higher up the doctree.
+ memo: Any = self.state.memo
+ surrounding_title_styles = memo.title_styles
+ surrounding_section_level = memo.section_level
+ memo.title_styles = []
+ memo.section_level = 0
+ try:
+ self.state.nested_parse(self.content, self.content_offset,
+ node, match_titles=True)
+ title_styles = memo.title_styles
+ if (not surrounding_title_styles or
+ not title_styles or
+ title_styles[0] not in surrounding_title_styles or
+ not self.state.parent):
+ # No nested sections so no special handling needed.
+ return [node]
+ # Calculate the depths of the current and nested sections.
+ current_depth = 0
+ parent = self.state.parent
+ while parent:
+ current_depth += 1
+ parent = parent.parent
+ current_depth -= 2
+ title_style = title_styles[0]
+ nested_depth = len(surrounding_title_styles)
+ if title_style in surrounding_title_styles:
+ nested_depth = surrounding_title_styles.index(title_style)
+ # Use these depths to determine where the nested sections should
+ # be placed in the doctree.
+ n_sects_to_raise = current_depth - nested_depth + 1
+ parent = cast(nodes.Element, self.state.parent)
+ for _i in range(n_sects_to_raise):
+ if parent.parent:
+ parent = parent.parent
+ parent.append(node)
+ return []
+ finally:
+ memo.title_styles = surrounding_title_styles
+ memo.section_level = surrounding_section_level
+
+
+class Include(BaseInclude, SphinxDirective):
+ """
+ Like the standard "Include" directive, but interprets absolute paths
+ "correctly", i.e. relative to source directory.
+ """
+
+ def run(self) -> list[Node]:
+
+ # To properly emit "include-read" events from included RST text,
+ # we must patch the ``StateMachine.insert_input()`` method.
+ # In the future, docutils will hopefully offer a way for Sphinx
+ # to provide the RST parser to use
+ # when parsing RST text that comes in via Include directive.
+ def _insert_input(include_lines, source):
+ # First, we need to combine the lines back into text so that
+ # we can send it with the include-read event.
+ # In docutils 0.18 and later, there are two lines at the end
+ # that act as markers.
+ # We must preserve them and leave them out of the include-read event:
+ text = "\n".join(include_lines[:-2])
+
+ path = Path(relpath(abspath(source), start=self.env.srcdir))
+ docname = self.env.docname
+
+ # Emit the "include-read" event
+ arg = [text]
+ self.env.app.events.emit('include-read', path, docname, arg)
+ text = arg[0]
+
+ # Split back into lines and reattach the two marker lines
+ include_lines = text.splitlines() + include_lines[-2:]
+
+ # Call the parent implementation.
+ # Note that this snake does not eat its tail because we patch
+ # the *Instance* method and this call is to the *Class* method.
+ return StateMachine.insert_input(self.state_machine, include_lines, source)
+
+ # Only enable this patch if there are listeners for 'include-read'.
+ if self.env.app.events.listeners.get('include-read'):
+ # See https://github.com/python/mypy/issues/2427 for details on the mypy issue
+ self.state_machine.insert_input = _insert_input # type: ignore[method-assign]
+
+ if self.arguments[0].startswith('<') and \
+ self.arguments[0].endswith('>'):
+ # docutils "standard" includes, do not do path processing
+ return super().run()
+ rel_filename, filename = self.env.relfn2path(self.arguments[0])
+ self.arguments[0] = filename
+ self.env.note_included(filename)
+ return super().run()
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ directives.register_directive('toctree', TocTree)
+ directives.register_directive('sectionauthor', Author)
+ directives.register_directive('moduleauthor', Author)
+ directives.register_directive('codeauthor', Author)
+ directives.register_directive('seealso', SeeAlso)
+ directives.register_directive('tabularcolumns', TabularColumns)
+ directives.register_directive('centered', Centered)
+ directives.register_directive('acks', Acks)
+ directives.register_directive('hlist', HList)
+ directives.register_directive('only', Only)
+ directives.register_directive('include', Include)
+
+ # register the standard rst class directive under a different name
+ # only for backwards compatibility now
+ directives.register_directive('cssclass', Class)
+ # new standard name when default-domain with "class" is in effect
+ directives.register_directive('rst-class', Class)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/directives/patches.py b/sphinx/directives/patches.py
new file mode 100644
index 0000000..965b385
--- /dev/null
+++ b/sphinx/directives/patches.py
@@ -0,0 +1,189 @@
+from __future__ import annotations
+
+import os
+from os import path
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.nodes import Node, make_id
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.directives import images, tables
+from docutils.parsers.rst.directives.misc import Meta # type: ignore[attr-defined]
+from docutils.parsers.rst.roles import set_classes
+
+from sphinx.directives import optional_int
+from sphinx.domains.math import MathDomain
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import set_source_info
+from sphinx.util.osutil import SEP, os_path, relpath
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.util.typing import OptionSpec
+
+
+logger = logging.getLogger(__name__)
+
+
+class Figure(images.Figure):
+ """The figure directive which applies `:name:` option to the figure node
+ instead of the image node.
+ """
+
+ def run(self) -> list[Node]:
+ name = self.options.pop('name', None)
+ result = super().run()
+ if len(result) == 2 or isinstance(result[0], nodes.system_message):
+ return result
+
+ assert len(result) == 1
+ figure_node = cast(nodes.figure, result[0])
+ if name:
+ # set ``name`` to figure_node if given
+ self.options['name'] = name
+ self.add_name(figure_node)
+
+ # copy lineno from image node
+ if figure_node.line is None and len(figure_node) == 2:
+ caption = cast(nodes.caption, figure_node[1])
+ figure_node.line = caption.line
+
+ return [figure_node]
+
+
+class CSVTable(tables.CSVTable):
+ """The csv-table directive which searches a CSV file from Sphinx project's source
+ directory when an absolute path is given via :file: option.
+ """
+
+ def run(self) -> list[Node]:
+ if 'file' in self.options and self.options['file'].startswith((SEP, os.sep)):
+ env = self.state.document.settings.env
+ filename = self.options['file']
+ if path.exists(filename):
+ logger.warning(__('":file:" option for csv-table directive now recognizes '
+ 'an absolute path as a relative path from source directory. '
+ 'Please update your document.'),
+ location=(env.docname, self.lineno))
+ else:
+ abspath = path.join(env.srcdir, os_path(self.options['file'][1:]))
+ docdir = path.dirname(env.doc2path(env.docname))
+ self.options['file'] = relpath(abspath, docdir)
+
+ return super().run()
+
+
+class Code(SphinxDirective):
+ """Parse and mark up content of a code block.
+
+ This is compatible with docutils' :rst:dir:`code` directive.
+ """
+ optional_arguments = 1
+ option_spec: OptionSpec = {
+ 'class': directives.class_option,
+ 'force': directives.flag,
+ 'name': directives.unchanged,
+ 'number-lines': optional_int,
+ }
+ has_content = True
+
+ def run(self) -> list[Node]:
+ self.assert_has_content()
+
+ set_classes(self.options)
+ code = '\n'.join(self.content)
+ node = nodes.literal_block(code, code,
+ classes=self.options.get('classes', []),
+ force='force' in self.options,
+ highlight_args={})
+ self.add_name(node)
+ set_source_info(self, node)
+
+ if self.arguments:
+ # highlight language specified
+ node['language'] = self.arguments[0]
+ else:
+ # no highlight language specified. Then this directive refers the current
+ # highlight setting via ``highlight`` directive or ``highlight_language``
+ # configuration.
+ node['language'] = self.env.temp_data.get('highlight_language',
+ self.config.highlight_language)
+
+ if 'number-lines' in self.options:
+ node['linenos'] = True
+
+ # if number given, treat as lineno-start.
+ if self.options['number-lines']:
+ node['highlight_args']['linenostart'] = self.options['number-lines']
+
+ return [node]
+
+
+class MathDirective(SphinxDirective):
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 1
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {
+ 'label': directives.unchanged,
+ 'name': directives.unchanged,
+ 'class': directives.class_option,
+ 'nowrap': directives.flag,
+ }
+
+ def run(self) -> list[Node]:
+ latex = '\n'.join(self.content)
+ if self.arguments and self.arguments[0]:
+ latex = self.arguments[0] + '\n\n' + latex
+ label = self.options.get('label', self.options.get('name'))
+ node = nodes.math_block(latex, latex,
+ classes=self.options.get('class', []),
+ docname=self.env.docname,
+ number=None,
+ label=label,
+ nowrap='nowrap' in self.options)
+ self.add_name(node)
+ self.set_source_info(node)
+
+ ret: list[Node] = [node]
+ self.add_target(ret)
+ return ret
+
+ def add_target(self, ret: list[Node]) -> None:
+ node = cast(nodes.math_block, ret[0])
+
+ # assign label automatically if math_number_all enabled
+ if node['label'] == '' or (self.config.math_number_all and not node['label']):
+ seq = self.env.new_serialno('sphinx.ext.math#equations')
+ node['label'] = "%s:%d" % (self.env.docname, seq)
+
+ # no targets and numbers are needed
+ if not node['label']:
+ return
+
+ # register label to domain
+ domain = cast(MathDomain, self.env.get_domain('math'))
+ domain.note_equation(self.env.docname, node['label'], location=node)
+ node['number'] = domain.get_equation_number_for(node['label'])
+
+ # add target node
+ node_id = make_id('equation-%s' % node['label'])
+ target = nodes.target('', '', ids=[node_id])
+ self.state.document.note_explicit_target(target)
+ ret.insert(0, target)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ directives.register_directive('figure', Figure)
+ directives.register_directive('meta', Meta)
+ directives.register_directive('csv-table', CSVTable)
+ directives.register_directive('code', Code)
+ directives.register_directive('math', MathDirective)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/__init__.py b/sphinx/domains/__init__.py
new file mode 100644
index 0000000..7c11220
--- /dev/null
+++ b/sphinx/domains/__init__.py
@@ -0,0 +1,406 @@
+"""Support for domains.
+
+Domains are groupings of description directives
+and roles describing e.g. constructs of one programming language.
+"""
+
+from __future__ import annotations
+
+import copy
+from abc import ABC, abstractmethod
+from typing import TYPE_CHECKING, Any, Callable, NamedTuple, Optional, cast
+
+from docutils.nodes import Element, Node, system_message
+
+from sphinx.errors import SphinxError
+from sphinx.locale import _
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Sequence
+
+ from docutils import nodes
+ from docutils.parsers.rst import Directive
+ from docutils.parsers.rst.states import Inliner
+
+ from sphinx.addnodes import pending_xref
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.roles import XRefRole
+ from sphinx.util.typing import RoleFunction
+
+
+class ObjType:
+ """
+ An ObjType is the description for a type of object that a domain can
+ document. In the object_types attribute of Domain subclasses, object type
+ names are mapped to instances of this class.
+
+ Constructor arguments:
+
+ - *lname*: localized name of the type (do not include domain name)
+ - *roles*: all the roles that can refer to an object of this type
+ - *attrs*: object attributes -- currently only "searchprio" is known,
+ which defines the object's priority in the full-text search index,
+ see :meth:`Domain.get_objects()`.
+ """
+
+ known_attrs = {
+ 'searchprio': 1,
+ }
+
+ def __init__(self, lname: str, *roles: Any, **attrs: Any) -> None:
+ self.lname = lname
+ self.roles: tuple = roles
+ self.attrs: dict = self.known_attrs.copy()
+ self.attrs.update(attrs)
+
+
+class IndexEntry(NamedTuple):
+ name: str
+ subtype: int
+ docname: str
+ anchor: str
+ extra: str
+ qualifier: str
+ descr: str
+
+
+class Index(ABC):
+ """
+ An Index is the description for a domain-specific index. To add an index to
+ a domain, subclass Index, overriding the three name attributes:
+
+ * `name` is an identifier used for generating file names.
+ It is also used for a hyperlink target for the index. Therefore, users can
+ refer the index page using ``ref`` role and a string which is combined
+ domain name and ``name`` attribute (ex. ``:ref:`py-modindex```).
+ * `localname` is the section title for the index.
+ * `shortname` is a short name for the index, for use in the relation bar in
+ HTML output. Can be empty to disable entries in the relation bar.
+
+ and providing a :meth:`generate()` method. Then, add the index class to
+ your domain's `indices` list. Extensions can add indices to existing
+ domains using :meth:`~sphinx.application.Sphinx.add_index_to_domain()`.
+
+ .. versionchanged:: 3.0
+
+ Index pages can be referred by domain name and index name via
+ :rst:role:`ref` role.
+ """
+
+ name: str
+ localname: str
+ shortname: str | None = None
+
+ def __init__(self, domain: Domain) -> None:
+ if self.name is None or self.localname is None:
+ raise SphinxError('Index subclass %s has no valid name or localname'
+ % self.__class__.__name__)
+ self.domain = domain
+
+ @abstractmethod
+ def generate(self, docnames: Iterable[str] | None = None,
+ ) -> tuple[list[tuple[str, list[IndexEntry]]], bool]:
+ """Get entries for the index.
+
+ If ``docnames`` is given, restrict to entries referring to these
+ docnames.
+
+ The return value is a tuple of ``(content, collapse)``:
+
+ ``collapse``
+ A boolean that determines if sub-entries should start collapsed (for
+ output formats that support collapsing sub-entries).
+
+ ``content``:
+ A sequence of ``(letter, entries)`` tuples, where ``letter`` is the
+ "heading" for the given ``entries``, usually the starting letter, and
+ ``entries`` is a sequence of single entries. Each entry is a sequence
+ ``[name, subtype, docname, anchor, extra, qualifier, descr]``. The
+ items in this sequence have the following meaning:
+
+ ``name``
+ The name of the index entry to be displayed.
+
+ ``subtype``
+ The sub-entry related type. One of:
+
+ ``0``
+ A normal entry.
+ ``1``
+ An entry with sub-entries.
+ ``2``
+ A sub-entry.
+
+ ``docname``
+ *docname* where the entry is located.
+
+ ``anchor``
+ Anchor for the entry within ``docname``
+
+ ``extra``
+ Extra info for the entry.
+
+ ``qualifier``
+ Qualifier for the description.
+
+ ``descr``
+ Description for the entry.
+
+ Qualifier and description are not rendered for some output formats such
+ as LaTeX.
+ """
+ raise NotImplementedError
+
+
+TitleGetter = Callable[[Node], Optional[str]]
+
+
+class Domain:
+ """
+ A Domain is meant to be a group of "object" description directives for
+ objects of a similar nature, and corresponding roles to create references to
+ them. Examples would be Python modules, classes, functions etc., elements
+ of a templating language, Sphinx roles and directives, etc.
+
+ Each domain has a separate storage for information about existing objects
+ and how to reference them in `self.data`, which must be a dictionary. It
+ also must implement several functions that expose the object information in
+ a uniform way to parts of Sphinx that allow the user to reference or search
+ for objects in a domain-agnostic way.
+
+ About `self.data`: since all object and cross-referencing information is
+ stored on a BuildEnvironment instance, the `domain.data` object is also
+ stored in the `env.domaindata` dict under the key `domain.name`. Before the
+ build process starts, every active domain is instantiated and given the
+ environment object; the `domaindata` dict must then either be nonexistent or
+ a dictionary whose 'version' key is equal to the domain class'
+ :attr:`data_version` attribute. Otherwise, `OSError` is raised and the
+ pickled environment is discarded.
+ """
+
+ #: domain name: should be short, but unique
+ name = ''
+ #: domain label: longer, more descriptive (used in messages)
+ label = ''
+ #: type (usually directive) name -> ObjType instance
+ object_types: dict[str, ObjType] = {}
+ #: directive name -> directive class
+ directives: dict[str, type[Directive]] = {}
+ #: role name -> role callable
+ roles: dict[str, RoleFunction | XRefRole] = {}
+ #: a list of Index subclasses
+ indices: list[type[Index]] = []
+ #: role name -> a warning message if reference is missing
+ dangling_warnings: dict[str, str] = {}
+ #: node_class -> (enum_node_type, title_getter)
+ enumerable_nodes: dict[type[Node], tuple[str, TitleGetter | None]] = {}
+ #: data value for a fresh environment
+ initial_data: dict = {}
+ #: data value
+ data: dict
+ #: data version, bump this when the format of `self.data` changes
+ data_version = 0
+
+ def __init__(self, env: BuildEnvironment) -> None:
+ self.env: BuildEnvironment = env
+ self._role_cache: dict[str, Callable] = {}
+ self._directive_cache: dict[str, Callable] = {}
+ self._role2type: dict[str, list[str]] = {}
+ self._type2role: dict[str, str] = {}
+
+ # convert class variables to instance one (to enhance through API)
+ self.object_types = dict(self.object_types)
+ self.directives = dict(self.directives)
+ self.roles = dict(self.roles)
+ self.indices = list(self.indices)
+
+ if self.name not in env.domaindata:
+ assert isinstance(self.initial_data, dict)
+ new_data = copy.deepcopy(self.initial_data)
+ new_data['version'] = self.data_version
+ self.data = env.domaindata[self.name] = new_data
+ else:
+ self.data = env.domaindata[self.name]
+ if self.data['version'] != self.data_version:
+ raise OSError('data of %r domain out of date' % self.label)
+ for name, obj in self.object_types.items():
+ for rolename in obj.roles:
+ self._role2type.setdefault(rolename, []).append(name)
+ self._type2role[name] = obj.roles[0] if obj.roles else ''
+ self.objtypes_for_role = self._role2type.get
+ self.role_for_objtype = self._type2role.get
+
+ def setup(self) -> None:
+ """Set up domain object."""
+ from sphinx.domains.std import StandardDomain
+
+ # Add special hyperlink target for index pages (ex. py-modindex)
+ std = cast(StandardDomain, self.env.get_domain('std'))
+ for index in self.indices:
+ if index.name and index.localname:
+ docname = f"{self.name}-{index.name}"
+ std.note_hyperlink_target(docname, docname, '', index.localname)
+
+ def add_object_type(self, name: str, objtype: ObjType) -> None:
+ """Add an object type."""
+ self.object_types[name] = objtype
+ if objtype.roles:
+ self._type2role[name] = objtype.roles[0]
+ else:
+ self._type2role[name] = ''
+
+ for role in objtype.roles:
+ self._role2type.setdefault(role, []).append(name)
+
+ def role(self, name: str) -> RoleFunction | None:
+ """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:
+ return self._role_cache[name]
+ if name not in self.roles:
+ return None
+ fullname = f'{self.name}:{name}'
+
+ def role_adapter(typ: str, rawtext: str, text: str, lineno: int,
+ inliner: Inliner, options: dict | None = None,
+ content: Sequence[str] = (),
+ ) -> tuple[list[Node], list[system_message]]:
+ return self.roles[name](fullname, rawtext, text, lineno,
+ inliner, options or {}, content)
+ self._role_cache[name] = role_adapter
+ return role_adapter
+
+ def directive(self, name: str) -> Callable | None:
+ """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:
+ return self._directive_cache[name]
+ if name not in self.directives:
+ return None
+ fullname = f'{self.name}:{name}'
+ BaseDirective = self.directives[name]
+
+ class DirectiveAdapter(BaseDirective): # type: ignore[valid-type,misc]
+ def run(self) -> list[Node]:
+ self.name = fullname
+ return super().run()
+ self._directive_cache[name] = DirectiveAdapter
+ return DirectiveAdapter
+
+ # methods that should be overwritten
+
+ def clear_doc(self, docname: str) -> None:
+ """Remove traces of a document in the domain-specific inventories."""
+ pass
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict) -> None:
+ """Merge in data regarding *docnames* from a different domaindata
+ inventory (coming from a subprocess in parallel builds).
+ """
+ raise NotImplementedError('merge_domaindata must be implemented in %s '
+ 'to be able to do parallel builds!' %
+ self.__class__)
+
+ def process_doc(self, env: BuildEnvironment, docname: str,
+ document: nodes.document) -> None:
+ """Process a document after it is read by the environment."""
+ pass
+
+ def check_consistency(self) -> None:
+ """Do consistency checks (**experimental**)."""
+ pass
+
+ def process_field_xref(self, pnode: pending_xref) -> None:
+ """Process a pending xref created in a doc field.
+ For example, attach information about the current scope.
+ """
+ pass
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ """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
+ cross-reference.
+
+ If no resolution can be found, None can be returned; the xref node will
+ then given to the :event:`missing-reference` event, and if that yields no
+ resolution, replaced by *contnode*.
+
+ The method can also raise :exc:`sphinx.environment.NoUri` to suppress
+ the :event:`missing-reference` event being emitted.
+ """
+ pass
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ """Resolve the pending_xref *node* with the given *target*.
+
+ The reference comes from an "any" or similar role, which means that we
+ don't know the type. Otherwise, the arguments are the same as for
+ :meth:`resolve_xref`.
+
+ The method must return a list (potentially empty) of tuples
+ ``('domain:role', newnode)``, where ``'domain:role'`` is the name of a
+ role that could have created the same reference, e.g. ``'py:func'``.
+ ``newnode`` is what :meth:`resolve_xref` would return.
+
+ .. versionadded:: 1.3
+ """
+ raise NotImplementedError
+
+ def get_objects(self) -> Iterable[tuple[str, str, str, str, str, int]]:
+ """Return an iterable of "object descriptions".
+
+ Object descriptions are tuples with six items:
+
+ ``name``
+ Fully qualified name.
+
+ ``dispname``
+ Name to display when searching/linking.
+
+ ``type``
+ Object type, a key in ``self.object_types``.
+
+ ``docname``
+ The document where it is to be found.
+
+ ``anchor``
+ The anchor name for the object.
+
+ ``priority``
+ How "important" the object is (determines placement in search
+ results). One of:
+
+ ``1``
+ Default priority (placed before full-text matches).
+ ``0``
+ Object is important (placed before default-priority objects).
+ ``2``
+ Object is unimportant (placed after full-text matches).
+ ``-1``
+ Object should not show up in search at all.
+ """
+ return []
+
+ def get_type_name(self, type: ObjType, primary: bool = False) -> str:
+ """Return full name for given ObjType."""
+ if primary:
+ return type.lname
+ return _('%s %s') % (self.label, type.lname)
+
+ def get_enumerable_node_type(self, node: Node) -> str | None:
+ """Get type of enumerable nodes (experimental)."""
+ enum_node_type, _ = self.enumerable_nodes.get(node.__class__, (None, None))
+ return enum_node_type
+
+ def get_full_qualified_name(self, node: Element) -> str | None:
+ """Return full qualified name for given node."""
+ pass
diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py
new file mode 100644
index 0000000..9444c6b
--- /dev/null
+++ b/sphinx/domains/c.py
@@ -0,0 +1,3906 @@
+"""The C language domain."""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.directives import ObjectDescription
+from sphinx.domains import Domain, ObjType
+from sphinx.locale import _, __
+from sphinx.roles import SphinxRole, XRefRole
+from sphinx.transforms import SphinxTransform
+from sphinx.transforms.post_transforms import ReferencesResolver
+from sphinx.util import logging
+from sphinx.util.cfamily import (
+ ASTAttributeList,
+ ASTBaseBase,
+ ASTBaseParenExprList,
+ BaseParser,
+ DefinitionError,
+ NoOldIdError,
+ StringifyTransform,
+ UnsupportedMultiCharacterCharLiteral,
+ anon_identifier_re,
+ binary_literal_re,
+ char_literal_re,
+ float_literal_re,
+ float_literal_suffix_re,
+ hex_literal_re,
+ identifier_re,
+ integer_literal_re,
+ integers_literal_suffix_re,
+ octal_literal_re,
+ verify_description_mode,
+)
+from sphinx.util.docfields import Field, GroupedField, TypedField
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import make_refnode
+
+if TYPE_CHECKING:
+ from collections.abc import Generator, Iterator
+
+ from docutils.nodes import Element, Node, TextElement, system_message
+
+ from sphinx.addnodes import pending_xref
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+
+logger = logging.getLogger(__name__)
+T = TypeVar('T')
+
+DeclarationType = Union[
+ "ASTStruct", "ASTUnion", "ASTEnum", "ASTEnumerator",
+ "ASTType", "ASTTypeWithInit", "ASTMacro",
+]
+
+# https://en.cppreference.com/w/c/keyword
+_keywords = [
+ 'auto', 'break', 'case', 'char', 'const', 'continue', 'default', 'do', 'double',
+ 'else', 'enum', 'extern', 'float', 'for', 'goto', 'if', 'inline', 'int', 'long',
+ 'register', 'restrict', 'return', 'short', 'signed', 'sizeof', 'static', 'struct',
+ 'switch', 'typedef', 'union', 'unsigned', 'void', 'volatile', 'while',
+ '_Alignas', '_Alignof', '_Atomic', '_Bool', '_Complex',
+ '_Decimal32', '_Decimal64', '_Decimal128',
+ '_Generic', '_Imaginary', '_Noreturn', '_Static_assert', '_Thread_local',
+]
+# These are only keyword'y when the corresponding headers are included.
+# They are used as default value for c_extra_keywords.
+_macroKeywords = [
+ 'alignas', 'alignof', 'bool', 'complex', 'imaginary', 'noreturn', 'static_assert',
+ 'thread_local',
+]
+
+# these are ordered by precedence
+_expression_bin_ops = [
+ ['||', 'or'],
+ ['&&', 'and'],
+ ['|', 'bitor'],
+ ['^', 'xor'],
+ ['&', 'bitand'],
+ ['==', '!=', 'not_eq'],
+ ['<=', '>=', '<', '>'],
+ ['<<', '>>'],
+ ['+', '-'],
+ ['*', '/', '%'],
+ ['.*', '->*'],
+]
+_expression_unary_ops = ["++", "--", "*", "&", "+", "-", "!", "not", "~", "compl"]
+_expression_assignment_ops = ["=", "*=", "/=", "%=", "+=", "-=",
+ ">>=", "<<=", "&=", "and_eq", "^=", "xor_eq", "|=", "or_eq"]
+
+_max_id = 1
+_id_prefix = [None, 'c.', 'Cv2.']
+# Ids are used in lookup keys which are used across pickled files,
+# so when _max_id changes, make sure to update the ENV_VERSION.
+
+_string_re = re.compile(r"[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'"
+ r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S)
+
+# bool, complex, and imaginary are macro "keywords", so they are handled separately
+_simple_type_specifiers_re = re.compile(r"""
+ \b(
+ void|_Bool
+ |signed|unsigned
+ |short|long
+ |char
+ |int
+ |__uint128|__int128
+ |__int(8|16|32|64|128) # extension
+ |float|double
+ |_Decimal(32|64|128)
+ |_Complex|_Imaginary
+ |__float80|_Float64x|__float128|_Float128|__ibm128 # extension
+ |__fp16 # extension
+ |_Sat|_Fract|fract|_Accum|accum # extension
+ )\b
+""", re.VERBOSE)
+
+
+class _DuplicateSymbolError(Exception):
+ def __init__(self, symbol: Symbol, declaration: ASTDeclaration) -> None:
+ assert symbol
+ assert declaration
+ self.symbol = symbol
+ self.declaration = declaration
+
+ def __str__(self) -> str:
+ return "Internal C duplicate symbol error:\n%s" % self.symbol.dump(0)
+
+
+class ASTBase(ASTBaseBase):
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ raise NotImplementedError(repr(self))
+
+
+# Names
+################################################################################
+
+class ASTIdentifier(ASTBaseBase):
+ def __init__(self, identifier: str) -> None:
+ assert identifier is not None
+ assert len(identifier) != 0
+ self.identifier = identifier
+
+ def __eq__(self, other: Any) -> bool:
+ return type(other) is ASTIdentifier and self.identifier == other.identifier
+
+ def is_anon(self) -> bool:
+ return self.identifier[0] == '@'
+
+ # and this is where we finally make a difference between __str__ and the display string
+
+ def __str__(self) -> str:
+ return self.identifier
+
+ def get_display_string(self) -> str:
+ return "[anonymous]" if self.is_anon() else self.identifier
+
+ def describe_signature(self, signode: TextElement, mode: str, env: BuildEnvironment,
+ prefix: str, symbol: Symbol) -> None:
+ # note: slightly different signature of describe_signature due to the prefix
+ verify_description_mode(mode)
+ if self.is_anon():
+ node = addnodes.desc_sig_name(text="[anonymous]")
+ else:
+ node = addnodes.desc_sig_name(self.identifier, self.identifier)
+ if mode == 'markType':
+ targetText = prefix + self.identifier
+ pnode = addnodes.pending_xref('', refdomain='c',
+ reftype='identifier',
+ reftarget=targetText, modname=None,
+ classname=None)
+ pnode['c:parent_key'] = symbol.get_lookup_key()
+ pnode += node
+ signode += pnode
+ elif mode == 'lastIsName':
+ nameNode = addnodes.desc_name()
+ nameNode += node
+ signode += nameNode
+ elif mode == 'noneIsName':
+ signode += node
+ else:
+ raise Exception('Unknown description mode: %s' % mode)
+
+
+class ASTNestedName(ASTBase):
+ def __init__(self, names: list[ASTIdentifier], rooted: bool) -> None:
+ assert len(names) > 0
+ self.names = names
+ self.rooted = rooted
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self
+
+ def get_id(self, version: int) -> str:
+ return '.'.join(str(n) for n in self.names)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = '.'.join(transform(n) for n in self.names)
+ if self.rooted:
+ return '.' + res
+ else:
+ return res
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ # just print the name part, with template args, not template params
+ if mode == 'noneIsName':
+ if self.rooted:
+ unreachable = "Can this happen?"
+ raise AssertionError(unreachable) # TODO
+ signode += nodes.Text('.')
+ for i in range(len(self.names)):
+ if i != 0:
+ unreachable = "Can this happen?"
+ raise AssertionError(unreachable) # TODO
+ signode += nodes.Text('.')
+ n = self.names[i]
+ n.describe_signature(signode, mode, env, '', symbol)
+ elif mode == 'param':
+ assert not self.rooted, str(self)
+ assert len(self.names) == 1
+ self.names[0].describe_signature(signode, 'noneIsName', env, '', symbol)
+ elif mode in ('markType', 'lastIsName', 'markName'):
+ # Each element should be a pending xref targeting the complete
+ # prefix.
+ prefix = ''
+ first = True
+ names = self.names[:-1] if mode == 'lastIsName' else self.names
+ # If lastIsName, then wrap all of the prefix in a desc_addname,
+ # else append directly to signode.
+ # TODO: also for C?
+ # NOTE: Breathe previously relied on the prefix being in the desc_addname node,
+ # so it can remove it in inner declarations.
+ dest = signode
+ if mode == 'lastIsName':
+ dest = addnodes.desc_addname()
+ if self.rooted:
+ prefix += '.'
+ if mode == 'lastIsName' and len(names) == 0:
+ signode += addnodes.desc_sig_punctuation('.', '.')
+ else:
+ dest += addnodes.desc_sig_punctuation('.', '.')
+ for i in range(len(names)):
+ ident = names[i]
+ if not first:
+ dest += addnodes.desc_sig_punctuation('.', '.')
+ prefix += '.'
+ first = False
+ txt_ident = str(ident)
+ if txt_ident != '':
+ ident.describe_signature(dest, 'markType', env, prefix, symbol)
+ prefix += txt_ident
+ if mode == 'lastIsName':
+ if len(self.names) > 1:
+ dest += addnodes.desc_sig_punctuation('.', '.')
+ signode += dest
+ self.names[-1].describe_signature(signode, mode, env, '', symbol)
+ else:
+ raise Exception('Unknown description mode: %s' % mode)
+
+
+################################################################################
+# Expressions
+################################################################################
+
+class ASTExpression(ASTBase):
+ pass
+
+
+# Primary expressions
+################################################################################
+
+class ASTLiteral(ASTExpression):
+ pass
+
+
+class ASTBooleanLiteral(ASTLiteral):
+ def __init__(self, value: bool) -> None:
+ self.value = value
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.value:
+ return 'true'
+ else:
+ return 'false'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ txt = str(self)
+ signode += addnodes.desc_sig_keyword(txt, txt)
+
+
+class ASTNumberLiteral(ASTLiteral):
+ def __init__(self, data: str) -> None:
+ self.data = data
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.data
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ txt = str(self)
+ signode += addnodes.desc_sig_literal_number(txt, txt)
+
+
+class ASTCharLiteral(ASTLiteral):
+ def __init__(self, prefix: str, data: str) -> None:
+ self.prefix = prefix # may be None when no prefix
+ self.data = data
+ decoded = data.encode().decode('unicode-escape')
+ if len(decoded) == 1:
+ self.value = ord(decoded)
+ else:
+ raise UnsupportedMultiCharacterCharLiteral(decoded)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.prefix is None:
+ return "'" + self.data + "'"
+ else:
+ return self.prefix + "'" + self.data + "'"
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ txt = str(self)
+ signode += addnodes.desc_sig_literal_char(txt, txt)
+
+
+class ASTStringLiteral(ASTLiteral):
+ def __init__(self, data: str) -> None:
+ self.data = data
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.data
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ txt = str(self)
+ signode += addnodes.desc_sig_literal_string(txt, txt)
+
+
+class ASTIdExpression(ASTExpression):
+ def __init__(self, name: ASTNestedName):
+ # note: this class is basically to cast a nested name as an expression
+ self.name = name
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.name)
+
+ def get_id(self, version: int) -> str:
+ return self.name.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.name.describe_signature(signode, mode, env, symbol)
+
+
+class ASTParenExpr(ASTExpression):
+ def __init__(self, expr):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '(' + transform(self.expr) + ')'
+
+ def get_id(self, version: int) -> str:
+ return self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+# Postfix expressions
+################################################################################
+
+class ASTPostfixOp(ASTBase):
+ pass
+
+
+class ASTPostfixCallExpr(ASTPostfixOp):
+ def __init__(self, lst: ASTParenExprList | ASTBracedInitList) -> None:
+ self.lst = lst
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.lst)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.lst.describe_signature(signode, mode, env, symbol)
+
+
+class ASTPostfixArray(ASTPostfixOp):
+ def __init__(self, expr: ASTExpression) -> None:
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '[' + transform(self.expr) + ']'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('[', '[')
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(']', ']')
+
+
+class ASTPostfixInc(ASTPostfixOp):
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '++'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_operator('++', '++')
+
+
+class ASTPostfixDec(ASTPostfixOp):
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '--'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_operator('--', '--')
+
+
+class ASTPostfixMemberOfPointer(ASTPostfixOp):
+ def __init__(self, name):
+ self.name = name
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '->' + transform(self.name)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_operator('->', '->')
+ self.name.describe_signature(signode, 'noneIsName', env, symbol)
+
+
+class ASTPostfixExpr(ASTExpression):
+ def __init__(self, prefix: ASTExpression, postFixes: list[ASTPostfixOp]):
+ self.prefix = prefix
+ self.postFixes = postFixes
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = [transform(self.prefix)]
+ for p in self.postFixes:
+ res.append(transform(p))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.prefix.describe_signature(signode, mode, env, symbol)
+ for p in self.postFixes:
+ p.describe_signature(signode, mode, env, symbol)
+
+
+# Unary expressions
+################################################################################
+
+class ASTUnaryOpExpr(ASTExpression):
+ def __init__(self, op: str, expr: ASTExpression):
+ self.op = op
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.op[0] in 'cn':
+ return self.op + " " + transform(self.expr)
+ else:
+ return self.op + transform(self.expr)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.op[0] in 'cn':
+ signode += addnodes.desc_sig_keyword(self.op, self.op)
+ signode += addnodes.desc_sig_space()
+ else:
+ signode += addnodes.desc_sig_operator(self.op, self.op)
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTSizeofType(ASTExpression):
+ def __init__(self, typ):
+ self.typ = typ
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "sizeof(" + transform(self.typ) + ")"
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('sizeof', 'sizeof')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.typ.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTSizeofExpr(ASTExpression):
+ def __init__(self, expr: ASTExpression):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "sizeof " + transform(self.expr)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('sizeof', 'sizeof')
+ signode += addnodes.desc_sig_space()
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTAlignofExpr(ASTExpression):
+ def __init__(self, typ: ASTType):
+ self.typ = typ
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "alignof(" + transform(self.typ) + ")"
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('alignof', 'alignof')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.typ.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+# Other expressions
+################################################################################
+
+class ASTCastExpr(ASTExpression):
+ def __init__(self, typ: ASTType, expr: ASTExpression):
+ self.typ = typ
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['(']
+ res.append(transform(self.typ))
+ res.append(')')
+ res.append(transform(self.expr))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.typ.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTBinOpExpr(ASTBase):
+ def __init__(self, exprs: list[ASTExpression], ops: list[str]):
+ assert len(exprs) > 0
+ assert len(exprs) == len(ops) + 1
+ self.exprs = exprs
+ self.ops = ops
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.exprs[0]))
+ for i in range(1, len(self.exprs)):
+ res.append(' ')
+ res.append(self.ops[i - 1])
+ res.append(' ')
+ res.append(transform(self.exprs[i]))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.exprs[0].describe_signature(signode, mode, env, symbol)
+ for i in range(1, len(self.exprs)):
+ signode += addnodes.desc_sig_space()
+ op = self.ops[i - 1]
+ if ord(op[0]) >= ord('a') and ord(op[0]) <= ord('z'):
+ signode += addnodes.desc_sig_keyword(op, op)
+ else:
+ signode += addnodes.desc_sig_operator(op, op)
+ signode += addnodes.desc_sig_space()
+ self.exprs[i].describe_signature(signode, mode, env, symbol)
+
+
+class ASTAssignmentExpr(ASTExpression):
+ def __init__(self, exprs: list[ASTExpression], ops: list[str]):
+ assert len(exprs) > 0
+ assert len(exprs) == len(ops) + 1
+ self.exprs = exprs
+ self.ops = ops
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.exprs[0]))
+ for i in range(1, len(self.exprs)):
+ res.append(' ')
+ res.append(self.ops[i - 1])
+ res.append(' ')
+ res.append(transform(self.exprs[i]))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.exprs[0].describe_signature(signode, mode, env, symbol)
+ for i in range(1, len(self.exprs)):
+ signode += addnodes.desc_sig_space()
+ op = self.ops[i - 1]
+ if ord(op[0]) >= ord('a') and ord(op[0]) <= ord('z'):
+ signode += addnodes.desc_sig_keyword(op, op)
+ else:
+ signode += addnodes.desc_sig_operator(op, op)
+ signode += addnodes.desc_sig_space()
+ self.exprs[i].describe_signature(signode, mode, env, symbol)
+
+
+class ASTFallbackExpr(ASTExpression):
+ def __init__(self, expr: str):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.expr
+
+ def get_id(self, version: int) -> str:
+ return str(self.expr)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += nodes.literal(self.expr, self.expr)
+
+
+################################################################################
+# Types
+################################################################################
+
+class ASTTrailingTypeSpec(ASTBase):
+ pass
+
+
+class ASTTrailingTypeSpecFundamental(ASTTrailingTypeSpec):
+ def __init__(self, names: list[str]) -> None:
+ assert len(names) != 0
+ self.names = names
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return ' '.join(self.names)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ first = True
+ for n in self.names:
+ if not first:
+ signode += addnodes.desc_sig_space()
+ else:
+ first = False
+ signode += addnodes.desc_sig_keyword_type(n, n)
+
+
+class ASTTrailingTypeSpecName(ASTTrailingTypeSpec):
+ def __init__(self, prefix: str, nestedName: ASTNestedName) -> None:
+ self.prefix = prefix
+ self.nestedName = nestedName
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.nestedName
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.prefix:
+ res.append(self.prefix)
+ res.append(' ')
+ res.append(transform(self.nestedName))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.prefix:
+ signode += addnodes.desc_sig_keyword(self.prefix, self.prefix)
+ signode += addnodes.desc_sig_space()
+ self.nestedName.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTFunctionParameter(ASTBase):
+ def __init__(self, arg: ASTTypeWithInit | None, ellipsis: bool = False) -> None:
+ self.arg = arg
+ self.ellipsis = ellipsis
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ # the anchor will be our parent
+ return symbol.parent.declaration.get_id(version, prefixed=False)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.ellipsis:
+ return '...'
+ else:
+ return transform(self.arg)
+
+ def describe_signature(self, signode: Any, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.ellipsis:
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ else:
+ self.arg.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTParameters(ASTBase):
+ def __init__(self, args: list[ASTFunctionParameter], attrs: ASTAttributeList) -> None:
+ self.args = args
+ self.attrs = attrs
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.args
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append('(')
+ first = True
+ for a in self.args:
+ if not first:
+ res.append(', ')
+ first = False
+ res.append(str(a))
+ res.append(')')
+ if len(self.attrs) != 0:
+ res.append(' ')
+ res.append(transform(self.attrs))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ multi_line_parameter_list = False
+ test_node: Element = signode
+ while test_node.parent:
+ if not isinstance(test_node, addnodes.desc_signature):
+ test_node = test_node.parent
+ continue
+ multi_line_parameter_list = test_node.get('multi_line_parameter_list', False)
+ break
+
+ # only use the desc_parameterlist for the outer list, not for inner lists
+ if mode == 'lastIsName':
+ paramlist = addnodes.desc_parameterlist()
+ paramlist['multi_line_parameter_list'] = multi_line_parameter_list
+ for arg in self.args:
+ param = addnodes.desc_parameter('', '', noemph=True)
+ arg.describe_signature(param, 'param', env, symbol=symbol)
+ paramlist += param
+ signode += paramlist
+ else:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ first = True
+ for arg in self.args:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ first = False
+ arg.describe_signature(signode, 'markType', env, symbol=symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+ if len(self.attrs) != 0:
+ signode += addnodes.desc_sig_space()
+ self.attrs.describe_signature(signode)
+
+
+class ASTDeclSpecsSimple(ASTBaseBase):
+ def __init__(self, storage: str, threadLocal: str, inline: bool,
+ restrict: bool, volatile: bool, const: bool, attrs: ASTAttributeList) -> None:
+ self.storage = storage
+ self.threadLocal = threadLocal
+ self.inline = inline
+ self.restrict = restrict
+ self.volatile = volatile
+ self.const = const
+ self.attrs = attrs
+
+ def mergeWith(self, other: ASTDeclSpecsSimple) -> ASTDeclSpecsSimple:
+ if not other:
+ return self
+ return ASTDeclSpecsSimple(self.storage or other.storage,
+ self.threadLocal or other.threadLocal,
+ self.inline or other.inline,
+ self.volatile or other.volatile,
+ self.const or other.const,
+ self.restrict or other.restrict,
+ self.attrs + other.attrs)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res: list[str] = []
+ if len(self.attrs) != 0:
+ res.append(transform(self.attrs))
+ if self.storage:
+ res.append(self.storage)
+ if self.threadLocal:
+ res.append(self.threadLocal)
+ if self.inline:
+ res.append('inline')
+ if self.restrict:
+ res.append('restrict')
+ if self.volatile:
+ res.append('volatile')
+ if self.const:
+ res.append('const')
+ return ' '.join(res)
+
+ def describe_signature(self, modifiers: list[Node]) -> None:
+ def _add(modifiers: list[Node], text: str) -> None:
+ if len(modifiers) != 0:
+ modifiers.append(addnodes.desc_sig_space())
+ modifiers.append(addnodes.desc_sig_keyword(text, text))
+
+ if len(modifiers) != 0 and len(self.attrs) != 0:
+ modifiers.append(addnodes.desc_sig_space())
+ tempNode = nodes.TextElement()
+ self.attrs.describe_signature(tempNode)
+ modifiers.extend(tempNode.children)
+ if self.storage:
+ _add(modifiers, self.storage)
+ if self.threadLocal:
+ _add(modifiers, self.threadLocal)
+ if self.inline:
+ _add(modifiers, 'inline')
+ if self.restrict:
+ _add(modifiers, 'restrict')
+ if self.volatile:
+ _add(modifiers, 'volatile')
+ if self.const:
+ _add(modifiers, 'const')
+
+
+class ASTDeclSpecs(ASTBase):
+ def __init__(self, outer: str,
+ leftSpecs: ASTDeclSpecsSimple,
+ rightSpecs: ASTDeclSpecsSimple,
+ trailing: ASTTrailingTypeSpec) -> None:
+ # leftSpecs and rightSpecs are used for output
+ # allSpecs are used for id generation TODO: remove?
+ self.outer = outer
+ self.leftSpecs = leftSpecs
+ self.rightSpecs = rightSpecs
+ self.allSpecs = self.leftSpecs.mergeWith(self.rightSpecs)
+ self.trailingTypeSpec = trailing
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res: list[str] = []
+ l = transform(self.leftSpecs)
+ if len(l) > 0:
+ res.append(l)
+ if self.trailingTypeSpec:
+ if len(res) > 0:
+ res.append(" ")
+ res.append(transform(self.trailingTypeSpec))
+ r = str(self.rightSpecs)
+ if len(r) > 0:
+ if len(res) > 0:
+ res.append(" ")
+ res.append(r)
+ return "".join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ modifiers: list[Node] = []
+
+ self.leftSpecs.describe_signature(modifiers)
+
+ for m in modifiers:
+ signode += m
+ if self.trailingTypeSpec:
+ if len(modifiers) > 0:
+ signode += addnodes.desc_sig_space()
+ self.trailingTypeSpec.describe_signature(signode, mode, env,
+ symbol=symbol)
+ modifiers = []
+ self.rightSpecs.describe_signature(modifiers)
+ if len(modifiers) > 0:
+ signode += addnodes.desc_sig_space()
+ for m in modifiers:
+ signode += m
+
+
+# Declarator
+################################################################################
+
+class ASTArray(ASTBase):
+ def __init__(self, static: bool, const: bool, volatile: bool, restrict: bool,
+ vla: bool, size: ASTExpression):
+ self.static = static
+ self.const = const
+ self.volatile = volatile
+ self.restrict = restrict
+ self.vla = vla
+ self.size = size
+ if vla:
+ assert size is None
+ if size is not None:
+ assert not vla
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ el = []
+ if self.static:
+ el.append('static')
+ if self.restrict:
+ el.append('restrict')
+ if self.volatile:
+ el.append('volatile')
+ if self.const:
+ el.append('const')
+ if self.vla:
+ return '[' + ' '.join(el) + '*]'
+ elif self.size:
+ el.append(transform(self.size))
+ return '[' + ' '.join(el) + ']'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('[', '[')
+ addSpace = False
+
+ def _add(signode: TextElement, text: str) -> bool:
+ if addSpace:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_keyword(text, text)
+ return True
+
+ if self.static:
+ addSpace = _add(signode, 'static')
+ if self.restrict:
+ addSpace = _add(signode, 'restrict')
+ if self.volatile:
+ addSpace = _add(signode, 'volatile')
+ if self.const:
+ addSpace = _add(signode, 'const')
+ if self.vla:
+ signode += addnodes.desc_sig_punctuation('*', '*')
+ elif self.size:
+ if addSpace:
+ signode += addnodes.desc_sig_space()
+ self.size.describe_signature(signode, 'markType', env, symbol)
+ signode += addnodes.desc_sig_punctuation(']', ']')
+
+
+class ASTDeclarator(ASTBase):
+ @property
+ def name(self) -> ASTNestedName:
+ raise NotImplementedError(repr(self))
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ raise NotImplementedError(repr(self))
+
+ def require_space_after_declSpecs(self) -> bool:
+ raise NotImplementedError(repr(self))
+
+
+class ASTDeclaratorNameParam(ASTDeclarator):
+ def __init__(self, declId: ASTNestedName,
+ arrayOps: list[ASTArray], param: ASTParameters) -> None:
+ self.declId = declId
+ self.arrayOps = arrayOps
+ self.param = param
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.declId
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.param.function_params
+
+ # ------------------------------------------------------------------------
+
+ def require_space_after_declSpecs(self) -> bool:
+ return self.declId is not None
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.declId:
+ res.append(transform(self.declId))
+ for op in self.arrayOps:
+ res.append(transform(op))
+ if self.param:
+ res.append(transform(self.param))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.declId:
+ self.declId.describe_signature(signode, mode, env, symbol)
+ for op in self.arrayOps:
+ op.describe_signature(signode, mode, env, symbol)
+ if self.param:
+ self.param.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorNameBitField(ASTDeclarator):
+ def __init__(self, declId: ASTNestedName, size: ASTExpression):
+ self.declId = declId
+ self.size = size
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.declId
+
+ # ------------------------------------------------------------------------
+
+ def require_space_after_declSpecs(self) -> bool:
+ return self.declId is not None
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.declId:
+ res.append(transform(self.declId))
+ res.append(" : ")
+ res.append(transform(self.size))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.declId:
+ self.declId.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation(':', ':')
+ signode += addnodes.desc_sig_space()
+ self.size.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorPtr(ASTDeclarator):
+ def __init__(self, next: ASTDeclarator, restrict: bool, volatile: bool, const: bool,
+ attrs: ASTAttributeList) -> None:
+ assert next
+ self.next = next
+ self.restrict = restrict
+ self.volatile = volatile
+ self.const = const
+ self.attrs = attrs
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.next.name
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.next.function_params
+
+ def require_space_after_declSpecs(self) -> bool:
+ return self.const or self.volatile or self.restrict or \
+ len(self.attrs) > 0 or \
+ self.next.require_space_after_declSpecs()
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['*']
+ res.append(transform(self.attrs))
+ if len(self.attrs) != 0 and (self.restrict or self.volatile or self.const):
+ res.append(' ')
+ if self.restrict:
+ res.append('restrict')
+ if self.volatile:
+ if self.restrict:
+ res.append(' ')
+ res.append('volatile')
+ if self.const:
+ if self.restrict or self.volatile:
+ res.append(' ')
+ res.append('const')
+ if self.const or self.volatile or self.restrict or len(self.attrs) > 0:
+ if self.next.require_space_after_declSpecs():
+ res.append(' ')
+ res.append(transform(self.next))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('*', '*')
+ self.attrs.describe_signature(signode)
+ if len(self.attrs) != 0 and (self.restrict or self.volatile or self.const):
+ signode += addnodes.desc_sig_space()
+
+ def _add_anno(signode: TextElement, text: str) -> None:
+ signode += addnodes.desc_sig_keyword(text, text)
+
+ if self.restrict:
+ _add_anno(signode, 'restrict')
+ if self.volatile:
+ if self.restrict:
+ signode += addnodes.desc_sig_space()
+ _add_anno(signode, 'volatile')
+ if self.const:
+ if self.restrict or self.volatile:
+ signode += addnodes.desc_sig_space()
+ _add_anno(signode, 'const')
+ if self.const or self.volatile or self.restrict or len(self.attrs) > 0:
+ if self.next.require_space_after_declSpecs():
+ signode += addnodes.desc_sig_space()
+ self.next.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorParen(ASTDeclarator):
+ def __init__(self, inner: ASTDeclarator, next: ASTDeclarator) -> None:
+ assert inner
+ assert next
+ self.inner = inner
+ self.next = next
+ # TODO: we assume the name and params are in inner
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.inner.name
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.inner.function_params
+
+ def require_space_after_declSpecs(self) -> bool:
+ return True
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['(']
+ res.append(transform(self.inner))
+ res.append(')')
+ res.append(transform(self.next))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.inner.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+ self.next.describe_signature(signode, "noneIsName", env, symbol)
+
+
+# Initializer
+################################################################################
+
+class ASTParenExprList(ASTBaseParenExprList):
+ def __init__(self, exprs: list[ASTExpression]) -> None:
+ self.exprs = exprs
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ exprs = [transform(e) for e in self.exprs]
+ return '(%s)' % ', '.join(exprs)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ first = True
+ for e in self.exprs:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ else:
+ first = False
+ e.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTBracedInitList(ASTBase):
+ def __init__(self, exprs: list[ASTExpression], trailingComma: bool) -> None:
+ self.exprs = exprs
+ self.trailingComma = trailingComma
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ exprs = ', '.join(transform(e) for e in self.exprs)
+ trailingComma = ',' if self.trailingComma else ''
+ return f'{{{exprs}{trailingComma}}}'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('{', '{')
+ first = True
+ for e in self.exprs:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ else:
+ first = False
+ e.describe_signature(signode, mode, env, symbol)
+ if self.trailingComma:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_punctuation('}', '}')
+
+
+class ASTInitializer(ASTBase):
+ def __init__(self, value: ASTBracedInitList | ASTExpression,
+ hasAssign: bool = True) -> None:
+ self.value = value
+ self.hasAssign = hasAssign
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ val = transform(self.value)
+ if self.hasAssign:
+ return ' = ' + val
+ else:
+ return val
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.hasAssign:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('=', '=')
+ signode += addnodes.desc_sig_space()
+ self.value.describe_signature(signode, 'markType', env, symbol)
+
+
+class ASTType(ASTBase):
+ def __init__(self, declSpecs: ASTDeclSpecs, decl: ASTDeclarator) -> None:
+ assert declSpecs
+ assert decl
+ self.declSpecs = declSpecs
+ self.decl = decl
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.decl.name
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return symbol.get_full_nested_name().get_id(version)
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.decl.function_params
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ declSpecs = transform(self.declSpecs)
+ res.append(declSpecs)
+ if self.decl.require_space_after_declSpecs() and len(declSpecs) > 0:
+ res.append(' ')
+ res.append(transform(self.decl))
+ return ''.join(res)
+
+ def get_type_declaration_prefix(self) -> str:
+ if self.declSpecs.trailingTypeSpec:
+ return 'typedef'
+ else:
+ return 'type'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.declSpecs.describe_signature(signode, 'markType', env, symbol)
+ if (self.decl.require_space_after_declSpecs() and
+ len(str(self.declSpecs)) > 0):
+ signode += addnodes.desc_sig_space()
+ # for parameters that don't really declare new names we get 'markType',
+ # this should not be propagated, but be 'noneIsName'.
+ if mode == 'markType':
+ mode = 'noneIsName'
+ self.decl.describe_signature(signode, mode, env, symbol)
+
+
+class ASTTypeWithInit(ASTBase):
+ def __init__(self, type: ASTType, init: ASTInitializer) -> None:
+ self.type = type
+ self.init = init
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.type.name
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return self.type.get_id(version, objectType, symbol)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.type))
+ if self.init:
+ res.append(transform(self.init))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.type.describe_signature(signode, mode, env, symbol)
+ if self.init:
+ self.init.describe_signature(signode, mode, env, symbol)
+
+
+class ASTMacroParameter(ASTBase):
+ def __init__(self, arg: ASTNestedName | None, ellipsis: bool = False,
+ variadic: bool = False) -> None:
+ self.arg = arg
+ self.ellipsis = ellipsis
+ self.variadic = variadic
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.ellipsis:
+ return '...'
+ elif self.variadic:
+ return transform(self.arg) + '...'
+ else:
+ return transform(self.arg)
+
+ def describe_signature(self, signode: Any, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.ellipsis:
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ elif self.variadic:
+ name = str(self)
+ signode += addnodes.desc_sig_name(name, name)
+ else:
+ self.arg.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTMacro(ASTBase):
+ def __init__(self, ident: ASTNestedName, args: list[ASTMacroParameter] | None) -> None:
+ self.ident = ident
+ self.args = args
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.ident
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.ident))
+ if self.args is not None:
+ res.append('(')
+ first = True
+ for arg in self.args:
+ if not first:
+ res.append(', ')
+ first = False
+ res.append(transform(arg))
+ res.append(')')
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.ident.describe_signature(signode, mode, env, symbol)
+ if self.args is None:
+ return
+ paramlist = addnodes.desc_parameterlist()
+ for arg in self.args:
+ param = addnodes.desc_parameter('', '', noemph=True)
+ arg.describe_signature(param, 'param', env, symbol=symbol)
+ paramlist += param
+ signode += paramlist
+
+
+class ASTStruct(ASTBase):
+ def __init__(self, name: ASTNestedName) -> None:
+ self.name = name
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.name)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.name.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTUnion(ASTBase):
+ def __init__(self, name: ASTNestedName) -> None:
+ self.name = name
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.name)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.name.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTEnum(ASTBase):
+ def __init__(self, name: ASTNestedName) -> None:
+ self.name = name
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.name)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.name.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTEnumerator(ASTBase):
+ def __init__(self, name: ASTNestedName, init: ASTInitializer | None,
+ attrs: ASTAttributeList) -> None:
+ self.name = name
+ self.init = init
+ self.attrs = attrs
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.name))
+ if len(self.attrs) != 0:
+ res.append(' ')
+ res.append(transform(self.attrs))
+ if self.init:
+ res.append(transform(self.init))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.name.describe_signature(signode, mode, env, symbol)
+ if len(self.attrs) != 0:
+ signode += addnodes.desc_sig_space()
+ self.attrs.describe_signature(signode)
+ if self.init:
+ self.init.describe_signature(signode, 'markType', env, symbol)
+
+
+class ASTDeclaration(ASTBaseBase):
+ def __init__(self, objectType: str, directiveType: str | None,
+ declaration: DeclarationType | ASTFunctionParameter,
+ semicolon: bool = False) -> None:
+ self.objectType = objectType
+ self.directiveType = directiveType
+ self.declaration = declaration
+ self.semicolon = semicolon
+
+ self.symbol: Symbol = None
+ # set by CObject._add_enumerator_to_parent
+ self.enumeratorScopedSymbol: Symbol = None
+
+ def clone(self) -> ASTDeclaration:
+ return ASTDeclaration(self.objectType, self.directiveType,
+ self.declaration.clone(), self.semicolon)
+
+ @property
+ def name(self) -> ASTNestedName:
+ decl = cast(DeclarationType, self.declaration)
+ return decl.name
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter] | None:
+ if self.objectType != 'function':
+ return None
+ decl = cast(ASTType, self.declaration)
+ return decl.function_params
+
+ def get_id(self, version: int, prefixed: bool = True) -> str:
+ if self.objectType == 'enumerator' and self.enumeratorScopedSymbol:
+ return self.enumeratorScopedSymbol.declaration.get_id(version, prefixed)
+ id_ = self.declaration.get_id(version, self.objectType, self.symbol)
+ if prefixed:
+ return _id_prefix[version] + id_
+ else:
+ return id_
+
+ def get_newest_id(self) -> str:
+ return self.get_id(_max_id, True)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = transform(self.declaration)
+ if self.semicolon:
+ res += ';'
+ return res
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, options: dict) -> None:
+ verify_description_mode(mode)
+ assert self.symbol
+ # The caller of the domain added a desc_signature node.
+ # Always enable multiline:
+ signode['is_multiline'] = True
+ # Put each line in a desc_signature_line node.
+ mainDeclNode = addnodes.desc_signature_line()
+ mainDeclNode.sphinx_line_type = 'declarator'
+ mainDeclNode['add_permalink'] = not self.symbol.isRedeclaration
+ signode += mainDeclNode
+
+ if self.objectType in {'member', 'function', 'macro'}:
+ pass
+ elif self.objectType == 'struct':
+ mainDeclNode += addnodes.desc_sig_keyword('struct', 'struct')
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType == 'union':
+ mainDeclNode += addnodes.desc_sig_keyword('union', 'union')
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType == 'enum':
+ mainDeclNode += addnodes.desc_sig_keyword('enum', 'enum')
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType == 'enumerator':
+ mainDeclNode += addnodes.desc_sig_keyword('enumerator', 'enumerator')
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType == 'type':
+ decl = cast(ASTType, self.declaration)
+ prefix = decl.get_type_declaration_prefix()
+ mainDeclNode += addnodes.desc_sig_keyword(prefix, prefix)
+ mainDeclNode += addnodes.desc_sig_space()
+ else:
+ raise AssertionError
+ self.declaration.describe_signature(mainDeclNode, mode, env, self.symbol)
+ if self.semicolon:
+ mainDeclNode += addnodes.desc_sig_punctuation(';', ';')
+
+
+class SymbolLookupResult:
+ def __init__(self, symbols: Iterator[Symbol], parentSymbol: Symbol,
+ ident: ASTIdentifier) -> None:
+ self.symbols = symbols
+ self.parentSymbol = parentSymbol
+ self.ident = ident
+
+
+class LookupKey:
+ def __init__(self, data: list[tuple[ASTIdentifier, str]]) -> None:
+ self.data = data
+
+ def __str__(self) -> str:
+ inner = ', '.join(f"({ident}, {id_})" for ident, id_ in self.data)
+ return f'[{inner}]'
+
+
+class Symbol:
+ debug_indent = 0
+ debug_indent_string = " "
+ debug_lookup = False
+ debug_show_tree = False
+
+ def __copy__(self):
+ raise AssertionError # shouldn't happen
+
+ def __deepcopy__(self, memo):
+ if self.parent:
+ raise AssertionError # shouldn't happen
+ # the domain base class makes a copy of the initial data, which is fine
+ return Symbol(None, None, None, None, None)
+
+ @staticmethod
+ def debug_print(*args: Any) -> None:
+ logger.debug(Symbol.debug_indent_string * Symbol.debug_indent, end="")
+ logger.debug(*args)
+
+ def _assert_invariants(self) -> None:
+ if not self.parent:
+ # parent == None means global scope, so declaration means a parent
+ assert not self.declaration
+ assert not self.docname
+ else:
+ if self.declaration:
+ assert self.docname
+
+ def __setattr__(self, key: str, value: Any) -> None:
+ if key == "children":
+ raise AssertionError
+ return super().__setattr__(key, value)
+
+ def __init__(
+ self,
+ parent: Symbol,
+ ident: ASTIdentifier,
+ declaration: ASTDeclaration | None,
+ docname: str | None,
+ line: int | None,
+ ) -> None:
+ self.parent = parent
+ # declarations in a single directive are linked together
+ self.siblingAbove: Symbol = None
+ self.siblingBelow: Symbol = None
+ self.ident = ident
+ self.declaration = declaration
+ self.docname = docname
+ self.line = line
+ self.isRedeclaration = False
+ self._assert_invariants()
+
+ # Remember to modify Symbol.remove if modifications to the parent change.
+ self._children: list[Symbol] = []
+ self._anonChildren: list[Symbol] = []
+ # note: _children includes _anonChildren
+ if self.parent:
+ self.parent._children.append(self)
+ if self.declaration:
+ self.declaration.symbol = self
+
+ # Do symbol addition after self._children has been initialised.
+ self._add_function_params()
+
+ def _fill_empty(self, declaration: ASTDeclaration, docname: str, line: int) -> None:
+ self._assert_invariants()
+ assert self.declaration is None
+ assert self.docname is None
+ assert self.line is None
+ assert declaration is not None
+ assert docname is not None
+ assert line is not None
+ self.declaration = declaration
+ self.declaration.symbol = self
+ self.docname = docname
+ self.line = line
+ self._assert_invariants()
+ # and symbol addition should be done as well
+ self._add_function_params()
+
+ def _add_function_params(self) -> None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_add_function_params:")
+ # Note: we may be called from _fill_empty, so the symbols we want
+ # to add may actually already be present (as empty symbols).
+
+ # add symbols for function parameters, if any
+ if self.declaration is not None and self.declaration.function_params is not None:
+ for p in self.declaration.function_params:
+ if p.arg is None:
+ continue
+ nn = p.arg.name
+ if nn is None:
+ continue
+ # (comparing to the template params: we have checked that we are a declaration)
+ decl = ASTDeclaration('functionParam', None, p)
+ assert not nn.rooted
+ assert len(nn.names) == 1
+ self._add_symbols(nn, decl, self.docname, self.line)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+
+ def remove(self) -> None:
+ if self.parent is None:
+ return
+ assert self in self.parent._children
+ self.parent._children.remove(self)
+ self.parent = None
+
+ def clear_doc(self, docname: str) -> None:
+ for sChild in self._children:
+ sChild.clear_doc(docname)
+ if sChild.declaration and sChild.docname == docname:
+ sChild.declaration = None
+ sChild.docname = None
+ sChild.line = None
+ if sChild.siblingAbove is not None:
+ sChild.siblingAbove.siblingBelow = sChild.siblingBelow
+ if sChild.siblingBelow is not None:
+ sChild.siblingBelow.siblingAbove = sChild.siblingAbove
+ sChild.siblingAbove = None
+ sChild.siblingBelow = None
+
+ def get_all_symbols(self) -> Iterator[Symbol]:
+ yield self
+ for sChild in self._children:
+ yield from sChild.get_all_symbols()
+
+ @property
+ def children(self) -> Iterator[Symbol]:
+ yield from self._children
+
+ @property
+ def children_recurse_anon(self) -> Iterator[Symbol]:
+ for c in self._children:
+ yield c
+ if not c.ident.is_anon():
+ continue
+ yield from c.children_recurse_anon
+
+ def get_lookup_key(self) -> LookupKey:
+ # The pickle files for the environment and for each document are distinct.
+ # The environment has all the symbols, but the documents has xrefs that
+ # must know their scope. A lookup key is essentially a specification of
+ # how to find a specific symbol.
+ symbols = []
+ s = self
+ while s.parent:
+ symbols.append(s)
+ s = s.parent
+ symbols.reverse()
+ key = []
+ for s in symbols:
+ if s.declaration is not None:
+ # TODO: do we need the ID?
+ key.append((s.ident, s.declaration.get_newest_id()))
+ else:
+ key.append((s.ident, None))
+ return LookupKey(key)
+
+ def get_full_nested_name(self) -> ASTNestedName:
+ symbols = []
+ s = self
+ while s.parent:
+ symbols.append(s)
+ s = s.parent
+ symbols.reverse()
+ names = []
+ for s in symbols:
+ names.append(s.ident)
+ return ASTNestedName(names, rooted=False)
+
+ def _find_first_named_symbol(self, ident: ASTIdentifier,
+ matchSelf: bool, recurseInAnon: bool) -> Symbol | None:
+ # TODO: further simplification from C++ to C
+ if Symbol.debug_lookup:
+ Symbol.debug_print("_find_first_named_symbol ->")
+ res = self._find_named_symbols(ident, matchSelf, recurseInAnon,
+ searchInSiblings=False)
+ try:
+ return next(res)
+ except StopIteration:
+ return None
+
+ def _find_named_symbols(self, ident: ASTIdentifier,
+ matchSelf: bool, recurseInAnon: bool,
+ searchInSiblings: bool) -> Iterator[Symbol]:
+ # TODO: further simplification from C++ to C
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_find_named_symbols:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("self:")
+ logger.debug(self.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_print("ident: ", ident)
+ Symbol.debug_print("matchSelf: ", matchSelf)
+ Symbol.debug_print("recurseInAnon: ", recurseInAnon)
+ Symbol.debug_print("searchInSiblings: ", searchInSiblings)
+
+ def candidates() -> Generator[Symbol, None, None]:
+ s = self
+ if Symbol.debug_lookup:
+ Symbol.debug_print("searching in self:")
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+ while True:
+ if matchSelf:
+ yield s
+ if recurseInAnon:
+ yield from s.children_recurse_anon
+ else:
+ yield from s._children
+
+ if s.siblingAbove is None:
+ break
+ s = s.siblingAbove
+ if Symbol.debug_lookup:
+ Symbol.debug_print("searching in sibling:")
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+
+ for s in candidates():
+ if Symbol.debug_lookup:
+ Symbol.debug_print("candidate:")
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+ if s.ident == ident:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("matches")
+ Symbol.debug_indent -= 3
+ yield s
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 2
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+
+ def _symbol_lookup(
+ self,
+ nestedName: ASTNestedName,
+ onMissingQualifiedSymbol: Callable[[Symbol, ASTIdentifier], Symbol | None],
+ ancestorLookupType: str | None,
+ matchSelf: bool,
+ recurseInAnon: bool,
+ searchInSiblings: bool,
+ ) -> SymbolLookupResult | None:
+ # TODO: further simplification from C++ to C
+ # ancestorLookupType: if not None, specifies the target type of the lookup
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_symbol_lookup:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("self:")
+ logger.debug(self.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_print("nestedName: ", nestedName)
+ Symbol.debug_print("ancestorLookupType:", ancestorLookupType)
+ Symbol.debug_print("matchSelf: ", matchSelf)
+ Symbol.debug_print("recurseInAnon: ", recurseInAnon)
+ Symbol.debug_print("searchInSiblings: ", searchInSiblings)
+
+ names = nestedName.names
+
+ # find the right starting point for lookup
+ parentSymbol = self
+ if nestedName.rooted:
+ while parentSymbol.parent:
+ parentSymbol = parentSymbol.parent
+ if ancestorLookupType is not None:
+ # walk up until we find the first identifier
+ firstName = names[0]
+ while parentSymbol.parent:
+ if parentSymbol.find_identifier(firstName,
+ matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon,
+ searchInSiblings=searchInSiblings):
+ break
+ parentSymbol = parentSymbol.parent
+
+ if Symbol.debug_lookup:
+ Symbol.debug_print("starting point:")
+ logger.debug(parentSymbol.to_string(Symbol.debug_indent + 1), end="")
+
+ # and now the actual lookup
+ for ident in names[:-1]:
+ symbol = parentSymbol._find_first_named_symbol(
+ ident, matchSelf=matchSelf, recurseInAnon=recurseInAnon)
+ if symbol is None:
+ symbol = onMissingQualifiedSymbol(parentSymbol, ident)
+ if symbol is None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return None
+ # We have now matched part of a nested name, and need to match more
+ # so even if we should matchSelf before, we definitely shouldn't
+ # even more. (see also issue #2666)
+ matchSelf = False
+ parentSymbol = symbol
+
+ if Symbol.debug_lookup:
+ Symbol.debug_print("handle last name from:")
+ logger.debug(parentSymbol.to_string(Symbol.debug_indent + 1), end="")
+
+ # handle the last name
+ ident = names[-1]
+
+ symbols = parentSymbol._find_named_symbols(
+ ident, matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon,
+ searchInSiblings=searchInSiblings)
+ if Symbol.debug_lookup:
+ symbols = list(symbols) # type: ignore[assignment]
+ Symbol.debug_indent -= 2
+ return SymbolLookupResult(symbols, parentSymbol, ident)
+
+ def _add_symbols(
+ self,
+ nestedName: ASTNestedName,
+ declaration: ASTDeclaration | None,
+ docname: str | None,
+ line: int | None,
+ ) -> Symbol:
+ # TODO: further simplification from C++ to C
+ # Used for adding a whole path of symbols, where the last may or may not
+ # be an actual declaration.
+
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_add_symbols:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("nn: ", nestedName)
+ Symbol.debug_print("decl: ", declaration)
+ Symbol.debug_print(f"location: {docname}:{line}")
+
+ def onMissingQualifiedSymbol(parentSymbol: Symbol, ident: ASTIdentifier) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_add_symbols, onMissingQualifiedSymbol:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("ident: ", ident)
+ Symbol.debug_indent -= 2
+ return Symbol(parent=parentSymbol, ident=ident,
+ declaration=None, docname=None, line=None)
+
+ lookupResult = self._symbol_lookup(nestedName,
+ onMissingQualifiedSymbol,
+ ancestorLookupType=None,
+ matchSelf=False,
+ recurseInAnon=False,
+ searchInSiblings=False)
+ assert lookupResult is not None # we create symbols all the way, so that can't happen
+ symbols = list(lookupResult.symbols)
+ if len(symbols) == 0:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("_add_symbols, result, no symbol:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("ident: ", lookupResult.ident)
+ Symbol.debug_print("declaration: ", declaration)
+ Symbol.debug_print(f"location: {docname}:{line}")
+ Symbol.debug_indent -= 1
+ symbol = Symbol(parent=lookupResult.parentSymbol,
+ ident=lookupResult.ident,
+ declaration=declaration,
+ docname=docname, line=line)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return symbol
+
+ if Symbol.debug_lookup:
+ Symbol.debug_print("_add_symbols, result, symbols:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("number symbols:", len(symbols))
+ Symbol.debug_indent -= 1
+
+ if not declaration:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("no declaration")
+ Symbol.debug_indent -= 2
+ # good, just a scope creation
+ # TODO: what if we have more than one symbol?
+ return symbols[0]
+
+ noDecl = []
+ withDecl = []
+ dupDecl = []
+ for s in symbols:
+ if s.declaration is None:
+ noDecl.append(s)
+ elif s.isRedeclaration:
+ dupDecl.append(s)
+ else:
+ withDecl.append(s)
+ if Symbol.debug_lookup:
+ Symbol.debug_print("#noDecl: ", len(noDecl))
+ Symbol.debug_print("#withDecl:", len(withDecl))
+ Symbol.debug_print("#dupDecl: ", len(dupDecl))
+
+ # With partial builds we may start with a large symbol tree stripped of declarations.
+ # Essentially any combination of noDecl, withDecl, and dupDecls seems possible.
+ # TODO: make partial builds fully work. What should happen when the primary symbol gets
+ # deleted, and other duplicates exist? The full document should probably be rebuild.
+
+ # First check if one of those with a declaration matches.
+ # If it's a function, we need to compare IDs,
+ # otherwise there should be only one symbol with a declaration.
+ def makeCandSymbol() -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("begin: creating candidate symbol")
+ symbol = Symbol(parent=lookupResult.parentSymbol,
+ ident=lookupResult.ident,
+ declaration=declaration,
+ docname=docname, line=line)
+ if Symbol.debug_lookup:
+ Symbol.debug_print("end: creating candidate symbol")
+ return symbol
+
+ if len(withDecl) == 0:
+ candSymbol = None
+ else:
+ candSymbol = makeCandSymbol()
+
+ def handleDuplicateDeclaration(symbol: Symbol, candSymbol: Symbol) -> None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("redeclaration")
+ Symbol.debug_indent -= 1
+ Symbol.debug_indent -= 2
+ # Redeclaration of the same symbol.
+ # Let the new one be there, but raise an error to the client
+ # so it can use the real symbol as subscope.
+ # This will probably result in a duplicate id warning.
+ candSymbol.isRedeclaration = True
+ raise _DuplicateSymbolError(symbol, declaration)
+
+ if declaration.objectType != "function":
+ assert len(withDecl) <= 1
+ handleDuplicateDeclaration(withDecl[0], candSymbol)
+ # (not reachable)
+
+ # a function, so compare IDs
+ candId = declaration.get_newest_id()
+ if Symbol.debug_lookup:
+ Symbol.debug_print("candId:", candId)
+ for symbol in withDecl:
+ oldId = symbol.declaration.get_newest_id()
+ if Symbol.debug_lookup:
+ Symbol.debug_print("oldId: ", oldId)
+ if candId == oldId:
+ handleDuplicateDeclaration(symbol, candSymbol)
+ # (not reachable)
+ # no candidate symbol found with matching ID
+ # if there is an empty symbol, fill that one
+ if len(noDecl) == 0:
+ if Symbol.debug_lookup:
+ Symbol.debug_print(
+ "no match, no empty, candSybmol is not None?:", candSymbol is not None,
+ )
+ Symbol.debug_indent -= 2
+ if candSymbol is not None:
+ return candSymbol
+ else:
+ return makeCandSymbol()
+ else:
+ if Symbol.debug_lookup:
+ Symbol.debug_print(
+ "no match, but fill an empty declaration, candSybmol is not None?:",
+ candSymbol is not None)
+ Symbol.debug_indent -= 2
+ if candSymbol is not None:
+ candSymbol.remove()
+ # assert len(noDecl) == 1
+ # TODO: enable assertion when we at some point find out how to do cleanup
+ # for now, just take the first one, it should work fine ... right?
+ symbol = noDecl[0]
+ # If someone first opened the scope, and then later
+ # declares it, e.g,
+ # .. namespace:: Test
+ # .. namespace:: nullptr
+ # .. class:: Test
+ symbol._fill_empty(declaration, docname, line)
+ return symbol
+
+ def merge_with(self, other: Symbol, docnames: list[str],
+ env: BuildEnvironment) -> None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("merge_with:")
+ assert other is not None
+ for otherChild in other._children:
+ ourChild = self._find_first_named_symbol(
+ ident=otherChild.ident, matchSelf=False,
+ recurseInAnon=False)
+ if ourChild is None:
+ # TODO: hmm, should we prune by docnames?
+ self._children.append(otherChild)
+ otherChild.parent = self
+ otherChild._assert_invariants()
+ continue
+ if otherChild.declaration and otherChild.docname in docnames:
+ if not ourChild.declaration:
+ ourChild._fill_empty(otherChild.declaration,
+ otherChild.docname, otherChild.line)
+ elif ourChild.docname != otherChild.docname:
+ name = str(ourChild.declaration)
+ msg = __("Duplicate C declaration, also defined at %s:%s.\n"
+ "Declaration is '.. c:%s:: %s'.")
+ msg = msg % (ourChild.docname, ourChild.line,
+ ourChild.declaration.directiveType, name)
+ logger.warning(msg, location=(otherChild.docname, otherChild.line))
+ else:
+ # Both have declarations, and in the same docname.
+ # This can apparently happen, it should be safe to
+ # just ignore it, right?
+ pass
+ ourChild.merge_with(otherChild, docnames, env)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+
+ def add_name(self, nestedName: ASTNestedName) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("add_name:")
+ res = self._add_symbols(nestedName, declaration=None, docname=None, line=None)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ return res
+
+ def add_declaration(self, declaration: ASTDeclaration,
+ docname: str, line: int) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("add_declaration:")
+ assert declaration is not None
+ assert docname is not None
+ assert line is not None
+ nestedName = declaration.name
+ res = self._add_symbols(nestedName, declaration, docname, line)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ return res
+
+ def find_identifier(self, ident: ASTIdentifier,
+ matchSelf: bool, recurseInAnon: bool, searchInSiblings: bool,
+ ) -> Symbol | None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("find_identifier:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("ident: ", ident)
+ Symbol.debug_print("matchSelf: ", matchSelf)
+ Symbol.debug_print("recurseInAnon: ", recurseInAnon)
+ Symbol.debug_print("searchInSiblings:", searchInSiblings)
+ logger.debug(self.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_indent -= 2
+ current = self
+ while current is not None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 2
+ Symbol.debug_print("trying:")
+ logger.debug(current.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_indent -= 2
+ if matchSelf and current.ident == ident:
+ return current
+ children = current.children_recurse_anon if recurseInAnon else current._children
+ for s in children:
+ if s.ident == ident:
+ return s
+ if not searchInSiblings:
+ break
+ current = current.siblingAbove
+ return None
+
+ def direct_lookup(self, key: LookupKey) -> Symbol | None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("direct_lookup:")
+ Symbol.debug_indent += 1
+ s = self
+ for name, id_ in key.data:
+ res = None
+ for cand in s._children:
+ if cand.ident == name:
+ res = cand
+ break
+ s = res
+ if Symbol.debug_lookup:
+ Symbol.debug_print("name: ", name)
+ Symbol.debug_print("id: ", id_)
+ if s is not None:
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+ else:
+ Symbol.debug_print("not found")
+ if s is None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return None
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return s
+
+ def find_declaration(self, nestedName: ASTNestedName, typ: str,
+ matchSelf: bool, recurseInAnon: bool) -> Symbol | None:
+ # templateShorthand: missing template parameter lists for templates is ok
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("find_declaration:")
+
+ def onMissingQualifiedSymbol(
+ parentSymbol: Symbol,
+ ident: ASTIdentifier,
+ ) -> Symbol | None:
+ return None
+
+ lookupResult = self._symbol_lookup(nestedName,
+ onMissingQualifiedSymbol,
+ ancestorLookupType=typ,
+ matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon,
+ searchInSiblings=False)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ if lookupResult is None:
+ return None
+
+ symbols = list(lookupResult.symbols)
+ if len(symbols) == 0:
+ return None
+ return symbols[0]
+
+ def to_string(self, indent: int) -> str:
+ res = [Symbol.debug_indent_string * indent]
+ if not self.parent:
+ res.append('::')
+ else:
+ if self.ident:
+ res.append(str(self.ident))
+ else:
+ res.append(str(self.declaration))
+ if self.declaration:
+ res.append(": ")
+ if self.isRedeclaration:
+ res.append('!!duplicate!! ')
+ res.append(str(self.declaration))
+ if self.docname:
+ res.append('\t(')
+ res.append(self.docname)
+ res.append(')')
+ res.append('\n')
+ return ''.join(res)
+
+ def dump(self, indent: int) -> str:
+ res = [self.to_string(indent)]
+ for c in self._children:
+ res.append(c.dump(indent + 1))
+ return ''.join(res)
+
+
+class DefinitionParser(BaseParser):
+ @property
+ def language(self) -> str:
+ return 'C'
+
+ @property
+ def id_attributes(self):
+ return self.config.c_id_attributes
+
+ @property
+ def paren_attributes(self):
+ return self.config.c_paren_attributes
+
+ def _parse_string(self) -> str | None:
+ if self.current_char != '"':
+ return None
+ startPos = self.pos
+ self.pos += 1
+ escape = False
+ while True:
+ if self.eof:
+ self.fail("Unexpected end during inside string.")
+ elif self.current_char == '"' and not escape:
+ self.pos += 1
+ break
+ elif self.current_char == '\\':
+ escape = True
+ else:
+ escape = False
+ self.pos += 1
+ return self.definition[startPos:self.pos]
+
+ def _parse_literal(self) -> ASTLiteral | None:
+ # -> integer-literal
+ # | character-literal
+ # | floating-literal
+ # | string-literal
+ # | boolean-literal -> "false" | "true"
+ self.skip_ws()
+ if self.skip_word('true'):
+ return ASTBooleanLiteral(True)
+ if self.skip_word('false'):
+ return ASTBooleanLiteral(False)
+ pos = self.pos
+ if self.match(float_literal_re):
+ self.match(float_literal_suffix_re)
+ return ASTNumberLiteral(self.definition[pos:self.pos])
+ for regex in [binary_literal_re, hex_literal_re,
+ integer_literal_re, octal_literal_re]:
+ if self.match(regex):
+ self.match(integers_literal_suffix_re)
+ return ASTNumberLiteral(self.definition[pos:self.pos])
+
+ string = self._parse_string()
+ if string is not None:
+ return ASTStringLiteral(string)
+
+ # character-literal
+ if self.match(char_literal_re):
+ prefix = self.last_match.group(1) # may be None when no prefix
+ data = self.last_match.group(2)
+ try:
+ return ASTCharLiteral(prefix, data)
+ except UnicodeDecodeError as e:
+ self.fail("Can not handle character literal. Internal error was: %s" % e)
+ except UnsupportedMultiCharacterCharLiteral:
+ self.fail("Can not handle character literal"
+ " resulting in multiple decoded characters.")
+ return None
+
+ def _parse_paren_expression(self) -> ASTExpression | None:
+ # "(" expression ")"
+ if self.current_char != '(':
+ return None
+ self.pos += 1
+ res = self._parse_expression()
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expected ')' in end of parenthesized expression.")
+ return ASTParenExpr(res)
+
+ def _parse_primary_expression(self) -> ASTExpression | None:
+ # literal
+ # "(" expression ")"
+ # id-expression -> we parse this with _parse_nested_name
+ self.skip_ws()
+ res: ASTExpression | None = self._parse_literal()
+ if res is not None:
+ return res
+ res = self._parse_paren_expression()
+ if res is not None:
+ return res
+ nn = self._parse_nested_name()
+ if nn is not None:
+ return ASTIdExpression(nn)
+ return None
+
+ def _parse_initializer_list(self, name: str, open: str, close: str,
+ ) -> tuple[list[ASTExpression], bool]:
+ # Parse open and close with the actual initializer-list in between
+ # -> initializer-clause '...'[opt]
+ # | initializer-list ',' initializer-clause '...'[opt]
+ # TODO: designators
+ self.skip_ws()
+ if not self.skip_string_and_ws(open):
+ return None, None
+ if self.skip_string(close):
+ return [], False
+
+ exprs = []
+ trailingComma = False
+ while True:
+ self.skip_ws()
+ expr = self._parse_expression()
+ self.skip_ws()
+ exprs.append(expr)
+ self.skip_ws()
+ if self.skip_string(close):
+ break
+ if not self.skip_string_and_ws(','):
+ self.fail(f"Error in {name}, expected ',' or '{close}'.")
+ if self.current_char == close and close == '}':
+ self.pos += 1
+ trailingComma = True
+ break
+ return exprs, trailingComma
+
+ def _parse_paren_expression_list(self) -> ASTParenExprList | None:
+ # -> '(' expression-list ')'
+ # though, we relax it to also allow empty parens
+ # as it's needed in some cases
+ #
+ # expression-list
+ # -> initializer-list
+ exprs, trailingComma = self._parse_initializer_list("parenthesized expression-list",
+ '(', ')')
+ if exprs is None:
+ return None
+ return ASTParenExprList(exprs)
+
+ def _parse_braced_init_list(self) -> ASTBracedInitList | None:
+ # -> '{' initializer-list ','[opt] '}'
+ # | '{' '}'
+ exprs, trailingComma = self._parse_initializer_list("braced-init-list", '{', '}')
+ if exprs is None:
+ return None
+ return ASTBracedInitList(exprs, trailingComma)
+
+ def _parse_postfix_expression(self) -> ASTPostfixExpr:
+ # -> primary
+ # | postfix "[" expression "]"
+ # | postfix "[" braced-init-list [opt] "]"
+ # | postfix "(" expression-list [opt] ")"
+ # | postfix "." id-expression // taken care of in primary by nested name
+ # | postfix "->" id-expression
+ # | postfix "++"
+ # | postfix "--"
+
+ prefix = self._parse_primary_expression()
+
+ # and now parse postfixes
+ postFixes: list[ASTPostfixOp] = []
+ while True:
+ self.skip_ws()
+ if self.skip_string_and_ws('['):
+ expr = self._parse_expression()
+ self.skip_ws()
+ if not self.skip_string(']'):
+ self.fail("Expected ']' in end of postfix expression.")
+ postFixes.append(ASTPostfixArray(expr))
+ continue
+ if self.skip_string('->'):
+ if self.skip_string('*'):
+ # don't steal the arrow
+ self.pos -= 3
+ else:
+ name = self._parse_nested_name()
+ postFixes.append(ASTPostfixMemberOfPointer(name))
+ continue
+ if self.skip_string('++'):
+ postFixes.append(ASTPostfixInc())
+ continue
+ if self.skip_string('--'):
+ postFixes.append(ASTPostfixDec())
+ continue
+ lst = self._parse_paren_expression_list()
+ if lst is not None:
+ postFixes.append(ASTPostfixCallExpr(lst))
+ continue
+ break
+ return ASTPostfixExpr(prefix, postFixes)
+
+ def _parse_unary_expression(self) -> ASTExpression:
+ # -> postfix
+ # | "++" cast
+ # | "--" cast
+ # | unary-operator cast -> (* | & | + | - | ! | ~) cast
+ # The rest:
+ # | "sizeof" unary
+ # | "sizeof" "(" type-id ")"
+ # | "alignof" "(" type-id ")"
+ self.skip_ws()
+ for op in _expression_unary_ops:
+ # TODO: hmm, should we be able to backtrack here?
+ if op[0] in 'cn':
+ res = self.skip_word(op)
+ else:
+ res = self.skip_string(op)
+ if res:
+ expr = self._parse_cast_expression()
+ return ASTUnaryOpExpr(op, expr)
+ if self.skip_word_and_ws('sizeof'):
+ if self.skip_string_and_ws('('):
+ typ = self._parse_type(named=False)
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expecting ')' to end 'sizeof'.")
+ return ASTSizeofType(typ)
+ expr = self._parse_unary_expression()
+ return ASTSizeofExpr(expr)
+ if self.skip_word_and_ws('alignof'):
+ if not self.skip_string_and_ws('('):
+ self.fail("Expecting '(' after 'alignof'.")
+ typ = self._parse_type(named=False)
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expecting ')' to end 'alignof'.")
+ return ASTAlignofExpr(typ)
+ return self._parse_postfix_expression()
+
+ def _parse_cast_expression(self) -> ASTExpression:
+ # -> unary | "(" type-id ")" cast
+ pos = self.pos
+ self.skip_ws()
+ if self.skip_string('('):
+ try:
+ typ = self._parse_type(False)
+ if not self.skip_string(')'):
+ self.fail("Expected ')' in cast expression.")
+ expr = self._parse_cast_expression()
+ return ASTCastExpr(typ, expr)
+ except DefinitionError as exCast:
+ self.pos = pos
+ try:
+ return self._parse_unary_expression()
+ except DefinitionError as exUnary:
+ errs = []
+ errs.append((exCast, "If type cast expression"))
+ errs.append((exUnary, "If unary expression"))
+ raise self._make_multi_error(errs,
+ "Error in cast expression.") from exUnary
+ else:
+ return self._parse_unary_expression()
+
+ def _parse_logical_or_expression(self) -> ASTExpression:
+ # logical-or = logical-and ||
+ # logical-and = inclusive-or &&
+ # inclusive-or = exclusive-or |
+ # exclusive-or = and ^
+ # and = equality &
+ # equality = relational ==, !=
+ # relational = shift <, >, <=, >=
+ # shift = additive <<, >>
+ # additive = multiplicative +, -
+ # multiplicative = pm *, /, %
+ # pm = cast .*, ->*
+ def _parse_bin_op_expr(self, opId):
+ if opId + 1 == len(_expression_bin_ops):
+ def parser() -> ASTExpression:
+ return self._parse_cast_expression()
+ else:
+ def parser() -> ASTExpression:
+ return _parse_bin_op_expr(self, opId + 1)
+ exprs = []
+ ops = []
+ exprs.append(parser())
+ while True:
+ self.skip_ws()
+ pos = self.pos
+ oneMore = False
+ for op in _expression_bin_ops[opId]:
+ if op[0] in 'abcnox':
+ if not self.skip_word(op):
+ continue
+ else:
+ if not self.skip_string(op):
+ continue
+ if op == '&' and self.current_char == '&':
+ # don't split the && 'token'
+ self.pos -= 1
+ # and btw. && has lower precedence, so we are done
+ break
+ try:
+ expr = parser()
+ exprs.append(expr)
+ ops.append(op)
+ oneMore = True
+ break
+ except DefinitionError:
+ self.pos = pos
+ if not oneMore:
+ break
+ return ASTBinOpExpr(exprs, ops)
+ return _parse_bin_op_expr(self, 0)
+
+ def _parse_conditional_expression_tail(self, orExprHead: Any) -> ASTExpression | None:
+ # -> "?" expression ":" assignment-expression
+ return None
+
+ def _parse_assignment_expression(self) -> ASTExpression:
+ # -> conditional-expression
+ # | logical-or-expression assignment-operator initializer-clause
+ # -> conditional-expression ->
+ # logical-or-expression
+ # | logical-or-expression "?" expression ":" assignment-expression
+ # | logical-or-expression assignment-operator initializer-clause
+ exprs = []
+ ops = []
+ orExpr = self._parse_logical_or_expression()
+ exprs.append(orExpr)
+ # TODO: handle ternary with _parse_conditional_expression_tail
+ while True:
+ oneMore = False
+ self.skip_ws()
+ for op in _expression_assignment_ops:
+ if op[0] in 'abcnox':
+ if not self.skip_word(op):
+ continue
+ else:
+ if not self.skip_string(op):
+ continue
+ expr = self._parse_logical_or_expression()
+ exprs.append(expr)
+ ops.append(op)
+ oneMore = True
+ if not oneMore:
+ break
+ return ASTAssignmentExpr(exprs, ops)
+
+ def _parse_constant_expression(self) -> ASTExpression:
+ # -> conditional-expression
+ orExpr = self._parse_logical_or_expression()
+ # TODO: use _parse_conditional_expression_tail
+ return orExpr
+
+ def _parse_expression(self) -> ASTExpression:
+ # -> assignment-expression
+ # | expression "," assignment-expression
+ # TODO: actually parse the second production
+ return self._parse_assignment_expression()
+
+ def _parse_expression_fallback(
+ self, end: list[str],
+ parser: Callable[[], ASTExpression],
+ allow: bool = True) -> ASTExpression:
+ # Stupidly "parse" an expression.
+ # 'end' should be a list of characters which ends the expression.
+
+ # first try to use the provided parser
+ prevPos = self.pos
+ try:
+ return parser()
+ except DefinitionError as e:
+ # some places (e.g., template parameters) we really don't want to use fallback,
+ # and for testing we may want to globally disable it
+ if not allow or not self.allowFallbackExpressionParsing:
+ raise
+ self.warn("Parsing of expression failed. Using fallback parser."
+ " Error was:\n%s" % e)
+ self.pos = prevPos
+ # and then the fallback scanning
+ assert end is not None
+ self.skip_ws()
+ startPos = self.pos
+ if self.match(_string_re):
+ value = self.matched_text
+ else:
+ # TODO: add handling of more bracket-like things, and quote handling
+ brackets = {'(': ')', '{': '}', '[': ']'}
+ symbols: list[str] = []
+ while not self.eof:
+ if (len(symbols) == 0 and self.current_char in end):
+ break
+ if self.current_char in brackets:
+ symbols.append(brackets[self.current_char])
+ elif len(symbols) > 0 and self.current_char == symbols[-1]:
+ symbols.pop()
+ self.pos += 1
+ if len(end) > 0 and self.eof:
+ self.fail("Could not find end of expression starting at %d."
+ % startPos)
+ value = self.definition[startPos:self.pos].strip()
+ return ASTFallbackExpr(value.strip())
+
+ def _parse_nested_name(self) -> ASTNestedName:
+ names: list[Any] = []
+
+ self.skip_ws()
+ rooted = False
+ if self.skip_string('.'):
+ rooted = True
+ while 1:
+ self.skip_ws()
+ if not self.match(identifier_re):
+ self.fail("Expected identifier in nested name.")
+ identifier = self.matched_text
+ # make sure there isn't a keyword
+ if identifier in _keywords:
+ self.fail("Expected identifier in nested name, "
+ "got keyword: %s" % identifier)
+ if self.matched_text in self.config.c_extra_keywords:
+ msg = "Expected identifier, got user-defined keyword: %s." \
+ + " Remove it from c_extra_keywords to allow it as identifier.\n" \
+ + "Currently c_extra_keywords is %s."
+ self.fail(msg % (self.matched_text,
+ str(self.config.c_extra_keywords)))
+ ident = ASTIdentifier(identifier)
+ names.append(ident)
+
+ self.skip_ws()
+ if not self.skip_string('.'):
+ break
+ return ASTNestedName(names, rooted)
+
+ def _parse_simple_type_specifier(self) -> str | None:
+ if self.match(_simple_type_specifiers_re):
+ return self.matched_text
+ for t in ('bool', 'complex', 'imaginary'):
+ if t in self.config.c_extra_keywords:
+ if self.skip_word(t):
+ return t
+ return None
+
+ def _parse_simple_type_specifiers(self) -> ASTTrailingTypeSpecFundamental | None:
+ names: list[str] = []
+
+ self.skip_ws()
+ while True:
+ t = self._parse_simple_type_specifier()
+ if t is None:
+ break
+ names.append(t)
+ self.skip_ws()
+ if len(names) == 0:
+ return None
+ return ASTTrailingTypeSpecFundamental(names)
+
+ def _parse_trailing_type_spec(self) -> ASTTrailingTypeSpec:
+ # fundamental types, https://en.cppreference.com/w/c/language/type
+ # and extensions
+ self.skip_ws()
+ res = self._parse_simple_type_specifiers()
+ if res is not None:
+ return res
+
+ # prefixed
+ prefix = None
+ self.skip_ws()
+ for k in ('struct', 'enum', 'union'):
+ if self.skip_word_and_ws(k):
+ prefix = k
+ break
+
+ nestedName = self._parse_nested_name()
+ return ASTTrailingTypeSpecName(prefix, nestedName)
+
+ def _parse_parameters(self, paramMode: str) -> ASTParameters | None:
+ self.skip_ws()
+ if not self.skip_string('('):
+ if paramMode == 'function':
+ self.fail('Expecting "(" in parameters.')
+ else:
+ return None
+
+ args = []
+ self.skip_ws()
+ if not self.skip_string(')'):
+ while 1:
+ self.skip_ws()
+ if self.skip_string('...'):
+ args.append(ASTFunctionParameter(None, True))
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail('Expected ")" after "..." in parameters.')
+ break
+ # note: it seems that function arguments can always be named,
+ # even in function pointers and similar.
+ arg = self._parse_type_with_init(outer=None, named='single')
+ # TODO: parse default parameters # TODO: didn't we just do that?
+ args.append(ASTFunctionParameter(arg))
+
+ self.skip_ws()
+ if self.skip_string(','):
+ continue
+ if self.skip_string(')'):
+ break
+ self.fail(f'Expecting "," or ")" in parameters, got "{self.current_char}".')
+
+ attrs = self._parse_attribute_list()
+ return ASTParameters(args, attrs)
+
+ def _parse_decl_specs_simple(
+ self, outer: str | None, typed: bool,
+ ) -> ASTDeclSpecsSimple:
+ """Just parse the simple ones."""
+ storage = None
+ threadLocal = None
+ inline = None
+ restrict = None
+ volatile = None
+ const = None
+ attrs = []
+ while 1: # accept any permutation of a subset of some decl-specs
+ self.skip_ws()
+ if not storage:
+ if outer == 'member':
+ if self.skip_word('auto'):
+ storage = 'auto'
+ continue
+ if self.skip_word('register'):
+ storage = 'register'
+ continue
+ if outer in ('member', 'function'):
+ if self.skip_word('static'):
+ storage = 'static'
+ continue
+ if self.skip_word('extern'):
+ storage = 'extern'
+ continue
+ if outer == 'member' and not threadLocal:
+ if self.skip_word('thread_local'):
+ threadLocal = 'thread_local'
+ continue
+ if self.skip_word('_Thread_local'):
+ threadLocal = '_Thread_local'
+ continue
+ if outer == 'function' and not inline:
+ inline = self.skip_word('inline')
+ if inline:
+ continue
+
+ if not restrict and typed:
+ restrict = self.skip_word('restrict')
+ if restrict:
+ continue
+ if not volatile and typed:
+ volatile = self.skip_word('volatile')
+ if volatile:
+ continue
+ if not const and typed:
+ const = self.skip_word('const')
+ if const:
+ continue
+ attr = self._parse_attribute()
+ if attr:
+ attrs.append(attr)
+ continue
+ break
+ return ASTDeclSpecsSimple(storage, threadLocal, inline,
+ restrict, volatile, const, ASTAttributeList(attrs))
+
+ def _parse_decl_specs(self, outer: str | None, typed: bool = True) -> ASTDeclSpecs:
+ if outer:
+ if outer not in ('type', 'member', 'function'):
+ raise Exception('Internal error, unknown outer "%s".' % outer)
+ leftSpecs = self._parse_decl_specs_simple(outer, typed)
+ rightSpecs = None
+
+ if typed:
+ trailing = self._parse_trailing_type_spec()
+ rightSpecs = self._parse_decl_specs_simple(outer, typed)
+ else:
+ trailing = None
+ return ASTDeclSpecs(outer, leftSpecs, rightSpecs, trailing)
+
+ def _parse_declarator_name_suffix(
+ self, named: bool | str, paramMode: str, typed: bool,
+ ) -> ASTDeclarator:
+ assert named in (True, False, 'single')
+ # now we should parse the name, and then suffixes
+ if named == 'single':
+ if self.match(identifier_re):
+ if self.matched_text in _keywords:
+ self.fail("Expected identifier, "
+ "got keyword: %s" % self.matched_text)
+ if self.matched_text in self.config.c_extra_keywords:
+ msg = "Expected identifier, got user-defined keyword: %s." \
+ + " Remove it from c_extra_keywords to allow it as identifier.\n" \
+ + "Currently c_extra_keywords is %s."
+ self.fail(msg % (self.matched_text,
+ str(self.config.c_extra_keywords)))
+ identifier = ASTIdentifier(self.matched_text)
+ declId = ASTNestedName([identifier], rooted=False)
+ else:
+ declId = None
+ elif named:
+ declId = self._parse_nested_name()
+ else:
+ declId = None
+ arrayOps = []
+ while 1:
+ self.skip_ws()
+ if typed and self.skip_string('['):
+ self.skip_ws()
+ static = False
+ const = False
+ volatile = False
+ restrict = False
+ while True:
+ if not static:
+ if self.skip_word_and_ws('static'):
+ static = True
+ continue
+ if not const:
+ if self.skip_word_and_ws('const'):
+ const = True
+ continue
+ if not volatile:
+ if self.skip_word_and_ws('volatile'):
+ volatile = True
+ continue
+ if not restrict:
+ if self.skip_word_and_ws('restrict'):
+ restrict = True
+ continue
+ break
+ vla = False if static else self.skip_string_and_ws('*')
+ if vla:
+ if not self.skip_string(']'):
+ self.fail("Expected ']' in end of array operator.")
+ size = None
+ else:
+ if self.skip_string(']'):
+ size = None
+ else:
+
+ def parser():
+ return self._parse_expression()
+ size = self._parse_expression_fallback([']'], parser)
+ self.skip_ws()
+ if not self.skip_string(']'):
+ self.fail("Expected ']' in end of array operator.")
+ arrayOps.append(ASTArray(static, const, volatile, restrict, vla, size))
+ else:
+ break
+ param = self._parse_parameters(paramMode)
+ if param is None and len(arrayOps) == 0:
+ # perhaps a bit-field
+ if named and paramMode == 'type' and typed:
+ self.skip_ws()
+ if self.skip_string(':'):
+ size = self._parse_constant_expression()
+ return ASTDeclaratorNameBitField(declId=declId, size=size)
+ return ASTDeclaratorNameParam(declId=declId, arrayOps=arrayOps,
+ param=param)
+
+ def _parse_declarator(self, named: bool | str, paramMode: str,
+ typed: bool = True) -> ASTDeclarator:
+ # 'typed' here means 'parse return type stuff'
+ if paramMode not in ('type', 'function'):
+ raise Exception(
+ "Internal error, unknown paramMode '%s'." % paramMode)
+ prevErrors = []
+ self.skip_ws()
+ if typed and self.skip_string('*'):
+ self.skip_ws()
+ restrict = False
+ volatile = False
+ const = False
+ attrs = []
+ while 1:
+ if not restrict:
+ restrict = self.skip_word_and_ws('restrict')
+ if restrict:
+ continue
+ if not volatile:
+ volatile = self.skip_word_and_ws('volatile')
+ if volatile:
+ continue
+ if not const:
+ const = self.skip_word_and_ws('const')
+ if const:
+ continue
+ attr = self._parse_attribute()
+ if attr is not None:
+ attrs.append(attr)
+ continue
+ break
+ next = self._parse_declarator(named, paramMode, typed)
+ return ASTDeclaratorPtr(next=next,
+ restrict=restrict, volatile=volatile, const=const,
+ attrs=ASTAttributeList(attrs))
+ if typed and self.current_char == '(': # note: peeking, not skipping
+ # maybe this is the beginning of params, try that first,
+ # otherwise assume it's noptr->declarator > ( ptr-declarator )
+ pos = self.pos
+ try:
+ # assume this is params
+ res = self._parse_declarator_name_suffix(named, paramMode,
+ typed)
+ return res
+ except DefinitionError as exParamQual:
+ msg = "If declarator-id with parameters"
+ if paramMode == 'function':
+ msg += " (e.g., 'void f(int arg)')"
+ prevErrors.append((exParamQual, msg))
+ self.pos = pos
+ try:
+ assert self.current_char == '('
+ self.skip_string('(')
+ # TODO: hmm, if there is a name, it must be in inner, right?
+ # TODO: hmm, if there must be parameters, they must b
+ # inside, right?
+ inner = self._parse_declarator(named, paramMode, typed)
+ if not self.skip_string(')'):
+ self.fail("Expected ')' in \"( ptr-declarator )\"")
+ next = self._parse_declarator(named=False,
+ paramMode="type",
+ typed=typed)
+ return ASTDeclaratorParen(inner=inner, next=next)
+ except DefinitionError as exNoPtrParen:
+ self.pos = pos
+ msg = "If parenthesis in noptr-declarator"
+ if paramMode == 'function':
+ msg += " (e.g., 'void (*f(int arg))(double)')"
+ prevErrors.append((exNoPtrParen, msg))
+ header = "Error in declarator"
+ raise self._make_multi_error(prevErrors, header) from exNoPtrParen
+ pos = self.pos
+ try:
+ return self._parse_declarator_name_suffix(named, paramMode, typed)
+ except DefinitionError as e:
+ self.pos = pos
+ prevErrors.append((e, "If declarator-id"))
+ header = "Error in declarator or parameters"
+ raise self._make_multi_error(prevErrors, header) from e
+
+ def _parse_initializer(self, outer: str | None = None, allowFallback: bool = True,
+ ) -> ASTInitializer | None:
+ self.skip_ws()
+ if outer == 'member' and False: # NoQA: SIM223 # TODO
+ bracedInit = self._parse_braced_init_list()
+ if bracedInit is not None:
+ return ASTInitializer(bracedInit, hasAssign=False)
+
+ if not self.skip_string('='):
+ return None
+
+ bracedInit = self._parse_braced_init_list()
+ if bracedInit is not None:
+ return ASTInitializer(bracedInit)
+
+ if outer == 'member':
+ fallbackEnd: list[str] = []
+ elif outer is None: # function parameter
+ fallbackEnd = [',', ')']
+ else:
+ self.fail("Internal error, initializer for outer '%s' not "
+ "implemented." % outer)
+
+ def parser():
+ return self._parse_assignment_expression()
+
+ value = self._parse_expression_fallback(fallbackEnd, parser, allow=allowFallback)
+ return ASTInitializer(value)
+
+ def _parse_type(self, named: bool | str, outer: str | None = None) -> ASTType:
+ """
+ named=False|'single'|True: 'single' is e.g., for function objects which
+ doesn't need to name the arguments, but otherwise is a single name
+ """
+ if outer: # always named
+ if outer not in ('type', 'member', 'function'):
+ raise Exception('Internal error, unknown outer "%s".' % outer)
+ assert named
+
+ if outer == 'type':
+ # We allow type objects to just be a name.
+ prevErrors = []
+ startPos = self.pos
+ # first try without the type
+ try:
+ declSpecs = self._parse_decl_specs(outer=outer, typed=False)
+ decl = self._parse_declarator(named=True, paramMode=outer,
+ typed=False)
+ self.assert_end(allowSemicolon=True)
+ except DefinitionError as exUntyped:
+ desc = "If just a name"
+ prevErrors.append((exUntyped, desc))
+ self.pos = startPos
+ try:
+ declSpecs = self._parse_decl_specs(outer=outer)
+ decl = self._parse_declarator(named=True, paramMode=outer)
+ except DefinitionError as exTyped:
+ self.pos = startPos
+ desc = "If typedef-like declaration"
+ prevErrors.append((exTyped, desc))
+ # Retain the else branch for easier debugging.
+ # TODO: it would be nice to save the previous stacktrace
+ # and output it here.
+ if True:
+ header = "Type must be either just a name or a "
+ header += "typedef-like declaration."
+ raise self._make_multi_error(prevErrors, header) from exTyped
+ else: # NoQA: RET506
+ # For testing purposes.
+ # do it again to get the proper traceback (how do you
+ # reliably save a traceback when an exception is
+ # constructed?)
+ self.pos = startPos
+ typed = True
+ declSpecs = self._parse_decl_specs(outer=outer, typed=typed)
+ decl = self._parse_declarator(named=True, paramMode=outer,
+ typed=typed)
+ elif outer == 'function':
+ declSpecs = self._parse_decl_specs(outer=outer)
+ decl = self._parse_declarator(named=True, paramMode=outer)
+ else:
+ paramMode = 'type'
+ if outer == 'member': # i.e., member
+ named = True
+ declSpecs = self._parse_decl_specs(outer=outer)
+ decl = self._parse_declarator(named=named, paramMode=paramMode)
+ return ASTType(declSpecs, decl)
+
+ def _parse_type_with_init(self, named: bool | str, outer: str | None) -> ASTTypeWithInit:
+ if outer:
+ assert outer in ('type', 'member', 'function')
+ type = self._parse_type(outer=outer, named=named)
+ init = self._parse_initializer(outer=outer)
+ return ASTTypeWithInit(type, init)
+
+ def _parse_macro(self) -> ASTMacro:
+ self.skip_ws()
+ ident = self._parse_nested_name()
+ if ident is None:
+ self.fail("Expected identifier in macro definition.")
+ self.skip_ws()
+ if not self.skip_string_and_ws('('):
+ return ASTMacro(ident, None)
+ if self.skip_string(')'):
+ return ASTMacro(ident, [])
+ args = []
+ while 1:
+ self.skip_ws()
+ if self.skip_string('...'):
+ args.append(ASTMacroParameter(None, True))
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail('Expected ")" after "..." in macro parameters.')
+ break
+ if not self.match(identifier_re):
+ self.fail("Expected identifier in macro parameters.")
+ nn = ASTNestedName([ASTIdentifier(self.matched_text)], rooted=False)
+ # Allow named variadic args:
+ # https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
+ self.skip_ws()
+ if self.skip_string_and_ws('...'):
+ args.append(ASTMacroParameter(nn, False, True))
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail('Expected ")" after "..." in macro parameters.')
+ break
+ args.append(ASTMacroParameter(nn))
+ if self.skip_string_and_ws(','):
+ continue
+ if self.skip_string_and_ws(')'):
+ break
+ self.fail("Expected identifier, ')', or ',' in macro parameter list.")
+ return ASTMacro(ident, args)
+
+ def _parse_struct(self) -> ASTStruct:
+ name = self._parse_nested_name()
+ return ASTStruct(name)
+
+ def _parse_union(self) -> ASTUnion:
+ name = self._parse_nested_name()
+ return ASTUnion(name)
+
+ def _parse_enum(self) -> ASTEnum:
+ name = self._parse_nested_name()
+ return ASTEnum(name)
+
+ def _parse_enumerator(self) -> ASTEnumerator:
+ name = self._parse_nested_name()
+ attrs = self._parse_attribute_list()
+ self.skip_ws()
+ init = None
+ if self.skip_string('='):
+ self.skip_ws()
+
+ def parser() -> ASTExpression:
+ return self._parse_constant_expression()
+
+ initVal = self._parse_expression_fallback([], parser)
+ init = ASTInitializer(initVal)
+ return ASTEnumerator(name, init, attrs)
+
+ def parse_declaration(self, objectType: str, directiveType: str) -> ASTDeclaration:
+ if objectType not in ('function', 'member',
+ 'macro', 'struct', 'union', 'enum', 'enumerator', 'type'):
+ raise Exception('Internal error, unknown objectType "%s".' % objectType)
+ if directiveType not in ('function', 'member', 'var',
+ 'macro', 'struct', 'union', 'enum', 'enumerator', 'type'):
+ raise Exception('Internal error, unknown directiveType "%s".' % directiveType)
+
+ declaration: DeclarationType = None
+ if objectType == 'member':
+ declaration = self._parse_type_with_init(named=True, outer='member')
+ elif objectType == 'function':
+ declaration = self._parse_type(named=True, outer='function')
+ elif objectType == 'macro':
+ declaration = self._parse_macro()
+ elif objectType == 'struct':
+ declaration = self._parse_struct()
+ elif objectType == 'union':
+ declaration = self._parse_union()
+ elif objectType == 'enum':
+ declaration = self._parse_enum()
+ elif objectType == 'enumerator':
+ declaration = self._parse_enumerator()
+ elif objectType == 'type':
+ declaration = self._parse_type(named=True, outer='type')
+ else:
+ raise AssertionError
+ if objectType != 'macro':
+ self.skip_ws()
+ semicolon = self.skip_string(';')
+ else:
+ semicolon = False
+ return ASTDeclaration(objectType, directiveType, declaration, semicolon)
+
+ def parse_namespace_object(self) -> ASTNestedName:
+ return self._parse_nested_name()
+
+ def parse_xref_object(self) -> ASTNestedName:
+ name = self._parse_nested_name()
+ # if there are '()' left, just skip them
+ self.skip_ws()
+ self.skip_string('()')
+ self.assert_end()
+ return name
+
+ def parse_expression(self) -> ASTExpression | ASTType:
+ pos = self.pos
+ res: ASTExpression | ASTType = None
+ try:
+ res = self._parse_expression()
+ self.skip_ws()
+ self.assert_end()
+ except DefinitionError as exExpr:
+ self.pos = pos
+ try:
+ res = self._parse_type(False)
+ self.skip_ws()
+ self.assert_end()
+ except DefinitionError as exType:
+ header = "Error when parsing (type) expression."
+ errs = []
+ errs.append((exExpr, "If expression"))
+ errs.append((exType, "If type"))
+ raise self._make_multi_error(errs, header) from exType
+ return res
+
+
+def _make_phony_error_name() -> ASTNestedName:
+ return ASTNestedName([ASTIdentifier("PhonyNameDueToError")], rooted=False)
+
+
+class CObject(ObjectDescription[ASTDeclaration]):
+ """
+ Description of a C language object.
+ """
+
+ option_spec: OptionSpec = {
+ 'no-index-entry': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindexentry': directives.flag,
+ 'nocontentsentry': directives.flag,
+ 'single-line-parameter-list': directives.flag,
+ }
+
+ def _add_enumerator_to_parent(self, ast: ASTDeclaration) -> None:
+ assert ast.objectType == 'enumerator'
+ # find the parent, if it exists && is an enum
+ # then add the name to the parent scope
+ symbol = ast.symbol
+ assert symbol
+ assert symbol.ident is not None
+ parentSymbol = symbol.parent
+ assert parentSymbol
+ if parentSymbol.parent is None:
+ # TODO: we could warn, but it is somewhat equivalent to
+ # enumeratorss, without the enum
+ return # no parent
+ parentDecl = parentSymbol.declaration
+ if parentDecl is None:
+ # the parent is not explicitly declared
+ # TODO: we could warn, but?
+ return
+ if parentDecl.objectType != 'enum':
+ # TODO: maybe issue a warning, enumerators in non-enums is weird,
+ # but it is somewhat equivalent to enumeratorss, without the enum
+ return
+ if parentDecl.directiveType != 'enum':
+ return
+
+ targetSymbol = parentSymbol.parent
+ s = targetSymbol.find_identifier(symbol.ident, matchSelf=False, recurseInAnon=True,
+ searchInSiblings=False)
+ if s is not None:
+ # something is already declared with that name
+ return
+ declClone = symbol.declaration.clone()
+ declClone.enumeratorScopedSymbol = symbol
+ Symbol(parent=targetSymbol, ident=symbol.ident,
+ declaration=declClone,
+ docname=self.env.docname, line=self.get_source_info()[1])
+
+ def add_target_and_index(self, ast: ASTDeclaration, sig: str,
+ signode: TextElement) -> None:
+ ids = []
+ for i in range(1, _max_id + 1):
+ try:
+ id = ast.get_id(version=i)
+ ids.append(id)
+ except NoOldIdError:
+ assert i < _max_id
+ # let's keep the newest first
+ ids = list(reversed(ids))
+ newestId = ids[0]
+ assert newestId # shouldn't be None
+
+ name = ast.symbol.get_full_nested_name().get_display_string().lstrip('.')
+ if newestId not in self.state.document.ids:
+ # always add the newest id
+ assert newestId
+ signode['ids'].append(newestId)
+ # only add compatibility ids when there are no conflicts
+ for id in ids[1:]:
+ if not id: # is None when the element didn't exist in that version
+ continue
+ if id not in self.state.document.ids:
+ signode['ids'].append(id)
+
+ self.state.document.note_explicit_target(signode)
+
+ if 'no-index-entry' not in self.options:
+ indexText = self.get_index_text(name)
+ self.indexnode['entries'].append(('single', indexText, newestId, '', None))
+
+ @property
+ def object_type(self) -> str:
+ raise NotImplementedError
+
+ @property
+ def display_object_type(self) -> str:
+ return self.object_type
+
+ def get_index_text(self, name: str) -> str:
+ return _('%s (C %s)') % (name, self.display_object_type)
+
+ def parse_definition(self, parser: DefinitionParser) -> ASTDeclaration:
+ return parser.parse_declaration(self.object_type, self.objtype)
+
+ def describe_signature(self, signode: TextElement, ast: ASTDeclaration,
+ options: dict) -> None:
+ ast.describe_signature(signode, 'lastIsName', self.env, options)
+
+ def run(self) -> list[Node]:
+ env = self.state.document.settings.env # from ObjectDescription.run
+ if 'c:parent_symbol' not in env.temp_data:
+ root = env.domaindata['c']['root_symbol']
+ env.temp_data['c:parent_symbol'] = root
+ env.ref_context['c:parent_key'] = root.get_lookup_key()
+
+ # When multiple declarations are made in the same directive
+ # they need to know about each other to provide symbol lookup for function parameters.
+ # We use last_symbol to store the latest added declaration in a directive.
+ env.temp_data['c:last_symbol'] = None
+ return super().run()
+
+ def handle_signature(self, sig: str, signode: TextElement) -> ASTDeclaration:
+ parentSymbol: Symbol = self.env.temp_data['c:parent_symbol']
+
+ max_len = (self.env.config.c_maximum_signature_line_length
+ or self.env.config.maximum_signature_line_length
+ or 0)
+ signode['multi_line_parameter_list'] = (
+ 'single-line-parameter-list' not in self.options
+ and (len(sig) > max_len > 0)
+ )
+
+ parser = DefinitionParser(sig, location=signode, config=self.env.config)
+ try:
+ ast = self.parse_definition(parser)
+ parser.assert_end()
+ except DefinitionError as e:
+ logger.warning(e, location=signode)
+ # It is easier to assume some phony name than handling the error in
+ # the possibly inner declarations.
+ name = _make_phony_error_name()
+ symbol = parentSymbol.add_name(name)
+ self.env.temp_data['c:last_symbol'] = symbol
+ raise ValueError from e
+
+ try:
+ symbol = parentSymbol.add_declaration(
+ ast, docname=self.env.docname, line=self.get_source_info()[1])
+ # append the new declaration to the sibling list
+ assert symbol.siblingAbove is None
+ assert symbol.siblingBelow is None
+ symbol.siblingAbove = self.env.temp_data['c:last_symbol']
+ if symbol.siblingAbove is not None:
+ assert symbol.siblingAbove.siblingBelow is None
+ symbol.siblingAbove.siblingBelow = symbol
+ self.env.temp_data['c:last_symbol'] = symbol
+ except _DuplicateSymbolError as e:
+ # Assume we are actually in the old symbol,
+ # instead of the newly created duplicate.
+ self.env.temp_data['c:last_symbol'] = e.symbol
+ msg = __("Duplicate C declaration, also defined at %s:%s.\n"
+ "Declaration is '.. c:%s:: %s'.")
+ msg = msg % (e.symbol.docname, e.symbol.line, self.display_object_type, sig)
+ logger.warning(msg, location=signode)
+
+ if ast.objectType == 'enumerator':
+ self._add_enumerator_to_parent(ast)
+
+ # note: handle_signature may be called multiple time per directive,
+ # if it has multiple signatures, so don't mess with the original options.
+ options = dict(self.options)
+ self.describe_signature(signode, ast, options)
+ return ast
+
+ def before_content(self) -> None:
+ lastSymbol: Symbol = self.env.temp_data['c:last_symbol']
+ assert lastSymbol
+ self.oldParentSymbol = self.env.temp_data['c:parent_symbol']
+ self.oldParentKey: LookupKey = self.env.ref_context['c:parent_key']
+ self.env.temp_data['c:parent_symbol'] = lastSymbol
+ self.env.ref_context['c:parent_key'] = lastSymbol.get_lookup_key()
+
+ def after_content(self) -> None:
+ self.env.temp_data['c:parent_symbol'] = self.oldParentSymbol
+ self.env.ref_context['c:parent_key'] = self.oldParentKey
+
+
+class CMemberObject(CObject):
+ object_type = 'member'
+
+ @property
+ def display_object_type(self) -> str:
+ # the distinction between var and member is only cosmetic
+ assert self.objtype in ('member', 'var')
+ return self.objtype
+
+
+_function_doc_field_types = [
+ TypedField('parameter', label=_('Parameters'),
+ names=('param', 'parameter', 'arg', 'argument'),
+ typerolename='expr', typenames=('type',)),
+ GroupedField('retval', label=_('Return values'),
+ names=('retvals', 'retval'),
+ can_collapse=True),
+ Field('returnvalue', label=_('Returns'), has_arg=False,
+ names=('returns', 'return')),
+ Field('returntype', label=_('Return type'), has_arg=False,
+ names=('rtype',)),
+]
+
+
+class CFunctionObject(CObject):
+ object_type = 'function'
+
+ doc_field_types = _function_doc_field_types.copy()
+
+
+class CMacroObject(CObject):
+ object_type = 'macro'
+
+ doc_field_types = _function_doc_field_types.copy()
+
+
+class CStructObject(CObject):
+ object_type = 'struct'
+
+
+class CUnionObject(CObject):
+ object_type = 'union'
+
+
+class CEnumObject(CObject):
+ object_type = 'enum'
+
+
+class CEnumeratorObject(CObject):
+ object_type = 'enumerator'
+
+
+class CTypeObject(CObject):
+ object_type = 'type'
+
+
+class CNamespaceObject(SphinxDirective):
+ """
+ This directive is just to tell Sphinx that we're documenting stuff in
+ namespace foo.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ rootSymbol = self.env.domaindata['c']['root_symbol']
+ if self.arguments[0].strip() in ('NULL', '0', 'nullptr'):
+ symbol = rootSymbol
+ stack: list[Symbol] = []
+ else:
+ parser = DefinitionParser(self.arguments[0],
+ location=self.get_location(),
+ config=self.env.config)
+ try:
+ name = parser.parse_namespace_object()
+ parser.assert_end()
+ except DefinitionError as e:
+ logger.warning(e, location=self.get_location())
+ name = _make_phony_error_name()
+ symbol = rootSymbol.add_name(name)
+ stack = [symbol]
+ self.env.temp_data['c:parent_symbol'] = symbol
+ self.env.temp_data['c:namespace_stack'] = stack
+ self.env.ref_context['c:parent_key'] = symbol.get_lookup_key()
+ return []
+
+
+class CNamespacePushObject(SphinxDirective):
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ if self.arguments[0].strip() in ('NULL', '0', 'nullptr'):
+ return []
+ parser = DefinitionParser(self.arguments[0],
+ location=self.get_location(),
+ config=self.env.config)
+ try:
+ name = parser.parse_namespace_object()
+ parser.assert_end()
+ except DefinitionError as e:
+ logger.warning(e, location=self.get_location())
+ name = _make_phony_error_name()
+ oldParent = self.env.temp_data.get('c:parent_symbol', None)
+ if not oldParent:
+ oldParent = self.env.domaindata['c']['root_symbol']
+ symbol = oldParent.add_name(name)
+ stack = self.env.temp_data.get('c:namespace_stack', [])
+ stack.append(symbol)
+ self.env.temp_data['c:parent_symbol'] = symbol
+ self.env.temp_data['c:namespace_stack'] = stack
+ self.env.ref_context['c:parent_key'] = symbol.get_lookup_key()
+ return []
+
+
+class CNamespacePopObject(SphinxDirective):
+ has_content = False
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ stack = self.env.temp_data.get('c:namespace_stack', None)
+ if not stack or len(stack) == 0:
+ logger.warning("C namespace pop on empty stack. Defaulting to global scope.",
+ location=self.get_location())
+ stack = []
+ else:
+ stack.pop()
+ if len(stack) > 0:
+ symbol = stack[-1]
+ else:
+ symbol = self.env.domaindata['c']['root_symbol']
+ self.env.temp_data['c:parent_symbol'] = symbol
+ self.env.temp_data['c:namespace_stack'] = stack
+ self.env.ref_context['cp:parent_key'] = symbol.get_lookup_key()
+ return []
+
+
+class AliasNode(nodes.Element):
+ def __init__(
+ self,
+ sig: str,
+ aliasOptions: dict,
+ document: Any,
+ env: BuildEnvironment | None = None,
+ parentKey: LookupKey | None = None,
+ ) -> None:
+ super().__init__()
+ self.sig = sig
+ self.aliasOptions = aliasOptions
+ self.document = document
+ if env is not None:
+ if 'c:parent_symbol' not in env.temp_data:
+ root = env.domaindata['c']['root_symbol']
+ env.temp_data['c:parent_symbol'] = root
+ env.ref_context['c:parent_key'] = root.get_lookup_key()
+ self.parentKey = env.ref_context['c:parent_key']
+ else:
+ assert parentKey is not None
+ self.parentKey = parentKey
+
+ def copy(self) -> AliasNode:
+ return self.__class__(self.sig, self.aliasOptions, self.document,
+ env=None, parentKey=self.parentKey)
+
+
+class AliasTransform(SphinxTransform):
+ default_priority = ReferencesResolver.default_priority - 1
+
+ def _render_symbol(self, s: Symbol, maxdepth: int, skipThis: bool,
+ aliasOptions: dict, renderOptions: dict,
+ document: Any) -> list[Node]:
+ if maxdepth == 0:
+ recurse = True
+ elif maxdepth == 1:
+ recurse = False
+ else:
+ maxdepth -= 1
+ recurse = True
+
+ nodes: list[Node] = []
+ if not skipThis:
+ signode = addnodes.desc_signature('', '')
+ nodes.append(signode)
+ s.declaration.describe_signature(signode, 'markName', self.env, renderOptions)
+
+ if recurse:
+ if skipThis:
+ childContainer: list[Node] | addnodes.desc = nodes
+ else:
+ content = addnodes.desc_content()
+ desc = addnodes.desc()
+ content.append(desc)
+ desc.document = document
+ desc['domain'] = 'c'
+ # 'desctype' is a backwards compatible attribute
+ desc['objtype'] = desc['desctype'] = 'alias'
+ desc['no-index'] = True
+ childContainer = desc
+
+ for sChild in s.children:
+ if sChild.declaration is None:
+ continue
+ childNodes = self._render_symbol(
+ sChild, maxdepth=maxdepth, skipThis=False,
+ aliasOptions=aliasOptions, renderOptions=renderOptions,
+ document=document)
+ childContainer.extend(childNodes)
+
+ if not skipThis and len(desc.children) != 0:
+ nodes.append(content)
+ return nodes
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(AliasNode):
+ sig = node.sig
+ parentKey = node.parentKey
+ try:
+ parser = DefinitionParser(sig, location=node,
+ config=self.env.config)
+ name = parser.parse_xref_object()
+ except DefinitionError as e:
+ logger.warning(e, location=node)
+ name = None
+
+ if name is None:
+ # could not be parsed, so stop here
+ signode = addnodes.desc_signature(sig, '')
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+ node.replace_self(signode)
+ continue
+
+ rootSymbol: Symbol = self.env.domains['c'].data['root_symbol']
+ parentSymbol: Symbol = rootSymbol.direct_lookup(parentKey)
+ if not parentSymbol:
+ logger.debug("Target: %s", sig)
+ logger.debug("ParentKey: %s", parentKey)
+ logger.debug(rootSymbol.dump(1))
+ assert parentSymbol # should be there
+
+ s = parentSymbol.find_declaration(
+ name, 'any',
+ matchSelf=True, recurseInAnon=True)
+ if s is None:
+ signode = addnodes.desc_signature(sig, '')
+ node.append(signode)
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+
+ logger.warning("Could not find C declaration for alias '%s'." % name,
+ location=node)
+ node.replace_self(signode)
+ continue
+ # Declarations like .. var:: int Missing::var
+ # may introduce symbols without declarations.
+ # But if we skip the root then it is ok to start recursion from it.
+ if not node.aliasOptions['noroot'] and s.declaration is None:
+ signode = addnodes.desc_signature(sig, '')
+ node.append(signode)
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+
+ logger.warning(
+ "Can not render C declaration for alias '%s'. No such declaration." % name,
+ location=node)
+ node.replace_self(signode)
+ continue
+
+ nodes = self._render_symbol(s, maxdepth=node.aliasOptions['maxdepth'],
+ skipThis=node.aliasOptions['noroot'],
+ aliasOptions=node.aliasOptions,
+ renderOptions={}, document=node.document)
+ node.replace_self(nodes)
+
+
+class CAliasObject(ObjectDescription):
+ option_spec: OptionSpec = {
+ 'maxdepth': directives.nonnegative_int,
+ 'noroot': directives.flag,
+ }
+
+ def run(self) -> list[Node]:
+ """
+ On purpose this doesn't call the ObjectDescription version, but is based on it.
+ Each alias signature may expand into multiple real signatures if 'noroot'.
+ The code is therefore based on the ObjectDescription version.
+ """
+ if ':' in self.name:
+ self.domain, self.objtype = self.name.split(':', 1)
+ else:
+ self.domain, self.objtype = '', self.name
+
+ node = addnodes.desc()
+ node.document = self.state.document
+ node['domain'] = self.domain
+ # 'desctype' is a backwards compatible attribute
+ node['objtype'] = node['desctype'] = self.objtype
+ node['no-index'] = True
+
+ self.names: list[str] = []
+ aliasOptions = {
+ 'maxdepth': self.options.get('maxdepth', 1),
+ 'noroot': 'noroot' in self.options,
+ }
+ if aliasOptions['noroot'] and aliasOptions['maxdepth'] == 1:
+ logger.warning("Error in C alias declaration."
+ " Requested 'noroot' but 'maxdepth' 1."
+ " When skipping the root declaration,"
+ " need 'maxdepth' 0 for infinite or at least 2.",
+ location=self.get_location())
+ for sig in self.get_signatures():
+ node.append(AliasNode(sig, aliasOptions, self.state.document, env=self.env))
+ return [node]
+
+
+class CXRefRole(XRefRole):
+ def process_link(self, env: BuildEnvironment, refnode: Element,
+ has_explicit_title: bool, title: str, target: str) -> tuple[str, str]:
+ refnode.attributes.update(env.ref_context)
+
+ if not has_explicit_title:
+ # major hax: replace anon names via simple string manipulation.
+ # Can this actually fail?
+ title = anon_identifier_re.sub("[anonymous]", str(title))
+
+ if not has_explicit_title:
+ target = target.lstrip('~') # only has a meaning for the title
+ # if the first character is a tilde, don't display the module/class
+ # parts of the contents
+ if title[0:1] == '~':
+ title = title[1:]
+ dot = title.rfind('.')
+ if dot != -1:
+ title = title[dot + 1:]
+ return title, target
+
+
+class CExprRole(SphinxRole):
+ def __init__(self, asCode: bool) -> None:
+ super().__init__()
+ if asCode:
+ # render the expression as inline code
+ self.class_type = 'c-expr'
+ else:
+ # render the expression as inline text
+ self.class_type = 'c-texpr'
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ text = self.text.replace('\n', ' ')
+ parser = DefinitionParser(text, location=self.get_location(),
+ config=self.env.config)
+ # attempt to mimic XRefRole classes, except that...
+ try:
+ ast = parser.parse_expression()
+ except DefinitionError as ex:
+ logger.warning('Unparseable C expression: %r\n%s', text, ex,
+ location=self.get_location())
+ # see below
+ return [addnodes.desc_inline('c', text, text, classes=[self.class_type])], []
+ parentSymbol = self.env.temp_data.get('c:parent_symbol', None)
+ if parentSymbol is None:
+ parentSymbol = self.env.domaindata['c']['root_symbol']
+ # ...most if not all of these classes should really apply to the individual references,
+ # not the container node
+ signode = addnodes.desc_inline('c', classes=[self.class_type])
+ ast.describe_signature(signode, 'markType', self.env, parentSymbol)
+ return [signode], []
+
+
+class CDomain(Domain):
+ """C language domain."""
+ name = 'c'
+ label = 'C'
+ object_types = {
+ # 'identifier' is the one used for xrefs generated in signatures, not in roles
+ 'member': ObjType(_('member'), 'var', 'member', 'data', 'identifier'),
+ 'var': ObjType(_('variable'), 'var', 'member', 'data', 'identifier'),
+ 'function': ObjType(_('function'), 'func', 'identifier', 'type'),
+ 'macro': ObjType(_('macro'), 'macro', 'identifier'),
+ 'struct': ObjType(_('struct'), 'struct', 'identifier', 'type'),
+ 'union': ObjType(_('union'), 'union', 'identifier', 'type'),
+ 'enum': ObjType(_('enum'), 'enum', 'identifier', 'type'),
+ 'enumerator': ObjType(_('enumerator'), 'enumerator', 'identifier'),
+ 'type': ObjType(_('type'), 'identifier', 'type'),
+ # generated object types
+ 'functionParam': ObjType(_('function parameter'), 'identifier', 'var', 'member', 'data'), # noqa: E501
+ }
+
+ directives = {
+ 'member': CMemberObject,
+ 'var': CMemberObject,
+ 'function': CFunctionObject,
+ 'macro': CMacroObject,
+ 'struct': CStructObject,
+ 'union': CUnionObject,
+ 'enum': CEnumObject,
+ 'enumerator': CEnumeratorObject,
+ 'type': CTypeObject,
+ # scope control
+ 'namespace': CNamespaceObject,
+ 'namespace-push': CNamespacePushObject,
+ 'namespace-pop': CNamespacePopObject,
+ # other
+ 'alias': CAliasObject,
+ }
+ roles = {
+ 'member': CXRefRole(),
+ 'data': CXRefRole(),
+ 'var': CXRefRole(),
+ 'func': CXRefRole(fix_parens=True),
+ 'macro': CXRefRole(),
+ 'struct': CXRefRole(),
+ 'union': CXRefRole(),
+ 'enum': CXRefRole(),
+ 'enumerator': CXRefRole(),
+ 'type': CXRefRole(),
+ 'expr': CExprRole(asCode=True),
+ 'texpr': CExprRole(asCode=False),
+ }
+ initial_data: dict[str, Symbol | dict[str, tuple[str, str, str]]] = {
+ 'root_symbol': Symbol(None, None, None, None, None),
+ 'objects': {}, # fullname -> docname, node_id, objtype
+ }
+
+ def clear_doc(self, docname: str) -> None:
+ if Symbol.debug_show_tree:
+ logger.debug("clear_doc: %s", docname)
+ logger.debug("\tbefore:")
+ logger.debug(self.data['root_symbol'].dump(1))
+ logger.debug("\tbefore end")
+
+ rootSymbol = self.data['root_symbol']
+ rootSymbol.clear_doc(docname)
+
+ if Symbol.debug_show_tree:
+ logger.debug("\tafter:")
+ logger.debug(self.data['root_symbol'].dump(1))
+ logger.debug("\tafter end")
+ logger.debug("clear_doc end: %s", docname)
+
+ def process_doc(self, env: BuildEnvironment, docname: str,
+ document: nodes.document) -> None:
+ if Symbol.debug_show_tree:
+ logger.debug("process_doc: %s", docname)
+ logger.debug(self.data['root_symbol'].dump(0))
+ logger.debug("process_doc end: %s", docname)
+
+ def process_field_xref(self, pnode: pending_xref) -> None:
+ pnode.attributes.update(self.env.ref_context)
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict) -> None:
+ if Symbol.debug_show_tree:
+ logger.debug("merge_domaindata:")
+ logger.debug("\tself:")
+ logger.debug(self.data['root_symbol'].dump(1))
+ logger.debug("\tself end")
+ logger.debug("\tother:")
+ logger.debug(otherdata['root_symbol'].dump(1))
+ logger.debug("\tother end")
+ logger.debug("merge_domaindata end")
+
+ self.data['root_symbol'].merge_with(otherdata['root_symbol'],
+ docnames, self.env)
+ ourObjects = self.data['objects']
+ for fullname, (fn, id_, objtype) in otherdata['objects'].items():
+ if fn in docnames:
+ if fullname not in ourObjects:
+ ourObjects[fullname] = (fn, id_, objtype)
+ # no need to warn on duplicates, the symbol merge already does that
+
+ def _resolve_xref_inner(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref,
+ contnode: Element) -> tuple[Element | None, str | None]:
+ parser = DefinitionParser(target, location=node, config=env.config)
+ try:
+ name = parser.parse_xref_object()
+ except DefinitionError as e:
+ logger.warning('Unparseable C cross-reference: %r\n%s', target, e,
+ location=node)
+ return None, None
+ parentKey: LookupKey = node.get("c:parent_key", None)
+ rootSymbol = self.data['root_symbol']
+ if parentKey:
+ parentSymbol: Symbol = rootSymbol.direct_lookup(parentKey)
+ if not parentSymbol:
+ logger.debug("Target: %s", target)
+ logger.debug("ParentKey: %s", parentKey)
+ logger.debug(rootSymbol.dump(1))
+ assert parentSymbol # should be there
+ else:
+ parentSymbol = rootSymbol
+ s = parentSymbol.find_declaration(name, typ,
+ matchSelf=True, recurseInAnon=True)
+ if s is None or s.declaration is None:
+ return None, None
+
+ # TODO: check role type vs. object type
+
+ declaration = s.declaration
+ displayName = name.get_display_string()
+ docname = s.docname
+ assert docname
+
+ return make_refnode(builder, fromdocname, docname,
+ declaration.get_newest_id(), contnode, displayName,
+ ), declaration.objectType
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref,
+ contnode: Element) -> Element | None:
+ return self._resolve_xref_inner(env, fromdocname, builder, typ,
+ target, node, contnode)[0]
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ with logging.suppress_logging():
+ retnode, objtype = self._resolve_xref_inner(env, fromdocname, builder,
+ 'any', target, node, contnode)
+ if retnode:
+ return [('c:' + self.role_for_objtype(objtype), retnode)]
+ return []
+
+ def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]:
+ rootSymbol = self.data['root_symbol']
+ for symbol in rootSymbol.get_all_symbols():
+ if symbol.declaration is None:
+ continue
+ assert symbol.docname
+ fullNestedName = symbol.get_full_nested_name()
+ name = str(fullNestedName).lstrip('.')
+ dispname = fullNestedName.get_display_string().lstrip('.')
+ objectType = symbol.declaration.objectType
+ docname = symbol.docname
+ newestId = symbol.declaration.get_newest_id()
+ yield (name, dispname, objectType, docname, newestId, 1)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(CDomain)
+ app.add_config_value("c_id_attributes", [], 'env')
+ app.add_config_value("c_paren_attributes", [], 'env')
+ app.add_config_value("c_extra_keywords", _macroKeywords, 'env')
+ app.add_config_value("c_maximum_signature_line_length", None, 'env', types={int, None})
+ app.add_post_transform(AliasTransform)
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 3,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/changeset.py b/sphinx/domains/changeset.py
new file mode 100644
index 0000000..7cfe382
--- /dev/null
+++ b/sphinx/domains/changeset.py
@@ -0,0 +1,161 @@
+"""The changeset domain."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, NamedTuple, cast
+
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.domains import Domain
+from sphinx.locale import _
+from sphinx.util.docutils import SphinxDirective
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+
+
+versionlabels = {
+ 'versionadded': _('New in version %s'),
+ 'versionchanged': _('Changed in version %s'),
+ 'deprecated': _('Deprecated since version %s'),
+}
+
+versionlabel_classes = {
+ 'versionadded': 'added',
+ 'versionchanged': 'changed',
+ 'deprecated': 'deprecated',
+}
+
+
+class ChangeSet(NamedTuple):
+ type: str
+ docname: str
+ lineno: int
+ module: str | None
+ descname: str | None
+ content: str
+
+
+class VersionChange(SphinxDirective):
+ """
+ Directive to describe a change/addition/deprecation in a specific version.
+ """
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 1
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ node = addnodes.versionmodified()
+ node.document = self.state.document
+ self.set_source_info(node)
+ node['type'] = self.name
+ node['version'] = self.arguments[0]
+ text = versionlabels[self.name] % self.arguments[0]
+ if len(self.arguments) == 2:
+ inodes, messages = self.state.inline_text(self.arguments[1],
+ self.lineno + 1)
+ para = nodes.paragraph(self.arguments[1], '', *inodes, translatable=False)
+ self.set_source_info(para)
+ node.append(para)
+ else:
+ messages = []
+ if self.content:
+ self.state.nested_parse(self.content, self.content_offset, node)
+ classes = ['versionmodified', versionlabel_classes[self.name]]
+ if len(node) > 0 and isinstance(node[0], nodes.paragraph):
+ # the contents start with a paragraph
+ if node[0].rawsource:
+ # make the first paragraph translatable
+ content = nodes.inline(node[0].rawsource, translatable=True)
+ content.source = node[0].source
+ content.line = node[0].line
+ content += node[0].children
+ node[0].replace_self(nodes.paragraph('', '', content, translatable=False))
+
+ para = node[0]
+ para.insert(0, nodes.inline('', '%s: ' % text, classes=classes))
+ elif len(node) > 0:
+ # the contents do not starts with a paragraph
+ para = nodes.paragraph('', '',
+ nodes.inline('', '%s: ' % text, classes=classes),
+ translatable=False)
+ node.insert(0, para)
+ else:
+ # the contents are empty
+ para = nodes.paragraph('', '',
+ nodes.inline('', '%s.' % text, classes=classes),
+ translatable=False)
+ node.append(para)
+
+ domain = cast(ChangeSetDomain, self.env.get_domain('changeset'))
+ domain.note_changeset(node)
+
+ ret: list[Node] = [node]
+ ret += messages
+ return ret
+
+
+class ChangeSetDomain(Domain):
+ """Domain for changesets."""
+
+ name = 'changeset'
+ label = 'changeset'
+
+ initial_data: dict[str, Any] = {
+ 'changes': {}, # version -> list of ChangeSet
+ }
+
+ @property
+ def changesets(self) -> dict[str, list[ChangeSet]]:
+ return self.data.setdefault('changes', {}) # version -> list of ChangeSet
+
+ def note_changeset(self, node: addnodes.versionmodified) -> None:
+ version = node['version']
+ module = self.env.ref_context.get('py:module')
+ objname = self.env.temp_data.get('object')
+ changeset = ChangeSet(node['type'], self.env.docname, node.line,
+ module, objname, node.astext())
+ self.changesets.setdefault(version, []).append(changeset)
+
+ def clear_doc(self, docname: str) -> None:
+ for changes in self.changesets.values():
+ for changeset in changes[:]:
+ if changeset.docname == docname:
+ changes.remove(changeset)
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
+ # XXX duplicates?
+ for version, otherchanges in otherdata['changes'].items():
+ changes = self.changesets.setdefault(version, [])
+ for changeset in otherchanges:
+ if changeset.docname in docnames:
+ changes.append(changeset)
+
+ def process_doc(
+ self, env: BuildEnvironment, docname: str, document: nodes.document,
+ ) -> None:
+ pass # nothing to do here. All changesets are registered on calling directive.
+
+ def get_changesets_for(self, version: str) -> list[ChangeSet]:
+ return self.changesets.get(version, [])
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(ChangeSetDomain)
+ app.add_directive('deprecated', VersionChange)
+ app.add_directive('versionadded', VersionChange)
+ app.add_directive('versionchanged', VersionChange)
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 1,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/citation.py b/sphinx/domains/citation.py
new file mode 100644
index 0000000..d12c0f1
--- /dev/null
+++ b/sphinx/domains/citation.py
@@ -0,0 +1,154 @@
+"""The citation domain."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+
+from sphinx.addnodes import pending_xref
+from sphinx.domains import Domain
+from sphinx.locale import __
+from sphinx.transforms import SphinxTransform
+from sphinx.util import logging
+from sphinx.util.nodes import copy_source_info, make_refnode
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element
+
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+
+
+logger = logging.getLogger(__name__)
+
+
+class CitationDomain(Domain):
+ """Domain for citations."""
+
+ name = 'citation'
+ label = 'citation'
+
+ dangling_warnings = {
+ 'ref': 'citation not found: %(target)s',
+ }
+
+ @property
+ def citations(self) -> dict[str, tuple[str, str, int]]:
+ return self.data.setdefault('citations', {})
+
+ @property
+ def citation_refs(self) -> dict[str, set[str]]:
+ return self.data.setdefault('citation_refs', {})
+
+ def clear_doc(self, docname: str) -> None:
+ for key, (fn, _l, _lineno) in list(self.citations.items()):
+ if fn == docname:
+ del self.citations[key]
+ for key, docnames in list(self.citation_refs.items()):
+ if docnames == {docname}:
+ del self.citation_refs[key]
+ elif docname in docnames:
+ docnames.remove(docname)
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
+ # XXX duplicates?
+ for key, data in otherdata['citations'].items():
+ if data[0] in docnames:
+ self.citations[key] = data
+ for key, data in otherdata['citation_refs'].items():
+ citation_refs = self.citation_refs.setdefault(key, set())
+ for docname in data:
+ if docname in docnames:
+ citation_refs.add(docname)
+
+ def note_citation(self, node: nodes.citation) -> None:
+ label = node[0].astext()
+ if label in self.citations:
+ path = self.env.doc2path(self.citations[label][0])
+ logger.warning(__('duplicate citation %s, other instance in %s'), label, path,
+ location=node, type='ref', subtype='citation')
+ self.citations[label] = (node['docname'], node['ids'][0], node.line)
+
+ def note_citation_reference(self, node: pending_xref) -> None:
+ docnames = self.citation_refs.setdefault(node['reftarget'], set())
+ docnames.add(self.env.docname)
+
+ def check_consistency(self) -> None:
+ for name, (docname, _labelid, lineno) in self.citations.items():
+ if name not in self.citation_refs:
+ logger.warning(__('Citation [%s] is not referenced.'), name,
+ type='ref', subtype='citation', location=(docname, lineno))
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ docname, labelid, lineno = self.citations.get(target, ('', '', 0))
+ if not docname:
+ return None
+
+ return make_refnode(builder, fromdocname, docname,
+ labelid, contnode)
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ refnode = self.resolve_xref(env, fromdocname, builder, 'ref', target, node, contnode)
+ if refnode is None:
+ return []
+ else:
+ return [('ref', refnode)]
+
+
+class CitationDefinitionTransform(SphinxTransform):
+ """Mark citation definition labels as not smartquoted."""
+ default_priority = 619
+
+ def apply(self, **kwargs: Any) -> None:
+ domain = cast(CitationDomain, self.env.get_domain('citation'))
+ for node in self.document.findall(nodes.citation):
+ # register citation node to domain
+ node['docname'] = self.env.docname
+ domain.note_citation(node)
+
+ # mark citation labels as not smartquoted
+ label = cast(nodes.label, node[0])
+ label['support_smartquotes'] = False
+
+
+class CitationReferenceTransform(SphinxTransform):
+ """
+ Replace citation references by pending_xref nodes before the default
+ docutils transform tries to resolve them.
+ """
+ default_priority = 619
+
+ def apply(self, **kwargs: Any) -> None:
+ domain = cast(CitationDomain, self.env.get_domain('citation'))
+ for node in self.document.findall(nodes.citation_reference):
+ target = node.astext()
+ ref = pending_xref(target, refdomain='citation', reftype='ref',
+ reftarget=target, refwarn=True,
+ support_smartquotes=False,
+ ids=node["ids"],
+ classes=node.get('classes', []))
+ ref += nodes.inline(target, '[%s]' % target)
+ copy_source_info(node, ref)
+ node.replace_self(ref)
+
+ # register reference node to domain
+ domain.note_citation_reference(ref)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(CitationDomain)
+ app.add_transform(CitationDefinitionTransform)
+ app.add_transform(CitationReferenceTransform)
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 1,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py
new file mode 100644
index 0000000..80920c6
--- /dev/null
+++ b/sphinx/domains/cpp.py
@@ -0,0 +1,8233 @@
+"""The C++ language domain."""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any, Callable, TypeVar
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.directives import ObjectDescription
+from sphinx.domains import Domain, ObjType
+from sphinx.errors import NoUri
+from sphinx.locale import _, __
+from sphinx.roles import SphinxRole, XRefRole
+from sphinx.transforms import SphinxTransform
+from sphinx.transforms.post_transforms import ReferencesResolver
+from sphinx.util import logging
+from sphinx.util.cfamily import (
+ ASTAttributeList,
+ ASTBaseBase,
+ ASTBaseParenExprList,
+ BaseParser,
+ DefinitionError,
+ NoOldIdError,
+ StringifyTransform,
+ UnsupportedMultiCharacterCharLiteral,
+ anon_identifier_re,
+ binary_literal_re,
+ char_literal_re,
+ float_literal_re,
+ float_literal_suffix_re,
+ hex_literal_re,
+ identifier_re,
+ integer_literal_re,
+ integers_literal_suffix_re,
+ octal_literal_re,
+ verify_description_mode,
+)
+from sphinx.util.docfields import Field, GroupedField
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import make_refnode
+
+if TYPE_CHECKING:
+ from collections.abc import Generator, Iterator
+
+ from docutils.nodes import Element, Node, TextElement, system_message
+
+ from sphinx.addnodes import desc_signature, pending_xref
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+
+logger = logging.getLogger(__name__)
+T = TypeVar('T')
+
+"""
+ Important note on ids
+ ----------------------------------------------------------------------------
+
+ Multiple id generation schemes are used due to backwards compatibility.
+ - v1: 1.2.3 <= version < 1.3
+ The style used before the rewrite.
+ It is not the actual old code, but a replication of the behaviour.
+ - v2: 1.3 <= version < now
+ Standardised mangling scheme from
+ https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
+ though not completely implemented.
+ All versions are generated and attached to elements. The newest is used for
+ the index. All of the versions should work as permalinks.
+
+
+ Signature Nodes and Tagnames
+ ----------------------------------------------------------------------------
+
+ Each signature is in a desc_signature node, where all children are
+ desc_signature_line nodes. Each of these lines will have the attribute
+ 'sphinx_line_type' set to one of the following (prioritized):
+ - 'declarator', if the line contains the name of the declared object.
+ - 'templateParams', if the line starts a template parameter list,
+ - 'templateParams', if the line has template parameters
+ Note: such lines might get a new tag in the future.
+ - 'templateIntroduction, if the line is on the form 'conceptName{...}'
+ No other desc_signature nodes should exist (so far).
+
+
+ Grammar
+ ----------------------------------------------------------------------------
+
+ See https://www.nongnu.org/hcb/ for the grammar,
+ and https://github.com/cplusplus/draft/blob/master/source/grammar.tex,
+ and https://github.com/cplusplus/concepts-ts
+ for the newest grammar.
+
+ common grammar things:
+ template-declaration ->
+ "template" "<" template-parameter-list ">" declaration
+ template-parameter-list ->
+ template-parameter
+ | template-parameter-list "," template-parameter
+ template-parameter ->
+ type-parameter
+ | parameter-declaration # i.e., same as a function argument
+
+ type-parameter ->
+ "class" "..."[opt] identifier[opt]
+ | "class" identifier[opt] "=" type-id
+ | "typename" "..."[opt] identifier[opt]
+ | "typename" identifier[opt] "=" type-id
+ | "template" "<" template-parameter-list ">"
+ "class" "..."[opt] identifier[opt]
+ | "template" "<" template-parameter-list ">"
+ "class" identifier[opt] "=" id-expression
+ # also, from C++17 we can have "typename" in template templates
+ templateDeclPrefix ->
+ "template" "<" template-parameter-list ">"
+
+ simple-declaration ->
+ attribute-specifier-seq[opt] decl-specifier-seq[opt]
+ init-declarator-list[opt] ;
+ # Make the semicolon optional.
+ # For now: drop the attributes (TODO).
+ # Use at most 1 init-declarator.
+ -> decl-specifier-seq init-declarator
+ -> decl-specifier-seq declarator initializer
+
+ decl-specifier ->
+ storage-class-specifier ->
+ ( "static" (only for member_object and function_object)
+ | "extern" (only for member_object and function_object)
+ | "register"
+ )
+ thread_local[opt] (only for member_object)
+ (it can also appear before the others)
+
+ | type-specifier -> trailing-type-specifier
+ | function-specifier -> "inline" | "virtual" | "explicit" (only
+ for function_object)
+ | "friend" (only for function_object)
+ | "constexpr" (only for member_object and function_object)
+ trailing-type-specifier ->
+ simple-type-specifier
+ | elaborated-type-specifier
+ | typename-specifier
+ | cv-qualifier -> "const" | "volatile"
+ stricter grammar for decl-specifier-seq (with everything, each object
+ uses a subset):
+ visibility storage-class-specifier function-specifier "friend"
+ "constexpr" "volatile" "const" trailing-type-specifier
+ # where trailing-type-specifier can no be cv-qualifier
+ # Inside e.g., template parameters a strict subset is used
+ # (see type-specifier-seq)
+ trailing-type-specifier ->
+ simple-type-specifier ->
+ ::[opt] nested-name-specifier[opt] type-name
+ | ::[opt] nested-name-specifier "template" simple-template-id
+ | "char" | "bool" | etc.
+ | decltype-specifier
+ | elaborated-type-specifier ->
+ class-key attribute-specifier-seq[opt] ::[opt]
+ nested-name-specifier[opt] identifier
+ | class-key ::[opt] nested-name-specifier[opt] template[opt]
+ simple-template-id
+ | "enum" ::[opt] nested-name-specifier[opt] identifier
+ | typename-specifier ->
+ "typename" ::[opt] nested-name-specifier identifier
+ | "typename" ::[opt] nested-name-specifier template[opt]
+ simple-template-id
+ class-key -> "class" | "struct" | "union"
+ type-name ->* identifier | simple-template-id
+ # ignoring attributes and decltype, and then some left-factoring
+ trailing-type-specifier ->
+ rest-of-trailing
+ ("class" | "struct" | "union" | "typename") rest-of-trailing
+ built-in -> "char" | "bool" | etc.
+ decltype-specifier
+ rest-of-trailing -> (with some simplification)
+ "::"[opt] list-of-elements-separated-by-::
+ element ->
+ "template"[opt] identifier ("<" template-argument-list ">")[opt]
+ template-argument-list ->
+ template-argument "..."[opt]
+ | template-argument-list "," template-argument "..."[opt]
+ template-argument ->
+ constant-expression
+ | type-specifier-seq abstract-declarator
+ | id-expression
+
+
+ declarator ->
+ ptr-declarator
+ | noptr-declarator parameters-and-qualifiers trailing-return-type
+ ptr-declarator ->
+ noptr-declarator
+ | ptr-operator ptr-declarator
+ noptr-declarator ->
+ declarator-id attribute-specifier-seq[opt] ->
+ "..."[opt] id-expression
+ | rest-of-trailing
+ | noptr-declarator parameters-and-qualifiers
+ | noptr-declarator "[" constant-expression[opt] "]"
+ attribute-specifier-seq[opt]
+ | "(" ptr-declarator ")"
+ ptr-operator ->
+ "*" attribute-specifier-seq[opt] cv-qualifier-seq[opt]
+ | "& attribute-specifier-seq[opt]
+ | "&&" attribute-specifier-seq[opt]
+ | "::"[opt] nested-name-specifier "*" attribute-specifier-seq[opt]
+ cv-qualifier-seq[opt]
+ # function_object must use a parameters-and-qualifiers, the others may
+ # use it (e.g., function pointers)
+ parameters-and-qualifiers ->
+ "(" parameter-clause ")" attribute-specifier-seq[opt]
+ cv-qualifier-seq[opt] ref-qualifier[opt]
+ exception-specification[opt]
+ ref-qualifier -> "&" | "&&"
+ exception-specification ->
+ "noexcept" ("(" constant-expression ")")[opt]
+ "throw" ("(" type-id-list ")")[opt]
+ # TODO: we don't implement attributes
+ # member functions can have initializers, but we fold them into here
+ memberFunctionInit -> "=" "0"
+ # (note: only "0" is allowed as the value, according to the standard,
+ # right?)
+
+ enum-head ->
+ enum-key attribute-specifier-seq[opt] nested-name-specifier[opt]
+ identifier enum-base[opt]
+ enum-key -> "enum" | "enum struct" | "enum class"
+ enum-base ->
+ ":" type
+ enumerator-definition ->
+ identifier
+ | identifier "=" constant-expression
+
+ We additionally add the possibility for specifying the visibility as the
+ first thing.
+
+ concept_object:
+ goal:
+ just a declaration of the name (for now)
+
+ grammar: only a single template parameter list, and the nested name
+ may not have any template argument lists
+
+ "template" "<" template-parameter-list ">"
+ nested-name-specifier
+
+ type_object:
+ goal:
+ either a single type (e.g., "MyClass:Something_T" or a typedef-like
+ thing (e.g. "Something Something_T" or "int I_arr[]"
+ grammar, single type: based on a type in a function parameter, but
+ without a name:
+ parameter-declaration
+ -> attribute-specifier-seq[opt] decl-specifier-seq
+ abstract-declarator[opt]
+ # Drop the attributes
+ -> decl-specifier-seq abstract-declarator[opt]
+ grammar, typedef-like: no initilizer
+ decl-specifier-seq declarator
+ Can start with a templateDeclPrefix.
+
+ member_object:
+ goal: as a type_object which must have a declarator, and optionally
+ with a initializer
+ grammar:
+ decl-specifier-seq declarator initializer
+ Can start with a templateDeclPrefix.
+
+ function_object:
+ goal: a function declaration, TODO: what about templates? for now: skip
+ grammar: no initializer
+ decl-specifier-seq declarator
+ Can start with a templateDeclPrefix.
+
+ class_object:
+ goal: a class declaration, but with specification of a base class
+ grammar:
+ attribute-specifier-seq[opt]
+ nested-name "final"[opt] (":" base-specifier-list)[opt]
+ base-specifier-list ->
+ base-specifier "..."[opt]
+ | base-specifier-list, base-specifier "..."[opt]
+ base-specifier ->
+ base-type-specifier
+ | "virtual" access-spe"cifier[opt] base-type-specifier
+ | access-specifier[opt] "virtual"[opt] base-type-specifier
+ Can start with a templateDeclPrefix.
+
+ enum_object:
+ goal: an unscoped enum or a scoped enum, optionally with the underlying
+ type specified
+ grammar:
+ ("class" | "struct")[opt] visibility[opt]
+ attribute-specifier-seq[opt] nested-name (":" type)[opt]
+ enumerator_object:
+ goal: an element in a scoped or unscoped enum. The name should be
+ injected according to the scopedness.
+ grammar:
+ nested-name ("=" constant-expression)
+
+ namespace_object:
+ goal: a directive to put all following declarations in a specific scope
+ grammar:
+ nested-name
+"""
+
+udl_identifier_re = re.compile(r'''
+ [a-zA-Z_][a-zA-Z0-9_]*\b # note, no word boundary in the beginning
+''', re.VERBOSE)
+_string_re = re.compile(r"[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'"
+ r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S)
+_visibility_re = re.compile(r'\b(public|private|protected)\b')
+_operator_re = re.compile(r'''
+ \[\s*\]
+ | \(\s*\)
+ | \+\+ | --
+ | ->\*? | \,
+ | (<<|>>)=? | && | \|\|
+ | <=>
+ | [!<>=/*%+|&^~-]=?
+ | (\b(and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq)\b)
+''', re.VERBOSE)
+_fold_operator_re = re.compile(r'''
+ ->\* | \.\* | \,
+ | (<<|>>)=? | && | \|\|
+ | !=
+ | [<>=/*%+|&^~-]=?
+''', re.VERBOSE)
+# see https://en.cppreference.com/w/cpp/keyword
+_keywords = [
+ 'alignas', 'alignof', 'and', 'and_eq', 'asm', 'auto', 'bitand', 'bitor',
+ 'bool', 'break', 'case', 'catch', 'char', 'char8_t', 'char16_t', 'char32_t',
+ 'class', 'compl', 'concept', 'const', 'consteval', 'constexpr', 'constinit',
+ 'const_cast', 'continue',
+ 'decltype', 'default', 'delete', 'do', 'double', 'dynamic_cast', 'else',
+ 'enum', 'explicit', 'export', 'extern', 'false', 'float', 'for', 'friend',
+ 'goto', 'if', 'inline', 'int', 'long', 'mutable', 'namespace', 'new',
+ 'noexcept', 'not', 'not_eq', 'nullptr', 'operator', 'or', 'or_eq',
+ 'private', 'protected', 'public', 'register', 'reinterpret_cast',
+ 'requires', 'return', 'short', 'signed', 'sizeof', 'static',
+ 'static_assert', 'static_cast', 'struct', 'switch', 'template', 'this',
+ 'thread_local', 'throw', 'true', 'try', 'typedef', 'typeid', 'typename',
+ 'union', 'unsigned', 'using', 'virtual', 'void', 'volatile', 'wchar_t',
+ 'while', 'xor', 'xor_eq',
+]
+
+
+_simple_type_specifiers_re = re.compile(r"""
+ \b(
+ auto|void|bool
+ |signed|unsigned
+ |short|long
+ |char|wchar_t|char(8|16|32)_t
+ |int
+ |__int(64|128) # extension
+ |float|double
+ |__float80|_Float64x|__float128|_Float128 # extension
+ |_Complex|_Imaginary # extension
+ )\b
+""", re.VERBOSE)
+
+_max_id = 4
+_id_prefix = [None, '', '_CPPv2', '_CPPv3', '_CPPv4']
+# Ids are used in lookup keys which are used across pickled files,
+# so when _max_id changes, make sure to update the ENV_VERSION.
+
+# ------------------------------------------------------------------------------
+# Id v1 constants
+# ------------------------------------------------------------------------------
+
+_id_fundamental_v1 = {
+ 'char': 'c',
+ 'signed char': 'c',
+ 'unsigned char': 'C',
+ 'int': 'i',
+ 'signed int': 'i',
+ 'unsigned int': 'U',
+ 'long': 'l',
+ 'signed long': 'l',
+ 'unsigned long': 'L',
+ 'bool': 'b',
+}
+_id_shorthands_v1 = {
+ 'std::string': 'ss',
+ 'std::ostream': 'os',
+ 'std::istream': 'is',
+ 'std::iostream': 'ios',
+ 'std::vector': 'v',
+ 'std::map': 'm',
+}
+_id_operator_v1 = {
+ 'new': 'new-operator',
+ 'new[]': 'new-array-operator',
+ 'delete': 'delete-operator',
+ 'delete[]': 'delete-array-operator',
+ # the arguments will make the difference between unary and binary
+ # '+(unary)' : 'ps',
+ # '-(unary)' : 'ng',
+ # '&(unary)' : 'ad',
+ # '*(unary)' : 'de',
+ '~': 'inv-operator',
+ '+': 'add-operator',
+ '-': 'sub-operator',
+ '*': 'mul-operator',
+ '/': 'div-operator',
+ '%': 'mod-operator',
+ '&': 'and-operator',
+ '|': 'or-operator',
+ '^': 'xor-operator',
+ '=': 'assign-operator',
+ '+=': 'add-assign-operator',
+ '-=': 'sub-assign-operator',
+ '*=': 'mul-assign-operator',
+ '/=': 'div-assign-operator',
+ '%=': 'mod-assign-operator',
+ '&=': 'and-assign-operator',
+ '|=': 'or-assign-operator',
+ '^=': 'xor-assign-operator',
+ '<<': 'lshift-operator',
+ '>>': 'rshift-operator',
+ '<<=': 'lshift-assign-operator',
+ '>>=': 'rshift-assign-operator',
+ '==': 'eq-operator',
+ '!=': 'neq-operator',
+ '<': 'lt-operator',
+ '>': 'gt-operator',
+ '<=': 'lte-operator',
+ '>=': 'gte-operator',
+ '!': 'not-operator',
+ '&&': 'sand-operator',
+ '||': 'sor-operator',
+ '++': 'inc-operator',
+ '--': 'dec-operator',
+ ',': 'comma-operator',
+ '->*': 'pointer-by-pointer-operator',
+ '->': 'pointer-operator',
+ '()': 'call-operator',
+ '[]': 'subscript-operator',
+}
+
+# ------------------------------------------------------------------------------
+# Id v > 1 constants
+# ------------------------------------------------------------------------------
+
+_id_fundamental_v2 = {
+ # not all of these are actually parsed as fundamental types, TODO: do that
+ 'void': 'v',
+ 'bool': 'b',
+ 'char': 'c',
+ 'signed char': 'a',
+ 'unsigned char': 'h',
+ 'wchar_t': 'w',
+ 'char32_t': 'Di',
+ 'char16_t': 'Ds',
+ 'char8_t': 'Du',
+ 'short': 's',
+ 'short int': 's',
+ 'signed short': 's',
+ 'signed short int': 's',
+ 'unsigned short': 't',
+ 'unsigned short int': 't',
+ 'int': 'i',
+ 'signed': 'i',
+ 'signed int': 'i',
+ 'unsigned': 'j',
+ 'unsigned int': 'j',
+ 'long': 'l',
+ 'long int': 'l',
+ 'signed long': 'l',
+ 'signed long int': 'l',
+ 'unsigned long': 'm',
+ 'unsigned long int': 'm',
+ 'long long': 'x',
+ 'long long int': 'x',
+ 'signed long long': 'x',
+ 'signed long long int': 'x',
+ '__int64': 'x',
+ 'unsigned long long': 'y',
+ 'unsigned long long int': 'y',
+ '__int128': 'n',
+ 'signed __int128': 'n',
+ 'unsigned __int128': 'o',
+ 'float': 'f',
+ 'double': 'd',
+ 'long double': 'e',
+ '__float80': 'e', '_Float64x': 'e',
+ '__float128': 'g', '_Float128': 'g',
+ '_Complex float': 'Cf',
+ '_Complex double': 'Cd',
+ '_Complex long double': 'Ce',
+ '_Imaginary float': 'f',
+ '_Imaginary double': 'd',
+ '_Imaginary long double': 'e',
+ 'auto': 'Da',
+ 'decltype(auto)': 'Dc',
+ 'std::nullptr_t': 'Dn',
+}
+_id_operator_v2 = {
+ 'new': 'nw',
+ 'new[]': 'na',
+ 'delete': 'dl',
+ 'delete[]': 'da',
+ # the arguments will make the difference between unary and binary
+ # in operator definitions
+ # '+(unary)' : 'ps',
+ # '-(unary)' : 'ng',
+ # '&(unary)' : 'ad',
+ # '*(unary)' : 'de',
+ '~': 'co', 'compl': 'co',
+ '+': 'pl',
+ '-': 'mi',
+ '*': 'ml',
+ '/': 'dv',
+ '%': 'rm',
+ '&': 'an', 'bitand': 'an',
+ '|': 'or', 'bitor': 'or',
+ '^': 'eo', 'xor': 'eo',
+ '=': 'aS',
+ '+=': 'pL',
+ '-=': 'mI',
+ '*=': 'mL',
+ '/=': 'dV',
+ '%=': 'rM',
+ '&=': 'aN', 'and_eq': 'aN',
+ '|=': 'oR', 'or_eq': 'oR',
+ '^=': 'eO', 'xor_eq': 'eO',
+ '<<': 'ls',
+ '>>': 'rs',
+ '<<=': 'lS',
+ '>>=': 'rS',
+ '==': 'eq',
+ '!=': 'ne', 'not_eq': 'ne',
+ '<': 'lt',
+ '>': 'gt',
+ '<=': 'le',
+ '>=': 'ge',
+ '<=>': 'ss',
+ '!': 'nt', 'not': 'nt',
+ '&&': 'aa', 'and': 'aa',
+ '||': 'oo', 'or': 'oo',
+ '++': 'pp',
+ '--': 'mm',
+ ',': 'cm',
+ '->*': 'pm',
+ '->': 'pt',
+ '()': 'cl',
+ '[]': 'ix',
+ '.*': 'ds', # this one is not overloadable, but we need it for expressions
+ '?': 'qu',
+}
+_id_operator_unary_v2 = {
+ '++': 'pp_',
+ '--': 'mm_',
+ '*': 'de',
+ '&': 'ad',
+ '+': 'ps',
+ '-': 'ng',
+ '!': 'nt', 'not': 'nt',
+ '~': 'co', 'compl': 'co',
+}
+_id_char_from_prefix: dict[str | None, str] = {
+ None: 'c', 'u8': 'c',
+ 'u': 'Ds', 'U': 'Di', 'L': 'w',
+}
+# these are ordered by preceedence
+_expression_bin_ops = [
+ ['||', 'or'],
+ ['&&', 'and'],
+ ['|', 'bitor'],
+ ['^', 'xor'],
+ ['&', 'bitand'],
+ ['==', '!=', 'not_eq'],
+ ['<=>', '<=', '>=', '<', '>'],
+ ['<<', '>>'],
+ ['+', '-'],
+ ['*', '/', '%'],
+ ['.*', '->*'],
+]
+_expression_unary_ops = ["++", "--", "*", "&", "+", "-", "!", "not", "~", "compl"]
+_expression_assignment_ops = ["=", "*=", "/=", "%=", "+=", "-=",
+ ">>=", "<<=", "&=", "and_eq", "^=", "|=", "xor_eq", "or_eq"]
+_id_explicit_cast = {
+ 'dynamic_cast': 'dc',
+ 'static_cast': 'sc',
+ 'const_cast': 'cc',
+ 'reinterpret_cast': 'rc',
+}
+
+
+class _DuplicateSymbolError(Exception):
+ def __init__(self, symbol: Symbol, declaration: ASTDeclaration) -> None:
+ assert symbol
+ assert declaration
+ self.symbol = symbol
+ self.declaration = declaration
+
+ def __str__(self) -> str:
+ return "Internal C++ duplicate symbol error:\n%s" % self.symbol.dump(0)
+
+
+class ASTBase(ASTBaseBase):
+ pass
+
+
+# Names
+################################################################################
+
+class ASTIdentifier(ASTBase):
+ def __init__(self, identifier: str) -> None:
+ assert identifier is not None
+ assert len(identifier) != 0
+ self.identifier = identifier
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.identifier)
+
+ def is_anon(self) -> bool:
+ return self.identifier[0] == '@'
+
+ def get_id(self, version: int) -> str:
+ if self.is_anon() and version < 3:
+ raise NoOldIdError
+ if version == 1:
+ if self.identifier == 'size_t':
+ return 's'
+ else:
+ return self.identifier
+ if self.identifier == "std":
+ return 'St'
+ elif self.identifier[0] == "~":
+ # a destructor, just use an arbitrary version of dtors
+ return 'D0'
+ else:
+ if self.is_anon():
+ return 'Ut%d_%s' % (len(self.identifier) - 1, self.identifier[1:])
+ else:
+ return str(len(self.identifier)) + self.identifier
+
+ # and this is where we finally make a difference between __str__ and the display string
+
+ def __str__(self) -> str:
+ return self.identifier
+
+ def get_display_string(self) -> str:
+ return "[anonymous]" if self.is_anon() else self.identifier
+
+ def describe_signature(self, signode: TextElement, mode: str, env: BuildEnvironment,
+ prefix: str, templateArgs: str, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.is_anon():
+ node = addnodes.desc_sig_name(text="[anonymous]")
+ else:
+ node = addnodes.desc_sig_name(self.identifier, self.identifier)
+ if mode == 'markType':
+ targetText = prefix + self.identifier + templateArgs
+ pnode = addnodes.pending_xref('', refdomain='cpp',
+ reftype='identifier',
+ reftarget=targetText, modname=None,
+ classname=None)
+ pnode['cpp:parent_key'] = symbol.get_lookup_key()
+ pnode += node
+ signode += pnode
+ elif mode == 'lastIsName':
+ nameNode = addnodes.desc_name()
+ nameNode += node
+ signode += nameNode
+ elif mode == 'noneIsName':
+ signode += node
+ elif mode == 'param':
+ node['classes'].append('sig-param')
+ signode += node
+ elif mode == 'udl':
+ # the target is 'operator""id' instead of just 'id'
+ assert len(prefix) == 0
+ assert len(templateArgs) == 0
+ assert not self.is_anon()
+ targetText = 'operator""' + self.identifier
+ pnode = addnodes.pending_xref('', refdomain='cpp',
+ reftype='identifier',
+ reftarget=targetText, modname=None,
+ classname=None)
+ pnode['cpp:parent_key'] = symbol.get_lookup_key()
+ pnode += node
+ signode += pnode
+ else:
+ raise Exception('Unknown description mode: %s' % mode)
+
+
+class ASTNestedNameElement(ASTBase):
+ def __init__(self, identOrOp: ASTIdentifier | ASTOperator,
+ templateArgs: ASTTemplateArgs) -> None:
+ self.identOrOp = identOrOp
+ self.templateArgs = templateArgs
+
+ def is_operator(self) -> bool:
+ return False
+
+ def get_id(self, version: int) -> str:
+ res = self.identOrOp.get_id(version)
+ if self.templateArgs:
+ res += self.templateArgs.get_id(version)
+ return res
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = transform(self.identOrOp)
+ if self.templateArgs:
+ res += transform(self.templateArgs)
+ return res
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, prefix: str, symbol: Symbol) -> None:
+ tArgs = str(self.templateArgs) if self.templateArgs is not None else ''
+ self.identOrOp.describe_signature(signode, mode, env, prefix, tArgs, symbol)
+ if self.templateArgs is not None:
+ self.templateArgs.describe_signature(signode, 'markType', env, symbol)
+
+
+class ASTNestedName(ASTBase):
+ def __init__(self, names: list[ASTNestedNameElement],
+ templates: list[bool], rooted: bool) -> None:
+ assert len(names) > 0
+ self.names = names
+ self.templates = templates
+ assert len(self.names) == len(self.templates)
+ self.rooted = rooted
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self
+
+ def num_templates(self) -> int:
+ count = 0
+ for n in self.names:
+ if n.is_operator():
+ continue
+ if n.templateArgs:
+ count += 1
+ return count
+
+ def get_id(self, version: int, modifiers: str = '') -> str:
+ if version == 1:
+ tt = str(self)
+ if tt in _id_shorthands_v1:
+ return _id_shorthands_v1[tt]
+ else:
+ return '::'.join(n.get_id(version) for n in self.names)
+
+ res = []
+ if len(self.names) > 1 or len(modifiers) > 0:
+ res.append('N')
+ res.append(modifiers)
+ for n in self.names:
+ res.append(n.get_id(version))
+ if len(self.names) > 1 or len(modifiers) > 0:
+ res.append('E')
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.rooted:
+ res.append('')
+ for i in range(len(self.names)):
+ n = self.names[i]
+ if self.templates[i]:
+ res.append("template " + transform(n))
+ else:
+ res.append(transform(n))
+ return '::'.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ # just print the name part, with template args, not template params
+ if mode == 'noneIsName':
+ if self.rooted:
+ unreachable = "Can this happen?"
+ raise AssertionError(unreachable) # TODO
+ signode += nodes.Text('::')
+ for i in range(len(self.names)):
+ if i != 0:
+ unreachable = "Can this happen?"
+ raise AssertionError(unreachable) # TODO
+ signode += nodes.Text('::blah')
+ n = self.names[i]
+ if self.templates[i]:
+ unreachable = "Can this happen?"
+ raise AssertionError(unreachable) # TODO
+ signode += nodes.Text("template")
+ signode += nodes.Text(" ")
+ n.describe_signature(signode, mode, env, '', symbol)
+ elif mode == 'param':
+ assert not self.rooted, str(self)
+ assert len(self.names) == 1
+ assert not self.templates[0]
+ self.names[0].describe_signature(signode, 'param', env, '', symbol)
+ elif mode in ('markType', 'lastIsName', 'markName'):
+ # Each element should be a pending xref targeting the complete
+ # prefix. however, only the identifier part should be a link, such
+ # that template args can be a link as well.
+ # For 'lastIsName' we should also prepend template parameter lists.
+ templateParams: list[Any] = []
+ if mode == 'lastIsName':
+ assert symbol is not None
+ if symbol.declaration.templatePrefix is not None:
+ templateParams = symbol.declaration.templatePrefix.templates
+ iTemplateParams = 0
+ templateParamsPrefix = ''
+ prefix = ''
+ first = True
+ names = self.names[:-1] if mode == 'lastIsName' else self.names
+ # If lastIsName, then wrap all of the prefix in a desc_addname,
+ # else append directly to signode.
+ # NOTE: Breathe previously relied on the prefix being in the desc_addname node,
+ # so it can remove it in inner declarations.
+ dest = signode
+ if mode == 'lastIsName':
+ dest = addnodes.desc_addname()
+ if self.rooted:
+ prefix += '::'
+ if mode == 'lastIsName' and len(names) == 0:
+ signode += addnodes.desc_sig_punctuation('::', '::')
+ else:
+ dest += addnodes.desc_sig_punctuation('::', '::')
+ for i in range(len(names)):
+ nne = names[i]
+ template = self.templates[i]
+ if not first:
+ dest += addnodes.desc_sig_punctuation('::', '::')
+ prefix += '::'
+ if template:
+ dest += addnodes.desc_sig_keyword('template', 'template')
+ dest += addnodes.desc_sig_space()
+ first = False
+ txt_nne = str(nne)
+ if txt_nne != '':
+ if nne.templateArgs and iTemplateParams < len(templateParams):
+ templateParamsPrefix += str(templateParams[iTemplateParams])
+ iTemplateParams += 1
+ nne.describe_signature(dest, 'markType',
+ env, templateParamsPrefix + prefix, symbol)
+ prefix += txt_nne
+ if mode == 'lastIsName':
+ if len(self.names) > 1:
+ dest += addnodes.desc_sig_punctuation('::', '::')
+ signode += dest
+ if self.templates[-1]:
+ signode += addnodes.desc_sig_keyword('template', 'template')
+ signode += addnodes.desc_sig_space()
+ self.names[-1].describe_signature(signode, mode, env, '', symbol)
+ else:
+ raise Exception('Unknown description mode: %s' % mode)
+
+
+################################################################################
+# Expressions
+################################################################################
+
+class ASTExpression(ASTBase):
+ def get_id(self, version: int) -> str:
+ raise NotImplementedError(repr(self))
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ raise NotImplementedError(repr(self))
+
+
+# Primary expressions
+################################################################################
+
+class ASTLiteral(ASTExpression):
+ pass
+
+
+class ASTPointerLiteral(ASTLiteral):
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return 'nullptr'
+
+ def get_id(self, version: int) -> str:
+ return 'LDnE'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('nullptr', 'nullptr')
+
+
+class ASTBooleanLiteral(ASTLiteral):
+ def __init__(self, value: bool) -> None:
+ self.value = value
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.value:
+ return 'true'
+ else:
+ return 'false'
+
+ def get_id(self, version: int) -> str:
+ if self.value:
+ return 'L1E'
+ else:
+ return 'L0E'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword(str(self), str(self))
+
+
+class ASTNumberLiteral(ASTLiteral):
+ def __init__(self, data: str) -> None:
+ self.data = data
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.data
+
+ def get_id(self, version: int) -> str:
+ # TODO: floats should be mangled by writing the hex of the binary representation
+ return "L%sE" % self.data.replace("'", "")
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_literal_number(self.data, self.data)
+
+
+class ASTStringLiteral(ASTLiteral):
+ def __init__(self, data: str) -> None:
+ self.data = data
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.data
+
+ def get_id(self, version: int) -> str:
+ # note: the length is not really correct with escaping
+ return "LA%d_KcE" % (len(self.data) - 2)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_literal_string(self.data, self.data)
+
+
+class ASTCharLiteral(ASTLiteral):
+ def __init__(self, prefix: str, data: str) -> None:
+ self.prefix = prefix # may be None when no prefix
+ self.data = data
+ assert prefix in _id_char_from_prefix
+ self.type = _id_char_from_prefix[prefix]
+ decoded = data.encode().decode('unicode-escape')
+ if len(decoded) == 1:
+ self.value = ord(decoded)
+ else:
+ raise UnsupportedMultiCharacterCharLiteral(decoded)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.prefix is None:
+ return "'" + self.data + "'"
+ else:
+ return self.prefix + "'" + self.data + "'"
+
+ def get_id(self, version: int) -> str:
+ # TODO: the ID should be have L E around it
+ return self.type + str(self.value)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.prefix is not None:
+ signode += addnodes.desc_sig_keyword(self.prefix, self.prefix)
+ txt = "'" + self.data + "'"
+ signode += addnodes.desc_sig_literal_char(txt, txt)
+
+
+class ASTUserDefinedLiteral(ASTLiteral):
+ def __init__(self, literal: ASTLiteral, ident: ASTIdentifier):
+ self.literal = literal
+ self.ident = ident
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.literal) + transform(self.ident)
+
+ def get_id(self, version: int) -> str:
+ # mangle as if it was a function call: ident(literal)
+ return f'clL_Zli{self.ident.get_id(version)}E{self.literal.get_id(version)}E'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.literal.describe_signature(signode, mode, env, symbol)
+ self.ident.describe_signature(signode, "udl", env, "", "", symbol)
+
+
+################################################################################
+
+class ASTThisLiteral(ASTExpression):
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "this"
+
+ def get_id(self, version: int) -> str:
+ return "fpT"
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('this', 'this')
+
+
+class ASTFoldExpr(ASTExpression):
+ def __init__(self, leftExpr: ASTExpression,
+ op: str, rightExpr: ASTExpression) -> None:
+ assert leftExpr is not None or rightExpr is not None
+ self.leftExpr = leftExpr
+ self.op = op
+ self.rightExpr = rightExpr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['(']
+ if self.leftExpr:
+ res.append(transform(self.leftExpr))
+ res.append(' ')
+ res.append(self.op)
+ res.append(' ')
+ res.append('...')
+ if self.rightExpr:
+ res.append(' ')
+ res.append(self.op)
+ res.append(' ')
+ res.append(transform(self.rightExpr))
+ res.append(')')
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ assert version >= 3
+ if version == 3:
+ return str(self)
+ # https://github.com/itanium-cxx-abi/cxx-abi/pull/67
+ res = []
+ if self.leftExpr is None: # (... op expr)
+ res.append('fl')
+ elif self.rightExpr is None: # (expr op ...)
+ res.append('fr')
+ else: # (expr op ... op expr)
+ # we don't check where the parameter pack is,
+ # we just always call this a binary left fold
+ res.append('fL')
+ res.append(_id_operator_v2[self.op])
+ if self.leftExpr:
+ res.append(self.leftExpr.get_id(version))
+ if self.rightExpr:
+ res.append(self.rightExpr.get_id(version))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ if self.leftExpr:
+ self.leftExpr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_operator(self.op, self.op)
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ if self.rightExpr:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_operator(self.op, self.op)
+ signode += addnodes.desc_sig_space()
+ self.rightExpr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTParenExpr(ASTExpression):
+ def __init__(self, expr: ASTExpression):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '(' + transform(self.expr) + ')'
+
+ def get_id(self, version: int) -> str:
+ return self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTIdExpression(ASTExpression):
+ def __init__(self, name: ASTNestedName):
+ # note: this class is basically to cast a nested name as an expression
+ self.name = name
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.name)
+
+ def get_id(self, version: int) -> str:
+ return self.name.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.name.describe_signature(signode, mode, env, symbol)
+
+
+# Postfix expressions
+################################################################################
+
+class ASTPostfixOp(ASTBase):
+ def get_id(self, idPrefix: str, version: int) -> str:
+ raise NotImplementedError(repr(self))
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ raise NotImplementedError(repr(self))
+
+
+class ASTPostfixArray(ASTPostfixOp):
+ def __init__(self, expr: ASTExpression):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '[' + transform(self.expr) + ']'
+
+ def get_id(self, idPrefix: str, version: int) -> str:
+ return 'ix' + idPrefix + self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('[', '[')
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(']', ']')
+
+
+class ASTPostfixMember(ASTPostfixOp):
+ def __init__(self, name: ASTNestedName):
+ self.name = name
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '.' + transform(self.name)
+
+ def get_id(self, idPrefix: str, version: int) -> str:
+ return 'dt' + idPrefix + self.name.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('.', '.')
+ self.name.describe_signature(signode, 'noneIsName', env, symbol)
+
+
+class ASTPostfixMemberOfPointer(ASTPostfixOp):
+ def __init__(self, name: ASTNestedName):
+ self.name = name
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '->' + transform(self.name)
+
+ def get_id(self, idPrefix: str, version: int) -> str:
+ return 'pt' + idPrefix + self.name.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_operator('->', '->')
+ self.name.describe_signature(signode, 'noneIsName', env, symbol)
+
+
+class ASTPostfixInc(ASTPostfixOp):
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '++'
+
+ def get_id(self, idPrefix: str, version: int) -> str:
+ return 'pp' + idPrefix
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_operator('++', '++')
+
+
+class ASTPostfixDec(ASTPostfixOp):
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return '--'
+
+ def get_id(self, idPrefix: str, version: int) -> str:
+ return 'mm' + idPrefix
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_operator('--', '--')
+
+
+class ASTPostfixCallExpr(ASTPostfixOp):
+ def __init__(self, lst: ASTParenExprList | ASTBracedInitList) -> None:
+ self.lst = lst
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.lst)
+
+ def get_id(self, idPrefix: str, version: int) -> str:
+ res = ['cl', idPrefix]
+ for e in self.lst.exprs:
+ res.append(e.get_id(version))
+ res.append('E')
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.lst.describe_signature(signode, mode, env, symbol)
+
+
+class ASTPostfixExpr(ASTExpression):
+ def __init__(self, prefix: ASTType, postFixes: list[ASTPostfixOp]):
+ self.prefix = prefix
+ self.postFixes = postFixes
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = [transform(self.prefix)]
+ for p in self.postFixes:
+ res.append(transform(p))
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ id = self.prefix.get_id(version)
+ for p in self.postFixes:
+ id = p.get_id(id, version)
+ return id
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.prefix.describe_signature(signode, mode, env, symbol)
+ for p in self.postFixes:
+ p.describe_signature(signode, mode, env, symbol)
+
+
+class ASTExplicitCast(ASTExpression):
+ def __init__(self, cast: str, typ: ASTType, expr: ASTExpression):
+ assert cast in _id_explicit_cast
+ self.cast = cast
+ self.typ = typ
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = [self.cast]
+ res.append('<')
+ res.append(transform(self.typ))
+ res.append('>(')
+ res.append(transform(self.expr))
+ res.append(')')
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ return (_id_explicit_cast[self.cast] +
+ self.typ.get_id(version) +
+ self.expr.get_id(version))
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword(self.cast, self.cast)
+ signode += addnodes.desc_sig_punctuation('<', '<')
+ self.typ.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation('>', '>')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTTypeId(ASTExpression):
+ def __init__(self, typeOrExpr: ASTType | ASTExpression, isType: bool):
+ self.typeOrExpr = typeOrExpr
+ self.isType = isType
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return 'typeid(' + transform(self.typeOrExpr) + ')'
+
+ def get_id(self, version: int) -> str:
+ prefix = 'ti' if self.isType else 'te'
+ return prefix + self.typeOrExpr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('typeid', 'typeid')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.typeOrExpr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+# Unary expressions
+################################################################################
+
+class ASTUnaryOpExpr(ASTExpression):
+ def __init__(self, op: str, expr: ASTExpression):
+ self.op = op
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.op[0] in 'cn':
+ return self.op + " " + transform(self.expr)
+ else:
+ return self.op + transform(self.expr)
+
+ def get_id(self, version: int) -> str:
+ return _id_operator_unary_v2[self.op] + self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.op[0] in 'cn':
+ signode += addnodes.desc_sig_keyword(self.op, self.op)
+ signode += addnodes.desc_sig_space()
+ else:
+ signode += addnodes.desc_sig_operator(self.op, self.op)
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTSizeofParamPack(ASTExpression):
+ def __init__(self, identifier: ASTIdentifier):
+ self.identifier = identifier
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "sizeof...(" + transform(self.identifier) + ")"
+
+ def get_id(self, version: int) -> str:
+ return 'sZ' + self.identifier.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('sizeof', 'sizeof')
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.identifier.describe_signature(signode, 'markType', env,
+ symbol=symbol, prefix="", templateArgs="")
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTSizeofType(ASTExpression):
+ def __init__(self, typ: ASTType):
+ self.typ = typ
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "sizeof(" + transform(self.typ) + ")"
+
+ def get_id(self, version: int) -> str:
+ return 'st' + self.typ.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('sizeof', 'sizeof')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.typ.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTSizeofExpr(ASTExpression):
+ def __init__(self, expr: ASTExpression):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "sizeof " + transform(self.expr)
+
+ def get_id(self, version: int) -> str:
+ return 'sz' + self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('sizeof', 'sizeof')
+ signode += addnodes.desc_sig_space()
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTAlignofExpr(ASTExpression):
+ def __init__(self, typ: ASTType):
+ self.typ = typ
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "alignof(" + transform(self.typ) + ")"
+
+ def get_id(self, version: int) -> str:
+ return 'at' + self.typ.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('alignof', 'alignof')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.typ.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTNoexceptExpr(ASTExpression):
+ def __init__(self, expr: ASTExpression):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return 'noexcept(' + transform(self.expr) + ')'
+
+ def get_id(self, version: int) -> str:
+ return 'nx' + self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('noexcept', 'noexcept')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTNewExpr(ASTExpression):
+ def __init__(self, rooted: bool, isNewTypeId: bool, typ: ASTType,
+ initList: ASTParenExprList | ASTBracedInitList) -> None:
+ self.rooted = rooted
+ self.isNewTypeId = isNewTypeId
+ self.typ = typ
+ self.initList = initList
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.rooted:
+ res.append('::')
+ res.append('new ')
+ # TODO: placement
+ if self.isNewTypeId:
+ res.append(transform(self.typ))
+ else:
+ raise AssertionError
+ if self.initList is not None:
+ res.append(transform(self.initList))
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ # the array part will be in the type mangling, so na is not used
+ res = ['nw']
+ # TODO: placement
+ res.append('_')
+ res.append(self.typ.get_id(version))
+ if self.initList is not None:
+ res.append(self.initList.get_id(version))
+ else:
+ res.append('E')
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.rooted:
+ signode += addnodes.desc_sig_punctuation('::', '::')
+ signode += addnodes.desc_sig_keyword('new', 'new')
+ signode += addnodes.desc_sig_space()
+ # TODO: placement
+ if self.isNewTypeId:
+ self.typ.describe_signature(signode, mode, env, symbol)
+ else:
+ raise AssertionError
+ if self.initList is not None:
+ self.initList.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeleteExpr(ASTExpression):
+ def __init__(self, rooted: bool, array: bool, expr: ASTExpression):
+ self.rooted = rooted
+ self.array = array
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.rooted:
+ res.append('::')
+ res.append('delete ')
+ if self.array:
+ res.append('[] ')
+ res.append(transform(self.expr))
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ if self.array:
+ id = "da"
+ else:
+ id = "dl"
+ return id + self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.rooted:
+ signode += addnodes.desc_sig_punctuation('::', '::')
+ signode += addnodes.desc_sig_keyword('delete', 'delete')
+ signode += addnodes.desc_sig_space()
+ if self.array:
+ signode += addnodes.desc_sig_punctuation('[]', '[]')
+ signode += addnodes.desc_sig_space()
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+# Other expressions
+################################################################################
+
+class ASTCastExpr(ASTExpression):
+ def __init__(self, typ: ASTType, expr: ASTExpression):
+ self.typ = typ
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['(']
+ res.append(transform(self.typ))
+ res.append(')')
+ res.append(transform(self.expr))
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ return 'cv' + self.typ.get_id(version) + self.expr.get_id(version)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.typ.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTBinOpExpr(ASTExpression):
+ def __init__(self, exprs: list[ASTExpression], ops: list[str]):
+ assert len(exprs) > 0
+ assert len(exprs) == len(ops) + 1
+ self.exprs = exprs
+ self.ops = ops
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.exprs[0]))
+ for i in range(1, len(self.exprs)):
+ res.append(' ')
+ res.append(self.ops[i - 1])
+ res.append(' ')
+ res.append(transform(self.exprs[i]))
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ assert version >= 2
+ res = []
+ for i in range(len(self.ops)):
+ res.append(_id_operator_v2[self.ops[i]])
+ res.append(self.exprs[i].get_id(version))
+ res.append(self.exprs[-1].get_id(version))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.exprs[0].describe_signature(signode, mode, env, symbol)
+ for i in range(1, len(self.exprs)):
+ signode += addnodes.desc_sig_space()
+ op = self.ops[i - 1]
+ if ord(op[0]) >= ord('a') and ord(op[0]) <= ord('z'):
+ signode += addnodes.desc_sig_keyword(op, op)
+ else:
+ signode += addnodes.desc_sig_operator(op, op)
+ signode += addnodes.desc_sig_space()
+ self.exprs[i].describe_signature(signode, mode, env, symbol)
+
+
+class ASTConditionalExpr(ASTExpression):
+ def __init__(self, ifExpr: ASTExpression, thenExpr: ASTExpression,
+ elseExpr: ASTExpression):
+ self.ifExpr = ifExpr
+ self.thenExpr = thenExpr
+ self.elseExpr = elseExpr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.ifExpr))
+ res.append(' ? ')
+ res.append(transform(self.thenExpr))
+ res.append(' : ')
+ res.append(transform(self.elseExpr))
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ assert version >= 2
+ res = []
+ res.append(_id_operator_v2['?'])
+ res.append(self.ifExpr.get_id(version))
+ res.append(self.thenExpr.get_id(version))
+ res.append(self.elseExpr.get_id(version))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.ifExpr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_operator('?', '?')
+ signode += addnodes.desc_sig_space()
+ self.thenExpr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_operator(':', ':')
+ signode += addnodes.desc_sig_space()
+ self.elseExpr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTBracedInitList(ASTBase):
+ def __init__(self, exprs: list[ASTExpression | ASTBracedInitList],
+ trailingComma: bool) -> None:
+ self.exprs = exprs
+ self.trailingComma = trailingComma
+
+ def get_id(self, version: int) -> str:
+ return "il%sE" % ''.join(e.get_id(version) for e in self.exprs)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ exprs = ', '.join(transform(e) for e in self.exprs)
+ trailingComma = ',' if self.trailingComma else ''
+ return f'{{{exprs}{trailingComma}}}'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('{', '{')
+ first = True
+ for e in self.exprs:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ else:
+ first = False
+ e.describe_signature(signode, mode, env, symbol)
+ if self.trailingComma:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_punctuation('}', '}')
+
+
+class ASTAssignmentExpr(ASTExpression):
+ def __init__(self, leftExpr: ASTExpression, op: str,
+ rightExpr: ASTExpression | ASTBracedInitList):
+ self.leftExpr = leftExpr
+ self.op = op
+ self.rightExpr = rightExpr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.leftExpr))
+ res.append(' ')
+ res.append(self.op)
+ res.append(' ')
+ res.append(transform(self.rightExpr))
+ return ''.join(res)
+
+ def get_id(self, version: int) -> str:
+ # we end up generating the ID from left to right, instead of right to left
+ res = []
+ res.append(_id_operator_v2[self.op])
+ res.append(self.leftExpr.get_id(version))
+ res.append(self.rightExpr.get_id(version))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.leftExpr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_space()
+ if ord(self.op[0]) >= ord('a') and ord(self.op[0]) <= ord('z'):
+ signode += addnodes.desc_sig_keyword(self.op, self.op)
+ else:
+ signode += addnodes.desc_sig_operator(self.op, self.op)
+ signode += addnodes.desc_sig_space()
+ self.rightExpr.describe_signature(signode, mode, env, symbol)
+
+
+class ASTCommaExpr(ASTExpression):
+ def __init__(self, exprs: list[ASTExpression]):
+ assert len(exprs) > 0
+ self.exprs = exprs
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return ', '.join(transform(e) for e in self.exprs)
+
+ def get_id(self, version: int) -> str:
+ id_ = _id_operator_v2[',']
+ res = []
+ for i in range(len(self.exprs) - 1):
+ res.append(id_)
+ res.append(self.exprs[i].get_id(version))
+ res.append(self.exprs[-1].get_id(version))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.exprs[0].describe_signature(signode, mode, env, symbol)
+ for i in range(1, len(self.exprs)):
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ self.exprs[i].describe_signature(signode, mode, env, symbol)
+
+
+class ASTFallbackExpr(ASTExpression):
+ def __init__(self, expr: str):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.expr
+
+ def get_id(self, version: int) -> str:
+ return str(self.expr)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += nodes.literal(self.expr, self.expr)
+
+
+################################################################################
+# Types
+################################################################################
+
+# Things for ASTNestedName
+################################################################################
+
+class ASTOperator(ASTBase):
+ def is_anon(self) -> bool:
+ return False
+
+ def is_operator(self) -> bool:
+ return True
+
+ def get_id(self, version: int) -> str:
+ raise NotImplementedError
+
+ def _describe_identifier(self, signode: TextElement, identnode: TextElement,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ """Render the prefix into signode, and the last part into identnode."""
+ raise NotImplementedError
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, prefix: str, templateArgs: str,
+ symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if mode == 'lastIsName':
+ mainName = addnodes.desc_name()
+ self._describe_identifier(mainName, mainName, env, symbol)
+ signode += mainName
+ elif mode == 'markType':
+ targetText = prefix + str(self) + templateArgs
+ pnode = addnodes.pending_xref('', refdomain='cpp',
+ reftype='identifier',
+ reftarget=targetText, modname=None,
+ classname=None)
+ pnode['cpp:parent_key'] = symbol.get_lookup_key()
+ # Render the identifier part, but collapse it into a string
+ # and make that the a link to this operator.
+ # E.g., if it is 'operator SomeType', then 'SomeType' becomes
+ # a link to the operator, not to 'SomeType'.
+ container = nodes.literal()
+ self._describe_identifier(signode, container, env, symbol)
+ txt = container.astext()
+ pnode += addnodes.desc_name(txt, txt)
+ signode += pnode
+ else:
+ addName = addnodes.desc_addname()
+ self._describe_identifier(addName, addName, env, symbol)
+ signode += addName
+
+
+class ASTOperatorBuildIn(ASTOperator):
+ def __init__(self, op: str) -> None:
+ self.op = op
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ ids = _id_operator_v1
+ if self.op not in ids:
+ raise NoOldIdError
+ else:
+ ids = _id_operator_v2
+ if self.op not in ids:
+ raise Exception('Internal error: Built-in operator "%s" can not '
+ 'be mapped to an id.' % self.op)
+ return ids[self.op]
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.op in ('new', 'new[]', 'delete', 'delete[]') or self.op[0] in "abcnox":
+ return 'operator ' + self.op
+ else:
+ return 'operator' + self.op
+
+ def _describe_identifier(self, signode: TextElement, identnode: TextElement,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('operator', 'operator')
+ if self.op in ('new', 'new[]', 'delete', 'delete[]') or self.op[0] in "abcnox":
+ signode += addnodes.desc_sig_space()
+ identnode += addnodes.desc_sig_operator(self.op, self.op)
+
+
+class ASTOperatorLiteral(ASTOperator):
+ def __init__(self, identifier: ASTIdentifier) -> None:
+ self.identifier = identifier
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return 'li' + self.identifier.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return 'operator""' + transform(self.identifier)
+
+ def _describe_identifier(self, signode: TextElement, identnode: TextElement,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('operator', 'operator')
+ signode += addnodes.desc_sig_literal_string('""', '""')
+ self.identifier.describe_signature(identnode, 'markType', env, '', '', symbol)
+
+
+class ASTOperatorType(ASTOperator):
+ def __init__(self, type: ASTType) -> None:
+ self.type = type
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ return 'castto-%s-operator' % self.type.get_id(version)
+ else:
+ return 'cv' + self.type.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return ''.join(['operator ', transform(self.type)])
+
+ def get_name_no_template(self) -> str:
+ return str(self)
+
+ def _describe_identifier(self, signode: TextElement, identnode: TextElement,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('operator', 'operator')
+ signode += addnodes.desc_sig_space()
+ self.type.describe_signature(identnode, 'markType', env, symbol)
+
+
+class ASTTemplateArgConstant(ASTBase):
+ def __init__(self, value: ASTExpression) -> None:
+ self.value = value
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.value)
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ return str(self).replace(' ', '-')
+ if version == 2:
+ return 'X' + str(self) + 'E'
+ return 'X' + self.value.get_id(version) + 'E'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.value.describe_signature(signode, mode, env, symbol)
+
+
+class ASTTemplateArgs(ASTBase):
+ def __init__(self, args: list[ASTType | ASTTemplateArgConstant],
+ packExpansion: bool) -> None:
+ assert args is not None
+ self.args = args
+ self.packExpansion = packExpansion
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ res = []
+ res.append(':')
+ res.append('.'.join(a.get_id(version) for a in self.args))
+ res.append(':')
+ return ''.join(res)
+
+ res = []
+ res.append('I')
+ if len(self.args) > 0:
+ for a in self.args[:-1]:
+ res.append(a.get_id(version))
+ if self.packExpansion:
+ res.append('J')
+ res.append(self.args[-1].get_id(version))
+ if self.packExpansion:
+ res.append('E')
+ res.append('E')
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ', '.join(transform(a) for a in self.args)
+ if self.packExpansion:
+ res += '...'
+ return '<' + res + '>'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('<', '<')
+ first = True
+ for a in self.args:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ first = False
+ a.describe_signature(signode, 'markType', env, symbol=symbol)
+ if self.packExpansion:
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ signode += addnodes.desc_sig_punctuation('>', '>')
+
+
+# Main part of declarations
+################################################################################
+
+class ASTTrailingTypeSpec(ASTBase):
+ def get_id(self, version: int) -> str:
+ raise NotImplementedError(repr(self))
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ raise NotImplementedError(repr(self))
+
+
+class ASTTrailingTypeSpecFundamental(ASTTrailingTypeSpec):
+ def __init__(self, names: list[str], canonNames: list[str]) -> None:
+ assert len(names) != 0
+ assert len(names) == len(canonNames), (names, canonNames)
+ self.names = names
+ # the canonical name list is for ID lookup
+ self.canonNames = canonNames
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return ' '.join(self.names)
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ res = []
+ for a in self.canonNames:
+ if a in _id_fundamental_v1:
+ res.append(_id_fundamental_v1[a])
+ else:
+ res.append(a)
+ return '-'.join(res)
+
+ txt = ' '.join(self.canonNames)
+ if txt not in _id_fundamental_v2:
+ raise Exception(
+ 'Semi-internal error: Fundamental type "%s" can not be mapped '
+ 'to an ID. Is it a true fundamental type? If not so, the '
+ 'parser should have rejected it.' % txt)
+ return _id_fundamental_v2[txt]
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ first = True
+ for n in self.names:
+ if not first:
+ signode += addnodes.desc_sig_space()
+ else:
+ first = False
+ signode += addnodes.desc_sig_keyword_type(n, n)
+
+
+class ASTTrailingTypeSpecDecltypeAuto(ASTTrailingTypeSpec):
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return 'decltype(auto)'
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return 'Dc'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('decltype', 'decltype')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ signode += addnodes.desc_sig_keyword('auto', 'auto')
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTTrailingTypeSpecDecltype(ASTTrailingTypeSpec):
+ def __init__(self, expr: ASTExpression):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return 'decltype(' + transform(self.expr) + ')'
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return 'DT' + self.expr.get_id(version) + "E"
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('decltype', 'decltype')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTTrailingTypeSpecName(ASTTrailingTypeSpec):
+ def __init__(self, prefix: str, nestedName: ASTNestedName,
+ placeholderType: str | None) -> None:
+ self.prefix = prefix
+ self.nestedName = nestedName
+ self.placeholderType = placeholderType
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.nestedName
+
+ def get_id(self, version: int) -> str:
+ return self.nestedName.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.prefix:
+ res.append(self.prefix)
+ res.append(' ')
+ res.append(transform(self.nestedName))
+ if self.placeholderType is not None:
+ res.append(' ')
+ res.append(self.placeholderType)
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.prefix:
+ signode += addnodes.desc_sig_keyword(self.prefix, self.prefix)
+ signode += addnodes.desc_sig_space()
+ self.nestedName.describe_signature(signode, mode, env, symbol=symbol)
+ if self.placeholderType is not None:
+ signode += addnodes.desc_sig_space()
+ if self.placeholderType == 'auto':
+ signode += addnodes.desc_sig_keyword('auto', 'auto')
+ elif self.placeholderType == 'decltype(auto)':
+ signode += addnodes.desc_sig_keyword('decltype', 'decltype')
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ signode += addnodes.desc_sig_keyword('auto', 'auto')
+ signode += addnodes.desc_sig_punctuation(')', ')')
+ else:
+ raise AssertionError(self.placeholderType)
+
+
+class ASTFunctionParameter(ASTBase):
+ def __init__(self, arg: ASTTypeWithInit | ASTTemplateParamConstrainedTypeWithInit,
+ ellipsis: bool = False) -> None:
+ self.arg = arg
+ self.ellipsis = ellipsis
+
+ def get_id(
+ self, version: int, objectType: str | None = None, symbol: Symbol | None = None,
+ ) -> str:
+ # this is not part of the normal name mangling in C++
+ if symbol:
+ # the anchor will be our parent
+ return symbol.parent.declaration.get_id(version, prefixed=False)
+ # else, do the usual
+ if self.ellipsis:
+ return 'z'
+ else:
+ return self.arg.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.ellipsis:
+ return '...'
+ else:
+ return transform(self.arg)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.ellipsis:
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ else:
+ self.arg.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTNoexceptSpec(ASTBase):
+ def __init__(self, expr: ASTExpression | None):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.expr:
+ return 'noexcept(' + transform(self.expr) + ')'
+ return 'noexcept'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('noexcept', 'noexcept')
+ if self.expr:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.expr.describe_signature(signode, 'markType', env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTParametersQualifiers(ASTBase):
+ def __init__(self, args: list[ASTFunctionParameter], volatile: bool, const: bool,
+ refQual: str | None, exceptionSpec: ASTNoexceptSpec,
+ trailingReturn: ASTType,
+ override: bool, final: bool, attrs: ASTAttributeList,
+ initializer: str | None) -> None:
+ self.args = args
+ self.volatile = volatile
+ self.const = const
+ self.refQual = refQual
+ self.exceptionSpec = exceptionSpec
+ self.trailingReturn = trailingReturn
+ self.override = override
+ self.final = final
+ self.attrs = attrs
+ self.initializer = initializer
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.args
+
+ def get_modifiers_id(self, version: int) -> str:
+ res = []
+ if self.volatile:
+ res.append('V')
+ if self.const:
+ if version == 1:
+ res.append('C')
+ else:
+ res.append('K')
+ if self.refQual == '&&':
+ res.append('O')
+ elif self.refQual == '&':
+ res.append('R')
+ return ''.join(res)
+
+ def get_param_id(self, version: int) -> str:
+ if version == 1:
+ if len(self.args) == 0:
+ return ''
+ else:
+ return '__' + '.'.join(a.get_id(version) for a in self.args)
+ if len(self.args) == 0:
+ return 'v'
+ else:
+ return ''.join(a.get_id(version) for a in self.args)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append('(')
+ first = True
+ for a in self.args:
+ if not first:
+ res.append(', ')
+ first = False
+ res.append(str(a))
+ res.append(')')
+ if self.volatile:
+ res.append(' volatile')
+ if self.const:
+ res.append(' const')
+ if self.refQual:
+ res.append(' ')
+ res.append(self.refQual)
+ if self.exceptionSpec:
+ res.append(' ')
+ res.append(transform(self.exceptionSpec))
+ if self.trailingReturn:
+ res.append(' -> ')
+ res.append(transform(self.trailingReturn))
+ if self.final:
+ res.append(' final')
+ if self.override:
+ res.append(' override')
+ if len(self.attrs) != 0:
+ res.append(' ')
+ res.append(transform(self.attrs))
+ if self.initializer:
+ res.append(' = ')
+ res.append(self.initializer)
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ multi_line_parameter_list = False
+ test_node: Element = signode
+ while test_node.parent:
+ if not isinstance(test_node, addnodes.desc_signature):
+ test_node = test_node.parent
+ continue
+ multi_line_parameter_list = test_node.get('multi_line_parameter_list', False)
+ break
+
+ # only use the desc_parameterlist for the outer list, not for inner lists
+ if mode == 'lastIsName':
+ paramlist = addnodes.desc_parameterlist()
+ paramlist['multi_line_parameter_list'] = multi_line_parameter_list
+ for arg in self.args:
+ param = addnodes.desc_parameter('', '', noemph=True)
+ arg.describe_signature(param, 'param', env, symbol=symbol)
+ paramlist += param
+ signode += paramlist
+ else:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ first = True
+ for arg in self.args:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ first = False
+ arg.describe_signature(signode, 'markType', env, symbol=symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+ def _add_anno(signode: TextElement, text: str) -> None:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_keyword(text, text)
+
+ if self.volatile:
+ _add_anno(signode, 'volatile')
+ if self.const:
+ _add_anno(signode, 'const')
+ if self.refQual:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation(self.refQual, self.refQual)
+ if self.exceptionSpec:
+ signode += addnodes.desc_sig_space()
+ self.exceptionSpec.describe_signature(signode, mode, env, symbol)
+ if self.trailingReturn:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_operator('->', '->')
+ signode += addnodes.desc_sig_space()
+ self.trailingReturn.describe_signature(signode, mode, env, symbol)
+ if self.final:
+ _add_anno(signode, 'final')
+ if self.override:
+ _add_anno(signode, 'override')
+ if len(self.attrs) != 0:
+ signode += addnodes.desc_sig_space()
+ self.attrs.describe_signature(signode)
+ if self.initializer:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('=', '=')
+ signode += addnodes.desc_sig_space()
+ assert self.initializer in ('0', 'delete', 'default')
+ if self.initializer == '0':
+ signode += addnodes.desc_sig_literal_number('0', '0')
+ else:
+ signode += addnodes.desc_sig_keyword(self.initializer, self.initializer)
+
+
+class ASTExplicitSpec(ASTBase):
+ def __init__(self, expr: ASTExpression | None) -> None:
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['explicit']
+ if self.expr is not None:
+ res.append('(')
+ res.append(transform(self.expr))
+ res.append(')')
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('explicit', 'explicit')
+ if self.expr is not None:
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.expr.describe_signature(signode, 'markType', env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTDeclSpecsSimple(ASTBase):
+ def __init__(self, storage: str, threadLocal: bool, inline: bool, virtual: bool,
+ explicitSpec: ASTExplicitSpec | None,
+ consteval: bool, constexpr: bool, constinit: bool,
+ volatile: bool, const: bool, friend: bool,
+ attrs: ASTAttributeList) -> None:
+ self.storage = storage
+ self.threadLocal = threadLocal
+ self.inline = inline
+ self.virtual = virtual
+ self.explicitSpec = explicitSpec
+ self.consteval = consteval
+ self.constexpr = constexpr
+ self.constinit = constinit
+ self.volatile = volatile
+ self.const = const
+ self.friend = friend
+ self.attrs = attrs
+
+ def mergeWith(self, other: ASTDeclSpecsSimple) -> ASTDeclSpecsSimple:
+ if not other:
+ return self
+ return ASTDeclSpecsSimple(self.storage or other.storage,
+ self.threadLocal or other.threadLocal,
+ self.inline or other.inline,
+ self.virtual or other.virtual,
+ self.explicitSpec or other.explicitSpec,
+ self.consteval or other.consteval,
+ self.constexpr or other.constexpr,
+ self.constinit or other.constinit,
+ self.volatile or other.volatile,
+ self.const or other.const,
+ self.friend or other.friend,
+ self.attrs + other.attrs)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res: list[str] = []
+ if len(self.attrs) != 0:
+ res.append(transform(self.attrs))
+ if self.storage:
+ res.append(self.storage)
+ if self.threadLocal:
+ res.append('thread_local')
+ if self.inline:
+ res.append('inline')
+ if self.friend:
+ res.append('friend')
+ if self.virtual:
+ res.append('virtual')
+ if self.explicitSpec:
+ res.append(transform(self.explicitSpec))
+ if self.consteval:
+ res.append('consteval')
+ if self.constexpr:
+ res.append('constexpr')
+ if self.constinit:
+ res.append('constinit')
+ if self.volatile:
+ res.append('volatile')
+ if self.const:
+ res.append('const')
+ return ' '.join(res)
+
+ def describe_signature(self, signode: TextElement,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.attrs.describe_signature(signode)
+ addSpace = len(self.attrs) != 0
+
+ def _add(signode: TextElement, text: str) -> bool:
+ if addSpace:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_keyword(text, text)
+ return True
+
+ if self.storage:
+ addSpace = _add(signode, self.storage)
+ if self.threadLocal:
+ addSpace = _add(signode, 'thread_local')
+ if self.inline:
+ addSpace = _add(signode, 'inline')
+ if self.friend:
+ addSpace = _add(signode, 'friend')
+ if self.virtual:
+ addSpace = _add(signode, 'virtual')
+ if self.explicitSpec:
+ if addSpace:
+ signode += addnodes.desc_sig_space()
+ self.explicitSpec.describe_signature(signode, env, symbol)
+ addSpace = True
+ if self.consteval:
+ addSpace = _add(signode, 'consteval')
+ if self.constexpr:
+ addSpace = _add(signode, 'constexpr')
+ if self.constinit:
+ addSpace = _add(signode, 'constinit')
+ if self.volatile:
+ addSpace = _add(signode, 'volatile')
+ if self.const:
+ addSpace = _add(signode, 'const')
+
+
+class ASTDeclSpecs(ASTBase):
+ def __init__(self, outer: str,
+ leftSpecs: ASTDeclSpecsSimple, rightSpecs: ASTDeclSpecsSimple,
+ trailing: ASTTrailingTypeSpec) -> None:
+ # leftSpecs and rightSpecs are used for output
+ # allSpecs are used for id generation
+ self.outer = outer
+ self.leftSpecs = leftSpecs
+ self.rightSpecs = rightSpecs
+ self.allSpecs = self.leftSpecs.mergeWith(self.rightSpecs)
+ self.trailingTypeSpec = trailing
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ res = []
+ res.append(self.trailingTypeSpec.get_id(version))
+ if self.allSpecs.volatile:
+ res.append('V')
+ if self.allSpecs.const:
+ res.append('C')
+ return ''.join(res)
+ res = []
+ if self.allSpecs.volatile:
+ res.append('V')
+ if self.allSpecs.const:
+ res.append('K')
+ if self.trailingTypeSpec is not None:
+ res.append(self.trailingTypeSpec.get_id(version))
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res: list[str] = []
+ l = transform(self.leftSpecs)
+ if len(l) > 0:
+ res.append(l)
+ if self.trailingTypeSpec:
+ if len(res) > 0:
+ res.append(" ")
+ res.append(transform(self.trailingTypeSpec))
+ r = str(self.rightSpecs)
+ if len(r) > 0:
+ if len(res) > 0:
+ res.append(" ")
+ res.append(r)
+ return "".join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ numChildren = len(signode)
+ self.leftSpecs.describe_signature(signode, env, symbol)
+ addSpace = len(signode) != numChildren
+
+ if self.trailingTypeSpec:
+ if addSpace:
+ signode += addnodes.desc_sig_space()
+ numChildren = len(signode)
+ self.trailingTypeSpec.describe_signature(signode, mode, env,
+ symbol=symbol)
+ addSpace = len(signode) != numChildren
+
+ if len(str(self.rightSpecs)) > 0:
+ if addSpace:
+ signode += addnodes.desc_sig_space()
+ self.rightSpecs.describe_signature(signode, env, symbol)
+
+
+# Declarator
+################################################################################
+
+class ASTArray(ASTBase):
+ def __init__(self, size: ASTExpression):
+ self.size = size
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ if self.size:
+ return '[' + transform(self.size) + ']'
+ else:
+ return '[]'
+
+ def get_id(self, version: int) -> str:
+ if version == 1:
+ return 'A'
+ if version == 2:
+ if self.size:
+ return 'A' + str(self.size) + '_'
+ else:
+ return 'A_'
+ if self.size:
+ return 'A' + self.size.get_id(version) + '_'
+ else:
+ return 'A_'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('[', '[')
+ if self.size:
+ self.size.describe_signature(signode, 'markType', env, symbol)
+ signode += addnodes.desc_sig_punctuation(']', ']')
+
+
+class ASTDeclarator(ASTBase):
+ @property
+ def name(self) -> ASTNestedName:
+ raise NotImplementedError(repr(self))
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ raise NotImplementedError(repr(self))
+
+ @property
+ def isPack(self) -> bool:
+ raise NotImplementedError(repr(self))
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ raise NotImplementedError(repr(self))
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ raise NotImplementedError(repr(self))
+
+ def require_space_after_declSpecs(self) -> bool:
+ raise NotImplementedError(repr(self))
+
+ def get_modifiers_id(self, version: int) -> str:
+ raise NotImplementedError(repr(self))
+
+ def get_param_id(self, version: int) -> str:
+ raise NotImplementedError(repr(self))
+
+ def get_ptr_suffix_id(self, version: int) -> str:
+ raise NotImplementedError(repr(self))
+
+ def get_type_id(self, version: int, returnTypeId: str) -> str:
+ raise NotImplementedError(repr(self))
+
+ def is_function_type(self) -> bool:
+ raise NotImplementedError(repr(self))
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ raise NotImplementedError(repr(self))
+
+
+class ASTDeclaratorNameParamQual(ASTDeclarator):
+ def __init__(self, declId: ASTNestedName,
+ arrayOps: list[ASTArray],
+ paramQual: ASTParametersQualifiers) -> None:
+ self.declId = declId
+ self.arrayOps = arrayOps
+ self.paramQual = paramQual
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.declId
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.declId = name
+
+ @property
+ def isPack(self) -> bool:
+ return False
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.paramQual.function_params
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ return self.paramQual.trailingReturn
+
+ # only the modifiers for a function, e.g.,
+ def get_modifiers_id(self, version: int) -> str:
+ # cv-qualifiers
+ if self.paramQual:
+ return self.paramQual.get_modifiers_id(version)
+ raise Exception("This should only be called on a function: %s" % self)
+
+ def get_param_id(self, version: int) -> str: # only the parameters (if any)
+ if self.paramQual:
+ return self.paramQual.get_param_id(version)
+ else:
+ return ''
+
+ def get_ptr_suffix_id(self, version: int) -> str: # only the array specifiers
+ return ''.join(a.get_id(version) for a in self.arrayOps)
+
+ def get_type_id(self, version: int, returnTypeId: str) -> str:
+ assert version >= 2
+ res = []
+ # TODO: can we actually have both array ops and paramQual?
+ res.append(self.get_ptr_suffix_id(version))
+ if self.paramQual:
+ res.append(self.get_modifiers_id(version))
+ res.append('F')
+ res.append(returnTypeId)
+ res.append(self.get_param_id(version))
+ res.append('E')
+ else:
+ res.append(returnTypeId)
+ return ''.join(res)
+
+ # ------------------------------------------------------------------------
+
+ def require_space_after_declSpecs(self) -> bool:
+ return self.declId is not None
+
+ def is_function_type(self) -> bool:
+ return self.paramQual is not None
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.declId:
+ res.append(transform(self.declId))
+ for op in self.arrayOps:
+ res.append(transform(op))
+ if self.paramQual:
+ res.append(transform(self.paramQual))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.declId:
+ self.declId.describe_signature(signode, mode, env, symbol)
+ for op in self.arrayOps:
+ op.describe_signature(signode, mode, env, symbol)
+ if self.paramQual:
+ self.paramQual.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorNameBitField(ASTDeclarator):
+ def __init__(self, declId: ASTNestedName, size: ASTExpression):
+ self.declId = declId
+ self.size = size
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.declId
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.declId = name
+
+ def get_param_id(self, version: int) -> str: # only the parameters (if any)
+ return ''
+
+ def get_ptr_suffix_id(self, version: int) -> str: # only the array specifiers
+ return ''
+
+ # ------------------------------------------------------------------------
+
+ def require_space_after_declSpecs(self) -> bool:
+ return self.declId is not None
+
+ def is_function_type(self) -> bool:
+ return False
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.declId:
+ res.append(transform(self.declId))
+ res.append(" : ")
+ res.append(transform(self.size))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.declId:
+ self.declId.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation(':', ':')
+ signode += addnodes.desc_sig_space()
+ self.size.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorPtr(ASTDeclarator):
+ def __init__(self, next: ASTDeclarator, volatile: bool, const: bool,
+ attrs: ASTAttributeList) -> None:
+ assert next
+ self.next = next
+ self.volatile = volatile
+ self.const = const
+ self.attrs = attrs
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.next.name
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.next.name = name
+
+ @property
+ def isPack(self) -> bool:
+ return self.next.isPack
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.next.function_params
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ return self.next.trailingReturn
+
+ def require_space_after_declSpecs(self) -> bool:
+ return self.next.require_space_after_declSpecs()
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['*']
+ res.append(transform(self.attrs))
+ if len(self.attrs) != 0 and (self.volatile or self.const):
+ res.append(' ')
+ if self.volatile:
+ res.append('volatile')
+ if self.const:
+ if self.volatile:
+ res.append(' ')
+ res.append('const')
+ if self.const or self.volatile or len(self.attrs) > 0:
+ if self.next.require_space_after_declSpecs():
+ res.append(' ')
+ res.append(transform(self.next))
+ return ''.join(res)
+
+ def get_modifiers_id(self, version: int) -> str:
+ return self.next.get_modifiers_id(version)
+
+ def get_param_id(self, version: int) -> str:
+ return self.next.get_param_id(version)
+
+ def get_ptr_suffix_id(self, version: int) -> str:
+ if version == 1:
+ res = ['P']
+ if self.volatile:
+ res.append('V')
+ if self.const:
+ res.append('C')
+ res.append(self.next.get_ptr_suffix_id(version))
+ return ''.join(res)
+
+ res = [self.next.get_ptr_suffix_id(version)]
+ res.append('P')
+ if self.volatile:
+ res.append('V')
+ if self.const:
+ res.append('C')
+ return ''.join(res)
+
+ def get_type_id(self, version: int, returnTypeId: str) -> str:
+ # ReturnType *next, so we are part of the return type of 'next
+ res = ['P']
+ if self.volatile:
+ res.append('V')
+ if self.const:
+ res.append('C')
+ res.append(returnTypeId)
+ return self.next.get_type_id(version, returnTypeId=''.join(res))
+
+ def is_function_type(self) -> bool:
+ return self.next.is_function_type()
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('*', '*')
+ self.attrs.describe_signature(signode)
+ if len(self.attrs) != 0 and (self.volatile or self.const):
+ signode += addnodes.desc_sig_space()
+
+ def _add_anno(signode: TextElement, text: str) -> None:
+ signode += addnodes.desc_sig_keyword(text, text)
+ if self.volatile:
+ _add_anno(signode, 'volatile')
+ if self.const:
+ if self.volatile:
+ signode += addnodes.desc_sig_space()
+ _add_anno(signode, 'const')
+ if self.const or self.volatile or len(self.attrs) > 0:
+ if self.next.require_space_after_declSpecs():
+ signode += addnodes.desc_sig_space()
+ self.next.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorRef(ASTDeclarator):
+ def __init__(self, next: ASTDeclarator, attrs: ASTAttributeList) -> None:
+ assert next
+ self.next = next
+ self.attrs = attrs
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.next.name
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.next.name = name
+
+ @property
+ def isPack(self) -> bool:
+ return self.next.isPack
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.next.function_params
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ return self.next.trailingReturn
+
+ def require_space_after_declSpecs(self) -> bool:
+ return self.next.require_space_after_declSpecs()
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['&']
+ res.append(transform(self.attrs))
+ if len(self.attrs) != 0 and self.next.require_space_after_declSpecs():
+ res.append(' ')
+ res.append(transform(self.next))
+ return ''.join(res)
+
+ def get_modifiers_id(self, version: int) -> str:
+ return self.next.get_modifiers_id(version)
+
+ def get_param_id(self, version: int) -> str: # only the parameters (if any)
+ return self.next.get_param_id(version)
+
+ def get_ptr_suffix_id(self, version: int) -> str:
+ if version == 1:
+ return 'R' + self.next.get_ptr_suffix_id(version)
+ else:
+ return self.next.get_ptr_suffix_id(version) + 'R'
+
+ def get_type_id(self, version: int, returnTypeId: str) -> str:
+ assert version >= 2
+ # ReturnType &next, so we are part of the return type of 'next
+ return self.next.get_type_id(version, returnTypeId='R' + returnTypeId)
+
+ def is_function_type(self) -> bool:
+ return self.next.is_function_type()
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('&', '&')
+ self.attrs.describe_signature(signode)
+ if len(self.attrs) > 0 and self.next.require_space_after_declSpecs():
+ signode += addnodes.desc_sig_space()
+ self.next.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorParamPack(ASTDeclarator):
+ def __init__(self, next: ASTDeclarator) -> None:
+ assert next
+ self.next = next
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.next.name
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.next.name = name
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.next.function_params
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ return self.next.trailingReturn
+
+ @property
+ def isPack(self) -> bool:
+ return True
+
+ def require_space_after_declSpecs(self) -> bool:
+ return False
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = transform(self.next)
+ if self.next.name:
+ res = ' ' + res
+ return '...' + res
+
+ def get_modifiers_id(self, version: int) -> str:
+ return self.next.get_modifiers_id(version)
+
+ def get_param_id(self, version: int) -> str: # only the parameters (if any)
+ return self.next.get_param_id(version)
+
+ def get_ptr_suffix_id(self, version: int) -> str:
+ if version == 1:
+ return 'Dp' + self.next.get_ptr_suffix_id(version)
+ else:
+ return self.next.get_ptr_suffix_id(version) + 'Dp'
+
+ def get_type_id(self, version: int, returnTypeId: str) -> str:
+ assert version >= 2
+ # ReturnType... next, so we are part of the return type of 'next
+ return self.next.get_type_id(version, returnTypeId='Dp' + returnTypeId)
+
+ def is_function_type(self) -> bool:
+ return self.next.is_function_type()
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ if self.next.name:
+ signode += addnodes.desc_sig_space()
+ self.next.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorMemPtr(ASTDeclarator):
+ def __init__(self, className: ASTNestedName,
+ const: bool, volatile: bool, next: ASTDeclarator) -> None:
+ assert className
+ assert next
+ self.className = className
+ self.const = const
+ self.volatile = volatile
+ self.next = next
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.next.name
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.next.name = name
+
+ @property
+ def isPack(self):
+ return self.next.isPack
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.next.function_params
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ return self.next.trailingReturn
+
+ def require_space_after_declSpecs(self) -> bool:
+ return True
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.className))
+ res.append('::*')
+ if self.volatile:
+ res.append('volatile')
+ if self.const:
+ if self.volatile:
+ res.append(' ')
+ res.append('const')
+ if self.next.require_space_after_declSpecs():
+ res.append(' ')
+ res.append(transform(self.next))
+ return ''.join(res)
+
+ def get_modifiers_id(self, version: int) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return self.next.get_modifiers_id(version)
+
+ def get_param_id(self, version: int) -> str: # only the parameters (if any)
+ if version == 1:
+ raise NoOldIdError
+ return self.next.get_param_id(version)
+
+ def get_ptr_suffix_id(self, version: int) -> str:
+ if version == 1:
+ raise NoOldIdError
+ raise NotImplementedError
+ return self.next.get_ptr_suffix_id(version) + 'Dp'
+
+ def get_type_id(self, version: int, returnTypeId: str) -> str:
+ assert version >= 2
+ # ReturnType name::* next, so we are part of the return type of next
+ nextReturnTypeId = ''
+ if self.volatile:
+ nextReturnTypeId += 'V'
+ if self.const:
+ nextReturnTypeId += 'K'
+ nextReturnTypeId += 'M'
+ nextReturnTypeId += self.className.get_id(version)
+ nextReturnTypeId += returnTypeId
+ return self.next.get_type_id(version, nextReturnTypeId)
+
+ def is_function_type(self) -> bool:
+ return self.next.is_function_type()
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.className.describe_signature(signode, 'markType', env, symbol)
+ signode += addnodes.desc_sig_punctuation('::', '::')
+ signode += addnodes.desc_sig_punctuation('*', '*')
+
+ def _add_anno(signode: TextElement, text: str) -> None:
+ signode += addnodes.desc_sig_keyword(text, text)
+ if self.volatile:
+ _add_anno(signode, 'volatile')
+ if self.const:
+ if self.volatile:
+ signode += addnodes.desc_sig_space()
+ _add_anno(signode, 'const')
+ if self.next.require_space_after_declSpecs():
+ signode += addnodes.desc_sig_space()
+ self.next.describe_signature(signode, mode, env, symbol)
+
+
+class ASTDeclaratorParen(ASTDeclarator):
+ def __init__(self, inner: ASTDeclarator, next: ASTDeclarator) -> None:
+ assert inner
+ assert next
+ self.inner = inner
+ self.next = next
+ # TODO: we assume the name, params, and qualifiers are in inner
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.inner.name
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.inner.name = name
+
+ @property
+ def isPack(self):
+ return self.inner.isPack or self.next.isPack
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.inner.function_params
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ return self.inner.trailingReturn
+
+ def require_space_after_declSpecs(self) -> bool:
+ return True
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['(']
+ res.append(transform(self.inner))
+ res.append(')')
+ res.append(transform(self.next))
+ return ''.join(res)
+
+ def get_modifiers_id(self, version: int) -> str:
+ return self.inner.get_modifiers_id(version)
+
+ def get_param_id(self, version: int) -> str: # only the parameters (if any)
+ return self.inner.get_param_id(version)
+
+ def get_ptr_suffix_id(self, version: int) -> str:
+ if version == 1:
+ raise NoOldIdError # TODO: was this implemented before?
+ return self.next.get_ptr_suffix_id(version) + \
+ self.inner.get_ptr_suffix_id(version)
+ return self.inner.get_ptr_suffix_id(version) + \
+ self.next.get_ptr_suffix_id(version)
+
+ def get_type_id(self, version: int, returnTypeId: str) -> str:
+ assert version >= 2
+ # ReturnType (inner)next, so 'inner' returns everything outside
+ nextId = self.next.get_type_id(version, returnTypeId)
+ return self.inner.get_type_id(version, returnTypeId=nextId)
+
+ def is_function_type(self) -> bool:
+ return self.inner.is_function_type()
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ self.inner.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+ self.next.describe_signature(signode, "noneIsName", env, symbol)
+
+
+# Type and initializer stuff
+##############################################################################################
+
+class ASTPackExpansionExpr(ASTExpression):
+ def __init__(self, expr: ASTExpression | ASTBracedInitList):
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.expr) + '...'
+
+ def get_id(self, version: int) -> str:
+ id = self.expr.get_id(version)
+ return 'sp' + id
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.expr.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation('...', '...')
+
+
+class ASTParenExprList(ASTBaseParenExprList):
+ def __init__(self, exprs: list[ASTExpression | ASTBracedInitList]) -> None:
+ self.exprs = exprs
+
+ def get_id(self, version: int) -> str:
+ return "pi%sE" % ''.join(e.get_id(version) for e in self.exprs)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ exprs = [transform(e) for e in self.exprs]
+ return '(%s)' % ', '.join(exprs)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ signode += addnodes.desc_sig_punctuation('(', '(')
+ first = True
+ for e in self.exprs:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ else:
+ first = False
+ e.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation(')', ')')
+
+
+class ASTInitializer(ASTBase):
+ def __init__(self, value: ASTExpression | ASTBracedInitList,
+ hasAssign: bool = True) -> None:
+ self.value = value
+ self.hasAssign = hasAssign
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ val = transform(self.value)
+ if self.hasAssign:
+ return ' = ' + val
+ else:
+ return val
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.hasAssign:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('=', '=')
+ signode += addnodes.desc_sig_space()
+ self.value.describe_signature(signode, 'markType', env, symbol)
+
+
+class ASTType(ASTBase):
+ def __init__(self, declSpecs: ASTDeclSpecs, decl: ASTDeclarator) -> None:
+ assert declSpecs
+ assert decl
+ self.declSpecs = declSpecs
+ self.decl = decl
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.decl.name
+
+ @name.setter
+ def name(self, name: ASTNestedName) -> None:
+ self.decl.name = name
+
+ @property
+ def isPack(self) -> bool:
+ return self.decl.isPack
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ return self.decl.function_params
+
+ @property
+ def trailingReturn(self) -> ASTType:
+ return self.decl.trailingReturn
+
+ def get_id(self, version: int, objectType: str | None = None,
+ symbol: Symbol | None = None) -> str:
+ if version == 1:
+ res = []
+ if objectType: # needs the name
+ if objectType == 'function': # also modifiers
+ res.append(symbol.get_full_nested_name().get_id(version))
+ res.append(self.decl.get_param_id(version))
+ res.append(self.decl.get_modifiers_id(version))
+ if (self.declSpecs.leftSpecs.constexpr or
+ (self.declSpecs.rightSpecs and
+ self.declSpecs.rightSpecs.constexpr)):
+ res.append('CE')
+ elif objectType == 'type': # just the name
+ res.append(symbol.get_full_nested_name().get_id(version))
+ else:
+ raise AssertionError(objectType)
+ else: # only type encoding
+ if self.decl.is_function_type():
+ raise NoOldIdError
+ res.append(self.declSpecs.get_id(version))
+ res.append(self.decl.get_ptr_suffix_id(version))
+ res.append(self.decl.get_param_id(version))
+ return ''.join(res)
+ # other versions
+ res = []
+ if objectType: # needs the name
+ if objectType == 'function': # also modifiers
+ modifiers = self.decl.get_modifiers_id(version)
+ res.append(symbol.get_full_nested_name().get_id(version, modifiers))
+ if version >= 4:
+ # with templates we need to mangle the return type in as well
+ templ = symbol.declaration.templatePrefix
+ if templ is not None:
+ typeId = self.decl.get_ptr_suffix_id(version)
+ if self.trailingReturn:
+ returnTypeId = self.trailingReturn.get_id(version)
+ else:
+ returnTypeId = self.declSpecs.get_id(version)
+ res.append(typeId)
+ res.append(returnTypeId)
+ res.append(self.decl.get_param_id(version))
+ elif objectType == 'type': # just the name
+ res.append(symbol.get_full_nested_name().get_id(version))
+ else:
+ raise AssertionError(objectType)
+ else: # only type encoding
+ # the 'returnType' of a non-function type is simply just the last
+ # type, i.e., for 'int*' it is 'int'
+ returnTypeId = self.declSpecs.get_id(version)
+ typeId = self.decl.get_type_id(version, returnTypeId)
+ res.append(typeId)
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ declSpecs = transform(self.declSpecs)
+ res.append(declSpecs)
+ if self.decl.require_space_after_declSpecs() and len(declSpecs) > 0:
+ res.append(' ')
+ res.append(transform(self.decl))
+ return ''.join(res)
+
+ def get_type_declaration_prefix(self) -> str:
+ if self.declSpecs.trailingTypeSpec:
+ return 'typedef'
+ else:
+ return 'type'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.declSpecs.describe_signature(signode, 'markType', env, symbol)
+ if (self.decl.require_space_after_declSpecs() and
+ len(str(self.declSpecs)) > 0):
+ signode += addnodes.desc_sig_space()
+ # for parameters that don't really declare new names we get 'markType',
+ # this should not be propagated, but be 'noneIsName'.
+ if mode == 'markType':
+ mode = 'noneIsName'
+ self.decl.describe_signature(signode, mode, env, symbol)
+
+
+class ASTTemplateParamConstrainedTypeWithInit(ASTBase):
+ def __init__(self, type: ASTType, init: ASTType) -> None:
+ assert type
+ self.type = type
+ self.init = init
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.type.name
+
+ @property
+ def isPack(self) -> bool:
+ return self.type.isPack
+
+ def get_id(
+ self, version: int, objectType: str | None = None, symbol: Symbol | None = None,
+ ) -> str:
+ # this is not part of the normal name mangling in C++
+ assert version >= 2
+ if symbol:
+ # the anchor will be our parent
+ return symbol.parent.declaration.get_id(version, prefixed=False)
+ else:
+ return self.type.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = transform(self.type)
+ if self.init:
+ res += " = "
+ res += transform(self.init)
+ return res
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.type.describe_signature(signode, mode, env, symbol)
+ if self.init:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('=', '=')
+ signode += addnodes.desc_sig_space()
+ self.init.describe_signature(signode, mode, env, symbol)
+
+
+class ASTTypeWithInit(ASTBase):
+ def __init__(self, type: ASTType, init: ASTInitializer) -> None:
+ self.type = type
+ self.init = init
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.type.name
+
+ @property
+ def isPack(self) -> bool:
+ return self.type.isPack
+
+ def get_id(self, version: int, objectType: str | None = None,
+ symbol: Symbol | None = None) -> str:
+ if objectType != 'member':
+ return self.type.get_id(version, objectType)
+ if version == 1:
+ return (symbol.get_full_nested_name().get_id(version) + '__' +
+ self.type.get_id(version))
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.type))
+ if self.init:
+ res.append(transform(self.init))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.type.describe_signature(signode, mode, env, symbol)
+ if self.init:
+ self.init.describe_signature(signode, mode, env, symbol)
+
+
+class ASTTypeUsing(ASTBase):
+ def __init__(self, name: ASTNestedName, type: ASTType) -> None:
+ self.name = name
+ self.type = type
+
+ def get_id(self, version: int, objectType: str | None = None,
+ symbol: Symbol | None = None) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.name))
+ if self.type:
+ res.append(' = ')
+ res.append(transform(self.type))
+ return ''.join(res)
+
+ def get_type_declaration_prefix(self) -> str:
+ return 'using'
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.name.describe_signature(signode, mode, env, symbol=symbol)
+ if self.type:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('=', '=')
+ signode += addnodes.desc_sig_space()
+ self.type.describe_signature(signode, 'markType', env, symbol=symbol)
+
+
+# Other declarations
+##############################################################################################
+
+class ASTConcept(ASTBase):
+ def __init__(self, nestedName: ASTNestedName, initializer: ASTInitializer) -> None:
+ self.nestedName = nestedName
+ self.initializer = initializer
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.nestedName
+
+ def get_id(self, version: int, objectType: str | None = None,
+ symbol: Symbol | None = None) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = transform(self.nestedName)
+ if self.initializer:
+ res += transform(self.initializer)
+ return res
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.nestedName.describe_signature(signode, mode, env, symbol)
+ if self.initializer:
+ self.initializer.describe_signature(signode, mode, env, symbol)
+
+
+class ASTBaseClass(ASTBase):
+ def __init__(self, name: ASTNestedName, visibility: str,
+ virtual: bool, pack: bool) -> None:
+ self.name = name
+ self.visibility = visibility
+ self.virtual = virtual
+ self.pack = pack
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.visibility is not None:
+ res.append(self.visibility)
+ res.append(' ')
+ if self.virtual:
+ res.append('virtual ')
+ res.append(transform(self.name))
+ if self.pack:
+ res.append('...')
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ if self.visibility is not None:
+ signode += addnodes.desc_sig_keyword(self.visibility,
+ self.visibility)
+ signode += addnodes.desc_sig_space()
+ if self.virtual:
+ signode += addnodes.desc_sig_keyword('virtual', 'virtual')
+ signode += addnodes.desc_sig_space()
+ self.name.describe_signature(signode, 'markType', env, symbol=symbol)
+ if self.pack:
+ signode += addnodes.desc_sig_punctuation('...', '...')
+
+
+class ASTClass(ASTBase):
+ def __init__(self, name: ASTNestedName, final: bool, bases: list[ASTBaseClass],
+ attrs: ASTAttributeList) -> None:
+ self.name = name
+ self.final = final
+ self.bases = bases
+ self.attrs = attrs
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.attrs))
+ if len(self.attrs) != 0:
+ res.append(' ')
+ res.append(transform(self.name))
+ if self.final:
+ res.append(' final')
+ if len(self.bases) > 0:
+ res.append(' : ')
+ first = True
+ for b in self.bases:
+ if not first:
+ res.append(', ')
+ first = False
+ res.append(transform(b))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.attrs.describe_signature(signode)
+ if len(self.attrs) != 0:
+ signode += addnodes.desc_sig_space()
+ self.name.describe_signature(signode, mode, env, symbol=symbol)
+ if self.final:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_keyword('final', 'final')
+ if len(self.bases) > 0:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation(':', ':')
+ signode += addnodes.desc_sig_space()
+ for b in self.bases:
+ b.describe_signature(signode, mode, env, symbol=symbol)
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ signode.pop()
+ signode.pop()
+
+
+class ASTUnion(ASTBase):
+ def __init__(self, name: ASTNestedName, attrs: ASTAttributeList) -> None:
+ self.name = name
+ self.attrs = attrs
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.attrs))
+ if len(self.attrs) != 0:
+ res.append(' ')
+ res.append(transform(self.name))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.attrs.describe_signature(signode)
+ if len(self.attrs) != 0:
+ signode += addnodes.desc_sig_space()
+ self.name.describe_signature(signode, mode, env, symbol=symbol)
+
+
+class ASTEnum(ASTBase):
+ def __init__(self, name: ASTNestedName, scoped: str, underlyingType: ASTType,
+ attrs: ASTAttributeList) -> None:
+ self.name = name
+ self.scoped = scoped
+ self.underlyingType = underlyingType
+ self.attrs = attrs
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.scoped:
+ res.append(self.scoped)
+ res.append(' ')
+ res.append(transform(self.attrs))
+ if len(self.attrs) != 0:
+ res.append(' ')
+ res.append(transform(self.name))
+ if self.underlyingType:
+ res.append(' : ')
+ res.append(transform(self.underlyingType))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ # self.scoped has been done by the CPPEnumObject
+ self.attrs.describe_signature(signode)
+ if len(self.attrs) != 0:
+ signode += addnodes.desc_sig_space()
+ self.name.describe_signature(signode, mode, env, symbol=symbol)
+ if self.underlyingType:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation(':', ':')
+ signode += addnodes.desc_sig_space()
+ self.underlyingType.describe_signature(signode, 'noneIsName',
+ env, symbol=symbol)
+
+
+class ASTEnumerator(ASTBase):
+ def __init__(self, name: ASTNestedName, init: ASTInitializer | None,
+ attrs: ASTAttributeList) -> None:
+ self.name = name
+ self.init = init
+ self.attrs = attrs
+
+ def get_id(self, version: int, objectType: str, symbol: Symbol) -> str:
+ if version == 1:
+ raise NoOldIdError
+ return symbol.get_full_nested_name().get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.name))
+ if len(self.attrs) != 0:
+ res.append(' ')
+ res.append(transform(self.attrs))
+ if self.init:
+ res.append(transform(self.init))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ verify_description_mode(mode)
+ self.name.describe_signature(signode, mode, env, symbol)
+ if len(self.attrs) != 0:
+ signode += addnodes.desc_sig_space()
+ self.attrs.describe_signature(signode)
+ if self.init:
+ self.init.describe_signature(signode, 'markType', env, symbol)
+
+
+################################################################################
+# Templates
+################################################################################
+
+# Parameters
+################################################################################
+
+class ASTTemplateParam(ASTBase):
+ def get_identifier(self) -> ASTIdentifier:
+ raise NotImplementedError(repr(self))
+
+ def get_id(self, version: int) -> str:
+ raise NotImplementedError(repr(self))
+
+ def describe_signature(self, parentNode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ raise NotImplementedError(repr(self))
+
+ @property
+ def isPack(self) -> bool:
+ raise NotImplementedError(repr(self))
+
+ @property
+ def name(self) -> ASTNestedName:
+ raise NotImplementedError(repr(self))
+
+
+class ASTTemplateKeyParamPackIdDefault(ASTTemplateParam):
+ def __init__(self, key: str, identifier: ASTIdentifier,
+ parameterPack: bool, default: ASTType) -> None:
+ assert key
+ if parameterPack:
+ assert default is None
+ self.key = key
+ self.identifier = identifier
+ self.parameterPack = parameterPack
+ self.default = default
+
+ def get_identifier(self) -> ASTIdentifier:
+ return self.identifier
+
+ def get_id(self, version: int) -> str:
+ assert version >= 2
+ # this is not part of the normal name mangling in C++
+ res = []
+ if self.parameterPack:
+ res.append('Dp')
+ else:
+ res.append('0') # we need to put something
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = [self.key]
+ if self.parameterPack:
+ if self.identifier:
+ res.append(' ')
+ res.append('...')
+ if self.identifier:
+ if not self.parameterPack:
+ res.append(' ')
+ res.append(transform(self.identifier))
+ if self.default:
+ res.append(' = ')
+ res.append(transform(self.default))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword(self.key, self.key)
+ if self.parameterPack:
+ if self.identifier:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ if self.identifier:
+ if not self.parameterPack:
+ signode += addnodes.desc_sig_space()
+ self.identifier.describe_signature(signode, mode, env, '', '', symbol)
+ if self.default:
+ signode += addnodes.desc_sig_space()
+ signode += addnodes.desc_sig_punctuation('=', '=')
+ signode += addnodes.desc_sig_space()
+ self.default.describe_signature(signode, 'markType', env, symbol)
+
+
+class ASTTemplateParamType(ASTTemplateParam):
+ def __init__(self, data: ASTTemplateKeyParamPackIdDefault) -> None:
+ assert data
+ self.data = data
+
+ @property
+ def name(self) -> ASTNestedName:
+ id = self.get_identifier()
+ return ASTNestedName([ASTNestedNameElement(id, None)], [False], rooted=False)
+
+ @property
+ def isPack(self) -> bool:
+ return self.data.parameterPack
+
+ def get_identifier(self) -> ASTIdentifier:
+ return self.data.get_identifier()
+
+ def get_id(
+ self, version: int, objectType: str | None = None, symbol: Symbol | None = None,
+ ) -> str:
+ # this is not part of the normal name mangling in C++
+ assert version >= 2
+ if symbol:
+ # the anchor will be our parent
+ return symbol.parent.declaration.get_id(version, prefixed=False)
+ else:
+ return self.data.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.data)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.data.describe_signature(signode, mode, env, symbol)
+
+
+class ASTTemplateParamTemplateType(ASTTemplateParam):
+ def __init__(self, nestedParams: ASTTemplateParams,
+ data: ASTTemplateKeyParamPackIdDefault) -> None:
+ assert nestedParams
+ assert data
+ self.nestedParams = nestedParams
+ self.data = data
+
+ @property
+ def name(self) -> ASTNestedName:
+ id = self.get_identifier()
+ return ASTNestedName([ASTNestedNameElement(id, None)], [False], rooted=False)
+
+ @property
+ def isPack(self) -> bool:
+ return self.data.parameterPack
+
+ def get_identifier(self) -> ASTIdentifier:
+ return self.data.get_identifier()
+
+ def get_id(
+ self, version: int, objectType: str | None = None, symbol: Symbol | None = None,
+ ) -> str:
+ assert version >= 2
+ # this is not part of the normal name mangling in C++
+ if symbol:
+ # the anchor will be our parent
+ return symbol.parent.declaration.get_id(version, prefixed=None)
+ else:
+ return self.nestedParams.get_id(version) + self.data.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return transform(self.nestedParams) + transform(self.data)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.nestedParams.describe_signature(signode, 'noneIsName', env, symbol)
+ signode += addnodes.desc_sig_space()
+ self.data.describe_signature(signode, mode, env, symbol)
+
+
+class ASTTemplateParamNonType(ASTTemplateParam):
+ def __init__(self,
+ param: ASTTypeWithInit | ASTTemplateParamConstrainedTypeWithInit,
+ parameterPack: bool = False) -> None:
+ assert param
+ self.param = param
+ self.parameterPack = parameterPack
+
+ @property
+ def name(self) -> ASTNestedName:
+ id = self.get_identifier()
+ return ASTNestedName([ASTNestedNameElement(id, None)], [False], rooted=False)
+
+ @property
+ def isPack(self) -> bool:
+ return self.param.isPack or self.parameterPack
+
+ def get_identifier(self) -> ASTIdentifier:
+ name = self.param.name
+ if name:
+ assert len(name.names) == 1
+ assert name.names[0].identOrOp
+ assert not name.names[0].templateArgs
+ res = name.names[0].identOrOp
+ assert isinstance(res, ASTIdentifier)
+ return res
+ else:
+ return None
+
+ def get_id(
+ self, version: int, objectType: str | None = None, symbol: Symbol | None = None,
+ ) -> str:
+ assert version >= 2
+ # this is not part of the normal name mangling in C++
+ if symbol:
+ # the anchor will be our parent
+ return symbol.parent.declaration.get_id(version, prefixed=None)
+ else:
+ res = '_'
+ if self.parameterPack:
+ res += 'Dp'
+ return res + self.param.get_id(version)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = transform(self.param)
+ if self.parameterPack:
+ res += '...'
+ return res
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ self.param.describe_signature(signode, mode, env, symbol)
+ if self.parameterPack:
+ signode += addnodes.desc_sig_punctuation('...', '...')
+
+
+class ASTTemplateParams(ASTBase):
+ def __init__(self, params: list[ASTTemplateParam],
+ requiresClause: ASTRequiresClause | None) -> None:
+ assert params is not None
+ self.params = params
+ self.requiresClause = requiresClause
+
+ def get_id(self, version: int, excludeRequires: bool = False) -> str:
+ assert version >= 2
+ res = []
+ res.append("I")
+ for param in self.params:
+ res.append(param.get_id(version))
+ res.append("E")
+ if not excludeRequires and self.requiresClause:
+ res.append('IQ')
+ res.append(self.requiresClause.expr.get_id(version))
+ res.append('E')
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append("template<")
+ res.append(", ".join(transform(a) for a in self.params))
+ res.append("> ")
+ if self.requiresClause is not None:
+ res.append(transform(self.requiresClause))
+ res.append(" ")
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('template', 'template')
+ signode += addnodes.desc_sig_punctuation('<', '<')
+ first = True
+ for param in self.params:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ first = False
+ param.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation('>', '>')
+ if self.requiresClause is not None:
+ signode += addnodes.desc_sig_space()
+ self.requiresClause.describe_signature(signode, mode, env, symbol)
+
+ def describe_signature_as_introducer(
+ self, parentNode: desc_signature, mode: str, env: BuildEnvironment,
+ symbol: Symbol, lineSpec: bool) -> None:
+ def makeLine(parentNode: desc_signature) -> addnodes.desc_signature_line:
+ signode = addnodes.desc_signature_line()
+ parentNode += signode
+ signode.sphinx_line_type = 'templateParams'
+ return signode
+ lineNode = makeLine(parentNode)
+ lineNode += addnodes.desc_sig_keyword('template', 'template')
+ lineNode += addnodes.desc_sig_punctuation('<', '<')
+ first = True
+ for param in self.params:
+ if not first:
+ lineNode += addnodes.desc_sig_punctuation(',', ',')
+ lineNode += addnodes.desc_sig_space()
+ first = False
+ if lineSpec:
+ lineNode = makeLine(parentNode)
+ param.describe_signature(lineNode, mode, env, symbol)
+ if lineSpec and not first:
+ lineNode = makeLine(parentNode)
+ lineNode += addnodes.desc_sig_punctuation('>', '>')
+ if self.requiresClause:
+ reqNode = addnodes.desc_signature_line()
+ reqNode.sphinx_line_type = 'requiresClause'
+ parentNode += reqNode
+ self.requiresClause.describe_signature(reqNode, 'markType', env, symbol)
+
+
+# Template introducers
+################################################################################
+
+class ASTTemplateIntroductionParameter(ASTBase):
+ def __init__(self, identifier: ASTIdentifier, parameterPack: bool) -> None:
+ self.identifier = identifier
+ self.parameterPack = parameterPack
+
+ @property
+ def name(self) -> ASTNestedName:
+ id = self.get_identifier()
+ return ASTNestedName([ASTNestedNameElement(id, None)], [False], rooted=False)
+
+ @property
+ def isPack(self) -> bool:
+ return self.parameterPack
+
+ def get_identifier(self) -> ASTIdentifier:
+ return self.identifier
+
+ def get_id(
+ self, version: int, objectType: str | None = None, symbol: Symbol | None = None,
+ ) -> str:
+ assert version >= 2
+ # this is not part of the normal name mangling in C++
+ if symbol:
+ # the anchor will be our parent
+ return symbol.parent.declaration.get_id(version, prefixed=None)
+ else:
+ if self.parameterPack:
+ return 'Dp'
+ else:
+ return '0' # we need to put something
+
+ def get_id_as_arg(self, version: int) -> str:
+ assert version >= 2
+ # used for the implicit requires clause
+ res = self.identifier.get_id(version)
+ if self.parameterPack:
+ return 'sp' + res
+ else:
+ return res
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.parameterPack:
+ res.append('...')
+ res.append(transform(self.identifier))
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ if self.parameterPack:
+ signode += addnodes.desc_sig_punctuation('...', '...')
+ self.identifier.describe_signature(signode, mode, env, '', '', symbol)
+
+
+class ASTTemplateIntroduction(ASTBase):
+ def __init__(self, concept: ASTNestedName,
+ params: list[ASTTemplateIntroductionParameter]) -> None:
+ assert len(params) > 0
+ self.concept = concept
+ self.params = params
+
+ def get_id(self, version: int) -> str:
+ assert version >= 2
+ # first do the same as a normal template parameter list
+ res = []
+ res.append("I")
+ for param in self.params:
+ res.append(param.get_id(version))
+ res.append("E")
+ # let's use X expr E, which is otherwise for constant template args
+ res.append("X")
+ res.append(self.concept.get_id(version))
+ res.append("I")
+ for param in self.params:
+ res.append(param.get_id_as_arg(version))
+ res.append("E")
+ res.append("E")
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ res.append(transform(self.concept))
+ res.append('{')
+ res.append(', '.join(transform(param) for param in self.params))
+ res.append('} ')
+ return ''.join(res)
+
+ def describe_signature_as_introducer(
+ self, parentNode: desc_signature, mode: str,
+ env: BuildEnvironment, symbol: Symbol, lineSpec: bool) -> None:
+ # Note: 'lineSpec' has no effect on template introductions.
+ signode = addnodes.desc_signature_line()
+ parentNode += signode
+ signode.sphinx_line_type = 'templateIntroduction'
+ self.concept.describe_signature(signode, 'markType', env, symbol)
+ signode += addnodes.desc_sig_punctuation('{', '{')
+ first = True
+ for param in self.params:
+ if not first:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ first = False
+ param.describe_signature(signode, mode, env, symbol)
+ signode += addnodes.desc_sig_punctuation('}', '}')
+
+
+################################################################################
+
+class ASTTemplateDeclarationPrefix(ASTBase):
+ def __init__(self,
+ templates: list[ASTTemplateParams | ASTTemplateIntroduction]) -> None:
+ # templates is None means it's an explicit instantiation of a variable
+ self.templates = templates
+
+ def get_requires_clause_in_last(self) -> ASTRequiresClause | None:
+ if self.templates is None:
+ return None
+ lastList = self.templates[-1]
+ if not isinstance(lastList, ASTTemplateParams):
+ return None
+ return lastList.requiresClause # which may be None
+
+ def get_id_except_requires_clause_in_last(self, version: int) -> str:
+ assert version >= 2
+ # This is not part of the Itanium ABI mangling system.
+ res = []
+ lastIndex = len(self.templates) - 1
+ for i, t in enumerate(self.templates):
+ if isinstance(t, ASTTemplateParams):
+ res.append(t.get_id(version, excludeRequires=(i == lastIndex)))
+ else:
+ res.append(t.get_id(version))
+ return ''.join(res)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ for t in self.templates:
+ res.append(transform(t))
+ return ''.join(res)
+
+ def describe_signature(self, signode: desc_signature, mode: str,
+ env: BuildEnvironment, symbol: Symbol, lineSpec: bool) -> None:
+ verify_description_mode(mode)
+ for t in self.templates:
+ t.describe_signature_as_introducer(signode, 'lastIsName', env, symbol, lineSpec)
+
+
+class ASTRequiresClause(ASTBase):
+ def __init__(self, expr: ASTExpression) -> None:
+ self.expr = expr
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return 'requires ' + transform(self.expr)
+
+ def describe_signature(self, signode: nodes.TextElement, mode: str,
+ env: BuildEnvironment, symbol: Symbol) -> None:
+ signode += addnodes.desc_sig_keyword('requires', 'requires')
+ signode += addnodes.desc_sig_space()
+ self.expr.describe_signature(signode, mode, env, symbol)
+
+
+################################################################################
+################################################################################
+
+class ASTDeclaration(ASTBase):
+ def __init__(self, objectType: str, directiveType: str | None = None,
+ visibility: str | None = None,
+ templatePrefix: ASTTemplateDeclarationPrefix | None = None,
+ declaration: Any = None,
+ trailingRequiresClause: ASTRequiresClause | None = None,
+ semicolon: bool = False) -> None:
+ self.objectType = objectType
+ self.directiveType = directiveType
+ self.visibility = visibility
+ self.templatePrefix = templatePrefix
+ self.declaration = declaration
+ self.trailingRequiresClause = trailingRequiresClause
+ self.semicolon = semicolon
+
+ self.symbol: Symbol = None
+ # set by CPPObject._add_enumerator_to_parent
+ self.enumeratorScopedSymbol: Symbol = None
+
+ def clone(self) -> ASTDeclaration:
+ templatePrefixClone = self.templatePrefix.clone() if self.templatePrefix else None
+ trailingRequiresClasueClone = self.trailingRequiresClause.clone() \
+ if self.trailingRequiresClause else None
+ return ASTDeclaration(self.objectType, self.directiveType, self.visibility,
+ templatePrefixClone,
+ self.declaration.clone(), trailingRequiresClasueClone,
+ self.semicolon)
+
+ @property
+ def name(self) -> ASTNestedName:
+ return self.declaration.name
+
+ @property
+ def function_params(self) -> list[ASTFunctionParameter]:
+ if self.objectType != 'function':
+ return None
+ return self.declaration.function_params
+
+ def get_id(self, version: int, prefixed: bool = True) -> str:
+ if version == 1:
+ if self.templatePrefix or self.trailingRequiresClause:
+ raise NoOldIdError
+ if self.objectType == 'enumerator' and self.enumeratorScopedSymbol:
+ return self.enumeratorScopedSymbol.declaration.get_id(version)
+ return self.declaration.get_id(version, self.objectType, self.symbol)
+ # version >= 2
+ if self.objectType == 'enumerator' and self.enumeratorScopedSymbol:
+ return self.enumeratorScopedSymbol.declaration.get_id(version, prefixed)
+ if prefixed:
+ res = [_id_prefix[version]]
+ else:
+ res = []
+ # (See also https://github.com/sphinx-doc/sphinx/pull/10286#issuecomment-1168102147)
+ # The first implementation of requires clauses only supported a single clause after the
+ # template prefix, and no trailing clause. It put the ID after the template parameter
+ # list, i.e.,
+ # "I" + template_parameter_list_id + "E" + "IQ" + requires_clause_id + "E"
+ # but the second implementation associates the requires clause with each list, i.e.,
+ # "I" + template_parameter_list_id + "IQ" + requires_clause_id + "E" + "E"
+ # To avoid making a new ID version, we make an exception for the last requires clause
+ # in the template prefix, and still put it in the end.
+ # As we now support trailing requires clauses we add that as if it was a conjunction.
+ if self.templatePrefix is not None:
+ res.append(self.templatePrefix.get_id_except_requires_clause_in_last(version))
+ requiresClauseInLast = self.templatePrefix.get_requires_clause_in_last()
+ else:
+ requiresClauseInLast = None
+
+ if requiresClauseInLast or self.trailingRequiresClause:
+ if version < 4:
+ raise NoOldIdError
+ res.append('IQ')
+ if requiresClauseInLast and self.trailingRequiresClause:
+ # make a conjunction of them
+ res.append('aa')
+ if requiresClauseInLast:
+ res.append(requiresClauseInLast.expr.get_id(version))
+ if self.trailingRequiresClause:
+ res.append(self.trailingRequiresClause.expr.get_id(version))
+ res.append('E')
+ res.append(self.declaration.get_id(version, self.objectType, self.symbol))
+ return ''.join(res)
+
+ def get_newest_id(self) -> str:
+ return self.get_id(_max_id, True)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.visibility and self.visibility != "public":
+ res.append(self.visibility)
+ res.append(' ')
+ if self.templatePrefix:
+ res.append(transform(self.templatePrefix))
+ res.append(transform(self.declaration))
+ if self.trailingRequiresClause:
+ res.append(' ')
+ res.append(transform(self.trailingRequiresClause))
+ if self.semicolon:
+ res.append(';')
+ return ''.join(res)
+
+ def describe_signature(self, signode: desc_signature, mode: str,
+ env: BuildEnvironment, options: dict) -> None:
+ verify_description_mode(mode)
+ assert self.symbol
+ # The caller of the domain added a desc_signature node.
+ # Always enable multiline:
+ signode['is_multiline'] = True
+ # Put each line in a desc_signature_line node.
+ mainDeclNode = addnodes.desc_signature_line()
+ mainDeclNode.sphinx_line_type = 'declarator'
+ mainDeclNode['add_permalink'] = not self.symbol.isRedeclaration
+
+ if self.templatePrefix:
+ self.templatePrefix.describe_signature(signode, mode, env,
+ symbol=self.symbol,
+ lineSpec=options.get('tparam-line-spec'))
+ signode += mainDeclNode
+ if self.visibility and self.visibility != "public":
+ mainDeclNode += addnodes.desc_sig_keyword(self.visibility, self.visibility)
+ mainDeclNode += addnodes.desc_sig_space()
+ if self.objectType == 'type':
+ prefix = self.declaration.get_type_declaration_prefix()
+ mainDeclNode += addnodes.desc_sig_keyword(prefix, prefix)
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType == 'concept':
+ mainDeclNode += addnodes.desc_sig_keyword('concept', 'concept')
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType in {'member', 'function'}:
+ pass
+ elif self.objectType == 'class':
+ assert self.directiveType in ('class', 'struct')
+ mainDeclNode += addnodes.desc_sig_keyword(self.directiveType, self.directiveType)
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType == 'union':
+ mainDeclNode += addnodes.desc_sig_keyword('union', 'union')
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.objectType == 'enum':
+ mainDeclNode += addnodes.desc_sig_keyword('enum', 'enum')
+ mainDeclNode += addnodes.desc_sig_space()
+ if self.directiveType == 'enum-class':
+ mainDeclNode += addnodes.desc_sig_keyword('class', 'class')
+ mainDeclNode += addnodes.desc_sig_space()
+ elif self.directiveType == 'enum-struct':
+ mainDeclNode += addnodes.desc_sig_keyword('struct', 'struct')
+ mainDeclNode += addnodes.desc_sig_space()
+ else:
+ assert self.directiveType == 'enum', self.directiveType
+ elif self.objectType == 'enumerator':
+ mainDeclNode += addnodes.desc_sig_keyword('enumerator', 'enumerator')
+ mainDeclNode += addnodes.desc_sig_space()
+ else:
+ raise AssertionError(self.objectType)
+ self.declaration.describe_signature(mainDeclNode, mode, env, self.symbol)
+ lastDeclNode = mainDeclNode
+ if self.trailingRequiresClause:
+ trailingReqNode = addnodes.desc_signature_line()
+ trailingReqNode.sphinx_line_type = 'trailingRequiresClause'
+ signode.append(trailingReqNode)
+ lastDeclNode = trailingReqNode
+ self.trailingRequiresClause.describe_signature(
+ trailingReqNode, 'markType', env, self.symbol)
+ if self.semicolon:
+ lastDeclNode += addnodes.desc_sig_punctuation(';', ';')
+
+
+class ASTNamespace(ASTBase):
+ def __init__(self, nestedName: ASTNestedName,
+ templatePrefix: ASTTemplateDeclarationPrefix) -> None:
+ self.nestedName = nestedName
+ self.templatePrefix = templatePrefix
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = []
+ if self.templatePrefix:
+ res.append(transform(self.templatePrefix))
+ res.append(transform(self.nestedName))
+ return ''.join(res)
+
+
+class SymbolLookupResult:
+ def __init__(self, symbols: Iterator[Symbol], parentSymbol: Symbol,
+ identOrOp: ASTIdentifier | ASTOperator, templateParams: Any,
+ templateArgs: ASTTemplateArgs) -> None:
+ self.symbols = symbols
+ self.parentSymbol = parentSymbol
+ self.identOrOp = identOrOp
+ self.templateParams = templateParams
+ self.templateArgs = templateArgs
+
+
+class LookupKey:
+ def __init__(self, data: list[tuple[ASTNestedNameElement,
+ ASTTemplateParams | ASTTemplateIntroduction,
+ str]]) -> None:
+ self.data = data
+
+
+def _is_specialization(templateParams: ASTTemplateParams | ASTTemplateIntroduction,
+ templateArgs: ASTTemplateArgs) -> bool:
+ # Checks if `templateArgs` does not exactly match `templateParams`.
+ # the names of the template parameters must be given exactly as args
+ # and params that are packs must in the args be the name expanded
+ if len(templateParams.params) != len(templateArgs.args):
+ return True
+ # having no template params and no arguments is also a specialization
+ if len(templateParams.params) == 0:
+ return True
+ for i in range(len(templateParams.params)):
+ param = templateParams.params[i]
+ arg = templateArgs.args[i]
+ # TODO: doing this by string manipulation is probably not the most efficient
+ paramName = str(param.name)
+ argTxt = str(arg)
+ isArgPackExpansion = argTxt.endswith('...')
+ if param.isPack != isArgPackExpansion:
+ return True
+ argName = argTxt[:-3] if isArgPackExpansion else argTxt
+ if paramName != argName:
+ return True
+ return False
+
+
+class Symbol:
+ debug_indent = 0
+ debug_indent_string = " "
+ debug_lookup = False # overridden by the corresponding config value
+ debug_show_tree = False # overridden by the corresponding config value
+
+ def __copy__(self):
+ raise AssertionError # shouldn't happen
+
+ def __deepcopy__(self, memo):
+ if self.parent:
+ raise AssertionError # shouldn't happen
+ # the domain base class makes a copy of the initial data, which is fine
+ return Symbol(None, None, None, None, None, None, None)
+
+ @staticmethod
+ def debug_print(*args: Any) -> None:
+ logger.debug(Symbol.debug_indent_string * Symbol.debug_indent, end="")
+ logger.debug(*args)
+
+ def _assert_invariants(self) -> None:
+ if not self.parent:
+ # parent == None means global scope, so declaration means a parent
+ assert not self.identOrOp
+ assert not self.templateParams
+ assert not self.templateArgs
+ assert not self.declaration
+ assert not self.docname
+ else:
+ if self.declaration:
+ assert self.docname
+
+ def __setattr__(self, key: str, value: Any) -> None:
+ if key == "children":
+ raise AssertionError
+ return super().__setattr__(key, value)
+
+ def __init__(self, parent: Symbol | None,
+ identOrOp: ASTIdentifier | ASTOperator | None,
+ templateParams: ASTTemplateParams | ASTTemplateIntroduction | None,
+ templateArgs: Any, declaration: ASTDeclaration | None,
+ docname: str | None, line: int | None) -> None:
+ self.parent = parent
+ # declarations in a single directive are linked together
+ self.siblingAbove: Symbol | None = None
+ self.siblingBelow: Symbol | None = None
+ self.identOrOp = identOrOp
+ # Ensure the same symbol for `A` is created for:
+ #
+ # .. cpp:class:: template <typename T> class A
+ #
+ # and
+ #
+ # .. cpp:function:: template <typename T> int A<T>::foo()
+ if (templateArgs is not None and
+ not _is_specialization(templateParams, templateArgs)):
+ templateArgs = None
+ self.templateParams = templateParams # template<templateParams>
+ self.templateArgs = templateArgs # identifier<templateArgs>
+ self.declaration = declaration
+ self.docname = docname
+ self.line = line
+ self.isRedeclaration = False
+ self._assert_invariants()
+
+ # Remember to modify Symbol.remove if modifications to the parent change.
+ self._children: list[Symbol] = []
+ self._anonChildren: list[Symbol] = []
+ # note: _children includes _anonChildren
+ if self.parent:
+ self.parent._children.append(self)
+ if self.declaration:
+ self.declaration.symbol = self
+
+ # Do symbol addition after self._children has been initialised.
+ self._add_template_and_function_params()
+
+ def _fill_empty(self, declaration: ASTDeclaration, docname: str, line: int) -> None:
+ self._assert_invariants()
+ assert self.declaration is None
+ assert self.docname is None
+ assert self.line is None
+ assert declaration is not None
+ assert docname is not None
+ assert line is not None
+ self.declaration = declaration
+ self.declaration.symbol = self
+ self.docname = docname
+ self.line = line
+ self._assert_invariants()
+ # and symbol addition should be done as well
+ self._add_template_and_function_params()
+
+ def _add_template_and_function_params(self) -> None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_add_template_and_function_params:")
+ # Note: we may be called from _fill_empty, so the symbols we want
+ # to add may actually already be present (as empty symbols).
+
+ # add symbols for the template params
+ if self.templateParams:
+ for tp in self.templateParams.params:
+ if not tp.get_identifier():
+ continue
+ # only add a declaration if we our self are from a declaration
+ if self.declaration:
+ decl = ASTDeclaration(objectType='templateParam', declaration=tp)
+ else:
+ decl = None
+ nne = ASTNestedNameElement(tp.get_identifier(), None)
+ nn = ASTNestedName([nne], [False], rooted=False)
+ self._add_symbols(nn, [], decl, self.docname, self.line)
+ # add symbols for function parameters, if any
+ if self.declaration is not None and self.declaration.function_params is not None:
+ for fp in self.declaration.function_params:
+ if fp.arg is None:
+ continue
+ nn = fp.arg.name
+ if nn is None:
+ continue
+ # (comparing to the template params: we have checked that we are a declaration)
+ decl = ASTDeclaration(objectType='functionParam', declaration=fp)
+ assert not nn.rooted
+ assert len(nn.names) == 1
+ self._add_symbols(nn, [], decl, self.docname, self.line)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+
+ def remove(self) -> None:
+ if self.parent is None:
+ return
+ assert self in self.parent._children
+ self.parent._children.remove(self)
+ self.parent = None
+
+ def clear_doc(self, docname: str) -> None:
+ newChildren: list[Symbol] = []
+ for sChild in self._children:
+ sChild.clear_doc(docname)
+ if sChild.declaration and sChild.docname == docname:
+ sChild.declaration = None
+ sChild.docname = None
+ sChild.line = None
+ if sChild.siblingAbove is not None:
+ sChild.siblingAbove.siblingBelow = sChild.siblingBelow
+ if sChild.siblingBelow is not None:
+ sChild.siblingBelow.siblingAbove = sChild.siblingAbove
+ sChild.siblingAbove = None
+ sChild.siblingBelow = None
+ newChildren.append(sChild)
+ self._children = newChildren
+
+ def get_all_symbols(self) -> Iterator[Any]:
+ yield self
+ for sChild in self._children:
+ yield from sChild.get_all_symbols()
+
+ @property
+ def children_recurse_anon(self) -> Generator[Symbol, None, None]:
+ for c in self._children:
+ yield c
+ if not c.identOrOp.is_anon():
+ continue
+
+ yield from c.children_recurse_anon
+
+ def get_lookup_key(self) -> LookupKey:
+ # The pickle files for the environment and for each document are distinct.
+ # The environment has all the symbols, but the documents has xrefs that
+ # must know their scope. A lookup key is essentially a specification of
+ # how to find a specific symbol.
+ symbols = []
+ s = self
+ while s.parent:
+ symbols.append(s)
+ s = s.parent
+ symbols.reverse()
+ key = []
+ for s in symbols:
+ nne = ASTNestedNameElement(s.identOrOp, s.templateArgs)
+ if s.declaration is not None:
+ key.append((nne, s.templateParams, s.declaration.get_newest_id()))
+ else:
+ key.append((nne, s.templateParams, None))
+ return LookupKey(key)
+
+ def get_full_nested_name(self) -> ASTNestedName:
+ symbols = []
+ s = self
+ while s.parent:
+ symbols.append(s)
+ s = s.parent
+ symbols.reverse()
+ names = []
+ templates = []
+ for s in symbols:
+ names.append(ASTNestedNameElement(s.identOrOp, s.templateArgs))
+ templates.append(False)
+ return ASTNestedName(names, templates, rooted=False)
+
+ def _find_first_named_symbol(self, identOrOp: ASTIdentifier | ASTOperator,
+ templateParams: Any, templateArgs: ASTTemplateArgs,
+ templateShorthand: bool, matchSelf: bool,
+ recurseInAnon: bool, correctPrimaryTemplateArgs: bool,
+ ) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("_find_first_named_symbol ->")
+ res = self._find_named_symbols(identOrOp, templateParams, templateArgs,
+ templateShorthand, matchSelf, recurseInAnon,
+ correctPrimaryTemplateArgs,
+ searchInSiblings=False)
+ try:
+ return next(res)
+ except StopIteration:
+ return None
+
+ def _find_named_symbols(self, identOrOp: ASTIdentifier | ASTOperator,
+ templateParams: Any, templateArgs: ASTTemplateArgs,
+ templateShorthand: bool, matchSelf: bool,
+ recurseInAnon: bool, correctPrimaryTemplateArgs: bool,
+ searchInSiblings: bool) -> Iterator[Symbol]:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_find_named_symbols:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("self:")
+ logger.debug(self.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_print("identOrOp: ", identOrOp)
+ Symbol.debug_print("templateParams: ", templateParams)
+ Symbol.debug_print("templateArgs: ", templateArgs)
+ Symbol.debug_print("templateShorthand: ", templateShorthand)
+ Symbol.debug_print("matchSelf: ", matchSelf)
+ Symbol.debug_print("recurseInAnon: ", recurseInAnon)
+ Symbol.debug_print("correctPrimaryTemplateAargs:", correctPrimaryTemplateArgs)
+ Symbol.debug_print("searchInSiblings: ", searchInSiblings)
+
+ if correctPrimaryTemplateArgs:
+ if templateParams is not None and templateArgs is not None:
+ # If both are given, but it's not a specialization, then do lookup as if
+ # there is no argument list.
+ # For example: template<typename T> int A<T>::var;
+ if not _is_specialization(templateParams, templateArgs):
+ templateArgs = None
+
+ def matches(s: Symbol) -> bool:
+ if s.identOrOp != identOrOp:
+ return False
+ if (s.templateParams is None) != (templateParams is None):
+ if templateParams is not None:
+ # we query with params, they must match params
+ return False
+ if not templateShorthand:
+ # we don't query with params, and we do care about them
+ return False
+ if templateParams:
+ # TODO: do better comparison
+ if str(s.templateParams) != str(templateParams):
+ return False
+ if (s.templateArgs is None) != (templateArgs is None):
+ return False
+ if s.templateArgs:
+ # TODO: do better comparison
+ if str(s.templateArgs) != str(templateArgs):
+ return False
+ return True
+
+ def candidates() -> Generator[Symbol, None, None]:
+ s = self
+ if Symbol.debug_lookup:
+ Symbol.debug_print("searching in self:")
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+ while True:
+ if matchSelf:
+ yield s
+ if recurseInAnon:
+ yield from s.children_recurse_anon
+ else:
+ yield from s._children
+
+ if s.siblingAbove is None:
+ break
+ s = s.siblingAbove
+ if Symbol.debug_lookup:
+ Symbol.debug_print("searching in sibling:")
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+
+ for s in candidates():
+ if Symbol.debug_lookup:
+ Symbol.debug_print("candidate:")
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+ if matches(s):
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("matches")
+ Symbol.debug_indent -= 3
+ yield s
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 2
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+
+ def _symbol_lookup(
+ self,
+ nestedName: ASTNestedName,
+ templateDecls: list[Any],
+ onMissingQualifiedSymbol: Callable[
+ [Symbol, ASTIdentifier | ASTOperator, Any, ASTTemplateArgs], Symbol | None,
+ ],
+ strictTemplateParamArgLists: bool, ancestorLookupType: str,
+ templateShorthand: bool, matchSelf: bool,
+ recurseInAnon: bool, correctPrimaryTemplateArgs: bool,
+ searchInSiblings: bool,
+ ) -> SymbolLookupResult:
+ # ancestorLookupType: if not None, specifies the target type of the lookup
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_symbol_lookup:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("self:")
+ logger.debug(self.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_print("nestedName: ", nestedName)
+ Symbol.debug_print("templateDecls: ", ",".join(str(t) for t in templateDecls))
+ Symbol.debug_print("strictTemplateParamArgLists:", strictTemplateParamArgLists)
+ Symbol.debug_print("ancestorLookupType:", ancestorLookupType)
+ Symbol.debug_print("templateShorthand: ", templateShorthand)
+ Symbol.debug_print("matchSelf: ", matchSelf)
+ Symbol.debug_print("recurseInAnon: ", recurseInAnon)
+ Symbol.debug_print("correctPrimaryTemplateArgs: ", correctPrimaryTemplateArgs)
+ Symbol.debug_print("searchInSiblings: ", searchInSiblings)
+
+ if strictTemplateParamArgLists:
+ # Each template argument list must have a template parameter list.
+ # But to declare a template there must be an additional template parameter list.
+ assert (nestedName.num_templates() == len(templateDecls) or
+ nestedName.num_templates() + 1 == len(templateDecls))
+ else:
+ assert len(templateDecls) <= nestedName.num_templates() + 1
+
+ names = nestedName.names
+
+ # find the right starting point for lookup
+ parentSymbol = self
+ if nestedName.rooted:
+ while parentSymbol.parent:
+ parentSymbol = parentSymbol.parent
+ if ancestorLookupType is not None:
+ # walk up until we find the first identifier
+ firstName = names[0]
+ if not firstName.is_operator():
+ while parentSymbol.parent:
+ if parentSymbol.find_identifier(firstName.identOrOp,
+ matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon,
+ searchInSiblings=searchInSiblings):
+ # if we are in the scope of a constructor but wants to
+ # reference the class we need to walk one extra up
+ if (len(names) == 1 and ancestorLookupType == 'class' and matchSelf and
+ parentSymbol.parent and
+ parentSymbol.parent.identOrOp == firstName.identOrOp):
+ pass
+ else:
+ break
+ parentSymbol = parentSymbol.parent
+
+ if Symbol.debug_lookup:
+ Symbol.debug_print("starting point:")
+ logger.debug(parentSymbol.to_string(Symbol.debug_indent + 1), end="")
+
+ # and now the actual lookup
+ iTemplateDecl = 0
+ for name in names[:-1]:
+ identOrOp = name.identOrOp
+ templateArgs = name.templateArgs
+ if strictTemplateParamArgLists:
+ # there must be a parameter list
+ if templateArgs:
+ assert iTemplateDecl < len(templateDecls)
+ templateParams = templateDecls[iTemplateDecl]
+ iTemplateDecl += 1
+ else:
+ templateParams = None
+ else:
+ # take the next template parameter list if there is one
+ # otherwise it's ok
+ if templateArgs and iTemplateDecl < len(templateDecls):
+ templateParams = templateDecls[iTemplateDecl]
+ iTemplateDecl += 1
+ else:
+ templateParams = None
+
+ symbol = parentSymbol._find_first_named_symbol(
+ identOrOp,
+ templateParams, templateArgs,
+ templateShorthand=templateShorthand,
+ matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon,
+ correctPrimaryTemplateArgs=correctPrimaryTemplateArgs)
+ if symbol is None:
+ symbol = onMissingQualifiedSymbol(parentSymbol, identOrOp,
+ templateParams, templateArgs)
+ if symbol is None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return None
+ # We have now matched part of a nested name, and need to match more
+ # so even if we should matchSelf before, we definitely shouldn't
+ # even more. (see also issue #2666)
+ matchSelf = False
+ parentSymbol = symbol
+
+ if Symbol.debug_lookup:
+ Symbol.debug_print("handle last name from:")
+ logger.debug(parentSymbol.to_string(Symbol.debug_indent + 1), end="")
+
+ # handle the last name
+ name = names[-1]
+ identOrOp = name.identOrOp
+ templateArgs = name.templateArgs
+ if iTemplateDecl < len(templateDecls):
+ assert iTemplateDecl + 1 == len(templateDecls)
+ templateParams = templateDecls[iTemplateDecl]
+ else:
+ assert iTemplateDecl == len(templateDecls)
+ templateParams = None
+
+ symbols = parentSymbol._find_named_symbols(
+ identOrOp, templateParams, templateArgs,
+ templateShorthand=templateShorthand, matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon, correctPrimaryTemplateArgs=False,
+ searchInSiblings=searchInSiblings)
+ if Symbol.debug_lookup:
+ symbols = list(symbols) # type: ignore[assignment]
+ Symbol.debug_indent -= 2
+ return SymbolLookupResult(symbols, parentSymbol,
+ identOrOp, templateParams, templateArgs)
+
+ def _add_symbols(self, nestedName: ASTNestedName, templateDecls: list[Any],
+ declaration: ASTDeclaration, docname: str, line: int) -> Symbol:
+ # Used for adding a whole path of symbols, where the last may or may not
+ # be an actual declaration.
+
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_add_symbols:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("tdecls:", ",".join(str(t) for t in templateDecls))
+ Symbol.debug_print("nn: ", nestedName)
+ Symbol.debug_print("decl: ", declaration)
+ Symbol.debug_print(f"location: {docname}:{line}")
+
+ def onMissingQualifiedSymbol(parentSymbol: Symbol,
+ identOrOp: ASTIdentifier | ASTOperator,
+ templateParams: Any, templateArgs: ASTTemplateArgs,
+ ) -> Symbol | None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("_add_symbols, onMissingQualifiedSymbol:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("templateParams:", templateParams)
+ Symbol.debug_print("identOrOp: ", identOrOp)
+ Symbol.debug_print("templateARgs: ", templateArgs)
+ Symbol.debug_indent -= 2
+ return Symbol(parent=parentSymbol, identOrOp=identOrOp,
+ templateParams=templateParams,
+ templateArgs=templateArgs, declaration=None,
+ docname=None, line=None)
+
+ lookupResult = self._symbol_lookup(nestedName, templateDecls,
+ onMissingQualifiedSymbol,
+ strictTemplateParamArgLists=True,
+ ancestorLookupType=None,
+ templateShorthand=False,
+ matchSelf=False,
+ recurseInAnon=False,
+ correctPrimaryTemplateArgs=True,
+ searchInSiblings=False)
+ assert lookupResult is not None # we create symbols all the way, so that can't happen
+ symbols = list(lookupResult.symbols)
+ if len(symbols) == 0:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("_add_symbols, result, no symbol:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("templateParams:", lookupResult.templateParams)
+ Symbol.debug_print("identOrOp: ", lookupResult.identOrOp)
+ Symbol.debug_print("templateArgs: ", lookupResult.templateArgs)
+ Symbol.debug_print("declaration: ", declaration)
+ Symbol.debug_print(f"location: {docname}:{line}")
+ Symbol.debug_indent -= 1
+ symbol = Symbol(parent=lookupResult.parentSymbol,
+ identOrOp=lookupResult.identOrOp,
+ templateParams=lookupResult.templateParams,
+ templateArgs=lookupResult.templateArgs,
+ declaration=declaration,
+ docname=docname, line=line)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return symbol
+
+ if Symbol.debug_lookup:
+ Symbol.debug_print("_add_symbols, result, symbols:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("number symbols:", len(symbols))
+ Symbol.debug_indent -= 1
+
+ if not declaration:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("no declaration")
+ Symbol.debug_indent -= 2
+ # good, just a scope creation
+ # TODO: what if we have more than one symbol?
+ return symbols[0]
+
+ noDecl = []
+ withDecl = []
+ dupDecl = []
+ for s in symbols:
+ if s.declaration is None:
+ noDecl.append(s)
+ elif s.isRedeclaration:
+ dupDecl.append(s)
+ else:
+ withDecl.append(s)
+ if Symbol.debug_lookup:
+ Symbol.debug_print("#noDecl: ", len(noDecl))
+ Symbol.debug_print("#withDecl:", len(withDecl))
+ Symbol.debug_print("#dupDecl: ", len(dupDecl))
+ # With partial builds we may start with a large symbol tree stripped of declarations.
+ # Essentially any combination of noDecl, withDecl, and dupDecls seems possible.
+ # TODO: make partial builds fully work. What should happen when the primary symbol gets
+ # deleted, and other duplicates exist? The full document should probably be rebuild.
+
+ # First check if one of those with a declaration matches.
+ # If it's a function, we need to compare IDs,
+ # otherwise there should be only one symbol with a declaration.
+ def makeCandSymbol() -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("begin: creating candidate symbol")
+ symbol = Symbol(parent=lookupResult.parentSymbol,
+ identOrOp=lookupResult.identOrOp,
+ templateParams=lookupResult.templateParams,
+ templateArgs=lookupResult.templateArgs,
+ declaration=declaration,
+ docname=docname, line=line)
+ if Symbol.debug_lookup:
+ Symbol.debug_print("end: creating candidate symbol")
+ return symbol
+ if len(withDecl) == 0:
+ candSymbol = None
+ else:
+ candSymbol = makeCandSymbol()
+
+ def handleDuplicateDeclaration(symbol: Symbol, candSymbol: Symbol) -> None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("redeclaration")
+ Symbol.debug_indent -= 1
+ Symbol.debug_indent -= 2
+ # Redeclaration of the same symbol.
+ # Let the new one be there, but raise an error to the client
+ # so it can use the real symbol as subscope.
+ # This will probably result in a duplicate id warning.
+ candSymbol.isRedeclaration = True
+ raise _DuplicateSymbolError(symbol, declaration)
+
+ if declaration.objectType != "function":
+ assert len(withDecl) <= 1
+ handleDuplicateDeclaration(withDecl[0], candSymbol)
+ # (not reachable)
+
+ # a function, so compare IDs
+ candId = declaration.get_newest_id()
+ if Symbol.debug_lookup:
+ Symbol.debug_print("candId:", candId)
+ for symbol in withDecl:
+ # but all existing must be functions as well,
+ # otherwise we declare it to be a duplicate
+ if symbol.declaration.objectType != 'function':
+ handleDuplicateDeclaration(symbol, candSymbol)
+ # (not reachable)
+ oldId = symbol.declaration.get_newest_id()
+ if Symbol.debug_lookup:
+ Symbol.debug_print("oldId: ", oldId)
+ if candId == oldId:
+ handleDuplicateDeclaration(symbol, candSymbol)
+ # (not reachable)
+ # no candidate symbol found with matching ID
+ # if there is an empty symbol, fill that one
+ if len(noDecl) == 0:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("no match, no empty")
+ if candSymbol is not None:
+ Symbol.debug_print("result is already created candSymbol")
+ else:
+ Symbol.debug_print("result is makeCandSymbol()")
+ Symbol.debug_indent -= 2
+ if candSymbol is not None:
+ return candSymbol
+ else:
+ return makeCandSymbol()
+ else:
+ if Symbol.debug_lookup:
+ Symbol.debug_print(
+ "no match, but fill an empty declaration, candSybmol is not None?:",
+ candSymbol is not None,
+ )
+ Symbol.debug_indent -= 2
+ if candSymbol is not None:
+ candSymbol.remove()
+ # assert len(noDecl) == 1
+ # TODO: enable assertion when we at some point find out how to do cleanup
+ # for now, just take the first one, it should work fine ... right?
+ symbol = noDecl[0]
+ # If someone first opened the scope, and then later
+ # declares it, e.g,
+ # .. namespace:: Test
+ # .. namespace:: nullptr
+ # .. class:: Test
+ symbol._fill_empty(declaration, docname, line)
+ return symbol
+
+ def merge_with(self, other: Symbol, docnames: list[str],
+ env: BuildEnvironment) -> None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("merge_with:")
+ assert other is not None
+
+ def unconditionalAdd(self, otherChild):
+ # TODO: hmm, should we prune by docnames?
+ self._children.append(otherChild)
+ otherChild.parent = self
+ otherChild._assert_invariants()
+
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ for otherChild in other._children:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("otherChild:\n", otherChild.to_string(Symbol.debug_indent))
+ Symbol.debug_indent += 1
+ if otherChild.isRedeclaration:
+ unconditionalAdd(self, otherChild)
+ if Symbol.debug_lookup:
+ Symbol.debug_print("isRedeclaration")
+ Symbol.debug_indent -= 1
+ continue
+ candiateIter = self._find_named_symbols(
+ identOrOp=otherChild.identOrOp,
+ templateParams=otherChild.templateParams,
+ templateArgs=otherChild.templateArgs,
+ templateShorthand=False, matchSelf=False,
+ recurseInAnon=False, correctPrimaryTemplateArgs=False,
+ searchInSiblings=False)
+ candidates = list(candiateIter)
+
+ if Symbol.debug_lookup:
+ Symbol.debug_print("raw candidate symbols:", len(candidates))
+ symbols = [s for s in candidates if not s.isRedeclaration]
+ if Symbol.debug_lookup:
+ Symbol.debug_print("non-duplicate candidate symbols:", len(symbols))
+
+ if len(symbols) == 0:
+ unconditionalAdd(self, otherChild)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ continue
+
+ ourChild = None
+ if otherChild.declaration is None:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("no declaration in other child")
+ ourChild = symbols[0]
+ else:
+ queryId = otherChild.declaration.get_newest_id()
+ if Symbol.debug_lookup:
+ Symbol.debug_print("queryId: ", queryId)
+ for symbol in symbols:
+ if symbol.declaration is None:
+ if Symbol.debug_lookup:
+ Symbol.debug_print("empty candidate")
+ # if in the end we have non-matching, but have an empty one,
+ # then just continue with that
+ ourChild = symbol
+ continue
+ candId = symbol.declaration.get_newest_id()
+ if Symbol.debug_lookup:
+ Symbol.debug_print("candidate:", candId)
+ if candId == queryId:
+ ourChild = symbol
+ break
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ if ourChild is None:
+ unconditionalAdd(self, otherChild)
+ continue
+ if otherChild.declaration and otherChild.docname in docnames:
+ if not ourChild.declaration:
+ ourChild._fill_empty(otherChild.declaration,
+ otherChild.docname, otherChild.line)
+ elif ourChild.docname != otherChild.docname:
+ name = str(ourChild.declaration)
+ msg = __("Duplicate C++ declaration, also defined at %s:%s.\n"
+ "Declaration is '.. cpp:%s:: %s'.")
+ msg = msg % (ourChild.docname, ourChild.line,
+ ourChild.declaration.directiveType, name)
+ logger.warning(msg, location=(otherChild.docname, otherChild.line))
+ else:
+ if (otherChild.declaration.objectType ==
+ ourChild.declaration.objectType and
+ otherChild.declaration.objectType in
+ ('templateParam', 'functionParam') and
+ ourChild.parent.declaration == otherChild.parent.declaration):
+ # `ourChild` was just created during merging by the call
+ # to `_fill_empty` on the parent and can be ignored.
+ pass
+ else:
+ # Both have declarations, and in the same docname.
+ # This can apparently happen, it should be safe to
+ # just ignore it, right?
+ # Hmm, only on duplicate declarations, right?
+ msg = "Internal C++ domain error during symbol merging.\n"
+ msg += "ourChild:\n" + ourChild.to_string(1)
+ msg += "\notherChild:\n" + otherChild.to_string(1)
+ logger.warning(msg, location=otherChild.docname)
+ ourChild.merge_with(otherChild, docnames, env)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+
+ def add_name(self, nestedName: ASTNestedName,
+ templatePrefix: ASTTemplateDeclarationPrefix | None = None) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("add_name:")
+ if templatePrefix:
+ templateDecls = templatePrefix.templates
+ else:
+ templateDecls = []
+ res = self._add_symbols(nestedName, templateDecls,
+ declaration=None, docname=None, line=None)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ return res
+
+ def add_declaration(self, declaration: ASTDeclaration,
+ docname: str, line: int) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("add_declaration:")
+ assert declaration is not None
+ assert docname is not None
+ assert line is not None
+ nestedName = declaration.name
+ if declaration.templatePrefix:
+ templateDecls = declaration.templatePrefix.templates
+ else:
+ templateDecls = []
+ res = self._add_symbols(nestedName, templateDecls, declaration, docname, line)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ return res
+
+ def find_identifier(self, identOrOp: ASTIdentifier | ASTOperator,
+ matchSelf: bool, recurseInAnon: bool, searchInSiblings: bool,
+ ) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("find_identifier:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("identOrOp: ", identOrOp)
+ Symbol.debug_print("matchSelf: ", matchSelf)
+ Symbol.debug_print("recurseInAnon: ", recurseInAnon)
+ Symbol.debug_print("searchInSiblings:", searchInSiblings)
+ logger.debug(self.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_indent -= 2
+ current = self
+ while current is not None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 2
+ Symbol.debug_print("trying:")
+ logger.debug(current.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_indent -= 2
+ if matchSelf and current.identOrOp == identOrOp:
+ return current
+ children = current.children_recurse_anon if recurseInAnon else current._children
+ for s in children:
+ if s.identOrOp == identOrOp:
+ return s
+ if not searchInSiblings:
+ break
+ current = current.siblingAbove
+ return None
+
+ def direct_lookup(self, key: LookupKey) -> Symbol:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("direct_lookup:")
+ Symbol.debug_indent += 1
+ s = self
+ for name, templateParams, id_ in key.data:
+ if id_ is not None:
+ res = None
+ for cand in s._children:
+ if cand.declaration is None:
+ continue
+ if cand.declaration.get_newest_id() == id_:
+ res = cand
+ break
+ s = res
+ else:
+ identOrOp = name.identOrOp
+ templateArgs = name.templateArgs
+ s = s._find_first_named_symbol(identOrOp,
+ templateParams, templateArgs,
+ templateShorthand=False,
+ matchSelf=False,
+ recurseInAnon=False,
+ correctPrimaryTemplateArgs=False)
+ if Symbol.debug_lookup:
+ Symbol.debug_print("name: ", name)
+ Symbol.debug_print("templateParams:", templateParams)
+ Symbol.debug_print("id: ", id_)
+ if s is not None:
+ logger.debug(s.to_string(Symbol.debug_indent + 1), end="")
+ else:
+ Symbol.debug_print("not found")
+ if s is None:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return None
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return s
+
+ def find_name(self, nestedName: ASTNestedName, templateDecls: list[Any],
+ typ: str, templateShorthand: bool, matchSelf: bool,
+ recurseInAnon: bool, searchInSiblings: bool) -> tuple[list[Symbol], str]:
+ # templateShorthand: missing template parameter lists for templates is ok
+ # If the first component is None,
+ # then the second component _may_ be a string explaining why.
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("find_name:")
+ Symbol.debug_indent += 1
+ Symbol.debug_print("self:")
+ logger.debug(self.to_string(Symbol.debug_indent + 1), end="")
+ Symbol.debug_print("nestedName: ", nestedName)
+ Symbol.debug_print("templateDecls: ", templateDecls)
+ Symbol.debug_print("typ: ", typ)
+ Symbol.debug_print("templateShorthand:", templateShorthand)
+ Symbol.debug_print("matchSelf: ", matchSelf)
+ Symbol.debug_print("recurseInAnon: ", recurseInAnon)
+ Symbol.debug_print("searchInSiblings: ", searchInSiblings)
+
+ class QualifiedSymbolIsTemplateParam(Exception):
+ pass
+
+ def onMissingQualifiedSymbol(parentSymbol: Symbol,
+ identOrOp: ASTIdentifier | ASTOperator,
+ templateParams: Any,
+ templateArgs: ASTTemplateArgs) -> Symbol | None:
+ # TODO: Maybe search without template args?
+ # Though, the correctPrimaryTemplateArgs does
+ # that for primary templates.
+ # Is there another case where it would be good?
+ if parentSymbol.declaration is not None:
+ if parentSymbol.declaration.objectType == 'templateParam':
+ raise QualifiedSymbolIsTemplateParam
+ return None
+
+ try:
+ lookupResult = self._symbol_lookup(nestedName, templateDecls,
+ onMissingQualifiedSymbol,
+ strictTemplateParamArgLists=False,
+ ancestorLookupType=typ,
+ templateShorthand=templateShorthand,
+ matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon,
+ correctPrimaryTemplateArgs=False,
+ searchInSiblings=searchInSiblings)
+ except QualifiedSymbolIsTemplateParam:
+ return None, "templateParamInQualified"
+
+ if lookupResult is None:
+ # if it was a part of the qualification that could not be found
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return None, None
+
+ res = list(lookupResult.symbols)
+ if len(res) != 0:
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ return res, None
+
+ if lookupResult.parentSymbol.declaration is not None:
+ if lookupResult.parentSymbol.declaration.objectType == 'templateParam':
+ return None, "templateParamInQualified"
+
+ # try without template params and args
+ symbol = lookupResult.parentSymbol._find_first_named_symbol(
+ lookupResult.identOrOp, None, None,
+ templateShorthand=templateShorthand, matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon, correctPrimaryTemplateArgs=False)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 2
+ if symbol is not None:
+ return [symbol], None
+ else:
+ return None, None
+
+ def find_declaration(self, declaration: ASTDeclaration, typ: str, templateShorthand: bool,
+ matchSelf: bool, recurseInAnon: bool) -> Symbol:
+ # templateShorthand: missing template parameter lists for templates is ok
+ if Symbol.debug_lookup:
+ Symbol.debug_indent += 1
+ Symbol.debug_print("find_declaration:")
+ nestedName = declaration.name
+ if declaration.templatePrefix:
+ templateDecls = declaration.templatePrefix.templates
+ else:
+ templateDecls = []
+
+ def onMissingQualifiedSymbol(parentSymbol: Symbol,
+ identOrOp: ASTIdentifier | ASTOperator,
+ templateParams: Any,
+ templateArgs: ASTTemplateArgs) -> Symbol | None:
+ return None
+
+ lookupResult = self._symbol_lookup(nestedName, templateDecls,
+ onMissingQualifiedSymbol,
+ strictTemplateParamArgLists=False,
+ ancestorLookupType=typ,
+ templateShorthand=templateShorthand,
+ matchSelf=matchSelf,
+ recurseInAnon=recurseInAnon,
+ correctPrimaryTemplateArgs=False,
+ searchInSiblings=False)
+ if Symbol.debug_lookup:
+ Symbol.debug_indent -= 1
+ if lookupResult is None:
+ return None
+
+ symbols = list(lookupResult.symbols)
+ if len(symbols) == 0:
+ return None
+
+ querySymbol = Symbol(parent=lookupResult.parentSymbol,
+ identOrOp=lookupResult.identOrOp,
+ templateParams=lookupResult.templateParams,
+ templateArgs=lookupResult.templateArgs,
+ declaration=declaration,
+ docname='fakeDocnameForQuery',
+ line=42)
+ queryId = declaration.get_newest_id()
+ for symbol in symbols:
+ if symbol.declaration is None:
+ continue
+ candId = symbol.declaration.get_newest_id()
+ if candId == queryId:
+ querySymbol.remove()
+ return symbol
+ querySymbol.remove()
+ return None
+
+ def to_string(self, indent: int) -> str:
+ res = [Symbol.debug_indent_string * indent]
+ if not self.parent:
+ res.append('::')
+ else:
+ if self.templateParams:
+ res.append(str(self.templateParams))
+ res.append('\n')
+ res.append(Symbol.debug_indent_string * indent)
+ if self.identOrOp:
+ res.append(str(self.identOrOp))
+ else:
+ res.append(str(self.declaration))
+ if self.templateArgs:
+ res.append(str(self.templateArgs))
+ if self.declaration:
+ res.append(": ")
+ if self.isRedeclaration:
+ res.append('!!duplicate!! ')
+ res.append("{" + self.declaration.objectType + "} ")
+ res.append(str(self.declaration))
+ if self.docname:
+ res.append('\t(')
+ res.append(self.docname)
+ res.append(')')
+ res.append('\n')
+ return ''.join(res)
+
+ def dump(self, indent: int) -> str:
+ res = [self.to_string(indent)]
+ for c in self._children:
+ res.append(c.dump(indent + 1))
+ return ''.join(res)
+
+
+class DefinitionParser(BaseParser):
+ @property
+ def language(self) -> str:
+ return 'C++'
+
+ @property
+ def id_attributes(self):
+ return self.config.cpp_id_attributes
+
+ @property
+ def paren_attributes(self):
+ return self.config.cpp_paren_attributes
+
+ def _parse_string(self) -> str:
+ if self.current_char != '"':
+ return None
+ startPos = self.pos
+ self.pos += 1
+ escape = False
+ while True:
+ if self.eof:
+ self.fail("Unexpected end during inside string.")
+ elif self.current_char == '"' and not escape:
+ self.pos += 1
+ break
+ elif self.current_char == '\\':
+ escape = True
+ else:
+ escape = False
+ self.pos += 1
+ return self.definition[startPos:self.pos]
+
+ def _parse_literal(self) -> ASTLiteral:
+ # -> integer-literal
+ # | character-literal
+ # | floating-literal
+ # | string-literal
+ # | boolean-literal -> "false" | "true"
+ # | pointer-literal -> "nullptr"
+ # | user-defined-literal
+
+ def _udl(literal: ASTLiteral) -> ASTLiteral:
+ if not self.match(udl_identifier_re):
+ return literal
+ # hmm, should we care if it's a keyword?
+ # it looks like GCC does not disallow keywords
+ ident = ASTIdentifier(self.matched_text)
+ return ASTUserDefinedLiteral(literal, ident)
+
+ self.skip_ws()
+ if self.skip_word('nullptr'):
+ return ASTPointerLiteral()
+ if self.skip_word('true'):
+ return ASTBooleanLiteral(True)
+ if self.skip_word('false'):
+ return ASTBooleanLiteral(False)
+ pos = self.pos
+ if self.match(float_literal_re):
+ hasSuffix = self.match(float_literal_suffix_re)
+ floatLit = ASTNumberLiteral(self.definition[pos:self.pos])
+ if hasSuffix:
+ return floatLit
+ else:
+ return _udl(floatLit)
+ for regex in [binary_literal_re, hex_literal_re,
+ integer_literal_re, octal_literal_re]:
+ if self.match(regex):
+ hasSuffix = self.match(integers_literal_suffix_re)
+ intLit = ASTNumberLiteral(self.definition[pos:self.pos])
+ if hasSuffix:
+ return intLit
+ else:
+ return _udl(intLit)
+
+ string = self._parse_string()
+ if string is not None:
+ return _udl(ASTStringLiteral(string))
+
+ # character-literal
+ if self.match(char_literal_re):
+ prefix = self.last_match.group(1) # may be None when no prefix
+ data = self.last_match.group(2)
+ try:
+ charLit = ASTCharLiteral(prefix, data)
+ except UnicodeDecodeError as e:
+ self.fail("Can not handle character literal. Internal error was: %s" % e)
+ except UnsupportedMultiCharacterCharLiteral:
+ self.fail("Can not handle character literal"
+ " resulting in multiple decoded characters.")
+ return _udl(charLit)
+ return None
+
+ def _parse_fold_or_paren_expression(self) -> ASTExpression:
+ # "(" expression ")"
+ # fold-expression
+ # -> ( cast-expression fold-operator ... )
+ # | ( ... fold-operator cast-expression )
+ # | ( cast-expression fold-operator ... fold-operator cast-expression
+ if self.current_char != '(':
+ return None
+ self.pos += 1
+ self.skip_ws()
+ if self.skip_string_and_ws("..."):
+ # ( ... fold-operator cast-expression )
+ if not self.match(_fold_operator_re):
+ self.fail("Expected fold operator after '...' in fold expression.")
+ op = self.matched_text
+ rightExpr = self._parse_cast_expression()
+ if not self.skip_string(')'):
+ self.fail("Expected ')' in end of fold expression.")
+ return ASTFoldExpr(None, op, rightExpr)
+ # try first parsing a unary right fold, or a binary fold
+ pos = self.pos
+ try:
+ self.skip_ws()
+ leftExpr = self._parse_cast_expression()
+ self.skip_ws()
+ if not self.match(_fold_operator_re):
+ self.fail("Expected fold operator after left expression in fold expression.")
+ op = self.matched_text
+ self.skip_ws()
+ if not self.skip_string_and_ws('...'):
+ self.fail("Expected '...' after fold operator in fold expression.")
+ except DefinitionError as eFold:
+ self.pos = pos
+ # fall back to a paren expression
+ try:
+ res = self._parse_expression()
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expected ')' in end of parenthesized expression.")
+ except DefinitionError as eExpr:
+ raise self._make_multi_error([
+ (eFold, "If fold expression"),
+ (eExpr, "If parenthesized expression"),
+ ], "Error in fold expression or parenthesized expression.") from eExpr
+ return ASTParenExpr(res)
+ # now it definitely is a fold expression
+ if self.skip_string(')'):
+ return ASTFoldExpr(leftExpr, op, None)
+ if not self.match(_fold_operator_re):
+ self.fail("Expected fold operator or ')' after '...' in fold expression.")
+ if op != self.matched_text:
+ self.fail("Operators are different in binary fold: '%s' and '%s'."
+ % (op, self.matched_text))
+ rightExpr = self._parse_cast_expression()
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expected ')' to end binary fold expression.")
+ return ASTFoldExpr(leftExpr, op, rightExpr)
+
+ def _parse_primary_expression(self) -> ASTExpression:
+ # literal
+ # "this"
+ # lambda-expression
+ # "(" expression ")"
+ # fold-expression
+ # id-expression -> we parse this with _parse_nested_name
+ self.skip_ws()
+ res: ASTExpression = self._parse_literal()
+ if res is not None:
+ return res
+ self.skip_ws()
+ if self.skip_word("this"):
+ return ASTThisLiteral()
+ # TODO: try lambda expression
+ res = self._parse_fold_or_paren_expression()
+ if res is not None:
+ return res
+ nn = self._parse_nested_name()
+ if nn is not None:
+ return ASTIdExpression(nn)
+ return None
+
+ def _parse_initializer_list(self, name: str, open: str, close: str,
+ ) -> tuple[list[ASTExpression | ASTBracedInitList],
+ bool]:
+ # Parse open and close with the actual initializer-list in between
+ # -> initializer-clause '...'[opt]
+ # | initializer-list ',' initializer-clause '...'[opt]
+ self.skip_ws()
+ if not self.skip_string_and_ws(open):
+ return None, None
+ if self.skip_string(close):
+ return [], False
+
+ exprs: list[ASTExpression | ASTBracedInitList] = []
+ trailingComma = False
+ while True:
+ self.skip_ws()
+ expr = self._parse_initializer_clause()
+ self.skip_ws()
+ if self.skip_string('...'):
+ exprs.append(ASTPackExpansionExpr(expr))
+ else:
+ exprs.append(expr)
+ self.skip_ws()
+ if self.skip_string(close):
+ break
+ if not self.skip_string_and_ws(','):
+ self.fail(f"Error in {name}, expected ',' or '{close}'.")
+ if self.current_char == close and close == '}':
+ self.pos += 1
+ trailingComma = True
+ break
+ return exprs, trailingComma
+
+ def _parse_paren_expression_list(self) -> ASTParenExprList:
+ # -> '(' expression-list ')'
+ # though, we relax it to also allow empty parens
+ # as it's needed in some cases
+ #
+ # expression-list
+ # -> initializer-list
+ exprs, trailingComma = self._parse_initializer_list("parenthesized expression-list",
+ '(', ')')
+ if exprs is None:
+ return None
+ return ASTParenExprList(exprs)
+
+ def _parse_initializer_clause(self) -> ASTExpression | ASTBracedInitList:
+ bracedInitList = self._parse_braced_init_list()
+ if bracedInitList is not None:
+ return bracedInitList
+ return self._parse_assignment_expression(inTemplate=False)
+
+ def _parse_braced_init_list(self) -> ASTBracedInitList:
+ # -> '{' initializer-list ','[opt] '}'
+ # | '{' '}'
+ exprs, trailingComma = self._parse_initializer_list("braced-init-list", '{', '}')
+ if exprs is None:
+ return None
+ return ASTBracedInitList(exprs, trailingComma)
+
+ def _parse_expression_list_or_braced_init_list(
+ self,
+ ) -> ASTParenExprList | ASTBracedInitList:
+ paren = self._parse_paren_expression_list()
+ if paren is not None:
+ return paren
+ return self._parse_braced_init_list()
+
+ def _parse_postfix_expression(self) -> ASTPostfixExpr:
+ # -> primary
+ # | postfix "[" expression "]"
+ # | postfix "[" braced-init-list [opt] "]"
+ # | postfix "(" expression-list [opt] ")"
+ # | postfix "." "template" [opt] id-expression
+ # | postfix "->" "template" [opt] id-expression
+ # | postfix "." pseudo-destructor-name
+ # | postfix "->" pseudo-destructor-name
+ # | postfix "++"
+ # | postfix "--"
+ # | simple-type-specifier "(" expression-list [opt] ")"
+ # | simple-type-specifier braced-init-list
+ # | typename-specifier "(" expression-list [opt] ")"
+ # | typename-specifier braced-init-list
+ # | "dynamic_cast" "<" type-id ">" "(" expression ")"
+ # | "static_cast" "<" type-id ">" "(" expression ")"
+ # | "reinterpret_cast" "<" type-id ">" "(" expression ")"
+ # | "const_cast" "<" type-id ">" "(" expression ")"
+ # | "typeid" "(" expression ")"
+ # | "typeid" "(" type-id ")"
+
+ prefixType = None
+ prefix: Any = None
+ self.skip_ws()
+
+ cast = None
+ for c in _id_explicit_cast:
+ if self.skip_word_and_ws(c):
+ cast = c
+ break
+ if cast is not None:
+ prefixType = "cast"
+ if not self.skip_string("<"):
+ self.fail("Expected '<' after '%s'." % cast)
+ typ = self._parse_type(False)
+ self.skip_ws()
+ if not self.skip_string_and_ws(">"):
+ self.fail("Expected '>' after type in '%s'." % cast)
+ if not self.skip_string("("):
+ self.fail("Expected '(' in '%s'." % cast)
+
+ def parser() -> ASTExpression:
+ return self._parse_expression()
+ expr = self._parse_expression_fallback([')'], parser)
+ self.skip_ws()
+ if not self.skip_string(")"):
+ self.fail("Expected ')' to end '%s'." % cast)
+ prefix = ASTExplicitCast(cast, typ, expr)
+ elif self.skip_word_and_ws("typeid"):
+ prefixType = "typeid"
+ if not self.skip_string_and_ws('('):
+ self.fail("Expected '(' after 'typeid'.")
+ pos = self.pos
+ try:
+ typ = self._parse_type(False)
+ prefix = ASTTypeId(typ, isType=True)
+ if not self.skip_string(')'):
+ self.fail("Expected ')' to end 'typeid' of type.")
+ except DefinitionError as eType:
+ self.pos = pos
+ try:
+
+ def parser() -> ASTExpression:
+ return self._parse_expression()
+ expr = self._parse_expression_fallback([')'], parser)
+ prefix = ASTTypeId(expr, isType=False)
+ if not self.skip_string(')'):
+ self.fail("Expected ')' to end 'typeid' of expression.")
+ except DefinitionError as eExpr:
+ self.pos = pos
+ header = "Error in 'typeid(...)'."
+ header += " Expected type or expression."
+ errors = []
+ errors.append((eType, "If type"))
+ errors.append((eExpr, "If expression"))
+ raise self._make_multi_error(errors, header) from eExpr
+ else: # a primary expression or a type
+ pos = self.pos
+ try:
+ prefix = self._parse_primary_expression()
+ prefixType = 'expr'
+ except DefinitionError as eOuter:
+ self.pos = pos
+ try:
+ # we are potentially casting, so save parens for us
+ # TODO: hmm, would we need to try both with operatorCast and with None?
+ prefix = self._parse_type(False, 'operatorCast')
+ prefixType = 'typeOperatorCast'
+ # | simple-type-specifier "(" expression-list [opt] ")"
+ # | simple-type-specifier braced-init-list
+ # | typename-specifier "(" expression-list [opt] ")"
+ # | typename-specifier braced-init-list
+ self.skip_ws()
+ if self.current_char != '(' and self.current_char != '{':
+ self.fail("Expecting '(' or '{' after type in cast expression.")
+ except DefinitionError as eInner:
+ self.pos = pos
+ header = "Error in postfix expression,"
+ header += " expected primary expression or type."
+ errors = []
+ errors.append((eOuter, "If primary expression"))
+ errors.append((eInner, "If type"))
+ raise self._make_multi_error(errors, header) from eInner
+
+ # and now parse postfixes
+ postFixes: list[ASTPostfixOp] = []
+ while True:
+ self.skip_ws()
+ if prefixType in ('expr', 'cast', 'typeid'):
+ if self.skip_string_and_ws('['):
+ expr = self._parse_expression()
+ self.skip_ws()
+ if not self.skip_string(']'):
+ self.fail("Expected ']' in end of postfix expression.")
+ postFixes.append(ASTPostfixArray(expr))
+ continue
+ if self.skip_string('.'):
+ if self.skip_string('*'):
+ # don't steal the dot
+ self.pos -= 2
+ elif self.skip_string('..'):
+ # don't steal the dot
+ self.pos -= 3
+ else:
+ name = self._parse_nested_name()
+ postFixes.append(ASTPostfixMember(name))
+ continue
+ if self.skip_string('->'):
+ if self.skip_string('*'):
+ # don't steal the arrow
+ self.pos -= 3
+ else:
+ name = self._parse_nested_name()
+ postFixes.append(ASTPostfixMemberOfPointer(name))
+ continue
+ if self.skip_string('++'):
+ postFixes.append(ASTPostfixInc())
+ continue
+ if self.skip_string('--'):
+ postFixes.append(ASTPostfixDec())
+ continue
+ lst = self._parse_expression_list_or_braced_init_list()
+ if lst is not None:
+ postFixes.append(ASTPostfixCallExpr(lst))
+ continue
+ break
+ return ASTPostfixExpr(prefix, postFixes)
+
+ def _parse_unary_expression(self) -> ASTExpression:
+ # -> postfix
+ # | "++" cast
+ # | "--" cast
+ # | unary-operator cast -> (* | & | + | - | ! | ~) cast
+ # The rest:
+ # | "sizeof" unary
+ # | "sizeof" "(" type-id ")"
+ # | "sizeof" "..." "(" identifier ")"
+ # | "alignof" "(" type-id ")"
+ # | noexcept-expression -> noexcept "(" expression ")"
+ # | new-expression
+ # | delete-expression
+ self.skip_ws()
+ for op in _expression_unary_ops:
+ # TODO: hmm, should we be able to backtrack here?
+ if op[0] in 'cn':
+ res = self.skip_word(op)
+ else:
+ res = self.skip_string(op)
+ if res:
+ expr = self._parse_cast_expression()
+ return ASTUnaryOpExpr(op, expr)
+ if self.skip_word_and_ws('sizeof'):
+ if self.skip_string_and_ws('...'):
+ if not self.skip_string_and_ws('('):
+ self.fail("Expecting '(' after 'sizeof...'.")
+ if not self.match(identifier_re):
+ self.fail("Expecting identifier for 'sizeof...'.")
+ ident = ASTIdentifier(self.matched_text)
+ self.skip_ws()
+ if not self.skip_string(")"):
+ self.fail("Expecting ')' to end 'sizeof...'.")
+ return ASTSizeofParamPack(ident)
+ if self.skip_string_and_ws('('):
+ typ = self._parse_type(named=False)
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expecting ')' to end 'sizeof'.")
+ return ASTSizeofType(typ)
+ expr = self._parse_unary_expression()
+ return ASTSizeofExpr(expr)
+ if self.skip_word_and_ws('alignof'):
+ if not self.skip_string_and_ws('('):
+ self.fail("Expecting '(' after 'alignof'.")
+ typ = self._parse_type(named=False)
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expecting ')' to end 'alignof'.")
+ return ASTAlignofExpr(typ)
+ if self.skip_word_and_ws('noexcept'):
+ if not self.skip_string_and_ws('('):
+ self.fail("Expecting '(' after 'noexcept'.")
+ expr = self._parse_expression()
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expecting ')' to end 'noexcept'.")
+ return ASTNoexceptExpr(expr)
+ # new-expression
+ pos = self.pos
+ rooted = self.skip_string('::')
+ self.skip_ws()
+ if not self.skip_word_and_ws('new'):
+ self.pos = pos
+ else:
+ # new-placement[opt] new-type-id new-initializer[opt]
+ # new-placement[opt] ( type-id ) new-initializer[opt]
+ isNewTypeId = True
+ if self.skip_string_and_ws('('):
+ # either this is a new-placement or it's the second production
+ # without placement, and it's actually the ( type-id ) part
+ self.fail("Sorry, neither new-placement nor parenthesised type-id "
+ "in new-epression is supported yet.")
+ # set isNewTypeId = False if it's (type-id)
+ if isNewTypeId:
+ declSpecs = self._parse_decl_specs(outer=None)
+ decl = self._parse_declarator(named=False, paramMode="new")
+ else:
+ self.fail("Sorry, parenthesised type-id in new expression not yet supported.")
+ lst = self._parse_expression_list_or_braced_init_list()
+ return ASTNewExpr(rooted, isNewTypeId, ASTType(declSpecs, decl), lst)
+ # delete-expression
+ pos = self.pos
+ rooted = self.skip_string('::')
+ self.skip_ws()
+ if not self.skip_word_and_ws('delete'):
+ self.pos = pos
+ else:
+ array = self.skip_string_and_ws('[')
+ if array and not self.skip_string_and_ws(']'):
+ self.fail("Expected ']' in array delete-expression.")
+ expr = self._parse_cast_expression()
+ return ASTDeleteExpr(rooted, array, expr)
+ return self._parse_postfix_expression()
+
+ def _parse_cast_expression(self) -> ASTExpression:
+ # -> unary | "(" type-id ")" cast
+ pos = self.pos
+ self.skip_ws()
+ if self.skip_string('('):
+ try:
+ typ = self._parse_type(False)
+ if not self.skip_string(')'):
+ self.fail("Expected ')' in cast expression.")
+ expr = self._parse_cast_expression()
+ return ASTCastExpr(typ, expr)
+ except DefinitionError as exCast:
+ self.pos = pos
+ try:
+ return self._parse_unary_expression()
+ except DefinitionError as exUnary:
+ errs = []
+ errs.append((exCast, "If type cast expression"))
+ errs.append((exUnary, "If unary expression"))
+ raise self._make_multi_error(errs,
+ "Error in cast expression.") from exUnary
+ else:
+ return self._parse_unary_expression()
+
+ def _parse_logical_or_expression(self, inTemplate: bool) -> ASTExpression:
+ # logical-or = logical-and ||
+ # logical-and = inclusive-or &&
+ # inclusive-or = exclusive-or |
+ # exclusive-or = and ^
+ # and = equality &
+ # equality = relational ==, !=
+ # relational = shift <, >, <=, >=, <=>
+ # shift = additive <<, >>
+ # additive = multiplicative +, -
+ # multiplicative = pm *, /, %
+ # pm = cast .*, ->*
+ def _parse_bin_op_expr(self: DefinitionParser,
+ opId: int, inTemplate: bool) -> ASTExpression:
+ if opId + 1 == len(_expression_bin_ops):
+ def parser(inTemplate: bool) -> ASTExpression:
+ return self._parse_cast_expression()
+ else:
+ def parser(inTemplate: bool) -> ASTExpression:
+ return _parse_bin_op_expr(self, opId + 1, inTemplate=inTemplate)
+ exprs = []
+ ops = []
+ exprs.append(parser(inTemplate=inTemplate))
+ while True:
+ self.skip_ws()
+ if inTemplate and self.current_char == '>':
+ break
+ pos = self.pos
+ oneMore = False
+ for op in _expression_bin_ops[opId]:
+ if op[0] in 'abcnox':
+ if not self.skip_word(op):
+ continue
+ else:
+ if not self.skip_string(op):
+ continue
+ if op == '&' and self.current_char == '&':
+ # don't split the && 'token'
+ self.pos -= 1
+ # and btw. && has lower precedence, so we are done
+ break
+ try:
+ expr = parser(inTemplate=inTemplate)
+ exprs.append(expr)
+ ops.append(op)
+ oneMore = True
+ break
+ except DefinitionError:
+ self.pos = pos
+ if not oneMore:
+ break
+ return ASTBinOpExpr(exprs, ops)
+ return _parse_bin_op_expr(self, 0, inTemplate=inTemplate)
+
+ def _parse_conditional_expression_tail(self, orExprHead: ASTExpression,
+ inTemplate: bool) -> ASTConditionalExpr | None:
+ # Consumes the orExprHead on success.
+
+ # -> "?" expression ":" assignment-expression
+ self.skip_ws()
+ if not self.skip_string("?"):
+ return None
+ thenExpr = self._parse_expression()
+ self.skip_ws()
+ if not self.skip_string(":"):
+ self.fail('Expected ":" after then-expression in conditional expression.')
+ elseExpr = self._parse_assignment_expression(inTemplate)
+ return ASTConditionalExpr(orExprHead, thenExpr, elseExpr)
+
+ def _parse_assignment_expression(self, inTemplate: bool) -> ASTExpression:
+ # -> conditional-expression
+ # | logical-or-expression assignment-operator initializer-clause
+ # | yield-expression -> "co_yield" assignment-expression
+ # | "co_yield" braced-init-list
+ # | throw-expression -> "throw" assignment-expression[opt]
+ # TODO: yield-expression
+ # TODO: throw-expression
+
+ # Now we have (after expanding conditional-expression:
+ # logical-or-expression
+ # | logical-or-expression "?" expression ":" assignment-expression
+ # | logical-or-expression assignment-operator initializer-clause
+ leftExpr = self._parse_logical_or_expression(inTemplate=inTemplate)
+ # the ternary operator
+ condExpr = self._parse_conditional_expression_tail(leftExpr, inTemplate)
+ if condExpr is not None:
+ return condExpr
+ # and actual assignment
+ for op in _expression_assignment_ops:
+ if op[0] in 'anox':
+ if not self.skip_word(op):
+ continue
+ else:
+ if not self.skip_string(op):
+ continue
+ rightExpr = self._parse_initializer_clause()
+ return ASTAssignmentExpr(leftExpr, op, rightExpr)
+ # just a logical-or-expression
+ return leftExpr
+
+ def _parse_constant_expression(self, inTemplate: bool) -> ASTExpression:
+ # -> conditional-expression ->
+ # logical-or-expression
+ # | logical-or-expression "?" expression ":" assignment-expression
+ orExpr = self._parse_logical_or_expression(inTemplate=inTemplate)
+ condExpr = self._parse_conditional_expression_tail(orExpr, inTemplate)
+ if condExpr is not None:
+ return condExpr
+ return orExpr
+
+ def _parse_expression(self) -> ASTExpression:
+ # -> assignment-expression
+ # | expression "," assignment-expression
+ exprs = [self._parse_assignment_expression(inTemplate=False)]
+ while True:
+ self.skip_ws()
+ if not self.skip_string(','):
+ break
+ exprs.append(self._parse_assignment_expression(inTemplate=False))
+ if len(exprs) == 1:
+ return exprs[0]
+ else:
+ return ASTCommaExpr(exprs)
+
+ def _parse_expression_fallback(self, end: list[str],
+ parser: Callable[[], ASTExpression],
+ allow: bool = True) -> ASTExpression:
+ # Stupidly "parse" an expression.
+ # 'end' should be a list of characters which ends the expression.
+
+ # first try to use the provided parser
+ prevPos = self.pos
+ try:
+ return parser()
+ except DefinitionError as e:
+ # some places (e.g., template parameters) we really don't want to use fallback,
+ # and for testing we may want to globally disable it
+ if not allow or not self.allowFallbackExpressionParsing:
+ raise
+ self.warn("Parsing of expression failed. Using fallback parser."
+ " Error was:\n%s" % e)
+ self.pos = prevPos
+ # and then the fallback scanning
+ assert end is not None
+ self.skip_ws()
+ startPos = self.pos
+ if self.match(_string_re):
+ value = self.matched_text
+ else:
+ # TODO: add handling of more bracket-like things, and quote handling
+ brackets = {'(': ')', '{': '}', '[': ']', '<': '>'}
+ symbols: list[str] = []
+ while not self.eof:
+ if (len(symbols) == 0 and self.current_char in end):
+ break
+ if self.current_char in brackets:
+ symbols.append(brackets[self.current_char])
+ elif len(symbols) > 0 and self.current_char == symbols[-1]:
+ symbols.pop()
+ self.pos += 1
+ if len(end) > 0 and self.eof:
+ self.fail("Could not find end of expression starting at %d."
+ % startPos)
+ value = self.definition[startPos:self.pos].strip()
+ return ASTFallbackExpr(value.strip())
+
+ # ==========================================================================
+
+ def _parse_operator(self) -> ASTOperator:
+ self.skip_ws()
+ # adapted from the old code
+ # yay, a regular operator definition
+ if self.match(_operator_re):
+ return ASTOperatorBuildIn(self.matched_text)
+
+ # new/delete operator?
+ for op in 'new', 'delete':
+ if not self.skip_word(op):
+ continue
+ self.skip_ws()
+ if self.skip_string('['):
+ self.skip_ws()
+ if not self.skip_string(']'):
+ self.fail('Expected "]" after "operator ' + op + '["')
+ op += '[]'
+ return ASTOperatorBuildIn(op)
+
+ # user-defined literal?
+ if self.skip_string('""'):
+ self.skip_ws()
+ if not self.match(identifier_re):
+ self.fail("Expected user-defined literal suffix.")
+ identifier = ASTIdentifier(self.matched_text)
+ return ASTOperatorLiteral(identifier)
+
+ # oh well, looks like a cast operator definition.
+ # In that case, eat another type.
+ type = self._parse_type(named=False, outer="operatorCast")
+ return ASTOperatorType(type)
+
+ def _parse_template_argument_list(self) -> ASTTemplateArgs:
+ # template-argument-list: (but we include the < and > here
+ # template-argument ...[opt]
+ # template-argument-list, template-argument ...[opt]
+ # template-argument:
+ # constant-expression
+ # type-id
+ # id-expression
+ self.skip_ws()
+ if not self.skip_string_and_ws('<'):
+ return None
+ if self.skip_string('>'):
+ return ASTTemplateArgs([], False)
+ prevErrors = []
+ templateArgs: list[ASTType | ASTTemplateArgConstant] = []
+ packExpansion = False
+ while 1:
+ pos = self.pos
+ parsedComma = False
+ parsedEnd = False
+ try:
+ type = self._parse_type(named=False)
+ self.skip_ws()
+ if self.skip_string_and_ws('...'):
+ packExpansion = True
+ parsedEnd = True
+ if not self.skip_string('>'):
+ self.fail('Expected ">" after "..." in template argument list.')
+ elif self.skip_string('>'):
+ parsedEnd = True
+ elif self.skip_string(','):
+ parsedComma = True
+ else:
+ self.fail('Expected "...>", ">" or "," in template argument list.')
+ templateArgs.append(type)
+ except DefinitionError as e:
+ prevErrors.append((e, "If type argument"))
+ self.pos = pos
+ try:
+ value = self._parse_constant_expression(inTemplate=True)
+ self.skip_ws()
+ if self.skip_string_and_ws('...'):
+ packExpansion = True
+ parsedEnd = True
+ if not self.skip_string('>'):
+ self.fail('Expected ">" after "..." in template argument list.')
+ elif self.skip_string('>'):
+ parsedEnd = True
+ elif self.skip_string(','):
+ parsedComma = True
+ else:
+ self.fail('Expected "...>", ">" or "," in template argument list.')
+ templateArgs.append(ASTTemplateArgConstant(value))
+ except DefinitionError as e:
+ self.pos = pos
+ prevErrors.append((e, "If non-type argument"))
+ header = "Error in parsing template argument list."
+ raise self._make_multi_error(prevErrors, header) from e
+ if parsedEnd:
+ assert not parsedComma
+ break
+ assert not packExpansion
+ return ASTTemplateArgs(templateArgs, packExpansion)
+
+ def _parse_nested_name(self, memberPointer: bool = False) -> ASTNestedName:
+ names: list[ASTNestedNameElement] = []
+ templates: list[bool] = []
+
+ self.skip_ws()
+ rooted = False
+ if self.skip_string('::'):
+ rooted = True
+ while 1:
+ self.skip_ws()
+ if len(names) > 0:
+ template = self.skip_word_and_ws('template')
+ else:
+ template = False
+ templates.append(template)
+ identOrOp: ASTIdentifier | ASTOperator = None
+ if self.skip_word_and_ws('operator'):
+ identOrOp = self._parse_operator()
+ else:
+ if not self.match(identifier_re):
+ if memberPointer and len(names) > 0:
+ templates.pop()
+ break
+ self.fail("Expected identifier in nested name.")
+ identifier = self.matched_text
+ # make sure there isn't a keyword
+ if identifier in _keywords:
+ self.fail("Expected identifier in nested name, "
+ "got keyword: %s" % identifier)
+ identOrOp = ASTIdentifier(identifier)
+ # try greedily to get template arguments,
+ # but otherwise a < might be because we are in an expression
+ pos = self.pos
+ try:
+ templateArgs = self._parse_template_argument_list()
+ except DefinitionError as ex:
+ self.pos = pos
+ templateArgs = None
+ self.otherErrors.append(ex)
+ names.append(ASTNestedNameElement(identOrOp, templateArgs))
+
+ self.skip_ws()
+ if not self.skip_string('::'):
+ if memberPointer:
+ self.fail("Expected '::' in pointer to member (function).")
+ break
+ return ASTNestedName(names, templates, rooted)
+
+ # ==========================================================================
+
+ def _parse_simple_type_specifiers(self) -> ASTTrailingTypeSpecFundamental:
+ modifier: str | None = None
+ signedness: str | None = None
+ width: list[str] = []
+ typ: str | None = None
+ names: list[str] = [] # the parsed sequence
+
+ self.skip_ws()
+ while self.match(_simple_type_specifiers_re):
+ t = self.matched_text
+ names.append(t)
+ if t in ('auto', 'void', 'bool',
+ 'char', 'wchar_t', 'char8_t', 'char16_t', 'char32_t',
+ 'int', '__int64', '__int128',
+ 'float', 'double',
+ '__float80', '_Float64x', '__float128', '_Float128'):
+ if typ is not None:
+ self.fail(f"Can not have both {t} and {typ}.")
+ typ = t
+ elif t in ('signed', 'unsigned'):
+ if signedness is not None:
+ self.fail(f"Can not have both {t} and {signedness}.")
+ signedness = t
+ elif t == 'short':
+ if len(width) != 0:
+ self.fail(f"Can not have both {t} and {width[0]}.")
+ width.append(t)
+ elif t == 'long':
+ if len(width) != 0 and width[0] != 'long':
+ self.fail(f"Can not have both {t} and {width[0]}.")
+ width.append(t)
+ elif t in ('_Imaginary', '_Complex'):
+ if modifier is not None:
+ self.fail(f"Can not have both {t} and {modifier}.")
+ modifier = t
+ self.skip_ws()
+ if len(names) == 0:
+ return None
+
+ if typ in ('auto', 'void', 'bool',
+ 'wchar_t', 'char8_t', 'char16_t', 'char32_t',
+ '__float80', '_Float64x', '__float128', '_Float128'):
+ if modifier is not None:
+ self.fail(f"Can not have both {typ} and {modifier}.")
+ if signedness is not None:
+ self.fail(f"Can not have both {typ} and {signedness}.")
+ if len(width) != 0:
+ self.fail(f"Can not have both {typ} and {' '.join(width)}.")
+ elif typ == 'char':
+ if modifier is not None:
+ self.fail(f"Can not have both {typ} and {modifier}.")
+ if len(width) != 0:
+ self.fail(f"Can not have both {typ} and {' '.join(width)}.")
+ elif typ == 'int':
+ if modifier is not None:
+ self.fail(f"Can not have both {typ} and {modifier}.")
+ elif typ in ('__int64', '__int128'):
+ if modifier is not None:
+ self.fail(f"Can not have both {typ} and {modifier}.")
+ if len(width) != 0:
+ self.fail(f"Can not have both {typ} and {' '.join(width)}.")
+ elif typ == 'float':
+ if signedness is not None:
+ self.fail(f"Can not have both {typ} and {signedness}.")
+ if len(width) != 0:
+ self.fail(f"Can not have both {typ} and {' '.join(width)}.")
+ elif typ == 'double':
+ if signedness is not None:
+ self.fail(f"Can not have both {typ} and {signedness}.")
+ if len(width) > 1:
+ self.fail(f"Can not have both {typ} and {' '.join(width)}.")
+ if len(width) == 1 and width[0] != 'long':
+ self.fail(f"Can not have both {typ} and {' '.join(width)}.")
+ elif typ is None:
+ if modifier is not None:
+ self.fail(f"Can not have {modifier} without a floating point type.")
+ else:
+ msg = f'Unhandled type {typ}'
+ raise AssertionError(msg)
+
+ canonNames: list[str] = []
+ if modifier is not None:
+ canonNames.append(modifier)
+ if signedness is not None:
+ canonNames.append(signedness)
+ canonNames.extend(width)
+ if typ is not None:
+ canonNames.append(typ)
+ return ASTTrailingTypeSpecFundamental(names, canonNames)
+
+ def _parse_trailing_type_spec(self) -> ASTTrailingTypeSpec:
+ # fundamental types, https://en.cppreference.com/w/cpp/language/type
+ # and extensions
+ self.skip_ws()
+ res = self._parse_simple_type_specifiers()
+ if res is not None:
+ return res
+
+ # decltype
+ self.skip_ws()
+ if self.skip_word_and_ws('decltype'):
+ if not self.skip_string_and_ws('('):
+ self.fail("Expected '(' after 'decltype'.")
+ if self.skip_word_and_ws('auto'):
+ if not self.skip_string(')'):
+ self.fail("Expected ')' after 'decltype(auto'.")
+ return ASTTrailingTypeSpecDecltypeAuto()
+ expr = self._parse_expression()
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expected ')' after 'decltype(<expr>'.")
+ return ASTTrailingTypeSpecDecltype(expr)
+
+ # prefixed
+ prefix = None
+ self.skip_ws()
+ for k in ('class', 'struct', 'enum', 'union', 'typename'):
+ if self.skip_word_and_ws(k):
+ prefix = k
+ break
+ nestedName = self._parse_nested_name()
+ self.skip_ws()
+ placeholderType = None
+ if self.skip_word('auto'):
+ placeholderType = 'auto'
+ elif self.skip_word_and_ws('decltype'):
+ if not self.skip_string_and_ws('('):
+ self.fail("Expected '(' after 'decltype' in placeholder type specifier.")
+ if not self.skip_word_and_ws('auto'):
+ self.fail("Expected 'auto' after 'decltype(' in placeholder type specifier.")
+ if not self.skip_string_and_ws(')'):
+ self.fail("Expected ')' after 'decltype(auto' in placeholder type specifier.")
+ placeholderType = 'decltype(auto)'
+ return ASTTrailingTypeSpecName(prefix, nestedName, placeholderType)
+
+ def _parse_parameters_and_qualifiers(self, paramMode: str) -> ASTParametersQualifiers:
+ if paramMode == 'new':
+ return None
+ self.skip_ws()
+ if not self.skip_string('('):
+ if paramMode == 'function':
+ self.fail('Expecting "(" in parameters-and-qualifiers.')
+ else:
+ return None
+ args = []
+ self.skip_ws()
+ if not self.skip_string(')'):
+ while 1:
+ self.skip_ws()
+ if self.skip_string('...'):
+ args.append(ASTFunctionParameter(None, True))
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail('Expected ")" after "..." in '
+ 'parameters-and-qualifiers.')
+ break
+ # note: it seems that function arguments can always be named,
+ # even in function pointers and similar.
+ arg = self._parse_type_with_init(outer=None, named='single')
+ # TODO: parse default parameters # TODO: didn't we just do that?
+ args.append(ASTFunctionParameter(arg))
+
+ self.skip_ws()
+ if self.skip_string(','):
+ continue
+ if self.skip_string(')'):
+ break
+ self.fail('Expecting "," or ")" in parameters-and-qualifiers, '
+ f'got "{self.current_char}".')
+
+ self.skip_ws()
+ const = self.skip_word_and_ws('const')
+ volatile = self.skip_word_and_ws('volatile')
+ if not const: # the can be permuted
+ const = self.skip_word_and_ws('const')
+
+ refQual = None
+ if self.skip_string('&&'):
+ refQual = '&&'
+ if not refQual and self.skip_string('&'):
+ refQual = '&'
+
+ exceptionSpec = None
+ self.skip_ws()
+ if self.skip_string('noexcept'):
+ if self.skip_string_and_ws('('):
+ expr = self._parse_constant_expression(False)
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expecting ')' to end 'noexcept'.")
+ exceptionSpec = ASTNoexceptSpec(expr)
+ else:
+ exceptionSpec = ASTNoexceptSpec(None)
+
+ self.skip_ws()
+ if self.skip_string('->'):
+ trailingReturn = self._parse_type(named=False)
+ else:
+ trailingReturn = None
+
+ self.skip_ws()
+ override = self.skip_word_and_ws('override')
+ final = self.skip_word_and_ws('final')
+ if not override:
+ override = self.skip_word_and_ws(
+ 'override') # they can be permuted
+
+ attrs = self._parse_attribute_list()
+
+ self.skip_ws()
+ initializer = None
+ # if this is a function pointer we should not swallow an initializer
+ if paramMode == 'function' and self.skip_string('='):
+ self.skip_ws()
+ valid = ('0', 'delete', 'default')
+ for w in valid:
+ if self.skip_word_and_ws(w):
+ initializer = w
+ break
+ if not initializer:
+ self.fail(
+ 'Expected "%s" in initializer-specifier.'
+ % '" or "'.join(valid))
+
+ return ASTParametersQualifiers(
+ args, volatile, const, refQual, exceptionSpec, trailingReturn,
+ override, final, attrs, initializer)
+
+ def _parse_decl_specs_simple(self, outer: str, typed: bool) -> ASTDeclSpecsSimple:
+ """Just parse the simple ones."""
+ storage = None
+ threadLocal = None
+ inline = None
+ virtual = None
+ explicitSpec = None
+ consteval = None
+ constexpr = None
+ constinit = None
+ volatile = None
+ const = None
+ friend = None
+ attrs = []
+ while 1: # accept any permutation of a subset of some decl-specs
+ self.skip_ws()
+ if not const and typed:
+ const = self.skip_word('const')
+ if const:
+ continue
+ if not volatile and typed:
+ volatile = self.skip_word('volatile')
+ if volatile:
+ continue
+ if not storage:
+ if outer in ('member', 'function'):
+ if self.skip_word('static'):
+ storage = 'static'
+ continue
+ if self.skip_word('extern'):
+ storage = 'extern'
+ continue
+ if outer == 'member':
+ if self.skip_word('mutable'):
+ storage = 'mutable'
+ continue
+ if self.skip_word('register'):
+ storage = 'register'
+ continue
+ if not inline and outer in ('function', 'member'):
+ inline = self.skip_word('inline')
+ if inline:
+ continue
+ if not constexpr and outer in ('member', 'function'):
+ constexpr = self.skip_word("constexpr")
+ if constexpr:
+ continue
+
+ if outer == 'member':
+ if not constinit:
+ constinit = self.skip_word('constinit')
+ if constinit:
+ continue
+ if not threadLocal:
+ threadLocal = self.skip_word('thread_local')
+ if threadLocal:
+ continue
+ if outer == 'function':
+ if not consteval:
+ consteval = self.skip_word('consteval')
+ if consteval:
+ continue
+ if not friend:
+ friend = self.skip_word('friend')
+ if friend:
+ continue
+ if not virtual:
+ virtual = self.skip_word('virtual')
+ if virtual:
+ continue
+ if not explicitSpec:
+ explicit = self.skip_word_and_ws('explicit')
+ if explicit:
+ expr: ASTExpression = None
+ if self.skip_string('('):
+ expr = self._parse_constant_expression(inTemplate=False)
+ if not expr:
+ self.fail("Expected constant expression after '('" +
+ " in explicit specifier.")
+ self.skip_ws()
+ if not self.skip_string(')'):
+ self.fail("Expected ')' to end explicit specifier.")
+ explicitSpec = ASTExplicitSpec(expr)
+ continue
+ attr = self._parse_attribute()
+ if attr:
+ attrs.append(attr)
+ continue
+ break
+ return ASTDeclSpecsSimple(storage, threadLocal, inline, virtual,
+ explicitSpec, consteval, constexpr, constinit,
+ volatile, const, friend, ASTAttributeList(attrs))
+
+ def _parse_decl_specs(self, outer: str, typed: bool = True) -> ASTDeclSpecs:
+ if outer:
+ if outer not in ('type', 'member', 'function', 'templateParam'):
+ raise Exception('Internal error, unknown outer "%s".' % outer)
+ """
+ storage-class-specifier function-specifier "constexpr"
+ "volatile" "const" trailing-type-specifier
+
+ storage-class-specifier ->
+ "static" (only for member_object and function_object)
+ | "register"
+
+ function-specifier -> "inline" | "virtual" | "explicit" (only for
+ function_object)
+
+ "constexpr" (only for member_object and function_object)
+ """
+ leftSpecs = self._parse_decl_specs_simple(outer, typed)
+ rightSpecs = None
+
+ if typed:
+ trailing = self._parse_trailing_type_spec()
+ rightSpecs = self._parse_decl_specs_simple(outer, typed)
+ else:
+ trailing = None
+ return ASTDeclSpecs(outer, leftSpecs, rightSpecs, trailing)
+
+ def _parse_declarator_name_suffix(
+ self, named: bool | str, paramMode: str, typed: bool,
+ ) -> ASTDeclaratorNameParamQual | ASTDeclaratorNameBitField:
+ # now we should parse the name, and then suffixes
+ if named == 'maybe':
+ pos = self.pos
+ try:
+ declId = self._parse_nested_name()
+ except DefinitionError:
+ self.pos = pos
+ declId = None
+ elif named == 'single':
+ if self.match(identifier_re):
+ identifier = ASTIdentifier(self.matched_text)
+ nne = ASTNestedNameElement(identifier, None)
+ declId = ASTNestedName([nne], [False], rooted=False)
+ # if it's a member pointer, we may have '::', which should be an error
+ self.skip_ws()
+ if self.current_char == ':':
+ self.fail("Unexpected ':' after identifier.")
+ else:
+ declId = None
+ elif named:
+ declId = self._parse_nested_name()
+ else:
+ declId = None
+ arrayOps = []
+ while 1:
+ self.skip_ws()
+ if typed and self.skip_string('['):
+ self.skip_ws()
+ if self.skip_string(']'):
+ arrayOps.append(ASTArray(None))
+ continue
+
+ def parser() -> ASTExpression:
+ return self._parse_expression()
+ value = self._parse_expression_fallback([']'], parser)
+ if not self.skip_string(']'):
+ self.fail("Expected ']' in end of array operator.")
+ arrayOps.append(ASTArray(value))
+ continue
+ break
+ paramQual = self._parse_parameters_and_qualifiers(paramMode)
+ if paramQual is None and len(arrayOps) == 0:
+ # perhaps a bit-field
+ if named and paramMode == 'type' and typed:
+ self.skip_ws()
+ if self.skip_string(':'):
+ size = self._parse_constant_expression(inTemplate=False)
+ return ASTDeclaratorNameBitField(declId=declId, size=size)
+ return ASTDeclaratorNameParamQual(declId=declId, arrayOps=arrayOps,
+ paramQual=paramQual)
+
+ def _parse_declarator(self, named: bool | str, paramMode: str,
+ typed: bool = True,
+ ) -> ASTDeclarator:
+ # 'typed' here means 'parse return type stuff'
+ if paramMode not in ('type', 'function', 'operatorCast', 'new'):
+ raise Exception(
+ "Internal error, unknown paramMode '%s'." % paramMode)
+ prevErrors = []
+ self.skip_ws()
+ if typed and self.skip_string('*'):
+ self.skip_ws()
+ volatile = False
+ const = False
+ attrList = []
+ while 1:
+ if not volatile:
+ volatile = self.skip_word_and_ws('volatile')
+ if volatile:
+ continue
+ if not const:
+ const = self.skip_word_and_ws('const')
+ if const:
+ continue
+ attr = self._parse_attribute()
+ if attr is not None:
+ attrList.append(attr)
+ continue
+ break
+ next = self._parse_declarator(named, paramMode, typed)
+ return ASTDeclaratorPtr(next=next, volatile=volatile, const=const,
+ attrs=ASTAttributeList(attrList))
+ # TODO: shouldn't we parse an R-value ref here first?
+ if typed and self.skip_string("&"):
+ attrs = self._parse_attribute_list()
+ next = self._parse_declarator(named, paramMode, typed)
+ return ASTDeclaratorRef(next=next, attrs=attrs)
+ if typed and self.skip_string("..."):
+ next = self._parse_declarator(named, paramMode, False)
+ return ASTDeclaratorParamPack(next=next)
+ if typed and self.current_char == '(': # note: peeking, not skipping
+ if paramMode == "operatorCast":
+ # TODO: we should be able to parse cast operators which return
+ # function pointers. For now, just hax it and ignore.
+ return ASTDeclaratorNameParamQual(declId=None, arrayOps=[],
+ paramQual=None)
+ # maybe this is the beginning of params and quals,try that first,
+ # otherwise assume it's noptr->declarator > ( ptr-declarator )
+ pos = self.pos
+ try:
+ # assume this is params and quals
+ res = self._parse_declarator_name_suffix(named, paramMode,
+ typed)
+ return res
+ except DefinitionError as exParamQual:
+ prevErrors.append((exParamQual,
+ "If declarator-id with parameters-and-qualifiers"))
+ self.pos = pos
+ try:
+ assert self.current_char == '('
+ self.skip_string('(')
+ # TODO: hmm, if there is a name, it must be in inner, right?
+ # TODO: hmm, if there must be parameters, they must be
+ # inside, right?
+ inner = self._parse_declarator(named, paramMode, typed)
+ if not self.skip_string(')'):
+ self.fail("Expected ')' in \"( ptr-declarator )\"")
+ next = self._parse_declarator(named=False,
+ paramMode="type",
+ typed=typed)
+ return ASTDeclaratorParen(inner=inner, next=next)
+ except DefinitionError as exNoPtrParen:
+ self.pos = pos
+ prevErrors.append((exNoPtrParen, "If parenthesis in noptr-declarator"))
+ header = "Error in declarator"
+ raise self._make_multi_error(prevErrors, header) from exNoPtrParen
+ if typed: # pointer to member
+ pos = self.pos
+ try:
+ name = self._parse_nested_name(memberPointer=True)
+ self.skip_ws()
+ if not self.skip_string('*'):
+ self.fail("Expected '*' in pointer to member declarator.")
+ self.skip_ws()
+ except DefinitionError as e:
+ self.pos = pos
+ prevErrors.append((e, "If pointer to member declarator"))
+ else:
+ volatile = False
+ const = False
+ while 1:
+ if not volatile:
+ volatile = self.skip_word_and_ws('volatile')
+ if volatile:
+ continue
+ if not const:
+ const = self.skip_word_and_ws('const')
+ if const:
+ continue
+ break
+ next = self._parse_declarator(named, paramMode, typed)
+ return ASTDeclaratorMemPtr(name, const, volatile, next=next)
+ pos = self.pos
+ try:
+ res = self._parse_declarator_name_suffix(named, paramMode, typed)
+ # this is a heuristic for error messages, for when there is a < after a
+ # nested name, but it was not a successful template argument list
+ if self.current_char == '<':
+ self.otherErrors.append(self._make_multi_error(prevErrors, ""))
+ return res
+ except DefinitionError as e:
+ self.pos = pos
+ prevErrors.append((e, "If declarator-id"))
+ header = "Error in declarator or parameters-and-qualifiers"
+ raise self._make_multi_error(prevErrors, header) from e
+
+ def _parse_initializer(self, outer: str | None = None, allowFallback: bool = True,
+ ) -> ASTInitializer:
+ # initializer # global vars
+ # -> brace-or-equal-initializer
+ # | '(' expression-list ')'
+ #
+ # brace-or-equal-initializer # member vars
+ # -> '=' initializer-clause
+ # | braced-init-list
+ #
+ # initializer-clause # function params, non-type template params (with '=' in front)
+ # -> assignment-expression
+ # | braced-init-list
+ #
+ # we don't distinguish between global and member vars, so disallow paren:
+ #
+ # -> braced-init-list # var only
+ # | '=' assignment-expression
+ # | '=' braced-init-list
+ self.skip_ws()
+ if outer == 'member':
+ bracedInit = self._parse_braced_init_list()
+ if bracedInit is not None:
+ return ASTInitializer(bracedInit, hasAssign=False)
+
+ if not self.skip_string('='):
+ return None
+
+ bracedInit = self._parse_braced_init_list()
+ if bracedInit is not None:
+ return ASTInitializer(bracedInit)
+
+ if outer == 'member':
+ fallbackEnd: list[str] = []
+ elif outer == 'templateParam':
+ fallbackEnd = [',', '>']
+ elif outer is None: # function parameter
+ fallbackEnd = [',', ')']
+ else:
+ self.fail("Internal error, initializer for outer '%s' not "
+ "implemented." % outer)
+
+ inTemplate = outer == 'templateParam'
+
+ def parser() -> ASTExpression:
+ return self._parse_assignment_expression(inTemplate=inTemplate)
+ value = self._parse_expression_fallback(fallbackEnd, parser, allow=allowFallback)
+ return ASTInitializer(value)
+
+ def _parse_type(self, named: bool | str, outer: str | None = None) -> ASTType:
+ """
+ named=False|'maybe'|True: 'maybe' is e.g., for function objects which
+ doesn't need to name the arguments
+
+ outer == operatorCast: annoying case, we should not take the params
+ """
+ if outer: # always named
+ if outer not in ('type', 'member', 'function',
+ 'operatorCast', 'templateParam'):
+ raise Exception('Internal error, unknown outer "%s".' % outer)
+ if outer != 'operatorCast':
+ assert named
+ if outer in ('type', 'function'):
+ # We allow type objects to just be a name.
+ # Some functions don't have normal return types: constructors,
+ # destructors, cast operators
+ prevErrors = []
+ startPos = self.pos
+ # first try without the type
+ try:
+ declSpecs = self._parse_decl_specs(outer=outer, typed=False)
+ decl = self._parse_declarator(named=True, paramMode=outer,
+ typed=False)
+ mustEnd = True
+ if outer == 'function':
+ # Allow trailing requires on functions.
+ self.skip_ws()
+ if re.compile(r'requires\b').match(self.definition, self.pos):
+ mustEnd = False
+ if mustEnd:
+ self.assert_end(allowSemicolon=True)
+ except DefinitionError as exUntyped:
+ if outer == 'type':
+ desc = "If just a name"
+ elif outer == 'function':
+ desc = "If the function has no return type"
+ else:
+ raise AssertionError from exUntyped
+ prevErrors.append((exUntyped, desc))
+ self.pos = startPos
+ try:
+ declSpecs = self._parse_decl_specs(outer=outer)
+ decl = self._parse_declarator(named=True, paramMode=outer)
+ except DefinitionError as exTyped:
+ self.pos = startPos
+ if outer == 'type':
+ desc = "If typedef-like declaration"
+ elif outer == 'function':
+ desc = "If the function has a return type"
+ else:
+ raise AssertionError from exUntyped
+ prevErrors.append((exTyped, desc))
+ # Retain the else branch for easier debugging.
+ # TODO: it would be nice to save the previous stacktrace
+ # and output it here.
+ if True:
+ if outer == 'type':
+ header = "Type must be either just a name or a "
+ header += "typedef-like declaration."
+ elif outer == 'function':
+ header = "Error when parsing function declaration."
+ else:
+ raise AssertionError from exUntyped
+ raise self._make_multi_error(prevErrors, header) from exTyped
+ else: # NoQA: RET506
+ # For testing purposes.
+ # do it again to get the proper traceback (how do you
+ # reliably save a traceback when an exception is
+ # constructed?)
+ self.pos = startPos
+ typed = True
+ declSpecs = self._parse_decl_specs(outer=outer, typed=typed)
+ decl = self._parse_declarator(named=True, paramMode=outer,
+ typed=typed)
+ else:
+ paramMode = 'type'
+ if outer == 'member':
+ named = True
+ elif outer == 'operatorCast':
+ paramMode = 'operatorCast'
+ outer = None
+ elif outer == 'templateParam':
+ named = 'single'
+ declSpecs = self._parse_decl_specs(outer=outer)
+ decl = self._parse_declarator(named=named, paramMode=paramMode)
+ return ASTType(declSpecs, decl)
+
+ def _parse_type_with_init(
+ self, named: bool | str,
+ outer: str) -> ASTTypeWithInit | ASTTemplateParamConstrainedTypeWithInit:
+ if outer:
+ assert outer in ('type', 'member', 'function', 'templateParam')
+ type = self._parse_type(outer=outer, named=named)
+ if outer != 'templateParam':
+ init = self._parse_initializer(outer=outer)
+ return ASTTypeWithInit(type, init)
+ # it could also be a constrained type parameter, e.g., C T = int&
+ pos = self.pos
+ eExpr = None
+ try:
+ init = self._parse_initializer(outer=outer, allowFallback=False)
+ # note: init may be None if there is no =
+ if init is None:
+ return ASTTypeWithInit(type, None)
+ # we parsed an expression, so we must have a , or a >,
+ # otherwise the expression didn't get everything
+ self.skip_ws()
+ if self.current_char != ',' and self.current_char != '>':
+ # pretend it didn't happen
+ self.pos = pos
+ init = None
+ else:
+ # we assume that it was indeed an expression
+ return ASTTypeWithInit(type, init)
+ except DefinitionError as e:
+ self.pos = pos
+ eExpr = e
+ if not self.skip_string("="):
+ return ASTTypeWithInit(type, None)
+ try:
+ typeInit = self._parse_type(named=False, outer=None)
+ return ASTTemplateParamConstrainedTypeWithInit(type, typeInit)
+ except DefinitionError as eType:
+ if eExpr is None:
+ raise
+ errs = []
+ errs.append((eExpr, "If default template argument is an expression"))
+ errs.append((eType, "If default template argument is a type"))
+ msg = "Error in non-type template parameter"
+ msg += " or constrained template parameter."
+ raise self._make_multi_error(errs, msg) from eType
+
+ def _parse_type_using(self) -> ASTTypeUsing:
+ name = self._parse_nested_name()
+ self.skip_ws()
+ if not self.skip_string('='):
+ return ASTTypeUsing(name, None)
+ type = self._parse_type(False, None)
+ return ASTTypeUsing(name, type)
+
+ def _parse_concept(self) -> ASTConcept:
+ nestedName = self._parse_nested_name()
+ self.skip_ws()
+ initializer = self._parse_initializer('member')
+ return ASTConcept(nestedName, initializer)
+
+ def _parse_class(self) -> ASTClass:
+ attrs = self._parse_attribute_list()
+ name = self._parse_nested_name()
+ self.skip_ws()
+ final = self.skip_word_and_ws('final')
+ bases = []
+ self.skip_ws()
+ if self.skip_string(':'):
+ while 1:
+ self.skip_ws()
+ visibility = None
+ virtual = False
+ pack = False
+ if self.skip_word_and_ws('virtual'):
+ virtual = True
+ if self.match(_visibility_re):
+ visibility = self.matched_text
+ self.skip_ws()
+ if not virtual and self.skip_word_and_ws('virtual'):
+ virtual = True
+ baseName = self._parse_nested_name()
+ self.skip_ws()
+ pack = self.skip_string('...')
+ bases.append(ASTBaseClass(baseName, visibility, virtual, pack))
+ self.skip_ws()
+ if self.skip_string(','):
+ continue
+ break
+ return ASTClass(name, final, bases, attrs)
+
+ def _parse_union(self) -> ASTUnion:
+ attrs = self._parse_attribute_list()
+ name = self._parse_nested_name()
+ return ASTUnion(name, attrs)
+
+ def _parse_enum(self) -> ASTEnum:
+ scoped = None # is set by CPPEnumObject
+ attrs = self._parse_attribute_list()
+ name = self._parse_nested_name()
+ self.skip_ws()
+ underlyingType = None
+ if self.skip_string(':'):
+ underlyingType = self._parse_type(named=False)
+ return ASTEnum(name, scoped, underlyingType, attrs)
+
+ def _parse_enumerator(self) -> ASTEnumerator:
+ name = self._parse_nested_name()
+ attrs = self._parse_attribute_list()
+ self.skip_ws()
+ init = None
+ if self.skip_string('='):
+ self.skip_ws()
+
+ def parser() -> ASTExpression:
+ return self._parse_constant_expression(inTemplate=False)
+ initVal = self._parse_expression_fallback([], parser)
+ init = ASTInitializer(initVal)
+ return ASTEnumerator(name, init, attrs)
+
+ # ==========================================================================
+
+ def _parse_template_parameter(self) -> ASTTemplateParam:
+ self.skip_ws()
+ if self.skip_word('template'):
+ # declare a template template parameter
+ nestedParams = self._parse_template_parameter_list()
+ else:
+ nestedParams = None
+
+ pos = self.pos
+ try:
+ # Unconstrained type parameter or template type parameter
+ key = None
+ self.skip_ws()
+ if self.skip_word_and_ws('typename'):
+ key = 'typename'
+ elif self.skip_word_and_ws('class'):
+ key = 'class'
+ elif nestedParams:
+ self.fail("Expected 'typename' or 'class' after "
+ "template template parameter list.")
+ else:
+ self.fail("Expected 'typename' or 'class' in the "
+ "beginning of template type parameter.")
+ self.skip_ws()
+ parameterPack = self.skip_string('...')
+ self.skip_ws()
+ if self.match(identifier_re):
+ identifier = ASTIdentifier(self.matched_text)
+ else:
+ identifier = None
+ self.skip_ws()
+ if not parameterPack and self.skip_string('='):
+ default = self._parse_type(named=False, outer=None)
+ else:
+ default = None
+ if self.current_char not in ',>':
+ self.fail('Expected "," or ">" after (template) type parameter.')
+ data = ASTTemplateKeyParamPackIdDefault(key, identifier,
+ parameterPack, default)
+ if nestedParams:
+ return ASTTemplateParamTemplateType(nestedParams, data)
+ else:
+ return ASTTemplateParamType(data)
+ except DefinitionError as eType:
+ if nestedParams:
+ raise
+ try:
+ # non-type parameter or constrained type parameter
+ self.pos = pos
+ param = self._parse_type_with_init('maybe', 'templateParam')
+ self.skip_ws()
+ parameterPack = self.skip_string('...')
+ return ASTTemplateParamNonType(param, parameterPack)
+ except DefinitionError as eNonType:
+ self.pos = pos
+ header = "Error when parsing template parameter."
+ errs = []
+ errs.append(
+ (eType, "If unconstrained type parameter or template type parameter"))
+ errs.append(
+ (eNonType, "If constrained type parameter or non-type parameter"))
+ raise self._make_multi_error(errs, header) from None
+
+ def _parse_template_parameter_list(self) -> ASTTemplateParams:
+ # only: '<' parameter-list '>'
+ # we assume that 'template' has just been parsed
+ templateParams: list[ASTTemplateParam] = []
+ self.skip_ws()
+ if not self.skip_string("<"):
+ self.fail("Expected '<' after 'template'")
+ while 1:
+ pos = self.pos
+ err = None
+ try:
+ param = self._parse_template_parameter()
+ templateParams.append(param)
+ except DefinitionError as eParam:
+ self.pos = pos
+ err = eParam
+ self.skip_ws()
+ if self.skip_string('>'):
+ requiresClause = self._parse_requires_clause()
+ return ASTTemplateParams(templateParams, requiresClause)
+ elif self.skip_string(','):
+ continue
+ else:
+ header = "Error in template parameter list."
+ errs = []
+ if err:
+ errs.append((err, "If parameter"))
+ try:
+ self.fail('Expected "," or ">".')
+ except DefinitionError as e:
+ errs.append((e, "If no parameter"))
+ logger.debug(errs)
+ raise self._make_multi_error(errs, header)
+
+ def _parse_template_introduction(self) -> ASTTemplateIntroduction:
+ pos = self.pos
+ try:
+ concept = self._parse_nested_name()
+ except Exception:
+ self.pos = pos
+ return None
+ self.skip_ws()
+ if not self.skip_string('{'):
+ self.pos = pos
+ return None
+
+ # for sure it must be a template introduction now
+ params = []
+ while 1:
+ self.skip_ws()
+ parameterPack = self.skip_string('...')
+ self.skip_ws()
+ if not self.match(identifier_re):
+ self.fail("Expected identifier in template introduction list.")
+ txt_identifier = self.matched_text
+ # make sure there isn't a keyword
+ if txt_identifier in _keywords:
+ self.fail("Expected identifier in template introduction list, "
+ "got keyword: %s" % txt_identifier)
+ identifier = ASTIdentifier(txt_identifier)
+ params.append(ASTTemplateIntroductionParameter(identifier, parameterPack))
+
+ self.skip_ws()
+ if self.skip_string('}'):
+ break
+ if self.skip_string(','):
+ continue
+ self.fail('Error in template introduction list. Expected ",", or "}".')
+ return ASTTemplateIntroduction(concept, params)
+
+ def _parse_requires_clause(self) -> ASTRequiresClause | None:
+ # requires-clause -> 'requires' constraint-logical-or-expression
+ # constraint-logical-or-expression
+ # -> constraint-logical-and-expression
+ # | constraint-logical-or-expression '||' constraint-logical-and-expression
+ # constraint-logical-and-expression
+ # -> primary-expression
+ # | constraint-logical-and-expression '&&' primary-expression
+ self.skip_ws()
+ if not self.skip_word('requires'):
+ return None
+
+ def parse_and_expr(self: DefinitionParser) -> ASTExpression:
+ andExprs = []
+ ops = []
+ andExprs.append(self._parse_primary_expression())
+ while True:
+ self.skip_ws()
+ oneMore = False
+ if self.skip_string('&&'):
+ oneMore = True
+ ops.append('&&')
+ elif self.skip_word('and'):
+ oneMore = True
+ ops.append('and')
+ if not oneMore:
+ break
+ andExprs.append(self._parse_primary_expression())
+ if len(andExprs) == 1:
+ return andExprs[0]
+ else:
+ return ASTBinOpExpr(andExprs, ops)
+
+ orExprs = []
+ ops = []
+ orExprs.append(parse_and_expr(self))
+ while True:
+ self.skip_ws()
+ oneMore = False
+ if self.skip_string('||'):
+ oneMore = True
+ ops.append('||')
+ elif self.skip_word('or'):
+ oneMore = True
+ ops.append('or')
+ if not oneMore:
+ break
+ orExprs.append(parse_and_expr(self))
+ if len(orExprs) == 1:
+ return ASTRequiresClause(orExprs[0])
+ else:
+ return ASTRequiresClause(ASTBinOpExpr(orExprs, ops))
+
+ def _parse_template_declaration_prefix(self, objectType: str,
+ ) -> ASTTemplateDeclarationPrefix | None:
+ templates: list[ASTTemplateParams | ASTTemplateIntroduction] = []
+ while 1:
+ self.skip_ws()
+ # the saved position is only used to provide a better error message
+ params: ASTTemplateParams | ASTTemplateIntroduction = None
+ pos = self.pos
+ if self.skip_word("template"):
+ try:
+ params = self._parse_template_parameter_list()
+ except DefinitionError as e:
+ if objectType == 'member' and len(templates) == 0:
+ return ASTTemplateDeclarationPrefix(None)
+ else:
+ raise e
+ if objectType == 'concept' and params.requiresClause is not None:
+ self.fail('requires-clause not allowed for concept')
+ else:
+ params = self._parse_template_introduction()
+ if not params:
+ break
+ if objectType == 'concept' and len(templates) > 0:
+ self.pos = pos
+ self.fail("More than 1 template parameter list for concept.")
+ templates.append(params)
+ if len(templates) == 0 and objectType == 'concept':
+ self.fail('Missing template parameter list for concept.')
+ if len(templates) == 0:
+ return None
+ else:
+ return ASTTemplateDeclarationPrefix(templates)
+
+ def _check_template_consistency(self, nestedName: ASTNestedName,
+ templatePrefix: ASTTemplateDeclarationPrefix,
+ fullSpecShorthand: bool, isMember: bool = False,
+ ) -> ASTTemplateDeclarationPrefix:
+ numArgs = nestedName.num_templates()
+ isMemberInstantiation = False
+ if not templatePrefix:
+ numParams = 0
+ else:
+ if isMember and templatePrefix.templates is None:
+ numParams = 0
+ isMemberInstantiation = True
+ else:
+ numParams = len(templatePrefix.templates)
+ if numArgs + 1 < numParams:
+ self.fail("Too few template argument lists comapred to parameter"
+ " lists. Argument lists: %d, Parameter lists: %d."
+ % (numArgs, numParams))
+ if numArgs > numParams:
+ numExtra = numArgs - numParams
+ if not fullSpecShorthand and not isMemberInstantiation:
+ msg = "Too many template argument lists compared to parameter" \
+ " lists. Argument lists: %d, Parameter lists: %d," \
+ " Extra empty parameters lists prepended: %d." \
+ % (numArgs, numParams, numExtra)
+ msg += " Declaration:\n\t"
+ if templatePrefix:
+ msg += "%s\n\t" % templatePrefix
+ msg += str(nestedName)
+ self.warn(msg)
+
+ newTemplates: list[ASTTemplateParams | ASTTemplateIntroduction] = []
+ for _i in range(numExtra):
+ newTemplates.append(ASTTemplateParams([], requiresClause=None))
+ if templatePrefix and not isMemberInstantiation:
+ newTemplates.extend(templatePrefix.templates)
+ templatePrefix = ASTTemplateDeclarationPrefix(newTemplates)
+ return templatePrefix
+
+ def parse_declaration(self, objectType: str, directiveType: str) -> ASTDeclaration:
+ if objectType not in ('class', 'union', 'function', 'member', 'type',
+ 'concept', 'enum', 'enumerator'):
+ raise Exception('Internal error, unknown objectType "%s".' % objectType)
+ if directiveType not in ('class', 'struct', 'union', 'function', 'member', 'var',
+ 'type', 'concept',
+ 'enum', 'enum-struct', 'enum-class', 'enumerator'):
+ raise Exception('Internal error, unknown directiveType "%s".' % directiveType)
+ visibility = None
+ templatePrefix = None
+ trailingRequiresClause = None
+ declaration: Any = None
+
+ self.skip_ws()
+ if self.match(_visibility_re):
+ visibility = self.matched_text
+
+ if objectType in ('type', 'concept', 'member', 'function', 'class', 'union'):
+ templatePrefix = self._parse_template_declaration_prefix(objectType)
+
+ if objectType == 'type':
+ prevErrors = []
+ pos = self.pos
+ try:
+ if not templatePrefix:
+ declaration = self._parse_type(named=True, outer='type')
+ except DefinitionError as e:
+ prevErrors.append((e, "If typedef-like declaration"))
+ self.pos = pos
+ pos = self.pos
+ try:
+ if not declaration:
+ declaration = self._parse_type_using()
+ except DefinitionError as e:
+ self.pos = pos
+ prevErrors.append((e, "If type alias or template alias"))
+ header = "Error in type declaration."
+ raise self._make_multi_error(prevErrors, header) from e
+ elif objectType == 'concept':
+ declaration = self._parse_concept()
+ elif objectType == 'member':
+ declaration = self._parse_type_with_init(named=True, outer='member')
+ elif objectType == 'function':
+ declaration = self._parse_type(named=True, outer='function')
+ trailingRequiresClause = self._parse_requires_clause()
+ elif objectType == 'class':
+ declaration = self._parse_class()
+ elif objectType == 'union':
+ declaration = self._parse_union()
+ elif objectType == 'enum':
+ declaration = self._parse_enum()
+ elif objectType == 'enumerator':
+ declaration = self._parse_enumerator()
+ else:
+ raise AssertionError
+ templatePrefix = self._check_template_consistency(declaration.name,
+ templatePrefix,
+ fullSpecShorthand=False,
+ isMember=objectType == 'member')
+ self.skip_ws()
+ semicolon = self.skip_string(';')
+ return ASTDeclaration(objectType, directiveType, visibility,
+ templatePrefix, declaration,
+ trailingRequiresClause, semicolon)
+
+ def parse_namespace_object(self) -> ASTNamespace:
+ templatePrefix = self._parse_template_declaration_prefix(objectType="namespace")
+ name = self._parse_nested_name()
+ templatePrefix = self._check_template_consistency(name, templatePrefix,
+ fullSpecShorthand=False)
+ res = ASTNamespace(name, templatePrefix)
+ res.objectType = 'namespace' # type: ignore[attr-defined]
+ return res
+
+ def parse_xref_object(self) -> tuple[ASTNamespace | ASTDeclaration, bool]:
+ pos = self.pos
+ try:
+ templatePrefix = self._parse_template_declaration_prefix(objectType="xref")
+ name = self._parse_nested_name()
+ # if there are '()' left, just skip them
+ self.skip_ws()
+ self.skip_string('()')
+ self.assert_end()
+ templatePrefix = self._check_template_consistency(name, templatePrefix,
+ fullSpecShorthand=True)
+ res1 = ASTNamespace(name, templatePrefix)
+ res1.objectType = 'xref' # type: ignore[attr-defined]
+ return res1, True
+ except DefinitionError as e1:
+ try:
+ self.pos = pos
+ res2 = self.parse_declaration('function', 'function')
+ # if there are '()' left, just skip them
+ self.skip_ws()
+ self.skip_string('()')
+ self.assert_end()
+ return res2, False
+ except DefinitionError as e2:
+ errs = []
+ errs.append((e1, "If shorthand ref"))
+ errs.append((e2, "If full function ref"))
+ msg = "Error in cross-reference."
+ raise self._make_multi_error(errs, msg) from e2
+
+ def parse_expression(self) -> ASTExpression | ASTType:
+ pos = self.pos
+ try:
+ expr = self._parse_expression()
+ self.skip_ws()
+ self.assert_end()
+ return expr
+ except DefinitionError as exExpr:
+ self.pos = pos
+ try:
+ typ = self._parse_type(False)
+ self.skip_ws()
+ self.assert_end()
+ return typ
+ except DefinitionError as exType:
+ header = "Error when parsing (type) expression."
+ errs = []
+ errs.append((exExpr, "If expression"))
+ errs.append((exType, "If type"))
+ raise self._make_multi_error(errs, header) from exType
+
+
+def _make_phony_error_name() -> ASTNestedName:
+ nne = ASTNestedNameElement(ASTIdentifier("PhonyNameDueToError"), None)
+ return ASTNestedName([nne], [False], rooted=False)
+
+
+class CPPObject(ObjectDescription[ASTDeclaration]):
+ """Description of a C++ language object."""
+
+ doc_field_types: list[Field] = [
+ GroupedField('template parameter', label=_('Template Parameters'),
+ names=('tparam', 'template parameter'),
+ can_collapse=True),
+ ]
+
+ option_spec: OptionSpec = {
+ 'no-index-entry': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindexentry': directives.flag,
+ 'nocontentsentry': directives.flag,
+ 'tparam-line-spec': directives.flag,
+ 'single-line-parameter-list': directives.flag,
+ }
+
+ def _add_enumerator_to_parent(self, ast: ASTDeclaration) -> None:
+ assert ast.objectType == 'enumerator'
+ # find the parent, if it exists && is an enum
+ # && it's unscoped,
+ # then add the name to the parent scope
+ symbol = ast.symbol
+ assert symbol
+ assert symbol.identOrOp is not None
+ assert symbol.templateParams is None
+ assert symbol.templateArgs is None
+ parentSymbol = symbol.parent
+ assert parentSymbol
+ if parentSymbol.parent is None:
+ # TODO: we could warn, but it is somewhat equivalent to unscoped
+ # enums, without the enum
+ return # no parent
+ parentDecl = parentSymbol.declaration
+ if parentDecl is None:
+ # the parent is not explicitly declared
+ # TODO: we could warn, but it could be a style to just assume
+ # enumerator parents to be scoped
+ return
+ if parentDecl.objectType != 'enum':
+ # TODO: maybe issue a warning, enumerators in non-enums is weird,
+ # but it is somewhat equivalent to unscoped enums, without the enum
+ return
+ if parentDecl.directiveType != 'enum':
+ return
+
+ targetSymbol = parentSymbol.parent
+ s = targetSymbol.find_identifier(symbol.identOrOp, matchSelf=False, recurseInAnon=True,
+ searchInSiblings=False)
+ if s is not None:
+ # something is already declared with that name
+ return
+ declClone = symbol.declaration.clone()
+ declClone.enumeratorScopedSymbol = symbol
+ Symbol(parent=targetSymbol, identOrOp=symbol.identOrOp,
+ templateParams=None, templateArgs=None,
+ declaration=declClone,
+ docname=self.env.docname, line=self.get_source_info()[1])
+
+ def add_target_and_index(self, ast: ASTDeclaration, sig: str,
+ signode: TextElement) -> None:
+ # general note: name must be lstrip(':')'ed, to remove "::"
+ ids = []
+ for i in range(1, _max_id + 1):
+ try:
+ id = ast.get_id(version=i)
+ ids.append(id)
+ except NoOldIdError:
+ assert i < _max_id
+ # let's keep the newest first
+ ids = list(reversed(ids))
+ newestId = ids[0]
+ assert newestId # shouldn't be None
+ if not re.compile(r'^[a-zA-Z0-9_]*$').match(newestId):
+ logger.warning('Index id generation for C++ object "%s" failed, please '
+ 'report as bug (id=%s).', ast, newestId,
+ location=self.get_location())
+
+ name = ast.symbol.get_full_nested_name().get_display_string().lstrip(':')
+ # Add index entry, but not if it's a declaration inside a concept
+ isInConcept = False
+ s = ast.symbol.parent
+ while s is not None:
+ decl = s.declaration
+ s = s.parent
+ if decl is None:
+ continue
+ if decl.objectType == 'concept':
+ isInConcept = True
+ break
+ if not isInConcept and 'no-index-entry' not in self.options:
+ strippedName = name
+ for prefix in self.env.config.cpp_index_common_prefix:
+ if name.startswith(prefix):
+ strippedName = strippedName[len(prefix):]
+ break
+ indexText = self.get_index_text(strippedName)
+ self.indexnode['entries'].append(('single', indexText, newestId, '', None))
+
+ if newestId not in self.state.document.ids:
+ # if the name is not unique, the first one will win
+ names = self.env.domaindata['cpp']['names']
+ if name not in names:
+ names[name] = ast.symbol.docname
+ # always add the newest id
+ assert newestId
+ signode['ids'].append(newestId)
+ # only add compatibility ids when there are no conflicts
+ for id in ids[1:]:
+ if not id: # is None when the element didn't exist in that version
+ continue
+ if id not in self.state.document.ids:
+ signode['ids'].append(id)
+ self.state.document.note_explicit_target(signode)
+
+ @property
+ def object_type(self) -> str:
+ raise NotImplementedError
+
+ @property
+ def display_object_type(self) -> str:
+ return self.object_type
+
+ def get_index_text(self, name: str) -> str:
+ return _('%s (C++ %s)') % (name, self.display_object_type)
+
+ def parse_definition(self, parser: DefinitionParser) -> ASTDeclaration:
+ return parser.parse_declaration(self.object_type, self.objtype)
+
+ def describe_signature(self, signode: desc_signature,
+ ast: ASTDeclaration, options: dict) -> None:
+ ast.describe_signature(signode, 'lastIsName', self.env, options)
+
+ def run(self) -> list[Node]:
+ env = self.state.document.settings.env # from ObjectDescription.run
+ if 'cpp:parent_symbol' not in env.temp_data:
+ root = env.domaindata['cpp']['root_symbol']
+ env.temp_data['cpp:parent_symbol'] = root
+ env.ref_context['cpp:parent_key'] = root.get_lookup_key()
+
+ # The lookup keys assume that no nested scopes exists inside overloaded functions.
+ # (see also #5191)
+ # Example:
+ # .. cpp:function:: void f(int)
+ # .. cpp:function:: void f(double)
+ #
+ # .. cpp:function:: void g()
+ #
+ # :cpp:any:`boom`
+ #
+ # So we disallow any signatures inside functions.
+ parentSymbol = env.temp_data['cpp:parent_symbol']
+ parentDecl = parentSymbol.declaration
+ if parentDecl is not None and parentDecl.objectType == 'function':
+ msg = ("C++ declarations inside functions are not supported. "
+ f"Parent function: {parentSymbol.get_full_nested_name()}\n"
+ f"Directive name: {self.name}\nDirective arg: {self.arguments[0]}")
+ logger.warning(msg, location=self.get_location())
+ name = _make_phony_error_name()
+ symbol = parentSymbol.add_name(name)
+ env.temp_data['cpp:last_symbol'] = symbol
+ return []
+ # When multiple declarations are made in the same directive
+ # they need to know about each other to provide symbol lookup for function parameters.
+ # We use last_symbol to store the latest added declaration in a directive.
+ env.temp_data['cpp:last_symbol'] = None
+ return super().run()
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> ASTDeclaration:
+ parentSymbol: Symbol = self.env.temp_data['cpp:parent_symbol']
+
+ max_len = (self.env.config.cpp_maximum_signature_line_length
+ or self.env.config.maximum_signature_line_length
+ or 0)
+ signode['multi_line_parameter_list'] = (
+ 'single-line-parameter-list' not in self.options
+ and (len(sig) > max_len > 0)
+ )
+
+ parser = DefinitionParser(sig, location=signode, config=self.env.config)
+ try:
+ ast = self.parse_definition(parser)
+ parser.assert_end()
+ except DefinitionError as e:
+ logger.warning(e, location=signode)
+ # It is easier to assume some phony name than handling the error in
+ # the possibly inner declarations.
+ name = _make_phony_error_name()
+ symbol = parentSymbol.add_name(name)
+ self.env.temp_data['cpp:last_symbol'] = symbol
+ raise ValueError from e
+
+ try:
+ symbol = parentSymbol.add_declaration(
+ ast, docname=self.env.docname, line=self.get_source_info()[1])
+ # append the new declaration to the sibling list
+ assert symbol.siblingAbove is None
+ assert symbol.siblingBelow is None
+ symbol.siblingAbove = self.env.temp_data['cpp:last_symbol']
+ if symbol.siblingAbove is not None:
+ assert symbol.siblingAbove.siblingBelow is None
+ symbol.siblingAbove.siblingBelow = symbol
+ self.env.temp_data['cpp:last_symbol'] = symbol
+ except _DuplicateSymbolError as e:
+ # Assume we are actually in the old symbol,
+ # instead of the newly created duplicate.
+ self.env.temp_data['cpp:last_symbol'] = e.symbol
+ msg = __("Duplicate C++ declaration, also defined at %s:%s.\n"
+ "Declaration is '.. cpp:%s:: %s'.")
+ msg = msg % (e.symbol.docname, e.symbol.line,
+ self.display_object_type, sig)
+ logger.warning(msg, location=signode)
+
+ if ast.objectType == 'enumerator':
+ self._add_enumerator_to_parent(ast)
+
+ # note: handle_signature may be called multiple time per directive,
+ # if it has multiple signatures, so don't mess with the original options.
+ options = dict(self.options)
+ options['tparam-line-spec'] = 'tparam-line-spec' in self.options
+ self.describe_signature(signode, ast, options)
+ return ast
+
+ def before_content(self) -> None:
+ lastSymbol: Symbol = self.env.temp_data['cpp:last_symbol']
+ assert lastSymbol
+ self.oldParentSymbol = self.env.temp_data['cpp:parent_symbol']
+ self.oldParentKey: LookupKey = self.env.ref_context['cpp:parent_key']
+ self.env.temp_data['cpp:parent_symbol'] = lastSymbol
+ self.env.ref_context['cpp:parent_key'] = lastSymbol.get_lookup_key()
+ self.env.temp_data['cpp:domain_name'] = (
+ *self.env.temp_data.get('cpp:domain_name', ()),
+ lastSymbol.identOrOp._stringify(str),
+ )
+
+ def after_content(self) -> None:
+ self.env.temp_data['cpp:parent_symbol'] = self.oldParentSymbol
+ self.env.ref_context['cpp:parent_key'] = self.oldParentKey
+ self.env.temp_data['cpp:domain_name'] = self.env.temp_data['cpp:domain_name'][:-1]
+
+ def _object_hierarchy_parts(self, sig_node: desc_signature) -> tuple[str, ...]:
+ return tuple(s.identOrOp._stringify(str) for s in
+ self.env.temp_data['cpp:last_symbol'].get_full_nested_name().names)
+
+ def _toc_entry_name(self, sig_node: desc_signature) -> str:
+ if not sig_node.get('_toc_parts'):
+ return ''
+
+ config = self.env.app.config
+ objtype = sig_node.parent.get('objtype')
+ if config.add_function_parentheses and objtype in {'function', 'method'}:
+ parens = '()'
+ else:
+ parens = ''
+ *parents, name = sig_node['_toc_parts']
+ if config.toc_object_entries_show_parents == 'domain':
+ return '::'.join((*self.env.temp_data.get('cpp:domain_name', ()), name + parens))
+ if config.toc_object_entries_show_parents == 'hide':
+ return name + parens
+ if config.toc_object_entries_show_parents == 'all':
+ return '::'.join(parents + [name + parens])
+ return ''
+
+
+class CPPTypeObject(CPPObject):
+ object_type = 'type'
+
+
+class CPPConceptObject(CPPObject):
+ object_type = 'concept'
+
+
+class CPPMemberObject(CPPObject):
+ object_type = 'member'
+
+
+class CPPFunctionObject(CPPObject):
+ object_type = 'function'
+
+ doc_field_types = CPPObject.doc_field_types + [
+ GroupedField('parameter', label=_('Parameters'),
+ names=('param', 'parameter', 'arg', 'argument'),
+ can_collapse=True),
+ GroupedField('exceptions', label=_('Throws'), rolename='expr',
+ names=('throws', 'throw', 'exception'),
+ can_collapse=True),
+ GroupedField('retval', label=_('Return values'),
+ names=('retvals', 'retval'),
+ can_collapse=True),
+ Field('returnvalue', label=_('Returns'), has_arg=False,
+ names=('returns', 'return')),
+ ]
+
+
+class CPPClassObject(CPPObject):
+ object_type = 'class'
+
+ @property
+ def display_object_type(self) -> str:
+ # the distinction between class and struct is only cosmetic
+ assert self.objtype in ('class', 'struct')
+ return self.objtype
+
+
+class CPPUnionObject(CPPObject):
+ object_type = 'union'
+
+
+class CPPEnumObject(CPPObject):
+ object_type = 'enum'
+
+
+class CPPEnumeratorObject(CPPObject):
+ object_type = 'enumerator'
+
+
+class CPPNamespaceObject(SphinxDirective):
+ """
+ This directive is just to tell Sphinx that we're documenting stuff in
+ namespace foo.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ rootSymbol = self.env.domaindata['cpp']['root_symbol']
+ if self.arguments[0].strip() in ('NULL', '0', 'nullptr'):
+ symbol = rootSymbol
+ stack: list[Symbol] = []
+ else:
+ parser = DefinitionParser(self.arguments[0],
+ location=self.get_location(),
+ config=self.config)
+ try:
+ ast = parser.parse_namespace_object()
+ parser.assert_end()
+ except DefinitionError as e:
+ logger.warning(e, location=self.get_location())
+ name = _make_phony_error_name()
+ ast = ASTNamespace(name, None)
+ symbol = rootSymbol.add_name(ast.nestedName, ast.templatePrefix)
+ stack = [symbol]
+ self.env.temp_data['cpp:parent_symbol'] = symbol
+ self.env.temp_data['cpp:namespace_stack'] = stack
+ self.env.ref_context['cpp:parent_key'] = symbol.get_lookup_key()
+ return []
+
+
+class CPPNamespacePushObject(SphinxDirective):
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ if self.arguments[0].strip() in ('NULL', '0', 'nullptr'):
+ return []
+ parser = DefinitionParser(self.arguments[0],
+ location=self.get_location(),
+ config=self.config)
+ try:
+ ast = parser.parse_namespace_object()
+ parser.assert_end()
+ except DefinitionError as e:
+ logger.warning(e, location=self.get_location())
+ name = _make_phony_error_name()
+ ast = ASTNamespace(name, None)
+ oldParent = self.env.temp_data.get('cpp:parent_symbol', None)
+ if not oldParent:
+ oldParent = self.env.domaindata['cpp']['root_symbol']
+ symbol = oldParent.add_name(ast.nestedName, ast.templatePrefix)
+ stack = self.env.temp_data.get('cpp:namespace_stack', [])
+ stack.append(symbol)
+ self.env.temp_data['cpp:parent_symbol'] = symbol
+ self.env.temp_data['cpp:namespace_stack'] = stack
+ self.env.ref_context['cpp:parent_key'] = symbol.get_lookup_key()
+ return []
+
+
+class CPPNamespacePopObject(SphinxDirective):
+ has_content = False
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ stack = self.env.temp_data.get('cpp:namespace_stack', None)
+ if not stack or len(stack) == 0:
+ logger.warning("C++ namespace pop on empty stack. Defaulting to global scope.",
+ location=self.get_location())
+ stack = []
+ else:
+ stack.pop()
+ if len(stack) > 0:
+ symbol = stack[-1]
+ else:
+ symbol = self.env.domaindata['cpp']['root_symbol']
+ self.env.temp_data['cpp:parent_symbol'] = symbol
+ self.env.temp_data['cpp:namespace_stack'] = stack
+ self.env.ref_context['cpp:parent_key'] = symbol.get_lookup_key()
+ return []
+
+
+class AliasNode(nodes.Element):
+ def __init__(self, sig: str, aliasOptions: dict,
+ env: BuildEnvironment | None = None,
+ parentKey: LookupKey | None = None) -> None:
+ super().__init__()
+ self.sig = sig
+ self.aliasOptions = aliasOptions
+ if env is not None:
+ if 'cpp:parent_symbol' not in env.temp_data:
+ root = env.domaindata['cpp']['root_symbol']
+ env.temp_data['cpp:parent_symbol'] = root
+ env.ref_context['cpp:parent_key'] = root.get_lookup_key()
+ self.parentKey = env.ref_context['cpp:parent_key']
+ else:
+ assert parentKey is not None
+ self.parentKey = parentKey
+
+ def copy(self) -> AliasNode:
+ return self.__class__(self.sig, self.aliasOptions,
+ env=None, parentKey=self.parentKey)
+
+
+class AliasTransform(SphinxTransform):
+ default_priority = ReferencesResolver.default_priority - 1
+
+ def _render_symbol(self, s: Symbol, maxdepth: int, skipThis: bool,
+ aliasOptions: dict, renderOptions: dict,
+ document: Any) -> list[Node]:
+ if maxdepth == 0:
+ recurse = True
+ elif maxdepth == 1:
+ recurse = False
+ else:
+ maxdepth -= 1
+ recurse = True
+
+ nodes: list[Node] = []
+ if not skipThis:
+ signode = addnodes.desc_signature('', '')
+ nodes.append(signode)
+ s.declaration.describe_signature(signode, 'markName', self.env, renderOptions)
+
+ if recurse:
+ if skipThis:
+ childContainer: list[Node] | addnodes.desc = nodes
+ else:
+ content = addnodes.desc_content()
+ desc = addnodes.desc()
+ content.append(desc)
+ desc.document = document
+ desc['domain'] = 'cpp'
+ # 'desctype' is a backwards compatible attribute
+ desc['objtype'] = desc['desctype'] = 'alias'
+ desc['no-index'] = True
+ childContainer = desc
+
+ for sChild in s._children:
+ if sChild.declaration is None:
+ continue
+ if sChild.declaration.objectType in ("templateParam", "functionParam"):
+ continue
+ childNodes = self._render_symbol(
+ sChild, maxdepth=maxdepth, skipThis=False,
+ aliasOptions=aliasOptions, renderOptions=renderOptions,
+ document=document)
+ childContainer.extend(childNodes)
+
+ if not skipThis and len(desc.children) != 0:
+ nodes.append(content)
+ return nodes
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(AliasNode):
+ sig = node.sig
+ parentKey = node.parentKey
+ try:
+ parser = DefinitionParser(sig, location=node,
+ config=self.env.config)
+ ast, isShorthand = parser.parse_xref_object()
+ parser.assert_end()
+ except DefinitionError as e:
+ logger.warning(e, location=node)
+ ast, isShorthand = None, None
+
+ if ast is None:
+ # could not be parsed, so stop here
+ signode = addnodes.desc_signature(sig, '')
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+ node.replace_self(signode)
+ continue
+
+ rootSymbol: Symbol = self.env.domains['cpp'].data['root_symbol']
+ parentSymbol: Symbol = rootSymbol.direct_lookup(parentKey)
+ if not parentSymbol:
+ logger.debug("Target: %s", sig)
+ logger.debug("ParentKey: %s", parentKey)
+ logger.debug(rootSymbol.dump(1))
+ assert parentSymbol # should be there
+
+ symbols: list[Symbol] = []
+ if isShorthand:
+ assert isinstance(ast, ASTNamespace)
+ ns = ast
+ name = ns.nestedName
+ if ns.templatePrefix:
+ templateDecls = ns.templatePrefix.templates
+ else:
+ templateDecls = []
+ symbols, failReason = parentSymbol.find_name(
+ nestedName=name,
+ templateDecls=templateDecls,
+ typ='any',
+ templateShorthand=True,
+ matchSelf=True, recurseInAnon=True,
+ searchInSiblings=False)
+ if symbols is None:
+ symbols = []
+ else:
+ assert isinstance(ast, ASTDeclaration)
+ decl = ast
+ name = decl.name
+ s = parentSymbol.find_declaration(decl, 'any',
+ templateShorthand=True,
+ matchSelf=True, recurseInAnon=True)
+ if s is not None:
+ symbols.append(s)
+
+ symbols = [s for s in symbols if s.declaration is not None]
+
+ if len(symbols) == 0:
+ signode = addnodes.desc_signature(sig, '')
+ node.append(signode)
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+
+ logger.warning("Can not find C++ declaration for alias '%s'." % ast,
+ location=node)
+ node.replace_self(signode)
+ else:
+ nodes = []
+ renderOptions = {
+ 'tparam-line-spec': False,
+ }
+ for s in symbols:
+ assert s.declaration is not None
+ res = self._render_symbol(
+ s, maxdepth=node.aliasOptions['maxdepth'],
+ skipThis=node.aliasOptions['noroot'],
+ aliasOptions=node.aliasOptions,
+ renderOptions=renderOptions,
+ document=node.document)
+ nodes.extend(res)
+ node.replace_self(nodes)
+
+
+class CPPAliasObject(ObjectDescription):
+ option_spec: OptionSpec = {
+ 'maxdepth': directives.nonnegative_int,
+ 'noroot': directives.flag,
+ }
+
+ def run(self) -> list[Node]:
+ """
+ On purpose this doesn't call the ObjectDescription version, but is based on it.
+ Each alias signature may expand into multiple real signatures (an overload set).
+ The code is therefore based on the ObjectDescription version.
+ """
+ if ':' in self.name:
+ self.domain, self.objtype = self.name.split(':', 1)
+ else:
+ self.domain, self.objtype = '', self.name
+
+ node = addnodes.desc()
+ node.document = self.state.document
+ node['domain'] = self.domain
+ # 'desctype' is a backwards compatible attribute
+ node['objtype'] = node['desctype'] = self.objtype
+
+ self.names: list[str] = []
+ aliasOptions = {
+ 'maxdepth': self.options.get('maxdepth', 1),
+ 'noroot': 'noroot' in self.options,
+ }
+ if aliasOptions['noroot'] and aliasOptions['maxdepth'] == 1:
+ logger.warning("Error in C++ alias declaration."
+ " Requested 'noroot' but 'maxdepth' 1."
+ " When skipping the root declaration,"
+ " need 'maxdepth' 0 for infinite or at least 2.",
+ location=self.get_location())
+ signatures = self.get_signatures()
+ for sig in signatures:
+ node.append(AliasNode(sig, aliasOptions, env=self.env))
+
+ contentnode = addnodes.desc_content()
+ node.append(contentnode)
+ self.before_content()
+ self.state.nested_parse(self.content, self.content_offset, contentnode)
+ self.env.temp_data['object'] = None
+ self.after_content()
+ return [node]
+
+
+class CPPXRefRole(XRefRole):
+ def process_link(self, env: BuildEnvironment, refnode: Element, has_explicit_title: bool,
+ title: str, target: str) -> tuple[str, str]:
+ refnode.attributes.update(env.ref_context)
+
+ if not has_explicit_title:
+ # major hax: replace anon names via simple string manipulation.
+ # Can this actually fail?
+ title = anon_identifier_re.sub("[anonymous]", str(title))
+
+ if refnode['reftype'] == 'any':
+ # Assume the removal part of fix_parens for :any: refs.
+ # The addition part is done with the reference is resolved.
+ if not has_explicit_title and title.endswith('()'):
+ title = title[:-2]
+ if target.endswith('()'):
+ target = target[:-2]
+ # TODO: should this really be here?
+ if not has_explicit_title:
+ target = target.lstrip('~') # only has a meaning for the title
+ # if the first character is a tilde, don't display the module/class
+ # parts of the contents
+ if title[:1] == '~':
+ title = title[1:]
+ dcolon = title.rfind('::')
+ if dcolon != -1:
+ title = title[dcolon + 2:]
+ return title, target
+
+
+class CPPExprRole(SphinxRole):
+ def __init__(self, asCode: bool) -> None:
+ super().__init__()
+ if asCode:
+ # render the expression as inline code
+ self.class_type = 'cpp-expr'
+ else:
+ # render the expression as inline text
+ self.class_type = 'cpp-texpr'
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ text = self.text.replace('\n', ' ')
+ parser = DefinitionParser(text,
+ location=self.get_location(),
+ config=self.config)
+ # attempt to mimic XRefRole classes, except that...
+ try:
+ ast = parser.parse_expression()
+ except DefinitionError as ex:
+ logger.warning('Unparseable C++ expression: %r\n%s', text, ex,
+ location=self.get_location())
+ # see below
+ return [addnodes.desc_inline('cpp', text, text, classes=[self.class_type])], []
+ parentSymbol = self.env.temp_data.get('cpp:parent_symbol', None)
+ if parentSymbol is None:
+ parentSymbol = self.env.domaindata['cpp']['root_symbol']
+ # ...most if not all of these classes should really apply to the individual references,
+ # not the container node
+ signode = addnodes.desc_inline('cpp', classes=[self.class_type])
+ ast.describe_signature(signode, 'markType', self.env, parentSymbol)
+ return [signode], []
+
+
+class CPPDomain(Domain):
+ """C++ language domain.
+
+ There are two 'object type' attributes being used::
+
+ - Each object created from directives gets an assigned .objtype from ObjectDescription.run.
+ This is simply the directive name.
+ - Each declaration (see the distinction in the directives dict below) has a nested .ast of
+ type ASTDeclaration. That object has .objectType which corresponds to the keys in the
+ object_types dict below. They are the core different types of declarations in C++ that
+ one can document.
+ """
+ name = 'cpp'
+ label = 'C++'
+ object_types = {
+ 'class': ObjType(_('class'), 'class', 'struct', 'identifier', 'type'),
+ 'union': ObjType(_('union'), 'union', 'identifier', 'type'),
+ 'function': ObjType(_('function'), 'func', 'identifier', 'type'),
+ 'member': ObjType(_('member'), 'member', 'var', 'identifier'),
+ 'type': ObjType(_('type'), 'identifier', 'type'),
+ 'concept': ObjType(_('concept'), 'concept', 'identifier'),
+ 'enum': ObjType(_('enum'), 'enum', 'identifier', 'type'),
+ 'enumerator': ObjType(_('enumerator'), 'enumerator', 'identifier'),
+ # generated object types
+ 'functionParam': ObjType(_('function parameter'), 'identifier', 'member', 'var'), # noqa: E501
+ 'templateParam': ObjType(_('template parameter'),
+ 'identifier', 'class', 'struct', 'union', 'member', 'var', 'type'), # noqa: E501
+ }
+
+ directives = {
+ # declarations
+ 'class': CPPClassObject,
+ 'struct': CPPClassObject,
+ 'union': CPPUnionObject,
+ 'function': CPPFunctionObject,
+ 'member': CPPMemberObject,
+ 'var': CPPMemberObject,
+ 'type': CPPTypeObject,
+ 'concept': CPPConceptObject,
+ 'enum': CPPEnumObject,
+ 'enum-struct': CPPEnumObject,
+ 'enum-class': CPPEnumObject,
+ 'enumerator': CPPEnumeratorObject,
+ # scope control
+ 'namespace': CPPNamespaceObject,
+ 'namespace-push': CPPNamespacePushObject,
+ 'namespace-pop': CPPNamespacePopObject,
+ # other
+ 'alias': CPPAliasObject,
+ }
+ roles = {
+ 'any': CPPXRefRole(),
+ 'class': CPPXRefRole(),
+ 'struct': CPPXRefRole(),
+ 'union': CPPXRefRole(),
+ 'func': CPPXRefRole(fix_parens=True),
+ 'member': CPPXRefRole(),
+ 'var': CPPXRefRole(),
+ 'type': CPPXRefRole(),
+ 'concept': CPPXRefRole(),
+ 'enum': CPPXRefRole(),
+ 'enumerator': CPPXRefRole(),
+ 'expr': CPPExprRole(asCode=True),
+ 'texpr': CPPExprRole(asCode=False),
+ }
+ initial_data = {
+ 'root_symbol': Symbol(None, None, None, None, None, None, None),
+ 'names': {}, # full name for indexing -> docname
+ }
+
+ def clear_doc(self, docname: str) -> None:
+ if Symbol.debug_show_tree:
+ logger.debug("clear_doc: %s", docname)
+ logger.debug("\tbefore:")
+ logger.debug(self.data['root_symbol'].dump(1))
+ logger.debug("\tbefore end")
+
+ rootSymbol = self.data['root_symbol']
+ rootSymbol.clear_doc(docname)
+
+ if Symbol.debug_show_tree:
+ logger.debug("\tafter:")
+ logger.debug(self.data['root_symbol'].dump(1))
+ logger.debug("\tafter end")
+ logger.debug("clear_doc end: %s", docname)
+ for name, nDocname in list(self.data['names'].items()):
+ if nDocname == docname:
+ del self.data['names'][name]
+
+ def process_doc(self, env: BuildEnvironment, docname: str,
+ document: nodes.document) -> None:
+ if Symbol.debug_show_tree:
+ logger.debug("process_doc: %s", docname)
+ logger.debug(self.data['root_symbol'].dump(0))
+ logger.debug("process_doc end: %s", docname)
+
+ def process_field_xref(self, pnode: pending_xref) -> None:
+ pnode.attributes.update(self.env.ref_context)
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict) -> None:
+ if Symbol.debug_show_tree:
+ logger.debug("merge_domaindata:")
+ logger.debug("\tself:")
+ logger.debug(self.data['root_symbol'].dump(1))
+ logger.debug("\tself end")
+ logger.debug("\tother:")
+ logger.debug(otherdata['root_symbol'].dump(1))
+ logger.debug("\tother end")
+
+ self.data['root_symbol'].merge_with(otherdata['root_symbol'],
+ docnames, self.env)
+ ourNames = self.data['names']
+ for name, docname in otherdata['names'].items():
+ if docname in docnames:
+ if name not in ourNames:
+ ourNames[name] = docname
+ # no need to warn on duplicates, the symbol merge already does that
+ if Symbol.debug_show_tree:
+ logger.debug("\tresult:")
+ logger.debug(self.data['root_symbol'].dump(1))
+ logger.debug("\tresult end")
+ logger.debug("merge_domaindata end")
+
+ def _resolve_xref_inner(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref,
+ contnode: Element) -> tuple[Element | None, str | None]:
+ # add parens again for those that could be functions
+ if typ in ('any', 'func'):
+ target += '()'
+ parser = DefinitionParser(target, location=node, config=env.config)
+ try:
+ ast, isShorthand = parser.parse_xref_object()
+ except DefinitionError as e:
+ # as arg to stop flake8 from complaining
+ def findWarning(e: Exception) -> tuple[str, Exception]:
+ if typ != 'any' and typ != 'func':
+ return target, e
+ # hax on top of the paren hax to try to get correct errors
+ parser2 = DefinitionParser(target[:-2],
+ location=node,
+ config=env.config)
+ try:
+ parser2.parse_xref_object()
+ except DefinitionError as e2:
+ return target[:-2], e2
+ # strange, that we don't get the error now, use the original
+ return target, e
+ t, ex = findWarning(e)
+ logger.warning('Unparseable C++ cross-reference: %r\n%s', t, ex,
+ location=node)
+ return None, None
+ parentKey: LookupKey = node.get("cpp:parent_key", None)
+ rootSymbol = self.data['root_symbol']
+ if parentKey:
+ parentSymbol: Symbol = rootSymbol.direct_lookup(parentKey)
+ if not parentSymbol:
+ logger.debug("Target: %s", target)
+ logger.debug("ParentKey: %s", parentKey.data)
+ logger.debug(rootSymbol.dump(1))
+ assert parentSymbol # should be there
+ else:
+ parentSymbol = rootSymbol
+
+ if isShorthand:
+ assert isinstance(ast, ASTNamespace)
+ ns = ast
+ name = ns.nestedName
+ if ns.templatePrefix:
+ templateDecls = ns.templatePrefix.templates
+ else:
+ templateDecls = []
+ # let's be conservative with the sibling lookup for now
+ searchInSiblings = (not name.rooted) and len(name.names) == 1
+ symbols, failReason = parentSymbol.find_name(
+ name, templateDecls, typ,
+ templateShorthand=True,
+ matchSelf=True, recurseInAnon=True,
+ searchInSiblings=searchInSiblings)
+ if symbols is None:
+ if typ == 'identifier':
+ if failReason == 'templateParamInQualified':
+ # this is an xref we created as part of a signature,
+ # so don't warn for names nested in template parameters
+ raise NoUri(str(name), typ)
+ s = None
+ else:
+ # just refer to the arbitrarily first symbol
+ s = symbols[0]
+ else:
+ assert isinstance(ast, ASTDeclaration)
+ decl = ast
+ name = decl.name
+ s = parentSymbol.find_declaration(decl, typ,
+ templateShorthand=True,
+ matchSelf=True, recurseInAnon=True)
+ if s is None or s.declaration is None:
+ txtName = str(name)
+ if txtName.startswith('std::') or txtName == 'std':
+ raise NoUri(txtName, typ)
+ return None, None
+
+ if typ.startswith('cpp:'):
+ typ = typ[4:]
+ declTyp = s.declaration.objectType
+
+ def checkType() -> bool:
+ if typ == 'any':
+ return True
+ objtypes = self.objtypes_for_role(typ)
+ if objtypes:
+ return declTyp in objtypes
+ logger.debug(f"Type is {typ}, declaration type is {declTyp}") # NoQA: G004
+ raise AssertionError
+ if not checkType():
+ logger.warning("cpp:%s targets a %s (%s).",
+ typ, s.declaration.objectType,
+ s.get_full_nested_name(),
+ location=node)
+
+ declaration = s.declaration
+ if isShorthand:
+ fullNestedName = s.get_full_nested_name()
+ displayName = fullNestedName.get_display_string().lstrip(':')
+ else:
+ displayName = decl.get_display_string()
+ docname = s.docname
+ assert docname
+
+ # the non-identifier refs are cross-references, which should be processed:
+ # - fix parenthesis due to operator() and add_function_parentheses
+ if typ != "identifier":
+ title = contnode.pop(0).astext()
+ # If it's operator(), we need to add '()' if explicit function parens
+ # are requested. Then the Sphinx machinery will add another pair.
+ # Also, if it's an 'any' ref that resolves to a function, we need to add
+ # parens as well.
+ # However, if it's a non-shorthand function ref, for a function that
+ # takes no arguments, then we may need to add parens again as well.
+ addParen = 0
+ if not node.get('refexplicit', False) and declaration.objectType == 'function':
+ if isShorthand:
+ # this is just the normal haxing for 'any' roles
+ if env.config.add_function_parentheses and typ == 'any':
+ addParen += 1
+ # and now this stuff for operator()
+ if (env.config.add_function_parentheses and typ == 'func' and
+ title.endswith('operator()')):
+ addParen += 1
+ if (typ in ('any', 'func') and
+ title.endswith('operator') and
+ displayName.endswith('operator()')):
+ addParen += 1
+ else:
+ # our job here is to essentially nullify add_function_parentheses
+ if env.config.add_function_parentheses:
+ if typ == 'any' and displayName.endswith('()'):
+ addParen += 1
+ elif typ == 'func':
+ if title.endswith('()') and not displayName.endswith('()'):
+ title = title[:-2]
+ else:
+ if displayName.endswith('()'):
+ addParen += 1
+ if addParen > 0:
+ title += '()' * addParen
+ # and reconstruct the title again
+ contnode += nodes.Text(title)
+ res = make_refnode(builder, fromdocname, docname,
+ declaration.get_newest_id(), contnode, displayName,
+ ), declaration.objectType
+ return res
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ return self._resolve_xref_inner(env, fromdocname, builder, typ,
+ target, node, contnode)[0]
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ with logging.suppress_logging():
+ retnode, objtype = self._resolve_xref_inner(env, fromdocname, builder,
+ 'any', target, node, contnode)
+ if retnode:
+ if objtype == 'templateParam':
+ return [('cpp:templateParam', retnode)]
+ else:
+ return [('cpp:' + self.role_for_objtype(objtype), retnode)]
+ return []
+
+ def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]:
+ rootSymbol = self.data['root_symbol']
+ for symbol in rootSymbol.get_all_symbols():
+ if symbol.declaration is None:
+ continue
+ assert symbol.docname
+ fullNestedName = symbol.get_full_nested_name()
+ name = str(fullNestedName).lstrip(':')
+ dispname = fullNestedName.get_display_string().lstrip(':')
+ objectType = symbol.declaration.objectType
+ docname = symbol.docname
+ newestId = symbol.declaration.get_newest_id()
+ yield (name, dispname, objectType, docname, newestId, 1)
+
+ def get_full_qualified_name(self, node: Element) -> str:
+ target = node.get('reftarget', None)
+ if target is None:
+ return None
+ parentKey: LookupKey = node.get("cpp:parent_key", None)
+ if parentKey is None or len(parentKey.data) <= 0:
+ return None
+
+ rootSymbol = self.data['root_symbol']
+ parentSymbol = rootSymbol.direct_lookup(parentKey)
+ parentName = parentSymbol.get_full_nested_name()
+ return '::'.join([str(parentName), target])
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(CPPDomain)
+ app.add_config_value("cpp_index_common_prefix", [], 'env')
+ app.add_config_value("cpp_id_attributes", [], 'env')
+ app.add_config_value("cpp_paren_attributes", [], 'env')
+ app.add_config_value("cpp_maximum_signature_line_length", None, 'env', types={int, None})
+ app.add_post_transform(AliasTransform)
+
+ # debug stuff
+ app.add_config_value("cpp_debug_lookup", False, '')
+ app.add_config_value("cpp_debug_show_tree", False, '')
+
+ def initStuff(app):
+ Symbol.debug_lookup = app.config.cpp_debug_lookup
+ Symbol.debug_show_tree = app.config.cpp_debug_show_tree
+ app.config.cpp_index_common_prefix.sort(reverse=True)
+ app.connect("builder-inited", initStuff)
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 9,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/index.py b/sphinx/domains/index.py
new file mode 100644
index 0000000..c084516
--- /dev/null
+++ b/sphinx/domains/index.py
@@ -0,0 +1,126 @@
+"""The index domain."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.domains import Domain
+from sphinx.util import logging
+from sphinx.util.docutils import ReferenceRole, SphinxDirective
+from sphinx.util.index_entries import split_index_msg
+from sphinx.util.nodes import process_index_entry
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+
+ from docutils.nodes import Node, system_message
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+
+
+logger = logging.getLogger(__name__)
+
+
+class IndexDomain(Domain):
+ """Mathematics domain."""
+ name = 'index'
+ label = 'index'
+
+ @property
+ def entries(self) -> dict[str, list[tuple[str, str, str, str, str | None]]]:
+ return self.data.setdefault('entries', {})
+
+ def clear_doc(self, docname: str) -> None:
+ self.entries.pop(docname, None)
+
+ def merge_domaindata(self, docnames: Iterable[str], otherdata: dict[str, Any]) -> None:
+ for docname in docnames:
+ self.entries[docname] = otherdata['entries'][docname]
+
+ def process_doc(self, env: BuildEnvironment, docname: str, document: Node) -> None:
+ """Process a document after it is read by the environment."""
+ entries = self.entries.setdefault(env.docname, [])
+ for node in list(document.findall(addnodes.index)):
+ try:
+ for (entry_type, value, _target_id, _main, _category_key) in node['entries']:
+ split_index_msg(entry_type, value)
+ except ValueError as exc:
+ logger.warning(str(exc), location=node)
+ node.parent.remove(node)
+ else:
+ for entry in node['entries']:
+ entries.append(entry)
+
+
+class IndexDirective(SphinxDirective):
+ """
+ Directive to add entries to the index.
+ """
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {
+ 'name': directives.unchanged,
+ }
+
+ def run(self) -> list[Node]:
+ arguments = self.arguments[0].split('\n')
+
+ if 'name' in self.options:
+ targetname = self.options['name']
+ targetnode = nodes.target('', '', names=[targetname])
+ else:
+ targetid = 'index-%s' % self.env.new_serialno('index')
+ targetnode = nodes.target('', '', ids=[targetid])
+
+ self.state.document.note_explicit_target(targetnode)
+ indexnode = addnodes.index()
+ indexnode['entries'] = []
+ indexnode['inline'] = False
+ self.set_source_info(indexnode)
+ for entry in arguments:
+ indexnode['entries'].extend(process_index_entry(entry, targetnode['ids'][0]))
+ return [indexnode, targetnode]
+
+
+class IndexRole(ReferenceRole):
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ target_id = 'index-%s' % self.env.new_serialno('index')
+ if self.has_explicit_title:
+ # if an explicit target is given, process it as a full entry
+ title = self.title
+ entries = process_index_entry(self.target, target_id)
+ else:
+ # otherwise we just create a single entry
+ if self.target.startswith('!'):
+ title = self.title[1:]
+ entries = [('single', self.target[1:], target_id, 'main', None)]
+ else:
+ title = self.title
+ entries = [('single', self.target, target_id, '', None)]
+
+ index = addnodes.index(entries=entries)
+ target = nodes.target('', '', ids=[target_id])
+ text = nodes.Text(title)
+ self.set_source_info(index)
+ return [index, target, text], []
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(IndexDomain)
+ app.add_directive('index', IndexDirective)
+ app.add_role('index', IndexRole())
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 1,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/javascript.py b/sphinx/domains/javascript.py
new file mode 100644
index 0000000..75149c3
--- /dev/null
+++ b/sphinx/domains/javascript.py
@@ -0,0 +1,508 @@
+"""The JavaScript domain."""
+
+from __future__ import annotations
+
+import contextlib
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.directives import ObjectDescription
+from sphinx.domains import Domain, ObjType
+from sphinx.domains.python import _pseudo_parse_arglist
+from sphinx.locale import _, __
+from sphinx.roles import XRefRole
+from sphinx.util import logging
+from sphinx.util.docfields import Field, GroupedField, TypedField
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import make_id, make_refnode, nested_parse_with_titles
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from docutils.nodes import Element, Node
+
+ from sphinx.addnodes import desc_signature, pending_xref
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+
+logger = logging.getLogger(__name__)
+
+
+class JSObject(ObjectDescription[tuple[str, str]]):
+ """
+ Description of a JavaScript object.
+ """
+ #: If set to ``True`` this object is callable and a `desc_parameterlist` is
+ #: added
+ has_arguments = False
+
+ #: If ``allow_nesting`` is ``True``, the object prefixes will be accumulated
+ #: based on directive nesting
+ allow_nesting = False
+
+ option_spec: OptionSpec = {
+ 'no-index': directives.flag,
+ 'no-index-entry': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindex': directives.flag,
+ 'noindexentry': directives.flag,
+ 'nocontentsentry': directives.flag,
+ 'single-line-parameter-list': directives.flag,
+ }
+
+ def get_display_prefix(self) -> list[Node]:
+ #: what is displayed right before the documentation entry
+ return []
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]:
+ """Breaks down construct signatures
+
+ Parses out prefix and argument list from construct definition. The
+ namespace and class will be determined by the nesting of domain
+ directives.
+ """
+ sig = sig.strip()
+ if '(' in sig and sig[-1:] == ')':
+ member, arglist = sig.split('(', 1)
+ member = member.strip()
+ arglist = arglist[:-1].strip()
+ else:
+ member = sig
+ arglist = None
+ # If construct is nested, prefix the current prefix
+ prefix = self.env.ref_context.get('js:object', None)
+ mod_name = self.env.ref_context.get('js:module')
+
+ name = member
+ try:
+ member_prefix, member_name = member.rsplit('.', 1)
+ except ValueError:
+ member_name = name
+ member_prefix = ''
+ finally:
+ name = member_name
+ if prefix and member_prefix:
+ prefix = '.'.join([prefix, member_prefix])
+ elif prefix is None and member_prefix:
+ prefix = member_prefix
+ fullname = name
+ if prefix:
+ fullname = '.'.join([prefix, name])
+
+ signode['module'] = mod_name
+ signode['object'] = prefix
+ signode['fullname'] = fullname
+
+ max_len = (self.env.config.javascript_maximum_signature_line_length
+ or self.env.config.maximum_signature_line_length
+ or 0)
+ multi_line_parameter_list = (
+ 'single-line-parameter-list' not in self.options
+ and (len(sig) > max_len > 0)
+ )
+
+ display_prefix = self.get_display_prefix()
+ if display_prefix:
+ signode += addnodes.desc_annotation('', '', *display_prefix)
+
+ actual_prefix = None
+ if prefix:
+ actual_prefix = prefix
+ elif mod_name:
+ actual_prefix = mod_name
+ if actual_prefix:
+ addName = addnodes.desc_addname('', '')
+ for p in actual_prefix.split('.'):
+ addName += addnodes.desc_sig_name(p, p)
+ addName += addnodes.desc_sig_punctuation('.', '.')
+ signode += addName
+ signode += addnodes.desc_name('', '', addnodes.desc_sig_name(name, name))
+ if self.has_arguments:
+ if not arglist:
+ signode += addnodes.desc_parameterlist()
+ else:
+ _pseudo_parse_arglist(signode, arglist, multi_line_parameter_list)
+ return fullname, prefix
+
+ def _object_hierarchy_parts(self, sig_node: desc_signature) -> tuple[str, ...]:
+ if 'fullname' not in sig_node:
+ return ()
+ modname = sig_node.get('module')
+ fullname = sig_node['fullname']
+
+ if modname:
+ return (modname, *fullname.split('.'))
+ else:
+ return tuple(fullname.split('.'))
+
+ def add_target_and_index(self, name_obj: tuple[str, str], sig: str,
+ signode: desc_signature) -> None:
+ mod_name = self.env.ref_context.get('js:module')
+ fullname = (mod_name + '.' if mod_name else '') + name_obj[0]
+ node_id = make_id(self.env, self.state.document, '', fullname)
+ signode['ids'].append(node_id)
+ self.state.document.note_explicit_target(signode)
+
+ domain = cast(JavaScriptDomain, self.env.get_domain('js'))
+ domain.note_object(fullname, self.objtype, node_id, location=signode)
+
+ if 'no-index-entry' not in self.options:
+ indextext = self.get_index_text(mod_name, name_obj) # type: ignore[arg-type]
+ if indextext:
+ self.indexnode['entries'].append(('single', indextext, node_id, '', None))
+
+ def get_index_text(self, objectname: str, name_obj: tuple[str, str]) -> str:
+ name, obj = name_obj
+ if self.objtype == 'function':
+ if not obj:
+ return _('%s() (built-in function)') % name
+ return _('%s() (%s method)') % (name, obj)
+ elif self.objtype == 'class':
+ return _('%s() (class)') % name
+ elif self.objtype == 'data':
+ return _('%s (global variable or constant)') % name
+ elif self.objtype == 'attribute':
+ return _('%s (%s attribute)') % (name, obj)
+ return ''
+
+ def before_content(self) -> None:
+ """Handle object nesting before content
+
+ :py:class:`JSObject` represents JavaScript language constructs. For
+ constructs that are nestable, this method will build up a stack of the
+ nesting hierarchy so that it can be later de-nested correctly, in
+ :py:meth:`after_content`.
+
+ For constructs that aren't nestable, the stack is bypassed, and instead
+ only the most recent object is tracked. This object prefix name will be
+ removed with :py:meth:`after_content`.
+
+ The following keys are used in ``self.env.ref_context``:
+
+ js:objects
+ Stores the object prefix history. With each nested element, we
+ add the object prefix to this list. When we exit that object's
+ nesting level, :py:meth:`after_content` is triggered and the
+ prefix is removed from the end of the list.
+
+ js:object
+ Current object prefix. This should generally reflect the last
+ element in the prefix history
+ """
+ prefix = None
+ if self.names:
+ (obj_name, obj_name_prefix) = self.names.pop()
+ prefix = obj_name_prefix.strip('.') if obj_name_prefix else None
+ if self.allow_nesting:
+ prefix = obj_name
+ if prefix:
+ self.env.ref_context['js:object'] = prefix
+ if self.allow_nesting:
+ objects = self.env.ref_context.setdefault('js:objects', [])
+ objects.append(prefix)
+
+ def after_content(self) -> None:
+ """Handle object de-nesting after content
+
+ If this class is a nestable object, removing the last nested class prefix
+ ends further nesting in the object.
+
+ If this class is not a nestable object, the list of classes should not
+ be altered as we didn't affect the nesting levels in
+ :py:meth:`before_content`.
+ """
+ objects = self.env.ref_context.setdefault('js:objects', [])
+ if self.allow_nesting:
+ with contextlib.suppress(IndexError):
+ objects.pop()
+
+ self.env.ref_context['js:object'] = (objects[-1] if len(objects) > 0
+ else None)
+
+ def _toc_entry_name(self, sig_node: desc_signature) -> str:
+ if not sig_node.get('_toc_parts'):
+ return ''
+
+ config = self.env.app.config
+ objtype = sig_node.parent.get('objtype')
+ if config.add_function_parentheses and objtype in {'function', 'method'}:
+ parens = '()'
+ else:
+ parens = ''
+ *parents, name = sig_node['_toc_parts']
+ if config.toc_object_entries_show_parents == 'domain':
+ return sig_node.get('fullname', name) + parens
+ if config.toc_object_entries_show_parents == 'hide':
+ return name + parens
+ if config.toc_object_entries_show_parents == 'all':
+ return '.'.join(parents + [name + parens])
+ return ''
+
+
+class JSCallable(JSObject):
+ """Description of a JavaScript function, method or constructor."""
+ has_arguments = True
+
+ doc_field_types = [
+ TypedField('arguments', label=_('Arguments'),
+ names=('argument', 'arg', 'parameter', 'param'),
+ typerolename='func', typenames=('paramtype', 'type')),
+ GroupedField('errors', label=_('Throws'), rolename='func',
+ names=('throws', ),
+ can_collapse=True),
+ Field('returnvalue', label=_('Returns'), has_arg=False,
+ names=('returns', 'return')),
+ Field('returntype', label=_('Return type'), has_arg=False,
+ names=('rtype',)),
+ ]
+
+
+class JSConstructor(JSCallable):
+ """Like a callable but with a different prefix."""
+
+ allow_nesting = True
+
+ def get_display_prefix(self) -> list[Node]:
+ return [addnodes.desc_sig_keyword('class', 'class'),
+ addnodes.desc_sig_space()]
+
+
+class JSModule(SphinxDirective):
+ """
+ Directive to mark description of a new JavaScript module.
+
+ This directive specifies the module name that will be used by objects that
+ follow this directive.
+
+ Options
+ -------
+
+ no-index
+ If the ``:no-index:`` option is specified, no linkable elements will be
+ created, and the module won't be added to the global module index. This
+ is useful for splitting up the module definition across multiple
+ sections or files.
+
+ :param mod_name: Module name
+ """
+
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'no-index': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindex': directives.flag,
+ 'nocontentsentry': directives.flag,
+ }
+
+ def run(self) -> list[Node]:
+ mod_name = self.arguments[0].strip()
+ self.env.ref_context['js:module'] = mod_name
+ no_index = 'no-index' in self.options or 'noindex' in self.options
+
+ content_node: Element = nodes.section()
+ # necessary so that the child nodes get the right source/line set
+ content_node.document = self.state.document
+ nested_parse_with_titles(self.state, self.content, content_node, self.content_offset)
+
+ ret: list[Node] = []
+ if not no_index:
+ domain = cast(JavaScriptDomain, self.env.get_domain('js'))
+
+ node_id = make_id(self.env, self.state.document, 'module', mod_name)
+ domain.note_module(mod_name, node_id)
+ # Make a duplicate entry in 'objects' to facilitate searching for
+ # the module in JavaScriptDomain.find_obj()
+ domain.note_object(mod_name, 'module', node_id,
+ location=(self.env.docname, self.lineno))
+
+ # The node order is: index node first, then target node
+ indextext = _('%s (module)') % mod_name
+ inode = addnodes.index(entries=[('single', indextext, node_id, '', None)])
+ ret.append(inode)
+ target = nodes.target('', '', ids=[node_id], ismod=True)
+ self.state.document.note_explicit_target(target)
+ ret.append(target)
+ ret.extend(content_node.children)
+ return ret
+
+
+class JSXRefRole(XRefRole):
+ def process_link(self, env: BuildEnvironment, refnode: Element,
+ has_explicit_title: bool, title: str, target: str) -> tuple[str, str]:
+ # basically what sphinx.domains.python.PyXRefRole does
+ refnode['js:object'] = env.ref_context.get('js:object')
+ refnode['js:module'] = env.ref_context.get('js:module')
+ if not has_explicit_title:
+ title = title.lstrip('.')
+ target = target.lstrip('~')
+ if title[0:1] == '~':
+ title = title[1:]
+ dot = title.rfind('.')
+ if dot != -1:
+ title = title[dot + 1:]
+ if target[0:1] == '.':
+ target = target[1:]
+ refnode['refspecific'] = True
+ return title, target
+
+
+class JavaScriptDomain(Domain):
+ """JavaScript language domain."""
+ name = 'js'
+ label = 'JavaScript'
+ # if you add a new object type make sure to edit JSObject.get_index_string
+ object_types = {
+ 'function': ObjType(_('function'), 'func'),
+ 'method': ObjType(_('method'), 'meth'),
+ 'class': ObjType(_('class'), 'class'),
+ 'data': ObjType(_('data'), 'data'),
+ 'attribute': ObjType(_('attribute'), 'attr'),
+ 'module': ObjType(_('module'), 'mod'),
+ }
+ directives = {
+ 'function': JSCallable,
+ 'method': JSCallable,
+ 'class': JSConstructor,
+ 'data': JSObject,
+ 'attribute': JSObject,
+ 'module': JSModule,
+ }
+ roles = {
+ 'func': JSXRefRole(fix_parens=True),
+ 'meth': JSXRefRole(fix_parens=True),
+ 'class': JSXRefRole(fix_parens=True),
+ 'data': JSXRefRole(),
+ 'attr': JSXRefRole(),
+ 'mod': JSXRefRole(),
+ }
+ initial_data: dict[str, dict[str, tuple[str, str]]] = {
+ 'objects': {}, # fullname -> docname, node_id, objtype
+ 'modules': {}, # modname -> docname, node_id
+ }
+
+ @property
+ def objects(self) -> dict[str, tuple[str, str, str]]:
+ return self.data.setdefault('objects', {}) # fullname -> docname, node_id, objtype
+
+ def note_object(self, fullname: str, objtype: str, node_id: str,
+ location: Any = None) -> None:
+ if fullname in self.objects:
+ docname = self.objects[fullname][0]
+ logger.warning(__('duplicate %s description of %s, other %s in %s'),
+ objtype, fullname, objtype, docname, location=location)
+ self.objects[fullname] = (self.env.docname, node_id, objtype)
+
+ @property
+ def modules(self) -> dict[str, tuple[str, str]]:
+ return self.data.setdefault('modules', {}) # modname -> docname, node_id
+
+ def note_module(self, modname: str, node_id: str) -> None:
+ self.modules[modname] = (self.env.docname, node_id)
+
+ def clear_doc(self, docname: str) -> None:
+ for fullname, (pkg_docname, _node_id, _l) in list(self.objects.items()):
+ if pkg_docname == docname:
+ del self.objects[fullname]
+ for modname, (pkg_docname, _node_id) in list(self.modules.items()):
+ if pkg_docname == docname:
+ del self.modules[modname]
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
+ # XXX check duplicates
+ for fullname, (fn, node_id, objtype) in otherdata['objects'].items():
+ if fn in docnames:
+ self.objects[fullname] = (fn, node_id, objtype)
+ for mod_name, (pkg_docname, node_id) in otherdata['modules'].items():
+ if pkg_docname in docnames:
+ self.modules[mod_name] = (pkg_docname, node_id)
+
+ def find_obj(
+ self,
+ env: BuildEnvironment,
+ mod_name: str,
+ prefix: str,
+ name: str,
+ typ: str | None,
+ searchorder: int = 0,
+ ) -> tuple[str | None, tuple[str, str, str] | None]:
+ if name[-2:] == '()':
+ name = name[:-2]
+
+ searches = []
+ if mod_name and prefix:
+ searches.append('.'.join([mod_name, prefix, name]))
+ if mod_name:
+ searches.append('.'.join([mod_name, name]))
+ if prefix:
+ searches.append('.'.join([prefix, name]))
+ searches.append(name)
+
+ if searchorder == 0:
+ searches.reverse()
+
+ newname = None
+ object_ = None
+ for search_name in searches:
+ if search_name in self.objects:
+ newname = search_name
+ object_ = self.objects[search_name]
+
+ return newname, object_
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ mod_name = node.get('js:module')
+ prefix = node.get('js:object')
+ searchorder = 1 if node.hasattr('refspecific') else 0
+ name, obj = self.find_obj(env, mod_name, prefix, target, typ, searchorder)
+ if not obj:
+ return None
+ return make_refnode(builder, fromdocname, obj[0], obj[1], contnode, name)
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ mod_name = node.get('js:module')
+ prefix = node.get('js:object')
+ name, obj = self.find_obj(env, mod_name, prefix, target, None, 1)
+ if not obj:
+ return []
+ return [('js:' + self.role_for_objtype(obj[2]), # type: ignore[operator]
+ make_refnode(builder, fromdocname, obj[0], obj[1], contnode, name))]
+
+ def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]:
+ for refname, (docname, node_id, typ) in list(self.objects.items()):
+ yield refname, refname, typ, docname, node_id, 1
+
+ def get_full_qualified_name(self, node: Element) -> str | None:
+ modname = node.get('js:module')
+ prefix = node.get('js:object')
+ target = node.get('reftarget')
+ if target is None:
+ return None
+ else:
+ return '.'.join(filter(None, [modname, prefix, target]))
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(JavaScriptDomain)
+ app.add_config_value(
+ 'javascript_maximum_signature_line_length', None, 'env', types={int, None},
+ )
+ return {
+ 'version': 'builtin',
+ 'env_version': 3,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/math.py b/sphinx/domains/math.py
new file mode 100644
index 0000000..d283d3f
--- /dev/null
+++ b/sphinx/domains/math.py
@@ -0,0 +1,152 @@
+"""The math domain."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.nodes import Element, Node, make_id, system_message
+
+from sphinx.domains import Domain
+from sphinx.locale import __
+from sphinx.roles import XRefRole
+from sphinx.util import logging
+from sphinx.util.nodes import make_refnode
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+
+ from sphinx.addnodes import pending_xref
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+
+
+logger = logging.getLogger(__name__)
+
+
+class MathReferenceRole(XRefRole):
+ def result_nodes(self, document: nodes.document, env: BuildEnvironment, node: Element,
+ is_ref: bool) -> tuple[list[Node], list[system_message]]:
+ node['refdomain'] = 'math'
+ return [node], []
+
+
+class MathDomain(Domain):
+ """Mathematics domain."""
+ name = 'math'
+ label = 'mathematics'
+
+ initial_data: dict[str, Any] = {
+ 'objects': {}, # labelid -> (docname, eqno)
+ 'has_equations': {}, # docname -> bool
+ }
+ dangling_warnings = {
+ 'eq': 'equation not found: %(target)s',
+ }
+ enumerable_nodes = { # node_class -> (figtype, title_getter)
+ nodes.math_block: ('displaymath', None),
+ }
+ roles = {
+ 'numref': MathReferenceRole(),
+ }
+
+ @property
+ def equations(self) -> dict[str, tuple[str, int]]:
+ return self.data.setdefault('objects', {}) # labelid -> (docname, eqno)
+
+ def note_equation(self, docname: str, labelid: str, location: Any = None) -> None:
+ if labelid in self.equations:
+ other = self.equations[labelid][0]
+ logger.warning(__('duplicate label of equation %s, other instance in %s') %
+ (labelid, other), location=location)
+
+ self.equations[labelid] = (docname, self.env.new_serialno('eqno') + 1)
+
+ def get_equation_number_for(self, labelid: str) -> int | None:
+ if labelid in self.equations:
+ return self.equations[labelid][1]
+ else:
+ return None
+
+ def process_doc(self, env: BuildEnvironment, docname: str,
+ document: nodes.document) -> None:
+ def math_node(node: Node) -> bool:
+ return isinstance(node, (nodes.math, nodes.math_block))
+
+ self.data['has_equations'][docname] = any(document.findall(math_node))
+
+ def clear_doc(self, docname: str) -> None:
+ for equation_id, (doc, _eqno) in list(self.equations.items()):
+ if doc == docname:
+ del self.equations[equation_id]
+
+ self.data['has_equations'].pop(docname, None)
+
+ def merge_domaindata(self, docnames: Iterable[str], otherdata: dict[str, Any]) -> None:
+ for labelid, (doc, eqno) in otherdata['objects'].items():
+ if doc in docnames:
+ self.equations[labelid] = (doc, eqno)
+
+ for docname in docnames:
+ self.data['has_equations'][docname] = otherdata['has_equations'][docname]
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ assert typ in ('eq', 'numref')
+ result = self.equations.get(target)
+ if result:
+ docname, number = result
+ # TODO: perhaps use rather a sphinx-core provided prefix here?
+ node_id = make_id('equation-%s' % target)
+ if env.config.math_numfig and env.config.numfig:
+ if docname in env.toc_fignumbers:
+ numbers = env.toc_fignumbers[docname]['displaymath'].get(node_id, ())
+ eqno = '.'.join(map(str, numbers))
+ else:
+ eqno = ''
+ else:
+ eqno = str(number)
+
+ try:
+ eqref_format = env.config.math_eqref_format or "({number})"
+ title = nodes.Text(eqref_format.format(number=eqno))
+ except KeyError as exc:
+ logger.warning(__('Invalid math_eqref_format: %r'), exc,
+ location=node)
+ title = nodes.Text("(%d)" % number)
+ title = nodes.Text("(%d)" % number)
+ return make_refnode(builder, fromdocname, docname, node_id, title)
+ else:
+ return None
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ refnode = self.resolve_xref(env, fromdocname, builder, 'eq', target, node, contnode)
+ if refnode is None:
+ return []
+ else:
+ return [('eq', refnode)]
+
+ def get_objects(self) -> Iterable[tuple[str, str, str, str, str, int]]:
+ return []
+
+ def has_equations(self, docname: str | None = None) -> bool:
+ if docname:
+ return self.data['has_equations'].get(docname, False)
+ else:
+ return any(self.data['has_equations'].values())
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(MathDomain)
+ app.add_role('eq', MathReferenceRole(warn_dangling=True))
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 2,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py
new file mode 100644
index 0000000..930f8e7
--- /dev/null
+++ b/sphinx/domains/python.py
@@ -0,0 +1,1769 @@
+"""The Python domain."""
+
+from __future__ import annotations
+
+import ast
+import builtins
+import contextlib
+import inspect
+import re
+import token
+import typing
+from inspect import Parameter
+from typing import TYPE_CHECKING, Any, NamedTuple, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.addnodes import desc_signature, pending_xref, pending_xref_condition
+from sphinx.directives import ObjectDescription
+from sphinx.domains import Domain, Index, IndexEntry, ObjType
+from sphinx.locale import _, __
+from sphinx.pycode.parser import Token, TokenProcessor
+from sphinx.roles import XRefRole
+from sphinx.util import logging
+from sphinx.util.docfields import Field, GroupedField, TypedField
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.inspect import signature_from_str
+from sphinx.util.nodes import (
+ find_pending_xref_condition,
+ make_id,
+ make_refnode,
+ nested_parse_with_titles,
+)
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Iterator
+
+ from docutils.nodes import Element, Node
+ from docutils.parsers.rst.states import Inliner
+
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec, TextlikeNode
+
+logger = logging.getLogger(__name__)
+
+
+# REs for Python signatures
+py_sig_re = re.compile(
+ r'''^ ([\w.]*\.)? # class name(s)
+ (\w+) \s* # thing name
+ (?: \[\s*(.*)\s*])? # optional: type parameters list
+ (?: \(\s*(.*)\s*\) # optional: arguments
+ (?:\s* -> \s* (.*))? # return annotation
+ )? $ # and nothing more
+ ''', re.VERBOSE)
+
+
+pairindextypes = {
+ 'module': 'module',
+ 'keyword': 'keyword',
+ 'operator': 'operator',
+ 'object': 'object',
+ 'exception': 'exception',
+ 'statement': 'statement',
+ 'builtin': 'built-in function',
+}
+
+
+class ObjectEntry(NamedTuple):
+ docname: str
+ node_id: str
+ objtype: str
+ aliased: bool
+
+
+class ModuleEntry(NamedTuple):
+ docname: str
+ node_id: str
+ synopsis: str
+ platform: str
+ deprecated: bool
+
+
+def parse_reftarget(reftarget: str, suppress_prefix: bool = False,
+ ) -> tuple[str, str, str, bool]:
+ """Parse a type string and return (reftype, reftarget, title, refspecific flag)"""
+ refspecific = False
+ if reftarget.startswith('.'):
+ reftarget = reftarget[1:]
+ title = reftarget
+ refspecific = True
+ elif reftarget.startswith('~'):
+ reftarget = reftarget[1:]
+ title = reftarget.split('.')[-1]
+ elif suppress_prefix:
+ title = reftarget.split('.')[-1]
+ elif reftarget.startswith('typing.'):
+ title = reftarget[7:]
+ else:
+ title = reftarget
+
+ if reftarget == 'None' or reftarget.startswith('typing.'):
+ # typing module provides non-class types. Obj reference is good to refer them.
+ reftype = 'obj'
+ else:
+ reftype = 'class'
+
+ return reftype, reftarget, title, refspecific
+
+
+def type_to_xref(target: str, env: BuildEnvironment, *,
+ suppress_prefix: bool = False) -> addnodes.pending_xref:
+ """Convert a type string to a cross reference node."""
+ if env:
+ kwargs = {'py:module': env.ref_context.get('py:module'),
+ 'py:class': env.ref_context.get('py:class')}
+ else:
+ kwargs = {}
+
+ reftype, target, title, refspecific = parse_reftarget(target, suppress_prefix)
+
+ if env.config.python_use_unqualified_type_names:
+ # Note: It would be better to use qualname to describe the object to support support
+ # nested classes. But python domain can't access the real python object because this
+ # module should work not-dynamically.
+ shortname = title.split('.')[-1]
+ contnodes: list[Node] = [pending_xref_condition('', shortname, condition='resolved'),
+ pending_xref_condition('', title, condition='*')]
+ else:
+ contnodes = [nodes.Text(title)]
+
+ return pending_xref('', *contnodes,
+ refdomain='py', reftype=reftype, reftarget=target,
+ refspecific=refspecific, **kwargs)
+
+
+def _parse_annotation(annotation: str, env: BuildEnvironment) -> list[Node]:
+ """Parse type annotation."""
+ short_literals = env.config.python_display_short_literal_types
+
+ def unparse(node: ast.AST) -> list[Node]:
+ if isinstance(node, ast.Attribute):
+ return [nodes.Text(f"{unparse(node.value)[0]}.{node.attr}")]
+ if isinstance(node, ast.BinOp):
+ result: list[Node] = unparse(node.left)
+ result.extend(unparse(node.op))
+ result.extend(unparse(node.right))
+ return result
+ if isinstance(node, ast.BitOr):
+ return [addnodes.desc_sig_space(),
+ addnodes.desc_sig_punctuation('', '|'),
+ addnodes.desc_sig_space()]
+ if isinstance(node, ast.Constant):
+ if node.value is Ellipsis:
+ return [addnodes.desc_sig_punctuation('', "...")]
+ if isinstance(node.value, bool):
+ return [addnodes.desc_sig_keyword('', repr(node.value))]
+ if isinstance(node.value, int):
+ return [addnodes.desc_sig_literal_number('', repr(node.value))]
+ if isinstance(node.value, str):
+ return [addnodes.desc_sig_literal_string('', repr(node.value))]
+ else:
+ # handles None, which is further handled by type_to_xref later
+ # and fallback for other types that should be converted
+ return [nodes.Text(repr(node.value))]
+ if isinstance(node, ast.Expr):
+ return unparse(node.value)
+ if isinstance(node, ast.Invert):
+ return [addnodes.desc_sig_punctuation('', '~')]
+ if isinstance(node, ast.List):
+ result = [addnodes.desc_sig_punctuation('', '[')]
+ if node.elts:
+ # check if there are elements in node.elts to only pop the
+ # last element of result if the for-loop was run at least
+ # once
+ for elem in node.elts:
+ result.extend(unparse(elem))
+ result.append(addnodes.desc_sig_punctuation('', ','))
+ result.append(addnodes.desc_sig_space())
+ result.pop()
+ result.pop()
+ result.append(addnodes.desc_sig_punctuation('', ']'))
+ return result
+ if isinstance(node, ast.Module):
+ return sum((unparse(e) for e in node.body), [])
+ if isinstance(node, ast.Name):
+ return [nodes.Text(node.id)]
+ if isinstance(node, ast.Subscript):
+ if getattr(node.value, 'id', '') in {'Optional', 'Union'}:
+ return _unparse_pep_604_annotation(node)
+ if short_literals and getattr(node.value, 'id', '') == 'Literal':
+ return _unparse_pep_604_annotation(node)
+ result = unparse(node.value)
+ result.append(addnodes.desc_sig_punctuation('', '['))
+ result.extend(unparse(node.slice))
+ result.append(addnodes.desc_sig_punctuation('', ']'))
+
+ # Wrap the Text nodes inside brackets by literal node if the subscript is a Literal
+ if result[0] in ('Literal', 'typing.Literal'):
+ for i, subnode in enumerate(result[1:], start=1):
+ if isinstance(subnode, nodes.Text):
+ result[i] = nodes.literal('', '', subnode)
+ return result
+ if isinstance(node, ast.UnaryOp):
+ return unparse(node.op) + unparse(node.operand)
+ if isinstance(node, ast.Tuple):
+ if node.elts:
+ result = []
+ for elem in node.elts:
+ result.extend(unparse(elem))
+ result.append(addnodes.desc_sig_punctuation('', ','))
+ result.append(addnodes.desc_sig_space())
+ result.pop()
+ result.pop()
+ else:
+ result = [addnodes.desc_sig_punctuation('', '('),
+ addnodes.desc_sig_punctuation('', ')')]
+
+ return result
+ raise SyntaxError # unsupported syntax
+
+ def _unparse_pep_604_annotation(node: ast.Subscript) -> list[Node]:
+ subscript = node.slice
+
+ flattened: list[Node] = []
+ if isinstance(subscript, ast.Tuple):
+ flattened.extend(unparse(subscript.elts[0]))
+ for elt in subscript.elts[1:]:
+ flattened.extend(unparse(ast.BitOr()))
+ flattened.extend(unparse(elt))
+ else:
+ # e.g. a Union[] inside an Optional[]
+ flattened.extend(unparse(subscript))
+
+ if getattr(node.value, 'id', '') == 'Optional':
+ flattened.extend(unparse(ast.BitOr()))
+ flattened.append(nodes.Text('None'))
+
+ return flattened
+
+ try:
+ tree = ast.parse(annotation, type_comments=True)
+ result: list[Node] = []
+ for node in unparse(tree):
+ if isinstance(node, nodes.literal):
+ result.append(node[0])
+ elif isinstance(node, nodes.Text) and node.strip():
+ if (result and isinstance(result[-1], addnodes.desc_sig_punctuation) and
+ result[-1].astext() == '~'):
+ result.pop()
+ result.append(type_to_xref(str(node), env, suppress_prefix=True))
+ else:
+ result.append(type_to_xref(str(node), env))
+ else:
+ result.append(node)
+ return result
+ except SyntaxError:
+ return [type_to_xref(annotation, env)]
+
+
+class _TypeParameterListParser(TokenProcessor):
+ def __init__(self, sig: str) -> None:
+ signature = sig.replace('\n', '').strip()
+ super().__init__([signature])
+ # Each item is a tuple (name, kind, default, annotation) mimicking
+ # ``inspect.Parameter`` to allow default values on VAR_POSITIONAL
+ # or VAR_KEYWORD parameters.
+ self.type_params: list[tuple[str, int, Any, Any]] = []
+
+ def fetch_type_param_spec(self) -> list[Token]:
+ tokens = []
+ while current := self.fetch_token():
+ tokens.append(current)
+ for ldelim, rdelim in ('(', ')'), ('{', '}'), ('[', ']'):
+ if current == [token.OP, ldelim]:
+ tokens += self.fetch_until([token.OP, rdelim])
+ break
+ else:
+ if current == token.INDENT:
+ tokens += self.fetch_until(token.DEDENT)
+ elif current.match(
+ [token.OP, ':'], [token.OP, '='], [token.OP, ',']):
+ tokens.pop()
+ break
+ return tokens
+
+ def parse(self) -> None:
+ while current := self.fetch_token():
+ if current == token.NAME:
+ tp_name = current.value.strip()
+ if self.previous and self.previous.match([token.OP, '*'], [token.OP, '**']):
+ if self.previous == [token.OP, '*']:
+ tp_kind = Parameter.VAR_POSITIONAL
+ else:
+ tp_kind = Parameter.VAR_KEYWORD # type: ignore[assignment]
+ else:
+ tp_kind = Parameter.POSITIONAL_OR_KEYWORD # type: ignore[assignment]
+
+ tp_ann: Any = Parameter.empty
+ tp_default: Any = Parameter.empty
+
+ current = self.fetch_token()
+ if current and current.match([token.OP, ':'], [token.OP, '=']):
+ if current == [token.OP, ':']:
+ tokens = self.fetch_type_param_spec()
+ tp_ann = self._build_identifier(tokens)
+
+ if self.current and self.current == [token.OP, '=']:
+ tokens = self.fetch_type_param_spec()
+ tp_default = self._build_identifier(tokens)
+
+ if tp_kind != Parameter.POSITIONAL_OR_KEYWORD and tp_ann != Parameter.empty:
+ msg = ('type parameter bound or constraint is not allowed '
+ f'for {tp_kind.description} parameters')
+ raise SyntaxError(msg)
+
+ type_param = (tp_name, tp_kind, tp_default, tp_ann)
+ self.type_params.append(type_param)
+
+ def _build_identifier(self, tokens: list[Token]) -> str:
+ from itertools import chain, tee
+
+ def pairwise(iterable):
+ a, b = tee(iterable)
+ next(b, None)
+ return zip(a, b)
+
+ def triplewise(iterable):
+ for (a, _z), (b, c) in pairwise(pairwise(iterable)):
+ yield a, b, c
+
+ idents: list[str] = []
+ tokens: Iterable[Token] = iter(tokens) # type: ignore[no-redef]
+ # do not format opening brackets
+ for tok in tokens:
+ if not tok.match([token.OP, '('], [token.OP, '['], [token.OP, '{']):
+ # check if the first non-delimiter character is an unpack operator
+ is_unpack_operator = tok.match([token.OP, '*'], [token.OP, ['**']])
+ idents.append(self._pformat_token(tok, native=is_unpack_operator))
+ break
+ idents.append(tok.value)
+
+ # check the remaining tokens
+ stop = Token(token.ENDMARKER, '', (-1, -1), (-1, -1), '<sentinel>')
+ is_unpack_operator = False
+ for tok, op, after in triplewise(chain(tokens, [stop, stop])):
+ ident = self._pformat_token(tok, native=is_unpack_operator)
+ idents.append(ident)
+ # determine if the next token is an unpack operator depending
+ # on the left and right hand side of the operator symbol
+ is_unpack_operator = (
+ op.match([token.OP, '*'], [token.OP, '**']) and not (
+ tok.match(token.NAME, token.NUMBER, token.STRING,
+ [token.OP, ')'], [token.OP, ']'], [token.OP, '}'])
+ and after.match(token.NAME, token.NUMBER, token.STRING,
+ [token.OP, '('], [token.OP, '['], [token.OP, '{'])
+ )
+ )
+
+ return ''.join(idents).strip()
+
+ def _pformat_token(self, tok: Token, native: bool = False) -> str:
+ if native:
+ return tok.value
+
+ if tok.match(token.NEWLINE, token.ENDMARKER):
+ return ''
+
+ if tok.match([token.OP, ':'], [token.OP, ','], [token.OP, '#']):
+ return f'{tok.value} '
+
+ # Arithmetic operators are allowed because PEP 695 specifies the
+ # default type parameter to be *any* expression (so "T1 << T2" is
+ # allowed if it makes sense). The caller is responsible to ensure
+ # that a multiplication operator ("*") is not to be confused with
+ # an unpack operator (which will not be surrounded by spaces).
+ #
+ # The operators are ordered according to how likely they are to
+ # be used and for (possible) future implementations (e.g., "&" for
+ # an intersection type).
+ if tok.match(
+ # Most likely operators to appear
+ [token.OP, '='], [token.OP, '|'],
+ # Type composition (future compatibility)
+ [token.OP, '&'], [token.OP, '^'], [token.OP, '<'], [token.OP, '>'],
+ # Unlikely type composition
+ [token.OP, '+'], [token.OP, '-'], [token.OP, '*'], [token.OP, '**'],
+ # Unlikely operators but included for completeness
+ [token.OP, '@'], [token.OP, '/'], [token.OP, '//'], [token.OP, '%'],
+ [token.OP, '<<'], [token.OP, '>>'], [token.OP, '>>>'],
+ [token.OP, '<='], [token.OP, '>='], [token.OP, '=='], [token.OP, '!='],
+ ):
+ return f' {tok.value} '
+
+ return tok.value
+
+
+def _parse_type_list(
+ tp_list: str, env: BuildEnvironment,
+ multi_line_parameter_list: bool = False,
+) -> addnodes.desc_type_parameter_list:
+ """Parse a list of type parameters according to PEP 695."""
+ type_params = addnodes.desc_type_parameter_list(tp_list)
+ type_params['multi_line_parameter_list'] = multi_line_parameter_list
+ # formal parameter names are interpreted as type parameter names and
+ # type annotations are interpreted as type parameter bound or constraints
+ parser = _TypeParameterListParser(tp_list)
+ parser.parse()
+ for (tp_name, tp_kind, tp_default, tp_ann) in parser.type_params:
+ # no positional-only or keyword-only allowed in a type parameters list
+ if tp_kind in {Parameter.POSITIONAL_ONLY, Parameter.KEYWORD_ONLY}:
+ msg = ('positional-only or keyword-only parameters '
+ 'are prohibited in type parameter lists')
+ raise SyntaxError(msg)
+
+ node = addnodes.desc_type_parameter()
+ if tp_kind == Parameter.VAR_POSITIONAL:
+ node += addnodes.desc_sig_operator('', '*')
+ elif tp_kind == Parameter.VAR_KEYWORD:
+ node += addnodes.desc_sig_operator('', '**')
+ node += addnodes.desc_sig_name('', tp_name)
+
+ if tp_ann is not Parameter.empty:
+ annotation = _parse_annotation(tp_ann, env)
+ if not annotation:
+ continue
+
+ node += addnodes.desc_sig_punctuation('', ':')
+ node += addnodes.desc_sig_space()
+
+ type_ann_expr = addnodes.desc_sig_name('', '',
+ *annotation) # type: ignore[arg-type]
+ # a type bound is ``T: U`` whereas type constraints
+ # must be enclosed with parentheses. ``T: (U, V)``
+ if tp_ann.startswith('(') and tp_ann.endswith(')'):
+ type_ann_text = type_ann_expr.astext()
+ if type_ann_text.startswith('(') and type_ann_text.endswith(')'):
+ node += type_ann_expr
+ else:
+ # surrounding braces are lost when using _parse_annotation()
+ node += addnodes.desc_sig_punctuation('', '(')
+ node += type_ann_expr # type constraint
+ node += addnodes.desc_sig_punctuation('', ')')
+ else:
+ node += type_ann_expr # type bound
+
+ if tp_default is not Parameter.empty:
+ # Always surround '=' with spaces, even if there is no annotation
+ node += addnodes.desc_sig_space()
+ node += addnodes.desc_sig_operator('', '=')
+ node += addnodes.desc_sig_space()
+ node += nodes.inline('', tp_default,
+ classes=['default_value'],
+ support_smartquotes=False)
+
+ type_params += node
+ return type_params
+
+
+def _parse_arglist(
+ arglist: str, env: BuildEnvironment, multi_line_parameter_list: bool = False,
+) -> addnodes.desc_parameterlist:
+ """Parse a list of arguments using AST parser"""
+ params = addnodes.desc_parameterlist(arglist)
+ params['multi_line_parameter_list'] = multi_line_parameter_list
+ sig = signature_from_str('(%s)' % arglist)
+ last_kind = None
+ for param in sig.parameters.values():
+ if param.kind != param.POSITIONAL_ONLY and last_kind == param.POSITIONAL_ONLY:
+ # PEP-570: Separator for Positional Only Parameter: /
+ params += addnodes.desc_parameter('', '', addnodes.desc_sig_operator('', '/'))
+ if param.kind == param.KEYWORD_ONLY and last_kind in (param.POSITIONAL_OR_KEYWORD,
+ param.POSITIONAL_ONLY,
+ None):
+ # PEP-3102: Separator for Keyword Only Parameter: *
+ params += addnodes.desc_parameter('', '', addnodes.desc_sig_operator('', '*'))
+
+ node = addnodes.desc_parameter()
+ if param.kind == param.VAR_POSITIONAL:
+ node += addnodes.desc_sig_operator('', '*')
+ node += addnodes.desc_sig_name('', param.name)
+ elif param.kind == param.VAR_KEYWORD:
+ node += addnodes.desc_sig_operator('', '**')
+ node += addnodes.desc_sig_name('', param.name)
+ else:
+ node += addnodes.desc_sig_name('', param.name)
+
+ if param.annotation is not param.empty:
+ children = _parse_annotation(param.annotation, env)
+ node += addnodes.desc_sig_punctuation('', ':')
+ node += addnodes.desc_sig_space()
+ node += addnodes.desc_sig_name('', '', *children) # type: ignore[arg-type]
+ if param.default is not param.empty:
+ if param.annotation is not param.empty:
+ node += addnodes.desc_sig_space()
+ node += addnodes.desc_sig_operator('', '=')
+ node += addnodes.desc_sig_space()
+ else:
+ node += addnodes.desc_sig_operator('', '=')
+ node += nodes.inline('', param.default, classes=['default_value'],
+ support_smartquotes=False)
+
+ params += node
+ last_kind = param.kind
+
+ if last_kind == Parameter.POSITIONAL_ONLY:
+ # PEP-570: Separator for Positional Only Parameter: /
+ params += addnodes.desc_parameter('', '', addnodes.desc_sig_operator('', '/'))
+
+ return params
+
+
+def _pseudo_parse_arglist(
+ signode: desc_signature, arglist: str, multi_line_parameter_list: bool = False,
+) -> None:
+ """"Parse" a list of arguments separated by commas.
+
+ Arguments can have "optional" annotations given by enclosing them in
+ brackets. Currently, this will split at any comma, even if it's inside a
+ string literal (e.g. default argument value).
+ """
+ paramlist = addnodes.desc_parameterlist()
+ paramlist['multi_line_parameter_list'] = multi_line_parameter_list
+ stack: list[Element] = [paramlist]
+ try:
+ for argument in arglist.split(','):
+ argument = argument.strip()
+ ends_open = ends_close = 0
+ while argument.startswith('['):
+ stack.append(addnodes.desc_optional())
+ stack[-2] += stack[-1]
+ argument = argument[1:].strip()
+ while argument.startswith(']'):
+ stack.pop()
+ argument = argument[1:].strip()
+ while argument.endswith(']') and not argument.endswith('[]'):
+ ends_close += 1
+ argument = argument[:-1].strip()
+ while argument.endswith('['):
+ ends_open += 1
+ argument = argument[:-1].strip()
+ if argument:
+ stack[-1] += addnodes.desc_parameter(
+ '', '', addnodes.desc_sig_name(argument, argument))
+ while ends_open:
+ stack.append(addnodes.desc_optional())
+ stack[-2] += stack[-1]
+ ends_open -= 1
+ while ends_close:
+ stack.pop()
+ ends_close -= 1
+ if len(stack) != 1:
+ raise IndexError
+ except IndexError:
+ # if there are too few or too many elements on the stack, just give up
+ # and treat the whole argument list as one argument, discarding the
+ # already partially populated paramlist node
+ paramlist = addnodes.desc_parameterlist()
+ paramlist += addnodes.desc_parameter(arglist, arglist)
+ signode += paramlist
+ else:
+ signode += paramlist
+
+
+# This override allows our inline type specifiers to behave like :class: link
+# when it comes to handling "." and "~" prefixes.
+class PyXrefMixin:
+ def make_xref(
+ self,
+ rolename: str,
+ domain: str,
+ target: str,
+ innernode: type[TextlikeNode] = nodes.emphasis,
+ contnode: Node | None = None,
+ env: BuildEnvironment | None = None,
+ inliner: Inliner | None = None,
+ location: Node | None = None,
+ ) -> Node:
+ # we use inliner=None to make sure we get the old behaviour with a single
+ # pending_xref node
+ result = super().make_xref(rolename, domain, target, # type: ignore[misc]
+ innernode, contnode,
+ env, inliner=None, location=None)
+ if isinstance(result, pending_xref):
+ assert env is not None
+ result['refspecific'] = True
+ result['py:module'] = env.ref_context.get('py:module')
+ result['py:class'] = env.ref_context.get('py:class')
+
+ reftype, reftarget, reftitle, _ = parse_reftarget(target)
+ if reftarget != reftitle:
+ result['reftype'] = reftype
+ result['reftarget'] = reftarget
+
+ result.clear()
+ result += innernode(reftitle, reftitle)
+ elif env.config.python_use_unqualified_type_names:
+ children = result.children
+ result.clear()
+
+ shortname = target.split('.')[-1]
+ textnode = innernode('', shortname)
+ contnodes = [pending_xref_condition('', '', textnode, condition='resolved'),
+ pending_xref_condition('', '', *children, condition='*')]
+ result.extend(contnodes)
+
+ return result
+
+ def make_xrefs(
+ self,
+ rolename: str,
+ domain: str,
+ target: str,
+ innernode: type[TextlikeNode] = nodes.emphasis,
+ contnode: Node | None = None,
+ env: BuildEnvironment | None = None,
+ inliner: Inliner | None = None,
+ location: Node | None = None,
+ ) -> list[Node]:
+ delims = r'(\s*[\[\]\(\),](?:\s*o[rf]\s)?\s*|\s+o[rf]\s+|\s*\|\s*|\.\.\.)'
+ delims_re = re.compile(delims)
+ sub_targets = re.split(delims, target)
+
+ split_contnode = bool(contnode and contnode.astext() == target)
+
+ in_literal = False
+ results = []
+ for sub_target in filter(None, sub_targets):
+ if split_contnode:
+ contnode = nodes.Text(sub_target)
+
+ if in_literal or delims_re.match(sub_target):
+ results.append(contnode or innernode(sub_target, sub_target))
+ else:
+ results.append(self.make_xref(rolename, domain, sub_target,
+ innernode, contnode, env, inliner, location))
+
+ if sub_target in ('Literal', 'typing.Literal', '~typing.Literal'):
+ in_literal = True
+
+ return results
+
+
+class PyField(PyXrefMixin, Field):
+ pass
+
+
+class PyGroupedField(PyXrefMixin, GroupedField):
+ pass
+
+
+class PyTypedField(PyXrefMixin, TypedField):
+ pass
+
+
+class PyObject(ObjectDescription[tuple[str, str]]):
+ """
+ Description of a general Python object.
+
+ :cvar allow_nesting: Class is an object that allows for nested namespaces
+ :vartype allow_nesting: bool
+ """
+ option_spec: OptionSpec = {
+ 'no-index': directives.flag,
+ 'no-index-entry': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindex': directives.flag,
+ 'noindexentry': directives.flag,
+ 'nocontentsentry': directives.flag,
+ 'single-line-parameter-list': directives.flag,
+ 'single-line-type-parameter-list': directives.flag,
+ 'module': directives.unchanged,
+ 'canonical': directives.unchanged,
+ 'annotation': directives.unchanged,
+ }
+
+ doc_field_types = [
+ PyTypedField('parameter', label=_('Parameters'),
+ names=('param', 'parameter', 'arg', 'argument',
+ 'keyword', 'kwarg', 'kwparam'),
+ typerolename='class', typenames=('paramtype', 'type'),
+ can_collapse=True),
+ PyTypedField('variable', label=_('Variables'),
+ names=('var', 'ivar', 'cvar'),
+ typerolename='class', typenames=('vartype',),
+ can_collapse=True),
+ PyGroupedField('exceptions', label=_('Raises'), rolename='exc',
+ names=('raises', 'raise', 'exception', 'except'),
+ can_collapse=True),
+ Field('returnvalue', label=_('Returns'), has_arg=False,
+ names=('returns', 'return')),
+ PyField('returntype', label=_('Return type'), has_arg=False,
+ names=('rtype',), bodyrolename='class'),
+ ]
+
+ allow_nesting = False
+
+ def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
+ """May return a prefix to put before the object name in the
+ signature.
+ """
+ return []
+
+ def needs_arglist(self) -> bool:
+ """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: str, signode: desc_signature) -> tuple[str, str]:
+ """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
+ * it is added to the full name (return value) if not present
+ """
+ m = py_sig_re.match(sig)
+ if m is None:
+ raise ValueError
+ prefix, name, tp_list, arglist, retann = m.groups()
+
+ # determine module and class name (if applicable), as well as full name
+ modname = self.options.get('module', self.env.ref_context.get('py:module'))
+ classname = self.env.ref_context.get('py:class')
+ if classname:
+ add_module = False
+ if prefix and (prefix == classname or
+ prefix.startswith(classname + ".")):
+ fullname = prefix + name
+ # class name is given again in the signature
+ prefix = prefix[len(classname):].lstrip('.')
+ elif prefix:
+ # class name is given in the signature, but different
+ # (shouldn't happen)
+ fullname = classname + '.' + prefix + name
+ else:
+ # class name is not given in the signature
+ fullname = classname + '.' + name
+ else:
+ add_module = True
+ if prefix:
+ classname = prefix.rstrip('.')
+ fullname = prefix + name
+ else:
+ classname = ''
+ fullname = name
+
+ signode['module'] = modname
+ signode['class'] = classname
+ signode['fullname'] = fullname
+
+ max_len = (self.env.config.python_maximum_signature_line_length
+ or self.env.config.maximum_signature_line_length
+ or 0)
+
+ # determine if the function arguments (without its type parameters)
+ # should be formatted on a multiline or not by removing the width of
+ # the type parameters list (if any)
+ sig_len = len(sig)
+ tp_list_span = m.span(3)
+ multi_line_parameter_list = (
+ 'single-line-parameter-list' not in self.options
+ and (sig_len - (tp_list_span[1] - tp_list_span[0])) > max_len > 0
+ )
+
+ # determine whether the type parameter list must be wrapped or not
+ arglist_span = m.span(4)
+ multi_line_type_parameter_list = (
+ 'single-line-type-parameter-list' not in self.options
+ and (sig_len - (arglist_span[1] - arglist_span[0])) > max_len > 0
+ )
+
+ sig_prefix = self.get_signature_prefix(sig)
+ if sig_prefix:
+ if type(sig_prefix) is str:
+ msg = ("Python directive method get_signature_prefix()"
+ " must return a list of nodes."
+ f" Return value was '{sig_prefix}'.")
+ raise TypeError(msg)
+ signode += addnodes.desc_annotation(str(sig_prefix), '', *sig_prefix)
+
+ if prefix:
+ signode += addnodes.desc_addname(prefix, prefix)
+ elif modname and add_module and self.env.config.add_module_names:
+ nodetext = modname + '.'
+ signode += addnodes.desc_addname(nodetext, nodetext)
+
+ signode += addnodes.desc_name(name, name)
+
+ if tp_list:
+ try:
+ signode += _parse_type_list(tp_list, self.env, multi_line_type_parameter_list)
+ except Exception as exc:
+ logger.warning("could not parse tp_list (%r): %s", tp_list, exc,
+ location=signode)
+
+ if arglist:
+ try:
+ signode += _parse_arglist(arglist, self.env, multi_line_parameter_list)
+ except SyntaxError:
+ # fallback to parse arglist original parser
+ # (this may happen if the argument list is incorrectly used
+ # as a list of bases when documenting a class)
+ # it supports to represent optional arguments (ex. "func(foo [, bar])")
+ _pseudo_parse_arglist(signode, arglist, multi_line_parameter_list)
+ except (NotImplementedError, ValueError) as exc:
+ # duplicated parameter names raise ValueError and not a SyntaxError
+ logger.warning("could not parse arglist (%r): %s", arglist, exc,
+ location=signode)
+ _pseudo_parse_arglist(signode, arglist, multi_line_parameter_list)
+ else:
+ if self.needs_arglist():
+ # for callables, add an empty parameter list
+ signode += addnodes.desc_parameterlist()
+
+ if retann:
+ children = _parse_annotation(retann, self.env)
+ signode += addnodes.desc_returns(retann, '', *children)
+
+ anno = self.options.get('annotation')
+ if anno:
+ signode += addnodes.desc_annotation(' ' + anno, '',
+ addnodes.desc_sig_space(),
+ nodes.Text(anno))
+
+ return fullname, prefix
+
+ def _object_hierarchy_parts(self, sig_node: desc_signature) -> tuple[str, ...]:
+ if 'fullname' not in sig_node:
+ return ()
+ modname = sig_node.get('module')
+ fullname = sig_node['fullname']
+
+ if modname:
+ return (modname, *fullname.split('.'))
+ else:
+ return tuple(fullname.split('.'))
+
+ def get_index_text(self, modname: str, name: tuple[str, str]) -> str:
+ """Return the text for the index entry of the object."""
+ msg = 'must be implemented in subclasses'
+ raise NotImplementedError(msg)
+
+ def add_target_and_index(self, name_cls: tuple[str, str], sig: str,
+ signode: desc_signature) -> None:
+ modname = self.options.get('module', self.env.ref_context.get('py:module'))
+ fullname = (modname + '.' if modname else '') + name_cls[0]
+ node_id = make_id(self.env, self.state.document, '', fullname)
+ signode['ids'].append(node_id)
+ self.state.document.note_explicit_target(signode)
+
+ domain = cast(PythonDomain, self.env.get_domain('py'))
+ domain.note_object(fullname, self.objtype, node_id, location=signode)
+
+ canonical_name = self.options.get('canonical')
+ if canonical_name:
+ domain.note_object(canonical_name, self.objtype, node_id, aliased=True,
+ location=signode)
+
+ if 'no-index-entry' not in self.options:
+ indextext = self.get_index_text(modname, name_cls)
+ if indextext:
+ self.indexnode['entries'].append(('single', indextext, node_id, '', None))
+
+ def before_content(self) -> None:
+ """Handle object nesting before content
+
+ :py:class:`PyObject` represents Python language constructs. For
+ constructs that are nestable, such as a Python classes, this method will
+ build up a stack of the nesting hierarchy so that it can be later
+ de-nested correctly, in :py:meth:`after_content`.
+
+ For constructs that aren't nestable, the stack is bypassed, and instead
+ only the most recent object is tracked. This object prefix name will be
+ removed with :py:meth:`after_content`.
+ """
+ prefix = None
+ if self.names:
+ # fullname and name_prefix come from the `handle_signature` method.
+ # fullname represents the full object name that is constructed using
+ # object nesting and explicit prefixes. `name_prefix` is the
+ # explicit prefix given in a signature
+ (fullname, name_prefix) = self.names[-1]
+ if self.allow_nesting:
+ prefix = fullname
+ elif name_prefix:
+ prefix = name_prefix.strip('.')
+ if prefix:
+ self.env.ref_context['py:class'] = prefix
+ if self.allow_nesting:
+ classes = self.env.ref_context.setdefault('py:classes', [])
+ classes.append(prefix)
+ if 'module' in self.options:
+ modules = self.env.ref_context.setdefault('py:modules', [])
+ modules.append(self.env.ref_context.get('py:module'))
+ self.env.ref_context['py:module'] = self.options['module']
+
+ def after_content(self) -> None:
+ """Handle object de-nesting after content
+
+ If this class is a nestable object, removing the last nested class prefix
+ ends further nesting in the object.
+
+ If this class is not a nestable object, the list of classes should not
+ be altered as we didn't affect the nesting levels in
+ :py:meth:`before_content`.
+ """
+ classes = self.env.ref_context.setdefault('py:classes', [])
+ if self.allow_nesting:
+ with contextlib.suppress(IndexError):
+ classes.pop()
+
+ self.env.ref_context['py:class'] = (classes[-1] if len(classes) > 0
+ else None)
+ if 'module' in self.options:
+ modules = self.env.ref_context.setdefault('py:modules', [])
+ if modules:
+ self.env.ref_context['py:module'] = modules.pop()
+ else:
+ self.env.ref_context.pop('py:module')
+
+ def _toc_entry_name(self, sig_node: desc_signature) -> str:
+ if not sig_node.get('_toc_parts'):
+ return ''
+
+ config = self.env.app.config
+ objtype = sig_node.parent.get('objtype')
+ if config.add_function_parentheses and objtype in {'function', 'method'}:
+ parens = '()'
+ else:
+ parens = ''
+ *parents, name = sig_node['_toc_parts']
+ if config.toc_object_entries_show_parents == 'domain':
+ return sig_node.get('fullname', name) + parens
+ if config.toc_object_entries_show_parents == 'hide':
+ return name + parens
+ if config.toc_object_entries_show_parents == 'all':
+ return '.'.join(parents + [name + parens])
+ return ''
+
+
+class PyFunction(PyObject):
+ """Description of a function."""
+
+ option_spec: OptionSpec = PyObject.option_spec.copy()
+ option_spec.update({
+ 'async': directives.flag,
+ })
+
+ def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
+ if 'async' in self.options:
+ return [addnodes.desc_sig_keyword('', 'async'),
+ addnodes.desc_sig_space()]
+ else:
+ return []
+
+ def needs_arglist(self) -> bool:
+ return True
+
+ def add_target_and_index(self, name_cls: tuple[str, str], sig: str,
+ signode: desc_signature) -> None:
+ super().add_target_and_index(name_cls, sig, signode)
+ if 'no-index-entry' not in self.options:
+ modname = self.options.get('module', self.env.ref_context.get('py:module'))
+ node_id = signode['ids'][0]
+
+ name, cls = name_cls
+ if modname:
+ text = _('%s() (in module %s)') % (name, modname)
+ self.indexnode['entries'].append(('single', text, node_id, '', None))
+ else:
+ text = f'built-in function; {name}()'
+ self.indexnode['entries'].append(('pair', text, node_id, '', None))
+
+ def get_index_text(self, modname: str, name_cls: tuple[str, str]) -> str:
+ # add index in own add_target_and_index() instead.
+ return ''
+
+
+class PyDecoratorFunction(PyFunction):
+ """Description of a decorator."""
+
+ def run(self) -> list[Node]:
+ # a decorator function is a function after all
+ self.name = 'py:function'
+ return super().run()
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]:
+ ret = super().handle_signature(sig, signode)
+ signode.insert(0, addnodes.desc_addname('@', '@'))
+ return ret
+
+ def needs_arglist(self) -> bool:
+ return False
+
+
+class PyVariable(PyObject):
+ """Description of a variable."""
+
+ option_spec: OptionSpec = PyObject.option_spec.copy()
+ option_spec.update({
+ 'type': directives.unchanged,
+ 'value': directives.unchanged,
+ })
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]:
+ fullname, prefix = super().handle_signature(sig, signode)
+
+ typ = self.options.get('type')
+ if typ:
+ annotations = _parse_annotation(typ, self.env)
+ signode += addnodes.desc_annotation(typ, '',
+ addnodes.desc_sig_punctuation('', ':'),
+ addnodes.desc_sig_space(), *annotations)
+
+ value = self.options.get('value')
+ if value:
+ signode += addnodes.desc_annotation(value, '',
+ addnodes.desc_sig_space(),
+ addnodes.desc_sig_punctuation('', '='),
+ addnodes.desc_sig_space(),
+ nodes.Text(value))
+
+ return fullname, prefix
+
+ def get_index_text(self, modname: str, name_cls: tuple[str, str]) -> str:
+ name, cls = name_cls
+ if modname:
+ return _('%s (in module %s)') % (name, modname)
+ else:
+ return _('%s (built-in variable)') % name
+
+
+class PyClasslike(PyObject):
+ """
+ Description of a class-like object (classes, interfaces, exceptions).
+ """
+
+ option_spec: OptionSpec = PyObject.option_spec.copy()
+ option_spec.update({
+ 'final': directives.flag,
+ })
+
+ allow_nesting = True
+
+ def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
+ if 'final' in self.options:
+ return [nodes.Text('final'), addnodes.desc_sig_space(),
+ nodes.Text(self.objtype), addnodes.desc_sig_space()]
+ else:
+ return [nodes.Text(self.objtype), addnodes.desc_sig_space()]
+
+ def get_index_text(self, modname: str, name_cls: tuple[str, str]) -> str:
+ if self.objtype == 'class':
+ if not modname:
+ return _('%s (built-in class)') % name_cls[0]
+ return _('%s (class in %s)') % (name_cls[0], modname)
+ elif self.objtype == 'exception':
+ return name_cls[0]
+ else:
+ return ''
+
+
+class PyMethod(PyObject):
+ """Description of a method."""
+
+ option_spec: OptionSpec = PyObject.option_spec.copy()
+ option_spec.update({
+ 'abstractmethod': directives.flag,
+ 'async': directives.flag,
+ 'classmethod': directives.flag,
+ 'final': directives.flag,
+ 'staticmethod': directives.flag,
+ })
+
+ def needs_arglist(self) -> bool:
+ return True
+
+ def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
+ prefix: list[nodes.Node] = []
+ if 'final' in self.options:
+ prefix.append(nodes.Text('final'))
+ prefix.append(addnodes.desc_sig_space())
+ if 'abstractmethod' in self.options:
+ prefix.append(nodes.Text('abstract'))
+ prefix.append(addnodes.desc_sig_space())
+ if 'async' in self.options:
+ prefix.append(nodes.Text('async'))
+ prefix.append(addnodes.desc_sig_space())
+ if 'classmethod' in self.options:
+ prefix.append(nodes.Text('classmethod'))
+ prefix.append(addnodes.desc_sig_space())
+ if 'staticmethod' in self.options:
+ prefix.append(nodes.Text('static'))
+ prefix.append(addnodes.desc_sig_space())
+ return prefix
+
+ def get_index_text(self, modname: str, name_cls: tuple[str, str]) -> str:
+ name, cls = name_cls
+ try:
+ clsname, methname = name.rsplit('.', 1)
+ if modname and self.env.config.add_module_names:
+ clsname = '.'.join([modname, clsname])
+ except ValueError:
+ if modname:
+ return _('%s() (in module %s)') % (name, modname)
+ else:
+ return '%s()' % name
+
+ if 'classmethod' in self.options:
+ return _('%s() (%s class method)') % (methname, clsname)
+ elif 'staticmethod' in self.options:
+ return _('%s() (%s static method)') % (methname, clsname)
+ else:
+ return _('%s() (%s method)') % (methname, clsname)
+
+
+class PyClassMethod(PyMethod):
+ """Description of a classmethod."""
+
+ option_spec: OptionSpec = PyObject.option_spec.copy()
+
+ def run(self) -> list[Node]:
+ self.name = 'py:method'
+ self.options['classmethod'] = True
+
+ return super().run()
+
+
+class PyStaticMethod(PyMethod):
+ """Description of a staticmethod."""
+
+ option_spec: OptionSpec = PyObject.option_spec.copy()
+
+ def run(self) -> list[Node]:
+ self.name = 'py:method'
+ self.options['staticmethod'] = True
+
+ return super().run()
+
+
+class PyDecoratorMethod(PyMethod):
+ """Description of a decoratormethod."""
+
+ def run(self) -> list[Node]:
+ self.name = 'py:method'
+ return super().run()
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]:
+ ret = super().handle_signature(sig, signode)
+ signode.insert(0, addnodes.desc_addname('@', '@'))
+ return ret
+
+ def needs_arglist(self) -> bool:
+ return False
+
+
+class PyAttribute(PyObject):
+ """Description of an attribute."""
+
+ option_spec: OptionSpec = PyObject.option_spec.copy()
+ option_spec.update({
+ 'type': directives.unchanged,
+ 'value': directives.unchanged,
+ })
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]:
+ fullname, prefix = super().handle_signature(sig, signode)
+
+ typ = self.options.get('type')
+ if typ:
+ annotations = _parse_annotation(typ, self.env)
+ signode += addnodes.desc_annotation(typ, '',
+ addnodes.desc_sig_punctuation('', ':'),
+ addnodes.desc_sig_space(),
+ *annotations)
+
+ value = self.options.get('value')
+ if value:
+ signode += addnodes.desc_annotation(value, '',
+ addnodes.desc_sig_space(),
+ addnodes.desc_sig_punctuation('', '='),
+ addnodes.desc_sig_space(),
+ nodes.Text(value))
+
+ return fullname, prefix
+
+ def get_index_text(self, modname: str, name_cls: tuple[str, str]) -> str:
+ name, cls = name_cls
+ try:
+ clsname, attrname = name.rsplit('.', 1)
+ if modname and self.env.config.add_module_names:
+ clsname = '.'.join([modname, clsname])
+ except ValueError:
+ if modname:
+ return _('%s (in module %s)') % (name, modname)
+ else:
+ return name
+
+ return _('%s (%s attribute)') % (attrname, clsname)
+
+
+class PyProperty(PyObject):
+ """Description of an attribute."""
+
+ option_spec = PyObject.option_spec.copy()
+ option_spec.update({
+ 'abstractmethod': directives.flag,
+ 'classmethod': directives.flag,
+ 'type': directives.unchanged,
+ })
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]:
+ fullname, prefix = super().handle_signature(sig, signode)
+
+ typ = self.options.get('type')
+ if typ:
+ annotations = _parse_annotation(typ, self.env)
+ signode += addnodes.desc_annotation(typ, '',
+ addnodes.desc_sig_punctuation('', ':'),
+ addnodes.desc_sig_space(),
+ *annotations)
+
+ return fullname, prefix
+
+ def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
+ prefix: list[nodes.Node] = []
+ if 'abstractmethod' in self.options:
+ prefix.append(nodes.Text('abstract'))
+ prefix.append(addnodes.desc_sig_space())
+ if 'classmethod' in self.options:
+ prefix.append(nodes.Text('class'))
+ prefix.append(addnodes.desc_sig_space())
+
+ prefix.append(nodes.Text('property'))
+ prefix.append(addnodes.desc_sig_space())
+ return prefix
+
+ def get_index_text(self, modname: str, name_cls: tuple[str, str]) -> str:
+ name, cls = name_cls
+ try:
+ clsname, attrname = name.rsplit('.', 1)
+ if modname and self.env.config.add_module_names:
+ clsname = '.'.join([modname, clsname])
+ except ValueError:
+ if modname:
+ return _('%s (in module %s)') % (name, modname)
+ else:
+ return name
+
+ return _('%s (%s property)') % (attrname, clsname)
+
+
+class PyModule(SphinxDirective):
+ """
+ Directive to mark description of a new module.
+ """
+
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'platform': lambda x: x,
+ 'synopsis': lambda x: x,
+ 'no-index': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindex': directives.flag,
+ 'nocontentsentry': directives.flag,
+ 'deprecated': directives.flag,
+ }
+
+ def run(self) -> list[Node]:
+ domain = cast(PythonDomain, self.env.get_domain('py'))
+
+ modname = self.arguments[0].strip()
+ no_index = 'no-index' in self.options or 'noindex' in self.options
+ self.env.ref_context['py:module'] = modname
+
+ content_node: Element = nodes.section()
+ # necessary so that the child nodes get the right source/line set
+ content_node.document = self.state.document
+ nested_parse_with_titles(self.state, self.content, content_node, self.content_offset)
+
+ ret: list[Node] = []
+ if not no_index:
+ # note module to the domain
+ node_id = make_id(self.env, self.state.document, 'module', modname)
+ target = nodes.target('', '', ids=[node_id], ismod=True)
+ self.set_source_info(target)
+ self.state.document.note_explicit_target(target)
+
+ domain.note_module(modname,
+ node_id,
+ self.options.get('synopsis', ''),
+ self.options.get('platform', ''),
+ 'deprecated' in self.options)
+ domain.note_object(modname, 'module', node_id, location=target)
+
+ # the platform and synopsis aren't printed; in fact, they are only
+ # used in the modindex currently
+ indextext = f'module; {modname}'
+ inode = addnodes.index(entries=[('pair', indextext, node_id, '', None)])
+ # The node order is: index node first, then target node.
+ ret.append(inode)
+ ret.append(target)
+ ret.extend(content_node.children)
+ return ret
+
+
+class PyCurrentModule(SphinxDirective):
+ """
+ This directive is just to tell Sphinx that we're documenting
+ stuff in module foo, but links to module foo won't lead here.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ modname = self.arguments[0].strip()
+ if modname == 'None':
+ self.env.ref_context.pop('py:module', None)
+ else:
+ self.env.ref_context['py:module'] = modname
+ return []
+
+
+class PyXRefRole(XRefRole):
+ def process_link(self, env: BuildEnvironment, refnode: Element,
+ has_explicit_title: bool, title: str, target: str) -> tuple[str, str]:
+ refnode['py:module'] = env.ref_context.get('py:module')
+ refnode['py:class'] = env.ref_context.get('py:class')
+ if not has_explicit_title:
+ title = title.lstrip('.') # only has a meaning for the target
+ target = target.lstrip('~') # only has a meaning for the title
+ # if the first character is a tilde, don't display the module/class
+ # parts of the contents
+ if title[0:1] == '~':
+ title = title[1:]
+ dot = title.rfind('.')
+ if dot != -1:
+ title = title[dot + 1:]
+ # if the first character is a dot, search more specific namespaces first
+ # else search builtins first
+ if target[0:1] == '.':
+ target = target[1:]
+ refnode['refspecific'] = True
+ return title, target
+
+
+def filter_meta_fields(app: Sphinx, domain: str, objtype: str, content: Element) -> None:
+ """Filter ``:meta:`` field from its docstring."""
+ if domain != 'py':
+ return
+
+ for node in content:
+ if isinstance(node, nodes.field_list):
+ fields = cast(list[nodes.field], node)
+ # removing list items while iterating the list needs reversed()
+ for field in reversed(fields):
+ field_name = cast(nodes.field_body, field[0]).astext().strip()
+ if field_name == 'meta' or field_name.startswith('meta '):
+ node.remove(field)
+
+
+class PythonModuleIndex(Index):
+ """
+ Index subclass to provide the Python module index.
+ """
+
+ name = 'modindex'
+ localname = _('Python Module Index')
+ shortname = _('modules')
+
+ def generate(self, docnames: Iterable[str] | None = None,
+ ) -> tuple[list[tuple[str, list[IndexEntry]]], bool]:
+ content: dict[str, list[IndexEntry]] = {}
+ # list of prefixes to ignore
+ ignores: list[str] = self.domain.env.config['modindex_common_prefix']
+ ignores = sorted(ignores, key=len, reverse=True)
+ # list of all modules, sorted by module name
+ modules = sorted(self.domain.data['modules'].items(),
+ key=lambda x: x[0].lower())
+ # sort out collapsible modules
+ prev_modname = ''
+ num_toplevels = 0
+ for modname, (docname, node_id, synopsis, platforms, deprecated) in modules:
+ if docnames and docname not in docnames:
+ continue
+
+ for ignore in ignores:
+ if modname.startswith(ignore):
+ modname = modname[len(ignore):]
+ stripped = ignore
+ break
+ else:
+ stripped = ''
+
+ # we stripped the whole module name?
+ if not modname:
+ modname, stripped = stripped, ''
+
+ entries = content.setdefault(modname[0].lower(), [])
+
+ package = modname.split('.')[0]
+ if package != modname:
+ # it's a submodule
+ if prev_modname == package:
+ # first submodule - make parent a group head
+ if entries:
+ last = entries[-1]
+ entries[-1] = IndexEntry(last[0], 1, last[2], last[3],
+ last[4], last[5], last[6])
+ elif not prev_modname.startswith(package):
+ # submodule without parent in list, add dummy entry
+ entries.append(IndexEntry(stripped + package, 1, '', '', '', '', ''))
+ subtype = 2
+ else:
+ num_toplevels += 1
+ subtype = 0
+
+ qualifier = _('Deprecated') if deprecated else ''
+ entries.append(IndexEntry(stripped + modname, subtype, docname,
+ node_id, platforms, qualifier, synopsis))
+ prev_modname = modname
+
+ # apply heuristics when to collapse modindex at page load:
+ # only collapse if number of toplevel modules is larger than
+ # number of submodules
+ collapse = len(modules) - num_toplevels < num_toplevels
+
+ # sort by first letter
+ sorted_content = sorted(content.items())
+
+ return sorted_content, collapse
+
+
+class PythonDomain(Domain):
+ """Python language domain."""
+ name = 'py'
+ label = 'Python'
+ object_types: dict[str, ObjType] = {
+ 'function': ObjType(_('function'), 'func', 'obj'),
+ 'data': ObjType(_('data'), 'data', 'obj'),
+ 'class': ObjType(_('class'), 'class', 'exc', 'obj'),
+ 'exception': ObjType(_('exception'), 'exc', 'class', 'obj'),
+ 'method': ObjType(_('method'), 'meth', 'obj'),
+ 'classmethod': ObjType(_('class method'), 'meth', 'obj'),
+ 'staticmethod': ObjType(_('static method'), 'meth', 'obj'),
+ 'attribute': ObjType(_('attribute'), 'attr', 'obj'),
+ 'property': ObjType(_('property'), 'attr', '_prop', 'obj'),
+ 'module': ObjType(_('module'), 'mod', 'obj'),
+ }
+
+ directives = {
+ 'function': PyFunction,
+ 'data': PyVariable,
+ 'class': PyClasslike,
+ 'exception': PyClasslike,
+ 'method': PyMethod,
+ 'classmethod': PyClassMethod,
+ 'staticmethod': PyStaticMethod,
+ 'attribute': PyAttribute,
+ 'property': PyProperty,
+ 'module': PyModule,
+ 'currentmodule': PyCurrentModule,
+ 'decorator': PyDecoratorFunction,
+ 'decoratormethod': PyDecoratorMethod,
+ }
+ roles = {
+ 'data': PyXRefRole(),
+ 'exc': PyXRefRole(),
+ 'func': PyXRefRole(fix_parens=True),
+ 'class': PyXRefRole(),
+ 'const': PyXRefRole(),
+ 'attr': PyXRefRole(),
+ 'meth': PyXRefRole(fix_parens=True),
+ 'mod': PyXRefRole(),
+ 'obj': PyXRefRole(),
+ }
+ initial_data: dict[str, dict[str, tuple[Any]]] = {
+ 'objects': {}, # fullname -> docname, objtype
+ 'modules': {}, # modname -> docname, synopsis, platform, deprecated
+ }
+ indices = [
+ PythonModuleIndex,
+ ]
+
+ @property
+ def objects(self) -> dict[str, ObjectEntry]:
+ return self.data.setdefault('objects', {}) # fullname -> ObjectEntry
+
+ def note_object(self, name: str, objtype: str, node_id: str,
+ aliased: bool = False, location: Any = None) -> None:
+ """Note a python object for cross reference.
+
+ .. versionadded:: 2.1
+ """
+ if name in self.objects:
+ other = self.objects[name]
+ if other.aliased and aliased is False:
+ # The original definition found. Override it!
+ pass
+ elif other.aliased is False and aliased:
+ # The original definition is already registered.
+ return
+ else:
+ # duplicated
+ logger.warning(__('duplicate object description of %s, '
+ 'other instance in %s, use :no-index: for one of them'),
+ name, other.docname, location=location)
+ self.objects[name] = ObjectEntry(self.env.docname, node_id, objtype, aliased)
+
+ @property
+ def modules(self) -> dict[str, ModuleEntry]:
+ return self.data.setdefault('modules', {}) # modname -> ModuleEntry
+
+ def note_module(self, name: str, node_id: str, synopsis: str,
+ platform: str, deprecated: bool) -> None:
+ """Note a python module for cross reference.
+
+ .. versionadded:: 2.1
+ """
+ self.modules[name] = ModuleEntry(self.env.docname, node_id,
+ synopsis, platform, deprecated)
+
+ def clear_doc(self, docname: str) -> None:
+ for fullname, obj in list(self.objects.items()):
+ if obj.docname == docname:
+ del self.objects[fullname]
+ for modname, mod in list(self.modules.items()):
+ if mod.docname == docname:
+ del self.modules[modname]
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
+ # XXX check duplicates?
+ for fullname, obj in otherdata['objects'].items():
+ if obj.docname in docnames:
+ self.objects[fullname] = obj
+ for modname, mod in otherdata['modules'].items():
+ if mod.docname in docnames:
+ self.modules[modname] = mod
+
+ def find_obj(self, env: BuildEnvironment, modname: str, classname: str,
+ name: str, type: str | None, searchmode: int = 0,
+ ) -> list[tuple[str, ObjectEntry]]:
+ """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:] == '()':
+ name = name[:-2]
+
+ if not name:
+ return []
+
+ matches: list[tuple[str, ObjectEntry]] = []
+
+ newname = None
+ if searchmode == 1:
+ if type is None:
+ objtypes: list[str] | None = list(self.object_types)
+ else:
+ objtypes = self.objtypes_for_role(type)
+ if objtypes is not None:
+ if modname and classname:
+ fullname = modname + '.' + classname + '.' + name
+ if fullname in self.objects and self.objects[fullname].objtype in objtypes:
+ newname = fullname
+ if not newname:
+ if modname and modname + '.' + name in self.objects and \
+ self.objects[modname + '.' + name].objtype in objtypes:
+ newname = modname + '.' + name
+ elif name in self.objects and self.objects[name].objtype in objtypes:
+ newname = name
+ else:
+ # "fuzzy" searching mode
+ searchname = '.' + name
+ matches = [(oname, self.objects[oname]) for oname in self.objects
+ if oname.endswith(searchname) and
+ self.objects[oname].objtype in objtypes]
+ else:
+ # NOTE: searching for exact match, object type is not considered
+ if name in self.objects:
+ newname = name
+ elif type == 'mod':
+ # only exact matches allowed for modules
+ return []
+ elif classname and classname + '.' + name in self.objects:
+ newname = classname + '.' + name
+ elif modname and modname + '.' + name in self.objects:
+ newname = modname + '.' + name
+ elif modname and classname and \
+ modname + '.' + classname + '.' + name in self.objects:
+ newname = modname + '.' + classname + '.' + name
+ if newname is not None:
+ matches.append((newname, self.objects[newname]))
+ return matches
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ type: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ modname = node.get('py:module')
+ clsname = node.get('py:class')
+ searchmode = 1 if node.hasattr('refspecific') else 0
+ matches = self.find_obj(env, modname, clsname, target,
+ type, searchmode)
+
+ if not matches and type == 'attr':
+ # fallback to meth (for property; Sphinx 2.4.x)
+ # this ensures that `:attr:` role continues to refer to the old property entry
+ # that defined by ``method`` directive in old reST files.
+ matches = self.find_obj(env, modname, clsname, target, 'meth', searchmode)
+ if not matches and type == 'meth':
+ # fallback to attr (for property)
+ # this ensures that `:meth:` in the old reST files can refer to the property
+ # entry that defined by ``property`` directive.
+ #
+ # Note: _prop is a secret role only for internal look-up.
+ matches = self.find_obj(env, modname, clsname, target, '_prop', searchmode)
+
+ if not matches:
+ return None
+ elif len(matches) > 1:
+ canonicals = [m for m in matches if not m[1].aliased]
+ if len(canonicals) == 1:
+ matches = canonicals
+ else:
+ logger.warning(__('more than one target found for cross-reference %r: %s'),
+ target, ', '.join(match[0] for match in matches),
+ type='ref', subtype='python', location=node)
+ name, obj = matches[0]
+
+ if obj[2] == 'module':
+ return self._make_module_refnode(builder, fromdocname, name, contnode)
+ else:
+ # determine the content of the reference by conditions
+ content = find_pending_xref_condition(node, 'resolved')
+ if content:
+ children = content.children
+ else:
+ # if not found, use contnode
+ children = [contnode]
+
+ return make_refnode(builder, fromdocname, obj[0], obj[1], children, name)
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ modname = node.get('py:module')
+ clsname = node.get('py:class')
+ results: list[tuple[str, Element]] = []
+
+ # always search in "refspecific" mode with the :any: role
+ matches = self.find_obj(env, modname, clsname, target, None, 1)
+ multiple_matches = len(matches) > 1
+
+ for name, obj in matches:
+
+ if multiple_matches and obj.aliased:
+ # Skip duplicated matches
+ continue
+
+ if obj[2] == 'module':
+ results.append(('py:mod',
+ self._make_module_refnode(builder, fromdocname,
+ name, contnode)))
+ else:
+ # determine the content of the reference by conditions
+ content = find_pending_xref_condition(node, 'resolved')
+ if content:
+ children = content.children
+ else:
+ # if not found, use contnode
+ children = [contnode]
+
+ role = 'py:' + self.role_for_objtype(obj[2]) # type: ignore[operator]
+ results.append((role, make_refnode(builder, fromdocname, obj[0], obj[1],
+ children, name)))
+ return results
+
+ def _make_module_refnode(self, builder: Builder, fromdocname: str, name: str,
+ contnode: Node) -> Element:
+ # get additional info for modules
+ module = self.modules[name]
+ title = name
+ if module.synopsis:
+ title += ': ' + module.synopsis
+ if module.deprecated:
+ title += _(' (deprecated)')
+ if module.platform:
+ title += ' (' + module.platform + ')'
+ return make_refnode(builder, fromdocname, module.docname, module.node_id,
+ contnode, title)
+
+ def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]:
+ for modname, mod in self.modules.items():
+ yield (modname, modname, 'module', mod.docname, mod.node_id, 0)
+ for refname, obj in self.objects.items():
+ if obj.objtype != 'module': # modules are already handled
+ if obj.aliased:
+ # aliased names are not full-text searchable.
+ yield (refname, refname, obj.objtype, obj.docname, obj.node_id, -1)
+ else:
+ yield (refname, refname, obj.objtype, obj.docname, obj.node_id, 1)
+
+ def get_full_qualified_name(self, node: Element) -> str | None:
+ modname = node.get('py:module')
+ clsname = node.get('py:class')
+ target = node.get('reftarget')
+ if target is None:
+ return None
+ else:
+ return '.'.join(filter(None, [modname, clsname, target]))
+
+
+def builtin_resolver(app: Sphinx, env: BuildEnvironment,
+ node: pending_xref, contnode: Element) -> Element | None:
+ """Do not emit nitpicky warnings for built-in types."""
+ def istyping(s: str) -> bool:
+ if s.startswith('typing.'):
+ s = s.split('.', 1)[1]
+
+ return s in typing.__all__
+
+ if node.get('refdomain') != 'py':
+ return None
+ elif node.get('reftype') in ('class', 'obj') and node.get('reftarget') == 'None':
+ return contnode
+ elif node.get('reftype') in ('class', 'obj', 'exc'):
+ reftarget = node.get('reftarget')
+ if inspect.isclass(getattr(builtins, reftarget, None)):
+ # built-in class
+ return contnode
+ if istyping(reftarget):
+ # typing class
+ return contnode
+
+ return None
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.setup_extension('sphinx.directives')
+
+ app.add_domain(PythonDomain)
+ app.add_config_value('python_use_unqualified_type_names', False, 'env')
+ app.add_config_value('python_maximum_signature_line_length', None, 'env',
+ types={int, None})
+ app.add_config_value('python_display_short_literal_types', False, 'env')
+ app.connect('object-description-transform', filter_meta_fields)
+ app.connect('missing-reference', builtin_resolver, priority=900)
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 4,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/rst.py b/sphinx/domains/rst.py
new file mode 100644
index 0000000..480aba5
--- /dev/null
+++ b/sphinx/domains/rst.py
@@ -0,0 +1,299 @@
+"""The reStructuredText domain."""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils.parsers.rst import directives
+
+from sphinx import addnodes
+from sphinx.directives import ObjectDescription
+from sphinx.domains import Domain, ObjType
+from sphinx.locale import _, __
+from sphinx.roles import XRefRole
+from sphinx.util import logging
+from sphinx.util.nodes import make_id, make_refnode
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from docutils.nodes import Element
+
+ from sphinx.addnodes import desc_signature, pending_xref
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+
+logger = logging.getLogger(__name__)
+
+dir_sig_re = re.compile(r'\.\. (.+?)::(.*)$')
+
+
+class ReSTMarkup(ObjectDescription[str]):
+ """
+ Description of generic reST markup.
+ """
+ option_spec: OptionSpec = {
+ 'no-index': directives.flag,
+ 'no-index-entry': directives.flag,
+ 'no-contents-entry': directives.flag,
+ 'no-typesetting': directives.flag,
+ 'noindex': directives.flag,
+ 'noindexentry': directives.flag,
+ 'nocontentsentry': directives.flag,
+ }
+
+ def add_target_and_index(self, name: str, sig: str, signode: desc_signature) -> None:
+ node_id = make_id(self.env, self.state.document, self.objtype, name)
+ signode['ids'].append(node_id)
+ self.state.document.note_explicit_target(signode)
+
+ domain = cast(ReSTDomain, self.env.get_domain('rst'))
+ domain.note_object(self.objtype, name, node_id, location=signode)
+
+ if 'no-index-entry' not in self.options:
+ indextext = self.get_index_text(self.objtype, name)
+ if indextext:
+ self.indexnode['entries'].append(('single', indextext, node_id, '', None))
+
+ def get_index_text(self, objectname: str, name: str) -> str:
+ return ''
+
+ def _object_hierarchy_parts(self, sig_node: desc_signature) -> tuple[str, ...]:
+ if 'fullname' not in sig_node:
+ return ()
+ directive_names = []
+ for parent in self.env.ref_context.get('rst:directives', ()):
+ directive_names += parent.split(':')
+ name = sig_node['fullname']
+ return tuple(directive_names + name.split(':'))
+
+ def _toc_entry_name(self, sig_node: desc_signature) -> str:
+ if not sig_node.get('_toc_parts'):
+ return ''
+
+ config = self.env.app.config
+ objtype = sig_node.parent.get('objtype')
+ *parents, name = sig_node['_toc_parts']
+ if objtype == 'directive:option':
+ return f':{name}:'
+ if config.toc_object_entries_show_parents in {'domain', 'all'}:
+ name = ':'.join(sig_node['_toc_parts'])
+ if objtype == 'role':
+ return f':{name}:'
+ if objtype == 'directive':
+ return f'.. {name}::'
+ return ''
+
+
+def parse_directive(d: str) -> tuple[str, str]:
+ """Parse a directive signature.
+
+ Returns (directive, arguments) string tuple. If no arguments are given,
+ returns (directive, '').
+ """
+ dir = d.strip()
+ if not dir.startswith('.'):
+ # Assume it is a directive without syntax
+ return (dir, '')
+ m = dir_sig_re.match(dir)
+ if not m:
+ return (dir, '')
+ parsed_dir, parsed_args = m.groups()
+ if parsed_args.strip():
+ return (parsed_dir.strip(), ' ' + parsed_args.strip())
+ else:
+ return (parsed_dir.strip(), '')
+
+
+class ReSTDirective(ReSTMarkup):
+ """
+ Description of a reST directive.
+ """
+ def handle_signature(self, sig: str, signode: desc_signature) -> str:
+ name, args = parse_directive(sig)
+ desc_name = f'.. {name}::'
+ signode['fullname'] = name.strip()
+ signode += addnodes.desc_name(desc_name, desc_name)
+ if len(args) > 0:
+ signode += addnodes.desc_addname(args, args)
+ return name
+
+ def get_index_text(self, objectname: str, name: str) -> str:
+ return _('%s (directive)') % name
+
+ def before_content(self) -> None:
+ if self.names:
+ directives = self.env.ref_context.setdefault('rst:directives', [])
+ directives.append(self.names[0])
+
+ def after_content(self) -> None:
+ directives = self.env.ref_context.setdefault('rst:directives', [])
+ if directives:
+ directives.pop()
+
+
+class ReSTDirectiveOption(ReSTMarkup):
+ """
+ Description of an option for reST directive.
+ """
+ option_spec: OptionSpec = ReSTMarkup.option_spec.copy()
+ option_spec.update({
+ 'type': directives.unchanged,
+ })
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> str:
+ try:
+ name, argument = re.split(r'\s*:\s+', sig.strip(), maxsplit=1)
+ except ValueError:
+ name, argument = sig, None
+
+ desc_name = f':{name}:'
+ signode['fullname'] = name.strip()
+ signode += addnodes.desc_name(desc_name, desc_name)
+ if argument:
+ signode += addnodes.desc_annotation(' ' + argument, ' ' + argument)
+ if self.options.get('type'):
+ text = ' (%s)' % self.options['type']
+ signode += addnodes.desc_annotation(text, text)
+ return name
+
+ def add_target_and_index(self, name: str, sig: str, signode: desc_signature) -> None:
+ domain = cast(ReSTDomain, self.env.get_domain('rst'))
+
+ directive_name = self.current_directive
+ if directive_name:
+ prefix = '-'.join([self.objtype, directive_name])
+ objname = ':'.join([directive_name, name])
+ else:
+ prefix = self.objtype
+ objname = name
+
+ node_id = make_id(self.env, self.state.document, prefix, name)
+ signode['ids'].append(node_id)
+ self.state.document.note_explicit_target(signode)
+ domain.note_object(self.objtype, objname, node_id, location=signode)
+
+ if directive_name:
+ key = name[0].upper()
+ pair = [_('%s (directive)') % directive_name,
+ _(':%s: (directive option)') % name]
+ self.indexnode['entries'].append(('pair', '; '.join(pair), node_id, '', key))
+ else:
+ key = name[0].upper()
+ text = _(':%s: (directive option)') % name
+ self.indexnode['entries'].append(('single', text, node_id, '', key))
+
+ @property
+ def current_directive(self) -> str:
+ directives = self.env.ref_context.get('rst:directives')
+ if directives:
+ return directives[-1]
+ else:
+ return ''
+
+
+class ReSTRole(ReSTMarkup):
+ """
+ Description of a reST role.
+ """
+ def handle_signature(self, sig: str, signode: desc_signature) -> str:
+ desc_name = f':{sig}:'
+ signode['fullname'] = sig.strip()
+ signode += addnodes.desc_name(desc_name, desc_name)
+ return sig
+
+ def get_index_text(self, objectname: str, name: str) -> str:
+ return _('%s (role)') % name
+
+
+class ReSTDomain(Domain):
+ """ReStructuredText domain."""
+ name = 'rst'
+ label = 'reStructuredText'
+
+ object_types = {
+ 'directive': ObjType(_('directive'), 'dir'),
+ 'directive:option': ObjType(_('directive-option'), 'dir'),
+ 'role': ObjType(_('role'), 'role'),
+ }
+ directives = {
+ 'directive': ReSTDirective,
+ 'directive:option': ReSTDirectiveOption,
+ 'role': ReSTRole,
+ }
+ roles = {
+ 'dir': XRefRole(),
+ 'role': XRefRole(),
+ }
+ initial_data: dict[str, dict[tuple[str, str], str]] = {
+ 'objects': {}, # fullname -> docname, objtype
+ }
+
+ @property
+ def objects(self) -> dict[tuple[str, str], tuple[str, str]]:
+ return self.data.setdefault('objects', {}) # (objtype, fullname) -> (docname, node_id)
+
+ def note_object(self, objtype: str, name: str, node_id: str, location: Any = None) -> None:
+ if (objtype, name) in self.objects:
+ docname, node_id = self.objects[objtype, name]
+ logger.warning(__('duplicate description of %s %s, other instance in %s') %
+ (objtype, name, docname), location=location)
+
+ self.objects[objtype, name] = (self.env.docname, node_id)
+
+ def clear_doc(self, docname: str) -> None:
+ for (typ, name), (doc, _node_id) in list(self.objects.items()):
+ if doc == docname:
+ del self.objects[typ, name]
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
+ # XXX check duplicates
+ for (typ, name), (doc, node_id) in otherdata['objects'].items():
+ if doc in docnames:
+ self.objects[typ, name] = (doc, node_id)
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ objtypes = self.objtypes_for_role(typ)
+ if not objtypes:
+ return None
+ for objtype in objtypes:
+ result = self.objects.get((objtype, target))
+ if result:
+ todocname, node_id = result
+ return make_refnode(builder, fromdocname, todocname, node_id,
+ contnode, target + ' ' + objtype)
+ return None
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ target: str, node: pending_xref, contnode: Element,
+ ) -> list[tuple[str, Element]]:
+ results: list[tuple[str, Element]] = []
+ for objtype in self.object_types:
+ result = self.objects.get((objtype, target))
+ if result:
+ todocname, node_id = result
+ results.append(
+ ('rst:' + self.role_for_objtype(objtype), # type: ignore[operator]
+ make_refnode(builder, fromdocname, todocname, node_id,
+ contnode, target + ' ' + objtype)))
+ return results
+
+ def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]:
+ for (typ, name), (docname, node_id) in self.data['objects'].items():
+ yield name, name, typ, docname, node_id, 1
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(ReSTDomain)
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 2,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py
new file mode 100644
index 0000000..b3082a7
--- /dev/null
+++ b/sphinx/domains/std.py
@@ -0,0 +1,1123 @@
+"""The standard domain."""
+
+from __future__ import annotations
+
+import re
+from copy import copy
+from typing import TYPE_CHECKING, Any, Callable, Final, cast
+
+from docutils import nodes
+from docutils.nodes import Element, Node, system_message
+from docutils.parsers.rst import Directive, directives
+from docutils.statemachine import StringList
+
+from sphinx import addnodes
+from sphinx.addnodes import desc_signature, pending_xref
+from sphinx.directives import ObjectDescription
+from sphinx.domains import Domain, ObjType, TitleGetter
+from sphinx.locale import _, __
+from sphinx.roles import EmphasizedLiteral, XRefRole
+from sphinx.util import docname_join, logging, ws_re
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import clean_astext, make_id, make_refnode
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Iterator
+
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec, RoleFunction
+
+logger = logging.getLogger(__name__)
+
+# RE for option descriptions
+option_desc_re = re.compile(r'((?:/|--|-|\+)?[^\s=]+)(=?\s*.*)')
+# RE for grammar tokens
+token_re = re.compile(r'`((~?\w*:)?\w+)`', re.U)
+
+samp_role = EmphasizedLiteral()
+
+
+class GenericObject(ObjectDescription[str]):
+ """
+ A generic x-ref directive registered with Sphinx.add_object_type().
+ """
+ indextemplate: str = ''
+ parse_node: Callable[[BuildEnvironment, str, desc_signature], str] | None = None
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> str:
+ if self.parse_node:
+ name = self.parse_node(self.env, sig, signode)
+ else:
+ signode.clear()
+ signode += addnodes.desc_name(sig, sig)
+ # normalize whitespace like XRefRole does
+ name = ws_re.sub(' ', sig)
+ return name
+
+ def add_target_and_index(self, name: str, sig: str, signode: desc_signature) -> None:
+ node_id = make_id(self.env, self.state.document, self.objtype, name)
+ signode['ids'].append(node_id)
+ self.state.document.note_explicit_target(signode)
+
+ if self.indextemplate:
+ colon = self.indextemplate.find(':')
+ if colon != -1:
+ indextype = self.indextemplate[:colon].strip()
+ indexentry = self.indextemplate[colon + 1:].strip() % (name,)
+ else:
+ indextype = 'single'
+ indexentry = self.indextemplate % (name,)
+ self.indexnode['entries'].append((indextype, indexentry, node_id, '', None))
+
+ std = cast(StandardDomain, self.env.get_domain('std'))
+ std.note_object(self.objtype, name, node_id, location=signode)
+
+
+class EnvVar(GenericObject):
+ indextemplate = _('environment variable; %s')
+
+
+class EnvVarXRefRole(XRefRole):
+ """
+ Cross-referencing role for environment variables (adds an index entry).
+ """
+
+ def result_nodes(self, document: nodes.document, env: BuildEnvironment, node: Element,
+ is_ref: bool) -> tuple[list[Node], list[system_message]]:
+ if not is_ref:
+ return [node], []
+ varname = node['reftarget']
+ tgtid = 'index-%s' % env.new_serialno('index')
+ indexnode = addnodes.index()
+ indexnode['entries'] = [
+ ('single', varname, tgtid, '', None),
+ ('single', _('environment variable; %s') % varname, tgtid, '', None),
+ ]
+ targetnode = nodes.target('', '', ids=[tgtid])
+ document.note_explicit_target(targetnode)
+ return [indexnode, targetnode, node], []
+
+
+class Target(SphinxDirective):
+ """
+ Generic target for user-defined cross-reference types.
+ """
+ indextemplate = ''
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ # normalize whitespace in fullname like XRefRole does
+ fullname = ws_re.sub(' ', self.arguments[0].strip())
+ node_id = make_id(self.env, self.state.document, self.name, fullname)
+ node = nodes.target('', '', ids=[node_id])
+ self.set_source_info(node)
+ self.state.document.note_explicit_target(node)
+ ret: list[Node] = [node]
+ if self.indextemplate:
+ indexentry = self.indextemplate % (fullname,)
+ indextype = 'single'
+ colon = indexentry.find(':')
+ if colon != -1:
+ indextype = indexentry[:colon].strip()
+ indexentry = indexentry[colon + 1:].strip()
+ inode = addnodes.index(entries=[(indextype, indexentry, node_id, '', None)])
+ ret.insert(0, inode)
+ name = self.name
+ if ':' in self.name:
+ _, name = self.name.split(':', 1)
+
+ std = cast(StandardDomain, self.env.get_domain('std'))
+ std.note_object(name, fullname, node_id, location=node)
+
+ return ret
+
+
+class Cmdoption(ObjectDescription[str]):
+ """
+ Description of a command-line option (.. option).
+ """
+
+ def handle_signature(self, sig: str, signode: desc_signature) -> str:
+ """Transform an option description into RST nodes."""
+ count = 0
+ firstname = ''
+ for potential_option in sig.split(', '):
+ potential_option = potential_option.strip()
+ m = option_desc_re.match(potential_option)
+ if not m:
+ logger.warning(__('Malformed option description %r, should '
+ 'look like "opt", "-opt args", "--opt args", '
+ '"/opt args" or "+opt args"'), potential_option,
+ location=signode)
+ continue
+ optname, args = m.groups()
+ if optname[-1] == '[' and args[-1] == ']':
+ # optional value surrounded by brackets (ex. foo[=bar])
+ optname = optname[:-1]
+ args = '[' + args
+
+ if count:
+ if self.env.config.option_emphasise_placeholders:
+ signode += addnodes.desc_sig_punctuation(',', ',')
+ signode += addnodes.desc_sig_space()
+ else:
+ signode += addnodes.desc_addname(', ', ', ')
+ signode += addnodes.desc_name(optname, optname)
+ if self.env.config.option_emphasise_placeholders:
+ add_end_bracket = False
+ if args:
+ if args[0] == '[' and args[-1] == ']':
+ add_end_bracket = True
+ signode += addnodes.desc_sig_punctuation('[', '[')
+ args = args[1:-1]
+ elif args[0] == ' ':
+ signode += addnodes.desc_sig_space()
+ args = args.strip()
+ elif args[0] == '=':
+ signode += addnodes.desc_sig_punctuation('=', '=')
+ args = args[1:]
+ for part in samp_role.parse(args):
+ if isinstance(part, nodes.Text):
+ signode += nodes.Text(part.astext())
+ else:
+ signode += part
+ if add_end_bracket:
+ signode += addnodes.desc_sig_punctuation(']', ']')
+ else:
+ signode += addnodes.desc_addname(args, args)
+ if not count:
+ firstname = optname
+ signode['allnames'] = [optname]
+ else:
+ signode['allnames'].append(optname)
+ count += 1
+ if not firstname:
+ raise ValueError
+ return firstname
+
+ def add_target_and_index(self, firstname: str, sig: str, signode: desc_signature) -> None:
+ currprogram = self.env.ref_context.get('std:program')
+ for optname in signode.get('allnames', []):
+ prefixes = ['cmdoption']
+ if currprogram:
+ prefixes.append(currprogram)
+ if not optname.startswith(('-', '/')):
+ prefixes.append('arg')
+ prefix = '-'.join(prefixes)
+ node_id = make_id(self.env, self.state.document, prefix, optname)
+ signode['ids'].append(node_id)
+
+ self.state.document.note_explicit_target(signode)
+
+ domain = self.env.domains['std']
+ for optname in signode.get('allnames', []):
+ domain.add_program_option(currprogram, optname,
+ self.env.docname, signode['ids'][0])
+
+ # create an index entry
+ if currprogram:
+ descr = _('%s command line option') % currprogram
+ else:
+ descr = _('command line option')
+ for option in signode.get('allnames', []):
+ entry = '; '.join([descr, option])
+ self.indexnode['entries'].append(('pair', entry, signode['ids'][0], '', None))
+
+
+class Program(SphinxDirective):
+ """
+ Directive to name the program for which options are documented.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ program = ws_re.sub('-', self.arguments[0].strip())
+ if program == 'None':
+ self.env.ref_context.pop('std:program', None)
+ else:
+ self.env.ref_context['std:program'] = program
+ return []
+
+
+class OptionXRefRole(XRefRole):
+ def process_link(self, env: BuildEnvironment, refnode: Element, has_explicit_title: bool,
+ title: str, target: str) -> tuple[str, str]:
+ refnode['std:program'] = env.ref_context.get('std:program')
+ return title, target
+
+
+def split_term_classifiers(line: str) -> list[str | None]:
+ # split line into a term and classifiers. if no classifier, None is used..
+ parts: list[str | None] = re.split(' +: +', line) + [None]
+ return parts
+
+
+def make_glossary_term(env: BuildEnvironment, textnodes: Iterable[Node], index_key: str,
+ source: str, lineno: int, node_id: str | None, document: nodes.document,
+ ) -> nodes.term:
+ # get a text-only representation of the term and register it
+ # as a cross-reference target
+ term = nodes.term('', '', *textnodes)
+ term.source = source
+ term.line = lineno
+ termtext = term.astext()
+
+ if node_id:
+ # node_id is given from outside (mainly i18n module), use it forcedly
+ term['ids'].append(node_id)
+ else:
+ node_id = make_id(env, document, 'term', termtext)
+ term['ids'].append(node_id)
+ document.note_explicit_target(term)
+
+ std = cast(StandardDomain, env.get_domain('std'))
+ std._note_term(termtext, node_id, location=term)
+
+ # add an index entry too
+ indexnode = addnodes.index()
+ indexnode['entries'] = [('single', termtext, node_id, 'main', index_key)]
+ indexnode.source, indexnode.line = term.source, term.line
+ term.append(indexnode)
+
+ return term
+
+
+class Glossary(SphinxDirective):
+ """
+ Directive to create a glossary with cross-reference targets for :term:
+ roles.
+ """
+
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'sorted': directives.flag,
+ }
+
+ def run(self) -> list[Node]:
+ node = addnodes.glossary()
+ node.document = self.state.document
+ node['sorted'] = ('sorted' in self.options)
+
+ # 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: list[tuple[list[tuple[str, str, int]], StringList]] = []
+ in_definition = True
+ in_comment = False
+ was_empty = True
+ messages: list[Node] = []
+ 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():
+ # enable comments
+ if line.startswith('.. '):
+ in_comment = True
+ continue
+ in_comment = False
+
+ # first term of definition
+ if in_definition:
+ if not was_empty:
+ messages.append(self.state.reporter.warning(
+ _('glossary term must be preceded by empty line'),
+ source=source, line=lineno))
+ entries.append(([(line, source, lineno)], StringList()))
+ in_definition = False
+ # second term and following
+ else:
+ if was_empty:
+ messages.append(self.state.reporter.warning(
+ _('glossary terms must not be separated by empty lines'),
+ source=source, line=lineno))
+ if entries:
+ entries[-1][0].append((line, source, lineno))
+ else:
+ messages.append(self.state.reporter.warning(
+ _('glossary seems to be misformatted, check indentation'),
+ source=source, line=lineno))
+ elif in_comment:
+ pass
+ else:
+ if not in_definition:
+ # first line of definition, determines indentation
+ in_definition = True
+ indent_len = len(line) - len(line.lstrip())
+ if entries:
+ entries[-1][1].append(line[indent_len:], source, lineno)
+ else:
+ messages.append(self.state.reporter.warning(
+ _('glossary seems to be misformatted, check indentation'),
+ source=source, line=lineno))
+ was_empty = False
+
+ # now, parse all the entries into a big definition list
+ items: list[nodes.definition_list_item] = []
+ for terms, definition in entries:
+ termnodes: list[Node] = []
+ system_messages: list[Node] = []
+ for line, source, lineno in terms:
+ parts = split_term_classifiers(line)
+ # parse the term with inline markup
+ # classifiers (parts[1:]) will not be shown on doctree
+ textnodes, sysmsg = self.state.inline_text(parts[0], # type: ignore[arg-type]
+ lineno)
+
+ # use first classifier as a index key
+ term = make_glossary_term(self.env, textnodes,
+ parts[1], source, lineno, # type: ignore[arg-type]
+ node_id=None, document=self.state.document)
+ term.rawsource = line
+ system_messages.extend(sysmsg)
+ termnodes.append(term)
+
+ termnodes.extend(system_messages)
+
+ defnode = nodes.definition()
+ if definition:
+ self.state.nested_parse(definition, definition.items[0][1],
+ defnode)
+ termnodes.append(defnode)
+ items.append(nodes.definition_list_item('', *termnodes))
+
+ dlist = nodes.definition_list('', *items)
+ dlist['classes'].append('glossary')
+ node += dlist
+ return messages + [node]
+
+
+def token_xrefs(text: str, productionGroup: str = '') -> list[Node]:
+ if len(productionGroup) != 0:
+ productionGroup += ':'
+ retnodes: list[Node] = []
+ pos = 0
+ for m in token_re.finditer(text):
+ if m.start() > pos:
+ txt = text[pos:m.start()]
+ retnodes.append(nodes.Text(txt))
+ token = m.group(1)
+ if ':' in token:
+ if token[0] == '~':
+ _, title = token.split(':')
+ target = token[1:]
+ elif token[0] == ':':
+ title = token[1:]
+ target = title
+ else:
+ title = token
+ target = token
+ else:
+ title = token
+ target = productionGroup + token
+ refnode = pending_xref(title, reftype='token', refdomain='std',
+ reftarget=target)
+ refnode += nodes.literal(token, title, classes=['xref'])
+ retnodes.append(refnode)
+ pos = m.end()
+ if pos < len(text):
+ retnodes.append(nodes.Text(text[pos:]))
+ return retnodes
+
+
+class ProductionList(SphinxDirective):
+ """
+ Directive to list grammar productions.
+ """
+
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ domain = cast(StandardDomain, self.env.get_domain('std'))
+ node: Element = addnodes.productionlist()
+ self.set_source_info(node)
+ # The backslash handling is from ObjectDescription.get_signatures
+ nl_escape_re = re.compile(r'\\\n')
+ lines = nl_escape_re.sub('', self.arguments[0]).split('\n')
+
+ productionGroup = ""
+ first_rule_seen = False
+ for rule in lines:
+ if not first_rule_seen and ':' not in rule:
+ productionGroup = rule.strip()
+ continue
+ first_rule_seen = True
+ try:
+ name, tokens = rule.split(':', 1)
+ except ValueError:
+ break
+ subnode = addnodes.production(rule)
+ name = name.strip()
+ subnode['tokenname'] = name
+ if subnode['tokenname']:
+ prefix = 'grammar-token-%s' % productionGroup
+ node_id = make_id(self.env, self.state.document, prefix, name)
+ subnode['ids'].append(node_id)
+ self.state.document.note_implicit_target(subnode, subnode)
+
+ if len(productionGroup) != 0:
+ objName = f"{productionGroup}:{name}"
+ else:
+ objName = name
+ domain.note_object('token', objName, node_id, location=node)
+ subnode.extend(token_xrefs(tokens, productionGroup))
+ node.append(subnode)
+ return [node]
+
+
+class TokenXRefRole(XRefRole):
+ def process_link(self, env: BuildEnvironment, refnode: Element, has_explicit_title: bool,
+ title: str, target: str) -> tuple[str, str]:
+ target = target.lstrip('~') # a title-specific thing
+ if not self.has_explicit_title and title[0] == '~':
+ if ':' in title:
+ _, title = title.split(':')
+ else:
+ title = title[1:]
+ return title, target
+
+
+class StandardDomain(Domain):
+ """
+ Domain for all objects that don't fit into another domain or are added
+ via the application interface.
+ """
+
+ name = 'std'
+ label = 'Default'
+
+ object_types: dict[str, ObjType] = {
+ 'term': ObjType(_('glossary term'), 'term', searchprio=-1),
+ 'token': ObjType(_('grammar token'), 'token', searchprio=-1),
+ 'label': ObjType(_('reference label'), 'ref', 'keyword',
+ searchprio=-1),
+ 'envvar': ObjType(_('environment variable'), 'envvar'),
+ 'cmdoption': ObjType(_('program option'), 'option'),
+ 'doc': ObjType(_('document'), 'doc', searchprio=-1),
+ }
+
+ directives: dict[str, type[Directive]] = {
+ 'program': Program,
+ 'cmdoption': Cmdoption, # old name for backwards compatibility
+ 'option': Cmdoption,
+ 'envvar': EnvVar,
+ 'glossary': Glossary,
+ 'productionlist': ProductionList,
+ }
+ roles: dict[str, RoleFunction | XRefRole] = {
+ 'option': OptionXRefRole(warn_dangling=True),
+ 'envvar': EnvVarXRefRole(),
+ # links to tokens in grammar productions
+ 'token': TokenXRefRole(),
+ # links to terms in glossary
+ 'term': XRefRole(innernodeclass=nodes.inline,
+ warn_dangling=True),
+ # links to headings or arbitrary labels
+ 'ref': XRefRole(lowercase=True, innernodeclass=nodes.inline,
+ warn_dangling=True),
+ # links to labels of numbered figures, tables and code-blocks
+ 'numref': XRefRole(lowercase=True,
+ warn_dangling=True),
+ # links to labels, without a different title
+ 'keyword': XRefRole(warn_dangling=True),
+ # links to documents
+ 'doc': XRefRole(warn_dangling=True, innernodeclass=nodes.inline),
+ }
+
+ initial_data: Final = { # type: ignore[misc]
+ 'progoptions': {}, # (program, name) -> docname, labelid
+ 'objects': {}, # (type, name) -> docname, labelid
+ 'labels': { # labelname -> docname, labelid, sectionname
+ 'genindex': ('genindex', '', _('Index')),
+ 'modindex': ('py-modindex', '', _('Module Index')),
+ 'search': ('search', '', _('Search Page')),
+ },
+ 'anonlabels': { # labelname -> docname, labelid
+ 'genindex': ('genindex', ''),
+ 'modindex': ('py-modindex', ''),
+ 'search': ('search', ''),
+ },
+ }
+
+ _virtual_doc_names: dict[str, tuple[str, str]] = { # labelname -> docname, sectionname
+ 'genindex': ('genindex', _('Index')),
+ 'modindex': ('py-modindex', _('Module Index')),
+ 'search': ('search', _('Search Page')),
+ }
+
+ dangling_warnings = {
+ 'term': 'term not in glossary: %(target)r',
+ 'numref': 'undefined label: %(target)r',
+ 'keyword': 'unknown keyword: %(target)r',
+ 'doc': 'unknown document: %(target)r',
+ 'option': 'unknown option: %(target)r',
+ }
+
+ # node_class -> (figtype, title_getter)
+ enumerable_nodes: dict[type[Node], tuple[str, TitleGetter | None]] = {
+ nodes.figure: ('figure', None),
+ nodes.table: ('table', None),
+ nodes.container: ('code-block', None),
+ }
+
+ def __init__(self, env: BuildEnvironment) -> None:
+ super().__init__(env)
+
+ # set up enumerable nodes
+ self.enumerable_nodes = copy(self.enumerable_nodes) # create a copy for this instance
+ for node, settings in env.app.registry.enumerable_nodes.items():
+ self.enumerable_nodes[node] = settings
+
+ def note_hyperlink_target(self, name: str, docname: str, node_id: str,
+ title: str = '') -> None:
+ """Add a hyperlink target for cross reference.
+
+ .. warning::
+
+ This is only for internal use. Please don't use this from your extension.
+ ``document.note_explicit_target()`` or ``note_implicit_target()`` are recommended to
+ add a hyperlink target to the document.
+
+ This only adds a hyperlink target to the StandardDomain. And this does not add a
+ node_id to node. Therefore, it is very fragile to calling this without
+ understanding hyperlink target framework in both docutils and Sphinx.
+
+ .. versionadded:: 3.0
+ """
+ if name in self.anonlabels and self.anonlabels[name] != (docname, node_id):
+ logger.warning(__('duplicate label %s, other instance in %s'),
+ name, self.env.doc2path(self.anonlabels[name][0]))
+
+ self.anonlabels[name] = (docname, node_id)
+ if title:
+ self.labels[name] = (docname, node_id, title)
+
+ @property
+ def objects(self) -> dict[tuple[str, str], tuple[str, str]]:
+ return self.data.setdefault('objects', {}) # (objtype, name) -> docname, labelid
+
+ def note_object(self, objtype: str, name: str, labelid: str, location: Any = None,
+ ) -> None:
+ """Note a generic object for cross reference.
+
+ .. versionadded:: 3.0
+ """
+ if (objtype, name) in self.objects:
+ docname = self.objects[objtype, name][0]
+ logger.warning(__('duplicate %s description of %s, other instance in %s'),
+ objtype, name, docname, location=location)
+ self.objects[objtype, name] = (self.env.docname, labelid)
+
+ @property
+ def _terms(self) -> dict[str, tuple[str, str]]:
+ """.. note:: Will be removed soon. internal use only."""
+ return self.data.setdefault('terms', {}) # (name) -> docname, labelid
+
+ def _note_term(self, term: str, labelid: str, location: Any = None) -> None:
+ """Note a term for cross reference.
+
+ .. note:: Will be removed soon. internal use only.
+ """
+ self.note_object('term', term, labelid, location)
+
+ self._terms[term.lower()] = (self.env.docname, labelid)
+
+ @property
+ def progoptions(self) -> dict[tuple[str | None, str], tuple[str, str]]:
+ return self.data.setdefault('progoptions', {}) # (program, name) -> docname, labelid
+
+ @property
+ def labels(self) -> dict[str, tuple[str, str, str]]:
+ return self.data.setdefault('labels', {}) # labelname -> docname, labelid, sectionname
+
+ @property
+ def anonlabels(self) -> dict[str, tuple[str, str]]:
+ return self.data.setdefault('anonlabels', {}) # labelname -> docname, labelid
+
+ def clear_doc(self, docname: str) -> None:
+ key: Any = None
+ for key, (fn, _l) in list(self.progoptions.items()):
+ if fn == docname:
+ del self.progoptions[key]
+ for key, (fn, _l) in list(self.objects.items()):
+ if fn == docname:
+ del self.objects[key]
+ for key, (fn, _l) in list(self._terms.items()):
+ if fn == docname:
+ del self._terms[key]
+ for key, (fn, _l, _l) in list(self.labels.items()):
+ if fn == docname:
+ del self.labels[key]
+ for key, (fn, _l) in list(self.anonlabels.items()):
+ if fn == docname:
+ del self.anonlabels[key]
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
+ # XXX duplicates?
+ for key, data in otherdata['progoptions'].items():
+ if data[0] in docnames:
+ self.progoptions[key] = data
+ for key, data in otherdata['objects'].items():
+ if data[0] in docnames:
+ self.objects[key] = data
+ for key, data in otherdata['terms'].items():
+ if data[0] in docnames:
+ self._terms[key] = data
+ for key, data in otherdata['labels'].items():
+ if data[0] in docnames:
+ self.labels[key] = data
+ for key, data in otherdata['anonlabels'].items():
+ if data[0] in docnames:
+ self.anonlabels[key] = data
+
+ def process_doc(
+ self, env: BuildEnvironment, docname: str, document: nodes.document,
+ ) -> None:
+ for name, explicit in document.nametypes.items():
+ if not explicit:
+ continue
+ labelid = document.nameids[name]
+ if labelid is None:
+ continue
+ node = document.ids[labelid]
+ if isinstance(node, nodes.target) and 'refid' in node:
+ # indirect hyperlink targets
+ node = document.ids.get(node['refid']) # type: ignore[assignment]
+ labelid = node['names'][0]
+ if (node.tagname == 'footnote' or
+ 'refuri' in node or
+ node.tagname.startswith('desc_')):
+ # ignore footnote labels, labels automatically generated from a
+ # link and object descriptions
+ continue
+ if name in self.labels:
+ logger.warning(__('duplicate label %s, other instance in %s'),
+ name, env.doc2path(self.labels[name][0]),
+ location=node)
+ self.anonlabels[name] = docname, labelid
+ if node.tagname == 'section':
+ title = cast(nodes.title, node[0])
+ sectname = clean_astext(title)
+ elif node.tagname == 'rubric':
+ sectname = clean_astext(node)
+ elif self.is_enumerable_node(node):
+ sectname = self.get_numfig_title(node) or ''
+ if not sectname:
+ continue
+ else:
+ if (isinstance(node, (nodes.definition_list,
+ nodes.field_list)) and
+ node.children):
+ node = cast(nodes.Element, node.children[0])
+ if isinstance(node, (nodes.field, nodes.definition_list_item)):
+ node = cast(nodes.Element, node.children[0])
+ if isinstance(node, (nodes.term, nodes.field_name)):
+ sectname = clean_astext(node)
+ else:
+ toctree = next(node.findall(addnodes.toctree), None)
+ if toctree and toctree.get('caption'):
+ sectname = toctree['caption']
+ else:
+ # anonymous-only labels
+ continue
+ self.labels[name] = docname, labelid, sectname
+
+ def add_program_option(self, program: str | None, name: str,
+ docname: str, labelid: str) -> None:
+ # prefer first command option entry
+ if (program, name) not in self.progoptions:
+ self.progoptions[program, name] = (docname, labelid)
+
+ def build_reference_node(self, fromdocname: str, builder: Builder, docname: str,
+ labelid: str, sectname: str, rolename: str, **options: Any,
+ ) -> Element:
+ nodeclass = options.pop('nodeclass', nodes.reference)
+ newnode = nodeclass('', '', internal=True, **options)
+ innernode = nodes.inline(sectname, sectname)
+ if innernode.get('classes') is not None:
+ innernode['classes'].append('std')
+ innernode['classes'].append('std-' + rolename)
+ if docname == fromdocname:
+ newnode['refid'] = labelid
+ else:
+ # set more info in contnode; in case the
+ # get_relative_uri call raises NoUri,
+ # the builder will then have to resolve these
+ contnode = pending_xref('')
+ contnode['refdocname'] = docname
+ contnode['refsectname'] = sectname
+ newnode['refuri'] = builder.get_relative_uri(
+ fromdocname, docname)
+ if labelid:
+ newnode['refuri'] += '#' + labelid
+ newnode.append(innernode)
+ return newnode
+
+ def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: Builder,
+ typ: str, target: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ if typ == 'ref':
+ resolver = self._resolve_ref_xref
+ elif typ == 'numref':
+ resolver = self._resolve_numref_xref
+ elif typ == 'keyword':
+ resolver = self._resolve_keyword_xref
+ elif typ == 'doc':
+ resolver = self._resolve_doc_xref
+ elif typ == 'option':
+ resolver = self._resolve_option_xref
+ elif typ == 'term':
+ resolver = self._resolve_term_xref
+ else:
+ resolver = self._resolve_obj_xref
+
+ return resolver(env, fromdocname, builder, typ, target, node, contnode)
+
+ def _resolve_ref_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, typ: str, target: str, node: pending_xref,
+ contnode: Element) -> Element | None:
+ if node['refexplicit']:
+ # reference to anonymous label; the reference uses
+ # the supplied link caption
+ docname, labelid = self.anonlabels.get(target, ('', ''))
+ sectname = node.astext()
+ else:
+ # reference to named label; the final node will
+ # contain the section name after the label
+ docname, labelid, sectname = self.labels.get(target, ('', '', ''))
+ if not docname:
+ return None
+
+ return self.build_reference_node(fromdocname, builder,
+ docname, labelid, sectname, 'ref')
+
+ def _resolve_numref_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, typ: str, target: str,
+ node: pending_xref, contnode: Element) -> Element | None:
+ if target in self.labels:
+ docname, labelid, figname = self.labels.get(target, ('', '', ''))
+ else:
+ docname, labelid = self.anonlabels.get(target, ('', ''))
+ figname = None
+
+ if not docname:
+ return None
+
+ target_node = env.get_doctree(docname).ids.get(labelid)
+ assert target_node is not None
+ figtype = self.get_enumerable_node_type(target_node)
+ if figtype is None:
+ return None
+
+ if figtype != 'section' and env.config.numfig is False:
+ logger.warning(__('numfig is disabled. :numref: is ignored.'), location=node)
+ return contnode
+
+ try:
+ fignumber = self.get_fignumber(env, builder, figtype, docname, target_node)
+ if fignumber is None:
+ return contnode
+ except ValueError:
+ logger.warning(__("Failed to create a cross reference. Any number is not "
+ "assigned: %s"),
+ labelid, location=node)
+ return contnode
+
+ try:
+ if node['refexplicit']:
+ title = contnode.astext()
+ else:
+ title = env.config.numfig_format.get(figtype, '')
+
+ if figname is None and '{name}' in title:
+ logger.warning(__('the link has no caption: %s'), title, location=node)
+ return contnode
+ else:
+ fignum = '.'.join(map(str, fignumber))
+ if '{name}' in title or 'number' in title:
+ # new style format (cf. "Fig.{number}")
+ if figname:
+ newtitle = title.format(name=figname, number=fignum)
+ else:
+ newtitle = title.format(number=fignum)
+ else:
+ # old style format (cf. "Fig.%s")
+ newtitle = title % fignum
+ except KeyError as exc:
+ logger.warning(__('invalid numfig_format: %s (%r)'), title, exc, location=node)
+ return contnode
+ except TypeError:
+ logger.warning(__('invalid numfig_format: %s'), title, location=node)
+ return contnode
+
+ return self.build_reference_node(fromdocname, builder,
+ docname, labelid, newtitle, 'numref',
+ nodeclass=addnodes.number_reference,
+ title=title)
+
+ def _resolve_keyword_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, typ: str, target: str,
+ node: pending_xref, contnode: Element) -> Element | None:
+ # keywords are oddballs: they are referenced by named labels
+ docname, labelid, _ = self.labels.get(target, ('', '', ''))
+ if not docname:
+ return None
+ return make_refnode(builder, fromdocname, docname,
+ labelid, contnode)
+
+ def _resolve_doc_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, typ: str, target: str,
+ node: pending_xref, contnode: Element) -> Element | None:
+ # directly reference to document by source name; can be absolute or relative
+ refdoc = node.get('refdoc', fromdocname)
+ docname = docname_join(refdoc, node['reftarget'])
+ if docname not in env.all_docs:
+ return None
+ else:
+ if node['refexplicit']:
+ # reference with explicit title
+ caption = node.astext()
+ else:
+ caption = clean_astext(env.titles[docname])
+ innernode = nodes.inline(caption, caption, classes=['doc'])
+ return make_refnode(builder, fromdocname, docname, None, innernode)
+
+ def _resolve_option_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, typ: str, target: str,
+ node: pending_xref, contnode: Element) -> Element | None:
+ progname = node.get('std:program')
+ target = target.strip()
+ docname, labelid = self.progoptions.get((progname, target), ('', ''))
+ if not docname:
+ # Support also reference that contain an option value:
+ # * :option:`-foo=bar`
+ # * :option:`-foo[=bar]`
+ # * :option:`-foo bar`
+ for needle in {'=', '[=', ' '}:
+ if needle in target:
+ stem, _, _ = target.partition(needle)
+ docname, labelid = self.progoptions.get((progname, stem), ('', ''))
+ if docname:
+ break
+ if not docname:
+ commands = []
+ while ws_re.search(target):
+ subcommand, target = ws_re.split(target, 1)
+ commands.append(subcommand)
+ progname = "-".join(commands)
+
+ docname, labelid = self.progoptions.get((progname, target), ('', ''))
+ if docname:
+ break
+ else:
+ return None
+
+ return make_refnode(builder, fromdocname, docname,
+ labelid, contnode)
+
+ def _resolve_term_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, typ: str, target: str,
+ node: pending_xref, contnode: Element) -> Element | None:
+ result = self._resolve_obj_xref(env, fromdocname, builder, typ,
+ target, node, contnode)
+ if result:
+ return result
+ else:
+ # fallback to case insensitive match
+ if target.lower() in self._terms:
+ docname, labelid = self._terms[target.lower()]
+ return make_refnode(builder, fromdocname, docname, labelid, contnode)
+ else:
+ return None
+
+ def _resolve_obj_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, typ: str, target: str,
+ node: pending_xref, contnode: Element) -> Element | None:
+ objtypes = self.objtypes_for_role(typ) or []
+ for objtype in objtypes:
+ if (objtype, target) in self.objects:
+ docname, labelid = self.objects[objtype, target]
+ break
+ else:
+ docname, labelid = '', ''
+ if not docname:
+ return None
+ return make_refnode(builder, fromdocname, docname,
+ labelid, contnode)
+
+ def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str,
+ builder: Builder, target: str, node: pending_xref,
+ contnode: Element) -> list[tuple[str, Element]]:
+ results: list[tuple[str, Element]] = []
+ ltarget = target.lower() # :ref: lowercases its target automatically
+ for role in ('ref', 'option'): # do not try "keyword"
+ res = self.resolve_xref(env, fromdocname, builder, role,
+ ltarget if role == 'ref' else target,
+ node, contnode)
+ if res:
+ results.append(('std:' + role, res))
+ # all others
+ for objtype in self.object_types:
+ key = (objtype, target)
+ if objtype == 'term':
+ key = (objtype, ltarget)
+ if key in self.objects:
+ docname, labelid = self.objects[key]
+ role = 'std:' + self.role_for_objtype(objtype) # type: ignore[operator]
+ results.append((role, make_refnode(builder, fromdocname, docname,
+ labelid, contnode)))
+ return results
+
+ def get_objects(self) -> Iterator[tuple[str, str, str, str, str, int]]:
+ # handle the special 'doc' reference here
+ for doc in self.env.all_docs:
+ yield (doc, clean_astext(self.env.titles[doc]), 'doc', doc, '', -1)
+ for (prog, option), info in self.progoptions.items():
+ if prog:
+ fullname = ".".join([prog, option])
+ yield (fullname, fullname, 'cmdoption', info[0], info[1], 1)
+ else:
+ yield (option, option, 'cmdoption', info[0], info[1], 1)
+ for (type, name), info in self.objects.items():
+ yield (name, name, type, info[0], info[1],
+ self.object_types[type].attrs['searchprio'])
+ for name, (docname, labelid, sectionname) in self.labels.items():
+ yield (name, sectionname, 'label', docname, labelid, -1)
+ # add anonymous-only labels as well
+ non_anon_labels = set(self.labels)
+ for name, (docname, labelid) in self.anonlabels.items():
+ if name not in non_anon_labels:
+ yield (name, name, 'label', docname, labelid, -1)
+
+ def get_type_name(self, type: ObjType, primary: bool = False) -> str:
+ # never prepend "Default"
+ return type.lname
+
+ def is_enumerable_node(self, node: Node) -> bool:
+ return node.__class__ in self.enumerable_nodes
+
+ def get_numfig_title(self, node: Node) -> str | None:
+ """Get the title of enumerable nodes to refer them using its title"""
+ if self.is_enumerable_node(node):
+ elem = cast(Element, node)
+ _, title_getter = self.enumerable_nodes.get(elem.__class__, (None, None))
+ if title_getter:
+ return title_getter(elem)
+ else:
+ for subnode in elem:
+ if isinstance(subnode, (nodes.caption, nodes.title)):
+ return clean_astext(subnode)
+
+ return None
+
+ def get_enumerable_node_type(self, node: Node) -> str | None:
+ """Get type of enumerable nodes."""
+ def has_child(node: Element, cls: type) -> bool:
+ return any(isinstance(child, cls) for child in node)
+
+ if isinstance(node, nodes.section):
+ return 'section'
+ elif (isinstance(node, nodes.container) and
+ 'literal_block' in node and
+ has_child(node, nodes.literal_block)):
+ # given node is a code-block having caption
+ return 'code-block'
+ else:
+ figtype, _ = self.enumerable_nodes.get(node.__class__, (None, None))
+ return figtype
+
+ def get_fignumber(
+ self,
+ env: BuildEnvironment,
+ builder: Builder,
+ figtype: str,
+ docname: str,
+ target_node: Element,
+ ) -> tuple[int, ...] | None:
+ if figtype == 'section':
+ if builder.name == 'latex':
+ return ()
+ elif docname not in env.toc_secnumbers:
+ raise ValueError # no number assigned
+ else:
+ anchorname = '#' + target_node['ids'][0]
+ if anchorname not in env.toc_secnumbers[docname]:
+ # try first heading which has no anchor
+ return env.toc_secnumbers[docname].get('')
+ else:
+ return env.toc_secnumbers[docname].get(anchorname)
+ else:
+ try:
+ figure_id = target_node['ids'][0]
+ return env.toc_fignumbers[docname][figtype][figure_id]
+ except (KeyError, IndexError) as exc:
+ # target_node is found, but fignumber is not assigned.
+ # Maybe it is defined in orphaned document.
+ raise ValueError from exc
+
+ def get_full_qualified_name(self, node: Element) -> str | None:
+ if node.get('reftype') == 'option':
+ progname = node.get('std:program')
+ command = ws_re.split(node.get('reftarget'))
+ if progname:
+ command.insert(0, progname)
+ option = command.pop()
+ if command:
+ return '.'.join(['-'.join(command), option])
+ else:
+ return None
+ else:
+ return None
+
+
+def warn_missing_reference(app: Sphinx, domain: Domain, node: pending_xref,
+ ) -> bool | None:
+ if (domain and domain.name != 'std') or node['reftype'] != 'ref':
+ return None
+ else:
+ target = node['reftarget']
+ if target not in domain.anonlabels: # type: ignore[attr-defined]
+ msg = __('undefined label: %r')
+ else:
+ msg = __('Failed to create a cross reference. A title or caption not found: %r')
+
+ logger.warning(msg % target, location=node, type='ref', subtype=node['reftype'])
+ return True
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_domain(StandardDomain)
+ app.connect('warn-missing-reference', warn_missing_reference)
+
+ return {
+ 'version': 'builtin',
+ 'env_version': 2,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py
new file mode 100644
index 0000000..9b9e9dd
--- /dev/null
+++ b/sphinx/environment/__init__.py
@@ -0,0 +1,779 @@
+"""Global creation environment."""
+
+from __future__ import annotations
+
+import functools
+import os
+import pickle
+import time
+from collections import defaultdict
+from copy import copy
+from os import path
+from typing import TYPE_CHECKING, Any, Callable
+
+from sphinx import addnodes
+from sphinx.environment.adapters import toctree as toctree_adapters
+from sphinx.errors import BuildEnvironmentError, DocumentError, ExtensionError, SphinxError
+from sphinx.locale import __
+from sphinx.transforms import SphinxTransformer
+from sphinx.util import DownloadFiles, FilenameUniqDict, logging
+from sphinx.util.docutils import LoggingReporter
+from sphinx.util.i18n import CatalogRepository, docname_to_domain
+from sphinx.util.nodes import is_translatable
+from sphinx.util.osutil import canon_path, os_path
+
+if TYPE_CHECKING:
+ from collections.abc import Generator, Iterator
+ from pathlib import Path
+
+ from docutils import nodes
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.config import Config
+ from sphinx.domains import Domain
+ from sphinx.events import EventManager
+ from sphinx.project import Project
+
+logger = logging.getLogger(__name__)
+
+default_settings: dict[str, Any] = {
+ 'auto_id_prefix': 'id',
+ 'image_loading': 'link',
+ 'embed_stylesheet': False,
+ 'cloak_email_addresses': True,
+ 'pep_base_url': 'https://peps.python.org/',
+ 'pep_references': None,
+ 'rfc_base_url': 'https://datatracker.ietf.org/doc/html/',
+ 'rfc_references': None,
+ 'input_encoding': 'utf-8-sig',
+ 'doctitle_xform': False,
+ 'sectsubtitle_xform': False,
+ 'section_self_link': False,
+ 'halt_level': 5,
+ 'file_insertion_enabled': True,
+ 'smartquotes_locales': [],
+}
+
+# This is increased every time an environment attribute is added
+# or changed to properly invalidate pickle files.
+ENV_VERSION = 60
+
+# config status
+CONFIG_UNSET = -1
+CONFIG_OK = 1
+CONFIG_NEW = 2
+CONFIG_CHANGED = 3
+CONFIG_EXTENSIONS_CHANGED = 4
+
+CONFIG_CHANGED_REASON = {
+ CONFIG_NEW: __('new config'),
+ CONFIG_CHANGED: __('config changed'),
+ CONFIG_EXTENSIONS_CHANGED: __('extensions changed'),
+}
+
+
+versioning_conditions: dict[str, bool | Callable] = {
+ 'none': False,
+ 'text': is_translatable,
+}
+
+if TYPE_CHECKING:
+ from collections.abc import MutableMapping
+ from typing import Literal
+
+ from typing_extensions import overload
+
+ from sphinx.domains.c import CDomain
+ from sphinx.domains.changeset import ChangeSetDomain
+ from sphinx.domains.citation import CitationDomain
+ from sphinx.domains.cpp import CPPDomain
+ from sphinx.domains.index import IndexDomain
+ from sphinx.domains.javascript import JavaScriptDomain
+ from sphinx.domains.math import MathDomain
+ from sphinx.domains.python import PythonDomain
+ from sphinx.domains.rst import ReSTDomain
+ from sphinx.domains.std import StandardDomain
+ from sphinx.ext.duration import DurationDomain
+ from sphinx.ext.todo import TodoDomain
+
+ class _DomainsType(MutableMapping[str, Domain]):
+ @overload
+ def __getitem__(self, key: Literal["c"]) -> CDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["cpp"]) -> CPPDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["changeset"]) -> ChangeSetDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["citation"]) -> CitationDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["index"]) -> IndexDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["js"]) -> JavaScriptDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["math"]) -> MathDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["py"]) -> PythonDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["rst"]) -> ReSTDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["std"]) -> StandardDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["duration"]) -> DurationDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: Literal["todo"]) -> TodoDomain: ... # NoQA: E704
+ @overload
+ def __getitem__(self, key: str) -> Domain: ... # NoQA: E704
+ def __getitem__(self, key): raise NotImplementedError # NoQA: E704
+ def __setitem__(self, key, value): raise NotImplementedError # NoQA: E704
+ def __delitem__(self, key): raise NotImplementedError # NoQA: E704
+ def __iter__(self): raise NotImplementedError # NoQA: E704
+ def __len__(self): raise NotImplementedError # NoQA: E704
+
+else:
+ _DomainsType = dict
+
+
+class BuildEnvironment:
+ """
+ The environment in which the ReST files are translated.
+ Stores an inventory of cross-file targets and provides doctree
+ transformations to resolve links to them.
+ """
+
+ domains: _DomainsType
+
+ # --------- ENVIRONMENT INITIALIZATION -------------------------------------
+
+ def __init__(self, app: Sphinx):
+ self.app: Sphinx = app
+ self.doctreedir: Path = app.doctreedir
+ self.srcdir: Path = app.srcdir
+ self.config: Config = None # type: ignore[assignment]
+ self.config_status: int = CONFIG_UNSET
+ self.config_status_extra: str = ''
+ self.events: EventManager = app.events
+ self.project: Project = app.project
+ self.version: dict[str, str] = app.registry.get_envversion(app)
+
+ # the method of doctree versioning; see set_versioning_method
+ self.versioning_condition: bool | Callable | None = None
+ self.versioning_compare: bool | None = None
+
+ # all the registered domains, set by the application
+ self.domains = _DomainsType()
+
+ # the docutils settings for building
+ self.settings: dict[str, Any] = default_settings.copy()
+ self.settings['env'] = self
+
+ # All "docnames" here are /-separated and relative and exclude
+ # the source suffix.
+
+ # docname -> time of reading (in integer microseconds)
+ # contains all read docnames
+ self.all_docs: dict[str, int] = {}
+ # docname -> set of dependent file
+ # names, relative to documentation root
+ self.dependencies: dict[str, set[str]] = defaultdict(set)
+ # docname -> set of included file
+ # docnames included from other documents
+ self.included: dict[str, set[str]] = defaultdict(set)
+ # docnames to re-read unconditionally on next build
+ self.reread_always: set[str] = set()
+
+ # docname -> pickled doctree
+ self._pickled_doctree_cache: dict[str, bytes] = {}
+
+ # docname -> doctree
+ self._write_doc_doctree_cache: dict[str, nodes.document] = {}
+
+ # File metadata
+ # docname -> dict of metadata items
+ self.metadata: dict[str, dict[str, Any]] = defaultdict(dict)
+
+ # TOC inventory
+ # docname -> title node
+ self.titles: dict[str, nodes.title] = {}
+ # docname -> title node; only different if
+ # set differently with title directive
+ self.longtitles: dict[str, nodes.title] = {}
+ # docname -> table of contents nodetree
+ self.tocs: dict[str, nodes.bullet_list] = {}
+ # docname -> number of real entries
+ self.toc_num_entries: dict[str, int] = {}
+
+ # used to determine when to show the TOC
+ # in a sidebar (don't show if it's only one item)
+ # docname -> dict of sectionid -> number
+ self.toc_secnumbers: dict[str, dict[str, tuple[int, ...]]] = {}
+ # docname -> dict of figtype -> dict of figureid -> number
+ self.toc_fignumbers: dict[str, dict[str, dict[str, tuple[int, ...]]]] = {}
+
+ # docname -> list of toctree includefiles
+ self.toctree_includes: dict[str, list[str]] = {}
+ # docname -> set of files (containing its TOCs) to rebuild too
+ self.files_to_rebuild: dict[str, set[str]] = {}
+ # docnames that have :glob: toctrees
+ self.glob_toctrees: set[str] = set()
+ # docnames that have :numbered: toctrees
+ self.numbered_toctrees: set[str] = set()
+
+ # domain-specific inventories, here to be pickled
+ # domainname -> domain-specific dict
+ self.domaindata: dict[str, dict] = {}
+
+ # these map absolute path -> (docnames, unique filename)
+ self.images: FilenameUniqDict = FilenameUniqDict()
+ # filename -> (set of docnames, destination)
+ self.dlfiles: DownloadFiles = DownloadFiles()
+
+ # the original URI for images
+ self.original_image_uri: dict[str, str] = {}
+
+ # temporary data storage while reading a document
+ self.temp_data: dict[str, Any] = {}
+ # context for cross-references (e.g. current module or class)
+ # this is similar to temp_data, but will for example be copied to
+ # attributes of "any" cross references
+ self.ref_context: dict[str, Any] = {}
+
+ # search index data
+
+ # docname -> title
+ self._search_index_titles: dict[str, str] = {}
+ # docname -> filename
+ self._search_index_filenames: dict[str, str] = {}
+ # stemmed words -> set(docname)
+ self._search_index_mapping: dict[str, set[str]] = {}
+ # stemmed words in titles -> set(docname)
+ self._search_index_title_mapping: dict[str, set[str]] = {}
+ # docname -> all titles in document
+ self._search_index_all_titles: dict[str, list[tuple[str, str]]] = {}
+ # docname -> list(index entry)
+ self._search_index_index_entries: dict[str, list[tuple[str, str, str]]] = {}
+ # objtype -> index
+ self._search_index_objtypes: dict[tuple[str, str], int] = {}
+ # objtype index -> (domain, type, objname (localized))
+ self._search_index_objnames: dict[int, tuple[str, str, str]] = {}
+
+ # set up environment
+ self.setup(app)
+
+ def __getstate__(self) -> dict:
+ """Obtains serializable data for pickling."""
+ __dict__ = self.__dict__.copy()
+ __dict__.update(app=None, domains={}, events=None) # clear unpickable attributes
+ return __dict__
+
+ def __setstate__(self, state: dict) -> None:
+ self.__dict__.update(state)
+
+ def setup(self, app: Sphinx) -> None:
+ """Set up BuildEnvironment object."""
+ if self.version and self.version != app.registry.get_envversion(app):
+ raise BuildEnvironmentError(__('build environment version not current'))
+ if self.srcdir and self.srcdir != app.srcdir:
+ raise BuildEnvironmentError(__('source directory has changed'))
+
+ if self.project:
+ app.project.restore(self.project)
+
+ self.app = app
+ self.doctreedir = app.doctreedir
+ self.events = app.events
+ self.srcdir = app.srcdir
+ self.project = app.project
+ self.version = app.registry.get_envversion(app)
+
+ # initialize domains
+ self.domains = _DomainsType()
+ for domain in app.registry.create_domains(self):
+ self.domains[domain.name] = domain
+
+ # setup domains (must do after all initialization)
+ for domain in self.domains.values():
+ domain.setup()
+
+ # initialize config
+ self._update_config(app.config)
+
+ # initialie settings
+ self._update_settings(app.config)
+
+ def _update_config(self, config: Config) -> None:
+ """Update configurations by new one."""
+ self.config_status = CONFIG_OK
+ self.config_status_extra = ''
+ if self.config is None:
+ self.config_status = CONFIG_NEW
+ elif self.config.extensions != config.extensions:
+ self.config_status = CONFIG_EXTENSIONS_CHANGED
+ extensions = sorted(
+ set(self.config.extensions) ^ set(config.extensions))
+ if len(extensions) == 1:
+ extension = extensions[0]
+ else:
+ extension = '%d' % (len(extensions),)
+ self.config_status_extra = f' ({extension!r})'
+ else:
+ # check if a config value was changed that affects how
+ # doctrees are read
+ for item in config.filter('env'):
+ if self.config[item.name] != item.value:
+ self.config_status = CONFIG_CHANGED
+ self.config_status_extra = f' ({item.name!r})'
+ break
+
+ self.config = config
+
+ def _update_settings(self, config: Config) -> None:
+ """Update settings by new config."""
+ self.settings['input_encoding'] = config.source_encoding
+ self.settings['trim_footnote_reference_space'] = config.trim_footnote_reference_space
+ self.settings['language_code'] = config.language
+
+ # Allow to disable by 3rd party extension (workaround)
+ self.settings.setdefault('smart_quotes', True)
+
+ def set_versioning_method(self, method: str | Callable, compare: bool) -> None:
+ """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.
+ """
+ condition: bool | Callable
+ if callable(method):
+ condition = method
+ else:
+ 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
+ self.versioning_compare = compare
+
+ def clear_doc(self, docname: str) -> None:
+ """Remove all traces of a source file in the inventory."""
+ if docname in self.all_docs:
+ self.all_docs.pop(docname, None)
+ self.included.pop(docname, None)
+ self.reread_always.discard(docname)
+
+ for domain in self.domains.values():
+ domain.clear_doc(docname)
+
+ def merge_info_from(self, docnames: list[str], other: BuildEnvironment,
+ app: Sphinx) -> None:
+ """Merge global information gathered about *docnames* while reading them
+ from the *other* environment.
+
+ This possibly comes from a parallel build process.
+ """
+ docnames = set(docnames) # type: ignore[assignment]
+ for docname in docnames:
+ self.all_docs[docname] = other.all_docs[docname]
+ self.included[docname] = other.included[docname]
+ if docname in other.reread_always:
+ self.reread_always.add(docname)
+
+ for domainname, domain in self.domains.items():
+ domain.merge_domaindata(docnames, other.domaindata[domainname])
+ self.events.emit('env-merge-info', self, docnames, other)
+
+ def path2doc(self, filename: str | os.PathLike[str]) -> str | None:
+ """Return the docname for the filename if the file is document.
+
+ *filename* should be absolute or relative to the source directory.
+ """
+ return self.project.path2doc(filename)
+
+ def doc2path(self, docname: str, base: bool = True) -> str:
+ """Return the filename for the document name.
+
+ If *base* is True, return absolute path under self.srcdir.
+ If *base* is False, return relative path to self.srcdir.
+ """
+ return self.project.doc2path(docname, base)
+
+ def relfn2path(self, filename: str, docname: str | None = None) -> tuple[str, str]:
+ """Return paths to a file referenced from a document, relative to
+ documentation root and absolute.
+
+ In the input "filename", absolute filenames are taken as relative to the
+ source dir, while relative filenames are relative to the dir of the
+ containing document.
+ """
+ filename = os_path(filename)
+ if filename.startswith(('/', os.sep)):
+ rel_fn = filename[1:]
+ else:
+ docdir = path.dirname(self.doc2path(docname or self.docname,
+ base=False))
+ rel_fn = path.join(docdir, filename)
+
+ return (canon_path(path.normpath(rel_fn)),
+ path.normpath(path.join(self.srcdir, rel_fn)))
+
+ @property
+ def found_docs(self) -> set[str]:
+ """contains all existing docnames."""
+ return self.project.docnames
+
+ def find_files(self, config: Config, builder: Builder) -> None:
+ """Find all source files in the source dir and put them in
+ self.found_docs.
+ """
+ try:
+ exclude_paths = (self.config.exclude_patterns +
+ self.config.templates_path +
+ builder.get_asset_paths())
+ self.project.discover(exclude_paths, self.config.include_patterns)
+
+ # Current implementation is applying translated messages in the reading
+ # phase.Therefore, in order to apply the updated message catalog, it is
+ # necessary to re-process from the reading phase. Here, if dependency
+ # is set for the doc source and the mo file, it is processed again from
+ # the reading phase when mo is updated. In the future, we would like to
+ # move i18n process into the writing phase, and remove these lines.
+ if builder.use_message_catalog:
+ # add catalog mo file dependency
+ repo = CatalogRepository(self.srcdir, self.config.locale_dirs,
+ self.config.language, self.config.source_encoding)
+ mo_paths = {c.domain: c.mo_path for c in repo.catalogs}
+ for docname in self.found_docs:
+ domain = docname_to_domain(docname, self.config.gettext_compact)
+ if domain in mo_paths:
+ self.dependencies[docname].add(mo_paths[domain])
+ except OSError as exc:
+ raise DocumentError(__('Failed to scan documents in %s: %r') %
+ (self.srcdir, exc)) from exc
+
+ def get_outdated_files(self, config_changed: bool) -> tuple[set[str], set[str], set[str]]:
+ """Return (added, changed, removed) sets."""
+ # clear all files no longer present
+ removed = set(self.all_docs) - self.found_docs
+
+ added: set[str] = set()
+ changed: set[str] = set()
+
+ if config_changed:
+ # config values affect e.g. substitutions
+ added = self.found_docs
+ else:
+ for docname in self.found_docs:
+ if docname not in self.all_docs:
+ logger.debug('[build target] added %r', docname)
+ added.add(docname)
+ continue
+ # if the doctree file is not there, rebuild
+ filename = path.join(self.doctreedir, docname + '.doctree')
+ if not path.isfile(filename):
+ logger.debug('[build target] changed %r', docname)
+ changed.add(docname)
+ continue
+ # check the "reread always" list
+ if docname in self.reread_always:
+ logger.debug('[build target] changed %r', docname)
+ changed.add(docname)
+ continue
+ # check the mtime of the document
+ mtime = self.all_docs[docname]
+ newmtime = _last_modified_time(self.doc2path(docname))
+ if newmtime > mtime:
+ logger.debug('[build target] outdated %r: %s -> %s',
+ docname,
+ _format_modified_time(mtime), _format_modified_time(newmtime))
+ changed.add(docname)
+ continue
+ # finally, check the mtime of dependencies
+ for dep in self.dependencies[docname]:
+ try:
+ # this will do the right thing when dep is absolute too
+ deppath = path.join(self.srcdir, dep)
+ if not path.isfile(deppath):
+ logger.debug(
+ '[build target] changed %r missing dependency %r',
+ docname, deppath,
+ )
+ changed.add(docname)
+ break
+ depmtime = _last_modified_time(deppath)
+ if depmtime > mtime:
+ logger.debug(
+ '[build target] outdated %r from dependency %r: %s -> %s',
+ docname, deppath,
+ _format_modified_time(mtime), _format_modified_time(depmtime),
+ )
+ changed.add(docname)
+ break
+ except OSError:
+ # give it another chance
+ changed.add(docname)
+ break
+
+ return added, changed, removed
+
+ def check_dependents(self, app: Sphinx, already: set[str]) -> Generator[str, None, None]:
+ to_rewrite: list[str] = []
+ for docnames in self.events.emit('env-get-updated', self):
+ to_rewrite.extend(docnames)
+ for docname in set(to_rewrite):
+ if docname not in already:
+ yield docname
+
+ # --------- SINGLE FILE READING --------------------------------------------
+
+ def prepare_settings(self, docname: str) -> None:
+ """Prepare to set up environment for reading."""
+ self.temp_data['docname'] = docname
+ # defaults to the global default, but can be re-set in a document
+ self.temp_data['default_role'] = self.config.default_role
+ self.temp_data['default_domain'] = \
+ self.domains.get(self.config.primary_domain)
+
+ # utilities to use while reading a document
+
+ @property
+ def docname(self) -> str:
+ """Returns the docname of the document currently being parsed."""
+ return self.temp_data['docname']
+
+ def new_serialno(self, category: str = '') -> int:
+ """Return a serial number, e.g. for index entry targets.
+
+ The number is guaranteed to be unique in the current document.
+ """
+ key = category + 'serialno'
+ cur = self.temp_data.get(key, 0)
+ self.temp_data[key] = cur + 1
+ return cur
+
+ def note_dependency(self, filename: str) -> None:
+ """Add *filename* as a dependency of the current document.
+
+ This means that the document will be rebuilt if this file changes.
+
+ *filename* should be absolute or relative to the source directory.
+ """
+ self.dependencies[self.docname].add(filename)
+
+ def note_included(self, filename: str) -> None:
+ """Add *filename* as a included from other document.
+
+ This means the document is not orphaned.
+
+ *filename* should be absolute or relative to the source directory.
+ """
+ doc = self.path2doc(filename)
+ if doc:
+ self.included[self.docname].add(doc)
+
+ def note_reread(self) -> None:
+ """Add the current document to the list of documents that will
+ automatically be re-read at the next build.
+ """
+ self.reread_always.add(self.docname)
+
+ def get_domain(self, domainname: str) -> Domain:
+ """Return the domain instance with the specified name.
+
+ Raises an ExtensionError if the domain is not registered.
+ """
+ try:
+ return self.domains[domainname]
+ except KeyError as exc:
+ raise ExtensionError(__('Domain %r is not registered') % domainname) from exc
+
+ # --------- RESOLVING REFERENCES AND TOCTREES ------------------------------
+
+ def get_doctree(self, docname: str) -> nodes.document:
+ """Read the doctree for a file from the pickle and return it."""
+ try:
+ serialised = self._pickled_doctree_cache[docname]
+ except KeyError:
+ filename = path.join(self.doctreedir, docname + '.doctree')
+ with open(filename, 'rb') as f:
+ serialised = self._pickled_doctree_cache[docname] = f.read()
+
+ doctree = pickle.loads(serialised)
+ doctree.settings.env = self
+ doctree.reporter = LoggingReporter(self.doc2path(docname))
+ return doctree
+
+ @functools.cached_property
+ def master_doctree(self) -> nodes.document:
+ return self.get_doctree(self.config.root_doc)
+
+ def get_and_resolve_doctree(
+ self,
+ docname: str,
+ builder: Builder,
+ doctree: nodes.document | None = None,
+ prune_toctrees: bool = True,
+ includehidden: bool = False,
+ ) -> nodes.document:
+ """Read the doctree from the pickle, resolve cross-references and
+ toctrees and return it.
+ """
+ if doctree is None:
+ try:
+ doctree = self._write_doc_doctree_cache.pop(docname)
+ doctree.settings.env = self
+ doctree.reporter = LoggingReporter(self.doc2path(docname))
+ except KeyError:
+ doctree = self.get_doctree(docname)
+
+ # resolve all pending cross-references
+ self.apply_post_transforms(doctree, docname)
+
+ # now, resolve all toctree nodes
+ for toctreenode in doctree.findall(addnodes.toctree):
+ result = toctree_adapters._resolve_toctree(
+ self, docname, builder, toctreenode,
+ prune=prune_toctrees,
+ includehidden=includehidden,
+ )
+ if result is None:
+ toctreenode.parent.replace(toctreenode, [])
+ else:
+ toctreenode.replace_self(result)
+
+ return doctree
+
+ def resolve_toctree(self, docname: str, builder: Builder, toctree: addnodes.toctree,
+ prune: bool = True, maxdepth: int = 0, titles_only: bool = False,
+ collapse: bool = False, includehidden: bool = False) -> Node | None:
+ """Resolve a *toctree* node into individual bullet lists with titles
+ as items, returning None (if no containing titles are found) or
+ a new node.
+
+ If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0,
+ to the value of the *maxdepth* option on the *toctree* node.
+ If *titles_only* is True, only toplevel document titles will be in the
+ resulting tree.
+ If *collapse* is True, all branches not containing docname will
+ be collapsed.
+ """
+ return toctree_adapters._resolve_toctree(
+ self, docname, builder, toctree,
+ prune=prune,
+ maxdepth=maxdepth,
+ titles_only=titles_only,
+ collapse=collapse,
+ includehidden=includehidden,
+ )
+
+ def resolve_references(self, doctree: nodes.document, fromdocname: str,
+ builder: Builder) -> None:
+ self.apply_post_transforms(doctree, fromdocname)
+
+ def apply_post_transforms(self, doctree: nodes.document, docname: str) -> None:
+ """Apply all post-transforms."""
+ try:
+ # set env.docname during applying post-transforms
+ backup = copy(self.temp_data)
+ self.temp_data['docname'] = docname
+
+ transformer = SphinxTransformer(doctree)
+ transformer.set_environment(self)
+ transformer.add_transforms(self.app.registry.get_post_transforms())
+ transformer.apply_transforms()
+ finally:
+ self.temp_data = backup
+
+ # allow custom references to be resolved
+ self.events.emit('doctree-resolved', doctree, docname)
+
+ def collect_relations(self) -> dict[str, list[str | None]]:
+ traversed: set[str] = set()
+
+ relations = {}
+ docnames = _traverse_toctree(
+ traversed, None, self.config.root_doc, self.toctree_includes,
+ )
+ prev_doc = None
+ parent, docname = next(docnames)
+ for next_parent, next_doc in docnames:
+ relations[docname] = [parent, prev_doc, next_doc]
+ prev_doc = docname
+ docname = next_doc
+ parent = next_parent
+
+ relations[docname] = [parent, prev_doc, None]
+
+ return relations
+
+ def check_consistency(self) -> None:
+ """Do consistency checks."""
+ included = set().union(*self.included.values())
+ for docname in sorted(self.all_docs):
+ if docname not in self.files_to_rebuild:
+ if docname == self.config.root_doc:
+ # the master file is not included anywhere ;)
+ continue
+ if docname in included:
+ # the document is included from other documents
+ continue
+ if 'orphan' in self.metadata[docname]:
+ continue
+ logger.warning(__("document isn't included in any toctree"),
+ location=docname)
+
+ # call check-consistency for all extensions
+ for domain in self.domains.values():
+ domain.check_consistency()
+ self.events.emit('env-check-consistency', self)
+
+
+def _last_modified_time(filename: str | os.PathLike[str]) -> int:
+ """Return the last modified time of ``filename``.
+
+ The time is returned as integer microseconds.
+ The lowest common denominator of modern file-systems seems to be
+ microsecond-level precision.
+
+ We prefer to err on the side of re-rendering a file,
+ so we round up to the nearest microsecond.
+ """
+
+ # upside-down floor division to get the ceiling
+ return -(os.stat(filename).st_mtime_ns // -1_000)
+
+
+def _format_modified_time(timestamp: int) -> str:
+ """Return an RFC 3339 formatted string representing the given timestamp."""
+ seconds, fraction = divmod(timestamp, 10**6)
+ return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(seconds)) + f'.{fraction//1_000}'
+
+
+def _traverse_toctree(
+ traversed: set[str],
+ parent: str | None,
+ docname: str,
+ toctree_includes: dict[str, list[str]],
+) -> Iterator[tuple[str | None, str]]:
+ if parent == docname:
+ logger.warning(__('self referenced toctree found. Ignored.'),
+ location=docname, type='toc',
+ subtype='circular')
+ return
+
+ # traverse toctree by pre-order
+ yield parent, docname
+ traversed.add(docname)
+
+ for child in toctree_includes.get(docname, ()):
+ for sub_parent, sub_docname in _traverse_toctree(
+ traversed, docname, child, toctree_includes,
+ ):
+ if sub_docname not in traversed:
+ yield sub_parent, sub_docname
+ traversed.add(sub_docname)
diff --git a/sphinx/environment/adapters/__init__.py b/sphinx/environment/adapters/__init__.py
new file mode 100644
index 0000000..1566aec
--- /dev/null
+++ b/sphinx/environment/adapters/__init__.py
@@ -0,0 +1 @@
+"""Sphinx environment adapters"""
diff --git a/sphinx/environment/adapters/asset.py b/sphinx/environment/adapters/asset.py
new file mode 100644
index 0000000..57fdc91
--- /dev/null
+++ b/sphinx/environment/adapters/asset.py
@@ -0,0 +1,15 @@
+"""Assets adapter for sphinx.environment."""
+
+from sphinx.environment import BuildEnvironment
+
+
+class ImageAdapter:
+ def __init__(self, env: BuildEnvironment) -> None:
+ self.env = env
+
+ def get_original_image_uri(self, name: str) -> str:
+ """Get the original image URI."""
+ while name in self.env.original_image_uri:
+ name = self.env.original_image_uri[name]
+
+ return name
diff --git a/sphinx/environment/adapters/indexentries.py b/sphinx/environment/adapters/indexentries.py
new file mode 100644
index 0000000..6fdbea6
--- /dev/null
+++ b/sphinx/environment/adapters/indexentries.py
@@ -0,0 +1,187 @@
+"""Index entries adapters for sphinx.environment."""
+
+from __future__ import annotations
+
+import re
+import unicodedata
+from itertools import groupby
+from typing import TYPE_CHECKING, Any, Literal
+
+from sphinx.errors import NoUri
+from sphinx.locale import _, __
+from sphinx.util import logging
+from sphinx.util.index_entries import _split_into
+
+if TYPE_CHECKING:
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+
+logger = logging.getLogger(__name__)
+
+
+class IndexEntries:
+ def __init__(self, env: BuildEnvironment) -> None:
+ self.env = env
+ self.builder: Builder
+
+ def create_index(self, builder: Builder, group_entries: bool = True,
+ _fixre: re.Pattern = re.compile(r'(.*) ([(][^()]*[)])'),
+ ) -> list[tuple[str, list[tuple[str, Any]]]]:
+ """Create the real index from the collected index entries."""
+ new: dict[str, list] = {}
+
+ rel_uri: str | Literal[False]
+ index_domain = self.env.domains['index']
+ for docname, entries in index_domain.entries.items():
+ try:
+ rel_uri = builder.get_relative_uri('genindex', docname)
+ except NoUri:
+ rel_uri = False
+
+ # new entry types must be listed in directives/other.py!
+ for entry_type, value, target_id, main, category_key in entries:
+ uri = rel_uri is not False and f'{rel_uri}#{target_id}'
+ try:
+ if entry_type == 'single':
+ try:
+ entry, sub_entry = _split_into(2, 'single', value)
+ except ValueError:
+ entry, = _split_into(1, 'single', value)
+ sub_entry = ''
+ _add_entry(entry, sub_entry, main,
+ dic=new, link=uri, key=category_key)
+ elif entry_type == 'pair':
+ first, second = _split_into(2, 'pair', value)
+ _add_entry(first, second, main,
+ dic=new, link=uri, key=category_key)
+ _add_entry(second, first, main,
+ dic=new, link=uri, key=category_key)
+ elif entry_type == 'triple':
+ first, second, third = _split_into(3, 'triple', value)
+ _add_entry(first, second + ' ' + third, main,
+ dic=new, link=uri, key=category_key)
+ _add_entry(second, third + ', ' + first, main,
+ dic=new, link=uri, key=category_key)
+ _add_entry(third, first + ' ' + second, main,
+ dic=new, link=uri, key=category_key)
+ elif entry_type == 'see':
+ first, second = _split_into(2, 'see', value)
+ _add_entry(first, _('see %s') % second, None,
+ dic=new, link=False, key=category_key)
+ elif entry_type == 'seealso':
+ first, second = _split_into(2, 'see', value)
+ _add_entry(first, _('see also %s') % second, None,
+ dic=new, link=False, key=category_key)
+ else:
+ logger.warning(__('unknown index entry type %r'), entry_type,
+ location=docname)
+ except ValueError as err:
+ logger.warning(str(err), location=docname)
+
+ for (targets, sub_items, _category_key) in new.values():
+ targets.sort(key=_key_func_0)
+ for (sub_targets, _0, _sub_category_key) in sub_items.values():
+ sub_targets.sort(key=_key_func_0)
+
+ new_list = sorted(new.items(), key=_key_func_1)
+
+ if group_entries:
+ # fixup entries: transform
+ # func() (in module foo)
+ # func() (in module bar)
+ # into
+ # func()
+ # (in module foo)
+ # (in module bar)
+ old_key = ''
+ old_sub_items: dict[str, list] = {}
+ i = 0
+ while i < len(new_list):
+ key, (targets, sub_items, category_key) = new_list[i]
+ # cannot move if it has sub_items; structure gets too complex
+ if not sub_items:
+ m = _fixre.match(key)
+ if m:
+ if old_key == m.group(1):
+ # prefixes match: add entry as subitem of the
+ # previous entry
+ old_sub_items.setdefault(
+ m.group(2), [[], {}, category_key])[0].extend(targets)
+ del new_list[i]
+ continue
+ old_key = m.group(1)
+ else:
+ old_key = key
+ old_sub_items = sub_items
+ i += 1
+
+ return [(key_, list(group))
+ for (key_, group) in groupby(new_list, _key_func_3)]
+
+
+def _add_entry(word: str, subword: str, main: str | None, *,
+ dic: dict[str, list], link: str | Literal[False], key: str | None) -> None:
+ entry = dic.setdefault(word, [[], {}, key])
+ if subword:
+ entry = entry[1].setdefault(subword, [[], {}, key])
+ if link:
+ entry[0].append((main, link))
+
+
+def _key_func_0(entry: tuple[str, str]) -> tuple[bool, str]:
+ """sort the index entries for same keyword."""
+ main, uri = entry
+ return not main, uri # show main entries at first
+
+
+def _key_func_1(entry: tuple[str, list]) -> tuple[tuple[int, str], str]:
+ """Sort the index entries"""
+ key, (_targets, _sub_items, category_key) = entry
+ if category_key:
+ # using the specified category key to sort
+ key = category_key
+ lc_key = unicodedata.normalize('NFD', key.lower())
+ if lc_key.startswith('\N{RIGHT-TO-LEFT MARK}'):
+ lc_key = lc_key[1:]
+
+ if not lc_key[0:1].isalpha() and not lc_key.startswith('_'):
+ # put symbols at the front of the index (0)
+ group = 0
+ else:
+ # put non-symbol characters at the following group (1)
+ group = 1
+ # ensure a deterministic order *within* letters by also sorting on
+ # the entry itself
+ return (group, lc_key), entry[0]
+
+
+def _key_func_2(entry: tuple[str, list]) -> str:
+ """sort the sub-index entries"""
+ key = unicodedata.normalize('NFD', entry[0].lower())
+ if key.startswith('\N{RIGHT-TO-LEFT MARK}'):
+ key = key[1:]
+ if key[0:1].isalpha() or key.startswith('_'):
+ key = chr(127) + key
+ return key
+
+
+def _key_func_3(entry: tuple[str, list]) -> str:
+ """Group the entries by letter"""
+ key, (targets, sub_items, category_key) = entry
+ # hack: mutating the sub_items dicts to a list in the key_func
+ entry[1][1] = sorted(((sub_key, sub_targets)
+ for (sub_key, (sub_targets, _0, _sub_category_key))
+ in sub_items.items()), key=_key_func_2)
+
+ if category_key is not None:
+ return category_key
+
+ # now calculate the key
+ if key.startswith('\N{RIGHT-TO-LEFT MARK}'):
+ key = key[1:]
+ letter = unicodedata.normalize('NFD', key[0])[0].upper()
+ if letter.isalpha() or letter == '_':
+ return letter
+
+ # get all other symbols under one heading
+ return _('Symbols')
diff --git a/sphinx/environment/adapters/toctree.py b/sphinx/environment/adapters/toctree.py
new file mode 100644
index 0000000..e50d10b
--- /dev/null
+++ b/sphinx/environment/adapters/toctree.py
@@ -0,0 +1,520 @@
+"""Toctree adapter for sphinx.environment."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, TypeVar
+
+from docutils import nodes
+from docutils.nodes import Element, Node
+
+from sphinx import addnodes
+from sphinx.locale import __
+from sphinx.util import logging, url_re
+from sphinx.util.matching import Matcher
+from sphinx.util.nodes import _only_node_keep_children, clean_astext
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Set
+
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.tags import Tags
+
+
+logger = logging.getLogger(__name__)
+
+
+def note_toctree(env: BuildEnvironment, docname: str, toctreenode: addnodes.toctree) -> None:
+ """Note a TOC tree directive in a document and gather information about
+ file relations from it.
+ """
+ if toctreenode['glob']:
+ env.glob_toctrees.add(docname)
+ if toctreenode.get('numbered'):
+ env.numbered_toctrees.add(docname)
+ include_files = toctreenode['includefiles']
+ for include_file in include_files:
+ # note that if the included file is rebuilt, this one must be
+ # too (since the TOC of the included file could have changed)
+ env.files_to_rebuild.setdefault(include_file, set()).add(docname)
+ env.toctree_includes.setdefault(docname, []).extend(include_files)
+
+
+def document_toc(env: BuildEnvironment, docname: str, tags: Tags) -> Node:
+ """Get the (local) table of contents for a document.
+
+ Note that this is only the sections within the document.
+ For a ToC tree that shows the document's place in the
+ ToC structure, use `get_toctree_for`.
+ """
+
+ tocdepth = env.metadata[docname].get('tocdepth', 0)
+ try:
+ toc = _toctree_copy(env.tocs[docname], 2, tocdepth, False, tags)
+ except KeyError:
+ # the document does not exist any more:
+ # return a dummy node that renders to nothing
+ return nodes.paragraph()
+
+ for node in toc.findall(nodes.reference):
+ node['refuri'] = node['anchorname'] or '#'
+ return toc
+
+
+def global_toctree_for_doc(
+ env: BuildEnvironment,
+ docname: str,
+ builder: Builder,
+ collapse: bool = False,
+ includehidden: bool = True,
+ maxdepth: int = 0,
+ titles_only: bool = False,
+) -> Element | None:
+ """Get the global ToC tree at a given document.
+
+ This gives the global ToC, with all ancestors and their siblings.
+ """
+
+ toctrees: list[Element] = []
+ for toctree_node in env.master_doctree.findall(addnodes.toctree):
+ if toctree := _resolve_toctree(
+ env,
+ docname,
+ builder,
+ toctree_node,
+ prune=True,
+ maxdepth=int(maxdepth),
+ titles_only=titles_only,
+ collapse=collapse,
+ includehidden=includehidden,
+ ):
+ toctrees.append(toctree)
+ if not toctrees:
+ return None
+ result = toctrees[0]
+ for toctree in toctrees[1:]:
+ result.extend(toctree.children)
+ return result
+
+
+def _resolve_toctree(
+ env: BuildEnvironment, docname: str, builder: Builder, toctree: addnodes.toctree, *,
+ prune: bool = True, maxdepth: int = 0, titles_only: bool = False,
+ collapse: bool = False, includehidden: bool = False,
+) -> Element | None:
+ """Resolve a *toctree* node into individual bullet lists with titles
+ as items, returning None (if no containing titles are found) or
+ a new node.
+
+ If *prune* is True, the tree is pruned to *maxdepth*, or if that is 0,
+ to the value of the *maxdepth* option on the *toctree* node.
+ If *titles_only* is True, only toplevel document titles will be in the
+ resulting tree.
+ If *collapse* is True, all branches not containing docname will
+ be collapsed.
+ """
+
+ if toctree.get('hidden', False) and not includehidden:
+ return None
+
+ # For reading the following two helper function, it is useful to keep
+ # in mind the node structure of a toctree (using HTML-like node names
+ # for brevity):
+ #
+ # <ul>
+ # <li>
+ # <p><a></p>
+ # <p><a></p>
+ # ...
+ # <ul>
+ # ...
+ # </ul>
+ # </li>
+ # </ul>
+ #
+ # The transformation is made in two passes in order to avoid
+ # interactions between marking and pruning the tree (see bug #1046).
+
+ toctree_ancestors = _get_toctree_ancestors(env.toctree_includes, docname)
+ included = Matcher(env.config.include_patterns)
+ excluded = Matcher(env.config.exclude_patterns)
+
+ maxdepth = maxdepth or toctree.get('maxdepth', -1)
+ if not titles_only and toctree.get('titlesonly', False):
+ titles_only = True
+ if not includehidden and toctree.get('includehidden', False):
+ includehidden = True
+
+ tocentries = _entries_from_toctree(
+ env,
+ prune,
+ titles_only,
+ collapse,
+ includehidden,
+ builder.tags,
+ toctree_ancestors,
+ included,
+ excluded,
+ toctree,
+ [],
+ )
+ if not tocentries:
+ return None
+
+ newnode = addnodes.compact_paragraph('', '')
+ if caption := toctree.attributes.get('caption'):
+ caption_node = nodes.title(caption, '', *[nodes.Text(caption)])
+ caption_node.line = toctree.line
+ caption_node.source = toctree.source
+ caption_node.rawsource = toctree['rawcaption']
+ if hasattr(toctree, 'uid'):
+ # move uid to caption_node to translate it
+ caption_node.uid = toctree.uid # type: ignore[attr-defined]
+ del toctree.uid
+ newnode.append(caption_node)
+ newnode.extend(tocentries)
+ newnode['toctree'] = True
+
+ # prune the tree to maxdepth, also set toc depth and current classes
+ _toctree_add_classes(newnode, 1, docname)
+ newnode = _toctree_copy(newnode, 1, maxdepth if prune else 0, collapse, builder.tags)
+
+ if isinstance(newnode[-1], nodes.Element) and len(newnode[-1]) == 0: # No titles found
+ return None
+
+ # set the target paths in the toctrees (they are not known at TOC
+ # generation time)
+ for refnode in newnode.findall(nodes.reference):
+ if url_re.match(refnode['refuri']) is None:
+ rel_uri = builder.get_relative_uri(docname, refnode['refuri'])
+ refnode['refuri'] = rel_uri + refnode['anchorname']
+ return newnode
+
+
+def _entries_from_toctree(
+ env: BuildEnvironment,
+ prune: bool,
+ titles_only: bool,
+ collapse: bool,
+ includehidden: bool,
+ tags: Tags,
+ toctree_ancestors: Set[str],
+ included: Matcher,
+ excluded: Matcher,
+ toctreenode: addnodes.toctree,
+ parents: list[str],
+ subtree: bool = False,
+) -> list[Element]:
+ """Return TOC entries for a toctree node."""
+ entries: list[Element] = []
+ for (title, ref) in toctreenode['entries']:
+ try:
+ toc, refdoc = _toctree_entry(
+ title, ref, env, prune, collapse, tags, toctree_ancestors,
+ included, excluded, toctreenode, parents,
+ )
+ except LookupError:
+ continue
+
+ # children of toc are:
+ # - list_item + compact_paragraph + (reference and subtoc)
+ # - only + subtoc
+ # - toctree
+ children: Iterable[nodes.Element] = toc.children # type: ignore[assignment]
+
+ # if titles_only is given, only keep the main title and
+ # sub-toctrees
+ if titles_only:
+ # delete everything but the toplevel title(s)
+ # and toctrees
+ for top_level in children:
+ # nodes with length 1 don't have any children anyway
+ if len(top_level) > 1:
+ if subtrees := list(top_level.findall(addnodes.toctree)):
+ top_level[1][:] = subtrees # type: ignore[index]
+ else:
+ top_level.pop(1)
+ # resolve all sub-toctrees
+ for sub_toc_node in list(toc.findall(addnodes.toctree)):
+ if sub_toc_node.get('hidden', False) and not includehidden:
+ continue
+ for i, entry in enumerate(
+ _entries_from_toctree(
+ env,
+ prune,
+ titles_only,
+ collapse,
+ includehidden,
+ tags,
+ toctree_ancestors,
+ included,
+ excluded,
+ sub_toc_node,
+ [refdoc] + parents,
+ subtree=True,
+ ),
+ start=sub_toc_node.parent.index(sub_toc_node) + 1,
+ ):
+ sub_toc_node.parent.insert(i, entry)
+ sub_toc_node.parent.remove(sub_toc_node)
+
+ entries.extend(children)
+
+ if not subtree:
+ ret = nodes.bullet_list()
+ ret += entries
+ return [ret]
+
+ return entries
+
+
+def _toctree_entry(
+ title: str,
+ ref: str,
+ env: BuildEnvironment,
+ prune: bool,
+ collapse: bool,
+ tags: Tags,
+ toctree_ancestors: Set[str],
+ included: Matcher,
+ excluded: Matcher,
+ toctreenode: addnodes.toctree,
+ parents: list[str],
+) -> tuple[Element, str]:
+ from sphinx.domains.std import StandardDomain
+
+ try:
+ refdoc = ''
+ if url_re.match(ref):
+ toc = _toctree_url_entry(title, ref)
+ elif ref == 'self':
+ toc = _toctree_self_entry(title, toctreenode['parent'], env.titles)
+ elif ref in StandardDomain._virtual_doc_names:
+ toc = _toctree_generated_entry(title, ref)
+ else:
+ if ref in parents:
+ logger.warning(__('circular toctree references '
+ 'detected, ignoring: %s <- %s'),
+ ref, ' <- '.join(parents),
+ location=ref, type='toc', subtype='circular')
+ msg = 'circular reference'
+ raise LookupError(msg)
+
+ toc, refdoc = _toctree_standard_entry(
+ title,
+ ref,
+ env.metadata[ref].get('tocdepth', 0),
+ env.tocs[ref],
+ toctree_ancestors,
+ prune,
+ collapse,
+ tags,
+ )
+
+ if not toc.children:
+ # empty toc means: no titles will show up in the toctree
+ logger.warning(__('toctree contains reference to document %r that '
+ "doesn't have a title: no link will be generated"),
+ ref, location=toctreenode)
+ except KeyError:
+ # this is raised if the included file does not exist
+ ref_path = env.doc2path(ref, False)
+ if excluded(ref_path):
+ message = __('toctree contains reference to excluded document %r')
+ elif not included(ref_path):
+ message = __('toctree contains reference to non-included document %r')
+ else:
+ message = __('toctree contains reference to nonexisting document %r')
+
+ logger.warning(message, ref, location=toctreenode)
+ raise
+ return toc, refdoc
+
+
+def _toctree_url_entry(title: str, ref: str) -> nodes.bullet_list:
+ if title is None:
+ title = ref
+ reference = nodes.reference('', '', internal=False,
+ refuri=ref, anchorname='',
+ *[nodes.Text(title)])
+ para = addnodes.compact_paragraph('', '', reference)
+ item = nodes.list_item('', para)
+ toc = nodes.bullet_list('', item)
+ return toc
+
+
+def _toctree_self_entry(
+ title: str, ref: str, titles: dict[str, nodes.title],
+) -> nodes.bullet_list:
+ # 'self' refers to the document from which this
+ # toctree originates
+ if not title:
+ title = clean_astext(titles[ref])
+ reference = nodes.reference('', '', internal=True,
+ refuri=ref,
+ anchorname='',
+ *[nodes.Text(title)])
+ para = addnodes.compact_paragraph('', '', reference)
+ item = nodes.list_item('', para)
+ # don't show subitems
+ toc = nodes.bullet_list('', item)
+ return toc
+
+
+def _toctree_generated_entry(title: str, ref: str) -> nodes.bullet_list:
+ from sphinx.domains.std import StandardDomain
+
+ docname, sectionname = StandardDomain._virtual_doc_names[ref]
+ if not title:
+ title = sectionname
+ reference = nodes.reference('', title, internal=True,
+ refuri=docname, anchorname='')
+ para = addnodes.compact_paragraph('', '', reference)
+ item = nodes.list_item('', para)
+ # don't show subitems
+ toc = nodes.bullet_list('', item)
+ return toc
+
+
+def _toctree_standard_entry(
+ title: str,
+ ref: str,
+ maxdepth: int,
+ toc: nodes.bullet_list,
+ toctree_ancestors: Set[str],
+ prune: bool,
+ collapse: bool,
+ tags: Tags,
+) -> tuple[nodes.bullet_list, str]:
+ refdoc = ref
+ if ref in toctree_ancestors and (not prune or maxdepth <= 0):
+ toc = toc.deepcopy()
+ else:
+ toc = _toctree_copy(toc, 2, maxdepth, collapse, tags)
+
+ if title and toc.children and len(toc.children) == 1:
+ child = toc.children[0]
+ for refnode in child.findall(nodes.reference):
+ if refnode['refuri'] == ref and not refnode['anchorname']:
+ refnode.children[:] = [nodes.Text(title)]
+ return toc, refdoc
+
+
+def _toctree_add_classes(node: Element, depth: int, docname: str) -> None:
+ """Add 'toctree-l%d' and 'current' classes to the toctree."""
+ for subnode in node.children:
+ if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)):
+ # for <p> and <li>, indicate the depth level and recurse
+ subnode['classes'].append(f'toctree-l{depth - 1}')
+ _toctree_add_classes(subnode, depth, docname)
+ elif isinstance(subnode, nodes.bullet_list):
+ # for <ul>, just recurse
+ _toctree_add_classes(subnode, depth + 1, docname)
+ elif isinstance(subnode, nodes.reference):
+ # for <a>, identify which entries point to the current
+ # document and therefore may not be collapsed
+ if subnode['refuri'] == docname:
+ if not subnode['anchorname']:
+ # give the whole branch a 'current' class
+ # (useful for styling it differently)
+ branchnode: Element = subnode
+ while branchnode:
+ branchnode['classes'].append('current')
+ branchnode = branchnode.parent
+ # mark the list_item as "on current page"
+ if subnode.parent.parent.get('iscurrent'):
+ # but only if it's not already done
+ return
+ while subnode:
+ subnode['iscurrent'] = True
+ subnode = subnode.parent
+
+
+ET = TypeVar('ET', bound=Element)
+
+
+def _toctree_copy(node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tags) -> ET:
+ """Utility: Cut and deep-copy a TOC at a specified depth."""
+ keep_bullet_list_sub_nodes = (depth <= 1
+ or ((depth <= maxdepth or maxdepth <= 0)
+ and (not collapse or 'iscurrent' in node)))
+
+ copy = node.copy()
+ for subnode in node.children:
+ if isinstance(subnode, (addnodes.compact_paragraph, nodes.list_item)):
+ # for <p> and <li>, just recurse
+ copy.append(_toctree_copy(subnode, depth, maxdepth, collapse, tags))
+ elif isinstance(subnode, nodes.bullet_list):
+ # for <ul>, copy if the entry is top-level
+ # or, copy if the depth is within bounds and;
+ # collapsing is disabled or the sub-entry's parent is 'current'.
+ # The boolean is constant so is calculated outwith the loop.
+ if keep_bullet_list_sub_nodes:
+ copy.append(_toctree_copy(subnode, depth + 1, maxdepth, collapse, tags))
+ elif isinstance(subnode, addnodes.toctree):
+ # copy sub toctree nodes for later processing
+ copy.append(subnode.copy())
+ elif isinstance(subnode, addnodes.only):
+ # only keep children if the only node matches the tags
+ if _only_node_keep_children(subnode, tags):
+ for child in subnode.children:
+ copy.append(_toctree_copy(
+ child, depth, maxdepth, collapse, tags, # type: ignore[type-var]
+ ))
+ elif isinstance(subnode, (nodes.reference, nodes.title)):
+ # deep copy references and captions
+ sub_node_copy = subnode.copy()
+ sub_node_copy.children = [child.deepcopy() for child in subnode.children]
+ for child in sub_node_copy.children:
+ child.parent = sub_node_copy
+ copy.append(sub_node_copy)
+ else:
+ msg = f'Unexpected node type {subnode.__class__.__name__!r}!'
+ raise ValueError(msg)
+ return copy
+
+
+def _get_toctree_ancestors(
+ toctree_includes: dict[str, list[str]], docname: str,
+) -> Set[str]:
+ parent: dict[str, str] = {}
+ for p, children in toctree_includes.items():
+ parent |= dict.fromkeys(children, p)
+ ancestors: list[str] = []
+ d = docname
+ while d in parent and d not in ancestors:
+ ancestors.append(d)
+ d = parent[d]
+ # use dict keys for ordered set operations
+ return dict.fromkeys(ancestors).keys()
+
+
+class TocTree:
+ def __init__(self, env: BuildEnvironment) -> None:
+ self.env = env
+
+ def note(self, docname: str, toctreenode: addnodes.toctree) -> None:
+ note_toctree(self.env, docname, toctreenode)
+
+ def resolve(self, docname: str, builder: Builder, toctree: addnodes.toctree,
+ prune: bool = True, maxdepth: int = 0, titles_only: bool = False,
+ collapse: bool = False, includehidden: bool = False) -> Element | None:
+ return _resolve_toctree(
+ self.env, docname, builder, toctree,
+ prune=prune,
+ maxdepth=maxdepth,
+ titles_only=titles_only,
+ collapse=collapse,
+ includehidden=includehidden,
+ )
+
+ def get_toctree_ancestors(self, docname: str) -> list[str]:
+ return [*_get_toctree_ancestors(self.env.toctree_includes, docname)]
+
+ def get_toc_for(self, docname: str, builder: Builder) -> Node:
+ return document_toc(self.env, docname, self.env.app.builder.tags)
+
+ def get_toctree_for(
+ self, docname: str, builder: Builder, collapse: bool, **kwargs: Any,
+ ) -> Element | None:
+ return global_toctree_for_doc(self.env, docname, builder, collapse=collapse, **kwargs)
diff --git a/sphinx/environment/collectors/__init__.py b/sphinx/environment/collectors/__init__.py
new file mode 100644
index 0000000..c7e069a
--- /dev/null
+++ b/sphinx/environment/collectors/__init__.py
@@ -0,0 +1,72 @@
+"""The data collector components for sphinx.environment."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+ from docutils import nodes
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+
+class EnvironmentCollector:
+ """An EnvironmentCollector is a specific data collector from each document.
+
+ It gathers data and stores :py:class:`BuildEnvironment
+ <sphinx.environment.BuildEnvironment>` as a database. Examples of specific
+ data would be images, download files, section titles, metadatas, index
+ entries and toctrees, etc.
+ """
+
+ listener_ids: dict[str, int] | None = None
+
+ def enable(self, app: Sphinx) -> None:
+ assert self.listener_ids is None
+ self.listener_ids = {
+ 'doctree-read': app.connect('doctree-read', self.process_doc),
+ 'env-merge-info': app.connect('env-merge-info', self.merge_other),
+ 'env-purge-doc': app.connect('env-purge-doc', self.clear_doc),
+ 'env-get-updated': app.connect('env-get-updated', self.get_updated_docs),
+ 'env-get-outdated': app.connect('env-get-outdated', self.get_outdated_docs),
+ }
+
+ def disable(self, app: Sphinx) -> None:
+ assert self.listener_ids is not None
+ for listener_id in self.listener_ids.values():
+ app.disconnect(listener_id)
+ self.listener_ids = None
+
+ def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ """Remove specified data of a document.
+
+ This method is called on the removal of the document."""
+ raise NotImplementedError
+
+ def merge_other(self, app: Sphinx, env: BuildEnvironment,
+ docnames: set[str], other: BuildEnvironment) -> None:
+ """Merge in specified data regarding docnames from a different `BuildEnvironment`
+ object which coming from a subprocess in parallel builds."""
+ raise NotImplementedError
+
+ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
+ """Process a document and gather specific data from it.
+
+ This method is called after the document is read."""
+ raise NotImplementedError
+
+ def get_updated_docs(self, app: Sphinx, env: BuildEnvironment) -> list[str]:
+ """Return a list of docnames to re-read.
+
+ This methods is called after reading the whole of documents (experimental).
+ """
+ return []
+
+ def get_outdated_docs(self, app: Sphinx, env: BuildEnvironment,
+ added: set[str], changed: set[str], removed: set[str]) -> list[str]:
+ """Return a list of docnames to re-read.
+
+ This methods is called before reading the documents.
+ """
+ return []
diff --git a/sphinx/environment/collectors/asset.py b/sphinx/environment/collectors/asset.py
new file mode 100644
index 0000000..c2066f4
--- /dev/null
+++ b/sphinx/environment/collectors/asset.py
@@ -0,0 +1,147 @@
+"""The image collector for sphinx.environment."""
+
+from __future__ import annotations
+
+import os
+from glob import glob
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.utils import relative_path
+
+from sphinx import addnodes
+from sphinx.environment.collectors import EnvironmentCollector
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.i18n import get_image_filename_for_language, search_image_for_language
+from sphinx.util.images import guess_mimetype
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+logger = logging.getLogger(__name__)
+
+
+class ImageCollector(EnvironmentCollector):
+ """Image files collector for sphinx.environment."""
+
+ def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ env.images.purge_doc(docname)
+
+ def merge_other(self, app: Sphinx, env: BuildEnvironment,
+ docnames: set[str], other: BuildEnvironment) -> None:
+ env.images.merge_other(docnames, other.images)
+
+ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
+ """Process and rewrite image URIs."""
+ docname = app.env.docname
+
+ for node in doctree.findall(nodes.image):
+ # Map the mimetype to the corresponding image. The writer may
+ # choose the best image from these candidates. The special key * is
+ # set if there is only single candidate to be used by a writer.
+ # The special key ? is set for nonlocal URIs.
+ candidates: dict[str, str] = {}
+ node['candidates'] = candidates
+ imguri = node['uri']
+ if imguri.startswith('data:'):
+ candidates['?'] = imguri
+ continue
+ if imguri.find('://') != -1:
+ candidates['?'] = imguri
+ continue
+
+ if imguri.endswith(os.extsep + '*'):
+ # Update `node['uri']` to a relative path from srcdir
+ # from a relative path from current document.
+ rel_imgpath, full_imgpath = app.env.relfn2path(imguri, docname)
+ node['uri'] = rel_imgpath
+
+ # Search language-specific figures at first
+ i18n_imguri = get_image_filename_for_language(imguri, app.env)
+ _, full_i18n_imgpath = app.env.relfn2path(i18n_imguri, docname)
+ self.collect_candidates(app.env, full_i18n_imgpath, candidates, node)
+
+ self.collect_candidates(app.env, full_imgpath, candidates, node)
+ else:
+ # substitute imguri by figure_language_filename
+ # (ex. foo.png -> foo.en.png)
+ imguri = search_image_for_language(imguri, app.env)
+
+ # Update `node['uri']` to a relative path from srcdir
+ # from a relative path from current document.
+ original_uri = node['uri']
+ node['uri'], _ = app.env.relfn2path(imguri, docname)
+ candidates['*'] = node['uri']
+ if node['uri'] != original_uri:
+ node['original_uri'] = original_uri
+
+ # map image paths to unique image names (so that they can be put
+ # into a single directory)
+ for imgpath in candidates.values():
+ app.env.dependencies[docname].add(imgpath)
+ if not os.access(path.join(app.srcdir, imgpath), os.R_OK):
+ logger.warning(__('image file not readable: %s') % imgpath,
+ location=node, type='image', subtype='not_readable')
+ continue
+ app.env.images.add_file(docname, imgpath)
+
+ def collect_candidates(self, env: BuildEnvironment, imgpath: str,
+ candidates: dict[str, str], node: Node) -> None:
+ globbed: dict[str, list[str]] = {}
+ for filename in glob(imgpath):
+ new_imgpath = relative_path(path.join(env.srcdir, 'dummy'),
+ filename)
+ try:
+ mimetype = guess_mimetype(filename)
+ if mimetype is None:
+ basename, suffix = path.splitext(filename)
+ mimetype = 'image/x-' + suffix[1:]
+ if mimetype not in candidates:
+ globbed.setdefault(mimetype, []).append(new_imgpath)
+ except OSError as err:
+ logger.warning(__('image file %s not readable: %s') % (filename, err),
+ location=node, type='image', subtype='not_readable')
+ for key, files in globbed.items():
+ candidates[key] = sorted(files, key=len)[0] # select by similarity
+
+
+class DownloadFileCollector(EnvironmentCollector):
+ """Download files collector for sphinx.environment."""
+
+ def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ env.dlfiles.purge_doc(docname)
+
+ def merge_other(self, app: Sphinx, env: BuildEnvironment,
+ docnames: set[str], other: BuildEnvironment) -> None:
+ env.dlfiles.merge_other(docnames, other.dlfiles)
+
+ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
+ """Process downloadable file paths. """
+ for node in doctree.findall(addnodes.download_reference):
+ targetname = node['reftarget']
+ if '://' in targetname:
+ node['refuri'] = targetname
+ else:
+ rel_filename, filename = app.env.relfn2path(targetname, app.env.docname)
+ app.env.dependencies[app.env.docname].add(rel_filename)
+ if not os.access(filename, os.R_OK):
+ logger.warning(__('download file not readable: %s') % filename,
+ location=node, type='download', subtype='not_readable')
+ continue
+ node['filename'] = app.env.dlfiles.add_file(app.env.docname, rel_filename)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_env_collector(ImageCollector)
+ app.add_env_collector(DownloadFileCollector)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/environment/collectors/dependencies.py b/sphinx/environment/collectors/dependencies.py
new file mode 100644
index 0000000..df1f0c1
--- /dev/null
+++ b/sphinx/environment/collectors/dependencies.py
@@ -0,0 +1,57 @@
+"""The dependencies collector components for sphinx.environment."""
+
+from __future__ import annotations
+
+import os
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils.utils import relative_path
+
+from sphinx.environment.collectors import EnvironmentCollector
+from sphinx.util.osutil import fs_encoding
+
+if TYPE_CHECKING:
+ from docutils import nodes
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+
+class DependenciesCollector(EnvironmentCollector):
+ """dependencies collector for sphinx.environment."""
+
+ def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ env.dependencies.pop(docname, None)
+
+ def merge_other(self, app: Sphinx, env: BuildEnvironment,
+ docnames: set[str], other: BuildEnvironment) -> None:
+ for docname in docnames:
+ if docname in other.dependencies:
+ env.dependencies[docname] = other.dependencies[docname]
+
+ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
+ """Process docutils-generated dependency info."""
+ cwd = os.getcwd()
+ frompath = path.join(path.normpath(app.srcdir), 'dummy')
+ deps = doctree.settings.record_dependencies
+ if not deps:
+ return
+ for dep in deps.list:
+ # the dependency path is relative to the working dir, so get
+ # one relative to the srcdir
+ if isinstance(dep, bytes):
+ dep = dep.decode(fs_encoding)
+ relpath = relative_path(frompath,
+ path.normpath(path.join(cwd, dep)))
+ app.env.dependencies[app.env.docname].add(relpath)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_env_collector(DependenciesCollector)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/environment/collectors/metadata.py b/sphinx/environment/collectors/metadata.py
new file mode 100644
index 0000000..5f737a9
--- /dev/null
+++ b/sphinx/environment/collectors/metadata.py
@@ -0,0 +1,70 @@
+"""The metadata collector components for sphinx.environment."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+
+from sphinx.environment.collectors import EnvironmentCollector
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+
+class MetadataCollector(EnvironmentCollector):
+ """metadata collector for sphinx.environment."""
+
+ def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ env.metadata.pop(docname, None)
+
+ def merge_other(self, app: Sphinx, env: BuildEnvironment,
+ docnames: set[str], other: BuildEnvironment) -> None:
+ for docname in docnames:
+ env.metadata[docname] = other.metadata[docname]
+
+ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
+ """Process the docinfo part of the doctree as metadata.
+
+ Keep processing minimal -- just return what docutils says.
+ """
+ index = doctree.first_child_not_matching_class(nodes.PreBibliographic)
+ if index is None:
+ return
+ elif isinstance(doctree[index], nodes.docinfo):
+ md = app.env.metadata[app.env.docname]
+ for node in doctree[index]: # type: ignore[attr-defined]
+ # nodes are multiply inherited...
+ if isinstance(node, nodes.authors):
+ authors = cast(list[nodes.author], node)
+ md['authors'] = [author.astext() for author in authors]
+ elif isinstance(node, nodes.field):
+ assert len(node) == 2
+ field_name = cast(nodes.field_name, node[0])
+ field_body = cast(nodes.field_body, node[1])
+ md[field_name.astext()] = field_body.astext()
+ elif isinstance(node, nodes.TextElement):
+ # other children must be TextElement
+ # see: https://docutils.sourceforge.io/docs/ref/doctree.html#bibliographic-elements # noqa: E501
+ md[node.__class__.__name__] = node.astext()
+
+ for name, value in md.items():
+ if name in ('tocdepth',):
+ try:
+ value = int(value)
+ except ValueError:
+ value = 0
+ md[name] = value
+
+ doctree.pop(index)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_env_collector(MetadataCollector)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/environment/collectors/title.py b/sphinx/environment/collectors/title.py
new file mode 100644
index 0000000..014d77a
--- /dev/null
+++ b/sphinx/environment/collectors/title.py
@@ -0,0 +1,61 @@
+"""The title collector components for sphinx.environment."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+from sphinx.environment.collectors import EnvironmentCollector
+from sphinx.transforms import SphinxContentsFilter
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+
+class TitleCollector(EnvironmentCollector):
+ """title collector for sphinx.environment."""
+
+ def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ env.titles.pop(docname, None)
+ env.longtitles.pop(docname, None)
+
+ def merge_other(self, app: Sphinx, env: BuildEnvironment,
+ docnames: set[str], other: BuildEnvironment) -> None:
+ for docname in docnames:
+ env.titles[docname] = other.titles[docname]
+ env.longtitles[docname] = other.longtitles[docname]
+
+ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
+ """Add a title node to the document (just copy the first section title),
+ and store that title in the environment.
+ """
+ titlenode = nodes.title()
+ longtitlenode = titlenode
+ # explicit title set with title directive; use this only for
+ # the <title> tag in HTML output
+ if 'title' in doctree:
+ longtitlenode = nodes.title()
+ longtitlenode += nodes.Text(doctree['title'])
+ # look for first section title and use that as the title
+ for node in doctree.findall(nodes.section):
+ visitor = SphinxContentsFilter(doctree)
+ node[0].walkabout(visitor)
+ titlenode += visitor.get_entry_text()
+ break
+ else:
+ # document has no title
+ titlenode += nodes.Text(doctree.get('title', '<no title>'))
+ app.env.titles[app.env.docname] = titlenode
+ app.env.longtitles[app.env.docname] = longtitlenode
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_env_collector(TitleCollector)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/environment/collectors/toctree.py b/sphinx/environment/collectors/toctree.py
new file mode 100644
index 0000000..772591e
--- /dev/null
+++ b/sphinx/environment/collectors/toctree.py
@@ -0,0 +1,355 @@
+"""Toctree collector for sphinx.environment."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, TypeVar, cast
+
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.environment.adapters.toctree import note_toctree
+from sphinx.environment.collectors import EnvironmentCollector
+from sphinx.locale import __
+from sphinx.transforms import SphinxContentsFilter
+from sphinx.util import logging, url_re
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from docutils.nodes import Element, Node
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+N = TypeVar('N')
+
+logger = logging.getLogger(__name__)
+
+
+class TocTreeCollector(EnvironmentCollector):
+ def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ env.tocs.pop(docname, None)
+ env.toc_secnumbers.pop(docname, None)
+ env.toc_fignumbers.pop(docname, None)
+ env.toc_num_entries.pop(docname, None)
+ env.toctree_includes.pop(docname, None)
+ env.glob_toctrees.discard(docname)
+ env.numbered_toctrees.discard(docname)
+
+ for subfn, fnset in list(env.files_to_rebuild.items()):
+ fnset.discard(docname)
+ if not fnset:
+ del env.files_to_rebuild[subfn]
+
+ def merge_other(self, app: Sphinx, env: BuildEnvironment, docnames: set[str],
+ other: BuildEnvironment) -> None:
+ for docname in docnames:
+ env.tocs[docname] = other.tocs[docname]
+ env.toc_num_entries[docname] = other.toc_num_entries[docname]
+ if docname in other.toctree_includes:
+ env.toctree_includes[docname] = other.toctree_includes[docname]
+ if docname in other.glob_toctrees:
+ env.glob_toctrees.add(docname)
+ if docname in other.numbered_toctrees:
+ env.numbered_toctrees.add(docname)
+
+ for subfn, fnset in other.files_to_rebuild.items():
+ env.files_to_rebuild.setdefault(subfn, set()).update(fnset & set(docnames))
+
+ def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
+ """Build a TOC from the doctree and store it in the inventory."""
+ docname = app.env.docname
+ numentries = [0] # nonlocal again...
+
+ def build_toc(
+ node: Element | Sequence[Element],
+ depth: int = 1,
+ ) -> nodes.bullet_list | None:
+ # list of table of contents entries
+ entries: list[Element] = []
+ # cache of parents -> list item
+ memo_parents: dict[tuple[str, ...], nodes.list_item] = {}
+ for sectionnode in node:
+ # find all toctree nodes in this section and add them
+ # to the toc (just copying the toctree node which is then
+ # resolved in self.get_and_resolve_doctree)
+ if isinstance(sectionnode, nodes.section):
+ title = sectionnode[0]
+ # copy the contents of the section title, but without references
+ # and unnecessary stuff
+ visitor = SphinxContentsFilter(doctree)
+ title.walkabout(visitor)
+ nodetext = visitor.get_entry_text()
+ anchorname = _make_anchor_name(sectionnode['ids'], numentries)
+ # make these nodes:
+ # list_item -> compact_paragraph -> reference
+ reference = nodes.reference(
+ '', '', internal=True, refuri=docname,
+ anchorname=anchorname, *nodetext)
+ para = addnodes.compact_paragraph('', '', reference)
+ item: Element = nodes.list_item('', para)
+ sub_item = build_toc(sectionnode, depth + 1)
+ if sub_item:
+ item += sub_item
+ entries.append(item)
+ # Wrap items under an ``.. only::`` directive in a node for
+ # post-processing
+ elif isinstance(sectionnode, addnodes.only):
+ onlynode = addnodes.only(expr=sectionnode['expr'])
+ blist = build_toc(sectionnode, depth)
+ if blist:
+ onlynode += blist.children
+ entries.append(onlynode)
+ # check within the section for other node types
+ elif isinstance(sectionnode, nodes.Element):
+ toctreenode: nodes.Node
+ for toctreenode in sectionnode.findall():
+ if isinstance(toctreenode, nodes.section):
+ continue
+ if isinstance(toctreenode, addnodes.toctree):
+ item = toctreenode.copy()
+ entries.append(item)
+ # important: do the inventory stuff
+ note_toctree(app.env, docname, toctreenode)
+ # add object signatures within a section to the ToC
+ elif isinstance(toctreenode, addnodes.desc):
+ for sig_node in toctreenode:
+ if not isinstance(sig_node, addnodes.desc_signature):
+ continue
+ # Skip if no name set
+ if not sig_node.get('_toc_name', ''):
+ continue
+ # Skip if explicitly disabled
+ if sig_node.parent.get('no-contents-entry'):
+ continue
+ # Skip entries with no ID (e.g. with :no-index: set)
+ ids = sig_node['ids']
+ if not ids:
+ continue
+
+ anchorname = _make_anchor_name(ids, numentries)
+
+ reference = nodes.reference(
+ '', '', nodes.literal('', sig_node['_toc_name']),
+ internal=True, refuri=docname, anchorname=anchorname)
+ para = addnodes.compact_paragraph('', '', reference,
+ skip_section_number=True)
+ entry = nodes.list_item('', para)
+ *parents, _ = sig_node['_toc_parts']
+ parents = tuple(parents)
+
+ # Cache parents tuple
+ memo_parents[sig_node['_toc_parts']] = entry
+
+ # Nest children within parents
+ if parents and parents in memo_parents:
+ root_entry = memo_parents[parents]
+ if isinstance(root_entry[-1], nodes.bullet_list):
+ root_entry[-1].append(entry)
+ else:
+ root_entry.append(nodes.bullet_list('', entry))
+ continue
+
+ entries.append(entry)
+
+ if entries:
+ return nodes.bullet_list('', *entries)
+ return None
+
+ toc = build_toc(doctree)
+ if toc:
+ app.env.tocs[docname] = toc
+ else:
+ app.env.tocs[docname] = nodes.bullet_list('')
+ app.env.toc_num_entries[docname] = numentries[0]
+
+ def get_updated_docs(self, app: Sphinx, env: BuildEnvironment) -> list[str]:
+ return self.assign_section_numbers(env) + self.assign_figure_numbers(env)
+
+ def assign_section_numbers(self, env: BuildEnvironment) -> list[str]:
+ """Assign a section number to each heading under a numbered toctree."""
+ # a list of all docnames whose section numbers changed
+ rewrite_needed = []
+
+ assigned: set[str] = set()
+ old_secnumbers = env.toc_secnumbers
+ env.toc_secnumbers = {}
+
+ def _walk_toc(
+ node: Element, secnums: dict, depth: int, titlenode: nodes.title | None = None,
+ ) -> 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, depth - 1, titlenode)
+ numstack.pop()
+ titlenode = None
+ elif isinstance(subnode, nodes.list_item): # NoQA: SIM114
+ _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):
+ if 'skip_section_number' in subnode:
+ continue
+ numstack[-1] += 1
+ reference = cast(nodes.reference, subnode[0])
+ if depth > 0:
+ number = list(numstack)
+ secnums[reference['anchorname']] = tuple(numstack)
+ else:
+ number = None
+ secnums[reference['anchorname']] = None
+ reference['secnumber'] = number
+ if titlenode:
+ titlenode['secnumber'] = number
+ titlenode = None
+ elif isinstance(subnode, addnodes.toctree):
+ _walk_toctree(subnode, depth)
+
+ def _walk_toctree(toctreenode: addnodes.toctree, depth: int) -> None:
+ 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 assigned:
+ logger.warning(__('%s is already assigned section numbers '
+ '(nested numbered toctree?)'), ref,
+ location=toctreenode, type='toc', subtype='secnum')
+ elif ref in env.tocs:
+ secnums: dict[str, tuple[int, ...]] = {}
+ env.toc_secnumbers[ref] = secnums
+ assigned.add(ref)
+ _walk_toc(env.tocs[ref], secnums, depth, env.titles.get(ref))
+ if secnums != old_secnumbers.get(ref):
+ rewrite_needed.append(ref)
+
+ for docname in env.numbered_toctrees:
+ assigned.add(docname)
+ doctree = env.get_doctree(docname)
+ for toctreenode in doctree.findall(addnodes.toctree):
+ depth = toctreenode.get('numbered', 0)
+ if depth:
+ # every numbered toctree gets new numbering
+ numstack = [0]
+ _walk_toctree(toctreenode, depth)
+
+ return rewrite_needed
+
+ def assign_figure_numbers(self, env: BuildEnvironment) -> list[str]:
+ """Assign a figure number to each figure under a numbered toctree."""
+ generated_docnames = frozenset(env.domains['std']._virtual_doc_names)
+
+ rewrite_needed = []
+
+ assigned: set[str] = set()
+ old_fignumbers = env.toc_fignumbers
+ env.toc_fignumbers = {}
+ fignum_counter: dict[str, dict[tuple[int, ...], int]] = {}
+
+ def get_figtype(node: Node) -> str | None:
+ for domain in env.domains.values():
+ figtype = domain.get_enumerable_node_type(node)
+ if (domain.name == 'std'
+ and not domain.get_numfig_title(node)): # type: ignore[attr-defined] # NoQA: E501
+ # Skip if uncaptioned node
+ continue
+
+ if figtype:
+ return figtype
+
+ return None
+
+ def get_section_number(docname: str, section: nodes.section) -> tuple[int, ...]:
+ anchorname = '#' + section['ids'][0]
+ secnumbers = env.toc_secnumbers.get(docname, {})
+ if anchorname in secnumbers:
+ secnum = secnumbers.get(anchorname)
+ else:
+ secnum = secnumbers.get('')
+
+ return secnum or ()
+
+ def get_next_fignumber(figtype: str, secnum: tuple[int, ...]) -> tuple[int, ...]:
+ counter = fignum_counter.setdefault(figtype, {})
+
+ secnum = secnum[:env.config.numfig_secnum_depth]
+ counter[secnum] = counter.get(secnum, 0) + 1
+ return secnum + (counter[secnum],)
+
+ def register_fignumber(docname: str, secnum: tuple[int, ...],
+ figtype: str, fignode: Element) -> None:
+ env.toc_fignumbers.setdefault(docname, {})
+ fignumbers = env.toc_fignumbers[docname].setdefault(figtype, {})
+ figure_id = fignode['ids'][0]
+
+ fignumbers[figure_id] = get_next_fignumber(figtype, secnum)
+
+ def _walk_doctree(docname: str, doctree: Element, secnum: tuple[int, ...]) -> None:
+ nonlocal generated_docnames
+ for subnode in doctree.children:
+ if isinstance(subnode, nodes.section):
+ next_secnum = get_section_number(docname, subnode)
+ if next_secnum:
+ _walk_doctree(docname, subnode, next_secnum)
+ else:
+ _walk_doctree(docname, subnode, secnum)
+ elif isinstance(subnode, addnodes.toctree):
+ for _title, subdocname in subnode['entries']:
+ if url_re.match(subdocname) or subdocname == 'self':
+ # don't mess with those
+ continue
+ if subdocname in generated_docnames:
+ # or these
+ continue
+
+ _walk_doc(subdocname, secnum)
+ elif isinstance(subnode, nodes.Element):
+ figtype = get_figtype(subnode)
+ if figtype and subnode['ids']:
+ register_fignumber(docname, secnum, figtype, subnode)
+
+ _walk_doctree(docname, subnode, secnum)
+
+ def _walk_doc(docname: str, secnum: tuple[int, ...]) -> None:
+ if docname not in assigned:
+ assigned.add(docname)
+ doctree = env.get_doctree(docname)
+ _walk_doctree(docname, doctree, secnum)
+
+ if env.config.numfig:
+ _walk_doc(env.config.root_doc, ())
+ for docname, fignums in env.toc_fignumbers.items():
+ if fignums != old_fignumbers.get(docname):
+ rewrite_needed.append(docname)
+
+ return rewrite_needed
+
+
+def _make_anchor_name(ids: list[str], num_entries: list[int]) -> str:
+ if not num_entries[0]:
+ # for the very first toc entry, don't add an anchor
+ # as it is the file's title anyway
+ anchorname = ''
+ else:
+ anchorname = '#' + ids[0]
+ num_entries[0] += 1
+ return anchorname
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_env_collector(TocTreeCollector)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/errors.py b/sphinx/errors.py
new file mode 100644
index 0000000..5db68dd
--- /dev/null
+++ b/sphinx/errors.py
@@ -0,0 +1,127 @@
+"""Contains SphinxError and a few subclasses."""
+
+from __future__ import annotations
+
+from typing import Any
+
+
+class SphinxError(Exception):
+ """Base class for Sphinx errors.
+
+ This is the base class for "nice" exceptions. When such an exception is
+ raised, Sphinx will abort the build and present the exception category and
+ message to the user.
+
+ Extensions are encouraged to derive from this exception for their custom
+ errors.
+
+ Exceptions *not* derived from :exc:`SphinxError` are treated as unexpected
+ and shown to the user with a part of the traceback (and the full traceback
+ saved in a temporary file).
+
+ .. attribute:: category
+
+ Description of the exception "category", used in converting the
+ exception to a string ("category: message"). Should be set accordingly
+ in subclasses.
+ """
+ category = 'Sphinx error'
+
+
+class SphinxWarning(SphinxError):
+ """Warning, treated as error."""
+ category = 'Warning, treated as error'
+
+
+class ApplicationError(SphinxError):
+ """Application initialization error."""
+ category = 'Application error'
+
+
+class ExtensionError(SphinxError):
+ """Extension error."""
+
+ def __init__(
+ self, message: str, orig_exc: Exception | None = None, modname: str | None = None,
+ ) -> None:
+ super().__init__(message)
+ self.message = message
+ self.orig_exc = orig_exc
+ self.modname = modname
+
+ @property
+ def category(self) -> str: # type: ignore[override]
+ if self.modname:
+ return 'Extension error (%s)' % self.modname
+ else:
+ return 'Extension error'
+
+ def __repr__(self) -> str:
+ if self.orig_exc:
+ return f'{self.__class__.__name__}({self.message!r}, {self.orig_exc!r})'
+ return f'{self.__class__.__name__}({self.message!r})'
+
+ def __str__(self) -> str:
+ parent_str = super().__str__()
+ if self.orig_exc:
+ return f'{parent_str} (exception: {self.orig_exc})'
+ return parent_str
+
+
+class BuildEnvironmentError(SphinxError):
+ """BuildEnvironment error."""
+ category = 'BuildEnvironment error'
+
+
+class ConfigError(SphinxError):
+ """Configuration error."""
+ category = 'Configuration error'
+
+
+class DocumentError(SphinxError):
+ """Document error."""
+ category = 'Document error'
+
+
+class ThemeError(SphinxError):
+ """Theme error."""
+ category = 'Theme error'
+
+
+class VersionRequirementError(SphinxError):
+ """Incompatible Sphinx version error."""
+ category = 'Sphinx version error'
+
+
+class SphinxParallelError(SphinxError):
+ """Sphinx parallel build error."""
+
+ category = 'Sphinx parallel build error'
+
+ def __init__(self, message: str, traceback: Any) -> None:
+ self.message = message
+ self.traceback = traceback
+
+ def __str__(self) -> str:
+ return self.message
+
+
+class PycodeError(Exception):
+ """Pycode Python source code analyser error."""
+
+ def __str__(self) -> str:
+ res = self.args[0]
+ if len(self.args) > 1:
+ res += ' (exception was: %r)' % self.args[1]
+ return res
+
+
+class NoUri(Exception):
+ """Raised by builder.get_relative_uri() or from missing-reference handlers
+ if there is no URI available."""
+ pass
+
+
+class FiletypeNotFoundError(Exception):
+ """Raised by get_filetype() if a filename matches no source suffix."""
+ pass
diff --git a/sphinx/events.py b/sphinx/events.py
new file mode 100644
index 0000000..dad33aa
--- /dev/null
+++ b/sphinx/events.py
@@ -0,0 +1,121 @@
+"""Sphinx core events.
+
+Gracefully adapted from the TextPress system by Armin.
+"""
+
+from __future__ import annotations
+
+import contextlib
+from collections import defaultdict
+from operator import attrgetter
+from typing import TYPE_CHECKING, Any, Callable, NamedTuple
+
+from sphinx.errors import ExtensionError, SphinxError
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.inspect import safe_getattr
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+
+logger = logging.getLogger(__name__)
+
+
+class EventListener(NamedTuple):
+ id: int
+ handler: Callable
+ priority: int
+
+
+# List of all known core events. Maps name to arguments description.
+core_events = {
+ 'builder-inited': '',
+ 'config-inited': 'config',
+ 'env-get-outdated': 'env, added, changed, removed',
+ 'env-get-updated': 'env',
+ 'env-purge-doc': 'env, docname',
+ 'env-before-read-docs': 'env, docnames',
+ 'env-check-consistency': 'env',
+ 'source-read': 'docname, source text',
+ 'include-read': 'relative path, parent docname, source text',
+ 'doctree-read': 'the doctree before being pickled',
+ 'env-merge-info': 'env, read docnames, other env instance',
+ 'missing-reference': 'env, node, contnode',
+ 'warn-missing-reference': 'domain, node',
+ 'doctree-resolved': 'doctree, docname',
+ 'env-updated': 'env',
+ 'build-finished': 'exception',
+}
+
+
+class EventManager:
+ """Event manager for Sphinx."""
+
+ def __init__(self, app: Sphinx) -> None:
+ self.app = app
+ self.events = core_events.copy()
+ self.listeners: dict[str, list[EventListener]] = defaultdict(list)
+ self.next_listener_id = 0
+
+ def add(self, name: str) -> None:
+ """Register a custom Sphinx event."""
+ if name in self.events:
+ raise ExtensionError(__('Event %r already present') % name)
+ self.events[name] = ''
+
+ def connect(self, name: str, callback: Callable, priority: int) -> int:
+ """Connect a handler to specific event."""
+ if name not in self.events:
+ raise ExtensionError(__('Unknown event name: %s') % name)
+
+ listener_id = self.next_listener_id
+ self.next_listener_id += 1
+ self.listeners[name].append(EventListener(listener_id, callback, priority))
+ return listener_id
+
+ def disconnect(self, listener_id: int) -> None:
+ """Disconnect a handler."""
+ for listeners in self.listeners.values():
+ for listener in listeners[:]:
+ if listener.id == listener_id:
+ listeners.remove(listener)
+
+ def emit(self, name: str, *args: Any,
+ allowed_exceptions: tuple[type[Exception], ...] = ()) -> list:
+ """Emit a Sphinx event."""
+
+ # not every object likes to be repr()'d (think
+ # random stuff coming via autodoc)
+ with contextlib.suppress(Exception):
+ logger.debug('[app] emitting event: %r%s', name, repr(args)[:100])
+
+ results = []
+ listeners = sorted(self.listeners[name], key=attrgetter("priority"))
+ for listener in listeners:
+ try:
+ results.append(listener.handler(self.app, *args))
+ except allowed_exceptions:
+ # pass through the errors specified as *allowed_exceptions*
+ raise
+ except SphinxError:
+ raise
+ except Exception as exc:
+ if self.app.pdb:
+ # Just pass through the error, so that it can be debugged.
+ raise
+ modname = safe_getattr(listener.handler, '__module__', None)
+ raise ExtensionError(__("Handler %r for event %r threw an exception") %
+ (listener.handler, name), exc, modname=modname) from exc
+ return results
+
+ def emit_firstresult(self, name: str, *args: Any,
+ allowed_exceptions: tuple[type[Exception], ...] = ()) -> Any:
+ """Emit a Sphinx event and returns first result.
+
+ This returns the result of the first handler that doesn't return ``None``.
+ """
+ for result in self.emit(name, *args, allowed_exceptions=allowed_exceptions):
+ if result is not None:
+ return result
+ return None
diff --git a/sphinx/ext/__init__.py b/sphinx/ext/__init__.py
new file mode 100644
index 0000000..16170d4
--- /dev/null
+++ b/sphinx/ext/__init__.py
@@ -0,0 +1 @@
+"""Contains Sphinx features not activated by default."""
diff --git a/sphinx/ext/apidoc.py b/sphinx/ext/apidoc.py
new file mode 100644
index 0000000..42df848
--- /dev/null
+++ b/sphinx/ext/apidoc.py
@@ -0,0 +1,492 @@
+"""Creates reST files corresponding to Python modules for code documentation.
+
+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),
+https://sat.qc.ca/
+"""
+
+from __future__ import annotations
+
+import argparse
+import fnmatch
+import glob
+import locale
+import os
+import re
+import sys
+from copy import copy
+from importlib.machinery import EXTENSION_SUFFIXES
+from os import path
+from typing import TYPE_CHECKING, Any
+
+import sphinx.locale
+from sphinx import __display_version__, package_dir
+from sphinx.cmd.quickstart import EXTENSIONS
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.osutil import FileAvoidWrite, ensuredir
+from sphinx.util.template import ReSTRenderer
+
+if TYPE_CHECKING:
+ from collections.abc import Generator, Sequence
+
+logger = logging.getLogger(__name__)
+
+# automodule options
+if 'SPHINX_APIDOC_OPTIONS' in os.environ:
+ OPTIONS = os.environ['SPHINX_APIDOC_OPTIONS'].split(',')
+else:
+ OPTIONS = [
+ 'members',
+ 'undoc-members',
+ # 'inherited-members', # disabled because there's a bug in sphinx
+ 'show-inheritance',
+ ]
+
+PY_SUFFIXES = ('.py', '.pyx') + tuple(EXTENSION_SUFFIXES)
+
+template_dir = path.join(package_dir, 'templates', 'apidoc')
+
+
+def is_initpy(filename: str) -> bool:
+ """Check *filename* is __init__ file or not."""
+ basename = path.basename(filename)
+ return any(
+ basename == '__init__' + suffix
+ for suffix in sorted(PY_SUFFIXES, key=len, reverse=True)
+ )
+
+
+def module_join(*modnames: str | None) -> str:
+ """Join module names with dots."""
+ return '.'.join(filter(None, modnames))
+
+
+def is_packagedir(dirname: str | None = None, files: list[str] | None = None) -> bool:
+ """Check given *files* contains __init__ file."""
+ if files is None and dirname is None:
+ return False
+
+ if files is None:
+ files = os.listdir(dirname)
+ return any(f for f in files if is_initpy(f))
+
+
+def write_file(name: str, text: str, opts: Any) -> None:
+ """Write the output file for module/package <name>."""
+ quiet = getattr(opts, 'quiet', None)
+
+ fname = path.join(opts.destdir, f'{name}.{opts.suffix}')
+ if opts.dryrun:
+ if not quiet:
+ logger.info(__('Would create file %s.'), fname)
+ return
+ if not opts.force and path.isfile(fname):
+ if not quiet:
+ logger.info(__('File %s already exists, skipping.'), fname)
+ else:
+ if not quiet:
+ logger.info(__('Creating file %s.'), fname)
+ with FileAvoidWrite(fname) as f:
+ f.write(text)
+
+
+def create_module_file(package: str | None, basename: str, opts: Any,
+ user_template_dir: str | None = None) -> None:
+ """Build the text of the file and write the file."""
+ options = copy(OPTIONS)
+ if opts.includeprivate and 'private-members' not in options:
+ options.append('private-members')
+
+ qualname = module_join(package, basename)
+ context = {
+ 'show_headings': not opts.noheadings,
+ 'basename': basename,
+ 'qualname': qualname,
+ 'automodule_options': options,
+ }
+ if user_template_dir is not None:
+ template_path = [user_template_dir, template_dir]
+ else:
+ template_path = [template_dir]
+ text = ReSTRenderer(template_path).render('module.rst_t', context)
+ write_file(qualname, text, opts)
+
+
+def create_package_file(root: str, master_package: str | None, subroot: str,
+ py_files: list[str],
+ opts: Any, subs: list[str], is_namespace: bool,
+ excludes: Sequence[re.Pattern[str]] = (),
+ user_template_dir: str | None = None,
+ ) -> None:
+ """Build the text of the file and write the file."""
+ # build a list of sub packages (directories containing an __init__ file)
+ subpackages = [module_join(master_package, subroot, pkgname)
+ for pkgname in subs
+ if not is_skipped_package(path.join(root, pkgname), opts, excludes)]
+ # build a list of sub modules
+ submodules = [sub.split('.')[0] for sub in py_files
+ if not is_skipped_module(path.join(root, sub), opts, excludes) and
+ not is_initpy(sub)]
+ submodules = sorted(set(submodules))
+ submodules = [module_join(master_package, subroot, modname)
+ for modname in submodules]
+ options = copy(OPTIONS)
+ if opts.includeprivate and 'private-members' not in options:
+ options.append('private-members')
+
+ pkgname = module_join(master_package, subroot)
+ context = {
+ 'pkgname': pkgname,
+ 'subpackages': subpackages,
+ 'submodules': submodules,
+ 'is_namespace': is_namespace,
+ 'modulefirst': opts.modulefirst,
+ 'separatemodules': opts.separatemodules,
+ 'automodule_options': options,
+ 'show_headings': not opts.noheadings,
+ 'maxdepth': opts.maxdepth,
+ }
+ if user_template_dir is not None:
+ template_path = [user_template_dir, template_dir]
+ else:
+ template_path = [template_dir]
+ text = ReSTRenderer(template_path).render('package.rst_t', context)
+ write_file(pkgname, text, opts)
+
+ if submodules and opts.separatemodules:
+ for submodule in submodules:
+ create_module_file(None, submodule, opts, user_template_dir)
+
+
+def create_modules_toc_file(modules: list[str], opts: Any, name: str = 'modules',
+ user_template_dir: str | None = None) -> None:
+ """Create the module's index."""
+ 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 + '.'):
+ modules.remove(module)
+ else:
+ prev_module = module
+
+ context = {
+ 'header': opts.header,
+ 'maxdepth': opts.maxdepth,
+ 'docnames': modules,
+ }
+ if user_template_dir is not None:
+ template_path = [user_template_dir, template_dir]
+ else:
+ template_path = [template_dir]
+ text = ReSTRenderer(template_path).render('toc.rst_t', context)
+ write_file(name, text, opts)
+
+
+def is_skipped_package(dirname: str, opts: Any,
+ excludes: Sequence[re.Pattern[str]] = ()) -> bool:
+ """Check if we want to skip this module."""
+ if not path.isdir(dirname):
+ return False
+
+ files = glob.glob(path.join(dirname, '*.py'))
+ regular_package = any(f for f in files if is_initpy(f))
+ if not regular_package and not opts.implicit_namespaces:
+ # *dirname* is not both a regular package and an implicit namespace package
+ return True
+
+ # Check there is some showable module inside package
+ return all(is_excluded(path.join(dirname, f), excludes) for f in files)
+
+
+def is_skipped_module(filename: str, opts: Any, _excludes: Sequence[re.Pattern[str]]) -> bool:
+ """Check if we want to skip this module."""
+ if not path.exists(filename):
+ # skip if the file doesn't exist
+ return True
+ if path.basename(filename).startswith('_') and not opts.includeprivate:
+ # skip if the module has a "private" name
+ return True
+ return False
+
+
+def walk(rootpath: str, excludes: Sequence[re.Pattern[str]], opts: Any,
+ ) -> Generator[tuple[str, list[str], list[str]], None, None]:
+ """Walk through the directory and list files and subdirectories up."""
+ followlinks = getattr(opts, 'followlinks', False)
+ includeprivate = getattr(opts, 'includeprivate', False)
+
+ for root, subs, files in os.walk(rootpath, followlinks=followlinks):
+ # document only Python module files (that aren't excluded)
+ files = sorted(f for f in files
+ if f.endswith(PY_SUFFIXES) and
+ not is_excluded(path.join(root, f), excludes))
+
+ # remove hidden ('.') and private ('_') directories, as well as
+ # excluded dirs
+ if includeprivate:
+ exclude_prefixes: tuple[str, ...] = ('.',)
+ else:
+ exclude_prefixes = ('.', '_')
+
+ subs[:] = sorted(sub for sub in subs if not sub.startswith(exclude_prefixes) and
+ not is_excluded(path.join(root, sub), excludes))
+
+ yield root, subs, files
+
+
+def has_child_module(rootpath: str, excludes: Sequence[re.Pattern[str]], opts: Any) -> bool:
+ """Check the given directory contains child module/s (at least one)."""
+ return any(
+ files
+ for _root, _subs, files in walk(rootpath, excludes, opts)
+ )
+
+
+def recurse_tree(rootpath: str, excludes: Sequence[re.Pattern[str]], opts: Any,
+ user_template_dir: str | None = None) -> list[str]:
+ """
+ Look for every file in the directory tree and create the corresponding
+ ReST files.
+ """
+ implicit_namespaces = getattr(opts, 'implicit_namespaces', False)
+
+ # check if the base directory is a package and get its name
+ if is_packagedir(rootpath) or implicit_namespaces:
+ root_package = rootpath.split(path.sep)[-1]
+ else:
+ # otherwise, the base is a directory with packages
+ root_package = None
+
+ toplevels = []
+ for root, subs, files in walk(rootpath, excludes, opts):
+ is_pkg = is_packagedir(None, files)
+ is_namespace = not is_pkg and implicit_namespaces
+ if is_pkg:
+ for f in files[:]:
+ if is_initpy(f):
+ files.remove(f)
+ files.insert(0, f)
+ elif root != rootpath:
+ # only accept non-package at toplevel unless using implicit namespaces
+ if not implicit_namespaces:
+ del subs[:]
+ continue
+
+ if is_pkg or is_namespace:
+ # we are in a package with something to document
+ if subs or len(files) > 1 or not is_skipped_package(root, opts):
+ subpackage = root[len(rootpath):].lstrip(path.sep).\
+ replace(path.sep, '.')
+ # if this is not a namespace or
+ # a namespace and there is something there to document
+ if not is_namespace or has_child_module(root, excludes, opts):
+ create_package_file(root, root_package, subpackage,
+ files, opts, subs, is_namespace, excludes,
+ user_template_dir)
+ toplevels.append(module_join(root_package, subpackage))
+ else:
+ # if we are at the root level, we don't require it to be a package
+ assert root == rootpath
+ assert root_package is None
+ for py_file in files:
+ if not is_skipped_module(path.join(rootpath, py_file), opts, excludes):
+ module = py_file.split('.')[0]
+ create_module_file(root_package, module, opts, user_template_dir)
+ toplevels.append(module)
+
+ return toplevels
+
+
+def is_excluded(root: str, excludes: Sequence[re.Pattern[str]]) -> bool:
+ """Check if the directory is in the exclude list.
+
+ Note: by having trailing slashes, we avoid common prefix issues, like
+ e.g. an exclude "foo" also accidentally excluding "foobar".
+ """
+ return any(exclude.match(root) for exclude in excludes)
+
+
+def get_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser(
+ usage='%(prog)s [OPTIONS] -o <OUTPUT_PATH> <MODULE_PATH> '
+ '[EXCLUDE_PATTERN, ...]',
+ epilog=__('For more information, visit <https://www.sphinx-doc.org/>.'),
+ description=__("""
+Look recursively in <MODULE_PATH> for Python modules and packages and create
+one reST file with automodule directives per package in the <OUTPUT_PATH>.
+
+The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be
+excluded from generation.
+
+Note: By default this script will not overwrite already created files."""))
+
+ parser.add_argument('--version', action='version', dest='show_version',
+ version='%%(prog)s %s' % __display_version__)
+
+ parser.add_argument('module_path',
+ help=__('path to module to document'))
+ parser.add_argument('exclude_pattern', nargs='*',
+ help=__('fnmatch-style file and/or directory patterns '
+ 'to exclude from generation'))
+
+ parser.add_argument('-o', '--output-dir', action='store', dest='destdir',
+ required=True,
+ help=__('directory to place all output'))
+ parser.add_argument('-q', action='store_true', dest='quiet',
+ help=__('no output on stdout, just warnings on stderr'))
+ parser.add_argument('-d', '--maxdepth', action='store', dest='maxdepth',
+ type=int, default=4,
+ help=__('maximum depth of submodules to show in the TOC '
+ '(default: 4)'))
+ parser.add_argument('-f', '--force', action='store_true', dest='force',
+ help=__('overwrite existing files'))
+ parser.add_argument('-l', '--follow-links', action='store_true',
+ dest='followlinks', default=False,
+ help=__('follow symbolic links. Powerful when combined '
+ 'with collective.recipe.omelette.'))
+ parser.add_argument('-n', '--dry-run', action='store_true', dest='dryrun',
+ help=__('run the script without creating files'))
+ parser.add_argument('-e', '--separate', action='store_true',
+ dest='separatemodules',
+ help=__('put documentation for each module on its own page'))
+ parser.add_argument('-P', '--private', action='store_true',
+ dest='includeprivate',
+ help=__('include "_private" modules'))
+ parser.add_argument('--tocfile', action='store', dest='tocfile', default='modules',
+ help=__("filename of table of contents (default: modules)"))
+ parser.add_argument('-T', '--no-toc', action='store_false', dest='tocfile',
+ help=__("don't create a table of contents file"))
+ parser.add_argument('-E', '--no-headings', action='store_true',
+ dest='noheadings',
+ help=__("don't create headings for the module/package "
+ "packages (e.g. when the docstrings already "
+ "contain them)"))
+ parser.add_argument('-M', '--module-first', action='store_true',
+ dest='modulefirst',
+ help=__('put module documentation before submodule '
+ 'documentation'))
+ parser.add_argument('--implicit-namespaces', action='store_true',
+ dest='implicit_namespaces',
+ help=__('interpret module paths according to PEP-0420 '
+ 'implicit namespaces specification'))
+ parser.add_argument('-s', '--suffix', action='store', dest='suffix',
+ default='rst',
+ help=__('file suffix (default: rst)'))
+ parser.add_argument('-F', '--full', action='store_true', dest='full',
+ help=__('generate a full project with sphinx-quickstart'))
+ parser.add_argument('-a', '--append-syspath', action='store_true',
+ dest='append_syspath',
+ help=__('append module_path to sys.path, used when --full is given'))
+ parser.add_argument('-H', '--doc-project', action='store', dest='header',
+ help=__('project name (default: root module name)'))
+ parser.add_argument('-A', '--doc-author', action='store', dest='author',
+ help=__('project author(s), used when --full is given'))
+ parser.add_argument('-V', '--doc-version', action='store', dest='version',
+ help=__('project version, used when --full is given'))
+ parser.add_argument('-R', '--doc-release', action='store', dest='release',
+ help=__('project release, used when --full is given, '
+ 'defaults to --doc-version'))
+
+ group = parser.add_argument_group(__('extension options'))
+ group.add_argument('--extensions', metavar='EXTENSIONS', dest='extensions',
+ action='append', help=__('enable arbitrary extensions'))
+ for ext in EXTENSIONS:
+ group.add_argument('--ext-%s' % ext, action='append_const',
+ const='sphinx.ext.%s' % ext, dest='extensions',
+ help=__('enable %s extension') % ext)
+
+ group = parser.add_argument_group(__('Project templating'))
+ group.add_argument('-t', '--templatedir', metavar='TEMPLATEDIR',
+ dest='templatedir',
+ help=__('template directory for template files'))
+
+ return parser
+
+
+def main(argv: Sequence[str] = (), /) -> int:
+ """Parse and check the command line arguments."""
+ locale.setlocale(locale.LC_ALL, '')
+ sphinx.locale.init_console()
+
+ parser = get_parser()
+ args = parser.parse_args(argv or sys.argv[1:])
+
+ rootpath = path.abspath(args.module_path)
+
+ # normalize opts
+
+ if args.header is None:
+ args.header = rootpath.split(path.sep)[-1]
+ if args.suffix.startswith('.'):
+ args.suffix = args.suffix[1:]
+ if not path.isdir(rootpath):
+ logger.error(__('%s is not a directory.'), rootpath)
+ raise SystemExit(1)
+ if not args.dryrun:
+ ensuredir(args.destdir)
+ excludes = tuple(
+ re.compile(fnmatch.translate(path.abspath(exclude)))
+ for exclude in dict.fromkeys(args.exclude_pattern)
+ )
+ modules = recurse_tree(rootpath, excludes, args, args.templatedir)
+
+ if args.full:
+ from sphinx.cmd 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 = {
+ 'path': args.destdir,
+ 'sep': False,
+ 'dot': '_',
+ 'project': args.header,
+ 'author': args.author or 'Author',
+ 'version': args.version or '',
+ 'release': args.release or args.version or '',
+ 'suffix': '.' + args.suffix,
+ 'master': 'index',
+ 'epub': True,
+ 'extensions': ['sphinx.ext.autodoc', 'sphinx.ext.viewcode',
+ 'sphinx.ext.todo'],
+ 'makefile': True,
+ 'batchfile': True,
+ 'make_mode': True,
+ 'mastertocmaxdepth': args.maxdepth,
+ 'mastertoctree': text,
+ 'language': 'en',
+ 'module_path': rootpath,
+ 'append_syspath': args.append_syspath,
+ }
+ if args.extensions:
+ d['extensions'].extend(args.extensions)
+ if args.quiet:
+ d['quiet'] = True
+
+ for ext in d['extensions'][:]:
+ if ',' in ext:
+ d['extensions'].remove(ext)
+ d['extensions'].extend(ext.split(','))
+
+ if not args.dryrun:
+ qs.generate(d, silent=True, overwrite=args.force,
+ templatedir=args.templatedir)
+ elif args.tocfile:
+ create_modules_toc_file(modules, args, args.tocfile, args.templatedir)
+
+ return 0
+
+
+# So program can be started with "python -m sphinx.apidoc ..."
+if __name__ == "__main__":
+ raise SystemExit(main(sys.argv[1:]))
diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py
new file mode 100644
index 0000000..8d68f72
--- /dev/null
+++ b/sphinx/ext/autodoc/__init__.py
@@ -0,0 +1,2850 @@
+"""Extension to create automatic documentation from code docstrings.
+
+Automatically insert docstrings for functions, classes or whole modules into
+the doctree, thus avoiding duplication between docstrings and documentation
+for those who like elaborate docstrings.
+"""
+
+from __future__ import annotations
+
+import re
+import sys
+import warnings
+from inspect import Parameter, Signature
+from typing import TYPE_CHECKING, Any, Callable, TypeVar
+
+from docutils.statemachine import StringList
+
+import sphinx
+from sphinx.config import ENUM, Config
+from sphinx.deprecation import RemovedInSphinx80Warning
+from sphinx.ext.autodoc.importer import get_class_members, import_module, import_object
+from sphinx.ext.autodoc.mock import ismock, mock, undecorate
+from sphinx.locale import _, __
+from sphinx.pycode import ModuleAnalyzer, PycodeError
+from sphinx.util import inspect, logging
+from sphinx.util.docstrings import prepare_docstring, separate_metadata
+from sphinx.util.inspect import (
+ evaluate_signature,
+ getdoc,
+ object_description,
+ safe_getattr,
+ stringify_signature,
+)
+from sphinx.util.typing import OptionSpec, get_type_hints, restify, stringify_annotation
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator, Sequence
+ from types import ModuleType
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.ext.autodoc.directive import DocumenterBridge
+
+logger = logging.getLogger(__name__)
+
+
+# This type isn't exposed directly in any modules, but can be found
+# here in most Python versions
+MethodDescriptorType = type(type.__subclasses__)
+
+
+#: extended signature RE: with explicit module name separated by ::
+py_ext_sig_re = re.compile(
+ r'''^ ([\w.]+::)? # explicit module name
+ ([\w.]+\.)? # module and/or class name(s)
+ (\w+) \s* # thing name
+ (?: \[\s*(.*)\s*])? # optional: type parameters list
+ (?: \((.*)\) # optional: arguments
+ (?:\s* -> \s* (.*))? # return annotation
+ )? $ # and nothing more
+ ''', re.VERBOSE)
+special_member_re = re.compile(r'^__\S+__$')
+
+
+def identity(x: Any) -> Any:
+ return x
+
+
+class _All:
+ """A special value for :*-members: that matches to any member."""
+
+ def __contains__(self, item: Any) -> bool:
+ return True
+
+ def append(self, item: Any) -> None:
+ pass # nothing
+
+
+class _Empty:
+ """A special value for :exclude-members: that never matches to any member."""
+
+ def __contains__(self, item: Any) -> bool:
+ return False
+
+
+ALL = _All()
+EMPTY = _Empty()
+UNINITIALIZED_ATTR = object()
+INSTANCEATTR = object()
+SLOTSATTR = object()
+
+
+def members_option(arg: Any) -> object | list[str]:
+ """Used to convert the :members: option to auto directives."""
+ if arg in (None, True):
+ return ALL
+ elif arg is False:
+ return None
+ else:
+ return [x.strip() for x in arg.split(',') if x.strip()]
+
+
+def exclude_members_option(arg: Any) -> object | set[str]:
+ """Used to convert the :exclude-members: option."""
+ if arg in (None, True):
+ return EMPTY
+ return {x.strip() for x in arg.split(',') if x.strip()}
+
+
+def inherited_members_option(arg: Any) -> set[str]:
+ """Used to convert the :inherited-members: option to auto directives."""
+ if arg in (None, True):
+ return {'object'}
+ elif arg:
+ return {x.strip() for x in arg.split(',')}
+ else:
+ return set()
+
+
+def member_order_option(arg: Any) -> str | None:
+ """Used to convert the :member-order: option to auto directives."""
+ if arg in (None, True):
+ return None
+ elif arg in ('alphabetical', 'bysource', 'groupwise'):
+ return arg
+ else:
+ raise ValueError(__('invalid value for member-order option: %s') % arg)
+
+
+def class_doc_from_option(arg: Any) -> str | None:
+ """Used to convert the :class-doc-from: option to autoclass directives."""
+ if arg in ('both', 'class', 'init'):
+ return arg
+ else:
+ raise ValueError(__('invalid value for class-doc-from option: %s') % arg)
+
+
+SUPPRESS = object()
+
+
+def annotation_option(arg: Any) -> Any:
+ if arg in (None, True):
+ # suppress showing the representation of the object
+ return SUPPRESS
+ else:
+ return arg
+
+
+def bool_option(arg: Any) -> bool:
+ """Used to convert flag options to auto directives. (Instead of
+ directives.flag(), which returns None).
+ """
+ return True
+
+
+def merge_members_option(options: dict) -> None:
+ """Merge :private-members: and :special-members: options to the
+ :members: option.
+ """
+ if options.get('members') is ALL:
+ # merging is not needed when members: ALL
+ return
+
+ members = options.setdefault('members', [])
+ for key in {'private-members', 'special-members'}:
+ if key in options and options[key] not in (ALL, None):
+ for member in options[key]:
+ if member not in members:
+ members.append(member)
+
+
+# Some useful event listener factories for autodoc-process-docstring.
+
+def cut_lines(pre: int, post: int = 0, what: str | None = None) -> Callable:
+ """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.
+
+ Use like this (e.g. in the ``setup()`` function of :file:`conf.py`)::
+
+ from sphinx.ext.autodoc import cut_lines
+ app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
+
+ This can (and should) be used in place of :confval:`automodule_skip_lines`.
+ """
+ def process(app: Sphinx, what_: str, name: str, obj: Any, options: Any, lines: list[str],
+ ) -> None:
+ if what and what_ not in what:
+ return
+ del lines[:pre]
+ if post:
+ # remove one trailing blank line.
+ if lines and not lines[-1]:
+ lines.pop(-1)
+ del lines[-post:]
+ # make sure there is a blank line at the end
+ if lines and lines[-1]:
+ lines.append('')
+ return process
+
+
+def between(
+ marker: str,
+ what: Sequence[str] | None = None,
+ keepempty: bool = False,
+ exclude: bool = False,
+) -> Callable:
+ """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.
+
+ If *what* is a sequence of strings, only docstrings of a type in *what* will
+ be processed.
+ """
+ marker_re = re.compile(marker)
+
+ def process(app: Sphinx, what_: str, name: str, obj: Any, options: Any, lines: list[str],
+ ) -> None:
+ if what and what_ not in what:
+ return
+ deleted = 0
+ delete = not exclude
+ orig_lines = lines[:]
+ for i, line in enumerate(orig_lines):
+ if delete:
+ lines.pop(i - deleted)
+ deleted += 1
+ if marker_re.match(line):
+ delete = not delete
+ if delete:
+ lines.pop(i - deleted)
+ deleted += 1
+ if not lines and not keepempty:
+ lines[:] = orig_lines
+ # make sure there is a blank line at the end
+ if lines and lines[-1]:
+ lines.append('')
+ return process
+
+
+# This class is used only in ``sphinx.ext.autodoc.directive``,
+# But we define this class here to keep compatibility (see #4538)
+class Options(dict):
+ """A dict/attribute hybrid that returns None on nonexisting keys."""
+ def copy(self) -> Options:
+ return Options(super().copy())
+
+ def __getattr__(self, name: str) -> Any:
+ try:
+ return self[name.replace('_', '-')]
+ except KeyError:
+ return None
+
+
+class ObjectMember:
+ """A member of object.
+
+ This is used for the result of `Documenter.get_module_members()` to
+ represent each member of the object.
+
+ .. Note::
+
+ An instance of this class behaves as a tuple of (name, object)
+ for compatibility to old Sphinx. The behavior will be dropped
+ in the future. Therefore extensions should not use the tuple
+ interface.
+ """
+
+ def __init__(self, name: str, obj: Any, *, docstring: str | None = None,
+ class_: Any = None, skipped: bool = False) -> None:
+ self.__name__ = name
+ self.object = obj
+ self.docstring = docstring
+ self.skipped = skipped
+ self.class_ = class_
+
+ def __getitem__(self, index):
+ warnings.warn('The tuple interface of ObjectMember is deprecated. '
+ 'Use (obj.__name__, obj.object) instead.',
+ RemovedInSphinx80Warning, stacklevel=2)
+ return (self.__name__, self.object)[index]
+
+
+class Documenter:
+ """
+ A Documenter knows how to autodocument a single object type. When
+ registered with the AutoDirective, it will be used to document objects
+ of that type when needed by autodoc.
+
+ Its *objtype* attribute selects what auto directive it is assigned to
+ (the directive name is 'auto' + objtype), and what directive it generates
+ by default, though that can be overridden by an attribute called
+ *directivetype*.
+
+ A Documenter has an *option_spec* that works like a docutils directive's;
+ in fact, it will be used to parse an auto directive's options that matches
+ the Documenter.
+ """
+ #: name by which the directive is called (auto...) and the default
+ #: generated directive name
+ objtype = 'object'
+ #: indentation by which to indent the directive content
+ content_indent = ' '
+ #: priority if multiple documenters return True from can_document_member
+ priority = 0
+ #: order if autodoc_member_order is set to 'groupwise'
+ member_order = 0
+ #: true if the generated content may contain titles
+ titles_allowed = True
+
+ option_spec: OptionSpec = {
+ 'no-index': bool_option,
+ 'noindex': bool_option,
+ }
+
+ def get_attr(self, obj: Any, name: str, *defargs: Any) -> Any:
+ """getattr() override for types such as Zope interfaces."""
+ return autodoc_attrgetter(self.env.app, obj, name, *defargs)
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ """Called to see if a member can be documented by this Documenter."""
+ msg = 'must be implemented in subclasses'
+ raise NotImplementedError(msg)
+
+ def __init__(self, directive: DocumenterBridge, name: str, indent: str = '') -> None:
+ self.directive = directive
+ self.config: Config = directive.env.config
+ self.env: BuildEnvironment = directive.env
+ self.options = directive.genopt
+ self.name = name
+ self.indent = indent
+ # the module and object path within the module, and the fully
+ # qualified name (all set after resolve_name succeeds)
+ self.modname: str = ''
+ self.module: ModuleType | None = None
+ self.objpath: list[str] = []
+ self.fullname = ''
+ # extra signature items (arguments and return annotation,
+ # also set after resolve_name succeeds)
+ self.args: str | None = None
+ self.retann: str = ''
+ # the object to document (set after import_object succeeds)
+ self.object: Any = None
+ self.object_name = ''
+ # the parent/owner of the object to document
+ self.parent: Any = None
+ # the module analyzer to get at attribute docs, or None
+ self.analyzer: ModuleAnalyzer | None = None
+
+ @property
+ def documenters(self) -> dict[str, type[Documenter]]:
+ """Returns registered Documenter classes"""
+ return self.env.app.registry.documenters
+
+ def add_line(self, line: str, source: str, *lineno: int) -> None:
+ """Append one line of generated reST to the output."""
+ if line.strip(): # not a blank line
+ self.directive.result.append(self.indent + line, source, *lineno)
+ else:
+ self.directive.result.append('', source, *lineno)
+
+ def resolve_name(self, modname: str | None, parents: Any, path: str, base: str,
+ ) -> tuple[str | None, list[str]]:
+ """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
+ example, it would return ``('zipfile', ['ZipFile', 'open'])`` for the
+ ``zipfile.ZipFile.open`` method.
+ """
+ msg = 'must be implemented in subclasses'
+ raise NotImplementedError(msg)
+
+ def parse_name(self) -> bool:
+ """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.
+ """
+ # first, parse the definition -- auto directives for classes and
+ # functions can contain a signature which is then used instead of
+ # an autogenerated one
+ matched = py_ext_sig_re.match(self.name)
+ if matched is None:
+ logger.warning(__('invalid signature for auto%s (%r)') % (self.objtype, self.name),
+ type='autodoc')
+ return False
+ explicit_modname, path, base, tp_list, args, retann = matched.groups()
+
+ # support explicit module and class name separation via ::
+ if explicit_modname is not None:
+ modname = explicit_modname[:-2]
+ parents = path.rstrip('.').split('.') if path else []
+ else:
+ modname = None
+ parents = []
+
+ with mock(self.config.autodoc_mock_imports):
+ modname, self.objpath = self.resolve_name(modname, parents, path, base)
+
+ if not modname:
+ return False
+
+ self.modname = modname
+ self.args = args
+ self.retann = retann
+ self.fullname = ((self.modname or '') +
+ ('.' + '.'.join(self.objpath) if self.objpath else ''))
+ return True
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ """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.
+ """
+ with mock(self.config.autodoc_mock_imports):
+ try:
+ ret = import_object(self.modname, self.objpath, self.objtype,
+ attrgetter=self.get_attr,
+ warningiserror=self.config.autodoc_warningiserror)
+ self.module, self.parent, self.object_name, self.object = ret
+ if ismock(self.object):
+ self.object = undecorate(self.object)
+ return True
+ except ImportError as exc:
+ if raiseerror:
+ raise
+ logger.warning(exc.args[0], type='autodoc', subtype='import_object')
+ self.env.note_reread()
+ return False
+
+ def get_real_modname(self) -> str:
+ """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) -> bool:
+ """Check if *self.object* is really defined in the module given by
+ *self.modname*.
+ """
+ if self.options.imported_members:
+ return True
+
+ subject = inspect.unpartial(self.object)
+ modname = self.get_attr(subject, '__module__', None)
+ if modname and modname != self.modname:
+ return False
+ return True
+
+ def format_args(self, **kwargs: Any) -> str:
+ """Format the argument signature of *self.object*.
+
+ Should return None if the object does not have a signature.
+ """
+ return ''
+
+ def format_name(self) -> str:
+ """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 _call_format_args(self, **kwargs: Any) -> str:
+ if kwargs:
+ try:
+ return self.format_args(**kwargs)
+ except TypeError:
+ # avoid chaining exceptions, by putting nothing here
+ pass
+
+ # retry without arguments for old documenters
+ return self.format_args()
+
+ def format_signature(self, **kwargs: Any) -> str:
+ """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:
+ # signature given explicitly
+ args = "(%s)" % self.args
+ retann = self.retann
+ else:
+ # try to introspect the signature
+ try:
+ retann = None
+ args = self._call_format_args(**kwargs)
+ if args:
+ matched = re.match(r'^(\(.*\))\s+->\s+(.*)$', args)
+ if matched:
+ args = matched.group(1)
+ retann = matched.group(2)
+ except Exception as exc:
+ logger.warning(__('error while formatting arguments for %s: %s'),
+ self.fullname, exc, type='autodoc')
+ args = None
+
+ result = self.env.events.emit_firstresult('autodoc-process-signature',
+ self.objtype, self.fullname,
+ self.object, self.options, args, retann)
+ if result:
+ args, retann = result
+
+ if args is not None:
+ return args + ((' -> %s' % retann) if retann else '')
+ else:
+ return ''
+
+ def add_directive_header(self, sig: str) -> None:
+ """Add the directive header and options to the generated content."""
+ domain = getattr(self, 'domain', 'py')
+ directive = getattr(self, 'directivetype', self.objtype)
+ name = self.format_name()
+ sourcename = self.get_sourcename()
+
+ # one signature per line, indented by column
+ prefix = f'.. {domain}:{directive}:: '
+ for i, sig_line in enumerate(sig.split("\n")):
+ self.add_line(f'{prefix}{name}{sig_line}',
+ sourcename)
+ if i == 0:
+ prefix = " " * len(prefix)
+
+ if self.options.no_index or self.options.noindex:
+ self.add_line(' :no-index:', sourcename)
+ if self.objpath:
+ # Be explicit about the module, this is necessary since .. class::
+ # etc. don't support a prepended module name
+ self.add_line(' :module: %s' % self.modname, sourcename)
+
+ def get_doc(self) -> list[list[str]] | None:
+ """Decode and return lines of the docstring(s) for the object.
+
+ When it returns None, autodoc-process-docstring will not be called for this
+ object.
+ """
+ docstring = getdoc(self.object, self.get_attr, self.config.autodoc_inherit_docstrings,
+ self.parent, self.object_name)
+ if docstring:
+ tab_width = self.directive.state.document.settings.tab_width
+ return [prepare_docstring(docstring, tab_width)]
+ return []
+
+ def process_doc(self, docstrings: list[list[str]]) -> Iterator[str]:
+ """Let the user process the docstrings before adding them."""
+ for docstringlines in docstrings:
+ if self.env.app:
+ # let extensions preprocess docstrings
+ self.env.app.emit('autodoc-process-docstring',
+ self.objtype, self.fullname, self.object,
+ self.options, docstringlines)
+
+ if docstringlines and docstringlines[-1] != '':
+ # append a blank line to the end of the docstring
+ docstringlines.append('')
+
+ yield from docstringlines
+
+ def get_sourcename(self) -> str:
+ if (inspect.safe_getattr(self.object, '__module__', None) and
+ inspect.safe_getattr(self.object, '__qualname__', None)):
+ # Get the correct location of docstring from self.object
+ # to support inherited methods
+ fullname = f'{self.object.__module__}.{self.object.__qualname__}'
+ else:
+ fullname = self.fullname
+
+ if self.analyzer:
+ return f'{self.analyzer.srcname}:docstring of {fullname}'
+ else:
+ return 'docstring of %s' % fullname
+
+ def add_content(self, more_content: StringList | None) -> None:
+ """Add content from docstrings, attribute documentation and user."""
+ docstring = True
+
+ # set sourcename and add content from attribute documentation
+ sourcename = self.get_sourcename()
+ if self.analyzer:
+ attr_docs = self.analyzer.find_attr_docs()
+ if self.objpath:
+ key = ('.'.join(self.objpath[:-1]), self.objpath[-1])
+ if key in attr_docs:
+ docstring = False
+ # make a copy of docstring for attributes to avoid cache
+ # the change of autodoc-process-docstring event.
+ attribute_docstrings = [list(attr_docs[key])]
+
+ for i, line in enumerate(self.process_doc(attribute_docstrings)):
+ self.add_line(line, sourcename, i)
+
+ # add content from docstrings
+ if docstring:
+ docstrings = self.get_doc()
+ if docstrings is None:
+ # Do not call autodoc-process-docstring on get_doc() returns None.
+ pass
+ else:
+ if not docstrings:
+ # append at least a dummy docstring, so that the event
+ # autodoc-process-docstring is fired and can add some
+ # content if desired
+ docstrings.append([])
+ for i, line in enumerate(self.process_doc(docstrings)):
+ self.add_line(line, sourcename, i)
+
+ # add additional content (e.g. from document), if present
+ if more_content:
+ for line, src in zip(more_content.data, more_content.items):
+ self.add_line(line, src[0], src[1])
+
+ def get_object_members(self, want_all: bool) -> tuple[bool, list[ObjectMember]]:
+ """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
+ members given by *self.options.members* (which may also be None).
+ """
+ msg = 'must be implemented in subclasses'
+ raise NotImplementedError(msg)
+
+ def filter_members(self, members: list[ObjectMember], want_all: bool,
+ ) -> list[tuple[str, Any, bool]]:
+ """Filter the given member list.
+
+ 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.
+ """
+ def is_filtered_inherited_member(name: str, obj: Any) -> bool:
+ inherited_members = self.options.inherited_members or set()
+
+ if inspect.isclass(self.object):
+ for cls in self.object.__mro__:
+ if cls.__name__ in inherited_members and cls != self.object:
+ # given member is a member of specified *super class*
+ return True
+ if name in cls.__dict__:
+ return False
+ if name in self.get_attr(cls, '__annotations__', {}):
+ return False
+ if isinstance(obj, ObjectMember) and obj.class_ is cls:
+ return False
+
+ return False
+
+ ret = []
+
+ # search for members in source code too
+ namespace = '.'.join(self.objpath) # will be empty for modules
+
+ if self.analyzer:
+ attr_docs = self.analyzer.find_attr_docs()
+ else:
+ attr_docs = {}
+
+ # process members and determine which to skip
+ for obj in members:
+ try:
+ membername = obj.__name__
+ member = obj.object
+ except AttributeError:
+ if isinstance(obj, ObjectMember):
+ raise
+ # To be removed, retained for compatibility.
+ # See https://github.com/sphinx-doc/sphinx/issues/11631
+ membername, member = obj
+ warnings.warn(
+ 'Returning tuples of (name, object) as '
+ 'the second return value from get_object_members() is deprecated. '
+ 'Return ObjectMember(name, object) instances instead.',
+ RemovedInSphinx80Warning, stacklevel=2,
+ )
+
+ # if isattr is True, the member is documented as an attribute
+ isattr = member is INSTANCEATTR or (namespace, membername) in attr_docs
+
+ try:
+ doc = getdoc(member, self.get_attr, self.config.autodoc_inherit_docstrings,
+ self.object, membername)
+ if not isinstance(doc, str):
+ # Ignore non-string __doc__
+ 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
+
+ if isinstance(obj, ObjectMember) and obj.docstring:
+ # hack for ClassDocumenter to inject docstring via ObjectMember
+ doc = obj.docstring
+
+ doc, metadata = separate_metadata(doc)
+ has_doc = bool(doc)
+
+ if 'private' in metadata:
+ # consider a member private if docstring has "private" metadata
+ isprivate = True
+ elif 'public' in metadata:
+ # consider a member public if docstring has "public" metadata
+ isprivate = False
+ else:
+ isprivate = membername.startswith('_')
+
+ keep = False
+ if ismock(member) and (namespace, membername) not in attr_docs:
+ # mocked module or object
+ pass
+ elif (self.options.exclude_members and
+ membername in self.options.exclude_members):
+ # remove members given by exclude-members
+ keep = False
+ elif want_all and special_member_re.match(membername):
+ # special __methods__
+ if (self.options.special_members and
+ membername in self.options.special_members):
+ if membername == '__doc__': # NoQA: SIM114
+ keep = False
+ elif is_filtered_inherited_member(membername, obj):
+ keep = False
+ else:
+ keep = has_doc or self.options.undoc_members
+ else:
+ keep = False
+ elif (namespace, membername) in attr_docs:
+ if want_all and isprivate:
+ if self.options.private_members is None:
+ keep = False
+ else:
+ keep = membername in self.options.private_members
+ else:
+ # keep documented attributes
+ keep = True
+ elif want_all and isprivate:
+ if has_doc or self.options.undoc_members:
+ if self.options.private_members is None: # NoQA: SIM114
+ keep = False
+ elif is_filtered_inherited_member(membername, obj):
+ keep = False
+ else:
+ keep = membername in self.options.private_members
+ else:
+ keep = False
+ else:
+ if (self.options.members is ALL and
+ is_filtered_inherited_member(membername, obj)):
+ keep = False
+ else:
+ # ignore undocumented members if :undoc-members: is not given
+ keep = has_doc or self.options.undoc_members
+
+ if isinstance(obj, ObjectMember) and obj.skipped:
+ # forcedly skipped member (ex. a module attribute not defined in __all__)
+ keep = False
+
+ # give the user a chance to decide whether this member
+ # should be skipped
+ if self.env.app:
+ # let extensions preprocess docstrings
+ skip_user = self.env.app.emit_firstresult(
+ 'autodoc-skip-member', self.objtype, membername, member,
+ not keep, self.options)
+ if skip_user is not None:
+ keep = not skip_user
+ except Exception as exc:
+ logger.warning(__('autodoc: failed to determine %s.%s (%r) to be documented, '
+ 'the following exception was raised:\n%s'),
+ self.name, membername, member, exc, type='autodoc')
+ keep = False
+
+ if keep:
+ ret.append((membername, member, isattr))
+
+ return ret
+
+ def document_members(self, all_members: bool = False) -> None:
+ """Generate reST for member documentation.
+
+ If *all_members* is True, document all members, else those given by
+ *self.options.members*.
+ """
+ # set current namespace for finding members
+ self.env.temp_data['autodoc:module'] = self.modname
+ if self.objpath:
+ self.env.temp_data['autodoc:class'] = self.objpath[0]
+
+ want_all = (all_members or
+ self.options.inherited_members or
+ self.options.members is ALL)
+ # find out which members are documentable
+ members_check_module, members = self.get_object_members(want_all)
+
+ # document non-skipped members
+ memberdocumenters: list[tuple[Documenter, bool]] = []
+ for (mname, member, isattr) in self.filter_members(members, want_all):
+ classes = [cls for cls in self.documenters.values()
+ if cls.can_document_member(member, mname, isattr, self)]
+ if not classes:
+ # don't know how to document this member
+ continue
+ # prefer the documenter with the highest priority
+ classes.sort(key=lambda cls: cls.priority)
+ # give explicitly separated module name, so that members
+ # of inner classes can be documented
+ full_mname = f'{self.modname}::' + '.'.join((*self.objpath, mname))
+ documenter = classes[-1](self.directive, full_mname, self.indent)
+ memberdocumenters.append((documenter, isattr))
+
+ member_order = self.options.member_order or self.config.autodoc_member_order
+ memberdocumenters = self.sort_members(memberdocumenters, member_order)
+
+ for documenter, isattr in memberdocumenters:
+ documenter.generate(
+ all_members=True, real_modname=self.real_modname,
+ check_module=members_check_module and not isattr)
+
+ # reset current objects
+ self.env.temp_data['autodoc:module'] = None
+ self.env.temp_data['autodoc:class'] = None
+
+ def sort_members(self, documenters: list[tuple[Documenter, bool]],
+ order: str) -> list[tuple[Documenter, bool]]:
+ """Sort the given member list."""
+ if order == 'groupwise':
+ # sort by group; alphabetically within groups
+ documenters.sort(key=lambda e: (e[0].member_order, e[0].name))
+ elif order == 'bysource':
+ # By default, member discovery order matches source order,
+ # as dicts are insertion-ordered from Python 3.7.
+ if self.analyzer:
+ # sort by source order, by virtue of the module analyzer
+ tagorder = self.analyzer.tagorder
+
+ def keyfunc(entry: tuple[Documenter, bool]) -> int:
+ fullname = entry[0].name.split('::')[1]
+ return tagorder.get(fullname, len(tagorder))
+ documenters.sort(key=keyfunc)
+ else: # alphabetical
+ documenters.sort(key=lambda e: e[0].name)
+
+ return documenters
+
+ def generate(
+ self,
+ more_content: StringList | None = None,
+ real_modname: str | None = None,
+ check_module: bool = False,
+ all_members: bool = False,
+ ) -> None:
+ """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
+ True, only generate if the object is defined in the module name it is
+ imported from. If *all_members* is True, document all members.
+ """
+ if not self.parse_name():
+ # need a module to import
+ logger.warning(
+ __("don't know which module to import for autodocumenting "
+ '%r (try placing a "module" or "currentmodule" directive '
+ 'in the document, or giving an explicit module name)') %
+ self.name, type='autodoc')
+ return
+
+ # now, import the module and get object to document
+ if not self.import_object():
+ return
+
+ # If there is no real module defined, figure out which to use.
+ # The real module is used in the module analyzer to look up the module
+ # where the attribute documentation would actually be found in.
+ # This is used for situations where you have a module that collects the
+ # functions and classes of internal submodules.
+ guess_modname = self.get_real_modname()
+ self.real_modname: str = real_modname or guess_modname
+
+ # try to also get a source code analyzer for attribute docs
+ try:
+ self.analyzer = ModuleAnalyzer.for_module(self.real_modname)
+ # parse right now, to get PycodeErrors on parsing (results will
+ # be cached anyway)
+ self.analyzer.find_attr_docs()
+ except PycodeError as exc:
+ logger.debug('[autodoc] module analyzer failed: %s', exc)
+ # no source file -- e.g. for builtin and C modules
+ self.analyzer = None
+ # at least add the module.__file__ as a dependency
+ if module___file__ := getattr(self.module, '__file__', ''):
+ self.directive.record_dependencies.add(module___file__)
+ else:
+ self.directive.record_dependencies.add(self.analyzer.srcname)
+
+ if self.real_modname != guess_modname:
+ # Add module to dependency list if target object is defined in other module.
+ try:
+ analyzer = ModuleAnalyzer.for_module(guess_modname)
+ self.directive.record_dependencies.add(analyzer.srcname)
+ except PycodeError:
+ pass
+
+ docstrings: list[str] = sum(self.get_doc() or [], [])
+ if ismock(self.object) and not docstrings:
+ logger.warning(__('A mocked object is detected: %r'),
+ self.name, type='autodoc')
+
+ # check __module__ of object (for members not given explicitly)
+ if check_module:
+ if not self.check_module():
+ return
+
+ sourcename = self.get_sourcename()
+
+ # make sure that the result starts with an empty line. This is
+ # necessary for some situations where another directive preprocesses
+ # reST and no starting newline is present
+ self.add_line('', sourcename)
+
+ # format the object's signature, if any
+ try:
+ sig = self.format_signature()
+ except Exception as exc:
+ logger.warning(__('error while formatting signature for %s: %s'),
+ self.fullname, exc, type='autodoc')
+ return
+
+ # generate the directive header and options, if applicable
+ self.add_directive_header(sig)
+ self.add_line('', sourcename)
+
+ # e.g. the module directive doesn't have content
+ self.indent += self.content_indent
+
+ # add all content (from docstrings, attribute docs etc.)
+ self.add_content(more_content)
+
+ # document members, if possible
+ self.document_members(all_members)
+
+
+class ModuleDocumenter(Documenter):
+ """
+ Specialized Documenter subclass for modules.
+ """
+ objtype = 'module'
+ content_indent = ''
+ _extra_indent = ' '
+
+ option_spec: OptionSpec = {
+ 'members': members_option, 'undoc-members': bool_option,
+ 'no-index': bool_option, 'inherited-members': inherited_members_option,
+ 'show-inheritance': bool_option, 'synopsis': identity,
+ 'platform': identity, 'deprecated': bool_option,
+ 'member-order': member_order_option, 'exclude-members': exclude_members_option,
+ 'private-members': members_option, 'special-members': members_option,
+ 'imported-members': bool_option, 'ignore-module-all': bool_option,
+ 'no-value': bool_option,
+ 'noindex': bool_option,
+ }
+
+ def __init__(self, *args: Any) -> None:
+ super().__init__(*args)
+ merge_members_option(self.options)
+ self.__all__: Sequence[str] | None = None
+
+ def add_content(self, more_content: StringList | None) -> None:
+ old_indent = self.indent
+ self.indent += self._extra_indent
+ super().add_content(None)
+ self.indent = old_indent
+ if more_content:
+ for line, src in zip(more_content.data, more_content.items):
+ self.add_line(line, src[0], src[1])
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ # don't document submodules automatically
+ return False
+
+ def resolve_name(self, modname: str | None, parents: Any, path: str, base: str,
+ ) -> tuple[str | None, list[str]]:
+ if modname is not None:
+ logger.warning(__('"::" in automodule name doesn\'t make sense'),
+ type='autodoc')
+ return (path or '') + base, []
+
+ def parse_name(self) -> bool:
+ ret = super().parse_name()
+ if self.args or self.retann:
+ logger.warning(__('signature arguments or return annotation '
+ 'given for automodule %s') % self.fullname,
+ type='autodoc')
+ return ret
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ ret = super().import_object(raiseerror)
+
+ try:
+ if not self.options.ignore_module_all:
+ self.__all__ = inspect.getall(self.object)
+ except ValueError as exc:
+ # invalid __all__ found.
+ logger.warning(__('__all__ should be a list of strings, not %r '
+ '(in module %s) -- ignoring __all__') %
+ (exc.args[0], self.fullname), type='autodoc')
+
+ return ret
+
+ def add_directive_header(self, sig: str) -> None:
+ Documenter.add_directive_header(self, sig)
+
+ sourcename = self.get_sourcename()
+
+ # add some module-specific options
+ if self.options.synopsis:
+ self.add_line(' :synopsis: ' + self.options.synopsis, sourcename)
+ if self.options.platform:
+ self.add_line(' :platform: ' + self.options.platform, sourcename)
+ if self.options.deprecated:
+ self.add_line(' :deprecated:', sourcename)
+
+ def get_module_members(self) -> dict[str, ObjectMember]:
+ """Get members of target module."""
+ if self.analyzer:
+ attr_docs = self.analyzer.attr_docs
+ else:
+ attr_docs = {}
+
+ members: dict[str, ObjectMember] = {}
+ for name in dir(self.object):
+ try:
+ value = safe_getattr(self.object, name, None)
+ if ismock(value):
+ value = undecorate(value)
+ docstring = attr_docs.get(('', name), [])
+ members[name] = ObjectMember(name, value, docstring="\n".join(docstring))
+ except AttributeError:
+ continue
+
+ # annotation only member (ex. attr: int)
+ for name in inspect.getannotations(self.object):
+ if name not in members:
+ docstring = attr_docs.get(('', name), [])
+ members[name] = ObjectMember(name, INSTANCEATTR,
+ docstring="\n".join(docstring))
+
+ return members
+
+ def get_object_members(self, want_all: bool) -> tuple[bool, list[ObjectMember]]:
+ members = self.get_module_members()
+ if want_all:
+ if self.__all__ is None:
+ # for implicit module members, check __module__ to avoid
+ # documenting imported objects
+ return True, list(members.values())
+ else:
+ for member in members.values():
+ if member.__name__ not in self.__all__:
+ member.skipped = True
+
+ return False, list(members.values())
+ else:
+ memberlist = self.options.members or []
+ ret = []
+ for name in memberlist:
+ if name in members:
+ ret.append(members[name])
+ else:
+ logger.warning(__('missing attribute mentioned in :members: option: '
+ 'module %s, attribute %s') %
+ (safe_getattr(self.object, '__name__', '???'), name),
+ type='autodoc')
+ return False, ret
+
+ def sort_members(self, documenters: list[tuple[Documenter, bool]],
+ order: str) -> list[tuple[Documenter, bool]]:
+ if order == 'bysource' and self.__all__:
+ assert self.__all__ is not None
+ module_all = self.__all__
+ module_all_set = set(module_all)
+ module_all_len = len(module_all)
+
+ # Sort alphabetically first (for members not listed on the __all__)
+ documenters.sort(key=lambda e: e[0].name)
+
+ # Sort by __all__
+ def keyfunc(entry: tuple[Documenter, bool]) -> int:
+ name = entry[0].name.split('::')[1]
+ if name in module_all_set:
+ return module_all.index(name)
+ else:
+ return module_all_len
+ documenters.sort(key=keyfunc)
+
+ return documenters
+ else:
+ return super().sort_members(documenters, order)
+
+
+class ModuleLevelDocumenter(Documenter):
+ """
+ Specialized Documenter subclass for objects on module level (functions,
+ classes, data/constants).
+ """
+ def resolve_name(self, modname: str | None, parents: Any, path: str, base: str,
+ ) -> tuple[str | None, list[str]]:
+ if modname is not None:
+ return modname, parents + [base]
+ if path:
+ modname = path.rstrip('.')
+ return modname, parents + [base]
+
+ # if documenting a toplevel object without explicit module,
+ # it can be contained in another auto directive ...
+ modname = self.env.temp_data.get('autodoc:module')
+ # ... or in the scope of a module directive
+ if not modname:
+ modname = self.env.ref_context.get('py:module')
+ # ... else, it stays None, which means invalid
+ return modname, parents + [base]
+
+
+class ClassLevelDocumenter(Documenter):
+ """
+ Specialized Documenter subclass for objects on class level (methods,
+ attributes).
+ """
+ def resolve_name(self, modname: str | None, parents: Any, path: str, base: str,
+ ) -> tuple[str | None, list[str]]:
+ if modname is not None:
+ return modname, parents + [base]
+
+ if path:
+ mod_cls = path.rstrip('.')
+ else:
+ # if documenting a class-level object without path,
+ # there must be a current class, either from a parent
+ # auto directive ...
+ mod_cls_ = self.env.temp_data.get('autodoc:class')
+ # ... or from a class directive
+ if mod_cls_ is None:
+ mod_cls_ = self.env.ref_context.get('py:class')
+ # ... if still None, there's no way to know
+ if mod_cls_ is None:
+ return None, []
+ mod_cls = mod_cls_
+ modname, sep, cls = mod_cls.rpartition('.')
+ parents = [cls]
+ # if the module name is still missing, get it like above
+ if not modname:
+ modname = self.env.temp_data.get('autodoc:module')
+ if not modname:
+ modname = self.env.ref_context.get('py:module')
+ # ... else, it stays None, which means invalid
+ return modname, parents + [base]
+
+
+class DocstringSignatureMixin:
+ """
+ Mixin for FunctionDocumenter and MethodDocumenter to provide the
+ feature of reading the signature from the docstring.
+ """
+ _new_docstrings: list[list[str]] | None = None
+ _signatures: list[str] = []
+
+ def _find_signature(self) -> tuple[str | None, str | None] | None:
+ # candidates of the object name
+ valid_names = [self.objpath[-1]] # type: ignore[attr-defined]
+ if isinstance(self, ClassDocumenter):
+ valid_names.append('__init__')
+ if hasattr(self.object, '__mro__'):
+ valid_names.extend(cls.__name__ for cls in self.object.__mro__)
+
+ docstrings = self.get_doc()
+ if docstrings is None:
+ return None, None
+ self._new_docstrings = docstrings[:]
+ self._signatures = []
+ result = None
+ for i, doclines in enumerate(docstrings):
+ for j, line in enumerate(doclines):
+ if not line:
+ # no lines in docstring, no match
+ break
+
+ if line.endswith('\\'):
+ line = line.rstrip('\\').rstrip()
+
+ # match first line of docstring against signature RE
+ match = py_ext_sig_re.match(line)
+ if not match:
+ break
+ exmod, path, base, tp_list, args, retann = match.groups()
+
+ # the base name must match ours
+ if base not in valid_names:
+ break
+
+ # re-prepare docstring to ignore more leading indentation
+ directive = self.directive # type: ignore[attr-defined]
+ tab_width = directive.state.document.settings.tab_width
+ self._new_docstrings[i] = prepare_docstring('\n'.join(doclines[j + 1:]),
+ tab_width)
+
+ if result is None:
+ # first signature
+ result = args, retann
+ else:
+ # subsequent signatures
+ self._signatures.append(f"({args}) -> {retann}")
+
+ if result is not None:
+ # finish the loop when signature found
+ break
+
+ return result
+
+ def get_doc(self) -> list[list[str]] | None:
+ if self._new_docstrings is not None:
+ return self._new_docstrings
+ return super().get_doc() # type: ignore[misc]
+
+ def format_signature(self, **kwargs: Any) -> str:
+ self.args: str | None
+ if (self.args is None
+ and self.config.autodoc_docstring_signature): # type: ignore[attr-defined]
+ # 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
+ sig = super().format_signature(**kwargs) # type: ignore[misc]
+ if self._signatures:
+ return "\n".join([sig] + self._signatures)
+ else:
+ return sig
+
+
+class DocstringStripSignatureMixin(DocstringSignatureMixin):
+ """
+ Mixin for AttributeDocumenter to provide the
+ feature of stripping any function signature from the docstring.
+ """
+ def format_signature(self, **kwargs: Any) -> str:
+ if (
+ self.args is None
+ and self.config.autodoc_docstring_signature # type: ignore[attr-defined]
+ ):
+ # 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:
+ # Discarding _args is a only difference with
+ # DocstringSignatureMixin.format_signature.
+ # Documenter.format_signature use self.args value to format.
+ _args, self.retann = result
+ return super().format_signature(**kwargs)
+
+
+class FunctionDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type: ignore[misc]
+ """
+ Specialized Documenter subclass for functions.
+ """
+ objtype = 'function'
+ member_order = 30
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ # supports functions, builtins and bound methods exported at the module level
+ return (inspect.isfunction(member) or inspect.isbuiltin(member) or
+ (inspect.isroutine(member) and isinstance(parent, ModuleDocumenter)))
+
+ def format_args(self, **kwargs: Any) -> str:
+ if self.config.autodoc_typehints in ('none', 'description'):
+ kwargs.setdefault('show_annotation', False)
+ if self.config.autodoc_typehints_format == "short":
+ kwargs.setdefault('unqualified_typehints', True)
+
+ try:
+ self.env.app.emit('autodoc-before-process-signature', self.object, False)
+ sig = inspect.signature(self.object, type_aliases=self.config.autodoc_type_aliases)
+ args = stringify_signature(sig, **kwargs)
+ except TypeError as exc:
+ logger.warning(__("Failed to get a function signature for %s: %s"),
+ self.fullname, exc)
+ return ''
+ except ValueError:
+ args = ''
+
+ if self.config.strip_signature_backslash:
+ # escape backslashes for reST
+ args = args.replace('\\', '\\\\')
+ return args
+
+ def document_members(self, all_members: bool = False) -> None:
+ pass
+
+ def add_directive_header(self, sig: str) -> None:
+ sourcename = self.get_sourcename()
+ super().add_directive_header(sig)
+
+ if inspect.iscoroutinefunction(self.object) or inspect.isasyncgenfunction(self.object):
+ self.add_line(' :async:', sourcename)
+
+ def format_signature(self, **kwargs: Any) -> str:
+ if self.config.autodoc_typehints_format == "short":
+ kwargs.setdefault('unqualified_typehints', True)
+
+ sigs = []
+ if (self.analyzer and
+ '.'.join(self.objpath) in self.analyzer.overloads and
+ self.config.autodoc_typehints != 'none'):
+ # Use signatures for overloaded functions instead of the implementation function.
+ overloaded = True
+ else:
+ overloaded = False
+ sig = super().format_signature(**kwargs)
+ sigs.append(sig)
+
+ if inspect.is_singledispatch_function(self.object):
+ # append signature of singledispatch'ed functions
+ for typ, func in self.object.registry.items():
+ if typ is object:
+ pass # default implementation. skipped.
+ else:
+ dispatchfunc = self.annotate_to_first_argument(func, typ)
+ if dispatchfunc:
+ documenter = FunctionDocumenter(self.directive, '')
+ documenter.object = dispatchfunc
+ documenter.objpath = ['']
+ sigs.append(documenter.format_signature())
+ if overloaded and self.analyzer is not None:
+ actual = inspect.signature(self.object,
+ type_aliases=self.config.autodoc_type_aliases)
+ __globals__ = safe_getattr(self.object, '__globals__', {})
+ for overload in self.analyzer.overloads['.'.join(self.objpath)]:
+ overload = self.merge_default_value(actual, overload)
+ overload = evaluate_signature(overload, __globals__,
+ self.config.autodoc_type_aliases)
+
+ sig = stringify_signature(overload, **kwargs)
+ sigs.append(sig)
+
+ return "\n".join(sigs)
+
+ def merge_default_value(self, actual: Signature, overload: Signature) -> Signature:
+ """Merge default values of actual implementation to the overload variants."""
+ parameters = list(overload.parameters.values())
+ for i, param in enumerate(parameters):
+ actual_param = actual.parameters.get(param.name)
+ if actual_param and param.default == '...':
+ parameters[i] = param.replace(default=actual_param.default)
+
+ return overload.replace(parameters=parameters)
+
+ def annotate_to_first_argument(self, func: Callable, typ: type) -> Callable | None:
+ """Annotate type hint to the first argument of function if needed."""
+ try:
+ sig = inspect.signature(func, type_aliases=self.config.autodoc_type_aliases)
+ except TypeError as exc:
+ logger.warning(__("Failed to get a function signature for %s: %s"),
+ self.fullname, exc)
+ return None
+ except ValueError:
+ return None
+
+ if len(sig.parameters) == 0:
+ return None
+
+ def dummy():
+ pass
+
+ params = list(sig.parameters.values())
+ if params[0].annotation is Parameter.empty:
+ params[0] = params[0].replace(annotation=typ)
+ try:
+ dummy.__signature__ = sig.replace( # type: ignore[attr-defined]
+ parameters=params)
+ return dummy
+ except (AttributeError, TypeError):
+ # failed to update signature (ex. built-in or extension types)
+ return None
+
+ return func
+
+
+class DecoratorDocumenter(FunctionDocumenter):
+ """
+ Specialized Documenter subclass for decorator functions.
+ """
+ objtype = 'decorator'
+
+ # must be lower than FunctionDocumenter
+ priority = -1
+
+ def format_args(self, **kwargs: Any) -> str:
+ args = super().format_args(**kwargs)
+ if ',' in args:
+ return args
+ else:
+ return ''
+
+
+# Types which have confusing metaclass signatures it would be best not to show.
+# These are listed by name, rather than storing the objects themselves, to avoid
+# needing to import the modules.
+_METACLASS_CALL_BLACKLIST = [
+ 'enum.EnumMeta.__call__',
+]
+
+
+# Types whose __new__ signature is a pass-through.
+_CLASS_NEW_BLACKLIST = [
+ 'typing.Generic.__new__',
+]
+
+
+class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type: ignore[misc]
+ """
+ Specialized Documenter subclass for classes.
+ """
+ objtype = 'class'
+ member_order = 20
+ option_spec: OptionSpec = {
+ 'members': members_option, 'undoc-members': bool_option,
+ 'no-index': bool_option, 'inherited-members': inherited_members_option,
+ 'show-inheritance': bool_option, 'member-order': member_order_option,
+ 'exclude-members': exclude_members_option,
+ 'private-members': members_option, 'special-members': members_option,
+ 'class-doc-from': class_doc_from_option,
+ 'noindex': bool_option,
+ }
+
+ # Must be higher than FunctionDocumenter, ClassDocumenter, and
+ # AttributeDocumenter as NewType can be an attribute and is a class
+ # after Python 3.10. Before 3.10 it is a kind of function object
+ priority = 15
+
+ _signature_class: Any = None
+ _signature_method_name: str = ''
+
+ def __init__(self, *args: Any) -> None:
+ super().__init__(*args)
+
+ if self.config.autodoc_class_signature == 'separated':
+ self.options = self.options.copy()
+
+ # show __init__() method
+ if self.options.special_members is None:
+ self.options['special-members'] = ['__new__', '__init__']
+ else:
+ self.options.special_members.append('__new__')
+ self.options.special_members.append('__init__')
+
+ merge_members_option(self.options)
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ return isinstance(member, type) or (
+ isattr and (inspect.isNewType(member) or isinstance(member, TypeVar)))
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ ret = super().import_object(raiseerror)
+ # if the class is documented under another name, document it
+ # as data/attribute
+ if ret:
+ if hasattr(self.object, '__name__'):
+ self.doc_as_attr = (self.objpath[-1] != self.object.__name__)
+ else:
+ self.doc_as_attr = True
+ if inspect.isNewType(self.object) or isinstance(self.object, TypeVar):
+ modname = getattr(self.object, '__module__', self.modname)
+ if modname != self.modname and self.modname.startswith(modname):
+ bases = self.modname[len(modname):].strip('.').split('.')
+ self.objpath = bases + self.objpath
+ self.modname = modname
+ return ret
+
+ def _get_signature(self) -> tuple[Any | None, str | None, Signature | None]:
+ if inspect.isNewType(self.object) or isinstance(self.object, TypeVar):
+ # Suppress signature
+ return None, None, None
+
+ def get_user_defined_function_or_method(obj: Any, attr: str) -> Any:
+ """ Get the `attr` function or method from `obj`, if it is user-defined. """
+ if inspect.is_builtin_class_method(obj, attr):
+ return None
+ attr = self.get_attr(obj, attr, None)
+ if not (inspect.ismethod(attr) or inspect.isfunction(attr)):
+ return None
+ return attr
+
+ # This sequence is copied from inspect._signature_from_callable.
+ # ValueError means that no signature could be found, so we keep going.
+
+ # First, we check the obj has a __signature__ attribute
+ if (hasattr(self.object, '__signature__') and
+ isinstance(self.object.__signature__, Signature)):
+ return None, None, self.object.__signature__
+
+ # Next, let's see if it has an overloaded __call__ defined
+ # in its metaclass
+ call = get_user_defined_function_or_method(type(self.object), '__call__')
+
+ if call is not None:
+ if f"{call.__module__}.{call.__qualname__}" in _METACLASS_CALL_BLACKLIST:
+ call = None
+
+ if call is not None:
+ self.env.app.emit('autodoc-before-process-signature', call, True)
+ try:
+ sig = inspect.signature(call, bound_method=True,
+ type_aliases=self.config.autodoc_type_aliases)
+ return type(self.object), '__call__', sig
+ except ValueError:
+ pass
+
+ # Now we check if the 'obj' class has a '__new__' method
+ new = get_user_defined_function_or_method(self.object, '__new__')
+
+ if new is not None:
+ if f"{new.__module__}.{new.__qualname__}" in _CLASS_NEW_BLACKLIST:
+ new = None
+
+ if new is not None:
+ self.env.app.emit('autodoc-before-process-signature', new, True)
+ try:
+ sig = inspect.signature(new, bound_method=True,
+ type_aliases=self.config.autodoc_type_aliases)
+ return self.object, '__new__', sig
+ except ValueError:
+ pass
+
+ # Finally, we should have at least __init__ implemented
+ init = get_user_defined_function_or_method(self.object, '__init__')
+ if init is not None:
+ self.env.app.emit('autodoc-before-process-signature', init, True)
+ try:
+ sig = inspect.signature(init, bound_method=True,
+ type_aliases=self.config.autodoc_type_aliases)
+ return self.object, '__init__', sig
+ except ValueError:
+ pass
+
+ # None of the attributes are user-defined, so fall back to let inspect
+ # handle it.
+ # We don't know the exact method that inspect.signature will read
+ # the signature from, so just pass the object itself to our hook.
+ self.env.app.emit('autodoc-before-process-signature', self.object, False)
+ try:
+ sig = inspect.signature(self.object, bound_method=False,
+ type_aliases=self.config.autodoc_type_aliases)
+ return None, None, sig
+ except ValueError:
+ pass
+
+ # Still no signature: happens e.g. for old-style classes
+ # with __init__ in C and no `__text_signature__`.
+ return None, None, None
+
+ def format_args(self, **kwargs: Any) -> str:
+ if self.config.autodoc_typehints in ('none', 'description'):
+ kwargs.setdefault('show_annotation', False)
+ if self.config.autodoc_typehints_format == "short":
+ kwargs.setdefault('unqualified_typehints', True)
+
+ try:
+ self._signature_class, _signature_method_name, sig = self._get_signature()
+ except TypeError as exc:
+ # __signature__ attribute contained junk
+ logger.warning(__("Failed to get a constructor signature for %s: %s"),
+ self.fullname, exc)
+ return ''
+ self._signature_method_name = _signature_method_name or ''
+
+ if sig is None:
+ return ''
+
+ return stringify_signature(sig, show_return_annotation=False, **kwargs)
+
+ def _find_signature(self) -> tuple[str | None, str | None] | None:
+ result = super()._find_signature()
+ if result is not None:
+ # Strip a return value from signature of constructor in docstring (first entry)
+ result = (result[0], None)
+
+ for i, sig in enumerate(self._signatures):
+ if sig.endswith(' -> None'):
+ # Strip a return value from signatures of constructor in docstring (subsequent
+ # entries)
+ self._signatures[i] = sig[:-8]
+
+ return result
+
+ def format_signature(self, **kwargs: Any) -> str:
+ if self.doc_as_attr:
+ return ''
+ if self.config.autodoc_class_signature == 'separated':
+ # do not show signatures
+ return ''
+
+ if self.config.autodoc_typehints_format == "short":
+ kwargs.setdefault('unqualified_typehints', True)
+
+ sig = super().format_signature()
+ sigs = []
+
+ overloads = self.get_overloaded_signatures()
+ if overloads and self.config.autodoc_typehints != 'none':
+ # Use signatures for overloaded methods instead of the implementation method.
+ method = safe_getattr(self._signature_class, self._signature_method_name, None)
+ __globals__ = safe_getattr(method, '__globals__', {})
+ for overload in overloads:
+ overload = evaluate_signature(overload, __globals__,
+ self.config.autodoc_type_aliases)
+
+ parameters = list(overload.parameters.values())
+ overload = overload.replace(parameters=parameters[1:],
+ return_annotation=Parameter.empty)
+ sig = stringify_signature(overload, **kwargs)
+ sigs.append(sig)
+ else:
+ sigs.append(sig)
+
+ return "\n".join(sigs)
+
+ def get_overloaded_signatures(self) -> list[Signature]:
+ if self._signature_class and self._signature_method_name:
+ for cls in self._signature_class.__mro__:
+ try:
+ analyzer = ModuleAnalyzer.for_module(cls.__module__)
+ analyzer.analyze()
+ qualname = '.'.join([cls.__qualname__, self._signature_method_name])
+ if qualname in analyzer.overloads:
+ return analyzer.overloads.get(qualname, [])
+ elif qualname in analyzer.tagorder:
+ # the constructor is defined in the class, but not overridden.
+ return []
+ except PycodeError:
+ pass
+
+ return []
+
+ def get_canonical_fullname(self) -> str | None:
+ __modname__ = safe_getattr(self.object, '__module__', self.modname)
+ __qualname__ = safe_getattr(self.object, '__qualname__', None)
+ if __qualname__ is None:
+ __qualname__ = safe_getattr(self.object, '__name__', None)
+ if __qualname__ and '<locals>' in __qualname__:
+ # No valid qualname found if the object is defined as locals
+ __qualname__ = None
+
+ if __modname__ and __qualname__:
+ return '.'.join([__modname__, __qualname__])
+ else:
+ return None
+
+ def add_directive_header(self, sig: str) -> None:
+ sourcename = self.get_sourcename()
+
+ if self.doc_as_attr:
+ self.directivetype = 'attribute'
+ super().add_directive_header(sig)
+
+ if inspect.isNewType(self.object) or isinstance(self.object, TypeVar):
+ return
+
+ if self.analyzer and '.'.join(self.objpath) in self.analyzer.finals:
+ self.add_line(' :final:', sourcename)
+
+ canonical_fullname = self.get_canonical_fullname()
+ if (not self.doc_as_attr and not inspect.isNewType(self.object)
+ and canonical_fullname and self.fullname != canonical_fullname):
+ self.add_line(' :canonical: %s' % canonical_fullname, sourcename)
+
+ # add inheritance info, if wanted
+ if not self.doc_as_attr and self.options.show_inheritance:
+ if inspect.getorigbases(self.object):
+ # A subclass of generic types
+ # refs: PEP-560 <https://peps.python.org/pep-0560/>
+ bases = list(self.object.__orig_bases__)
+ elif hasattr(self.object, '__bases__') and len(self.object.__bases__):
+ # A normal class
+ bases = list(self.object.__bases__)
+ else:
+ bases = []
+
+ self.env.events.emit('autodoc-process-bases',
+ self.fullname, self.object, self.options, bases)
+
+ if self.config.autodoc_typehints_format == "short":
+ base_classes = [restify(cls, "smart") for cls in bases]
+ else:
+ base_classes = [restify(cls) for cls in bases]
+
+ sourcename = self.get_sourcename()
+ self.add_line('', sourcename)
+ self.add_line(' ' + _('Bases: %s') % ', '.join(base_classes), sourcename)
+
+ def get_object_members(self, want_all: bool) -> tuple[bool, list[ObjectMember]]:
+ members = get_class_members(self.object, self.objpath, self.get_attr,
+ self.config.autodoc_inherit_docstrings)
+ if not want_all:
+ if not self.options.members:
+ return False, []
+ # specific members given
+ selected = []
+ for name in self.options.members:
+ if name in members:
+ selected.append(members[name])
+ else:
+ logger.warning(__('missing attribute %s in object %s') %
+ (name, self.fullname), type='autodoc')
+ return False, selected
+ elif self.options.inherited_members:
+ return False, list(members.values())
+ else:
+ return False, [m for m in members.values() if m.class_ == self.object]
+
+ def get_doc(self) -> list[list[str]] | None:
+ if isinstance(self.object, TypeVar):
+ if self.object.__doc__ == TypeVar.__doc__:
+ return []
+ if sys.version_info[:2] < (3, 10):
+ if inspect.isNewType(self.object) or isinstance(self.object, TypeVar):
+ parts = self.modname.strip('.').split('.')
+ orig_objpath = self.objpath
+ for i in range(len(parts)):
+ new_modname = '.'.join(parts[:len(parts) - i])
+ new_objpath = parts[len(parts) - i:] + orig_objpath
+ try:
+ analyzer = ModuleAnalyzer.for_module(new_modname)
+ analyzer.analyze()
+ key = ('', new_objpath[-1])
+ comment = list(analyzer.attr_docs.get(key, []))
+ if comment:
+ self.objpath = new_objpath
+ self.modname = new_modname
+ return [comment]
+ except PycodeError:
+ pass
+ if self.doc_as_attr:
+ # Don't show the docstring of the class when it is an alias.
+ if self.get_variable_comment():
+ return []
+ else:
+ return None
+
+ lines = getattr(self, '_new_docstrings', None)
+ if lines is not None:
+ return lines
+
+ classdoc_from = self.options.get('class-doc-from', self.config.autoclass_content)
+
+ docstrings = []
+ attrdocstring = getdoc(self.object, self.get_attr)
+ if attrdocstring:
+ docstrings.append(attrdocstring)
+
+ # for classes, what the "docstring" is can be controlled via a
+ # config value; the default is only the class docstring
+ if classdoc_from in ('both', 'init'):
+ __init__ = self.get_attr(self.object, '__init__', None)
+ initdocstring = getdoc(__init__, self.get_attr,
+ self.config.autodoc_inherit_docstrings,
+ self.object, '__init__')
+ # for new-style classes, no __init__ means default __init__
+ if (initdocstring is not None and
+ (initdocstring == object.__init__.__doc__ or # for pypy
+ initdocstring.strip() == object.__init__.__doc__)): # for !pypy
+ initdocstring = None
+ if not initdocstring:
+ # try __new__
+ __new__ = self.get_attr(self.object, '__new__', None)
+ initdocstring = getdoc(__new__, self.get_attr,
+ self.config.autodoc_inherit_docstrings,
+ self.object, '__new__')
+ # for new-style classes, no __new__ means default __new__
+ if (initdocstring is not None and
+ (initdocstring == object.__new__.__doc__ or # for pypy
+ initdocstring.strip() == object.__new__.__doc__)): # for !pypy
+ initdocstring = None
+ if initdocstring:
+ if classdoc_from == 'init':
+ docstrings = [initdocstring]
+ else:
+ docstrings.append(initdocstring)
+
+ tab_width = self.directive.state.document.settings.tab_width
+ return [prepare_docstring(docstring, tab_width) for docstring in docstrings]
+
+ def get_variable_comment(self) -> list[str] | None:
+ try:
+ key = ('', '.'.join(self.objpath))
+ if self.doc_as_attr:
+ analyzer = ModuleAnalyzer.for_module(self.modname)
+ else:
+ analyzer = ModuleAnalyzer.for_module(self.get_real_modname())
+ analyzer.analyze()
+ return list(analyzer.attr_docs.get(key, []))
+ except PycodeError:
+ return None
+
+ def add_content(self, more_content: StringList | None) -> None:
+ if inspect.isNewType(self.object):
+ if self.config.autodoc_typehints_format == "short":
+ supertype = restify(self.object.__supertype__, "smart")
+ else:
+ supertype = restify(self.object.__supertype__)
+
+ more_content = StringList([_('alias of %s') % supertype, ''], source='')
+ if isinstance(self.object, TypeVar):
+ attrs = [repr(self.object.__name__)]
+ for constraint in self.object.__constraints__:
+ if self.config.autodoc_typehints_format == "short":
+ attrs.append(stringify_annotation(constraint, "smart"))
+ else:
+ attrs.append(stringify_annotation(constraint))
+ if self.object.__bound__:
+ if self.config.autodoc_typehints_format == "short":
+ bound = restify(self.object.__bound__, "smart")
+ else:
+ bound = restify(self.object.__bound__)
+ attrs.append(r"bound=\ " + bound)
+ if self.object.__covariant__:
+ attrs.append("covariant=True")
+ if self.object.__contravariant__:
+ attrs.append("contravariant=True")
+
+ more_content = StringList(
+ [_('alias of TypeVar(%s)') % ", ".join(attrs), ''],
+ source='',
+ )
+ if self.doc_as_attr and self.modname != self.get_real_modname():
+ try:
+ # override analyzer to obtain doccomment around its definition.
+ self.analyzer = ModuleAnalyzer.for_module(self.modname)
+ self.analyzer.analyze()
+ except PycodeError:
+ pass
+
+ if self.doc_as_attr and not self.get_variable_comment():
+ try:
+ if self.config.autodoc_typehints_format == "short":
+ alias = restify(self.object, "smart")
+ else:
+ alias = restify(self.object)
+ more_content = StringList([_('alias of %s') % alias], source='')
+ except AttributeError:
+ pass # Invalid class object is passed.
+
+ super().add_content(more_content)
+
+ def document_members(self, all_members: bool = False) -> None:
+ if self.doc_as_attr:
+ return
+ super().document_members(all_members)
+
+ def generate(
+ self,
+ more_content: StringList | None = None,
+ real_modname: str | None = None,
+ check_module: bool = False,
+ all_members: bool = False,
+ ) -> None:
+ # Do not pass real_modname and use the name from the __module__
+ # attribute of the class.
+ # If a class gets imported into the module real_modname
+ # the analyzer won't find the source of the class, if
+ # it looks in real_modname.
+ return super().generate(more_content=more_content,
+ check_module=check_module,
+ all_members=all_members)
+
+
+class ExceptionDocumenter(ClassDocumenter):
+ """
+ Specialized ClassDocumenter subclass for exceptions.
+ """
+ objtype = 'exception'
+ member_order = 10
+
+ # needs a higher priority than ClassDocumenter
+ priority = ClassDocumenter.priority + 5
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ try:
+ return isinstance(member, type) and issubclass(member, BaseException)
+ except TypeError as exc:
+ # It's possible for a member to be considered a type, but fail
+ # issubclass checks due to not being a class. For example:
+ # https://github.com/sphinx-doc/sphinx/issues/11654#issuecomment-1696790436
+ msg = (
+ f'{cls.__name__} failed to discern if member {member} with'
+ f' membername {membername} is a BaseException subclass.'
+ )
+ raise ValueError(msg) from exc
+
+
+class DataDocumenterMixinBase:
+ # define types of instance variables
+ config: Config
+ env: BuildEnvironment
+ modname: str
+ parent: Any
+ object: Any
+ objpath: list[str]
+
+ def should_suppress_directive_header(self) -> bool:
+ """Check directive header should be suppressed."""
+ return False
+
+ def should_suppress_value_header(self) -> bool:
+ """Check :value: header should be suppressed."""
+ return False
+
+ def update_content(self, more_content: StringList) -> None:
+ """Update docstring, for example with TypeVar variance."""
+ pass
+
+
+class GenericAliasMixin(DataDocumenterMixinBase):
+ """
+ Mixin for DataDocumenter and AttributeDocumenter to provide the feature for
+ supporting GenericAliases.
+ """
+
+ def should_suppress_directive_header(self) -> bool:
+ return (inspect.isgenericalias(self.object) or
+ super().should_suppress_directive_header())
+
+ def update_content(self, more_content: StringList) -> None:
+ if inspect.isgenericalias(self.object):
+ if self.config.autodoc_typehints_format == "short":
+ alias = restify(self.object, "smart")
+ else:
+ alias = restify(self.object)
+
+ more_content.append(_('alias of %s') % alias, '')
+ more_content.append('', '')
+
+ super().update_content(more_content)
+
+
+class UninitializedGlobalVariableMixin(DataDocumenterMixinBase):
+ """
+ Mixin for DataDocumenter to provide the feature for supporting uninitialized
+ (type annotation only) global variables.
+ """
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ try:
+ return super().import_object(raiseerror=True) # type: ignore[misc]
+ except ImportError as exc:
+ # annotation only instance variable (PEP-526)
+ try:
+ with mock(self.config.autodoc_mock_imports):
+ parent = import_module(self.modname, self.config.autodoc_warningiserror)
+ annotations = get_type_hints(parent, None,
+ self.config.autodoc_type_aliases)
+ if self.objpath[-1] in annotations:
+ self.object = UNINITIALIZED_ATTR
+ self.parent = parent
+ return True
+ except ImportError:
+ pass
+
+ if raiseerror:
+ raise
+ logger.warning(exc.args[0], type='autodoc', subtype='import_object')
+ self.env.note_reread()
+ return False
+
+ def should_suppress_value_header(self) -> bool:
+ return (self.object is UNINITIALIZED_ATTR or
+ super().should_suppress_value_header())
+
+ def get_doc(self) -> list[list[str]] | None:
+ if self.object is UNINITIALIZED_ATTR:
+ return []
+ else:
+ return super().get_doc() # type: ignore[misc]
+
+
+class DataDocumenter(GenericAliasMixin,
+ UninitializedGlobalVariableMixin, ModuleLevelDocumenter):
+ """
+ Specialized Documenter subclass for data items.
+ """
+ objtype = 'data'
+ member_order = 40
+ priority = -10
+ option_spec: OptionSpec = dict(ModuleLevelDocumenter.option_spec)
+ option_spec["annotation"] = annotation_option
+ option_spec["no-value"] = bool_option
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ return isinstance(parent, ModuleDocumenter) and isattr
+
+ def update_annotations(self, parent: Any) -> None:
+ """Update __annotations__ to support type_comment and so on."""
+ annotations = dict(inspect.getannotations(parent))
+ parent.__annotations__ = annotations
+
+ try:
+ analyzer = ModuleAnalyzer.for_module(self.modname)
+ analyzer.analyze()
+ for (classname, attrname), annotation in analyzer.annotations.items():
+ if classname == '' and attrname not in annotations:
+ annotations[attrname] = annotation
+ except PycodeError:
+ pass
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ ret = super().import_object(raiseerror)
+ if self.parent:
+ self.update_annotations(self.parent)
+
+ return ret
+
+ def should_suppress_value_header(self) -> bool:
+ if super().should_suppress_value_header():
+ return True
+ else:
+ doc = self.get_doc() or []
+ docstring, metadata = separate_metadata('\n'.join(sum(doc, [])))
+ if 'hide-value' in metadata:
+ return True
+
+ return False
+
+ def add_directive_header(self, sig: str) -> None:
+ super().add_directive_header(sig)
+ sourcename = self.get_sourcename()
+ if self.options.annotation is SUPPRESS or self.should_suppress_directive_header():
+ pass
+ elif self.options.annotation:
+ self.add_line(' :annotation: %s' % self.options.annotation,
+ sourcename)
+ else:
+ if self.config.autodoc_typehints != 'none':
+ # obtain annotation for this data
+ annotations = get_type_hints(self.parent, None,
+ self.config.autodoc_type_aliases)
+ if self.objpath[-1] in annotations:
+ if self.config.autodoc_typehints_format == "short":
+ objrepr = stringify_annotation(annotations.get(self.objpath[-1]),
+ "smart")
+ else:
+ objrepr = stringify_annotation(annotations.get(self.objpath[-1]),
+ "fully-qualified-except-typing")
+ self.add_line(' :type: ' + objrepr, sourcename)
+
+ try:
+ if (self.options.no_value or self.should_suppress_value_header() or
+ ismock(self.object)):
+ pass
+ else:
+ objrepr = object_description(self.object)
+ self.add_line(' :value: ' + objrepr, sourcename)
+ except ValueError:
+ pass
+
+ def document_members(self, all_members: bool = False) -> None:
+ pass
+
+ def get_real_modname(self) -> str:
+ real_modname = self.get_attr(self.parent or self.object, '__module__', None)
+ return real_modname or self.modname
+
+ def get_module_comment(self, attrname: str) -> list[str] | None:
+ try:
+ analyzer = ModuleAnalyzer.for_module(self.modname)
+ analyzer.analyze()
+ key = ('', attrname)
+ if key in analyzer.attr_docs:
+ return list(analyzer.attr_docs[key])
+ except PycodeError:
+ pass
+
+ return None
+
+ def get_doc(self) -> list[list[str]] | None:
+ # Check the variable has a docstring-comment
+ comment = self.get_module_comment(self.objpath[-1])
+ if comment:
+ return [comment]
+ else:
+ return super().get_doc()
+
+ def add_content(self, more_content: StringList | None) -> None:
+ # Disable analyzing variable comment on Documenter.add_content() to control it on
+ # DataDocumenter.add_content()
+ self.analyzer = None
+
+ if not more_content:
+ more_content = StringList()
+
+ self.update_content(more_content)
+ super().add_content(more_content)
+
+
+class MethodDocumenter(DocstringSignatureMixin, ClassLevelDocumenter): # type: ignore[misc]
+ """
+ Specialized Documenter subclass for methods (normal, static and class).
+ """
+ objtype = 'method'
+ directivetype = 'method'
+ member_order = 50
+ priority = 1 # must be more than FunctionDocumenter
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ return inspect.isroutine(member) and not isinstance(parent, ModuleDocumenter)
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ ret = super().import_object(raiseerror)
+ if not ret:
+ return ret
+
+ # to distinguish classmethod/staticmethod
+ obj = self.parent.__dict__.get(self.object_name)
+ if obj is None:
+ obj = self.object
+
+ if (inspect.isclassmethod(obj) or
+ inspect.isstaticmethod(obj, cls=self.parent, name=self.object_name)):
+ # document class and static members before ordinary ones
+ self.member_order = self.member_order - 1
+
+ return ret
+
+ def format_args(self, **kwargs: Any) -> str:
+ if self.config.autodoc_typehints in ('none', 'description'):
+ kwargs.setdefault('show_annotation', False)
+ if self.config.autodoc_typehints_format == "short":
+ kwargs.setdefault('unqualified_typehints', True)
+
+ try:
+ if self.object == object.__init__ and self.parent != object:
+ # Classes not having own __init__() method are shown as no arguments.
+ #
+ # Note: The signature of object.__init__() is (self, /, *args, **kwargs).
+ # But it makes users confused.
+ args = '()'
+ else:
+ if inspect.isstaticmethod(self.object, cls=self.parent, name=self.object_name):
+ self.env.app.emit('autodoc-before-process-signature', self.object, False)
+ sig = inspect.signature(self.object, bound_method=False,
+ type_aliases=self.config.autodoc_type_aliases)
+ else:
+ self.env.app.emit('autodoc-before-process-signature', self.object, True)
+ sig = inspect.signature(self.object, bound_method=True,
+ type_aliases=self.config.autodoc_type_aliases)
+ args = stringify_signature(sig, **kwargs)
+ except TypeError as exc:
+ logger.warning(__("Failed to get a method signature for %s: %s"),
+ self.fullname, exc)
+ return ''
+ except ValueError:
+ args = ''
+
+ if self.config.strip_signature_backslash:
+ # escape backslashes for reST
+ args = args.replace('\\', '\\\\')
+ return args
+
+ def add_directive_header(self, sig: str) -> None:
+ super().add_directive_header(sig)
+
+ sourcename = self.get_sourcename()
+ obj = self.parent.__dict__.get(self.object_name, self.object)
+ if inspect.isabstractmethod(obj):
+ self.add_line(' :abstractmethod:', sourcename)
+ if inspect.iscoroutinefunction(obj) or inspect.isasyncgenfunction(obj):
+ self.add_line(' :async:', sourcename)
+ if inspect.isclassmethod(obj):
+ self.add_line(' :classmethod:', sourcename)
+ if inspect.isstaticmethod(obj, cls=self.parent, name=self.object_name):
+ self.add_line(' :staticmethod:', sourcename)
+ if self.analyzer and '.'.join(self.objpath) in self.analyzer.finals:
+ self.add_line(' :final:', sourcename)
+
+ def document_members(self, all_members: bool = False) -> None:
+ pass
+
+ def format_signature(self, **kwargs: Any) -> str:
+ if self.config.autodoc_typehints_format == "short":
+ kwargs.setdefault('unqualified_typehints', True)
+
+ sigs = []
+ if (self.analyzer and
+ '.'.join(self.objpath) in self.analyzer.overloads and
+ self.config.autodoc_typehints != 'none'):
+ # Use signatures for overloaded methods instead of the implementation method.
+ overloaded = True
+ else:
+ overloaded = False
+ sig = super().format_signature(**kwargs)
+ sigs.append(sig)
+
+ meth = self.parent.__dict__.get(self.objpath[-1])
+ if inspect.is_singledispatch_method(meth):
+ # append signature of singledispatch'ed functions
+ for typ, func in meth.dispatcher.registry.items():
+ if typ is object:
+ pass # default implementation. skipped.
+ else:
+ dispatchmeth = self.annotate_to_first_argument(func, typ)
+ if dispatchmeth:
+ documenter = MethodDocumenter(self.directive, '')
+ documenter.parent = self.parent
+ documenter.object = dispatchmeth
+ documenter.objpath = ['']
+ sigs.append(documenter.format_signature())
+ if overloaded and self.analyzer is not None:
+ if inspect.isstaticmethod(self.object, cls=self.parent, name=self.object_name):
+ actual = inspect.signature(self.object, bound_method=False,
+ type_aliases=self.config.autodoc_type_aliases)
+ else:
+ actual = inspect.signature(self.object, bound_method=True,
+ type_aliases=self.config.autodoc_type_aliases)
+
+ __globals__ = safe_getattr(self.object, '__globals__', {})
+ for overload in self.analyzer.overloads['.'.join(self.objpath)]:
+ overload = self.merge_default_value(actual, overload)
+ overload = evaluate_signature(overload, __globals__,
+ self.config.autodoc_type_aliases)
+
+ if not inspect.isstaticmethod(self.object, cls=self.parent,
+ name=self.object_name):
+ parameters = list(overload.parameters.values())
+ overload = overload.replace(parameters=parameters[1:])
+ sig = stringify_signature(overload, **kwargs)
+ sigs.append(sig)
+
+ return "\n".join(sigs)
+
+ def merge_default_value(self, actual: Signature, overload: Signature) -> Signature:
+ """Merge default values of actual implementation to the overload variants."""
+ parameters = list(overload.parameters.values())
+ for i, param in enumerate(parameters):
+ actual_param = actual.parameters.get(param.name)
+ if actual_param and param.default == '...':
+ parameters[i] = param.replace(default=actual_param.default)
+
+ return overload.replace(parameters=parameters)
+
+ def annotate_to_first_argument(self, func: Callable, typ: type) -> Callable | None:
+ """Annotate type hint to the first argument of function if needed."""
+ try:
+ sig = inspect.signature(func, type_aliases=self.config.autodoc_type_aliases)
+ except TypeError as exc:
+ logger.warning(__("Failed to get a method signature for %s: %s"),
+ self.fullname, exc)
+ return None
+ except ValueError:
+ return None
+
+ if len(sig.parameters) == 1:
+ return None
+
+ def dummy():
+ pass
+
+ params = list(sig.parameters.values())
+ if params[1].annotation is Parameter.empty:
+ params[1] = params[1].replace(annotation=typ)
+ try:
+ dummy.__signature__ = sig.replace( # type: ignore[attr-defined]
+ parameters=params)
+ return dummy
+ except (AttributeError, TypeError):
+ # failed to update signature (ex. built-in or extension types)
+ return None
+
+ return func
+
+ def get_doc(self) -> list[list[str]] | None:
+ if self._new_docstrings is not None:
+ # docstring already returned previously, then modified by
+ # `DocstringSignatureMixin`. Just return the previously-computed
+ # result, so that we don't lose the processing done by
+ # `DocstringSignatureMixin`.
+ return self._new_docstrings
+ if self.objpath[-1] == '__init__':
+ docstring = getdoc(self.object, self.get_attr,
+ self.config.autodoc_inherit_docstrings,
+ self.parent, self.object_name)
+ if (docstring is not None and
+ (docstring == object.__init__.__doc__ or # for pypy
+ docstring.strip() == object.__init__.__doc__)): # for !pypy
+ docstring = None
+ if docstring:
+ tab_width = self.directive.state.document.settings.tab_width
+ return [prepare_docstring(docstring, tabsize=tab_width)]
+ else:
+ return []
+ elif self.objpath[-1] == '__new__':
+ docstring = getdoc(self.object, self.get_attr,
+ self.config.autodoc_inherit_docstrings,
+ self.parent, self.object_name)
+ if (docstring is not None and
+ (docstring == object.__new__.__doc__ or # for pypy
+ docstring.strip() == object.__new__.__doc__)): # for !pypy
+ docstring = None
+ if docstring:
+ tab_width = self.directive.state.document.settings.tab_width
+ return [prepare_docstring(docstring, tabsize=tab_width)]
+ else:
+ return []
+ else:
+ return super().get_doc()
+
+
+class NonDataDescriptorMixin(DataDocumenterMixinBase):
+ """
+ Mixin for AttributeDocumenter to provide the feature for supporting non
+ data-descriptors.
+
+ .. note:: This mix-in must be inherited after other mix-ins. Otherwise, docstring
+ and :value: header will be suppressed unexpectedly.
+ """
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ ret = super().import_object(raiseerror) # type: ignore[misc]
+ if ret and not inspect.isattributedescriptor(self.object):
+ self.non_data_descriptor = True
+ else:
+ self.non_data_descriptor = False
+
+ return ret
+
+ def should_suppress_value_header(self) -> bool:
+ return (not getattr(self, 'non_data_descriptor', False) or
+ super().should_suppress_directive_header())
+
+ def get_doc(self) -> list[list[str]] | None:
+ if getattr(self, 'non_data_descriptor', False):
+ # the docstring of non datadescriptor is very probably the wrong thing
+ # to display
+ return None
+ else:
+ return super().get_doc() # type: ignore[misc]
+
+
+class SlotsMixin(DataDocumenterMixinBase):
+ """
+ Mixin for AttributeDocumenter to provide the feature for supporting __slots__.
+ """
+
+ def isslotsattribute(self) -> bool:
+ """Check the subject is an attribute in __slots__."""
+ try:
+ if parent___slots__ := inspect.getslots(self.parent):
+ return self.objpath[-1] in parent___slots__
+ else:
+ return False
+ except (ValueError, TypeError):
+ return False
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ ret = super().import_object(raiseerror) # type: ignore[misc]
+ if self.isslotsattribute():
+ self.object = SLOTSATTR
+
+ return ret
+
+ def should_suppress_value_header(self) -> bool:
+ if self.object is SLOTSATTR:
+ return True
+ else:
+ return super().should_suppress_value_header()
+
+ def get_doc(self) -> list[list[str]] | None:
+ if self.object is SLOTSATTR:
+ try:
+ parent___slots__ = inspect.getslots(self.parent)
+ if parent___slots__ and parent___slots__.get(self.objpath[-1]):
+ docstring = prepare_docstring(parent___slots__[self.objpath[-1]])
+ return [docstring]
+ else:
+ return []
+ except ValueError as exc:
+ logger.warning(__('Invalid __slots__ found on %s. Ignored.'),
+ (self.parent.__qualname__, exc), type='autodoc')
+ return []
+ else:
+ return super().get_doc() # type: ignore[misc]
+
+
+class RuntimeInstanceAttributeMixin(DataDocumenterMixinBase):
+ """
+ Mixin for AttributeDocumenter to provide the feature for supporting runtime
+ instance attributes (that are defined in __init__() methods with doc-comments).
+
+ Example:
+
+ class Foo:
+ def __init__(self):
+ self.attr = None #: This is a target of this mix-in.
+ """
+
+ RUNTIME_INSTANCE_ATTRIBUTE = object()
+
+ def is_runtime_instance_attribute(self, parent: Any) -> bool:
+ """Check the subject is an attribute defined in __init__()."""
+ # An instance variable defined in __init__().
+ if self.get_attribute_comment(parent, self.objpath[-1]): # type: ignore[attr-defined]
+ return True
+ if self.is_runtime_instance_attribute_not_commented(parent):
+ return True
+ return False
+
+ def is_runtime_instance_attribute_not_commented(self, parent: Any) -> bool:
+ """Check the subject is an attribute defined in __init__() without comment."""
+ for cls in inspect.getmro(parent):
+ try:
+ module = safe_getattr(cls, '__module__')
+ qualname = safe_getattr(cls, '__qualname__')
+
+ analyzer = ModuleAnalyzer.for_module(module)
+ analyzer.analyze()
+ if qualname and self.objpath:
+ key = '.'.join([qualname, self.objpath[-1]])
+ if key in analyzer.tagorder:
+ return True
+ except (AttributeError, PycodeError):
+ pass
+
+ return False
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ """Check the existence of runtime instance attribute after failing to import the
+ attribute."""
+ try:
+ return super().import_object(raiseerror=True) # type: ignore[misc]
+ except ImportError as exc:
+ try:
+ with mock(self.config.autodoc_mock_imports):
+ ret = import_object(self.modname, self.objpath[:-1], 'class',
+ attrgetter=self.get_attr, # type: ignore[attr-defined]
+ warningiserror=self.config.autodoc_warningiserror)
+ parent = ret[3]
+ if self.is_runtime_instance_attribute(parent):
+ self.object = self.RUNTIME_INSTANCE_ATTRIBUTE
+ self.parent = parent
+ return True
+ except ImportError:
+ pass
+
+ if raiseerror:
+ raise
+ logger.warning(exc.args[0], type='autodoc', subtype='import_object')
+ self.env.note_reread()
+ return False
+
+ def should_suppress_value_header(self) -> bool:
+ return (self.object is self.RUNTIME_INSTANCE_ATTRIBUTE or
+ super().should_suppress_value_header())
+
+ def get_doc(self) -> list[list[str]] | None:
+ if (self.object is self.RUNTIME_INSTANCE_ATTRIBUTE and
+ self.is_runtime_instance_attribute_not_commented(self.parent)):
+ return None
+ else:
+ return super().get_doc() # type: ignore[misc]
+
+
+class UninitializedInstanceAttributeMixin(DataDocumenterMixinBase):
+ """
+ Mixin for AttributeDocumenter to provide the feature for supporting uninitialized
+ instance attributes (PEP-526 styled, annotation only attributes).
+
+ Example:
+
+ class Foo:
+ attr: int #: This is a target of this mix-in.
+ """
+
+ def is_uninitialized_instance_attribute(self, parent: Any) -> bool:
+ """Check the subject is an annotation only attribute."""
+ annotations = get_type_hints(parent, None, self.config.autodoc_type_aliases)
+ return self.objpath[-1] in annotations
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ """Check the exisitence of uninitialized instance attribute when failed to import
+ the attribute."""
+ try:
+ return super().import_object(raiseerror=True) # type: ignore[misc]
+ except ImportError as exc:
+ try:
+ ret = import_object(self.modname, self.objpath[:-1], 'class',
+ attrgetter=self.get_attr, # type: ignore[attr-defined]
+ warningiserror=self.config.autodoc_warningiserror)
+ parent = ret[3]
+ if self.is_uninitialized_instance_attribute(parent):
+ self.object = UNINITIALIZED_ATTR
+ self.parent = parent
+ return True
+ except ImportError:
+ pass
+
+ if raiseerror:
+ raise
+ logger.warning(exc.args[0], type='autodoc', subtype='import_object')
+ self.env.note_reread()
+ return False
+
+ def should_suppress_value_header(self) -> bool:
+ return (self.object is UNINITIALIZED_ATTR or
+ super().should_suppress_value_header())
+
+ def get_doc(self) -> list[list[str]] | None:
+ if self.object is UNINITIALIZED_ATTR:
+ return None
+ return super().get_doc() # type: ignore[misc]
+
+
+class AttributeDocumenter(GenericAliasMixin, SlotsMixin, # type: ignore[misc]
+ RuntimeInstanceAttributeMixin,
+ UninitializedInstanceAttributeMixin, NonDataDescriptorMixin,
+ DocstringStripSignatureMixin, ClassLevelDocumenter):
+ """
+ Specialized Documenter subclass for attributes.
+ """
+ objtype = 'attribute'
+ member_order = 60
+ option_spec: OptionSpec = dict(ModuleLevelDocumenter.option_spec)
+ option_spec["annotation"] = annotation_option
+ option_spec["no-value"] = bool_option
+
+ # must be higher than the MethodDocumenter, else it will recognize
+ # some non-data descriptors as methods
+ priority = 10
+
+ @staticmethod
+ def is_function_or_method(obj: Any) -> bool:
+ return inspect.isfunction(obj) or inspect.isbuiltin(obj) or inspect.ismethod(obj)
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ if isinstance(parent, ModuleDocumenter):
+ return False
+ if inspect.isattributedescriptor(member):
+ return True
+ if not inspect.isroutine(member) and not isinstance(member, type):
+ return True
+ return False
+
+ def document_members(self, all_members: bool = False) -> None:
+ pass
+
+ def update_annotations(self, parent: Any) -> None:
+ """Update __annotations__ to support type_comment and so on."""
+ try:
+ annotations = dict(inspect.getannotations(parent))
+ parent.__annotations__ = annotations
+
+ for cls in inspect.getmro(parent):
+ try:
+ module = safe_getattr(cls, '__module__')
+ qualname = safe_getattr(cls, '__qualname__')
+
+ analyzer = ModuleAnalyzer.for_module(module)
+ analyzer.analyze()
+ for (classname, attrname), annotation in analyzer.annotations.items():
+ if classname == qualname and attrname not in annotations:
+ annotations[attrname] = annotation
+ except (AttributeError, PycodeError):
+ pass
+ except (AttributeError, TypeError):
+ # Failed to set __annotations__ (built-in, extensions, etc.)
+ pass
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ ret = super().import_object(raiseerror)
+ if inspect.isenumattribute(self.object):
+ self.object = self.object.value
+ if self.parent:
+ self.update_annotations(self.parent)
+
+ return ret
+
+ def get_real_modname(self) -> str:
+ real_modname = self.get_attr(self.parent or self.object, '__module__', None)
+ return real_modname or self.modname
+
+ def should_suppress_value_header(self) -> bool:
+ if super().should_suppress_value_header():
+ return True
+ else:
+ doc = self.get_doc()
+ if doc:
+ docstring, metadata = separate_metadata('\n'.join(sum(doc, [])))
+ if 'hide-value' in metadata:
+ return True
+
+ return False
+
+ def add_directive_header(self, sig: str) -> None:
+ super().add_directive_header(sig)
+ sourcename = self.get_sourcename()
+ if self.options.annotation is SUPPRESS or self.should_suppress_directive_header():
+ pass
+ elif self.options.annotation:
+ self.add_line(' :annotation: %s' % self.options.annotation, sourcename)
+ else:
+ if self.config.autodoc_typehints != 'none':
+ # obtain type annotation for this attribute
+ annotations = get_type_hints(self.parent, None,
+ self.config.autodoc_type_aliases)
+ if self.objpath[-1] in annotations:
+ if self.config.autodoc_typehints_format == "short":
+ objrepr = stringify_annotation(annotations.get(self.objpath[-1]),
+ "smart")
+ else:
+ objrepr = stringify_annotation(annotations.get(self.objpath[-1]),
+ "fully-qualified-except-typing")
+ self.add_line(' :type: ' + objrepr, sourcename)
+
+ try:
+ if (self.options.no_value or self.should_suppress_value_header() or
+ ismock(self.object)):
+ pass
+ else:
+ objrepr = object_description(self.object)
+ self.add_line(' :value: ' + objrepr, sourcename)
+ except ValueError:
+ pass
+
+ def get_attribute_comment(self, parent: Any, attrname: str) -> list[str] | None:
+ for cls in inspect.getmro(parent):
+ try:
+ module = safe_getattr(cls, '__module__')
+ qualname = safe_getattr(cls, '__qualname__')
+
+ analyzer = ModuleAnalyzer.for_module(module)
+ analyzer.analyze()
+ if qualname and self.objpath:
+ key = (qualname, attrname)
+ if key in analyzer.attr_docs:
+ return list(analyzer.attr_docs[key])
+ except (AttributeError, PycodeError):
+ pass
+
+ return None
+
+ def get_doc(self) -> list[list[str]] | None:
+ # Check the attribute has a docstring-comment
+ comment = self.get_attribute_comment(self.parent, self.objpath[-1])
+ if comment:
+ return [comment]
+
+ try:
+ # Disable `autodoc_inherit_docstring` temporarily to avoid to obtain
+ # a docstring from the value which descriptor returns unexpectedly.
+ # ref: https://github.com/sphinx-doc/sphinx/issues/7805
+ orig = self.config.autodoc_inherit_docstrings
+ self.config.autodoc_inherit_docstrings = False # type: ignore[attr-defined]
+ return super().get_doc()
+ finally:
+ self.config.autodoc_inherit_docstrings = orig # type: ignore[attr-defined]
+
+ def add_content(self, more_content: StringList | None) -> None:
+ # Disable analyzing attribute comment on Documenter.add_content() to control it on
+ # AttributeDocumenter.add_content()
+ self.analyzer = None
+
+ if more_content is None:
+ more_content = StringList()
+ self.update_content(more_content)
+ super().add_content(more_content)
+
+
+class PropertyDocumenter(DocstringStripSignatureMixin, # type: ignore[misc]
+ ClassLevelDocumenter):
+ """
+ Specialized Documenter subclass for properties.
+ """
+ objtype = 'property'
+ member_order = 60
+
+ # before AttributeDocumenter
+ priority = AttributeDocumenter.priority + 1
+
+ @classmethod
+ def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any,
+ ) -> bool:
+ if isinstance(parent, ClassDocumenter):
+ if inspect.isproperty(member):
+ return True
+ else:
+ __dict__ = safe_getattr(parent.object, '__dict__', {})
+ obj = __dict__.get(membername)
+ return isinstance(obj, classmethod) and inspect.isproperty(obj.__func__)
+ else:
+ return False
+
+ def import_object(self, raiseerror: bool = False) -> bool:
+ """Check the exisitence of uninitialized instance attribute when failed to import
+ the attribute."""
+ ret = super().import_object(raiseerror)
+ if ret and not inspect.isproperty(self.object):
+ __dict__ = safe_getattr(self.parent, '__dict__', {})
+ obj = __dict__.get(self.objpath[-1])
+ if isinstance(obj, classmethod) and inspect.isproperty(obj.__func__):
+ self.object = obj.__func__
+ self.isclassmethod = True
+ return True
+ else:
+ return False
+
+ self.isclassmethod = False
+ return ret
+
+ def format_args(self, **kwargs: Any) -> str:
+ func = self._get_property_getter()
+ if func is None:
+ return ''
+
+ # update the annotations of the property getter
+ self.env.app.emit('autodoc-before-process-signature', func, False)
+ # correctly format the arguments for a property
+ return super().format_args(**kwargs)
+
+ def document_members(self, all_members: bool = False) -> None:
+ pass
+
+ def get_real_modname(self) -> str:
+ real_modname = self.get_attr(self.parent or self.object, '__module__', None)
+ return real_modname or self.modname
+
+ def add_directive_header(self, sig: str) -> None:
+ super().add_directive_header(sig)
+ sourcename = self.get_sourcename()
+ if inspect.isabstractmethod(self.object):
+ self.add_line(' :abstractmethod:', sourcename)
+ if self.isclassmethod:
+ self.add_line(' :classmethod:', sourcename)
+
+ func = self._get_property_getter()
+ if func is None or self.config.autodoc_typehints == 'none':
+ return
+
+ try:
+ signature = inspect.signature(func,
+ type_aliases=self.config.autodoc_type_aliases)
+ if signature.return_annotation is not Parameter.empty:
+ if self.config.autodoc_typehints_format == "short":
+ objrepr = stringify_annotation(signature.return_annotation, "smart")
+ else:
+ objrepr = stringify_annotation(signature.return_annotation,
+ "fully-qualified-except-typing")
+ self.add_line(' :type: ' + objrepr, sourcename)
+ except TypeError as exc:
+ logger.warning(__("Failed to get a function signature for %s: %s"),
+ self.fullname, exc)
+ pass
+ except ValueError:
+ pass
+
+ def _get_property_getter(self):
+ if safe_getattr(self.object, 'fget', None): # property
+ return self.object.fget
+ if safe_getattr(self.object, 'func', None): # cached_property
+ return self.object.func
+ return None
+
+
+def autodoc_attrgetter(app: Sphinx, obj: Any, name: str, *defargs: Any) -> Any:
+ """Alternative getattr() for types"""
+ for typ, func in app.registry.autodoc_attrgettrs.items():
+ if isinstance(obj, typ):
+ return func(obj, name, *defargs)
+
+ return safe_getattr(obj, name, *defargs)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_autodocumenter(ModuleDocumenter)
+ app.add_autodocumenter(ClassDocumenter)
+ app.add_autodocumenter(ExceptionDocumenter)
+ app.add_autodocumenter(DataDocumenter)
+ app.add_autodocumenter(FunctionDocumenter)
+ app.add_autodocumenter(DecoratorDocumenter)
+ app.add_autodocumenter(MethodDocumenter)
+ app.add_autodocumenter(AttributeDocumenter)
+ app.add_autodocumenter(PropertyDocumenter)
+
+ app.add_config_value('autoclass_content', 'class', True, ENUM('both', 'class', 'init'))
+ app.add_config_value('autodoc_member_order', 'alphabetical', True,
+ ENUM('alphabetical', 'bysource', 'groupwise'))
+ app.add_config_value('autodoc_class_signature', 'mixed', True, ENUM('mixed', 'separated'))
+ app.add_config_value('autodoc_default_options', {}, True)
+ app.add_config_value('autodoc_docstring_signature', True, True)
+ app.add_config_value('autodoc_mock_imports', [], True)
+ app.add_config_value('autodoc_typehints', "signature", True,
+ ENUM("signature", "description", "none", "both"))
+ app.add_config_value('autodoc_typehints_description_target', 'all', True,
+ ENUM('all', 'documented', 'documented_params'))
+ app.add_config_value('autodoc_type_aliases', {}, True)
+ app.add_config_value('autodoc_typehints_format', "short", 'env',
+ ENUM("fully-qualified", "short"))
+ app.add_config_value('autodoc_warningiserror', True, True)
+ app.add_config_value('autodoc_inherit_docstrings', True, True)
+ app.add_event('autodoc-before-process-signature')
+ app.add_event('autodoc-process-docstring')
+ app.add_event('autodoc-process-signature')
+ app.add_event('autodoc-skip-member')
+ app.add_event('autodoc-process-bases')
+
+ app.setup_extension('sphinx.ext.autodoc.preserve_defaults')
+ app.setup_extension('sphinx.ext.autodoc.type_comment')
+ app.setup_extension('sphinx.ext.autodoc.typehints')
+
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/autodoc/directive.py b/sphinx/ext/autodoc/directive.py
new file mode 100644
index 0000000..64cbc9b
--- /dev/null
+++ b/sphinx/ext/autodoc/directive.py
@@ -0,0 +1,151 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, Callable
+
+from docutils import nodes
+from docutils.statemachine import StringList
+from docutils.utils import Reporter, assemble_option_dict
+
+from sphinx.ext.autodoc import Documenter, Options
+from sphinx.util import logging
+from sphinx.util.docutils import SphinxDirective, switch_source_input
+from sphinx.util.nodes import nested_parse_with_titles
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node
+ from docutils.parsers.rst.states import RSTState
+
+ from sphinx.config import Config
+ from sphinx.environment import BuildEnvironment
+
+logger = logging.getLogger(__name__)
+
+
+# common option names for autodoc directives
+AUTODOC_DEFAULT_OPTIONS = ['members', 'undoc-members', 'inherited-members',
+ 'show-inheritance', 'private-members', 'special-members',
+ 'ignore-module-all', 'exclude-members', 'member-order',
+ 'imported-members', 'class-doc-from', 'no-value']
+
+AUTODOC_EXTENDABLE_OPTIONS = ['members', 'private-members', 'special-members',
+ 'exclude-members']
+
+
+class DummyOptionSpec(dict):
+ """An option_spec allows any options."""
+
+ def __bool__(self) -> bool:
+ """Behaves like some options are defined."""
+ return True
+
+ def __getitem__(self, key: str) -> Callable[[str], str]:
+ return lambda x: x
+
+
+class DocumenterBridge:
+ """A parameters container for Documenters."""
+
+ def __init__(self, env: BuildEnvironment, reporter: Reporter | None, options: Options,
+ lineno: int, state: Any) -> None:
+ self.env = env
+ self._reporter = reporter
+ self.genopt = options
+ self.lineno = lineno
+ self.record_dependencies: set[str] = set()
+ self.result = StringList()
+ self.state = state
+
+
+def process_documenter_options(documenter: type[Documenter], config: Config, options: dict,
+ ) -> Options:
+ """Recognize options of Documenter from user input."""
+ for name in AUTODOC_DEFAULT_OPTIONS:
+ if name not in documenter.option_spec:
+ continue
+ negated = options.pop('no-' + name, True) is None
+ if name in config.autodoc_default_options and not negated:
+ if name in options and isinstance(config.autodoc_default_options[name], str):
+ # take value from options if present or extend it
+ # with autodoc_default_options if necessary
+ if name in AUTODOC_EXTENDABLE_OPTIONS:
+ if options[name] is not None and options[name].startswith('+'):
+ options[name] = ','.join([config.autodoc_default_options[name],
+ options[name][1:]])
+ else:
+ options[name] = config.autodoc_default_options[name]
+
+ elif options.get(name) is not None:
+ # remove '+' from option argument if there's nothing to merge it with
+ options[name] = options[name].lstrip('+')
+
+ return Options(assemble_option_dict(options.items(), documenter.option_spec))
+
+
+def parse_generated_content(state: RSTState, content: StringList, documenter: Documenter,
+ ) -> list[Node]:
+ """Parse an item of content generated by Documenter."""
+ with switch_source_input(state, content):
+ if documenter.titles_allowed:
+ node: Element = nodes.section()
+ # necessary so that the child nodes get the right source/line set
+ node.document = state.document
+ nested_parse_with_titles(state, content, node)
+ else:
+ node = nodes.paragraph()
+ node.document = state.document
+ state.nested_parse(content, 0, node)
+
+ return node.children
+
+
+class AutodocDirective(SphinxDirective):
+ """A directive class for all autodoc directives. It works as a dispatcher of Documenters.
+
+ It invokes a Documenter upon running. After the processing, it parses and returns
+ the content generated by Documenter.
+ """
+ option_spec = DummyOptionSpec()
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+
+ def run(self) -> list[Node]:
+ reporter = self.state.document.reporter
+
+ try:
+ source, lineno = reporter.get_source_and_line( # type: ignore[attr-defined]
+ self.lineno)
+ except AttributeError:
+ source, lineno = (None, None)
+ logger.debug('[autodoc] %s:%s: input:\n%s', source, lineno, self.block_text)
+
+ # look up target Documenter
+ objtype = self.name[4:] # strip prefix (auto-).
+ doccls = self.env.app.registry.documenters[objtype]
+
+ # process the options with the selected documenter's option_spec
+ try:
+ documenter_options = process_documenter_options(doccls, self.config, self.options)
+ except (KeyError, ValueError, TypeError) as exc:
+ # an option is either unknown or has a wrong type
+ logger.error('An option to %s is either unknown or has an invalid value: %s' %
+ (self.name, exc), location=(self.env.docname, lineno))
+ return []
+
+ # generate the output
+ params = DocumenterBridge(self.env, reporter, documenter_options, lineno, self.state)
+ documenter = doccls(params, self.arguments[0])
+ documenter.generate(more_content=self.content)
+ if not params.result:
+ return []
+
+ logger.debug('[autodoc] output:\n%s', '\n'.join(params.result))
+
+ # record all filenames as dependencies -- this will at least
+ # partially make automatic invalidation possible
+ for fn in params.record_dependencies:
+ self.state.document.settings.record_dependencies.add(fn)
+
+ result = parse_generated_content(self.state, params.result, documenter)
+ return result
diff --git a/sphinx/ext/autodoc/importer.py b/sphinx/ext/autodoc/importer.py
new file mode 100644
index 0000000..84bfee5
--- /dev/null
+++ b/sphinx/ext/autodoc/importer.py
@@ -0,0 +1,342 @@
+"""Importer utilities for autodoc"""
+
+from __future__ import annotations
+
+import contextlib
+import importlib
+import os
+import sys
+import traceback
+import typing
+from typing import TYPE_CHECKING, Any, Callable, NamedTuple
+
+from sphinx.ext.autodoc.mock import ismock, undecorate
+from sphinx.pycode import ModuleAnalyzer, PycodeError
+from sphinx.util import logging
+from sphinx.util.inspect import (
+ getannotations,
+ getmro,
+ getslots,
+ isclass,
+ isenumclass,
+ safe_getattr,
+)
+
+if TYPE_CHECKING:
+ from types import ModuleType
+
+ from sphinx.ext.autodoc import ObjectMember
+
+logger = logging.getLogger(__name__)
+
+
+def mangle(subject: Any, name: str) -> str:
+ """Mangle the given name."""
+ try:
+ if isclass(subject) and name.startswith('__') and not name.endswith('__'):
+ return f"_{subject.__name__}{name}"
+ except AttributeError:
+ pass
+
+ return name
+
+
+def unmangle(subject: Any, name: str) -> str | None:
+ """Unmangle the given name."""
+ try:
+ if isclass(subject) and not name.endswith('__'):
+ prefix = "_%s__" % subject.__name__
+ if name.startswith(prefix):
+ return name.replace(prefix, "__", 1)
+ else:
+ for cls in subject.__mro__:
+ prefix = "_%s__" % cls.__name__
+ if name.startswith(prefix):
+ # mangled attribute defined in parent class
+ return None
+ except AttributeError:
+ pass
+
+ return name
+
+
+def import_module(modname: str, warningiserror: bool = False) -> Any:
+ """
+ Call importlib.import_module(modname), convert exceptions to ImportError
+ """
+ try:
+ with logging.skip_warningiserror(not warningiserror):
+ return importlib.import_module(modname)
+ except BaseException as exc:
+ # Importing modules may cause any side effects, including
+ # SystemExit, so we need to catch all errors.
+ raise ImportError(exc, traceback.format_exc()) from exc
+
+
+def _reload_module(module: ModuleType, warningiserror: bool = False) -> Any:
+ """
+ Call importlib.reload(module), convert exceptions to ImportError
+ """
+ try:
+ with logging.skip_warningiserror(not warningiserror):
+ return importlib.reload(module)
+ except BaseException as exc:
+ # Importing modules may cause any side effects, including
+ # SystemExit, so we need to catch all errors.
+ raise ImportError(exc, traceback.format_exc()) from exc
+
+
+def import_object(modname: str, objpath: list[str], objtype: str = '',
+ attrgetter: Callable[[Any, str], Any] = safe_getattr,
+ warningiserror: bool = False) -> Any:
+ if objpath:
+ logger.debug('[autodoc] from %s import %s', modname, '.'.join(objpath))
+ else:
+ logger.debug('[autodoc] import %s', modname)
+
+ try:
+ module = None
+ exc_on_importing = None
+ objpath = list(objpath)
+ while module is None:
+ try:
+ original_module_names = frozenset(sys.modules)
+ module = import_module(modname, warningiserror=warningiserror)
+ if os.environ.get('SPHINX_AUTODOC_RELOAD_MODULES'):
+ new_modules = [m for m in sys.modules if m not in original_module_names]
+ # Try reloading modules with ``typing.TYPE_CHECKING == True``.
+ try:
+ typing.TYPE_CHECKING = True
+ # Ignore failures; we've already successfully loaded these modules
+ with contextlib.suppress(ImportError, KeyError):
+ for m in new_modules:
+ _reload_module(sys.modules[m])
+ finally:
+ typing.TYPE_CHECKING = False
+ module = sys.modules[modname]
+ logger.debug('[autodoc] import %s => %r', modname, module)
+ except ImportError as exc:
+ logger.debug('[autodoc] import %s => failed', modname)
+ exc_on_importing = exc
+ if '.' in modname:
+ # retry with parent module
+ modname, name = modname.rsplit('.', 1)
+ objpath.insert(0, name)
+ else:
+ raise
+
+ obj = module
+ parent = None
+ object_name = None
+ for attrname in objpath:
+ parent = obj
+ logger.debug('[autodoc] getattr(_, %r)', attrname)
+ mangled_name = mangle(obj, attrname)
+ obj = attrgetter(obj, mangled_name)
+
+ try:
+ logger.debug('[autodoc] => %r', obj)
+ except TypeError:
+ # fallback of failure on logging for broken object
+ # refs: https://github.com/sphinx-doc/sphinx/issues/9095
+ logger.debug('[autodoc] => %r', (obj,))
+
+ object_name = attrname
+ return [module, parent, object_name, obj]
+ except (AttributeError, ImportError) as exc:
+ if isinstance(exc, AttributeError) and exc_on_importing:
+ # restore ImportError
+ exc = exc_on_importing
+
+ if objpath:
+ errmsg = ('autodoc: failed to import %s %r from module %r' %
+ (objtype, '.'.join(objpath), modname))
+ else:
+ errmsg = f'autodoc: failed to import {objtype} {modname!r}'
+
+ if isinstance(exc, ImportError):
+ # import_module() raises ImportError having real exception obj and
+ # traceback
+ real_exc, traceback_msg = exc.args
+ if isinstance(real_exc, SystemExit):
+ errmsg += ('; the module executes module level statement '
+ 'and it might call sys.exit().')
+ elif isinstance(real_exc, ImportError) and real_exc.args:
+ errmsg += '; the following exception was raised:\n%s' % real_exc.args[0]
+ else:
+ errmsg += '; the following exception was raised:\n%s' % traceback_msg
+ else:
+ errmsg += '; the following exception was raised:\n%s' % traceback.format_exc()
+
+ logger.debug(errmsg)
+ raise ImportError(errmsg) from exc
+
+
+class Attribute(NamedTuple):
+ name: str
+ directly_defined: bool
+ value: Any
+
+
+def get_object_members(
+ subject: Any,
+ objpath: list[str],
+ attrgetter: Callable,
+ analyzer: ModuleAnalyzer | None = None,
+) -> dict[str, Attribute]:
+ """Get members and attributes of target object."""
+ from sphinx.ext.autodoc import INSTANCEATTR
+
+ # the members directly defined in the class
+ obj_dict = attrgetter(subject, '__dict__', {})
+
+ members: dict[str, Attribute] = {}
+
+ # enum members
+ if isenumclass(subject):
+ for name, value in subject.__members__.items():
+ if name not in members:
+ members[name] = Attribute(name, True, value)
+
+ superclass = subject.__mro__[1]
+ for name in obj_dict:
+ if name not in superclass.__dict__:
+ value = safe_getattr(subject, name)
+ members[name] = Attribute(name, True, value)
+
+ # members in __slots__
+ try:
+ subject___slots__ = getslots(subject)
+ if subject___slots__:
+ from sphinx.ext.autodoc import SLOTSATTR
+
+ for name in subject___slots__:
+ members[name] = Attribute(name, True, SLOTSATTR)
+ except (TypeError, ValueError):
+ pass
+
+ # other members
+ for name in dir(subject):
+ try:
+ value = attrgetter(subject, name)
+ directly_defined = name in obj_dict
+ name = unmangle(subject, name)
+ if name and name not in members:
+ members[name] = Attribute(name, directly_defined, value)
+ except AttributeError:
+ continue
+
+ # annotation only member (ex. attr: int)
+ for i, cls in enumerate(getmro(subject)):
+ for name in getannotations(cls):
+ name = unmangle(cls, name)
+ if name and name not in members:
+ members[name] = Attribute(name, i == 0, INSTANCEATTR)
+
+ if analyzer:
+ # append instance attributes (cf. self.attr1) if analyzer knows
+ namespace = '.'.join(objpath)
+ for (ns, name) in analyzer.find_attr_docs():
+ if namespace == ns and name not in members:
+ members[name] = Attribute(name, True, INSTANCEATTR)
+
+ return members
+
+
+def get_class_members(subject: Any, objpath: Any, attrgetter: Callable,
+ inherit_docstrings: bool = True) -> dict[str, ObjectMember]:
+ """Get members and attributes of target class."""
+ from sphinx.ext.autodoc import INSTANCEATTR, ObjectMember
+
+ # the members directly defined in the class
+ obj_dict = attrgetter(subject, '__dict__', {})
+
+ members: dict[str, ObjectMember] = {}
+
+ # enum members
+ if isenumclass(subject):
+ for name, value in subject.__members__.items():
+ if name not in members:
+ members[name] = ObjectMember(name, value, class_=subject)
+
+ superclass = subject.__mro__[1]
+ for name in obj_dict:
+ if name not in superclass.__dict__:
+ value = safe_getattr(subject, name)
+ members[name] = ObjectMember(name, value, class_=subject)
+
+ # members in __slots__
+ try:
+ subject___slots__ = getslots(subject)
+ if subject___slots__:
+ from sphinx.ext.autodoc import SLOTSATTR
+
+ for name, docstring in subject___slots__.items():
+ members[name] = ObjectMember(name, SLOTSATTR, class_=subject,
+ docstring=docstring)
+ except (TypeError, ValueError):
+ pass
+
+ # other members
+ for name in dir(subject):
+ try:
+ value = attrgetter(subject, name)
+ if ismock(value):
+ value = undecorate(value)
+
+ unmangled = unmangle(subject, name)
+ if unmangled and unmangled not in members:
+ if name in obj_dict:
+ members[unmangled] = ObjectMember(unmangled, value, class_=subject)
+ else:
+ members[unmangled] = ObjectMember(unmangled, value)
+ except AttributeError:
+ continue
+
+ try:
+ for cls in getmro(subject):
+ try:
+ modname = safe_getattr(cls, '__module__')
+ qualname = safe_getattr(cls, '__qualname__')
+ analyzer = ModuleAnalyzer.for_module(modname)
+ analyzer.analyze()
+ except AttributeError:
+ qualname = None
+ analyzer = None
+ except PycodeError:
+ analyzer = None
+
+ # annotation only member (ex. attr: int)
+ for name in getannotations(cls):
+ name = unmangle(cls, name)
+ if name and name not in members:
+ if analyzer and (qualname, name) in analyzer.attr_docs:
+ docstring = '\n'.join(analyzer.attr_docs[qualname, name])
+ else:
+ docstring = None
+
+ members[name] = ObjectMember(name, INSTANCEATTR, class_=cls,
+ docstring=docstring)
+
+ # append or complete instance attributes (cf. self.attr1) if analyzer knows
+ if analyzer:
+ for (ns, name), docstring in analyzer.attr_docs.items():
+ if ns == qualname and name not in members:
+ # otherwise unknown instance attribute
+ members[name] = ObjectMember(name, INSTANCEATTR, class_=cls,
+ docstring='\n'.join(docstring))
+ elif (ns == qualname and docstring and
+ isinstance(members[name], ObjectMember) and
+ not members[name].docstring):
+ if cls != subject and not inherit_docstrings:
+ # If we are in the MRO of the class and not the class itself,
+ # and we do not want to inherit docstrings, then skip setting
+ # the docstring below
+ continue
+ # attribute is already known, because dir(subject) enumerates it.
+ # But it has no docstring yet
+ members[name].docstring = '\n'.join(docstring)
+ except AttributeError:
+ pass
+
+ return members
diff --git a/sphinx/ext/autodoc/mock.py b/sphinx/ext/autodoc/mock.py
new file mode 100644
index 0000000..7034977
--- /dev/null
+++ b/sphinx/ext/autodoc/mock.py
@@ -0,0 +1,198 @@
+"""mock for autodoc"""
+
+from __future__ import annotations
+
+import contextlib
+import os
+import sys
+from importlib.abc import Loader, MetaPathFinder
+from importlib.machinery import ModuleSpec
+from types import MethodType, ModuleType
+from typing import TYPE_CHECKING, Any
+
+from sphinx.util import logging
+from sphinx.util.inspect import isboundmethod, safe_getattr
+
+if TYPE_CHECKING:
+ from collections.abc import Generator, Iterator, Sequence
+
+logger = logging.getLogger(__name__)
+
+
+class _MockObject:
+ """Used by autodoc_mock_imports."""
+
+ __display_name__ = '_MockObject'
+ __name__ = ''
+ __sphinx_mock__ = True
+ __sphinx_decorator_args__: tuple[Any, ...] = ()
+
+ def __new__(cls, *args: Any, **kwargs: Any) -> Any:
+ if len(args) == 3 and isinstance(args[1], tuple):
+ superclass = args[1][-1].__class__
+ if superclass is cls:
+ # subclassing MockObject
+ return _make_subclass(args[0], superclass.__display_name__,
+ superclass=superclass, attributes=args[2])
+
+ return super().__new__(cls)
+
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ self.__qualname__ = self.__name__
+
+ def __len__(self) -> int:
+ return 0
+
+ def __contains__(self, key: str) -> bool:
+ return False
+
+ def __iter__(self) -> Iterator:
+ return iter([])
+
+ def __mro_entries__(self, bases: tuple) -> tuple:
+ return (self.__class__,)
+
+ def __getitem__(self, key: Any) -> _MockObject:
+ return _make_subclass(str(key), self.__display_name__, self.__class__)()
+
+ def __getattr__(self, key: str) -> _MockObject:
+ return _make_subclass(key, self.__display_name__, self.__class__)()
+
+ def __call__(self, *args: Any, **kwargs: Any) -> Any:
+ call = self.__class__()
+ call.__sphinx_decorator_args__ = args
+ return call
+
+ def __repr__(self) -> str:
+ return self.__display_name__
+
+
+def _make_subclass(name: str, module: str, superclass: Any = _MockObject,
+ attributes: Any = None, decorator_args: tuple = ()) -> Any:
+ attrs = {'__module__': module,
+ '__display_name__': module + '.' + name,
+ '__name__': name,
+ '__sphinx_decorator_args__': decorator_args}
+ attrs.update(attributes or {})
+
+ return type(name, (superclass,), attrs)
+
+
+class _MockModule(ModuleType):
+ """Used by autodoc_mock_imports."""
+ __file__ = os.devnull
+ __sphinx_mock__ = True
+
+ def __init__(self, name: str) -> None:
+ super().__init__(name)
+ self.__all__: list[str] = []
+ self.__path__: list[str] = []
+
+ def __getattr__(self, name: str) -> _MockObject:
+ return _make_subclass(name, self.__name__)()
+
+ def __repr__(self) -> str:
+ return self.__name__
+
+
+class MockLoader(Loader):
+ """A loader for mocking."""
+ def __init__(self, finder: MockFinder) -> None:
+ super().__init__()
+ self.finder = finder
+
+ def create_module(self, spec: ModuleSpec) -> ModuleType:
+ logger.debug('[autodoc] adding a mock module as %s!', spec.name)
+ self.finder.mocked_modules.append(spec.name)
+ return _MockModule(spec.name)
+
+ def exec_module(self, module: ModuleType) -> None:
+ pass # nothing to do
+
+
+class MockFinder(MetaPathFinder):
+ """A finder for mocking."""
+
+ def __init__(self, modnames: list[str]) -> None:
+ super().__init__()
+ self.modnames = modnames
+ self.loader = MockLoader(self)
+ self.mocked_modules: list[str] = []
+
+ def find_spec(self, fullname: str, path: Sequence[bytes | str] | None,
+ target: ModuleType | None = None) -> ModuleSpec | None:
+ for modname in self.modnames:
+ # check if fullname is (or is a descendant of) one of our targets
+ if modname == fullname or fullname.startswith(modname + '.'):
+ return ModuleSpec(fullname, self.loader)
+
+ return None
+
+ def invalidate_caches(self) -> None:
+ """Invalidate mocked modules on sys.modules."""
+ for modname in self.mocked_modules:
+ sys.modules.pop(modname, None)
+
+
+@contextlib.contextmanager
+def mock(modnames: list[str]) -> Generator[None, None, None]:
+ """Insert mock modules during context::
+
+ with mock(['target.module.name']):
+ # mock modules are enabled here
+ ...
+ """
+ try:
+ finder = MockFinder(modnames)
+ sys.meta_path.insert(0, finder)
+ yield
+ finally:
+ sys.meta_path.remove(finder)
+ finder.invalidate_caches()
+
+
+def ismockmodule(subject: Any) -> bool:
+ """Check if the object is a mocked module."""
+ return isinstance(subject, _MockModule)
+
+
+def ismock(subject: Any) -> bool:
+ """Check if the object is mocked."""
+ # check the object has '__sphinx_mock__' attribute
+ try:
+ if safe_getattr(subject, '__sphinx_mock__', None) is None:
+ return False
+ except AttributeError:
+ return False
+
+ # check the object is mocked module
+ if isinstance(subject, _MockModule):
+ return True
+
+ # check the object is bound method
+ if isinstance(subject, MethodType) and isboundmethod(subject):
+ tmp_subject = subject.__func__
+ else:
+ tmp_subject = subject
+
+ try:
+ # check the object is mocked object
+ __mro__ = safe_getattr(type(tmp_subject), '__mro__', [])
+ if len(__mro__) > 2 and __mro__[-2] is _MockObject:
+ # A mocked object has a MRO that ends with (..., _MockObject, object).
+ return True
+ except AttributeError:
+ pass
+
+ return False
+
+
+def undecorate(subject: _MockObject) -> Any:
+ """Unwrap mock if *subject* is decorated by mocked object.
+
+ If not decorated, returns given *subject* itself.
+ """
+ if ismock(subject) and subject.__sphinx_decorator_args__:
+ return subject.__sphinx_decorator_args__[0]
+ else:
+ return subject
diff --git a/sphinx/ext/autodoc/preserve_defaults.py b/sphinx/ext/autodoc/preserve_defaults.py
new file mode 100644
index 0000000..5f957ce
--- /dev/null
+++ b/sphinx/ext/autodoc/preserve_defaults.py
@@ -0,0 +1,199 @@
+"""Preserve function defaults.
+
+Preserve the default argument values of function signatures in source code
+and keep them not evaluated for readability.
+"""
+
+from __future__ import annotations
+
+import ast
+import inspect
+import types
+import warnings
+from typing import TYPE_CHECKING
+
+import sphinx
+from sphinx.deprecation import RemovedInSphinx90Warning
+from sphinx.locale import __
+from sphinx.pycode.ast import unparse as ast_unparse
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from typing import Any
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+_LAMBDA_NAME = (lambda: None).__name__
+
+
+class DefaultValue:
+ def __init__(self, name: str) -> None:
+ self.name = name
+
+ def __repr__(self) -> str:
+ return self.name
+
+
+def get_function_def(obj: Any) -> ast.FunctionDef | None:
+ """Get FunctionDef object from living object.
+
+ This tries to parse original code for living object and returns
+ AST node for given *obj*.
+ """
+ warnings.warn('sphinx.ext.autodoc.preserve_defaults.get_function_def is'
+ ' deprecated and scheduled for removal in Sphinx 9.'
+ ' Use sphinx.ext.autodoc.preserve_defaults._get_arguments() to'
+ ' extract AST arguments objects from a lambda or regular'
+ ' function.', RemovedInSphinx90Warning, stacklevel=2)
+
+ try:
+ source = inspect.getsource(obj)
+ if source.startswith((' ', '\t')):
+ # subject is placed inside class or block. To read its docstring,
+ # this adds if-block before the declaration.
+ module = ast.parse('if True:\n' + source)
+ return module.body[0].body[0] # type: ignore[attr-defined]
+ else:
+ module = ast.parse(source)
+ return module.body[0] # type: ignore[return-value]
+ except (OSError, TypeError): # failed to load source code
+ return None
+
+
+def _get_arguments(obj: Any, /) -> ast.arguments | None:
+ """Parse 'ast.arguments' from an object.
+
+ This tries to parse the original code for an object and returns
+ an 'ast.arguments' node.
+ """
+ try:
+ source = inspect.getsource(obj)
+ if source.startswith((' ', '\t')):
+ # 'obj' is in some indented block.
+ module = ast.parse('if True:\n' + source)
+ subject = module.body[0].body[0] # type: ignore[attr-defined]
+ else:
+ module = ast.parse(source)
+ subject = module.body[0]
+ except (OSError, TypeError):
+ # bail; failed to load source for 'obj'.
+ return None
+ except SyntaxError:
+ if _is_lambda(obj):
+ # Most likely a multi-line arising from detecting a lambda, e.g.:
+ #
+ # class Egg:
+ # x = property(
+ # lambda self: 1, doc="...")
+ return None
+
+ # Other syntax errors that are not due to the fact that we are
+ # documenting a lambda function are propagated
+ # (in particular if a lambda is renamed by the user).
+ raise
+
+ return _get_arguments_inner(subject)
+
+
+def _is_lambda(x, /):
+ return isinstance(x, types.LambdaType) and x.__name__ == _LAMBDA_NAME
+
+
+def _get_arguments_inner(x: Any, /) -> ast.arguments | None:
+ if isinstance(x, (ast.AsyncFunctionDef, ast.FunctionDef, ast.Lambda)):
+ return x.args
+ if isinstance(x, (ast.Assign, ast.AnnAssign)):
+ return _get_arguments_inner(x.value)
+ return None
+
+
+def get_default_value(lines: list[str], position: ast.AST) -> str | None:
+ try:
+ if position.lineno == position.end_lineno:
+ line = lines[position.lineno - 1]
+ return line[position.col_offset:position.end_col_offset]
+ else:
+ # multiline value is not supported now
+ return None
+ except (AttributeError, IndexError):
+ return None
+
+
+def update_defvalue(app: Sphinx, obj: Any, bound_method: bool) -> None:
+ """Update defvalue info of *obj* using type_comments."""
+ if not app.config.autodoc_preserve_defaults:
+ return
+
+ try:
+ lines = inspect.getsource(obj).splitlines()
+ if lines[0].startswith((' ', '\t')):
+ # insert a dummy line to follow what _get_arguments() does.
+ lines.insert(0, '')
+ except (OSError, TypeError):
+ lines = []
+
+ try:
+ args = _get_arguments(obj)
+ except SyntaxError:
+ return
+ if args is None:
+ # If the object is a built-in, we won't be always able to recover
+ # the function definition and its arguments. This happens if *obj*
+ # is the `__init__` method generated automatically for dataclasses.
+ return
+
+ if not args.defaults and not args.kw_defaults:
+ return
+
+ try:
+ if bound_method and inspect.ismethod(obj) and hasattr(obj, '__func__'):
+ sig = inspect.signature(obj.__func__)
+ else:
+ sig = inspect.signature(obj)
+ defaults = list(args.defaults)
+ kw_defaults = list(args.kw_defaults)
+ parameters = list(sig.parameters.values())
+ for i, param in enumerate(parameters):
+ if param.default is param.empty:
+ if param.kind == param.KEYWORD_ONLY:
+ # Consume kw_defaults for kwonly args
+ kw_defaults.pop(0)
+ else:
+ if param.kind in (param.POSITIONAL_ONLY, param.POSITIONAL_OR_KEYWORD):
+ default = defaults.pop(0)
+ value = get_default_value(lines, default)
+ if value is None:
+ value = ast_unparse(default)
+ parameters[i] = param.replace(default=DefaultValue(value))
+ else:
+ default = kw_defaults.pop(0) # type: ignore[assignment]
+ value = get_default_value(lines, default)
+ if value is None:
+ value = ast_unparse(default)
+ parameters[i] = param.replace(default=DefaultValue(value))
+
+ sig = sig.replace(parameters=parameters)
+ try:
+ obj.__signature__ = sig
+ except AttributeError:
+ # __signature__ can't be set directly on bound methods.
+ obj.__dict__['__signature__'] = sig
+ except (AttributeError, TypeError):
+ # Failed to update signature (e.g. built-in or extension types).
+ # For user-defined functions, "obj" may not have __dict__,
+ # e.g. when decorated with a class that defines __slots__.
+ # In this case, we can't set __signature__.
+ return
+ except NotImplementedError as exc: # failed to ast_unparse()
+ logger.warning(__("Failed to parse a default argument value for %r: %s"), obj, exc)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_config_value('autodoc_preserve_defaults', False, True)
+ app.connect('autodoc-before-process-signature', update_defvalue)
+
+ return {
+ 'version': sphinx.__display_version__,
+ 'parallel_read_safe': True,
+ }
diff --git a/sphinx/ext/autodoc/type_comment.py b/sphinx/ext/autodoc/type_comment.py
new file mode 100644
index 0000000..e2c9ae2
--- /dev/null
+++ b/sphinx/ext/autodoc/type_comment.py
@@ -0,0 +1,140 @@
+"""Update annotations info of living objects using type_comments."""
+
+from __future__ import annotations
+
+import ast
+from inspect import Parameter, Signature, getsource
+from typing import TYPE_CHECKING, Any, cast
+
+import sphinx
+from sphinx.locale import __
+from sphinx.pycode.ast import unparse as ast_unparse
+from sphinx.util import inspect, logging
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+def not_suppressed(argtypes: Sequence[ast.expr] = ()) -> bool:
+ """Check given *argtypes* is suppressed type_comment or not."""
+ if len(argtypes) == 0: # no argtypees
+ return False
+ if len(argtypes) == 1:
+ arg = argtypes[0]
+ if isinstance(arg, ast.Constant) and arg.value is ...: # suppressed
+ return False
+ # not suppressed
+ return True
+
+
+def signature_from_ast(node: ast.FunctionDef, bound_method: bool,
+ type_comment: ast.FunctionDef) -> Signature:
+ """Return a Signature object for the given *node*.
+
+ :param bound_method: Specify *node* is a bound method or not
+ """
+ params = []
+ for arg in node.args.posonlyargs:
+ param = Parameter(arg.arg, Parameter.POSITIONAL_ONLY, annotation=arg.type_comment)
+ params.append(param)
+
+ for arg in node.args.args:
+ param = Parameter(arg.arg, Parameter.POSITIONAL_OR_KEYWORD,
+ annotation=arg.type_comment or Parameter.empty)
+ params.append(param)
+
+ if node.args.vararg:
+ param = Parameter(node.args.vararg.arg, Parameter.VAR_POSITIONAL,
+ annotation=node.args.vararg.type_comment or Parameter.empty)
+ params.append(param)
+
+ for arg in node.args.kwonlyargs:
+ param = Parameter(arg.arg, Parameter.KEYWORD_ONLY,
+ annotation=arg.type_comment or Parameter.empty)
+ params.append(param)
+
+ if node.args.kwarg:
+ param = Parameter(node.args.kwarg.arg, Parameter.VAR_KEYWORD,
+ annotation=node.args.kwarg.type_comment or Parameter.empty)
+ params.append(param)
+
+ # Remove first parameter when *obj* is bound_method
+ if bound_method and params:
+ params.pop(0)
+
+ # merge type_comment into signature
+ if not_suppressed(type_comment.argtypes): # type: ignore[attr-defined]
+ for i, param in enumerate(params):
+ params[i] = param.replace(
+ annotation=type_comment.argtypes[i]) # type: ignore[attr-defined]
+
+ if node.returns:
+ return Signature(params, return_annotation=node.returns)
+ elif type_comment.returns:
+ return Signature(params, return_annotation=ast_unparse(type_comment.returns))
+ else:
+ return Signature(params)
+
+
+def get_type_comment(obj: Any, bound_method: bool = False) -> Signature | None:
+ """Get type_comment'ed FunctionDef object from living object.
+
+ This tries to parse original code for living object and returns
+ Signature for given *obj*.
+ """
+ try:
+ source = getsource(obj)
+ if source.startswith((' ', r'\t')):
+ # subject is placed inside class or block. To read its docstring,
+ # this adds if-block before the declaration.
+ module = ast.parse('if True:\n' + source, type_comments=True)
+ subject = cast(
+ ast.FunctionDef, module.body[0].body[0], # type: ignore[attr-defined]
+ )
+ else:
+ module = ast.parse(source, type_comments=True)
+ subject = cast(ast.FunctionDef, module.body[0])
+
+ type_comment = getattr(subject, "type_comment", None)
+ if type_comment:
+ function = ast.parse(type_comment, mode='func_type', type_comments=True)
+ return signature_from_ast(
+ subject, bound_method, function, # type: ignore[arg-type]
+ )
+ else:
+ return None
+ except (OSError, TypeError): # failed to load source code
+ return None
+ except SyntaxError: # failed to parse type_comments
+ return None
+
+
+def update_annotations_using_type_comments(app: Sphinx, obj: Any, bound_method: bool) -> None:
+ """Update annotations info of *obj* using type_comments."""
+ try:
+ type_sig = get_type_comment(obj, bound_method)
+ if type_sig:
+ sig = inspect.signature(obj, bound_method)
+ for param in sig.parameters.values():
+ if param.name not in obj.__annotations__:
+ annotation = type_sig.parameters[param.name].annotation
+ if annotation is not Parameter.empty:
+ obj.__annotations__[param.name] = ast_unparse(annotation)
+
+ if 'return' not in obj.__annotations__:
+ obj.__annotations__['return'] = type_sig.return_annotation
+ except KeyError as exc:
+ logger.warning(__("Failed to update signature for %r: parameter not found: %s"),
+ obj, exc)
+ except NotImplementedError as exc: # failed to ast.unparse()
+ logger.warning(__("Failed to parse type_comment for %r: %s"), obj, exc)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.connect('autodoc-before-process-signature', update_annotations_using_type_comments)
+
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/autodoc/typehints.py b/sphinx/ext/autodoc/typehints.py
new file mode 100644
index 0000000..79906fb
--- /dev/null
+++ b/sphinx/ext/autodoc/typehints.py
@@ -0,0 +1,219 @@
+"""Generating content for autodoc using typehints"""
+
+from __future__ import annotations
+
+import re
+from collections.abc import Iterable
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+
+import sphinx
+from sphinx import addnodes
+from sphinx.util import inspect
+from sphinx.util.typing import stringify_annotation
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element
+
+ from sphinx.application import Sphinx
+
+
+def record_typehints(app: Sphinx, objtype: str, name: str, obj: Any,
+ options: dict, args: str, retann: str) -> None:
+ """Record type hints to env object."""
+ if app.config.autodoc_typehints_format == 'short':
+ mode = 'smart'
+ else:
+ mode = 'fully-qualified'
+
+ try:
+ if callable(obj):
+ annotations = app.env.temp_data.setdefault('annotations', {})
+ annotation = annotations.setdefault(name, {})
+ sig = inspect.signature(obj, type_aliases=app.config.autodoc_type_aliases)
+ for param in sig.parameters.values():
+ if param.annotation is not param.empty:
+ annotation[param.name] = stringify_annotation(param.annotation, mode)
+ if sig.return_annotation is not sig.empty:
+ annotation['return'] = stringify_annotation(sig.return_annotation, mode)
+ except (TypeError, ValueError):
+ pass
+
+
+def merge_typehints(app: Sphinx, domain: str, objtype: str, contentnode: Element) -> None:
+ if domain != 'py':
+ return
+ if app.config.autodoc_typehints not in ('both', 'description'):
+ return
+
+ try:
+ signature = cast(addnodes.desc_signature, contentnode.parent[0])
+ if signature['module']:
+ fullname = '.'.join([signature['module'], signature['fullname']])
+ else:
+ fullname = signature['fullname']
+ except KeyError:
+ # signature node does not have valid context info for the target object
+ return
+
+ annotations = app.env.temp_data.get('annotations', {})
+ if annotations.get(fullname, {}):
+ field_lists = [n for n in contentnode if isinstance(n, nodes.field_list)]
+ if field_lists == []:
+ field_list = insert_field_list(contentnode)
+ field_lists.append(field_list)
+
+ for field_list in field_lists:
+ if app.config.autodoc_typehints_description_target == "all":
+ if objtype == 'class':
+ modify_field_list(field_list, annotations[fullname], suppress_rtype=True)
+ else:
+ modify_field_list(field_list, annotations[fullname])
+ elif app.config.autodoc_typehints_description_target == "documented_params":
+ augment_descriptions_with_types(
+ field_list, annotations[fullname], force_rtype=True,
+ )
+ else:
+ augment_descriptions_with_types(
+ field_list, annotations[fullname], force_rtype=False,
+ )
+
+
+def insert_field_list(node: Element) -> nodes.field_list:
+ field_list = nodes.field_list()
+ desc = [n for n in node if isinstance(n, addnodes.desc)]
+ if desc:
+ # insert just before sub object descriptions (ex. methods, nested classes, etc.)
+ index = node.index(desc[0])
+ node.insert(index - 1, [field_list])
+ else:
+ node += field_list
+
+ return field_list
+
+
+def modify_field_list(node: nodes.field_list, annotations: dict[str, str],
+ suppress_rtype: bool = False) -> None:
+ arguments: dict[str, dict[str, bool]] = {}
+ fields = cast(Iterable[nodes.field], node)
+ for field in fields:
+ field_name = field[0].astext()
+ parts = re.split(' +', field_name)
+ if parts[0] == 'param':
+ if len(parts) == 2:
+ # :param xxx:
+ arg = arguments.setdefault(parts[1], {})
+ arg['param'] = True
+ elif len(parts) > 2:
+ # :param xxx yyy:
+ name = ' '.join(parts[2:])
+ arg = arguments.setdefault(name, {})
+ arg['param'] = True
+ arg['type'] = True
+ elif parts[0] == 'type':
+ name = ' '.join(parts[1:])
+ arg = arguments.setdefault(name, {})
+ arg['type'] = True
+ elif parts[0] == 'rtype':
+ arguments['return'] = {'type': True}
+
+ for name, annotation in annotations.items():
+ if name == 'return':
+ continue
+
+ if '*' + name in arguments:
+ name = '*' + name
+ arguments.get(name)
+ elif '**' + name in arguments:
+ name = '**' + name
+ arguments.get(name)
+ else:
+ arg = arguments.get(name, {})
+
+ if not arg.get('type'):
+ field = nodes.field()
+ field += nodes.field_name('', 'type ' + name)
+ field += nodes.field_body('', nodes.paragraph('', annotation))
+ node += field
+ if not arg.get('param'):
+ field = nodes.field()
+ field += nodes.field_name('', 'param ' + name)
+ field += nodes.field_body('', nodes.paragraph('', ''))
+ node += field
+
+ if 'return' in annotations and 'return' not in arguments:
+ annotation = annotations['return']
+ if annotation == 'None' and suppress_rtype:
+ return
+
+ field = nodes.field()
+ field += nodes.field_name('', 'rtype')
+ field += nodes.field_body('', nodes.paragraph('', annotation))
+ node += field
+
+
+def augment_descriptions_with_types(
+ node: nodes.field_list,
+ annotations: dict[str, str],
+ force_rtype: bool,
+) -> None:
+ fields = cast(Iterable[nodes.field], node)
+ has_description: set[str] = set()
+ has_type: set[str] = set()
+ for field in fields:
+ field_name = field[0].astext()
+ parts = re.split(' +', field_name)
+ if parts[0] == 'param':
+ if len(parts) == 2:
+ # :param xxx:
+ has_description.add(parts[1])
+ elif len(parts) > 2:
+ # :param xxx yyy:
+ name = ' '.join(parts[2:])
+ has_description.add(name)
+ has_type.add(name)
+ elif parts[0] == 'type':
+ name = ' '.join(parts[1:])
+ has_type.add(name)
+ elif parts[0] in ('return', 'returns'):
+ has_description.add('return')
+ elif parts[0] == 'rtype':
+ has_type.add('return')
+
+ # Add 'type' for parameters with a description but no declared type.
+ for name, annotation in annotations.items():
+ if name in ('return', 'returns'):
+ continue
+
+ if '*' + name in has_description:
+ name = '*' + name
+ elif '**' + name in has_description:
+ name = '**' + name
+
+ if name in has_description and name not in has_type:
+ field = nodes.field()
+ field += nodes.field_name('', 'type ' + name)
+ field += nodes.field_body('', nodes.paragraph('', annotation))
+ node += field
+
+ # Add 'rtype' if 'return' is present and 'rtype' isn't.
+ if 'return' in annotations:
+ rtype = annotations['return']
+ if 'return' not in has_type and ('return' in has_description or
+ (force_rtype and rtype != "None")):
+ field = nodes.field()
+ field += nodes.field_name('', 'rtype')
+ field += nodes.field_body('', nodes.paragraph('', rtype))
+ node += field
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.connect('autodoc-process-signature', record_typehints)
+ app.connect('object-description-transform', merge_typehints)
+
+ return {
+ 'version': sphinx.__display_version__,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/ext/autosectionlabel.py b/sphinx/ext/autosectionlabel.py
new file mode 100644
index 0000000..d423fcc
--- /dev/null
+++ b/sphinx/ext/autosectionlabel.py
@@ -0,0 +1,69 @@
+"""Allow reference sections by :ref: role using its title."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+
+import sphinx
+from sphinx.domains.std import StandardDomain
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.nodes import clean_astext
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+def get_node_depth(node: Node) -> int:
+ i = 0
+ cur_node = node
+ while cur_node.parent != node.document:
+ cur_node = cur_node.parent
+ i += 1
+ return i
+
+
+def register_sections_as_label(app: Sphinx, document: Node) -> None:
+ domain = cast(StandardDomain, app.env.get_domain('std'))
+ for node in document.findall(nodes.section):
+ if (app.config.autosectionlabel_maxdepth and
+ get_node_depth(node) >= app.config.autosectionlabel_maxdepth):
+ continue
+ labelid = node['ids'][0]
+ docname = app.env.docname
+ title = cast(nodes.title, node[0])
+ ref_name = getattr(title, 'rawsource', title.astext())
+ if app.config.autosectionlabel_prefix_document:
+ name = nodes.fully_normalize_name(docname + ':' + ref_name)
+ else:
+ name = nodes.fully_normalize_name(ref_name)
+ sectname = clean_astext(title)
+
+ logger.debug(__('section "%s" gets labeled as "%s"'),
+ ref_name, name,
+ location=node, type='autosectionlabel', subtype=docname)
+ if name in domain.labels:
+ logger.warning(__('duplicate label %s, other instance in %s'),
+ name, app.env.doc2path(domain.labels[name][0]),
+ location=node, type='autosectionlabel', subtype=docname)
+
+ domain.anonlabels[name] = docname, labelid
+ domain.labels[name] = docname, labelid, sectname
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_config_value('autosectionlabel_prefix_document', False, 'env')
+ app.add_config_value('autosectionlabel_maxdepth', None, 'env')
+ app.connect('doctree-read', register_sections_as_label)
+
+ return {
+ 'version': sphinx.__display_version__,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py
new file mode 100644
index 0000000..edb8f0d
--- /dev/null
+++ b/sphinx/ext/autosummary/__init__.py
@@ -0,0 +1,847 @@
+"""Extension that adds an autosummary:: directive.
+
+The directive can be used to generate function/method/attribute/etc. summary
+lists, similar to those output eg. by Epydoc and other API doc generation tools.
+
+An :autolink: role is also provided.
+
+autosummary directive
+---------------------
+
+The autosummary directive has the form::
+
+ .. autosummary::
+ :nosignatures:
+ :toctree: generated/
+
+ module.function_1
+ module.function_2
+ ...
+
+and it generates an output table (containing signatures, optionally)
+
+ ======================== =============================================
+ module.function_1(args) Summary line from the docstring of function_1
+ module.function_2(args) Summary line from the docstring
+ ...
+ ======================== =============================================
+
+If the :toctree: option is specified, files matching the function names
+are inserted to the toctree with the given prefix:
+
+ generated/module.function_1
+ generated/module.function_2
+ ...
+
+Note: The file names contain the module:: or currentmodule:: prefixes.
+
+.. seealso:: autosummary_generate.py
+
+
+autolink role
+-------------
+
+The autolink role functions as ``:obj:`` when the name referred can be
+resolved to a Python object, and otherwise it becomes simple emphasis.
+This can be used as the default role to make links 'smart'.
+"""
+
+from __future__ import annotations
+
+import inspect
+import os
+import posixpath
+import re
+import sys
+from inspect import Parameter
+from os import path
+from types import ModuleType
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.states import RSTStateMachine, Struct, state_classes
+from docutils.statemachine import StringList
+
+import sphinx
+from sphinx import addnodes
+from sphinx.config import Config
+from sphinx.environment import BuildEnvironment
+from sphinx.ext.autodoc import INSTANCEATTR, Documenter
+from sphinx.ext.autodoc.directive import DocumenterBridge, Options
+from sphinx.ext.autodoc.importer import import_module
+from sphinx.ext.autodoc.mock import mock
+from sphinx.locale import __
+from sphinx.project import Project
+from sphinx.pycode import ModuleAnalyzer, PycodeError
+from sphinx.registry import SphinxComponentRegistry
+from sphinx.util import logging, rst
+from sphinx.util.docutils import (
+ NullReporter,
+ SphinxDirective,
+ SphinxRole,
+ new_document,
+ switch_source_input,
+)
+from sphinx.util.inspect import getmro, signature_from_str
+from sphinx.util.matching import Matcher
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from docutils.nodes import Node, system_message
+
+ from sphinx.application import Sphinx
+ from sphinx.extension import Extension
+ from sphinx.util.typing import OptionSpec
+ from sphinx.writers.html import HTML5Translator
+
+logger = logging.getLogger(__name__)
+
+
+periods_re = re.compile(r'\.(?:\s+)')
+literal_re = re.compile(r'::\s*$')
+
+WELL_KNOWN_ABBREVIATIONS = ('et al.', 'e.g.', 'i.e.')
+
+
+# -- autosummary_toc node ------------------------------------------------------
+
+class autosummary_toc(nodes.comment):
+ pass
+
+
+def autosummary_toc_visit_html(self: nodes.NodeVisitor, node: autosummary_toc) -> None:
+ """Hide autosummary toctree list in HTML output."""
+ raise nodes.SkipNode
+
+
+def autosummary_noop(self: nodes.NodeVisitor, node: Node) -> None:
+ pass
+
+
+# -- autosummary_table node ----------------------------------------------------
+
+class autosummary_table(nodes.comment):
+ pass
+
+
+def autosummary_table_visit_html(self: HTML5Translator, node: autosummary_table) -> None:
+ """Make the first column of the table non-breaking."""
+ try:
+ table = cast(nodes.table, node[0])
+ tgroup = cast(nodes.tgroup, table[0])
+ tbody = cast(nodes.tbody, tgroup[-1])
+ rows = cast(list[nodes.row], tbody)
+ for row in rows:
+ col1_entry = cast(nodes.entry, row[0])
+ par = cast(nodes.paragraph, col1_entry[0])
+ for j, subnode in enumerate(list(par)):
+ if isinstance(subnode, nodes.Text):
+ new_text = subnode.astext().replace(" ", "\u00a0")
+ par[j] = nodes.Text(new_text)
+ except IndexError:
+ pass
+
+
+# -- autodoc integration -------------------------------------------------------
+
+class FakeApplication:
+ def __init__(self) -> None:
+ self.doctreedir = None
+ self.events = None
+ self.extensions: dict[str, Extension] = {}
+ self.srcdir = None
+ self.config = Config()
+ self.project = Project('', {})
+ self.registry = SphinxComponentRegistry()
+
+
+class FakeDirective(DocumenterBridge):
+ def __init__(self) -> None:
+ settings = Struct(tab_width=8)
+ document = Struct(settings=settings)
+ app = FakeApplication()
+ app.config.add('autodoc_class_signature', 'mixed', True, None)
+ env = BuildEnvironment(app) # type: ignore[arg-type]
+ state = Struct(document=document)
+ super().__init__(env, None, Options(), 0, state)
+
+
+def get_documenter(app: Sphinx, obj: Any, parent: Any) -> type[Documenter]:
+ """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.
+ """
+ from sphinx.ext.autodoc import 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(app, 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 correct documenter class for *obj*
+ classes = [cls for cls in app.registry.documenters.values()
+ if cls.can_document_member(obj, '', False, parent_doc)]
+ if classes:
+ classes.sort(key=lambda cls: cls.priority)
+ return classes[-1]
+ else:
+ return DataDocumenter
+
+
+# -- .. autosummary:: ----------------------------------------------------------
+
+class Autosummary(SphinxDirective):
+ """
+ Pretty table containing short signatures and summaries of functions etc.
+
+ autosummary can also optionally generate a hidden toctree:: node.
+ """
+
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = False
+ has_content = True
+ option_spec: OptionSpec = {
+ 'caption': directives.unchanged_required,
+ 'toctree': directives.unchanged,
+ 'nosignatures': directives.flag,
+ 'recursive': directives.flag,
+ 'template': directives.unchanged,
+ }
+
+ def run(self) -> list[Node]:
+ self.bridge = DocumenterBridge(self.env, self.state.document.reporter,
+ Options(), self.lineno, self.state)
+
+ names = [x.strip().split()[0] for x in self.content
+ if x.strip() and re.search(r'^[~a-zA-Z_]', x.strip()[0])]
+ items = self.get_items(names)
+ nodes = self.get_table(items)
+
+ if 'toctree' in self.options:
+ dirname = posixpath.dirname(self.env.docname)
+
+ tree_prefix = self.options['toctree'].strip()
+ docnames = []
+ excluded = Matcher(self.config.exclude_patterns)
+ filename_map = self.config.autosummary_filename_map
+ for _name, _sig, _summary, real_name in items:
+ real_name = filename_map.get(real_name, real_name)
+ docname = posixpath.join(tree_prefix, real_name)
+ docname = posixpath.normpath(posixpath.join(dirname, docname))
+ if docname not in self.env.found_docs:
+ if excluded(self.env.doc2path(docname, False)):
+ msg = __('autosummary references excluded document %r. Ignored.')
+ else:
+ msg = __('autosummary: stub file not found %r. '
+ 'Check your autosummary_generate setting.')
+
+ logger.warning(msg, real_name, location=self.get_location())
+ continue
+
+ docnames.append(docname)
+
+ if docnames:
+ tocnode = addnodes.toctree()
+ tocnode['includefiles'] = docnames
+ tocnode['entries'] = [(None, docn) for docn in docnames]
+ tocnode['maxdepth'] = -1
+ tocnode['glob'] = None
+ tocnode['caption'] = self.options.get('caption')
+
+ nodes.append(autosummary_toc('', '', tocnode))
+
+ if 'toctree' not in self.options and 'caption' in self.options:
+ logger.warning(__('A captioned autosummary requires :toctree: option. ignored.'),
+ location=nodes[-1])
+
+ return nodes
+
+ def import_by_name(
+ self, name: str, prefixes: list[str | None],
+ ) -> tuple[str, Any, Any, str]:
+ with mock(self.config.autosummary_mock_imports):
+ try:
+ return import_by_name(name, prefixes)
+ except ImportExceptionGroup as exc:
+ # check existence of instance attribute
+ try:
+ return import_ivar_by_name(name, prefixes)
+ except ImportError as exc2:
+ if exc2.__cause__:
+ errors: list[BaseException] = exc.exceptions + [exc2.__cause__]
+ else:
+ errors = exc.exceptions + [exc2]
+
+ raise ImportExceptionGroup(exc.args[0], errors) from None
+
+ def create_documenter(self, app: Sphinx, obj: Any,
+ parent: Any, full_name: str) -> Documenter:
+ """Get an autodoc.Documenter class suitable for documenting the given
+ object.
+
+ Wraps get_documenter and is meant as a hook for extensions.
+ """
+ doccls = get_documenter(app, obj, parent)
+ return doccls(self.bridge, full_name)
+
+ def get_items(self, names: list[str]) -> list[tuple[str, str, str, str]]:
+ """Try to import the given names, and return a list of
+ ``[(name, signature, summary_string, real_name), ...]``.
+ """
+ prefixes = get_import_prefixes_from_env(self.env)
+
+ items: list[tuple[str, str, str, str]] = []
+
+ max_item_chars = 50
+
+ for name in names:
+ display_name = name
+ if name.startswith('~'):
+ name = name[1:]
+ display_name = name.split('.')[-1]
+
+ try:
+ real_name, obj, parent, modname = self.import_by_name(name, prefixes=prefixes)
+ except ImportExceptionGroup as exc:
+ errors = list({f"* {type(e).__name__}: {e}" for e in exc.exceptions})
+ logger.warning(__('autosummary: failed to import %s.\nPossible hints:\n%s'),
+ name, '\n'.join(errors), location=self.get_location())
+ continue
+
+ self.bridge.result = StringList() # initialize for each documenter
+ full_name = real_name
+ if not isinstance(obj, ModuleType):
+ # give explicitly separated module name, so that members
+ # of inner classes can be documented
+ full_name = modname + '::' + full_name[len(modname) + 1:]
+ # NB. using full_name here is important, since Documenters
+ # handle module prefixes slightly differently
+ documenter = self.create_documenter(self.env.app, obj, parent, full_name)
+ if not documenter.parse_name():
+ logger.warning(__('failed to parse name %s'), real_name,
+ location=self.get_location())
+ items.append((display_name, '', '', real_name))
+ continue
+ if not documenter.import_object():
+ logger.warning(__('failed to import object %s'), real_name,
+ location=self.get_location())
+ items.append((display_name, '', '', real_name))
+ continue
+
+ # try to also get a source code analyzer for attribute docs
+ try:
+ documenter.analyzer = ModuleAnalyzer.for_module(
+ documenter.get_real_modname())
+ # parse right now, to get PycodeErrors on parsing (results will
+ # be cached anyway)
+ documenter.analyzer.find_attr_docs()
+ except PycodeError as err:
+ logger.debug('[autodoc] module analyzer failed: %s', err)
+ # no source file -- e.g. for builtin and C modules
+ documenter.analyzer = None
+
+ # -- Grab the signature
+
+ try:
+ sig = documenter.format_signature(show_annotation=False)
+ except TypeError:
+ # the documenter does not support ``show_annotation`` option
+ sig = documenter.format_signature()
+
+ if not sig:
+ sig = ''
+ else:
+ max_chars = max(10, max_item_chars - len(display_name))
+ sig = mangle_signature(sig, max_chars=max_chars)
+
+ # -- Grab the summary
+
+ # bodge for ModuleDocumenter
+ documenter._extra_indent = '' # type: ignore[attr-defined]
+
+ documenter.add_content(None)
+ summary = extract_summary(self.bridge.result.data[:], self.state.document)
+
+ items.append((display_name, sig, summary, real_name))
+
+ return items
+
+ def get_table(self, items: list[tuple[str, str, str, str]]) -> list[Node]:
+ """Generate a proper list of table nodes for autosummary:: directive.
+
+ *items* is a list produced by :meth:`get_items`.
+ """
+ table_spec = addnodes.tabular_col_spec()
+ table_spec['spec'] = r'\X{1}{2}\X{1}{2}'
+
+ table = autosummary_table('')
+ real_table = nodes.table('', classes=['autosummary longtable'])
+ table.append(real_table)
+ group = nodes.tgroup('', cols=2)
+ real_table.append(group)
+ group.append(nodes.colspec('', colwidth=10))
+ group.append(nodes.colspec('', colwidth=90))
+ body = nodes.tbody('')
+ group.append(body)
+
+ def append_row(*column_texts: str) -> None:
+ row = nodes.row('')
+ source, line = self.state_machine.get_source_and_line()
+ for text in column_texts:
+ node = nodes.paragraph('')
+ vl = StringList()
+ vl.append(text, '%s:%d:<autosummary>' % (source, line))
+ with switch_source_input(self.state, vl):
+ self.state.nested_parse(vl, 0, node)
+ try:
+ if isinstance(node[0], nodes.paragraph):
+ node = node[0]
+ except IndexError:
+ pass
+ row.append(nodes.entry('', node))
+ body.append(row)
+
+ for name, sig, summary, real_name in items:
+ qualifier = 'obj'
+ if 'nosignatures' not in self.options:
+ col1 = f':py:{qualifier}:`{name} <{real_name}>`\\ {rst.escape(sig)}'
+ else:
+ col1 = f':py:{qualifier}:`{name} <{real_name}>`'
+ col2 = summary
+ append_row(col1, col2)
+
+ return [table_spec, table]
+
+
+def strip_arg_typehint(s: str) -> str:
+ """Strip a type hint from argument definition."""
+ return s.split(':')[0].strip()
+
+
+def _cleanup_signature(s: str) -> str:
+ """Clean up signature using inspect.signautre() for mangle_signature()"""
+ try:
+ sig = signature_from_str(s)
+ parameters = list(sig.parameters.values())
+ for i, param in enumerate(parameters):
+ if param.annotation is not Parameter.empty:
+ # Remove typehints
+ param = param.replace(annotation=Parameter.empty)
+ if param.default is not Parameter.empty:
+ # Replace default value by "None"
+ param = param.replace(default=None)
+ parameters[i] = param
+ sig = sig.replace(parameters=parameters, return_annotation=Parameter.empty)
+ return str(sig)
+ except Exception:
+ # Return the original signature string if failed to clean (ex. parsing error)
+ return s
+
+
+def mangle_signature(sig: str, max_chars: int = 30) -> str:
+ """Reformat a function signature to a more compact form."""
+ s = _cleanup_signature(sig)
+
+ # Strip return type annotation
+ s = re.sub(r"\)\s*->\s.*$", ")", s)
+
+ # Remove parenthesis
+ s = re.sub(r"^\((.*)\)$", r"\1", s).strip()
+
+ # Strip literals (which can contain things that confuse the code below)
+ s = re.sub(r"\\\\", "", s) # escaped backslash (maybe inside string)
+ s = re.sub(r"\\'", "", s) # escaped single quote
+ s = re.sub(r'\\"', "", s) # escaped double quote
+ s = re.sub(r"'[^']*'", "", s) # string literal (w/ single quote)
+ s = re.sub(r'"[^"]*"', "", s) # string literal (w/ double quote)
+
+ # Strip complex objects (maybe default value of arguments)
+ while re.search(r'\([^)]*\)', s): # contents of parenthesis (ex. NamedTuple(attr=...))
+ s = re.sub(r'\([^)]*\)', '', s)
+ while re.search(r'<[^>]*>', s): # contents of angle brackets (ex. <object>)
+ s = re.sub(r'<[^>]*>', '', s)
+ while re.search(r'{[^}]*}', s): # contents of curly brackets (ex. dict)
+ s = re.sub(r'{[^}]*}', '', s)
+
+ # Parse the signature to arguments + options
+ args: list[str] = []
+ opts: list[str] = []
+
+ opt_re = re.compile(r"^(.*, |)([a-zA-Z0-9_*]+)\s*=\s*")
+ while s:
+ m = opt_re.search(s)
+ if not m:
+ # The rest are arguments
+ args = s.split(', ')
+ break
+
+ opts.insert(0, m.group(2))
+ s = m.group(1)[:-2]
+
+ # Strip typehints
+ for i, arg in enumerate(args):
+ args[i] = strip_arg_typehint(arg)
+
+ for i, opt in enumerate(opts):
+ opts[i] = strip_arg_typehint(opt)
+
+ # Produce a more compact signature
+ sig = limited_join(", ", args, max_chars=max_chars - 2)
+ if opts:
+ if not sig:
+ sig = "[%s]" % limited_join(", ", opts, max_chars=max_chars - 4)
+ elif len(sig) < max_chars - 4 - 2 - 3:
+ sig += "[, %s]" % limited_join(", ", opts,
+ max_chars=max_chars - len(sig) - 4 - 2)
+
+ return "(%s)" % sig
+
+
+def extract_summary(doc: list[str], document: Any) -> str:
+ """Extract summary from docstring."""
+ def parse(doc: list[str], settings: Any) -> nodes.document:
+ state_machine = RSTStateMachine(state_classes, 'Body')
+ node = new_document('', settings)
+ node.reporter = NullReporter()
+ state_machine.run(doc, node)
+
+ return node
+
+ # Skip a blank lines at the top
+ while doc and not doc[0].strip():
+ doc.pop(0)
+
+ # If there's a blank line, then we can assume the first sentence /
+ # paragraph has ended, so anything after shouldn't be part of the
+ # summary
+ for i, piece in enumerate(doc):
+ if not piece.strip():
+ doc = doc[:i]
+ break
+
+ if doc == []:
+ return ''
+
+ # parse the docstring
+ node = parse(doc, document.settings)
+ if isinstance(node[0], nodes.section):
+ # document starts with a section heading, so use that.
+ summary = node[0].astext().strip()
+ elif not isinstance(node[0], nodes.paragraph):
+ # document starts with non-paragraph: pick up the first line
+ summary = doc[0].strip()
+ else:
+ # Try to find the "first sentence", which may span multiple lines
+ sentences = periods_re.split(" ".join(doc))
+ if len(sentences) == 1:
+ summary = sentences[0].strip()
+ else:
+ summary = ''
+ for i in range(len(sentences)):
+ summary = ". ".join(sentences[:i + 1]).rstrip(".") + "."
+ node[:] = []
+ node = parse(doc, document.settings)
+ if summary.endswith(WELL_KNOWN_ABBREVIATIONS):
+ pass
+ elif not any(node.findall(nodes.system_message)):
+ # considered as that splitting by period does not break inline markups
+ break
+
+ # strip literal notation mark ``::`` from tail of summary
+ summary = literal_re.sub('.', summary)
+
+ return summary
+
+
+def limited_join(sep: str, items: list[str], max_chars: int = 30,
+ overflow_marker: str = "...") -> str:
+ """Join a number of strings into one, limiting the length to *max_chars*.
+
+ If the string overflows this limit, replace the last fitting item by
+ *overflow_marker*.
+
+ Returns: joined_string
+ """
+ full_str = sep.join(items)
+ if len(full_str) < max_chars:
+ return full_str
+
+ n_chars = 0
+ n_items = 0
+ for item in items:
+ n_chars += len(item) + len(sep)
+ if n_chars < max_chars - len(overflow_marker):
+ n_items += 1
+ else:
+ break
+
+ return sep.join(list(items[:n_items]) + [overflow_marker])
+
+
+# -- Importing items -----------------------------------------------------------
+
+
+class ImportExceptionGroup(Exception):
+ """Exceptions raised during importing the target objects.
+
+ It contains an error messages and a list of exceptions as its arguments.
+ """
+
+ def __init__(self, message: str | None, exceptions: Sequence[BaseException]):
+ super().__init__(message)
+ self.exceptions = list(exceptions)
+
+
+def get_import_prefixes_from_env(env: BuildEnvironment) -> list[str | None]:
+ """
+ Obtain current Python import prefixes (for `import_by_name`)
+ from ``document.env``
+ """
+ prefixes: list[str | None] = [None]
+
+ currmodule = env.ref_context.get('py:module')
+ if currmodule:
+ prefixes.insert(0, currmodule)
+
+ currclass = env.ref_context.get('py:class')
+ if currclass:
+ if currmodule:
+ prefixes.insert(0, currmodule + "." + currclass)
+ else:
+ prefixes.insert(0, currclass)
+
+ return prefixes
+
+
+def import_by_name(
+ name: str, prefixes: Sequence[str | None] = (None,),
+) -> tuple[str, Any, Any, str]:
+ """Import a Python object that has the given *name*, under one of the
+ *prefixes*. The first name that succeeds is used.
+ """
+ tried = []
+ errors: list[ImportExceptionGroup] = []
+ for prefix in prefixes:
+ try:
+ if prefix:
+ prefixed_name = '.'.join([prefix, name])
+ else:
+ prefixed_name = name
+ obj, parent, modname = _import_by_name(prefixed_name, grouped_exception=True)
+ return prefixed_name, obj, parent, modname
+ except ImportError:
+ tried.append(prefixed_name)
+ except ImportExceptionGroup as exc:
+ tried.append(prefixed_name)
+ errors.append(exc)
+
+ exceptions: list[BaseException] = sum((e.exceptions for e in errors), [])
+ raise ImportExceptionGroup('no module named %s' % ' or '.join(tried), exceptions)
+
+
+def _import_by_name(name: str, grouped_exception: bool = True) -> tuple[Any, Any, str]:
+ """Import a Python object given its full name."""
+ errors: list[BaseException] = []
+
+ try:
+ name_parts = name.split('.')
+
+ # try first interpret `name` as MODNAME.OBJ
+ modname = '.'.join(name_parts[:-1])
+ if modname:
+ try:
+ mod = import_module(modname)
+ return getattr(mod, name_parts[-1]), mod, modname
+ except (ImportError, IndexError, AttributeError) as exc:
+ errors.append(exc.__cause__ or exc)
+
+ # ... then as MODNAME, MODNAME.OBJ1, MODNAME.OBJ1.OBJ2, ...
+ last_j = 0
+ modname = ''
+ for j in reversed(range(1, len(name_parts) + 1)):
+ last_j = j
+ modname = '.'.join(name_parts[:j])
+ try:
+ import_module(modname)
+ except ImportError as exc:
+ errors.append(exc.__cause__ or exc)
+
+ if modname in sys.modules:
+ break
+
+ if last_j < len(name_parts):
+ parent = None
+ obj = sys.modules[modname]
+ for obj_name in name_parts[last_j:]:
+ parent = obj
+ obj = getattr(obj, obj_name)
+ return obj, parent, modname
+ else:
+ return sys.modules[modname], None, modname
+ except (ValueError, ImportError, AttributeError, KeyError) as exc:
+ errors.append(exc)
+ if grouped_exception:
+ raise ImportExceptionGroup('', errors) from None # NoQA: EM101
+ else:
+ raise ImportError(*exc.args) from exc
+
+
+def import_ivar_by_name(name: str, prefixes: Sequence[str | None] = (None,),
+ grouped_exception: bool = True) -> tuple[str, Any, Any, str]:
+ """Import an instance variable that has the given *name*, under one of the
+ *prefixes*. The first name that succeeds is used.
+ """
+ try:
+ name, attr = name.rsplit(".", 1)
+ real_name, obj, parent, modname = import_by_name(name, prefixes)
+
+ # Get ancestors of the object (class.__mro__ includes the class itself as
+ # the first entry)
+ candidate_objects = getmro(obj)
+ if len(candidate_objects) == 0:
+ candidate_objects = (obj,)
+
+ for candidate_obj in candidate_objects:
+ analyzer = ModuleAnalyzer.for_module(getattr(candidate_obj, '__module__', modname))
+ analyzer.analyze()
+ # check for presence in `annotations` to include dataclass attributes
+ found_attrs = set()
+ found_attrs |= {attr for (qualname, attr) in analyzer.attr_docs}
+ found_attrs |= {attr for (qualname, attr) in analyzer.annotations}
+ if attr in found_attrs:
+ return real_name + "." + attr, INSTANCEATTR, obj, modname
+ except (ImportError, ValueError, PycodeError) as exc:
+ raise ImportError from exc
+ except ImportExceptionGroup:
+ raise # pass through it as is
+
+ raise ImportError
+
+
+# -- :autolink: (smart default role) -------------------------------------------
+
+class AutoLink(SphinxRole):
+ """Smart linking role.
+
+ Expands to ':obj:`text`' if `text` is an object that can be imported;
+ otherwise expands to '*text*'.
+ """
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ pyobj_role = self.env.get_domain('py').role('obj')
+ assert pyobj_role is not None
+ objects, errors = pyobj_role('obj', self.rawtext, self.text, self.lineno,
+ self.inliner, self.options, self.content)
+ if errors:
+ return objects, errors
+
+ assert len(objects) == 1
+ pending_xref = cast(addnodes.pending_xref, objects[0])
+ try:
+ # try to import object by name
+ prefixes = get_import_prefixes_from_env(self.env)
+ import_by_name(pending_xref['reftarget'], prefixes)
+ except ImportExceptionGroup:
+ literal = cast(nodes.literal, pending_xref[0])
+ objects[0] = nodes.emphasis(self.rawtext, literal.astext(),
+ classes=literal['classes'])
+
+ return objects, errors
+
+
+def get_rst_suffix(app: Sphinx) -> str | None:
+ def get_supported_format(suffix: str) -> tuple[str, ...]:
+ parser_class = app.registry.get_source_parsers().get(suffix)
+ if parser_class is None:
+ return ('restructuredtext',)
+ return parser_class.supported
+
+ suffix = None
+ for suffix in app.config.source_suffix:
+ if 'restructuredtext' in get_supported_format(suffix):
+ return suffix
+
+ return None
+
+
+def process_generate_options(app: Sphinx) -> None:
+ genfiles = app.config.autosummary_generate
+
+ if genfiles is True:
+ env = app.builder.env
+ genfiles = [env.doc2path(x, base=False) for x in env.found_docs
+ if os.path.isfile(env.doc2path(x))]
+ elif genfiles is False:
+ pass
+ else:
+ ext = list(app.config.source_suffix)
+ genfiles = [genfile + (ext[0] if not genfile.endswith(tuple(ext)) else '')
+ for genfile in genfiles]
+
+ for entry in genfiles[:]:
+ if not path.isfile(path.join(app.srcdir, entry)):
+ logger.warning(__('autosummary_generate: file not found: %s'), entry)
+ genfiles.remove(entry)
+
+ if not genfiles:
+ return
+
+ suffix = get_rst_suffix(app)
+ if suffix is None:
+ logger.warning(__('autosummary generats .rst files internally. '
+ 'But your source_suffix does not contain .rst. Skipped.'))
+ return
+
+ from sphinx.ext.autosummary.generate import generate_autosummary_docs
+
+ imported_members = app.config.autosummary_imported_members
+ with mock(app.config.autosummary_mock_imports):
+ generate_autosummary_docs(genfiles, suffix=suffix, base_path=app.srcdir,
+ app=app, imported_members=imported_members,
+ overwrite=app.config.autosummary_generate_overwrite,
+ encoding=app.config.source_encoding)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ # I need autodoc
+ app.setup_extension('sphinx.ext.autodoc')
+ app.add_node(autosummary_toc,
+ html=(autosummary_toc_visit_html, autosummary_noop),
+ latex=(autosummary_noop, autosummary_noop),
+ text=(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),
+ texinfo=(autosummary_noop, autosummary_noop))
+ app.add_directive('autosummary', Autosummary)
+ app.add_role('autolink', AutoLink())
+ app.connect('builder-inited', process_generate_options)
+ app.add_config_value('autosummary_context', {}, True)
+ app.add_config_value('autosummary_filename_map', {}, 'html')
+ app.add_config_value('autosummary_generate', True, True, [bool, list])
+ app.add_config_value('autosummary_generate_overwrite', True, False)
+ app.add_config_value('autosummary_mock_imports',
+ lambda config: config.autodoc_mock_imports, 'env')
+ app.add_config_value('autosummary_imported_members', [], False, [bool])
+ app.add_config_value('autosummary_ignore_module_all', True, 'env', bool)
+
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/autosummary/generate.py b/sphinx/ext/autosummary/generate.py
new file mode 100644
index 0000000..06814f9
--- /dev/null
+++ b/sphinx/ext/autosummary/generate.py
@@ -0,0 +1,754 @@
+"""Generates reST source files for autosummary.
+
+Usable as a library or script to generate automatic RST source files for
+items referred to in autosummary:: directives.
+
+Each generated RST file contains a single auto*:: directive which
+extracts the docstring of the referred item.
+
+Example Makefile rule::
+
+ generate:
+ sphinx-autogen -o source/generated source/*.rst
+"""
+
+from __future__ import annotations
+
+import argparse
+import importlib
+import inspect
+import locale
+import os
+import pkgutil
+import pydoc
+import re
+import sys
+from os import path
+from typing import TYPE_CHECKING, Any, NamedTuple
+
+from jinja2 import TemplateNotFound
+from jinja2.sandbox import SandboxedEnvironment
+
+import sphinx.locale
+from sphinx import __display_version__, package_dir
+from sphinx.builders import Builder
+from sphinx.config import Config
+from sphinx.ext.autodoc.importer import import_module
+from sphinx.ext.autosummary import (
+ ImportExceptionGroup,
+ get_documenter,
+ import_by_name,
+ import_ivar_by_name,
+)
+from sphinx.locale import __
+from sphinx.pycode import ModuleAnalyzer, PycodeError
+from sphinx.registry import SphinxComponentRegistry
+from sphinx.util import logging, rst
+from sphinx.util.inspect import getall, safe_getattr
+from sphinx.util.osutil import ensuredir
+from sphinx.util.template import SphinxTemplateLoader
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence, Set
+ from gettext import NullTranslations
+
+ from sphinx.application import Sphinx
+ from sphinx.ext.autodoc import Documenter
+
+logger = logging.getLogger(__name__)
+
+
+class DummyApplication:
+ """Dummy Application class for sphinx-autogen command."""
+
+ def __init__(self, translator: NullTranslations) -> None:
+ self.config = Config()
+ self.registry = SphinxComponentRegistry()
+ self.messagelog: list[str] = []
+ self.srcdir = "/"
+ self.translator = translator
+ self.verbosity = 0
+ self._warncount = 0
+ self.warningiserror = False
+
+ self.config.add('autosummary_context', {}, True, None)
+ self.config.add('autosummary_filename_map', {}, True, None)
+ self.config.add('autosummary_ignore_module_all', True, 'env', bool)
+ self.config.init_values()
+
+ def emit_firstresult(self, *args: Any) -> None:
+ pass
+
+
+class AutosummaryEntry(NamedTuple):
+ name: str
+ path: str | None
+ template: str
+ recursive: bool
+
+
+def setup_documenters(app: Any) -> None:
+ from sphinx.ext.autodoc import (
+ AttributeDocumenter,
+ ClassDocumenter,
+ DataDocumenter,
+ DecoratorDocumenter,
+ ExceptionDocumenter,
+ FunctionDocumenter,
+ MethodDocumenter,
+ ModuleDocumenter,
+ PropertyDocumenter,
+ )
+ documenters: list[type[Documenter]] = [
+ ModuleDocumenter, ClassDocumenter, ExceptionDocumenter, DataDocumenter,
+ FunctionDocumenter, MethodDocumenter,
+ AttributeDocumenter, DecoratorDocumenter, PropertyDocumenter,
+ ]
+ for documenter in documenters:
+ app.registry.add_documenter(documenter.objtype, documenter)
+
+
+def _underline(title: str, line: str = '=') -> str:
+ if '\n' in title:
+ msg = 'Can only underline single lines'
+ raise ValueError(msg)
+ return title + '\n' + line * len(title)
+
+
+class AutosummaryRenderer:
+ """A helper class for rendering."""
+
+ def __init__(self, app: Sphinx) -> None:
+ if isinstance(app, Builder):
+ msg = 'Expected a Sphinx application object!'
+ raise ValueError(msg)
+
+ system_templates_path = [os.path.join(package_dir, 'ext', 'autosummary', 'templates')]
+ loader = SphinxTemplateLoader(app.srcdir, app.config.templates_path,
+ system_templates_path)
+
+ self.env = SandboxedEnvironment(loader=loader)
+ self.env.filters['escape'] = rst.escape
+ self.env.filters['e'] = rst.escape
+ self.env.filters['underline'] = _underline
+
+ if app.translator:
+ self.env.add_extension("jinja2.ext.i18n")
+ self.env.install_gettext_translations(app.translator)
+
+ def render(self, template_name: str, context: dict) -> str:
+ """Render a template file."""
+ try:
+ template = self.env.get_template(template_name)
+ except TemplateNotFound:
+ try:
+ # objtype is given as template_name
+ template = self.env.get_template('autosummary/%s.rst' % template_name)
+ except TemplateNotFound:
+ # fallback to base.rst
+ template = self.env.get_template('autosummary/base.rst')
+
+ return template.render(context)
+
+
+def _split_full_qualified_name(name: str) -> tuple[str | None, str]:
+ """Split full qualified name to a pair of modname and qualname.
+
+ A qualname is an abbreviation for "Qualified name" introduced at PEP-3155
+ (https://peps.python.org/pep-3155/). It is a dotted path name
+ from the module top-level.
+
+ A "full" qualified name means a string containing both module name and
+ qualified name.
+
+ .. note:: This function actually imports the module to check its existence.
+ Therefore you need to mock 3rd party modules if needed before
+ calling this function.
+ """
+ parts = name.split('.')
+ for i, _part in enumerate(parts, 1):
+ try:
+ modname = ".".join(parts[:i])
+ importlib.import_module(modname)
+ except ImportError:
+ if parts[:i - 1]:
+ return ".".join(parts[:i - 1]), ".".join(parts[i - 1:])
+ else:
+ return None, ".".join(parts)
+ except IndexError:
+ pass
+
+ return name, ""
+
+
+# -- Generating output ---------------------------------------------------------
+
+
+class ModuleScanner:
+ def __init__(self, app: Any, obj: Any) -> None:
+ self.app = app
+ self.object = obj
+
+ def get_object_type(self, name: str, value: Any) -> str:
+ return get_documenter(self.app, value, self.object).objtype
+
+ def is_skipped(self, name: str, value: Any, objtype: str) -> bool:
+ try:
+ return self.app.emit_firstresult('autodoc-skip-member', objtype,
+ name, value, False, {})
+ except Exception as exc:
+ logger.warning(__('autosummary: failed to determine %r to be documented, '
+ 'the following exception was raised:\n%s'),
+ name, exc, type='autosummary')
+ return False
+
+ def scan(self, imported_members: bool) -> list[str]:
+ members = []
+ try:
+ analyzer = ModuleAnalyzer.for_module(self.object.__name__)
+ attr_docs = analyzer.find_attr_docs()
+ except PycodeError:
+ attr_docs = {}
+
+ for name in members_of(self.object, self.app.config):
+ try:
+ value = safe_getattr(self.object, name)
+ except AttributeError:
+ value = None
+
+ objtype = self.get_object_type(name, value)
+ if self.is_skipped(name, value, objtype):
+ continue
+
+ try:
+ if ('', name) in attr_docs:
+ imported = False
+ elif inspect.ismodule(value): # NoQA: SIM114
+ imported = True
+ elif safe_getattr(value, '__module__') != self.object.__name__:
+ imported = True
+ else:
+ imported = False
+ except AttributeError:
+ imported = False
+
+ respect_module_all = not self.app.config.autosummary_ignore_module_all
+ if (
+ # list all members up
+ imported_members
+ # list not-imported members
+ or imported is False
+ # list members that have __all__ set
+ or (respect_module_all and '__all__' in dir(self.object))
+ ):
+ members.append(name)
+
+ return members
+
+
+def members_of(obj: Any, conf: Config) -> Sequence[str]:
+ """Get the members of ``obj``, possibly ignoring the ``__all__`` module attribute
+
+ Follows the ``conf.autosummary_ignore_module_all`` setting."""
+
+ if conf.autosummary_ignore_module_all:
+ return dir(obj)
+ else:
+ return getall(obj) or dir(obj)
+
+
+def generate_autosummary_content(name: str, obj: Any, parent: Any,
+ template: AutosummaryRenderer, template_name: str,
+ imported_members: bool, app: Any,
+ recursive: bool, context: dict,
+ modname: str | None = None,
+ qualname: str | None = None) -> str:
+ doc = get_documenter(app, obj, parent)
+
+ ns: dict[str, Any] = {}
+ ns.update(context)
+
+ if doc.objtype == 'module':
+ scanner = ModuleScanner(app, obj)
+ ns['members'] = scanner.scan(imported_members)
+
+ respect_module_all = not app.config.autosummary_ignore_module_all
+ imported_members = imported_members or ('__all__' in dir(obj) and respect_module_all)
+
+ ns['functions'], ns['all_functions'] = \
+ _get_members(doc, app, obj, {'function'}, imported=imported_members)
+ ns['classes'], ns['all_classes'] = \
+ _get_members(doc, app, obj, {'class'}, imported=imported_members)
+ ns['exceptions'], ns['all_exceptions'] = \
+ _get_members(doc, app, obj, {'exception'}, imported=imported_members)
+ ns['attributes'], ns['all_attributes'] = \
+ _get_module_attrs(name, ns['members'])
+ ispackage = hasattr(obj, '__path__')
+ if ispackage and recursive:
+ # Use members that are not modules as skip list, because it would then mean
+ # that module was overwritten in the package namespace
+ skip = (
+ ns["all_functions"]
+ + ns["all_classes"]
+ + ns["all_exceptions"]
+ + ns["all_attributes"]
+ )
+
+ # If respect_module_all and module has a __all__ attribute, first get
+ # modules that were explicitly imported. Next, find the rest with the
+ # get_modules method, but only put in "public" modules that are in the
+ # __all__ list
+ #
+ # Otherwise, use get_modules method normally
+ if respect_module_all and '__all__' in dir(obj):
+ imported_modules, all_imported_modules = \
+ _get_members(doc, app, obj, {'module'}, imported=True)
+ skip += all_imported_modules
+ imported_modules = [name + '.' + modname for modname in imported_modules]
+ all_imported_modules = \
+ [name + '.' + modname for modname in all_imported_modules]
+ public_members = getall(obj)
+ else:
+ imported_modules, all_imported_modules = [], []
+ public_members = None
+
+ modules, all_modules = _get_modules(obj, skip=skip, name=name,
+ public_members=public_members)
+ ns['modules'] = imported_modules + modules
+ ns["all_modules"] = all_imported_modules + all_modules
+ elif doc.objtype == 'class':
+ ns['members'] = dir(obj)
+ ns['inherited_members'] = \
+ set(dir(obj)) - set(obj.__dict__.keys())
+ ns['methods'], ns['all_methods'] = \
+ _get_members(doc, app, obj, {'method'}, include_public={'__init__'})
+ ns['attributes'], ns['all_attributes'] = \
+ _get_members(doc, app, obj, {'attribute', 'property'})
+
+ if modname is None or qualname is None:
+ modname, qualname = _split_full_qualified_name(name)
+
+ if doc.objtype in ('method', 'attribute', 'property'):
+ ns['class'] = qualname.rsplit(".", 1)[0]
+
+ if doc.objtype in ('class',):
+ shortname = qualname
+ else:
+ shortname = qualname.rsplit(".", 1)[-1]
+
+ ns['fullname'] = name
+ ns['module'] = modname
+ ns['objname'] = qualname
+ ns['name'] = shortname
+
+ ns['objtype'] = doc.objtype
+ ns['underline'] = len(name) * '='
+
+ if template_name:
+ return template.render(template_name, ns)
+ else:
+ return template.render(doc.objtype, ns)
+
+
+def _skip_member(app: Sphinx, obj: Any, name: str, objtype: str) -> bool:
+ try:
+ return app.emit_firstresult('autodoc-skip-member', objtype, name,
+ obj, False, {})
+ except Exception as exc:
+ logger.warning(__('autosummary: failed to determine %r to be documented, '
+ 'the following exception was raised:\n%s'),
+ name, exc, type='autosummary')
+ return False
+
+
+def _get_class_members(obj: Any) -> dict[str, Any]:
+ members = sphinx.ext.autodoc.get_class_members(obj, None, safe_getattr)
+ return {name: member.object for name, member in members.items()}
+
+
+def _get_module_members(app: Sphinx, obj: Any) -> dict[str, Any]:
+ members = {}
+ for name in members_of(obj, app.config):
+ try:
+ members[name] = safe_getattr(obj, name)
+ except AttributeError:
+ continue
+ return members
+
+
+def _get_all_members(doc: type[Documenter], app: Sphinx, obj: Any) -> dict[str, Any]:
+ if doc.objtype == 'module':
+ return _get_module_members(app, obj)
+ elif doc.objtype == 'class':
+ return _get_class_members(obj)
+ return {}
+
+
+def _get_members(doc: type[Documenter], app: Sphinx, obj: Any, types: set[str], *,
+ include_public: Set[str] = frozenset(),
+ imported: bool = True) -> tuple[list[str], list[str]]:
+ items: list[str] = []
+ public: list[str] = []
+
+ all_members = _get_all_members(doc, app, obj)
+ for name, value in all_members.items():
+ documenter = get_documenter(app, value, obj)
+ if documenter.objtype in types:
+ # skip imported members if expected
+ if imported or getattr(value, '__module__', None) == obj.__name__:
+ skipped = _skip_member(app, value, name, documenter.objtype)
+ if skipped is True:
+ pass
+ elif skipped is False:
+ # show the member forcedly
+ items.append(name)
+ public.append(name)
+ else:
+ items.append(name)
+ if name in include_public or not name.startswith('_'):
+ # considers member as public
+ public.append(name)
+ return public, items
+
+
+def _get_module_attrs(name: str, members: Any) -> tuple[list[str], list[str]]:
+ """Find module attributes with docstrings."""
+ attrs, public = [], []
+ try:
+ analyzer = ModuleAnalyzer.for_module(name)
+ attr_docs = analyzer.find_attr_docs()
+ for namespace, attr_name in attr_docs:
+ if namespace == '' and attr_name in members:
+ attrs.append(attr_name)
+ if not attr_name.startswith('_'):
+ public.append(attr_name)
+ except PycodeError:
+ pass # give up if ModuleAnalyzer fails to parse code
+ return public, attrs
+
+
+def _get_modules(
+ obj: Any,
+ *,
+ skip: Sequence[str],
+ name: str,
+ public_members: Sequence[str] | None = None) -> tuple[list[str], list[str]]:
+ items: list[str] = []
+ public: list[str] = []
+ for _, modname, _ispkg in pkgutil.iter_modules(obj.__path__):
+
+ if modname in skip:
+ # module was overwritten in __init__.py, so not accessible
+ continue
+ fullname = name + '.' + modname
+ try:
+ module = import_module(fullname)
+ if module and hasattr(module, '__sphinx_mock__'):
+ continue
+ except ImportError:
+ pass
+
+ items.append(fullname)
+ if public_members is not None:
+ if modname in public_members:
+ public.append(fullname)
+ else:
+ if not modname.startswith('_'):
+ public.append(fullname)
+ return public, items
+
+
+def generate_autosummary_docs(sources: list[str],
+ output_dir: str | os.PathLike[str] | None = None,
+ suffix: str = '.rst',
+ base_path: str | os.PathLike[str] | None = None,
+ imported_members: bool = False, app: Any = None,
+ overwrite: bool = True, encoding: str = 'utf-8') -> None:
+ showed_sources = sorted(sources)
+ if len(showed_sources) > 20:
+ showed_sources = showed_sources[:10] + ['...'] + showed_sources[-10:]
+ logger.info(__('[autosummary] generating autosummary for: %s') %
+ ', '.join(showed_sources))
+
+ if output_dir:
+ logger.info(__('[autosummary] writing to %s') % output_dir)
+
+ if base_path is not None:
+ sources = [os.path.join(base_path, filename) for filename in sources]
+
+ template = AutosummaryRenderer(app)
+
+ # read
+ items = find_autosummary_in_files(sources)
+
+ # keep track of new files
+ new_files = []
+
+ if app:
+ filename_map = app.config.autosummary_filename_map
+ else:
+ filename_map = {}
+
+ # write
+ for entry in sorted(set(items), key=str):
+ if entry.path is None:
+ # The corresponding autosummary:: directive did not have
+ # a :toctree: option
+ continue
+
+ path = output_dir or os.path.abspath(entry.path)
+ ensuredir(path)
+
+ try:
+ name, obj, parent, modname = import_by_name(entry.name)
+ qualname = name.replace(modname + ".", "")
+ except ImportExceptionGroup as exc:
+ try:
+ # try to import as an instance attribute
+ name, obj, parent, modname = import_ivar_by_name(entry.name)
+ qualname = name.replace(modname + ".", "")
+ except ImportError as exc2:
+ if exc2.__cause__:
+ exceptions: list[BaseException] = exc.exceptions + [exc2.__cause__]
+ else:
+ exceptions = exc.exceptions + [exc2]
+
+ errors = list({f"* {type(e).__name__}: {e}" for e in exceptions})
+ logger.warning(__('[autosummary] failed to import %s.\nPossible hints:\n%s'),
+ entry.name, '\n'.join(errors))
+ continue
+
+ context: dict[str, Any] = {}
+ if app:
+ context.update(app.config.autosummary_context)
+
+ content = generate_autosummary_content(name, obj, parent, template, entry.template,
+ imported_members, app, entry.recursive, context,
+ modname, qualname)
+
+ filename = os.path.join(path, filename_map.get(name, name) + suffix)
+ if os.path.isfile(filename):
+ with open(filename, encoding=encoding) as f:
+ old_content = f.read()
+
+ if content == old_content:
+ continue
+ if overwrite: # content has changed
+ with open(filename, 'w', encoding=encoding) as f:
+ f.write(content)
+ new_files.append(filename)
+ else:
+ with open(filename, 'w', encoding=encoding) as f:
+ f.write(content)
+ new_files.append(filename)
+
+ # descend recursively to new files
+ if new_files:
+ generate_autosummary_docs(new_files, output_dir=output_dir,
+ suffix=suffix, base_path=base_path,
+ imported_members=imported_members, app=app,
+ overwrite=overwrite)
+
+
+# -- Finding documented entries in files ---------------------------------------
+
+def find_autosummary_in_files(filenames: list[str]) -> list[AutosummaryEntry]:
+ """Find out what items are documented in source/*.rst.
+
+ See `find_autosummary_in_lines`.
+ """
+ documented: list[AutosummaryEntry] = []
+ for filename in filenames:
+ with open(filename, encoding='utf-8', errors='ignore') as f:
+ lines = f.read().splitlines()
+ documented.extend(find_autosummary_in_lines(lines, filename=filename))
+ return documented
+
+
+def find_autosummary_in_docstring(
+ name: str, filename: str | None = None,
+) -> list[AutosummaryEntry]:
+ """Find out what items are documented in the given object's docstring.
+
+ See `find_autosummary_in_lines`.
+ """
+ try:
+ real_name, obj, parent, modname = import_by_name(name)
+ lines = pydoc.getdoc(obj).splitlines()
+ return find_autosummary_in_lines(lines, module=name, filename=filename)
+ except AttributeError:
+ pass
+ except ImportExceptionGroup as exc:
+ errors = '\n'.join({f"* {type(e).__name__}: {e}" for e in exc.exceptions})
+ logger.warning(f'Failed to import {name}.\nPossible hints:\n{errors}') # NoQA: G004
+ except SystemExit:
+ logger.warning("Failed to import '%s'; the module executes module level "
+ 'statement and it might call sys.exit().', name)
+ return []
+
+
+def find_autosummary_in_lines(
+ lines: list[str], module: str | None = None, filename: str | None = None,
+) -> list[AutosummaryEntry]:
+ """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
+ autosummary directive (relative to the root of the file name), and
+ *template* the value of the :template: option. *toctree* and
+ *template* ``None`` if the directive does not have the
+ corresponding options set.
+ """
+ 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(
+ r'^\s*\.\.\s+(current)?module::\s*([a-zA-Z0-9_.]+)\s*$')
+ autosummary_item_re = re.compile(r'^\s+(~?[_a-zA-Z][a-zA-Z0-9_.]*)\s*.*?')
+ recursive_arg_re = re.compile(r'^\s+:recursive:\s*$')
+ toctree_arg_re = re.compile(r'^\s+:toctree:\s*(.*?)\s*$')
+ template_arg_re = re.compile(r'^\s+:template:\s*(.*?)\s*$')
+
+ documented: list[AutosummaryEntry] = []
+
+ recursive = False
+ toctree: str | None = None
+ template = ''
+ current_module = module
+ in_autosummary = False
+ base_indent = ""
+
+ for line in lines:
+ if in_autosummary:
+ m = recursive_arg_re.match(line)
+ if m:
+ recursive = True
+ continue
+
+ m = toctree_arg_re.match(line)
+ if m:
+ toctree = m.group(1)
+ if filename:
+ toctree = os.path.join(os.path.dirname(filename),
+ toctree)
+ continue
+
+ m = template_arg_re.match(line)
+ if m:
+ template = m.group(1).strip()
+ continue
+
+ if line.strip().startswith(':'):
+ continue # skip options
+
+ m = autosummary_item_re.match(line)
+ if m:
+ name = m.group(1).strip()
+ if name.startswith('~'):
+ name = name[1:]
+ if current_module and \
+ not name.startswith(current_module + '.'):
+ name = f"{current_module}.{name}"
+ documented.append(AutosummaryEntry(name, toctree, template, recursive))
+ continue
+
+ if not line.strip() or line.startswith(base_indent + " "):
+ continue
+
+ in_autosummary = False
+
+ m = autosummary_re.match(line)
+ if m:
+ in_autosummary = True
+ base_indent = m.group(1)
+ recursive = False
+ toctree = None
+ template = ''
+ continue
+
+ m = automodule_re.search(line)
+ if m:
+ current_module = m.group(1).strip()
+ # recurse into the automodule docstring
+ documented.extend(find_autosummary_in_docstring(
+ current_module, filename=filename))
+ continue
+
+ m = module_re.match(line)
+ if m:
+ current_module = m.group(2)
+ continue
+
+ return documented
+
+
+def get_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser(
+ usage='%(prog)s [OPTIONS] <SOURCE_FILE>...',
+ epilog=__('For more information, visit <https://www.sphinx-doc.org/>.'),
+ description=__("""
+Generate ReStructuredText using autosummary directives.
+
+sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates
+the reStructuredText files from the autosummary directives contained in the
+given input files.
+
+The format of the autosummary directive is documented in the
+``sphinx.ext.autosummary`` Python module and can be read using::
+
+ pydoc sphinx.ext.autosummary
+"""))
+
+ parser.add_argument('--version', action='version', dest='show_version',
+ version='%%(prog)s %s' % __display_version__)
+
+ parser.add_argument('source_file', nargs='+',
+ help=__('source files to generate rST files for'))
+
+ parser.add_argument('-o', '--output-dir', action='store',
+ dest='output_dir',
+ help=__('directory to place all output in'))
+ parser.add_argument('-s', '--suffix', action='store', dest='suffix',
+ default='rst',
+ help=__('default suffix for files (default: '
+ '%(default)s)'))
+ parser.add_argument('-t', '--templates', action='store', dest='templates',
+ default=None,
+ help=__('custom template directory (default: '
+ '%(default)s)'))
+ parser.add_argument('-i', '--imported-members', action='store_true',
+ dest='imported_members', default=False,
+ help=__('document imported members (default: '
+ '%(default)s)'))
+ parser.add_argument('-a', '--respect-module-all', action='store_true',
+ dest='respect_module_all', default=False,
+ help=__('document exactly the members in module __all__ attribute. '
+ '(default: %(default)s)'))
+
+ return parser
+
+
+def main(argv: Sequence[str] = (), /) -> None:
+ locale.setlocale(locale.LC_ALL, '')
+ sphinx.locale.init_console()
+
+ app = DummyApplication(sphinx.locale.get_translator())
+ logging.setup(app, sys.stdout, sys.stderr) # type: ignore[arg-type]
+ setup_documenters(app)
+ args = get_parser().parse_args(argv or sys.argv[1:])
+
+ if args.templates:
+ app.config.templates_path.append(path.abspath(args.templates))
+ app.config.autosummary_ignore_module_all = ( # type: ignore[attr-defined]
+ not args.respect_module_all
+ )
+
+ generate_autosummary_docs(args.source_file, args.output_dir,
+ '.' + args.suffix,
+ imported_members=args.imported_members,
+ app=app)
+
+
+if __name__ == '__main__':
+ main(sys.argv[1:])
diff --git a/sphinx/ext/autosummary/templates/autosummary/base.rst b/sphinx/ext/autosummary/templates/autosummary/base.rst
new file mode 100644
index 0000000..b7556eb
--- /dev/null
+++ b/sphinx/ext/autosummary/templates/autosummary/base.rst
@@ -0,0 +1,5 @@
+{{ fullname | escape | underline}}
+
+.. currentmodule:: {{ module }}
+
+.. auto{{ objtype }}:: {{ objname }}
diff --git a/sphinx/ext/autosummary/templates/autosummary/class.rst b/sphinx/ext/autosummary/templates/autosummary/class.rst
new file mode 100644
index 0000000..0f7d6f3
--- /dev/null
+++ b/sphinx/ext/autosummary/templates/autosummary/class.rst
@@ -0,0 +1,29 @@
+{{ fullname | escape | underline}}
+
+.. currentmodule:: {{ module }}
+
+.. autoclass:: {{ objname }}
+
+ {% block methods %}
+ .. automethod:: __init__
+
+ {% if methods %}
+ .. rubric:: {{ _('Methods') }}
+
+ .. autosummary::
+ {% for item in methods %}
+ ~{{ name }}.{{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
+
+ {% block attributes %}
+ {% if attributes %}
+ .. rubric:: {{ _('Attributes') }}
+
+ .. autosummary::
+ {% for item in attributes %}
+ ~{{ name }}.{{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
diff --git a/sphinx/ext/autosummary/templates/autosummary/module.rst b/sphinx/ext/autosummary/templates/autosummary/module.rst
new file mode 100644
index 0000000..e74c012
--- /dev/null
+++ b/sphinx/ext/autosummary/templates/autosummary/module.rst
@@ -0,0 +1,60 @@
+{{ fullname | escape | underline}}
+
+.. automodule:: {{ fullname }}
+
+ {% block attributes %}
+ {% if attributes %}
+ .. rubric:: {{ _('Module Attributes') }}
+
+ .. autosummary::
+ {% for item in attributes %}
+ {{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
+
+ {% block functions %}
+ {% if functions %}
+ .. rubric:: {{ _('Functions') }}
+
+ .. autosummary::
+ {% for item in functions %}
+ {{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
+
+ {% block classes %}
+ {% if classes %}
+ .. rubric:: {{ _('Classes') }}
+
+ .. autosummary::
+ {% for item in classes %}
+ {{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
+
+ {% block exceptions %}
+ {% if exceptions %}
+ .. rubric:: {{ _('Exceptions') }}
+
+ .. autosummary::
+ {% for item in exceptions %}
+ {{ item }}
+ {%- endfor %}
+ {% endif %}
+ {% endblock %}
+
+{% block modules %}
+{% if modules %}
+.. rubric:: Modules
+
+.. autosummary::
+ :toctree:
+ :recursive:
+{% for item in modules %}
+ {{ item }}
+{%- endfor %}
+{% endif %}
+{% endblock %}
diff --git a/sphinx/ext/coverage.py b/sphinx/ext/coverage.py
new file mode 100644
index 0000000..e3d9745
--- /dev/null
+++ b/sphinx/ext/coverage.py
@@ -0,0 +1,400 @@
+"""Check Python modules and C API for coverage.
+
+Mostly written by Josip Dzolonga for the Google Highly Open Participation
+contest.
+"""
+
+from __future__ import annotations
+
+import glob
+import inspect
+import pickle
+import re
+import sys
+from importlib import import_module
+from os import path
+from typing import IO, TYPE_CHECKING, Any, TextIO
+
+import sphinx
+from sphinx.builders import Builder
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.console import red # type: ignore[attr-defined]
+from sphinx.util.inspect import safe_getattr
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+# utility
+def write_header(f: IO[str], text: str, char: str = '-') -> None:
+ f.write(text + '\n')
+ f.write(char * len(text) + '\n\n')
+
+
+def compile_regex_list(name: str, exps: str) -> list[re.Pattern[str]]:
+ lst = []
+ for exp in exps:
+ try:
+ lst.append(re.compile(exp))
+ except Exception:
+ logger.warning(__('invalid regex %r in %s'), exp, name)
+ return lst
+
+
+def _write_table(table: list[list[str]]) -> Iterator[str]:
+ sizes = [max(len(x[column]) for x in table) + 1 for column in range(len(table[0]))]
+
+ yield _add_line(sizes, '-')
+ yield from _add_row(sizes, table[0], '=')
+
+ for row in table[1:]:
+ yield from _add_row(sizes, row, '-')
+
+
+def _add_line(sizes: list[int], separator: str) -> str:
+ return '+' + ''.join((separator * (size + 1)) + '+' for size in sizes)
+
+
+def _add_row(col_widths: list[int], columns: list[str], separator: str) -> Iterator[str]:
+ yield ''.join(f'| {column: <{col_widths[i]}}' for i, column in enumerate(columns)) + '|'
+ yield _add_line(col_widths, separator)
+
+
+class CoverageBuilder(Builder):
+ """
+ Evaluates coverage of code in the documentation.
+ """
+ name = 'coverage'
+ epilog = __('Testing of coverage in the sources finished, look at the '
+ 'results in %(outdir)s' + path.sep + 'python.txt.')
+
+ def init(self) -> None:
+ self.c_sourcefiles: list[str] = []
+ for pattern in self.config.coverage_c_path:
+ pattern = path.join(self.srcdir, pattern)
+ self.c_sourcefiles.extend(glob.glob(pattern))
+
+ self.c_regexes: list[tuple[str, re.Pattern[str]]] = []
+ for (name, exp) in self.config.coverage_c_regexes.items():
+ try:
+ self.c_regexes.append((name, re.compile(exp)))
+ except Exception:
+ logger.warning(__('invalid regex %r in coverage_c_regexes'), exp)
+
+ self.c_ignorexps: dict[str, list[re.Pattern[str]]] = {}
+ for (name, exps) in self.config.coverage_ignore_c_items.items():
+ self.c_ignorexps[name] = compile_regex_list('coverage_ignore_c_items',
+ exps)
+ self.mod_ignorexps = compile_regex_list('coverage_ignore_modules',
+ self.config.coverage_ignore_modules)
+ self.cls_ignorexps = compile_regex_list('coverage_ignore_classes',
+ self.config.coverage_ignore_classes)
+ self.fun_ignorexps = compile_regex_list('coverage_ignore_functions',
+ self.config.coverage_ignore_functions)
+ self.py_ignorexps = compile_regex_list('coverage_ignore_pyobjects',
+ self.config.coverage_ignore_pyobjects)
+
+ def get_outdated_docs(self) -> str:
+ return 'coverage overview'
+
+ def write(self, *ignored: Any) -> None:
+ self.py_undoc: dict[str, dict[str, Any]] = {}
+ self.py_undocumented: dict[str, set[str]] = {}
+ self.py_documented: dict[str, set[str]] = {}
+ self.build_py_coverage()
+ self.write_py_coverage()
+
+ self.c_undoc: dict[str, set[tuple[str, str]]] = {}
+ self.build_c_coverage()
+ self.write_c_coverage()
+
+ def build_c_coverage(self) -> None:
+ c_objects = {}
+ for obj in self.env.domains['c'].get_objects():
+ c_objects[obj[2]] = obj[1]
+ for filename in self.c_sourcefiles:
+ undoc: set[tuple[str, str]] = set()
+ with open(filename, encoding="utf-8") as f:
+ for line in f:
+ for key, regex in self.c_regexes:
+ match = regex.match(line)
+ if match:
+ name = match.groups()[0]
+ if key not in c_objects:
+ undoc.add((key, name))
+ continue
+
+ if name not in c_objects[key]:
+ for exp in self.c_ignorexps.get(key, []):
+ if exp.match(name):
+ break
+ else:
+ undoc.add((key, name))
+ continue
+ if undoc:
+ self.c_undoc[filename] = undoc
+
+ def write_c_coverage(self) -> None:
+ output_file = path.join(self.outdir, 'c.txt')
+ with open(output_file, 'w', encoding="utf-8") as op:
+ if self.config.coverage_write_headline:
+ write_header(op, 'Undocumented C API elements', '=')
+ op.write('\n')
+
+ for filename, undoc in self.c_undoc.items():
+ write_header(op, filename)
+ for typ, name in sorted(undoc):
+ op.write(' * %-50s [%9s]\n' % (name, typ))
+ if self.config.coverage_show_missing_items:
+ if self.app.quiet or self.app.warningiserror:
+ logger.warning(__('undocumented c api: %s [%s] in file %s'),
+ name, typ, filename)
+ else:
+ logger.info(red('undocumented ') + 'c ' + 'api ' +
+ '%-30s' % (name + " [%9s]" % typ) +
+ red(' - in file ') + filename)
+ op.write('\n')
+
+ def ignore_pyobj(self, full_name: str) -> bool:
+ return any(
+ exp.search(full_name)
+ for exp in self.py_ignorexps
+ )
+
+ def build_py_coverage(self) -> None:
+ 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:
+ if exp.match(mod_name):
+ ignore = True
+ break
+ if ignore or self.ignore_pyobj(mod_name):
+ continue
+
+ try:
+ mod = import_module(mod_name)
+ except ImportError as err:
+ logger.warning(__('module %s could not be imported: %s'), mod_name, err)
+ self.py_undoc[mod_name] = {'error': err}
+ continue
+
+ documented_objects: set[str] = set()
+ undocumented_objects: set[str] = set()
+
+ funcs = []
+ classes: dict[str, list[str]] = {}
+
+ for name, obj in inspect.getmembers(mod):
+ # diverse module attributes are ignored:
+ if name[0] == '_':
+ # begins in an underscore
+ continue
+ if not hasattr(obj, '__module__'):
+ # cannot be attributed to a module
+ continue
+ if obj.__module__ != mod_name:
+ # is not defined in this module
+ continue
+
+ full_name = f'{mod_name}.{name}'
+ if self.ignore_pyobj(full_name):
+ continue
+
+ if inspect.isfunction(obj):
+ if full_name not in objects:
+ for exp in self.fun_ignorexps:
+ if exp.match(name):
+ break
+ else:
+ if skip_undoc and not obj.__doc__:
+ continue
+ funcs.append(name)
+ undocumented_objects.add(full_name)
+ else:
+ documented_objects.add(full_name)
+ elif inspect.isclass(obj):
+ for exp in self.cls_ignorexps:
+ if exp.match(name):
+ break
+ else:
+ if full_name not in objects:
+ if skip_undoc and not obj.__doc__:
+ continue
+ # not documented at all
+ classes[name] = []
+ continue
+
+ attrs: list[str] = []
+
+ for attr_name in dir(obj):
+ if attr_name not in obj.__dict__:
+ continue
+ try:
+ attr = safe_getattr(obj, attr_name)
+ except AttributeError:
+ continue
+ 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 = f'{full_name}.{attr_name}'
+ if self.ignore_pyobj(full_attr_name):
+ continue
+ if full_attr_name not in objects:
+ attrs.append(attr_name)
+ undocumented_objects.add(full_attr_name)
+ else:
+ documented_objects.add(full_attr_name)
+
+ if attrs:
+ # some attributes are undocumented
+ classes[name] = attrs
+
+ self.py_undoc[mod_name] = {'funcs': funcs, 'classes': classes}
+ self.py_undocumented[mod_name] = undocumented_objects
+ self.py_documented[mod_name] = documented_objects
+
+ def _write_py_statistics(self, op: TextIO) -> None:
+ """ Outputs the table of ``op``."""
+ all_modules = set(self.py_documented.keys()).union(
+ set(self.py_undocumented.keys()))
+ all_objects: set[str] = set()
+ all_documented_objects: set[str] = set()
+ for module in all_modules:
+ all_module_objects = self.py_documented[module].union(self.py_undocumented[module])
+ all_objects = all_objects.union(all_module_objects)
+ all_documented_objects = all_documented_objects.union(self.py_documented[module])
+
+ # prepare tabular
+ table = [['Module', 'Coverage', 'Undocumented']]
+ for module in all_modules:
+ module_objects = self.py_documented[module].union(self.py_undocumented[module])
+ if len(module_objects):
+ value = 100.0 * len(self.py_documented[module]) / len(module_objects)
+ else:
+ value = 100.0
+
+ table.append([module, '%.2f%%' % value, '%d' % len(self.py_undocumented[module])])
+ table.append([
+ 'TOTAL',
+ f'{100 * len(all_documented_objects) / len(all_objects):.2f}%',
+ f'{len(all_objects) - len(all_documented_objects)}',
+ ])
+
+ for line in _write_table(table):
+ op.write(f'{line}\n')
+
+ def write_py_coverage(self) -> None:
+ output_file = path.join(self.outdir, 'python.txt')
+ failed = []
+ with open(output_file, 'w', encoding="utf-8") as op:
+ if self.config.coverage_write_headline:
+ write_header(op, 'Undocumented Python objects', '=')
+
+ if self.config.coverage_statistics_to_stdout:
+ self._write_py_statistics(sys.stdout)
+
+ if self.config.coverage_statistics_to_report:
+ write_header(op, 'Statistics')
+ self._write_py_statistics(op)
+ op.write('\n')
+
+ keys = sorted(self.py_undoc.keys())
+ for name in keys:
+ undoc = self.py_undoc[name]
+ if 'error' in undoc:
+ failed.append((name, undoc['error']))
+ else:
+ if not undoc['classes'] and not undoc['funcs']:
+ continue
+
+ write_header(op, name)
+ if undoc['funcs']:
+ op.write('Functions:\n')
+ op.writelines(' * %s\n' % x for x in undoc['funcs'])
+ if self.config.coverage_show_missing_items:
+ if self.app.quiet or self.app.warningiserror:
+ for func in undoc['funcs']:
+ logger.warning(
+ __('undocumented python function: %s :: %s'),
+ name, func)
+ else:
+ for func in undoc['funcs']:
+ logger.info(red('undocumented ') + 'py ' + 'function ' +
+ '%-30s' % func + red(' - in module ') + name)
+ op.write('\n')
+ if undoc['classes']:
+ op.write('Classes:\n')
+ for class_name, methods in sorted(
+ undoc['classes'].items()):
+ if not methods:
+ op.write(' * %s\n' % class_name)
+ if self.config.coverage_show_missing_items:
+ if self.app.quiet or self.app.warningiserror:
+ logger.warning(
+ __('undocumented python class: %s :: %s'),
+ name, class_name)
+ else:
+ logger.info(red('undocumented ') + 'py ' +
+ 'class ' + '%-30s' % class_name +
+ red(' - in module ') + name)
+ else:
+ op.write(' * %s -- missing methods:\n\n' % class_name)
+ op.writelines(' - %s\n' % x for x in methods)
+ if self.config.coverage_show_missing_items:
+ if self.app.quiet or self.app.warningiserror:
+ for meth in methods:
+ logger.warning(
+ __('undocumented python method:' +
+ ' %s :: %s :: %s'),
+ name, class_name, meth)
+ else:
+ for meth in methods:
+ logger.info(red('undocumented ') + 'py ' +
+ 'method ' + '%-30s' %
+ (class_name + '.' + meth) +
+ red(' - in module ') + name)
+ op.write('\n')
+
+ if failed:
+ write_header(op, 'Modules that failed to import')
+ op.writelines(' * %s -- %s\n' % x for x in failed)
+
+ def finish(self) -> None:
+ # dump the coverage data to a pickle file too
+ picklepath = path.join(self.outdir, 'undoc.pickle')
+ with open(picklepath, 'wb') as dumpfile:
+ pickle.dump((self.py_undoc, self.c_undoc,
+ self.py_undocumented, self.py_documented), dumpfile)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_builder(CoverageBuilder)
+ app.add_config_value('coverage_ignore_modules', [], False)
+ app.add_config_value('coverage_ignore_functions', [], False)
+ app.add_config_value('coverage_ignore_classes', [], False)
+ app.add_config_value('coverage_ignore_pyobjects', [], False)
+ 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_statistics_to_report', True, False, (bool,))
+ app.add_config_value('coverage_statistics_to_stdout', True, False, (bool,))
+ app.add_config_value('coverage_skip_undoc_in_source', False, False)
+ app.add_config_value('coverage_show_missing_items', False, False)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/doctest.py b/sphinx/ext/doctest.py
new file mode 100644
index 0000000..c55ef2f
--- /dev/null
+++ b/sphinx/ext/doctest.py
@@ -0,0 +1,575 @@
+"""Mimic doctest in Sphinx.
+
+The extension automatically execute code snippets and checks their results.
+"""
+
+from __future__ import annotations
+
+import doctest
+import re
+import sys
+import time
+from io import StringIO
+from os import path
+from typing import TYPE_CHECKING, Any, Callable
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from packaging.specifiers import InvalidSpecifier, SpecifierSet
+from packaging.version import Version
+
+import sphinx
+from sphinx.builders import Builder
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.console import bold # type: ignore[attr-defined]
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.osutil import relpath
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Sequence
+
+ from docutils.nodes import Element, Node, TextElement
+
+ from sphinx.application import Sphinx
+ from sphinx.util.typing import OptionSpec
+
+
+logger = logging.getLogger(__name__)
+
+blankline_re = re.compile(r'^\s*<BLANKLINE>', re.MULTILINE)
+doctestopt_re = re.compile(r'#\s*doctest:.+$', re.MULTILINE)
+
+
+def is_allowed_version(spec: str, version: str) -> bool:
+ """Check `spec` satisfies `version` or not.
+
+ This obeys PEP-440 specifiers:
+ https://peps.python.org/pep-0440/#version-specifiers
+
+ Some examples:
+
+ >>> is_allowed_version('<=3.5', '3.3')
+ True
+ >>> is_allowed_version('<=3.2', '3.3')
+ False
+ >>> is_allowed_version('>3.2, <4.0', '3.3')
+ True
+ """
+ return Version(version) in SpecifierSet(spec)
+
+
+# set up the necessary directives
+
+class TestDirective(SphinxDirective):
+ """
+ Base class for doctest-related directives.
+ """
+
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 1
+ final_argument_whitespace = True
+
+ def run(self) -> list[Node]:
+ # use ordinary docutils nodes for test code: they get special attributes
+ # so that our builder recognizes them, and the other builders are happy.
+ code = '\n'.join(self.content)
+ test = None
+ if self.name == 'doctest':
+ if '<BLANKLINE>' in code:
+ # convert <BLANKLINE>s to ordinary blank lines for presentation
+ test = code
+ code = blankline_re.sub('', code)
+ if doctestopt_re.search(code) and 'no-trim-doctest-flags' not in self.options:
+ if not test:
+ test = code
+ code = doctestopt_re.sub('', code)
+ nodetype: type[TextElement] = nodes.literal_block
+ 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(',')]
+ else:
+ groups = ['default']
+ node = nodetype(code, code, testnodetype=self.name, groups=groups)
+ self.set_source_info(node)
+ if test is not None:
+ # only save if it differs from code
+ node['test'] = test
+ if self.name == 'doctest':
+ node['language'] = 'pycon'
+ elif self.name == 'testcode':
+ node['language'] = 'python'
+ elif self.name == 'testoutput':
+ # don't try to highlight output
+ node['language'] = 'none'
+ node['options'] = {}
+ if self.name in ('doctest', 'testoutput') and 'options' in self.options:
+ # parse doctest-like output comparison flags
+ option_strings = self.options['options'].replace(',', ' ').split()
+ for option in option_strings:
+ prefix, option_name = option[0], option[1:]
+ if prefix not in '+-':
+ self.state.document.reporter.warning(
+ __("missing '+' or '-' in '%s' option.") % option,
+ line=self.lineno)
+ continue
+ if option_name not in doctest.OPTIONFLAGS_BY_NAME:
+ self.state.document.reporter.warning(
+ __("'%s' is not a valid option.") % option_name,
+ line=self.lineno)
+ continue
+ flag = doctest.OPTIONFLAGS_BY_NAME[option[1:]]
+ node['options'][flag] = (option[0] == '+')
+ if self.name == 'doctest' and 'pyversion' in self.options:
+ try:
+ spec = self.options['pyversion']
+ python_version = '.'.join([str(v) for v in sys.version_info[:3]])
+ if not is_allowed_version(spec, python_version):
+ flag = doctest.OPTIONFLAGS_BY_NAME['SKIP']
+ node['options'][flag] = True # Skip the test
+ except InvalidSpecifier:
+ self.state.document.reporter.warning(
+ __("'%s' is not a valid pyversion option") % spec,
+ line=self.lineno)
+ if 'skipif' in self.options:
+ node['skipif'] = self.options['skipif']
+ if 'trim-doctest-flags' in self.options:
+ node['trim_flags'] = True
+ elif 'no-trim-doctest-flags' in self.options:
+ node['trim_flags'] = False
+ return [node]
+
+
+class TestsetupDirective(TestDirective):
+ option_spec: OptionSpec = {
+ 'skipif': directives.unchanged_required,
+ }
+
+
+class TestcleanupDirective(TestDirective):
+ option_spec: OptionSpec = {
+ 'skipif': directives.unchanged_required,
+ }
+
+
+class DoctestDirective(TestDirective):
+ option_spec: OptionSpec = {
+ 'hide': directives.flag,
+ 'no-trim-doctest-flags': directives.flag,
+ 'options': directives.unchanged,
+ 'pyversion': directives.unchanged_required,
+ 'skipif': directives.unchanged_required,
+ 'trim-doctest-flags': directives.flag,
+ }
+
+
+class TestcodeDirective(TestDirective):
+ option_spec: OptionSpec = {
+ 'hide': directives.flag,
+ 'no-trim-doctest-flags': directives.flag,
+ 'pyversion': directives.unchanged_required,
+ 'skipif': directives.unchanged_required,
+ 'trim-doctest-flags': directives.flag,
+ }
+
+
+class TestoutputDirective(TestDirective):
+ option_spec: OptionSpec = {
+ 'hide': directives.flag,
+ 'no-trim-doctest-flags': directives.flag,
+ 'options': directives.unchanged,
+ 'pyversion': directives.unchanged_required,
+ 'skipif': directives.unchanged_required,
+ 'trim-doctest-flags': directives.flag,
+ }
+
+
+parser = doctest.DocTestParser()
+
+
+# helper classes
+
+class TestGroup:
+ def __init__(self, name: str) -> None:
+ self.name = name
+ self.setup: list[TestCode] = []
+ self.tests: list[list[TestCode] | tuple[TestCode, None]] = []
+ self.cleanup: list[TestCode] = []
+
+ def add_code(self, code: TestCode, prepend: bool = False) -> None:
+ if code.type == 'testsetup':
+ if prepend:
+ 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':
+ # "testoutput" may replace the second element
+ self.tests.append((code, None))
+ elif code.type == 'testoutput':
+ if self.tests:
+ latest_test = self.tests[-1]
+ if len(latest_test) == 2:
+ self.tests[-1] = [latest_test[0], code]
+ else:
+ raise RuntimeError(__('invalid TestCode type'))
+
+ def __repr__(self) -> str:
+ return (f'TestGroup(name={self.name!r}, setup={self.setup!r}, '
+ f'cleanup={self.cleanup!r}, tests={self.tests!r})')
+
+
+class TestCode:
+ def __init__(self, code: str, type: str, filename: str,
+ lineno: int, options: dict | None = None) -> None:
+ self.code = code
+ self.type = type
+ self.filename = filename
+ self.lineno = lineno
+ self.options = options or {}
+
+ def __repr__(self) -> str:
+ return (f'TestCode({self.code!r}, {self.type!r}, filename={self.filename!r}, '
+ f'lineno={self.lineno!r}, options={self.options!r})')
+
+
+class SphinxDocTestRunner(doctest.DocTestRunner):
+ def summarize(self, out: Callable, verbose: bool | None = None, # type: ignore[override]
+ ) -> tuple[int, int]:
+ string_io = StringIO()
+ old_stdout = sys.stdout
+ sys.stdout = string_io
+ try:
+ res = super().summarize(verbose)
+ finally:
+ sys.stdout = old_stdout
+ out(string_io.getvalue())
+ return res
+
+ def _DocTestRunner__patched_linecache_getlines(self, filename: str,
+ module_globals: Any = None) -> Any:
+ # this is overridden from DocTestRunner adding the try-except below
+ m = self._DocTestRunner__LINECACHE_FILENAME_RE.match( # type: ignore[attr-defined]
+ filename)
+ if m and m.group('name') == self.test.name:
+ try:
+ example = self.test.examples[int(m.group('examplenum'))]
+ # because we compile multiple doctest blocks with the same name
+ # (viz. the group name) this might, for outer stack frames in a
+ # traceback, get the wrong test which might not have enough examples
+ except IndexError:
+ pass
+ else:
+ return example.source.splitlines(True)
+ return self.save_linecache_getlines( # type: ignore[attr-defined]
+ filename, module_globals)
+
+
+# the new builder -- use sphinx-build.py -b doctest to run
+
+class DocTestBuilder(Builder):
+ """
+ Runs test snippets in the documentation.
+ """
+ name = 'doctest'
+ epilog = __('Testing of doctests in the sources finished, look at the '
+ 'results in %(outdir)s/output.txt.')
+
+ def init(self) -> None:
+ # default options
+ self.opt = self.config.doctest_default_flags
+
+ # HACK HACK HACK
+ # doctest compiles its snippets with type 'single'. That is nice
+ # for doctest examples but unusable for multi-statement code such
+ # as setup code -- to be able to use doctest error reporting with
+ # that code nevertheless, we monkey-patch the "compile" it uses.
+ doctest.compile = self.compile # type: ignore[attr-defined]
+
+ sys.path[0:0] = self.config.doctest_path
+
+ self.type = 'single'
+
+ self.total_failures = 0
+ 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')
+
+ outpath = self.outdir.joinpath('output.txt')
+ self.outfile = outpath.open('w', encoding='utf-8') # NoQA: SIM115
+ self.outfile.write(('Results of doctest builder run on %s\n'
+ '==================================%s\n') %
+ (date, '=' * len(date)))
+
+ def _out(self, text: str) -> None:
+ logger.info(text, nonl=True)
+ self.outfile.write(text)
+
+ def _warn_out(self, text: str) -> None:
+ if self.app.quiet or self.app.warningiserror:
+ logger.warning(text)
+ else:
+ logger.info(text, nonl=True)
+ self.outfile.write(text)
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ return ''
+
+ def get_outdated_docs(self) -> set[str]:
+ return self.env.found_docs
+
+ def finish(self) -> None:
+ # write executive summary
+ def s(v: int) -> str:
+ return 's' if v != 1 else ''
+ repl = (self.total_tries, s(self.total_tries),
+ self.total_failures, s(self.total_failures),
+ self.setup_failures, s(self.setup_failures),
+ self.cleanup_failures, s(self.cleanup_failures))
+ self._out('''
+Doctest summary
+===============
+%5d test%s
+%5d failure%s in tests
+%5d failure%s in setup code
+%5d failure%s in cleanup code
+''' % repl)
+ self.outfile.close()
+
+ if self.total_failures or self.setup_failures or self.cleanup_failures:
+ self.app.statuscode = 1
+
+ def write(self, build_docnames: Iterable[str] | None, updated_docnames: Sequence[str],
+ method: str = 'update') -> None:
+ if build_docnames is None:
+ build_docnames = sorted(self.env.all_docs)
+
+ logger.info(bold('running tests...'))
+ for docname in build_docnames:
+ # no need to resolve the doctree
+ doctree = self.env.get_doctree(docname)
+ self.test_doc(docname, doctree)
+
+ def get_filename_for_node(self, node: Node, docname: str) -> str:
+ """Try to get the file which actually contains the doctest, not the
+ filename of the document it's included in."""
+ try:
+ filename = relpath(node.source, self.env.srcdir)\
+ .rsplit(':docstring of ', maxsplit=1)[0]
+ except Exception:
+ filename = self.env.doc2path(docname, False)
+ return filename
+
+ @staticmethod
+ def get_line_number(node: Node) -> int:
+ """Get the real line number or admit we don't know."""
+ # TODO: Work out how to store or calculate real (file-relative)
+ # line numbers for doctest blocks in docstrings.
+ if ':docstring of ' in path.basename(node.source or ''):
+ # The line number is given relative to the stripped docstring,
+ # not the file. This is correct where it is set, in
+ # `docutils.nodes.Node.setup_child`, but Sphinx should report
+ # relative to the file, not the docstring.
+ return None # type: ignore[return-value]
+ if node.line is not None:
+ # TODO: find the root cause of this off by one error.
+ return node.line - 1
+ return None
+
+ def skipped(self, node: Element) -> bool:
+ if 'skipif' not in node:
+ return False
+ else:
+ condition = node['skipif']
+ context: dict[str, Any] = {}
+ if self.config.doctest_global_setup:
+ exec(self.config.doctest_global_setup, context) # NoQA: S102
+ should_skip = eval(condition, context) # NoQA: PGH001
+ if self.config.doctest_global_cleanup:
+ exec(self.config.doctest_global_cleanup, context) # NoQA: S102
+ return should_skip
+
+ def test_doc(self, docname: str, doctree: Node) -> None:
+ groups: dict[str, TestGroup] = {}
+ add_to_all_groups = []
+ self.setup_runner = SphinxDocTestRunner(verbose=False,
+ 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 # type: ignore[attr-defined]
+ self.cleanup_runner._fakeout = self.setup_runner._fakeout # type: ignore[attr-defined]
+
+ if self.config.doctest_test_doctest_blocks:
+ def condition(node: Node) -> bool:
+ return (isinstance(node, (nodes.literal_block, nodes.comment)) and
+ 'testnodetype' in node) or \
+ isinstance(node, nodes.doctest_block)
+ else:
+ def condition(node: Node) -> bool:
+ return isinstance(node, (nodes.literal_block, nodes.comment)) \
+ and 'testnodetype' in node
+ for node in doctree.findall(condition): # type: Element
+ if self.skipped(node):
+ continue
+
+ source = node['test'] if 'test' in node else node.astext()
+ filename = self.get_filename_for_node(node, docname)
+ line_number = self.get_line_number(node)
+ if not source:
+ logger.warning(__('no code/output in %s block at %s:%s'),
+ node.get('testnodetype', 'doctest'),
+ filename, line_number)
+ code = TestCode(source, type=node.get('testnodetype', 'doctest'),
+ filename=filename, lineno=line_number,
+ options=node.get('options'))
+ node_groups = node.get('groups', ['default'])
+ if '*' in node_groups:
+ add_to_all_groups.append(code)
+ continue
+ for groupname in node_groups:
+ if groupname not in groups:
+ groups[groupname] = TestGroup(groupname)
+ groups[groupname].add_code(code)
+ for code in add_to_all_groups:
+ for group in groups.values():
+ group.add_code(code)
+ if self.config.doctest_global_setup:
+ code = TestCode(self.config.doctest_global_setup,
+ 'testsetup', filename='<global_setup>', lineno=0)
+ for group in groups.values():
+ group.add_code(code, prepend=True)
+ if self.config.doctest_global_cleanup:
+ code = TestCode(self.config.doctest_global_cleanup,
+ 'testcleanup', filename='<global_cleanup>', lineno=0)
+ for group in groups.values():
+ group.add_code(code)
+ if not groups:
+ return
+
+ show_successes = self.config.doctest_show_successes
+ if show_successes:
+ self._out('\n'
+ f'Document: {docname}\n'
+ f'----------{"-" * len(docname)}\n')
+ for group in groups.values():
+ self.test_group(group)
+ # Separately count results from setup code
+ res_f, res_t = self.setup_runner.summarize(self._out, verbose=False)
+ self.setup_failures += res_f
+ self.setup_tries += res_t
+ if self.test_runner.tries:
+ res_f, res_t = self.test_runner.summarize(
+ self._out, verbose=show_successes)
+ 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=show_successes)
+ self.cleanup_failures += res_f
+ self.cleanup_tries += res_t
+
+ def compile(self, code: str, name: str, type: str, flags: Any, dont_inherit: bool) -> Any:
+ return compile(code, name, self.type, flags, dont_inherit)
+
+ def test_group(self, group: TestGroup) -> None:
+ ns: dict = {}
+
+ def run_setup_cleanup(runner: Any, testcodes: list[TestCode], what: Any) -> bool:
+ examples = []
+ for testcode in testcodes:
+ example = doctest.Example(testcode.code, '', lineno=testcode.lineno)
+ examples.append(example)
+ if not examples:
+ return True
+ # simulate a doctest with the code
+ sim_doctest = doctest.DocTest(examples, {},
+ f'{group.name} ({what} code)',
+ testcodes[0].filename, 0, None)
+ sim_doctest.globs = ns
+ old_f = runner.failures
+ self.type = 'exec' # the snippet may contain multiple statements
+ 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)
+ try:
+ test = parser.get_doctest(code[0].code, {}, group.name,
+ code[0].filename, code[0].lineno)
+ except Exception:
+ logger.warning(__('ignoring invalid doctest code: %r'), code[0].code,
+ location=(code[0].filename, code[0].lineno))
+ continue
+ if not test.examples:
+ continue
+ for example in test.examples:
+ # apply directive's comparison options
+ new_opt = code[0].options.copy()
+ new_opt.update(example.options)
+ example.options = new_opt
+ self.type = 'single' # as for ordinary doctests
+ else:
+ # testcode and output separate
+ output = code[1].code if code[1] else ''
+ options = code[1].options if code[1] else {}
+ # disable <BLANKLINE> processing as it is not needed
+ options[doctest.DONT_ACCEPT_BLANKLINE] = True
+ # find out if we're testing an exception
+ m = parser._EXCEPTION_RE.match(output) # type: ignore[attr-defined]
+ if m:
+ exc_msg = m.group('msg')
+ else:
+ exc_msg = None
+ example = doctest.Example(code[0].code, output, exc_msg=exc_msg,
+ lineno=code[0].lineno, options=options)
+ test = doctest.DocTest([example], {}, group.name,
+ code[0].filename, code[0].lineno, None)
+ self.type = 'exec' # multiple statements again
+ # DocTest.__init__ copies the globs namespace, which we don't want
+ test.globs = ns
+ # 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: Sphinx) -> dict[str, Any]:
+ 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)
+ app.add_builder(DocTestBuilder)
+ # this config value adds to sys.path
+ app.add_config_value('doctest_show_successes', True, False, (bool,))
+ 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)
+ app.add_config_value(
+ 'doctest_default_flags',
+ doctest.DONT_ACCEPT_TRUE_FOR_1 | doctest.ELLIPSIS | doctest.IGNORE_EXCEPTION_DETAIL,
+ False)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/duration.py b/sphinx/ext/duration.py
new file mode 100644
index 0000000..26e197f
--- /dev/null
+++ b/sphinx/ext/duration.py
@@ -0,0 +1,92 @@
+"""Measure document reading durations."""
+
+from __future__ import annotations
+
+import time
+from itertools import islice
+from operator import itemgetter
+from typing import TYPE_CHECKING, cast
+
+import sphinx
+from sphinx.domains import Domain
+from sphinx.locale import __
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from docutils import nodes
+
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class DurationDomain(Domain):
+ """A domain for durations of Sphinx processing."""
+ name = 'duration'
+
+ @property
+ def reading_durations(self) -> dict[str, float]:
+ return self.data.setdefault('reading_durations', {})
+
+ def note_reading_duration(self, duration: float) -> None:
+ self.reading_durations[self.env.docname] = duration
+
+ def clear(self) -> None:
+ self.reading_durations.clear()
+
+ def clear_doc(self, docname: str) -> None:
+ self.reading_durations.pop(docname, None)
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict[str, float]) -> None:
+ for docname, duration in otherdata.items():
+ if docname in docnames:
+ self.reading_durations[docname] = duration
+
+
+def on_builder_inited(app: Sphinx) -> None:
+ """Initialize DurationDomain on bootstrap.
+
+ This clears the results of the last build.
+ """
+ domain = cast(DurationDomain, app.env.get_domain('duration'))
+ domain.clear()
+
+
+def on_source_read(app: Sphinx, docname: str, content: list[str]) -> None:
+ """Start to measure reading duration."""
+ app.env.temp_data['started_at'] = time.monotonic()
+
+
+def on_doctree_read(app: Sphinx, doctree: nodes.document) -> None:
+ """Record a reading duration."""
+ started_at = app.env.temp_data['started_at']
+ duration = time.monotonic() - started_at
+ domain = cast(DurationDomain, app.env.get_domain('duration'))
+ domain.note_reading_duration(duration)
+
+
+def on_build_finished(app: Sphinx, error: Exception) -> None:
+ """Display duration ranking on the current build."""
+ domain = cast(DurationDomain, app.env.get_domain('duration'))
+ if not domain.reading_durations:
+ return
+ durations = sorted(domain.reading_durations.items(), key=itemgetter(1), reverse=True)
+
+ logger.info('')
+ logger.info(__('====================== slowest reading durations ======================='))
+ for docname, d in islice(durations, 5):
+ logger.info(f'{d:.3f} {docname}') # NoQA: G004
+
+
+def setup(app: Sphinx) -> dict[str, bool | str]:
+ app.add_domain(DurationDomain)
+ app.connect('builder-inited', on_builder_inited)
+ app.connect('source-read', on_source_read)
+ app.connect('doctree-read', on_doctree_read)
+ app.connect('build-finished', on_build_finished)
+
+ return {
+ 'version': sphinx.__display_version__,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/ext/extlinks.py b/sphinx/ext/extlinks.py
new file mode 100644
index 0000000..173df4d
--- /dev/null
+++ b/sphinx/ext/extlinks.py
@@ -0,0 +1,125 @@
+"""Extension to save typing and prevent hard-coding of base URLs in reST files.
+
+This adds a new config value called ``extlinks`` that is created like this::
+
+ extlinks = {'exmpl': ('https://example.invalid/%s.html', caption), ...}
+
+Now you can use e.g. :exmpl:`foo` in your documents. This will create a
+link to ``https://example.invalid/foo.html``. The link caption depends on
+the *caption* value given:
+
+- If it is ``None``, the caption will be the full URL.
+- If it is a string, it must contain ``%s`` exactly once. In this case the
+ caption will be *caption* with the role content substituted for ``%s``.
+
+You can also give an explicit caption, e.g. :exmpl:`Foo <foo>`.
+
+Both, the url string and the caption string must escape ``%`` as ``%%``.
+"""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes, utils
+
+import sphinx
+from sphinx.locale import __
+from sphinx.transforms.post_transforms import SphinxPostTransform
+from sphinx.util import logging, rst
+from sphinx.util.nodes import split_explicit_title
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from docutils.nodes import Node, system_message
+ from docutils.parsers.rst.states import Inliner
+
+ from sphinx.application import Sphinx
+ from sphinx.util.typing import RoleFunction
+
+logger = logging.getLogger(__name__)
+
+
+class ExternalLinksChecker(SphinxPostTransform):
+ """
+ For each external link, check if it can be replaced by an extlink.
+
+ We treat each ``reference`` node without ``internal`` attribute as an external link.
+ """
+
+ default_priority = 500
+
+ def run(self, **kwargs: Any) -> None:
+ if not self.config.extlinks_detect_hardcoded_links:
+ return
+
+ for refnode in self.document.findall(nodes.reference):
+ self.check_uri(refnode)
+
+ def check_uri(self, refnode: nodes.reference) -> None:
+ """
+ If the URI in ``refnode`` has a replacement in ``extlinks``,
+ emit a warning with a replacement suggestion.
+ """
+ if 'internal' in refnode or 'refuri' not in refnode:
+ return
+
+ uri = refnode['refuri']
+ title = refnode.astext()
+
+ for alias, (base_uri, _caption) in self.app.config.extlinks.items():
+ uri_pattern = re.compile(re.escape(base_uri).replace('%s', '(?P<value>.+)'))
+
+ match = uri_pattern.match(uri)
+ if (
+ match and
+ match.groupdict().get('value') and
+ '/' not in match.groupdict()['value']
+ ):
+ # build a replacement suggestion
+ msg = __('hardcoded link %r could be replaced by an extlink '
+ '(try using %r instead)')
+ value = match.groupdict().get('value')
+ if uri != title:
+ replacement = f":{alias}:`{rst.escape(title)} <{value}>`"
+ else:
+ replacement = f":{alias}:`{value}`"
+ logger.warning(msg, uri, replacement, location=refnode)
+
+
+def make_link_role(name: str, base_url: str, caption: str) -> RoleFunction:
+ # Check whether we have base_url and caption strings have an '%s' for
+ # expansion. If not, fall back the the old behaviour and use the string as
+ # a prefix.
+ # Remark: It is an implementation detail that we use Pythons %-formatting.
+ # So far we only expose ``%s`` and require quoting of ``%`` using ``%%``.
+ def role(typ: str, rawtext: str, text: str, lineno: int,
+ inliner: Inliner, options: dict | None = None, content: Sequence[str] = (),
+ ) -> tuple[list[Node], list[system_message]]:
+ text = utils.unescape(text)
+ has_explicit_title, title, part = split_explicit_title(text)
+ full_url = base_url % part
+ if not has_explicit_title:
+ if caption is None:
+ title = full_url
+ else:
+ title = caption % part
+ pnode = nodes.reference(title, title, internal=False, refuri=full_url)
+ return [pnode], []
+ return role
+
+
+def setup_link_roles(app: Sphinx) -> None:
+ for name, (base_url, caption) in app.config.extlinks.items():
+ app.add_role(name, make_link_role(name, base_url, caption))
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_config_value('extlinks', {}, 'env')
+ app.add_config_value('extlinks_detect_hardcoded_links', False, 'env')
+
+ app.connect('builder-inited', setup_link_roles)
+ app.add_post_transform(ExternalLinksChecker)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/githubpages.py b/sphinx/ext/githubpages.py
new file mode 100644
index 0000000..c9be928
--- /dev/null
+++ b/sphinx/ext/githubpages.py
@@ -0,0 +1,57 @@
+"""To publish HTML docs at GitHub Pages, create .nojekyll file."""
+
+from __future__ import annotations
+
+import contextlib
+import os
+import urllib.parse
+from typing import TYPE_CHECKING, Any
+
+import sphinx
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+
+def _get_domain_from_url(url: str) -> str:
+ """Get the domain from a URL."""
+ return url and urllib.parse.urlparse(url).hostname or ''
+
+
+def create_nojekyll_and_cname(app: Sphinx, env: BuildEnvironment) -> None:
+ """Manage the ``.nojekyll`` and ``CNAME`` files for GitHub Pages.
+
+ For HTML-format builders (e.g. 'html', 'dirhtml') we unconditionally create
+ the ``.nojekyll`` file to signal that GitHub Pages should not run Jekyll
+ processing.
+
+ If the :confval:`html_baseurl` option is set, we also create a CNAME file
+ with the domain from ``html_baseurl``, so long as it is not a ``github.io``
+ domain.
+
+ If this extension is loaded and the domain in ``html_baseurl`` no longer
+ requires a CNAME file, we remove any existing ``CNAME`` files from the
+ output directory.
+ """
+ if app.builder.format != 'html':
+ return
+
+ app.builder.outdir.joinpath('.nojekyll').touch()
+ cname_path = os.path.join(app.builder.outdir, 'CNAME')
+
+ domain = _get_domain_from_url(app.config.html_baseurl)
+ # Filter out GitHub Pages domains, as they do not require CNAME files.
+ if domain and not domain.endswith(".github.io"):
+ with open(cname_path, 'w', encoding="utf-8") as f:
+ # NOTE: don't write a trailing newline. The `CNAME` file that's
+ # auto-generated by the GitHub UI doesn't have one.
+ f.write(domain)
+ else:
+ with contextlib.suppress(FileNotFoundError):
+ os.unlink(cname_path)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.connect('env-updated', create_nojekyll_and_cname)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/graphviz.py b/sphinx/ext/graphviz.py
new file mode 100644
index 0000000..528bf30
--- /dev/null
+++ b/sphinx/ext/graphviz.py
@@ -0,0 +1,467 @@
+"""Allow graphviz-formatted graphs to be included inline in generated documents.
+"""
+
+from __future__ import annotations
+
+import posixpath
+import re
+import subprocess
+import xml.etree.ElementTree as ET
+from hashlib import sha1
+from itertools import chain
+from os import path
+from subprocess import CalledProcessError
+from typing import TYPE_CHECKING, Any
+from urllib.parse import urlsplit, urlunsplit
+
+from docutils import nodes
+from docutils.parsers.rst import Directive, directives
+
+import sphinx
+from sphinx.errors import SphinxError
+from sphinx.locale import _, __
+from sphinx.util import logging
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.i18n import search_image_for_language
+from sphinx.util.nodes import set_source_info
+from sphinx.util.osutil import ensuredir
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+ from sphinx.util.typing import OptionSpec
+ from sphinx.writers.html import HTML5Translator
+ from sphinx.writers.latex import LaTeXTranslator
+ from sphinx.writers.manpage import ManualPageTranslator
+ from sphinx.writers.texinfo import TexinfoTranslator
+ from sphinx.writers.text import TextTranslator
+
+logger = logging.getLogger(__name__)
+
+
+class GraphvizError(SphinxError):
+ category = 'Graphviz error'
+
+
+class ClickableMapDefinition:
+ """A manipulator for clickable map file of graphviz."""
+ maptag_re = re.compile('<map id="(.*?)"')
+ href_re = re.compile('href=".*?"')
+
+ def __init__(self, filename: str, content: str, dot: str = '') -> None:
+ self.id: str | None = None
+ self.filename = filename
+ self.content = content.splitlines()
+ self.clickable: list[str] = []
+
+ self.parse(dot=dot)
+
+ def parse(self, dot: str) -> None:
+ matched = self.maptag_re.match(self.content[0])
+ if not matched:
+ raise GraphvizError('Invalid clickable map file found: %s' % self.filename)
+
+ self.id = matched.group(1)
+ if self.id == '%3':
+ # graphviz generates wrong ID if graph name not specified
+ # https://gitlab.com/graphviz/graphviz/issues/1327
+ hashed = sha1(dot.encode(), usedforsecurity=False).hexdigest()
+ self.id = 'grapviz%s' % hashed[-10:]
+ self.content[0] = self.content[0].replace('%3', self.id)
+
+ for line in self.content:
+ if self.href_re.search(line):
+ self.clickable.append(line)
+
+ def generate_clickable_map(self) -> str:
+ """Generate clickable map tags if clickable item exists.
+
+ If not exists, this only returns empty string.
+ """
+ if self.clickable:
+ return '\n'.join([self.content[0]] + self.clickable + [self.content[-1]])
+ else:
+ return ''
+
+
+class graphviz(nodes.General, nodes.Inline, nodes.Element):
+ pass
+
+
+def figure_wrapper(directive: Directive, node: graphviz, caption: str) -> nodes.figure:
+ figure_node = nodes.figure('', node)
+ if 'align' in node:
+ figure_node['align'] = node.attributes.pop('align')
+
+ inodes, messages = directive.state.inline_text(caption, directive.lineno)
+ caption_node = nodes.caption(caption, '', *inodes)
+ caption_node.extend(messages)
+ set_source_info(directive, caption_node)
+ figure_node += caption_node
+ return figure_node
+
+
+def align_spec(argument: Any) -> str:
+ return directives.choice(argument, ('left', 'center', 'right'))
+
+
+class Graphviz(SphinxDirective):
+ """
+ Directive to insert arbitrary dot markup.
+ """
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 1
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'alt': directives.unchanged,
+ 'align': align_spec,
+ 'caption': directives.unchanged,
+ 'layout': directives.unchanged,
+ 'graphviz_dot': directives.unchanged, # an old alias of `layout` option
+ 'name': directives.unchanged,
+ 'class': directives.class_option,
+ }
+
+ def run(self) -> list[Node]:
+ 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)]
+ argument = search_image_for_language(self.arguments[0], self.env)
+ rel_filename, filename = self.env.relfn2path(argument)
+ self.env.note_dependency(rel_filename)
+ try:
+ with open(filename, encoding='utf-8') as fp:
+ dotcode = fp.read()
+ except 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)
+ rel_filename = None
+ 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'] = {'docname': self.env.docname}
+
+ if 'graphviz_dot' in self.options:
+ node['options']['graphviz_dot'] = self.options['graphviz_dot']
+ if 'layout' in self.options:
+ node['options']['graphviz_dot'] = self.options['layout']
+ if 'alt' in self.options:
+ node['alt'] = self.options['alt']
+ if 'align' in self.options:
+ node['align'] = self.options['align']
+ if 'class' in self.options:
+ node['classes'] = self.options['class']
+ if rel_filename:
+ node['filename'] = rel_filename
+
+ if 'caption' not in self.options:
+ self.add_name(node)
+ return [node]
+ else:
+ figure = figure_wrapper(self, node, self.options['caption'])
+ self.add_name(figure)
+ return [figure]
+
+
+class GraphvizSimple(SphinxDirective):
+ """
+ Directive to insert arbitrary dot markup.
+ """
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'alt': directives.unchanged,
+ 'align': align_spec,
+ 'caption': directives.unchanged,
+ 'layout': directives.unchanged,
+ 'graphviz_dot': directives.unchanged, # an old alias of `layout` option
+ 'name': directives.unchanged,
+ 'class': directives.class_option,
+ }
+
+ def run(self) -> list[Node]:
+ node = graphviz()
+ node['code'] = '%s %s {\n%s\n}\n' % \
+ (self.name, self.arguments[0], '\n'.join(self.content))
+ node['options'] = {'docname': self.env.docname}
+ if 'graphviz_dot' in self.options:
+ node['options']['graphviz_dot'] = self.options['graphviz_dot']
+ if 'layout' in self.options:
+ node['options']['graphviz_dot'] = self.options['layout']
+ if 'alt' in self.options:
+ node['alt'] = self.options['alt']
+ if 'align' in self.options:
+ node['align'] = self.options['align']
+ if 'class' in self.options:
+ node['classes'] = self.options['class']
+
+ if 'caption' not in self.options:
+ self.add_name(node)
+ return [node]
+ else:
+ figure = figure_wrapper(self, node, self.options['caption'])
+ self.add_name(figure)
+ return [figure]
+
+
+def fix_svg_relative_paths(self: HTML5Translator | LaTeXTranslator | TexinfoTranslator,
+ filepath: str) -> None:
+ """Change relative links in generated svg files to be relative to imgpath."""
+ tree = ET.parse(filepath) # NoQA: S314
+ root = tree.getroot()
+ ns = {'svg': 'http://www.w3.org/2000/svg', 'xlink': 'http://www.w3.org/1999/xlink'}
+ href_name = '{http://www.w3.org/1999/xlink}href'
+ modified = False
+
+ for element in chain(
+ root.findall('.//svg:image[@xlink:href]', ns),
+ root.findall('.//svg:a[@xlink:href]', ns),
+ ):
+ scheme, hostname, rel_uri, query, fragment = urlsplit(element.attrib[href_name])
+ if hostname:
+ # not a relative link
+ continue
+
+ docname = self.builder.env.path2doc(self.document["source"])
+ if docname is None:
+ # This shouldn't happen!
+ continue
+ doc_dir = self.builder.app.outdir.joinpath(docname).resolve().parent
+
+ old_path = doc_dir / rel_uri
+ img_path = doc_dir / self.builder.imgpath
+ new_path = path.relpath(old_path, start=img_path)
+ modified_url = urlunsplit((scheme, hostname, new_path, query, fragment))
+
+ element.set(href_name, modified_url)
+ modified = True
+
+ if modified:
+ tree.write(filepath)
+
+
+def render_dot(self: HTML5Translator | LaTeXTranslator | TexinfoTranslator,
+ code: str, options: dict, format: str,
+ prefix: str = 'graphviz', filename: str | None = None,
+ ) -> tuple[str | None, str | None]:
+ """Render graphviz code into a PNG or PDF output file."""
+ graphviz_dot = options.get('graphviz_dot', self.builder.config.graphviz_dot)
+ if not graphviz_dot:
+ raise GraphvizError(
+ __('graphviz_dot executable path must be set! %r') % graphviz_dot,
+ )
+ hashkey = (code + str(options) + str(graphviz_dot) +
+ str(self.builder.config.graphviz_dot_args)).encode()
+
+ fname = f'{prefix}-{sha1(hashkey, usedforsecurity=False).hexdigest()}.{format}'
+ relfn = posixpath.join(self.builder.imgpath, fname)
+ outfn = path.join(self.builder.outdir, self.builder.imagedir, fname)
+
+ if path.isfile(outfn):
+ return relfn, outfn
+
+ if (hasattr(self.builder, '_graphviz_warned_dot') and
+ self.builder._graphviz_warned_dot.get(graphviz_dot)):
+ return None, None
+
+ ensuredir(path.dirname(outfn))
+
+ dot_args = [graphviz_dot]
+ dot_args.extend(self.builder.config.graphviz_dot_args)
+ dot_args.extend(['-T' + format, '-o' + outfn])
+
+ docname = options.get('docname', 'index')
+ if filename:
+ cwd = path.dirname(path.join(self.builder.srcdir, filename))
+ else:
+ cwd = path.dirname(path.join(self.builder.srcdir, docname))
+
+ if format == 'png':
+ dot_args.extend(['-Tcmapx', '-o%s.map' % outfn])
+
+ try:
+ ret = subprocess.run(dot_args, input=code.encode(), capture_output=True,
+ cwd=cwd, check=True)
+ except OSError:
+ logger.warning(__('dot command %r cannot be run (needed for graphviz '
+ 'output), check the graphviz_dot setting'), graphviz_dot)
+ if not hasattr(self.builder, '_graphviz_warned_dot'):
+ self.builder._graphviz_warned_dot = {} # type: ignore[union-attr]
+ self.builder._graphviz_warned_dot[graphviz_dot] = True
+ return None, None
+ except CalledProcessError as exc:
+ raise GraphvizError(__('dot exited with error:\n[stderr]\n%r\n'
+ '[stdout]\n%r') % (exc.stderr, exc.stdout)) from exc
+ if not path.isfile(outfn):
+ raise GraphvizError(__('dot did not produce an output file:\n[stderr]\n%r\n'
+ '[stdout]\n%r') % (ret.stderr, ret.stdout))
+
+ if format == 'svg':
+ fix_svg_relative_paths(self, outfn)
+
+ return relfn, outfn
+
+
+def render_dot_html(self: HTML5Translator, node: graphviz, code: str, options: dict,
+ prefix: str = 'graphviz', imgcls: str | None = None,
+ alt: str | None = None, filename: str | None = None,
+ ) -> tuple[str, str]:
+ format = self.builder.config.graphviz_output_format
+ try:
+ if format not in ('png', 'svg'):
+ raise GraphvizError(__("graphviz_output_format must be one of 'png', "
+ "'svg', but is %r") % format)
+ fname, outfn = render_dot(self, code, options, format, prefix, filename)
+ except GraphvizError as exc:
+ logger.warning(__('dot code %r: %s'), code, exc)
+ raise nodes.SkipNode from exc
+
+ classes = [imgcls, 'graphviz'] + node.get('classes', [])
+ imgcls = ' '.join(filter(None, classes))
+
+ if fname is None:
+ self.body.append(self.encode(code))
+ else:
+ if alt is None:
+ alt = node.get('alt', self.encode(code).strip())
+ if 'align' in node:
+ self.body.append('<div align="%s" class="align-%s">' %
+ (node['align'], node['align']))
+ if format == 'svg':
+ self.body.append('<div class="graphviz">')
+ self.body.append('<object data="%s" type="image/svg+xml" class="%s">\n' %
+ (fname, imgcls))
+ self.body.append('<p class="warning">%s</p>' % alt)
+ self.body.append('</object></div>\n')
+ else:
+ assert outfn is not None
+ with open(outfn + '.map', encoding='utf-8') as mapfile:
+ imgmap = ClickableMapDefinition(outfn + '.map', mapfile.read(), dot=code)
+ if imgmap.clickable:
+ # has a map
+ self.body.append('<div class="graphviz">')
+ self.body.append('<img src="%s" alt="%s" usemap="#%s" class="%s" />' %
+ (fname, alt, imgmap.id, imgcls))
+ self.body.append('</div>\n')
+ self.body.append(imgmap.generate_clickable_map())
+ else:
+ # nothing in image map
+ self.body.append('<div class="graphviz">')
+ self.body.append('<img src="%s" alt="%s" class="%s" />' %
+ (fname, alt, imgcls))
+ self.body.append('</div>\n')
+ if 'align' in node:
+ self.body.append('</div>\n')
+
+ raise nodes.SkipNode
+
+
+def html_visit_graphviz(self: HTML5Translator, node: graphviz) -> None:
+ render_dot_html(self, node, node['code'], node['options'], filename=node.get('filename'))
+
+
+def render_dot_latex(self: LaTeXTranslator, node: graphviz, code: str,
+ options: dict, prefix: str = 'graphviz', filename: str | None = None,
+ ) -> None:
+ try:
+ fname, outfn = render_dot(self, code, options, 'pdf', prefix, filename)
+ except GraphvizError as exc:
+ logger.warning(__('dot code %r: %s'), code, exc)
+ raise nodes.SkipNode from exc
+
+ is_inline = self.is_inline(node)
+
+ if not is_inline:
+ pre = ''
+ post = ''
+ if 'align' in node:
+ if node['align'] == 'left':
+ pre = '{'
+ post = r'\hspace*{\fill}}'
+ elif node['align'] == 'right':
+ pre = r'{\hspace*{\fill}'
+ post = '}'
+ elif node['align'] == 'center':
+ pre = r'{\hfill'
+ post = r'\hspace*{\fill}}'
+ self.body.append('\n%s' % pre)
+
+ self.body.append(r'\sphinxincludegraphics[]{%s}' % fname)
+
+ if not is_inline:
+ self.body.append('%s\n' % post)
+
+ raise nodes.SkipNode
+
+
+def latex_visit_graphviz(self: LaTeXTranslator, node: graphviz) -> None:
+ render_dot_latex(self, node, node['code'], node['options'], filename=node.get('filename'))
+
+
+def render_dot_texinfo(self: TexinfoTranslator, node: graphviz, code: str,
+ options: dict, prefix: str = 'graphviz') -> None:
+ try:
+ fname, outfn = render_dot(self, code, options, 'png', prefix)
+ except GraphvizError as exc:
+ logger.warning(__('dot code %r: %s'), code, exc)
+ raise nodes.SkipNode from exc
+ if fname is not None:
+ self.body.append('@image{%s,,,[graphviz],png}\n' % fname[:-4])
+ raise nodes.SkipNode
+
+
+def texinfo_visit_graphviz(self: TexinfoTranslator, node: graphviz) -> None:
+ render_dot_texinfo(self, node, node['code'], node['options'])
+
+
+def text_visit_graphviz(self: TextTranslator, node: graphviz) -> None:
+ if 'alt' in node.attributes:
+ self.add_text(_('[graph: %s]') % node['alt'])
+ else:
+ self.add_text(_('[graph]'))
+ raise nodes.SkipNode
+
+
+def man_visit_graphviz(self: ManualPageTranslator, node: graphviz) -> None:
+ if 'alt' in node.attributes:
+ self.body.append(_('[graph: %s]') % node['alt'])
+ else:
+ self.body.append(_('[graph]'))
+ raise nodes.SkipNode
+
+
+def on_config_inited(_app: Sphinx, config: Config) -> None:
+ css_path = path.join(sphinx.package_dir, 'templates', 'graphviz', 'graphviz.css')
+ config.html_static_path.append(css_path)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ 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)
+ app.add_directive('graph', GraphvizSimple)
+ app.add_directive('digraph', GraphvizSimple)
+ app.add_config_value('graphviz_dot', 'dot', 'html')
+ app.add_config_value('graphviz_dot_args', [], 'html')
+ app.add_config_value('graphviz_output_format', 'png', 'html')
+ app.add_css_file('graphviz.css')
+ app.connect('config-inited', on_config_inited)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/ifconfig.py b/sphinx/ext/ifconfig.py
new file mode 100644
index 0000000..1d2b197
--- /dev/null
+++ b/sphinx/ext/ifconfig.py
@@ -0,0 +1,81 @@
+"""Provides the ``ifconfig`` directive.
+
+The ``ifconfig`` directive enables writing documentation
+that is included depending on configuration variables.
+
+Usage::
+
+ .. ifconfig:: releaselevel in ('alpha', 'beta', 'rc')
+
+ This stuff is only included in the built docs for unstable versions.
+
+The argument for ``ifconfig`` is a plain Python expression, evaluated in the
+namespace of the project configuration (that is, all variables from
+``conf.py`` are available.)
+"""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+import sphinx
+from sphinx.util.docutils import SphinxDirective
+from sphinx.util.nodes import nested_parse_with_titles
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.util.typing import OptionSpec
+
+
+class ifconfig(nodes.Element):
+ pass
+
+
+class IfConfig(SphinxDirective):
+
+ has_content = True
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ node = ifconfig()
+ node.document = self.state.document
+ self.set_source_info(node)
+ node['expr'] = self.arguments[0]
+ nested_parse_with_titles(self.state, self.content, node, self.content_offset)
+ return [node]
+
+
+def process_ifconfig_nodes(app: Sphinx, doctree: nodes.document, docname: str) -> None:
+ ns = {confval.name: confval.value for confval in app.config}
+ ns.update(app.config.__dict__.copy())
+ ns['builder'] = app.builder.name
+ for node in list(doctree.findall(ifconfig)):
+ try:
+ res = eval(node['expr'], ns) # NoQA: PGH001
+ except Exception as err:
+ # handle exceptions in a clean fashion
+ from traceback import format_exception_only
+ msg = ''.join(format_exception_only(err.__class__, err))
+ newnode = doctree.reporter.error('Exception occurred in '
+ 'ifconfig expression: \n%s' %
+ msg, base_node=node)
+ node.replace_self(newnode)
+ else:
+ if not res:
+ node.replace_self([])
+ else:
+ node.replace_self(node.children)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_node(ifconfig)
+ app.add_directive('ifconfig', IfConfig)
+ app.connect('doctree-resolved', process_ifconfig_nodes)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/imgconverter.py b/sphinx/ext/imgconverter.py
new file mode 100644
index 0000000..071a2cf
--- /dev/null
+++ b/sphinx/ext/imgconverter.py
@@ -0,0 +1,94 @@
+"""Image converter extension for Sphinx"""
+
+from __future__ import annotations
+
+import subprocess
+import sys
+from subprocess import CalledProcessError
+from typing import TYPE_CHECKING, Any
+
+import sphinx
+from sphinx.errors import ExtensionError
+from sphinx.locale import __
+from sphinx.transforms.post_transforms.images import ImageConverter
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class ImagemagickConverter(ImageConverter):
+ conversion_rules = [
+ ('image/svg+xml', 'image/png'),
+ ('image/gif', 'image/png'),
+ ('application/pdf', 'image/png'),
+ ('application/illustrator', 'image/png'),
+ ]
+
+ def is_available(self) -> bool:
+ """Confirms the converter is available or not."""
+ try:
+ args = [self.config.image_converter, '-version']
+ logger.debug('Invoking %r ...', args)
+ subprocess.run(args, capture_output=True, check=True)
+ return True
+ except OSError as exc:
+ logger.warning(__(
+ "Unable to run the image conversion command %r. "
+ "'sphinx.ext.imgconverter' requires ImageMagick by default. "
+ "Ensure it is installed, or set the 'image_converter' option "
+ "to a custom conversion command.\n\n"
+ "Traceback: %s",
+ ), self.config.image_converter, exc)
+ return False
+ except CalledProcessError as exc:
+ logger.warning(__('convert exited with error:\n'
+ '[stderr]\n%r\n[stdout]\n%r'),
+ exc.stderr, exc.stdout)
+ return False
+
+ def convert(self, _from: str, _to: str) -> bool:
+ """Converts the image to expected one."""
+ try:
+ # append an index 0 to source filename to pick up the first frame
+ # (or first page) of image (ex. Animation GIF, PDF)
+ _from += '[0]'
+
+ args = ([self.config.image_converter] +
+ self.config.image_converter_args +
+ [_from, _to])
+ logger.debug('Invoking %r ...', args)
+ subprocess.run(args, capture_output=True, check=True)
+ return True
+ except OSError:
+ logger.warning(__('convert command %r cannot be run, '
+ 'check the image_converter setting'),
+ self.config.image_converter)
+ return False
+ except CalledProcessError as exc:
+ raise ExtensionError(__('convert exited with error:\n'
+ '[stderr]\n%r\n[stdout]\n%r') %
+ (exc.stderr, exc.stdout)) from exc
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_post_transform(ImagemagickConverter)
+ if sys.platform == 'win32':
+ # On Windows, we use Imagemagik v7 by default to avoid the trouble for
+ # convert.exe bundled with Windows.
+ app.add_config_value('image_converter', 'magick', 'env')
+ app.add_config_value('image_converter_args', ['convert'], 'env')
+ else:
+ # On other platform, we use Imagemagick v6 by default. Especially,
+ # Debian/Ubuntu are still based of v6. So we can't use "magick" command
+ # for these platforms.
+ app.add_config_value('image_converter', 'convert', 'env')
+ app.add_config_value('image_converter_args', [], 'env')
+
+ return {
+ 'version': sphinx.__display_version__,
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py
new file mode 100644
index 0000000..a5f49d9
--- /dev/null
+++ b/sphinx/ext/imgmath.py
@@ -0,0 +1,407 @@
+"""Render math in HTML via dvipng or dvisvgm."""
+
+from __future__ import annotations
+
+import base64
+import contextlib
+import re
+import shutil
+import subprocess
+import tempfile
+from hashlib import sha1
+from os import path
+from subprocess import CalledProcessError
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+import sphinx
+from sphinx import package_dir
+from sphinx.errors import SphinxError
+from sphinx.locale import _, __
+from sphinx.util import logging
+from sphinx.util.math import get_node_equation_number, wrap_displaymath
+from sphinx.util.osutil import ensuredir
+from sphinx.util.png import read_png_depth, write_png_depth
+from sphinx.util.template import LaTeXRenderer
+
+if TYPE_CHECKING:
+ import os
+
+ from docutils.nodes import Element
+
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.config import Config
+ from sphinx.writers.html import HTML5Translator
+
+logger = logging.getLogger(__name__)
+
+templates_path = path.join(package_dir, 'templates', 'imgmath')
+
+__all__ = ()
+
+
+class MathExtError(SphinxError):
+ category = 'Math extension error'
+
+ def __init__(
+ self, msg: str, stderr: str | None = None, stdout: str | None = None,
+ ) -> None:
+ if stderr:
+ msg += '\n[stderr]\n' + stderr
+ if stdout:
+ msg += '\n[stdout]\n' + stdout
+ super().__init__(msg)
+
+
+class InvokeError(SphinxError):
+ """errors on invoking converters."""
+
+
+SUPPORT_FORMAT = ('png', 'svg')
+
+depth_re = re.compile(r'\[\d+ depth=(-?\d+)\]')
+depthsvg_re = re.compile(r'.*, depth=(.*)pt')
+depthsvgcomment_re = re.compile(r'<!-- DEPTH=(-?\d+) -->')
+
+
+def read_svg_depth(filename: str) -> int | None:
+ """Read the depth from comment at last line of SVG file
+ """
+ with open(filename, encoding="utf-8") as f:
+ for line in f: # noqa: B007
+ pass
+ # Only last line is checked
+ matched = depthsvgcomment_re.match(line)
+ if matched:
+ return int(matched.group(1))
+ return None
+
+
+def write_svg_depth(filename: str, depth: int) -> None:
+ """Write the depth to SVG file as a comment at end of file
+ """
+ with open(filename, 'a', encoding="utf-8") as f:
+ f.write('\n<!-- DEPTH=%s -->' % depth)
+
+
+def generate_latex_macro(image_format: str,
+ math: str,
+ config: Config,
+ confdir: str | os.PathLike[str] = '') -> str:
+ """Generate LaTeX macro."""
+ variables = {
+ 'fontsize': config.imgmath_font_size,
+ 'baselineskip': int(round(config.imgmath_font_size * 1.2)),
+ 'preamble': config.imgmath_latex_preamble,
+ # the dvips option is important when imgmath_latex in ["xelatex", "tectonic"],
+ # it has no impact when imgmath_latex="latex"
+ 'tightpage': '' if image_format == 'png' else ',dvips,tightpage',
+ 'math': math,
+ }
+
+ if config.imgmath_use_preview:
+ template_name = 'preview.tex_t'
+ else:
+ template_name = 'template.tex_t'
+
+ for template_dir in config.templates_path:
+ template = path.join(confdir, template_dir, template_name)
+ if path.exists(template):
+ return LaTeXRenderer().render(template, variables)
+
+ return LaTeXRenderer(templates_path).render(template_name, variables)
+
+
+def ensure_tempdir(builder: Builder) -> str:
+ """Create temporary directory.
+
+ use only one tempdir per build -- the use of a directory is cleaner
+ than using temporary files, since we can clean up everything at once
+ just removing the whole directory (see cleanup_tempdir)
+ """
+ if not hasattr(builder, '_imgmath_tempdir'):
+ builder._imgmath_tempdir = tempfile.mkdtemp() # type: ignore[attr-defined]
+
+ return builder._imgmath_tempdir # type: ignore[attr-defined]
+
+
+def compile_math(latex: str, builder: Builder) -> str:
+ """Compile LaTeX macros for math to DVI."""
+ tempdir = ensure_tempdir(builder)
+ filename = path.join(tempdir, 'math.tex')
+ with open(filename, 'w', encoding='utf-8') as f:
+ f.write(latex)
+
+ imgmath_latex_name = path.basename(builder.config.imgmath_latex)
+
+ # build latex command; old versions of latex don't have the
+ # --output-directory option, so we have to manually chdir to the
+ # temp dir to run it.
+ command = [builder.config.imgmath_latex]
+ if imgmath_latex_name not in ['tectonic']:
+ command.append('--interaction=nonstopmode')
+ # add custom args from the config file
+ command.extend(builder.config.imgmath_latex_args)
+ command.append('math.tex')
+
+ try:
+ subprocess.run(command, capture_output=True, cwd=tempdir, check=True,
+ encoding='ascii')
+ if imgmath_latex_name in ['xelatex', 'tectonic']:
+ return path.join(tempdir, 'math.xdv')
+ else:
+ return path.join(tempdir, 'math.dvi')
+ except OSError as exc:
+ logger.warning(__('LaTeX command %r cannot be run (needed for math '
+ 'display), check the imgmath_latex setting'),
+ builder.config.imgmath_latex)
+ raise InvokeError from exc
+ except CalledProcessError as exc:
+ msg = 'latex exited with error'
+ raise MathExtError(msg, exc.stderr, exc.stdout) from exc
+
+
+def convert_dvi_to_image(command: list[str], name: str) -> tuple[str, str]:
+ """Convert DVI file to specific image format."""
+ try:
+ ret = subprocess.run(command, capture_output=True, check=True, encoding='ascii')
+ return ret.stdout, ret.stderr
+ except OSError as exc:
+ logger.warning(__('%s command %r cannot be run (needed for math '
+ 'display), check the imgmath_%s setting'),
+ name, command[0], name)
+ raise InvokeError from exc
+ except CalledProcessError as exc:
+ raise MathExtError('%s exited with error' % name, exc.stderr, exc.stdout) from exc
+
+
+def convert_dvi_to_png(dvipath: str, builder: Builder, out_path: str) -> int | None:
+ """Convert DVI file to PNG image."""
+ name = 'dvipng'
+ command = [builder.config.imgmath_dvipng, '-o', out_path, '-T', 'tight', '-z9']
+ command.extend(builder.config.imgmath_dvipng_args)
+ if builder.config.imgmath_use_preview:
+ command.append('--depth')
+ command.append(dvipath)
+
+ stdout, stderr = convert_dvi_to_image(command, name)
+
+ depth = None
+ if builder.config.imgmath_use_preview:
+ for line in stdout.splitlines():
+ matched = depth_re.match(line)
+ if matched:
+ depth = int(matched.group(1))
+ write_png_depth(out_path, depth)
+ break
+
+ return depth
+
+
+def convert_dvi_to_svg(dvipath: str, builder: Builder, out_path: str) -> int | None:
+ """Convert DVI file to SVG image."""
+ name = 'dvisvgm'
+ command = [builder.config.imgmath_dvisvgm, '-o', out_path]
+ command.extend(builder.config.imgmath_dvisvgm_args)
+ command.append(dvipath)
+
+ stdout, stderr = convert_dvi_to_image(command, name)
+
+ depth = None
+ if builder.config.imgmath_use_preview:
+ for line in stderr.splitlines(): # not stdout !
+ matched = depthsvg_re.match(line)
+ if matched:
+ depth = round(float(matched.group(1)) * 100 / 72.27) # assume 100ppi
+ write_svg_depth(out_path, depth)
+ break
+
+ return depth
+
+
+def render_math(
+ self: HTML5Translator,
+ math: str,
+) -> tuple[str | None, int | None]:
+ """Render the LaTeX math expression *math* using latex and dvipng or
+ dvisvgm.
+
+ Return the image absolute filename and the "depth",
+ that is, the distance of image bottom and baseline in pixels, if the
+ option to use preview_latex is switched on.
+
+ Error handling may seem strange, but follows a pattern: if LaTeX or dvipng
+ (dvisvgm) aren't available, only a warning is generated (since that enables
+ people on machines without these programs to at least build the rest of the
+ docs successfully). If the programs are there, however, they may not fail
+ since that indicates a problem in the math source.
+ """
+ image_format = self.builder.config.imgmath_image_format.lower()
+ if image_format not in SUPPORT_FORMAT:
+ unsupported_format_msg = 'imgmath_image_format must be either "png" or "svg"'
+ raise MathExtError(unsupported_format_msg)
+
+ latex = generate_latex_macro(image_format,
+ math,
+ self.builder.config,
+ self.builder.confdir)
+
+ filename = f"{sha1(latex.encode(), usedforsecurity=False).hexdigest()}.{image_format}"
+ generated_path = path.join(self.builder.outdir, self.builder.imagedir, 'math', filename)
+ ensuredir(path.dirname(generated_path))
+ if path.isfile(generated_path):
+ if image_format == 'png':
+ depth = read_png_depth(generated_path)
+ elif image_format == 'svg':
+ depth = read_svg_depth(generated_path)
+ return generated_path, depth
+
+ # if latex or dvipng (dvisvgm) has failed once, don't bother to try again
+ if hasattr(self.builder, '_imgmath_warned_latex') or \
+ hasattr(self.builder, '_imgmath_warned_image_translator'):
+ return None, None
+
+ # .tex -> .dvi
+ try:
+ dvipath = compile_math(latex, self.builder)
+ except InvokeError:
+ self.builder._imgmath_warned_latex = True # type: ignore[attr-defined]
+ return None, None
+
+ # .dvi -> .png/.svg
+ try:
+ if image_format == 'png':
+ depth = convert_dvi_to_png(dvipath, self.builder, generated_path)
+ elif image_format == 'svg':
+ depth = convert_dvi_to_svg(dvipath, self.builder, generated_path)
+ except InvokeError:
+ self.builder._imgmath_warned_image_translator = True # type: ignore[attr-defined]
+ return None, None
+
+ return generated_path, depth
+
+
+def render_maths_to_base64(image_format: str, generated_path: str) -> str:
+ with open(generated_path, "rb") as f:
+ encoded = base64.b64encode(f.read()).decode(encoding='utf-8')
+ if image_format == 'png':
+ return f'data:image/png;base64,{encoded}'
+ if image_format == 'svg':
+ return f'data:image/svg+xml;base64,{encoded}'
+ unsupported_format_msg = 'imgmath_image_format must be either "png" or "svg"'
+ raise MathExtError(unsupported_format_msg)
+
+
+def clean_up_files(app: Sphinx, exc: Exception) -> None:
+ if exc:
+ return
+
+ if hasattr(app.builder, '_imgmath_tempdir'):
+ with contextlib.suppress(Exception):
+ shutil.rmtree(app.builder._imgmath_tempdir)
+
+ if app.builder.config.imgmath_embed:
+ # in embed mode, the images are still generated in the math output dir
+ # to be shared across workers, but are not useful to the final document
+ with contextlib.suppress(Exception):
+ shutil.rmtree(path.join(app.builder.outdir, app.builder.imagedir, 'math'))
+
+
+def get_tooltip(self: HTML5Translator, node: Element) -> str:
+ if self.builder.config.imgmath_add_tooltips:
+ return ' alt="%s"' % self.encode(node.astext()).strip()
+ return ''
+
+
+def html_visit_math(self: HTML5Translator, node: nodes.math) -> None:
+ try:
+ rendered_path, depth = render_math(self, '$' + node.astext() + '$')
+ except MathExtError as exc:
+ msg = str(exc)
+ sm = nodes.system_message(msg, type='WARNING', level=2,
+ backrefs=[], source=node.astext())
+ sm.walkabout(self)
+ logger.warning(__('display latex %r: %s'), node.astext(), msg)
+ raise nodes.SkipNode from exc
+
+ if rendered_path is None:
+ # something failed -- use text-only as a bad substitute
+ self.body.append('<span class="math">%s</span>' %
+ self.encode(node.astext()).strip())
+ else:
+ if self.builder.config.imgmath_embed:
+ image_format = self.builder.config.imgmath_image_format.lower()
+ img_src = render_maths_to_base64(image_format, rendered_path)
+ else:
+ bname = path.basename(rendered_path)
+ relative_path = path.join(self.builder.imgpath, 'math', bname)
+ img_src = relative_path.replace(path.sep, '/')
+ c = f'<img class="math" src="{img_src}"' + get_tooltip(self, node)
+ if depth is not None:
+ c += f' style="vertical-align: {-depth:d}px"'
+ self.body.append(c + '/>')
+ raise nodes.SkipNode
+
+
+def html_visit_displaymath(self: HTML5Translator, node: nodes.math_block) -> None:
+ if node['nowrap']:
+ latex = node.astext()
+ else:
+ latex = wrap_displaymath(node.astext(), None, False)
+ try:
+ rendered_path, depth = render_math(self, latex)
+ except MathExtError as exc:
+ msg = str(exc)
+ sm = nodes.system_message(msg, type='WARNING', level=2,
+ backrefs=[], source=node.astext())
+ sm.walkabout(self)
+ logger.warning(__('inline latex %r: %s'), node.astext(), msg)
+ raise nodes.SkipNode from exc
+ self.body.append(self.starttag(node, 'div', CLASS='math'))
+ self.body.append('<p>')
+ if node['number']:
+ number = get_node_equation_number(self, node)
+ self.body.append('<span class="eqno">(%s)' % number)
+ self.add_permalink_ref(node, _('Link to this equation'))
+ self.body.append('</span>')
+
+ if rendered_path is None:
+ # something failed -- use text-only as a bad substitute
+ self.body.append('<span class="math">%s</span></p>\n</div>' %
+ self.encode(node.astext()).strip())
+ else:
+ if self.builder.config.imgmath_embed:
+ image_format = self.builder.config.imgmath_image_format.lower()
+ img_src = render_maths_to_base64(image_format, rendered_path)
+ else:
+ bname = path.basename(rendered_path)
+ relative_path = path.join(self.builder.imgpath, 'math', bname)
+ img_src = relative_path.replace(path.sep, '/')
+ self.body.append(f'<img src="{img_src}"' + get_tooltip(self, node) +
+ '/></p>\n</div>')
+ raise nodes.SkipNode
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_html_math_renderer('imgmath',
+ (html_visit_math, None),
+ (html_visit_displaymath, None))
+
+ app.add_config_value('imgmath_image_format', 'png', 'html')
+ app.add_config_value('imgmath_dvipng', 'dvipng', 'html')
+ app.add_config_value('imgmath_dvisvgm', 'dvisvgm', 'html')
+ app.add_config_value('imgmath_latex', 'latex', 'html')
+ app.add_config_value('imgmath_use_preview', False, 'html')
+ app.add_config_value('imgmath_dvipng_args',
+ ['-gamma', '1.5', '-D', '110', '-bg', 'Transparent'],
+ 'html')
+ app.add_config_value('imgmath_dvisvgm_args', ['--no-fonts'], 'html')
+ app.add_config_value('imgmath_latex_args', [], 'html')
+ app.add_config_value('imgmath_latex_preamble', '', 'html')
+ app.add_config_value('imgmath_add_tooltips', True, 'html')
+ app.add_config_value('imgmath_font_size', 12, 'html')
+ app.add_config_value('imgmath_embed', False, 'html', [bool])
+ app.connect('build-finished', clean_up_files)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/inheritance_diagram.py b/sphinx/ext/inheritance_diagram.py
new file mode 100644
index 0000000..3a015a2
--- /dev/null
+++ b/sphinx/ext/inheritance_diagram.py
@@ -0,0 +1,494 @@
+r"""Defines a docutils directive for inserting inheritance diagrams.
+
+Provide the directive with one or more classes or modules (separated
+by whitespace). For modules, all of the classes in that module will
+be used.
+
+Example::
+
+ Given the following classes:
+
+ class A: pass
+ class B(A): pass
+ class C(A): pass
+ class D(B, C): pass
+ class E(B): pass
+
+ .. inheritance-diagram: D E
+
+ Produces a graph like the following:
+
+ A
+ / \
+ B C
+ / \ /
+ E D
+
+The graph is inserted as a PNG+image map into HTML and a PDF in
+LaTeX.
+"""
+
+from __future__ import annotations
+
+import builtins
+import hashlib
+import inspect
+import re
+from collections.abc import Iterable, Sequence
+from importlib import import_module
+from os import path
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+
+import sphinx
+from sphinx import addnodes
+from sphinx.ext.graphviz import (
+ figure_wrapper,
+ graphviz,
+ render_dot_html,
+ render_dot_latex,
+ render_dot_texinfo,
+)
+from sphinx.util.docutils import SphinxDirective
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+ from sphinx.writers.html import HTML5Translator
+ from sphinx.writers.latex import LaTeXTranslator
+ from sphinx.writers.texinfo import TexinfoTranslator
+
+module_sig_re = re.compile(r'''^(?:([\w.]*)\.)? # module names
+ (\w+) \s* $ # class/final module name
+ ''', re.VERBOSE)
+
+
+py_builtins = [obj for obj in vars(builtins).values()
+ if inspect.isclass(obj)]
+
+
+def try_import(objname: str) -> Any:
+ """Import a object or module using *name* and *currentmodule*.
+ *name* should be a relative name from *currentmodule* or
+ a fully-qualified name.
+
+ Returns imported object or module. If failed, returns None value.
+ """
+ try:
+ return import_module(objname)
+ except TypeError:
+ # Relative import
+ return None
+ except ImportError:
+ matched = module_sig_re.match(objname)
+
+ if not matched:
+ return None
+
+ modname, attrname = matched.groups()
+
+ if modname is None:
+ return None
+ try:
+ module = import_module(modname)
+ return getattr(module, attrname, None)
+ except ImportError:
+ return None
+
+
+def import_classes(name: str, currmodule: str) -> Any:
+ """Import a class using its fully-qualified *name*."""
+ target = None
+
+ # import class or module using currmodule
+ if currmodule:
+ target = try_import(currmodule + '.' + name)
+
+ # import class or module without currmodule
+ if target is None:
+ target = try_import(name)
+
+ if target is None:
+ raise InheritanceException(
+ 'Could not import class or module %r specified for '
+ 'inheritance diagram' % name)
+
+ if inspect.isclass(target):
+ # If imported object is a class, just return it
+ return [target]
+ elif inspect.ismodule(target):
+ # If imported object is a module, return classes defined on it
+ classes = []
+ for cls in target.__dict__.values():
+ if inspect.isclass(cls) and cls.__module__ == target.__name__:
+ classes.append(cls)
+ return classes
+ raise InheritanceException('%r specified for inheritance diagram is '
+ 'not a class or module' % name)
+
+
+class InheritanceException(Exception):
+ pass
+
+
+class InheritanceGraph:
+ """
+ Given a list of classes, determines the set of classes that they inherit
+ 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: list[str], currmodule: str, show_builtins: bool = False,
+ private_bases: bool = False, parts: int = 0,
+ aliases: dict[str, str] | None = None, top_classes: Sequence[Any] = (),
+ ) -> None:
+ """*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,
+ private_bases, parts, aliases, top_classes)
+ if not self.class_info:
+ msg = 'No classes found for inheritance diagram'
+ raise InheritanceException(msg)
+
+ def _import_classes(self, class_names: list[str], currmodule: str) -> list[Any]:
+ """Import a list of classes."""
+ classes: list[Any] = []
+ for name in class_names:
+ classes.extend(import_classes(name, currmodule))
+ return classes
+
+ def _class_info(self, classes: list[Any], show_builtins: bool, private_bases: bool,
+ parts: int, aliases: dict[str, str] | None, top_classes: Sequence[Any],
+ ) -> list[tuple[str, str, list[str], str]]:
+ """Return name and bases for all classes that are ancestors of
+ *classes*.
+
+ *parts* gives the number of dotted name parts to include in the
+ displayed node names, from right to left. If given as a negative, the
+ number of parts to drop from the left. A value of 0 displays the full
+ dotted name. E.g. ``sphinx.ext.inheritance_diagram.InheritanceGraph``
+ with ``parts=2`` or ``parts=-2`` gets displayed as
+ ``inheritance_diagram.InheritanceGraph``, and as
+ ``ext.inheritance_diagram.InheritanceGraph`` with ``parts=3`` or
+ ``parts=-1``.
+
+ *top_classes* gives the name(s) of the top most ancestor class to
+ traverse to. Multiple names can be specified separated by comma.
+ """
+ all_classes = {}
+
+ def recurse(cls: Any) -> None:
+ if not show_builtins and cls in py_builtins:
+ return
+ if not private_bases and cls.__name__.startswith('_'):
+ return
+
+ nodename = self.class_name(cls, parts, aliases)
+ fullname = self.class_name(cls, 0, aliases)
+
+ # Use first line of docstring as tooltip, if available
+ tooltip = None
+ try:
+ if cls.__doc__:
+ doc = cls.__doc__.strip().split("\n")[0]
+ if doc:
+ tooltip = '"%s"' % doc.replace('"', '\\"')
+ except Exception: # might raise AttributeError for strange classes
+ pass
+
+ baselist: list[str] = []
+ all_classes[cls] = (nodename, fullname, baselist, tooltip)
+
+ if fullname in top_classes:
+ return
+
+ for base in cls.__bases__:
+ if not show_builtins and base in py_builtins:
+ continue
+ if not private_bases and base.__name__.startswith('_'):
+ continue
+ baselist.append(self.class_name(base, parts, aliases))
+ if base not in all_classes:
+ recurse(base)
+
+ for cls in classes:
+ recurse(cls)
+
+ return list(all_classes.values()) # type: ignore[arg-type]
+
+ def class_name(
+ self, cls: Any, parts: int = 0, aliases: dict[str, str] | None = None,
+ ) -> str:
+ """Given a class object, return a fully-qualified name.
+
+ This works for things I've tested in matplotlib so far, but may not be
+ completely general.
+ """
+ module = cls.__module__
+ if module in ('__builtin__', 'builtins'):
+ fullname = cls.__name__
+ else:
+ fullname = f'{module}.{cls.__qualname__}'
+ if parts == 0:
+ result = fullname
+ else:
+ name_parts = fullname.split('.')
+ result = '.'.join(name_parts[-parts:])
+ if aliases is not None and result in aliases:
+ return aliases[result]
+ return result
+
+ def get_all_class_names(self) -> list[str]:
+ """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
+ default_graph_attrs = {
+ 'rankdir': 'LR',
+ 'size': '"8.0, 12.0"',
+ 'bgcolor': 'transparent',
+ }
+ default_node_attrs = {
+ 'shape': 'box',
+ 'fontsize': 10,
+ 'height': 0.25,
+ 'fontname': '"Vera Sans, DejaVu Sans, Liberation Sans, '
+ 'Arial, Helvetica, sans"',
+ 'style': '"setlinewidth(0.5),filled"',
+ 'fillcolor': 'white',
+ }
+ default_edge_attrs = {
+ 'arrowsize': 0.5,
+ 'style': '"setlinewidth(0.5)"',
+ }
+
+ def _format_node_attrs(self, attrs: dict[str, Any]) -> str:
+ return ','.join(['%s=%s' % x for x in sorted(attrs.items())])
+
+ def _format_graph_attrs(self, attrs: dict[str, Any]) -> str:
+ return ''.join(['%s=%s;\n' % x for x in sorted(attrs.items())])
+
+ def generate_dot(self, name: str, urls: dict[str, str] | None = None,
+ env: BuildEnvironment | None = None,
+ graph_attrs: dict | None = None,
+ node_attrs: dict | None = None,
+ edge_attrs: dict | None = None,
+ ) -> str:
+ """Generate a graphviz dot graph from the classes that were passed in
+ to __init__.
+
+ *name* is the name of the graph.
+
+ *urls* is a dictionary mapping class names to HTTP URLs.
+
+ *graph_attrs*, *node_attrs*, *edge_attrs* are dictionaries containing
+ key/value pairs to pass on as graphviz properties.
+ """
+ if urls is None:
+ urls = {}
+ g_attrs = self.default_graph_attrs.copy()
+ n_attrs = self.default_node_attrs.copy()
+ e_attrs = self.default_edge_attrs.copy()
+ if graph_attrs is not None:
+ g_attrs.update(graph_attrs)
+ if node_attrs is not None:
+ n_attrs.update(node_attrs)
+ if edge_attrs is not None:
+ e_attrs.update(edge_attrs)
+ if env:
+ g_attrs.update(env.config.inheritance_graph_attrs)
+ n_attrs.update(env.config.inheritance_node_attrs)
+ e_attrs.update(env.config.inheritance_edge_attrs)
+
+ res: list[str] = []
+ res.append('digraph %s {\n' % name)
+ res.append(self._format_graph_attrs(g_attrs))
+
+ for name, fullname, bases, tooltip in sorted(self.class_info):
+ # Write the node
+ this_node_attrs = n_attrs.copy()
+ if fullname in urls:
+ this_node_attrs['URL'] = '"%s"' % urls[fullname]
+ this_node_attrs['target'] = '"_top"'
+ if tooltip:
+ this_node_attrs['tooltip'] = tooltip
+ res.append(' "%s" [%s];\n' %
+ (name, self._format_node_attrs(this_node_attrs)))
+
+ # Write the edges
+ for base_name in bases:
+ res.append(' "%s" -> "%s" [%s];\n' %
+ (base_name, name,
+ self._format_node_attrs(e_attrs)))
+ res.append('}\n')
+ return ''.join(res)
+
+
+class inheritance_diagram(graphviz):
+ """
+ A docutils node to use as a placeholder for the inheritance diagram.
+ """
+ pass
+
+
+class InheritanceDiagram(SphinxDirective):
+ """
+ Run when the inheritance_diagram directive is first encountered.
+ """
+ has_content = False
+ required_arguments = 1
+ optional_arguments = 0
+ final_argument_whitespace = True
+ option_spec: OptionSpec = {
+ 'parts': int,
+ 'private-bases': directives.flag,
+ 'caption': directives.unchanged,
+ 'top-classes': directives.unchanged_required,
+ }
+
+ def run(self) -> list[Node]:
+ node = inheritance_diagram()
+ node.document = self.state.document
+ class_names = self.arguments[0].split()
+ class_role = self.env.get_domain('py').role('class')
+ # Store the original content for use as a hash
+ node['parts'] = self.options.get('parts', 0)
+ node['content'] = ', '.join(class_names)
+ node['top-classes'] = []
+ for cls in self.options.get('top-classes', '').split(','):
+ cls = cls.strip()
+ if cls:
+ node['top-classes'].append(cls)
+
+ # Create a graph starting with the list of classes
+ try:
+ graph = InheritanceGraph(
+ class_names, self.env.ref_context.get('py:module'), # type: ignore[arg-type]
+ parts=node['parts'],
+ private_bases='private-bases' in self.options,
+ aliases=self.config.inheritance_alias,
+ top_classes=node['top-classes'])
+ except InheritanceException as err:
+ return [node.document.reporter.warning(err, line=self.lineno)]
+
+ # Create xref nodes for each target of the graph's image map and
+ # add them to the doc tree so that Sphinx can resolve the
+ # references to real URLs later. These nodes will eventually be
+ # removed from the doctree after we're done with them.
+ for name in graph.get_all_class_names():
+ refnodes, x = class_role( # type: ignore[call-arg,misc]
+ 'class', ':class:`%s`' % name, name, 0, self.state) # type: ignore[arg-type]
+ node.extend(refnodes)
+ # Store the graph object so we can use it to generate the
+ # dot file later
+ node['graph'] = graph
+
+ if 'caption' not in self.options:
+ self.add_name(node)
+ return [node]
+ else:
+ figure = figure_wrapper(self, node, self.options['caption'])
+ self.add_name(figure)
+ return [figure]
+
+
+def get_graph_hash(node: inheritance_diagram) -> str:
+ encoded = (node['content'] + str(node['parts'])).encode()
+ return hashlib.md5(encoded, usedforsecurity=False).hexdigest()[-10:]
+
+
+def html_visit_inheritance_diagram(self: HTML5Translator, node: inheritance_diagram) -> None:
+ """
+ Output the graph for HTML. This will insert a PNG with clickable
+ image map.
+ """
+ graph = node['graph']
+
+ graph_hash = get_graph_hash(node)
+ name = 'inheritance%s' % graph_hash
+
+ # Create a mapping from fully-qualified class names to URLs.
+ graphviz_output_format = self.builder.env.config.graphviz_output_format.upper()
+ current_filename = path.basename(self.builder.current_docname + self.builder.out_suffix)
+ urls = {}
+ pending_xrefs = cast(Iterable[addnodes.pending_xref], node)
+ for child in pending_xrefs:
+ if child.get('refuri') is not None:
+ # Construct the name from the URI if the reference is external via intersphinx
+ if not child.get('internal', True):
+ refname = child['refuri'].rsplit('#', 1)[-1]
+ else:
+ refname = child['reftitle']
+
+ urls[refname] = child.get('refuri')
+ elif child.get('refid') is not None:
+ if graphviz_output_format == 'SVG':
+ urls[child['reftitle']] = current_filename + '#' + child.get('refid')
+ else:
+ urls[child['reftitle']] = '#' + child.get('refid')
+
+ dotcode = graph.generate_dot(name, urls, env=self.builder.env)
+ render_dot_html(self, node, dotcode, {}, 'inheritance', 'inheritance',
+ alt='Inheritance diagram of ' + node['content'])
+ raise nodes.SkipNode
+
+
+def latex_visit_inheritance_diagram(self: LaTeXTranslator, node: inheritance_diagram) -> None:
+ """
+ Output the graph for LaTeX. This will insert a PDF.
+ """
+ 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_latex(self, node, dotcode, {}, 'inheritance')
+ raise nodes.SkipNode
+
+
+def texinfo_visit_inheritance_diagram(self: TexinfoTranslator, node: inheritance_diagram,
+ ) -> None:
+ """
+ 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: nodes.NodeVisitor, node: inheritance_diagram) -> None:
+ raise nodes.SkipNode
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.setup_extension('sphinx.ext.graphviz')
+ app.add_node(
+ inheritance_diagram,
+ latex=(latex_visit_inheritance_diagram, None),
+ html=(html_visit_inheritance_diagram, None),
+ text=(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)
+ app.add_config_value('inheritance_edge_attrs', {}, False)
+ app.add_config_value('inheritance_alias', {}, False)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py
new file mode 100644
index 0000000..453bb6e
--- /dev/null
+++ b/sphinx/ext/intersphinx.py
@@ -0,0 +1,742 @@
+"""Insert links to objects documented in remote Sphinx documentation.
+
+This works as follows:
+
+* Each Sphinx HTML build creates a file named "objects.inv" that contains a
+ mapping from object names to URIs relative to the HTML set's root.
+
+* Projects using the Intersphinx extension can specify links to such mapping
+ files in the `intersphinx_mapping` config value. The mapping will then be
+ used to resolve otherwise missing references to objects into links to the
+ other documentation.
+
+* By default, the mapping file is assumed to be at the same location as the
+ rest of the documentation; however, the location of the mapping file can
+ also be specified individually, e.g. if the docs should be buildable
+ without Internet access.
+"""
+
+from __future__ import annotations
+
+import concurrent.futures
+import functools
+import posixpath
+import re
+import sys
+import time
+from os import path
+from typing import TYPE_CHECKING, cast
+from urllib.parse import urlsplit, urlunsplit
+
+from docutils import nodes
+from docutils.utils import relative_path
+
+import sphinx
+from sphinx.addnodes import pending_xref
+from sphinx.builders.html import INVENTORY_FILENAME
+from sphinx.errors import ExtensionError
+from sphinx.locale import _, __
+from sphinx.transforms.post_transforms import ReferencesResolver
+from sphinx.util import logging, requests
+from sphinx.util.docutils import CustomReSTDispatcher, SphinxRole
+from sphinx.util.inventory import InventoryFile
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+ from types import ModuleType
+ from typing import IO, Any, Union
+
+ from docutils.nodes import Node, TextElement, system_message
+ from docutils.utils import Reporter
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+ from sphinx.domains import Domain
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import Inventory, InventoryItem, RoleFunction
+
+ InventoryCacheEntry = tuple[Union[str, None], int, Inventory]
+
+logger = logging.getLogger(__name__)
+
+
+class InventoryAdapter:
+ """Inventory adapter for environment"""
+
+ def __init__(self, env: BuildEnvironment) -> None:
+ self.env = env
+
+ if not hasattr(env, 'intersphinx_cache'):
+ # initial storage when fetching inventories before processing
+ self.env.intersphinx_cache = {} # type: ignore[attr-defined]
+
+ self.env.intersphinx_inventory = {} # type: ignore[attr-defined]
+ self.env.intersphinx_named_inventory = {} # type: ignore[attr-defined]
+
+ @property
+ def cache(self) -> dict[str, InventoryCacheEntry]:
+ """Intersphinx cache.
+
+ - Key is the URI of the remote inventory
+ - Element one is the key given in the Sphinx intersphinx_mapping
+ configuration value
+ - Element two is a time value for cache invalidation, a float
+ - Element three is the loaded remote inventory, type Inventory
+ """
+ return self.env.intersphinx_cache # type: ignore[attr-defined]
+
+ @property
+ def main_inventory(self) -> Inventory:
+ return self.env.intersphinx_inventory # type: ignore[attr-defined]
+
+ @property
+ def named_inventory(self) -> dict[str, Inventory]:
+ return self.env.intersphinx_named_inventory # type: ignore[attr-defined]
+
+ def clear(self) -> None:
+ self.env.intersphinx_inventory.clear() # type: ignore[attr-defined]
+ self.env.intersphinx_named_inventory.clear() # type: ignore[attr-defined]
+
+
+def _strip_basic_auth(url: str) -> str:
+ """Returns *url* with basic auth credentials removed. Also returns the
+ basic auth username and password if they're present in *url*.
+
+ E.g.: https://user:pass@example.com => https://example.com
+
+ *url* need not include basic auth credentials.
+
+ :param url: url which may or may not contain basic auth credentials
+ :type url: ``str``
+
+ :return: *url* with any basic auth creds removed
+ :rtype: ``str``
+ """
+ frags = list(urlsplit(url))
+ # swap out "user[:pass]@hostname" for "hostname"
+ if '@' in frags[1]:
+ frags[1] = frags[1].split('@')[1]
+ return urlunsplit(frags)
+
+
+def _read_from_url(url: str, *, config: Config) -> IO:
+ """Reads data from *url* with an HTTP *GET*.
+
+ This function supports fetching from resources which use basic HTTP auth as
+ laid out by RFC1738 § 3.1. See § 5 for grammar definitions for URLs.
+
+ .. seealso:
+
+ https://www.ietf.org/rfc/rfc1738.txt
+
+ :param url: URL of an HTTP resource
+ :type url: ``str``
+
+ :return: data read from resource described by *url*
+ :rtype: ``file``-like object
+ """
+ r = requests.get(url, stream=True, timeout=config.intersphinx_timeout,
+ _user_agent=config.user_agent,
+ _tls_info=(config.tls_verify, config.tls_cacerts))
+ r.raise_for_status()
+ r.raw.url = r.url
+ # decode content-body based on the header.
+ # ref: https://github.com/psf/requests/issues/2155
+ r.raw.read = functools.partial(r.raw.read, decode_content=True)
+ return r.raw
+
+
+def _get_safe_url(url: str) -> str:
+ """Gets version of *url* with basic auth passwords obscured. This function
+ returns results suitable for printing and logging.
+
+ E.g.: https://user:12345@example.com => https://user@example.com
+
+ :param url: a url
+ :type url: ``str``
+
+ :return: *url* with password removed
+ :rtype: ``str``
+ """
+ parts = urlsplit(url)
+ if parts.username is None:
+ return url
+ else:
+ frags = list(parts)
+ if parts.port:
+ frags[1] = f'{parts.username}@{parts.hostname}:{parts.port}'
+ else:
+ frags[1] = f'{parts.username}@{parts.hostname}'
+
+ return urlunsplit(frags)
+
+
+def fetch_inventory(app: Sphinx, uri: str, inv: str) -> Inventory:
+ """Fetch, parse and return an intersphinx inventory file."""
+ # both *uri* (base URI of the links to generate) and *inv* (actual
+ # location of the inventory file) can be local or remote URIs
+ if '://' in uri:
+ # case: inv URI points to remote resource; strip any existing auth
+ uri = _strip_basic_auth(uri)
+ try:
+ if '://' in inv:
+ f = _read_from_url(inv, config=app.config)
+ else:
+ f = open(path.join(app.srcdir, inv), 'rb') # NoQA: SIM115
+ except Exception as err:
+ err.args = ('intersphinx inventory %r not fetchable due to %s: %s',
+ inv, err.__class__, str(err))
+ raise
+ try:
+ if hasattr(f, 'url'):
+ newinv = f.url
+ if inv != newinv:
+ logger.info(__('intersphinx inventory has moved: %s -> %s'), inv, newinv)
+
+ if uri in (inv, path.dirname(inv), path.dirname(inv) + '/'):
+ uri = path.dirname(newinv)
+ with f:
+ try:
+ invdata = InventoryFile.load(f, uri, posixpath.join)
+ except ValueError as exc:
+ raise ValueError('unknown or unsupported inventory version: %r' % exc) from exc
+ except Exception as err:
+ err.args = ('intersphinx inventory %r not readable due to %s: %s',
+ inv, err.__class__.__name__, str(err))
+ raise
+ else:
+ return invdata
+
+
+def fetch_inventory_group(
+ name: str | None,
+ uri: str,
+ invs: tuple[str | None, ...],
+ cache: dict[str, InventoryCacheEntry],
+ app: Sphinx,
+ now: int,
+) -> bool:
+ cache_time = now - app.config.intersphinx_cache_limit * 86400
+ failures = []
+ try:
+ for inv in invs:
+ if not inv:
+ inv = posixpath.join(uri, INVENTORY_FILENAME)
+ # decide whether the inventory must be read: always read local
+ # files; remote ones only if the cache time is expired
+ if '://' not in inv or uri not in cache or cache[uri][1] < cache_time:
+ safe_inv_url = _get_safe_url(inv)
+ logger.info(__('loading intersphinx inventory from %s...'), safe_inv_url)
+ try:
+ invdata = fetch_inventory(app, uri, inv)
+ except Exception as err:
+ failures.append(err.args)
+ continue
+ if invdata:
+ cache[uri] = name, now, invdata
+ return True
+ return False
+ finally:
+ if failures == []:
+ pass
+ elif len(failures) < len(invs):
+ logger.info(__("encountered some issues with some of the inventories,"
+ " but they had working alternatives:"))
+ for fail in failures:
+ logger.info(*fail)
+ else:
+ issues = '\n'.join([f[0] % f[1:] for f in failures])
+ logger.warning(__("failed to reach any of the inventories "
+ "with the following issues:") + "\n" + issues)
+
+
+def load_mappings(app: Sphinx) -> None:
+ """Load all intersphinx mappings into the environment."""
+ now = int(time.time())
+ inventories = InventoryAdapter(app.builder.env)
+ intersphinx_cache: dict[str, InventoryCacheEntry] = inventories.cache
+
+ with concurrent.futures.ThreadPoolExecutor() as pool:
+ futures = []
+ name: str | None
+ uri: str
+ invs: tuple[str | None, ...]
+ for name, (uri, invs) in app.config.intersphinx_mapping.values():
+ futures.append(pool.submit(
+ fetch_inventory_group, name, uri, invs, intersphinx_cache, app, now,
+ ))
+ updated = [f.result() for f in concurrent.futures.as_completed(futures)]
+
+ if any(updated):
+ inventories.clear()
+
+ # Duplicate values in different inventories will shadow each
+ # other; which one will override which can vary between builds
+ # since they are specified using an unordered dict. To make
+ # it more consistent, we sort the named inventories and then
+ # add the unnamed inventories last. This means that the
+ # unnamed inventories will shadow the named ones but the named
+ # ones can still be accessed when the name is specified.
+ named_vals = []
+ unnamed_vals = []
+ for name, _expiry, invdata in intersphinx_cache.values():
+ if name:
+ named_vals.append((name, invdata))
+ else:
+ unnamed_vals.append((name, invdata))
+ for name, invdata in sorted(named_vals) + unnamed_vals:
+ if name:
+ inventories.named_inventory[name] = invdata
+ for type, objects in invdata.items():
+ inventories.main_inventory.setdefault(type, {}).update(objects)
+
+
+def _create_element_from_result(domain: Domain, inv_name: str | None,
+ data: InventoryItem,
+ node: pending_xref, contnode: TextElement) -> nodes.reference:
+ proj, version, uri, dispname = data
+ if '://' not in uri and node.get('refdoc'):
+ # get correct path in case of subdirectories
+ uri = posixpath.join(relative_path(node['refdoc'], '.'), uri)
+ if version:
+ reftitle = _('(in %s v%s)') % (proj, version)
+ else:
+ reftitle = _('(in %s)') % (proj,)
+ newnode = nodes.reference('', '', internal=False, refuri=uri, reftitle=reftitle)
+ if node.get('refexplicit'):
+ # use whatever title was given
+ newnode.append(contnode)
+ elif dispname == '-' or \
+ (domain.name == 'std' and node['reftype'] == 'keyword'):
+ # use whatever title was given, but strip prefix
+ title = contnode.astext()
+ if inv_name is not None and title.startswith(inv_name + ':'):
+ newnode.append(contnode.__class__(title[len(inv_name) + 1:],
+ title[len(inv_name) + 1:]))
+ else:
+ newnode.append(contnode)
+ else:
+ # else use the given display name (used for :ref:)
+ newnode.append(contnode.__class__(dispname, dispname))
+ return newnode
+
+
+def _resolve_reference_in_domain_by_target(
+ inv_name: str | None, inventory: Inventory,
+ domain: Domain, objtypes: Iterable[str],
+ target: str,
+ node: pending_xref, contnode: TextElement) -> nodes.reference | None:
+ for objtype in objtypes:
+ if objtype not in inventory:
+ # Continue if there's nothing of this kind in the inventory
+ continue
+
+ if target in inventory[objtype]:
+ # Case sensitive match, use it
+ data = inventory[objtype][target]
+ elif objtype == 'std:term':
+ # Check for potential case insensitive matches for terms only
+ target_lower = target.lower()
+ insensitive_matches = list(filter(lambda k: k.lower() == target_lower,
+ inventory[objtype].keys()))
+ if insensitive_matches:
+ data = inventory[objtype][insensitive_matches[0]]
+ else:
+ # No case insensitive match either, continue to the next candidate
+ continue
+ else:
+ # Could reach here if we're not a term but have a case insensitive match.
+ # This is a fix for terms specifically, but potentially should apply to
+ # other types.
+ continue
+ return _create_element_from_result(domain, inv_name, data, node, contnode)
+ return None
+
+
+def _resolve_reference_in_domain(env: BuildEnvironment,
+ inv_name: str | None, inventory: Inventory,
+ honor_disabled_refs: bool,
+ domain: Domain, objtypes: Iterable[str],
+ node: pending_xref, contnode: TextElement,
+ ) -> nodes.reference | None:
+ obj_types: dict[str, None] = {}.fromkeys(objtypes)
+
+ # we adjust the object types for backwards compatibility
+ if domain.name == 'std' and 'cmdoption' in obj_types:
+ # cmdoptions were stored as std:option until Sphinx 1.6
+ obj_types['option'] = None
+ if domain.name == 'py' and 'attribute' in obj_types:
+ # properties are stored as py:method since Sphinx 2.1
+ obj_types['method'] = None
+
+ # the inventory contains domain:type as objtype
+ domain_name = domain.name
+ obj_types = {f"{domain_name}:{obj_type}": None for obj_type in obj_types}
+
+ # now that the objtypes list is complete we can remove the disabled ones
+ if honor_disabled_refs:
+ disabled = set(env.config.intersphinx_disabled_reftypes)
+ obj_types = {obj_type: None
+ for obj_type in obj_types
+ if obj_type not in disabled}
+
+ objtypes = [*obj_types.keys()]
+
+ # without qualification
+ res = _resolve_reference_in_domain_by_target(inv_name, inventory, domain, objtypes,
+ node['reftarget'], node, contnode)
+ if res is not None:
+ return res
+
+ # try with qualification of the current scope instead
+ full_qualified_name = domain.get_full_qualified_name(node)
+ if full_qualified_name is None:
+ return None
+ return _resolve_reference_in_domain_by_target(inv_name, inventory, domain, objtypes,
+ full_qualified_name, node, contnode)
+
+
+def _resolve_reference(env: BuildEnvironment, inv_name: str | None, inventory: Inventory,
+ honor_disabled_refs: bool,
+ node: pending_xref, contnode: TextElement) -> nodes.reference | None:
+ # disabling should only be done if no inventory is given
+ honor_disabled_refs = honor_disabled_refs and inv_name is None
+
+ if honor_disabled_refs and '*' in env.config.intersphinx_disabled_reftypes:
+ return None
+
+ typ = node['reftype']
+ if typ == 'any':
+ for domain_name, domain in env.domains.items():
+ if (honor_disabled_refs
+ and (domain_name + ":*") in env.config.intersphinx_disabled_reftypes):
+ continue
+ objtypes: Iterable[str] = domain.object_types.keys()
+ res = _resolve_reference_in_domain(env, inv_name, inventory,
+ honor_disabled_refs,
+ domain, objtypes,
+ node, contnode)
+ if res is not None:
+ return res
+ return None
+ else:
+ domain_name = node.get('refdomain')
+ if not domain_name:
+ # only objects in domains are in the inventory
+ return None
+ if honor_disabled_refs \
+ and (domain_name + ":*") in env.config.intersphinx_disabled_reftypes:
+ return None
+ domain = env.get_domain(domain_name)
+ objtypes = domain.objtypes_for_role(typ) or ()
+ if not objtypes:
+ return None
+ return _resolve_reference_in_domain(env, inv_name, inventory,
+ honor_disabled_refs,
+ domain, objtypes,
+ node, contnode)
+
+
+def inventory_exists(env: BuildEnvironment, inv_name: str) -> bool:
+ return inv_name in InventoryAdapter(env).named_inventory
+
+
+def resolve_reference_in_inventory(env: BuildEnvironment,
+ inv_name: str,
+ node: pending_xref, contnode: TextElement,
+ ) -> nodes.reference | None:
+ """Attempt to resolve a missing reference via intersphinx references.
+
+ Resolution is tried in the given inventory with the target as is.
+
+ Requires ``inventory_exists(env, inv_name)``.
+ """
+ assert inventory_exists(env, inv_name)
+ return _resolve_reference(env, inv_name, InventoryAdapter(env).named_inventory[inv_name],
+ False, node, contnode)
+
+
+def resolve_reference_any_inventory(env: BuildEnvironment,
+ honor_disabled_refs: bool,
+ node: pending_xref, contnode: TextElement,
+ ) -> nodes.reference | None:
+ """Attempt to resolve a missing reference via intersphinx references.
+
+ Resolution is tried with the target as is in any inventory.
+ """
+ return _resolve_reference(env, None, InventoryAdapter(env).main_inventory,
+ honor_disabled_refs,
+ node, contnode)
+
+
+def resolve_reference_detect_inventory(env: BuildEnvironment,
+ node: pending_xref, contnode: TextElement,
+ ) -> nodes.reference | None:
+ """Attempt to resolve a missing reference via intersphinx references.
+
+ Resolution is tried first with the target as is in any inventory.
+ If this does not succeed, then the target is split by the first ``:``,
+ to form ``inv_name:newtarget``. If ``inv_name`` is a named inventory, then resolution
+ is tried in that inventory with the new target.
+ """
+
+ # ordinary direct lookup, use data as is
+ res = resolve_reference_any_inventory(env, True, node, contnode)
+ if res is not None:
+ return res
+
+ # try splitting the target into 'inv_name:target'
+ target = node['reftarget']
+ if ':' not in target:
+ return None
+ inv_name, newtarget = target.split(':', 1)
+ if not inventory_exists(env, inv_name):
+ return None
+ node['reftarget'] = newtarget
+ res_inv = resolve_reference_in_inventory(env, inv_name, node, contnode)
+ node['reftarget'] = target
+ return res_inv
+
+
+def missing_reference(app: Sphinx, env: BuildEnvironment, node: pending_xref,
+ contnode: TextElement) -> nodes.reference | None:
+ """Attempt to resolve a missing reference via intersphinx references."""
+
+ return resolve_reference_detect_inventory(env, node, contnode)
+
+
+class IntersphinxDispatcher(CustomReSTDispatcher):
+ """Custom dispatcher for external role.
+
+ This enables :external:***:/:external+***: roles on parsing reST document.
+ """
+
+ def role(
+ self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter,
+ ) -> tuple[RoleFunction, list[system_message]]:
+ if len(role_name) > 9 and role_name.startswith(('external:', 'external+')):
+ return IntersphinxRole(role_name), []
+ else:
+ return super().role(role_name, language_module, lineno, reporter)
+
+
+class IntersphinxRole(SphinxRole):
+ # group 1: just for the optionality of the inventory name
+ # group 2: the inventory name (optional)
+ # group 3: the domain:role or role part
+ _re_inv_ref = re.compile(r"(\+([^:]+))?:(.*)")
+
+ def __init__(self, orig_name: str) -> None:
+ self.orig_name = orig_name
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ assert self.name == self.orig_name.lower()
+ inventory, name_suffix = self.get_inventory_and_name_suffix(self.orig_name)
+ if inventory and not inventory_exists(self.env, inventory):
+ logger.warning(__('inventory for external cross-reference not found: %s'),
+ inventory, location=(self.env.docname, self.lineno))
+ return [], []
+
+ role_name = self.get_role_name(name_suffix)
+ if role_name is None:
+ logger.warning(__('role for external cross-reference not found: %s'), name_suffix,
+ location=(self.env.docname, self.lineno))
+ return [], []
+
+ result, messages = self.invoke_role(role_name)
+ for node in result:
+ if isinstance(node, pending_xref):
+ node['intersphinx'] = True
+ node['inventory'] = inventory
+
+ return result, messages
+
+ def get_inventory_and_name_suffix(self, name: str) -> tuple[str | None, str]:
+ assert name.startswith('external'), name
+ # either we have an explicit inventory name, i.e,
+ # :external+inv:role: or
+ # :external+inv:domain:role:
+ # or we look in all inventories, i.e.,
+ # :external:role: or
+ # :external:domain:role:
+ suffix = name[9:]
+ if name[8] == '+':
+ inv_name, suffix = suffix.split(':', 1)
+ return inv_name, suffix
+ elif name[8] == ':':
+ return None, suffix
+ else:
+ msg = f'Malformed :external: role name: {name}'
+ raise ValueError(msg)
+
+ def get_role_name(self, name: str) -> tuple[str, str] | None:
+ names = name.split(':')
+ if len(names) == 1:
+ # role
+ default_domain = self.env.temp_data.get('default_domain')
+ domain = default_domain.name if default_domain else None
+ role = names[0]
+ elif len(names) == 2:
+ # domain:role:
+ domain = names[0]
+ role = names[1]
+ else:
+ return None
+
+ if domain and self.is_existent_role(domain, role):
+ return (domain, role)
+ elif self.is_existent_role('std', role):
+ return ('std', role)
+ else:
+ return None
+
+ def is_existent_role(self, domain_name: str, role_name: str) -> bool:
+ try:
+ domain = self.env.get_domain(domain_name)
+ return role_name in domain.roles
+ except ExtensionError:
+ return False
+
+ def invoke_role(self, role: tuple[str, str]) -> tuple[list[Node], list[system_message]]:
+ domain = self.env.get_domain(role[0])
+ if domain:
+ role_func = domain.role(role[1])
+ assert role_func is not None
+
+ return role_func(':'.join(role), self.rawtext, self.text, self.lineno,
+ self.inliner, self.options, self.content)
+ else:
+ return [], []
+
+
+class IntersphinxRoleResolver(ReferencesResolver):
+ """pending_xref node resolver for intersphinx role.
+
+ This resolves pending_xref nodes generated by :intersphinx:***: role.
+ """
+
+ default_priority = ReferencesResolver.default_priority - 1
+
+ def run(self, **kwargs: Any) -> None:
+ for node in self.document.findall(pending_xref):
+ if 'intersphinx' not in node:
+ continue
+ contnode = cast(nodes.TextElement, node[0].deepcopy())
+ inv_name = node['inventory']
+ if inv_name is not None:
+ assert inventory_exists(self.env, inv_name)
+ newnode = resolve_reference_in_inventory(self.env, inv_name, node, contnode)
+ else:
+ newnode = resolve_reference_any_inventory(self.env, False, node, contnode)
+ if newnode is None:
+ typ = node['reftype']
+ msg = (__('external %s:%s reference target not found: %s') %
+ (node['refdomain'], typ, node['reftarget']))
+ logger.warning(msg, location=node, type='ref', subtype=typ)
+ node.replace_self(contnode)
+ else:
+ node.replace_self(newnode)
+
+
+def install_dispatcher(app: Sphinx, docname: str, source: list[str]) -> None:
+ """Enable IntersphinxDispatcher.
+
+ .. note:: The installed dispatcher will be uninstalled on disabling sphinx_domain
+ automatically.
+ """
+ dispatcher = IntersphinxDispatcher()
+ dispatcher.enable()
+
+
+def normalize_intersphinx_mapping(app: Sphinx, config: Config) -> None:
+ for key, value in config.intersphinx_mapping.copy().items():
+ try:
+ if isinstance(value, (list, tuple)):
+ # new format
+ name, (uri, inv) = key, value
+ if not isinstance(name, str):
+ logger.warning(__('intersphinx identifier %r is not string. Ignored'),
+ name)
+ config.intersphinx_mapping.pop(key)
+ continue
+ else:
+ # old format, no name
+ # xref RemovedInSphinx80Warning
+ name, uri, inv = None, key, value
+ msg = (
+ "The pre-Sphinx 1.0 'intersphinx_mapping' format is "
+ "deprecated and will be removed in Sphinx 8. Update to the "
+ "current format as described in the documentation. "
+ f"Hint: \"intersphinx_mapping = {{'<name>': {(uri, inv)!r}}}\"."
+ "https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html#confval-intersphinx_mapping" # NoQA: E501
+ )
+ logger.warning(msg)
+
+ if not isinstance(inv, tuple):
+ config.intersphinx_mapping[key] = (name, (uri, (inv,)))
+ else:
+ config.intersphinx_mapping[key] = (name, (uri, inv))
+ except Exception as exc:
+ logger.warning(__('Failed to read intersphinx_mapping[%s], ignored: %r'), key, exc)
+ config.intersphinx_mapping.pop(key)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_config_value('intersphinx_mapping', {}, True)
+ app.add_config_value('intersphinx_cache_limit', 5, False)
+ app.add_config_value('intersphinx_timeout', None, False)
+ app.add_config_value('intersphinx_disabled_reftypes', ['std:doc'], True)
+ app.connect('config-inited', normalize_intersphinx_mapping, priority=800)
+ app.connect('builder-inited', load_mappings)
+ app.connect('source-read', install_dispatcher)
+ app.connect('missing-reference', missing_reference)
+ app.add_post_transform(IntersphinxRoleResolver)
+ return {
+ 'version': sphinx.__display_version__,
+ 'env_version': 1,
+ 'parallel_read_safe': True,
+ }
+
+
+def inspect_main(argv: list[str], /) -> int:
+ """Debug functionality to print out an inventory"""
+ if len(argv) < 1:
+ print("Print out an inventory file.\n"
+ "Error: must specify local path or URL to an inventory file.",
+ file=sys.stderr)
+ return 1
+
+ class MockConfig:
+ intersphinx_timeout: int | None = None
+ tls_verify = False
+ tls_cacerts: str | dict[str, str] | None = None
+ user_agent: str = ''
+
+ class MockApp:
+ srcdir = ''
+ config = MockConfig()
+
+ try:
+ filename = argv[0]
+ inv_data = fetch_inventory(MockApp(), '', filename) # type: ignore[arg-type]
+ for key in sorted(inv_data or {}):
+ print(key)
+ inv_entries = sorted(inv_data[key].items())
+ for entry, (_proj, _ver, url_path, display_name) in inv_entries:
+ display_name = display_name * (display_name != '-')
+ print(f' {entry:<40} {display_name:<40}: {url_path}')
+ except ValueError as exc:
+ print(exc.args[0] % exc.args[1:], file=sys.stderr)
+ return 1
+ except Exception as exc:
+ print(f'Unknown error: {exc!r}', file=sys.stderr)
+ return 1
+ else:
+ return 0
+
+
+if __name__ == '__main__':
+ import logging as _logging
+ _logging.basicConfig()
+
+ raise SystemExit(inspect_main(sys.argv[1:]))
diff --git a/sphinx/ext/linkcode.py b/sphinx/ext/linkcode.py
new file mode 100644
index 0000000..ee10406
--- /dev/null
+++ b/sphinx/ext/linkcode.py
@@ -0,0 +1,77 @@
+"""Add external links to module code in Python object descriptions."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+import sphinx
+from sphinx import addnodes
+from sphinx.errors import SphinxError
+from sphinx.locale import _
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+
+class LinkcodeError(SphinxError):
+ category = "linkcode error"
+
+
+def doctree_read(app: Sphinx, doctree: Node) -> None:
+ env = app.builder.env
+
+ resolve_target = getattr(env.config, 'linkcode_resolve', None)
+ if not callable(env.config.linkcode_resolve):
+ msg = 'Function `linkcode_resolve` is not given in conf.py'
+ raise LinkcodeError(msg)
+ assert resolve_target is not None # for mypy
+
+ domain_keys = {
+ 'py': ['module', 'fullname'],
+ 'c': ['names'],
+ 'cpp': ['names'],
+ 'js': ['object', 'fullname'],
+ }
+
+ for objnode in list(doctree.findall(addnodes.desc)):
+ domain = objnode.get('domain')
+ uris: set[str] = set()
+ for signode in objnode:
+ if not isinstance(signode, addnodes.desc_signature):
+ continue
+
+ # Convert signode to a specified format
+ info = {}
+ for key in domain_keys.get(domain, []):
+ value = signode.get(key)
+ if not value:
+ value = ''
+ info[key] = value
+ if not info:
+ continue
+
+ # Call user code to resolve the link
+ uri = resolve_target(domain, info)
+ if not uri:
+ # no source
+ continue
+
+ if uri in uris or not uri:
+ # only one link per name, please
+ continue
+ uris.add(uri)
+
+ inline = nodes.inline('', _('[source]'), classes=['viewcode-link'])
+ onlynode = addnodes.only(expr='html')
+ onlynode += nodes.reference('', '', inline, internal=False, refuri=uri)
+ signode += onlynode
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.connect('doctree-read', doctree_read)
+ app.add_config_value('linkcode_resolve', None, '')
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/mathjax.py b/sphinx/ext/mathjax.py
new file mode 100644
index 0000000..41d18b9
--- /dev/null
+++ b/sphinx/ext/mathjax.py
@@ -0,0 +1,126 @@
+"""Allow `MathJax`_ to be used to display math in Sphinx's HTML writer.
+
+This requires the MathJax JavaScript library on your webserver/computer.
+
+.. _MathJax: https://www.mathjax.org/
+"""
+
+from __future__ import annotations
+
+import json
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+
+import sphinx
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.domains.math import MathDomain
+from sphinx.errors import ExtensionError
+from sphinx.locale import _
+from sphinx.util.math import get_node_equation_number
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.writers.html import HTML5Translator
+
+# more information for mathjax secure url is here:
+# https://docs.mathjax.org/en/latest/start.html#secure-access-to-the-cdn
+MATHJAX_URL = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'
+
+logger = sphinx.util.logging.getLogger(__name__)
+
+
+def html_visit_math(self: HTML5Translator, node: nodes.math) -> None:
+ self.body.append(self.starttag(node, 'span', '', CLASS='math notranslate nohighlight'))
+ self.body.append(self.builder.config.mathjax_inline[0] +
+ self.encode(node.astext()) +
+ self.builder.config.mathjax_inline[1] + '</span>')
+ raise nodes.SkipNode
+
+
+def html_visit_displaymath(self: HTML5Translator, node: nodes.math_block) -> None:
+ self.body.append(self.starttag(node, 'div', CLASS='math notranslate nohighlight'))
+ if node['nowrap']:
+ self.body.append(self.encode(node.astext()))
+ self.body.append('</div>')
+ raise nodes.SkipNode
+
+ # necessary to e.g. set the id property correctly
+ if node['number']:
+ number = get_node_equation_number(self, node)
+ self.body.append('<span class="eqno">(%s)' % number)
+ self.add_permalink_ref(node, _('Link to this equation'))
+ self.body.append('</span>')
+ self.body.append(self.builder.config.mathjax_display[0])
+ parts = [prt for prt in node.astext().split('\n\n') if prt.strip()]
+ if len(parts) > 1: # Add alignment if there are more than 1 equation
+ self.body.append(r' \begin{align}\begin{aligned}')
+ for i, part in enumerate(parts):
+ part = self.encode(part)
+ if r'\\' in part:
+ self.body.append(r'\begin{split}' + part + r'\end{split}')
+ else:
+ self.body.append(part)
+ if i < len(parts) - 1: # append new line if not the last equation
+ self.body.append(r'\\')
+ if len(parts) > 1: # Add alignment if there are more than 1 equation
+ self.body.append(r'\end{aligned}\end{align} ')
+ self.body.append(self.builder.config.mathjax_display[1])
+ self.body.append('</div>\n')
+ raise nodes.SkipNode
+
+
+def install_mathjax(app: Sphinx, pagename: str, templatename: str, context: dict[str, Any],
+ event_arg: Any) -> None:
+ if (
+ app.builder.format != 'html' or
+ app.builder.math_renderer_name != 'mathjax' # type: ignore[attr-defined]
+ ):
+ return
+ if not app.config.mathjax_path:
+ msg = 'mathjax_path config value must be set for the mathjax extension to work'
+ raise ExtensionError(msg)
+
+ domain = cast(MathDomain, app.env.get_domain('math'))
+ builder = cast(StandaloneHTMLBuilder, app.builder)
+ if app.registry.html_assets_policy == 'always' or domain.has_equations(pagename):
+ # Enable mathjax only if equations exists
+ if app.config.mathjax2_config:
+ if app.config.mathjax_path == MATHJAX_URL:
+ logger.warning(
+ 'mathjax_config/mathjax2_config does not work '
+ 'for the current MathJax version, use mathjax3_config instead')
+ body = 'MathJax.Hub.Config(%s)' % json.dumps(app.config.mathjax2_config)
+ builder.add_js_file('', type='text/x-mathjax-config', body=body)
+ if app.config.mathjax3_config:
+ body = 'window.MathJax = %s' % json.dumps(app.config.mathjax3_config)
+ builder.add_js_file('', body=body)
+
+ options = {}
+ if app.config.mathjax_options:
+ options.update(app.config.mathjax_options)
+ if 'async' not in options and 'defer' not in options:
+ if app.config.mathjax3_config:
+ # Load MathJax v3 via "defer" method
+ options['defer'] = 'defer'
+ else:
+ # Load other MathJax via "async" method
+ options['async'] = 'async'
+ builder.add_js_file(app.config.mathjax_path, **options)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_html_math_renderer('mathjax',
+ (html_visit_math, None),
+ (html_visit_displaymath, None))
+
+ app.add_config_value('mathjax_path', MATHJAX_URL, 'html')
+ app.add_config_value('mathjax_options', {}, 'html')
+ app.add_config_value('mathjax_inline', [r'\(', r'\)'], 'html')
+ app.add_config_value('mathjax_display', [r'\[', r'\]'], 'html')
+ app.add_config_value('mathjax_config', None, 'html')
+ app.add_config_value('mathjax2_config', lambda c: c.mathjax_config, 'html')
+ app.add_config_value('mathjax3_config', None, 'html')
+ app.connect('html-page-context', install_mathjax)
+
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
diff --git a/sphinx/ext/napoleon/__init__.py b/sphinx/ext/napoleon/__init__.py
new file mode 100644
index 0000000..61aa3d8
--- /dev/null
+++ b/sphinx/ext/napoleon/__init__.py
@@ -0,0 +1,474 @@
+"""Support for NumPy and Google style docstrings."""
+
+from __future__ import annotations
+
+from typing import Any
+
+import sphinx
+from sphinx.application import Sphinx
+from sphinx.ext.napoleon.docstring import GoogleDocstring, NumpyDocstring
+from sphinx.util import inspect
+
+
+class Config:
+ """Sphinx napoleon extension settings in `conf.py`.
+
+ Listed below are all the settings used by napoleon and their default
+ values. These settings can be changed in the Sphinx `conf.py` file. Make
+ sure that "sphinx.ext.napoleon" is enabled in `conf.py`::
+
+ # conf.py
+
+ # Add any Sphinx extension module names here, as strings
+ extensions = ['sphinx.ext.napoleon']
+
+ # Napoleon settings
+ napoleon_google_docstring = True
+ napoleon_numpy_docstring = True
+ napoleon_include_init_with_doc = False
+ napoleon_include_private_with_doc = False
+ napoleon_include_special_with_doc = False
+ napoleon_use_admonition_for_examples = False
+ napoleon_use_admonition_for_notes = False
+ napoleon_use_admonition_for_references = False
+ napoleon_use_ivar = False
+ napoleon_use_param = True
+ napoleon_use_rtype = True
+ napoleon_use_keyword = True
+ napoleon_preprocess_types = False
+ napoleon_type_aliases = None
+ napoleon_custom_sections = None
+ napoleon_attr_annotations = True
+
+ .. _Google style:
+ https://google.github.io/styleguide/pyguide.html
+ .. _NumPy style:
+ https://numpydoc.readthedocs.io/en/latest/format.html#docstring-standard
+
+ Attributes
+ ----------
+ napoleon_google_docstring : :obj:`bool` (Defaults to True)
+ True to parse `Google style`_ docstrings. False to disable support
+ for Google style docstrings.
+ napoleon_numpy_docstring : :obj:`bool` (Defaults to True)
+ True to parse `NumPy style`_ docstrings. False to disable support
+ for NumPy style docstrings.
+ napoleon_include_init_with_doc : :obj:`bool` (Defaults to False)
+ True to list ``__init___`` docstrings separately from the class
+ docstring. False to fall back to Sphinx's default behavior, which
+ considers the ``__init___`` docstring as part of the class
+ documentation.
+
+ **If True**::
+
+ def __init__(self):
+ \"\"\"
+ This will be included in the docs because it has a docstring
+ \"\"\"
+
+ def __init__(self):
+ # This will NOT be included in the docs
+
+ napoleon_include_private_with_doc : :obj:`bool` (Defaults to False)
+ True to include private members (like ``_membername``) with docstrings
+ in the documentation. False to fall back to Sphinx's default behavior.
+
+ **If True**::
+
+ def _included(self):
+ \"\"\"
+ This will be included in the docs because it has a docstring
+ \"\"\"
+ pass
+
+ def _skipped(self):
+ # This will NOT be included in the docs
+ pass
+
+ napoleon_include_special_with_doc : :obj:`bool` (Defaults to False)
+ True to include special members (like ``__membername__``) with
+ docstrings in the documentation. False to fall back to Sphinx's
+ default behavior.
+
+ **If True**::
+
+ def __str__(self):
+ \"\"\"
+ This will be included in the docs because it has a docstring
+ \"\"\"
+ return unicode(self).encode('utf-8')
+
+ def __unicode__(self):
+ # This will NOT be included in the docs
+ return unicode(self.__class__.__name__)
+
+ napoleon_use_admonition_for_examples : :obj:`bool` (Defaults to False)
+ True to use the ``.. admonition::`` directive for the **Example** and
+ **Examples** sections. False to use the ``.. rubric::`` directive
+ instead. One may look better than the other depending on what HTML
+ theme is used.
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Example
+ -------
+ This is just a quick example
+
+ **If True**::
+
+ .. admonition:: Example
+
+ This is just a quick example
+
+ **If False**::
+
+ .. rubric:: Example
+
+ This is just a quick example
+
+ napoleon_use_admonition_for_notes : :obj:`bool` (Defaults to False)
+ True to use the ``.. admonition::`` directive for **Notes** sections.
+ False to use the ``.. rubric::`` directive instead.
+
+ Note
+ ----
+ The singular **Note** section will always be converted to a
+ ``.. note::`` directive.
+
+ See Also
+ --------
+ :confval:`napoleon_use_admonition_for_examples`
+
+ napoleon_use_admonition_for_references : :obj:`bool` (Defaults to False)
+ True to use the ``.. admonition::`` directive for **References**
+ sections. False to use the ``.. rubric::`` directive instead.
+
+ See Also
+ --------
+ :confval:`napoleon_use_admonition_for_examples`
+
+ napoleon_use_ivar : :obj:`bool` (Defaults to False)
+ True to use the ``:ivar:`` role for instance variables. False to use
+ the ``.. attribute::`` directive instead.
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Attributes
+ ----------
+ attr1 : int
+ Description of `attr1`
+
+ **If True**::
+
+ :ivar attr1: Description of `attr1`
+ :vartype attr1: int
+
+ **If False**::
+
+ .. attribute:: attr1
+
+ Description of `attr1`
+
+ :type: int
+
+ napoleon_use_param : :obj:`bool` (Defaults to True)
+ True to use a ``:param:`` role for each function parameter. False to
+ use a single ``:parameters:`` role for all the parameters.
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Parameters
+ ----------
+ arg1 : str
+ Description of `arg1`
+ arg2 : int, optional
+ Description of `arg2`, defaults to 0
+
+ **If True**::
+
+ :param arg1: Description of `arg1`
+ :type arg1: str
+ :param arg2: Description of `arg2`, defaults to 0
+ :type arg2: int, optional
+
+ **If False**::
+
+ :parameters: * **arg1** (*str*) --
+ Description of `arg1`
+ * **arg2** (*int, optional*) --
+ Description of `arg2`, defaults to 0
+
+ napoleon_use_keyword : :obj:`bool` (Defaults to True)
+ True to use a ``:keyword:`` role for each function keyword argument.
+ False to use a single ``:keyword arguments:`` role for all the
+ keywords.
+
+ This behaves similarly to :confval:`napoleon_use_param`. Note unlike
+ docutils, ``:keyword:`` and ``:param:`` will not be treated the same
+ way - there will be a separate "Keyword Arguments" section, rendered
+ in the same fashion as "Parameters" section (type links created if
+ possible)
+
+ See Also
+ --------
+ :confval:`napoleon_use_param`
+
+ napoleon_use_rtype : :obj:`bool` (Defaults to True)
+ True to use the ``:rtype:`` role for the return type. False to output
+ the return type inline with the description.
+
+ This `NumPy style`_ snippet will be converted as follows::
+
+ Returns
+ -------
+ bool
+ True if successful, False otherwise
+
+ **If True**::
+
+ :returns: True if successful, False otherwise
+ :rtype: bool
+
+ **If False**::
+
+ :returns: *bool* -- True if successful, False otherwise
+
+ napoleon_preprocess_types : :obj:`bool` (Defaults to False)
+ Enable the type preprocessor.
+
+ napoleon_type_aliases : :obj:`dict` (Defaults to None)
+ Add a mapping of strings to string, translating types in numpy
+ style docstrings. Only works if ``napoleon_preprocess_types = True``.
+
+ napoleon_custom_sections : :obj:`list` (Defaults to None)
+ Add a list of custom sections to include, expanding the list of parsed sections.
+
+ The entries can either be strings or tuples, depending on the intention:
+ * To create a custom "generic" section, just pass a string.
+ * To create an alias for an existing section, pass a tuple containing the
+ alias name and the original, in that order.
+ * To create a custom section that displays like the parameters or returns
+ section, pass a tuple containing the custom section name and a string
+ value, "params_style" or "returns_style".
+
+ If an entry is just a string, it is interpreted as a header for a generic
+ section. If the entry is a tuple/list/indexed container, the first entry
+ is the name of the section, the second is the section key to emulate. If the
+ second entry value is "params_style" or "returns_style", the custom section
+ will be displayed like the parameters section or returns section.
+
+ napoleon_attr_annotations : :obj:`bool` (Defaults to True)
+ Use the type annotations of class attributes that are documented in the docstring
+ but do not have a type in the docstring.
+
+ """
+ _config_values = {
+ 'napoleon_google_docstring': (True, 'env'),
+ 'napoleon_numpy_docstring': (True, 'env'),
+ 'napoleon_include_init_with_doc': (False, 'env'),
+ 'napoleon_include_private_with_doc': (False, 'env'),
+ 'napoleon_include_special_with_doc': (False, 'env'),
+ 'napoleon_use_admonition_for_examples': (False, 'env'),
+ 'napoleon_use_admonition_for_notes': (False, 'env'),
+ 'napoleon_use_admonition_for_references': (False, 'env'),
+ 'napoleon_use_ivar': (False, 'env'),
+ 'napoleon_use_param': (True, 'env'),
+ 'napoleon_use_rtype': (True, 'env'),
+ 'napoleon_use_keyword': (True, 'env'),
+ 'napoleon_preprocess_types': (False, 'env'),
+ 'napoleon_type_aliases': (None, 'env'),
+ 'napoleon_custom_sections': (None, 'env'),
+ 'napoleon_attr_annotations': (True, 'env'),
+ }
+
+ def __init__(self, **settings: Any) -> None:
+ for name, (default, _rebuild) in self._config_values.items():
+ setattr(self, name, default)
+ for name, value in settings.items():
+ setattr(self, name, value)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ """Sphinx extension setup function.
+
+ When the extension is loaded, Sphinx imports this module and executes
+ the ``setup()`` function, which in turn notifies Sphinx of everything
+ the extension offers.
+
+ Parameters
+ ----------
+ app : sphinx.application.Sphinx
+ Application object representing the Sphinx process
+
+ See Also
+ --------
+ `The Sphinx documentation on Extensions
+ <https://www.sphinx-doc.org/extensions.html>`_
+
+ `The Extension Tutorial <https://www.sphinx-doc.org/extdev/tutorial.html>`_
+
+ `The Extension API <https://www.sphinx-doc.org/extdev/appapi.html>`_
+
+ """
+ if not isinstance(app, Sphinx):
+ # probably called by tests
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
+
+ _patch_python_domain()
+
+ app.setup_extension('sphinx.ext.autodoc')
+ app.connect('autodoc-process-docstring', _process_docstring)
+ app.connect('autodoc-skip-member', _skip_member)
+
+ for name, (default, rebuild) in Config._config_values.items():
+ app.add_config_value(name, default, rebuild)
+ return {'version': sphinx.__display_version__, 'parallel_read_safe': True}
+
+
+def _patch_python_domain() -> None:
+ from sphinx.domains.python import PyObject, PyTypedField
+ from sphinx.locale import _
+ for doc_field in PyObject.doc_field_types:
+ if doc_field.name == 'parameter':
+ doc_field.names = ('param', 'parameter', 'arg', 'argument')
+ break
+ PyObject.doc_field_types.append(
+ PyTypedField('keyword', label=_('Keyword Arguments'),
+ names=('keyword', 'kwarg', 'kwparam'),
+ typerolename='obj', typenames=('paramtype', 'kwtype'),
+ can_collapse=True))
+
+
+def _process_docstring(app: Sphinx, what: str, name: str, obj: Any,
+ options: Any, lines: list[str]) -> None:
+ """Process the docstring for a given python object.
+
+ Called when autodoc has read and processed a docstring. `lines` is a list
+ of docstring lines that `_process_docstring` modifies in place to change
+ what Sphinx outputs.
+
+ The following settings in conf.py control what styles of docstrings will
+ be parsed:
+
+ * ``napoleon_google_docstring`` -- parse Google style docstrings
+ * ``napoleon_numpy_docstring`` -- parse NumPy style docstrings
+
+ Parameters
+ ----------
+ app : sphinx.application.Sphinx
+ Application object representing the Sphinx process.
+ what : str
+ A string specifying the type of the object to which the docstring
+ belongs. Valid values: "module", "class", "exception", "function",
+ "method", "attribute".
+ name : str
+ The fully qualified name of the object.
+ obj : module, class, exception, function, method, or attribute
+ The object to which the docstring belongs.
+ options : sphinx.ext.autodoc.Options
+ The options given to the directive: an object with attributes
+ inherited_members, undoc_members, show_inheritance and no_index that
+ are True if the flag option of same name was given to the auto
+ directive.
+ lines : list of str
+ The lines of the docstring, see above.
+
+ .. note:: `lines` is modified *in place*
+
+ """
+ result_lines = lines
+ docstring: GoogleDocstring
+ if app.config.napoleon_numpy_docstring:
+ docstring = NumpyDocstring(result_lines, app.config, app, what, name,
+ obj, options)
+ result_lines = docstring.lines()
+ if app.config.napoleon_google_docstring:
+ docstring = GoogleDocstring(result_lines, app.config, app, what, name,
+ obj, options)
+ result_lines = docstring.lines()
+ lines[:] = result_lines[:]
+
+
+def _skip_member(app: Sphinx, what: str, name: str, obj: Any,
+ skip: bool, options: Any) -> bool | None:
+ """Determine if private and special class members are included in docs.
+
+ The following settings in conf.py determine if private and special class
+ members or init methods are included in the generated documentation:
+
+ * ``napoleon_include_init_with_doc`` --
+ include init methods if they have docstrings
+ * ``napoleon_include_private_with_doc`` --
+ include private members if they have docstrings
+ * ``napoleon_include_special_with_doc`` --
+ include special members if they have docstrings
+
+ Parameters
+ ----------
+ app : sphinx.application.Sphinx
+ Application object representing the Sphinx process
+ what : str
+ A string specifying the type of the object to which the member
+ belongs. Valid values: "module", "class", "exception", "function",
+ "method", "attribute".
+ name : str
+ The name of the member.
+ obj : module, class, exception, function, method, or attribute.
+ For example, if the member is the __init__ method of class A, then
+ `obj` will be `A.__init__`.
+ skip : bool
+ A boolean indicating if autodoc will skip this member if `_skip_member`
+ does not override the decision
+ options : sphinx.ext.autodoc.Options
+ The options given to the directive: an object with attributes
+ inherited_members, undoc_members, show_inheritance and no_index that
+ are True if the flag option of same name was given to the auto
+ directive.
+
+ Returns
+ -------
+ bool
+ True if the member should be skipped during creation of the docs,
+ False if it should be included in the docs.
+
+ """
+ has_doc = getattr(obj, '__doc__', False)
+ is_member = what in ('class', 'exception', 'module')
+ if name != '__weakref__' and has_doc and is_member:
+ cls_is_owner = False
+ if what in ('class', 'exception'):
+ qualname = getattr(obj, '__qualname__', '')
+ cls_path, _, _ = qualname.rpartition('.')
+ if cls_path:
+ try:
+ if '.' in cls_path:
+ import functools
+ import importlib
+
+ mod = importlib.import_module(obj.__module__)
+ mod_path = cls_path.split('.')
+ cls = functools.reduce(getattr, mod_path, mod)
+ else:
+ cls = inspect.unwrap(obj).__globals__[cls_path]
+ except Exception:
+ cls_is_owner = False
+ else:
+ cls_is_owner = (cls and hasattr(cls, name) and # type: ignore[assignment]
+ name in cls.__dict__)
+ else:
+ cls_is_owner = False
+
+ if what == 'module' or cls_is_owner:
+ is_init = (name == '__init__')
+ is_special = (not is_init and name.startswith('__') and
+ name.endswith('__'))
+ is_private = (not is_init and not is_special and
+ name.startswith('_'))
+ inc_init = app.config.napoleon_include_init_with_doc
+ inc_special = app.config.napoleon_include_special_with_doc
+ inc_private = app.config.napoleon_include_private_with_doc
+ if ((is_special and inc_special) or
+ (is_private and inc_private) or
+ (is_init and inc_init)):
+ return False
+ return None
diff --git a/sphinx/ext/napoleon/docstring.py b/sphinx/ext/napoleon/docstring.py
new file mode 100644
index 0000000..2ffde39
--- /dev/null
+++ b/sphinx/ext/napoleon/docstring.py
@@ -0,0 +1,1363 @@
+"""Classes for docstring parsing and formatting."""
+
+from __future__ import annotations
+
+import collections
+import contextlib
+import inspect
+import re
+from functools import partial
+from typing import TYPE_CHECKING, Any, Callable
+
+from sphinx.locale import _, __
+from sphinx.util import logging
+from sphinx.util.typing import get_type_hints, stringify_annotation
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.config import Config as SphinxConfig
+
+logger = logging.getLogger(__name__)
+
+_directive_regex = re.compile(r'\.\. \S+::')
+_google_section_regex = re.compile(r'^(\s|\w)+:\s*$')
+_google_typed_arg_regex = re.compile(r'(.+?)\(\s*(.*[^\s]+)\s*\)')
+_numpy_section_regex = re.compile(r'^[=\-`:\'"~^_*+#<>]{2,}\s*$')
+_single_colon_regex = re.compile(r'(?<!:):(?!:)')
+_xref_or_code_regex = re.compile(
+ r'((?::(?:[a-zA-Z0-9]+[\-_+:.])*[a-zA-Z0-9]+:`.+?`)|'
+ r'(?:``.+?``)|'
+ r'(?::meta .+:.*)|'
+ r'(?:`.+?\s*(?<!\x00)<.*?>`))')
+_xref_regex = re.compile(
+ r'(?:(?::(?:[a-zA-Z0-9]+[\-_+:.])*[a-zA-Z0-9]+:)?`.+?`)',
+)
+_bullet_list_regex = re.compile(r'^(\*|\+|\-)(\s+\S|\s*$)')
+_enumerated_list_regex = re.compile(
+ r'^(?P<paren>\()?'
+ r'(\d+|#|[ivxlcdm]+|[IVXLCDM]+|[a-zA-Z])'
+ r'(?(paren)\)|\.)(\s+\S|\s*$)')
+_token_regex = re.compile(
+ r"(,\sor\s|\sor\s|\sof\s|:\s|\sto\s|,\sand\s|\sand\s|,\s"
+ r"|[{]|[}]"
+ r'|"(?:\\"|[^"])*"'
+ r"|'(?:\\'|[^'])*')",
+)
+_default_regex = re.compile(
+ r"^default[^_0-9A-Za-z].*$",
+)
+_SINGLETONS = ("None", "True", "False", "Ellipsis")
+
+
+class Deque(collections.deque):
+ """
+ A subclass of deque that mimics ``pockets.iterators.modify_iter``.
+
+ The `.Deque.get` and `.Deque.next` methods are added.
+ """
+
+ sentinel = object()
+
+ def get(self, n: int) -> Any:
+ """
+ Return the nth element of the stack, or ``self.sentinel`` if n is
+ greater than the stack size.
+ """
+ return self[n] if n < len(self) else self.sentinel
+
+ def next(self) -> Any:
+ if self:
+ return super().popleft()
+ else:
+ raise StopIteration
+
+
+def _convert_type_spec(_type: str, translations: dict[str, str] | None = None) -> str:
+ """Convert type specification to reference in reST."""
+ if translations is not None and _type in translations:
+ return translations[_type]
+ if _type == 'None':
+ return ':py:obj:`None`'
+ return f':py:class:`{_type}`'
+
+
+class GoogleDocstring:
+ """Convert Google style docstrings to reStructuredText.
+
+ Parameters
+ ----------
+ docstring : :obj:`str` or :obj:`list` of :obj:`str`
+ The docstring to parse, given either as a string or split into
+ individual lines.
+ config: :obj:`sphinx.ext.napoleon.Config` or :obj:`sphinx.config.Config`
+ The configuration settings to use. If not given, defaults to the
+ config object on `app`; or if `app` is not given defaults to the
+ a new :class:`sphinx.ext.napoleon.Config` object.
+
+
+ Other Parameters
+ ----------------
+ app : :class:`sphinx.application.Sphinx`, optional
+ Application object representing the Sphinx process.
+ what : :obj:`str`, optional
+ A string specifying the type of the object to which the docstring
+ belongs. Valid values: "module", "class", "exception", "function",
+ "method", "attribute".
+ name : :obj:`str`, optional
+ The fully qualified name of the object.
+ obj : module, class, exception, function, method, or attribute
+ The object to which the docstring belongs.
+ options : :class:`sphinx.ext.autodoc.Options`, optional
+ The options given to the directive: an object with attributes
+ inherited_members, undoc_members, show_inheritance and no_index that
+ are True if the flag option of same name was given to the auto
+ directive.
+
+
+ Example
+ -------
+ >>> from sphinx.ext.napoleon import Config
+ >>> config = Config(napoleon_use_param=True, napoleon_use_rtype=True)
+ >>> docstring = '''One line summary.
+ ...
+ ... Extended description.
+ ...
+ ... Args:
+ ... arg1(int): Description of `arg1`
+ ... arg2(str): Description of `arg2`
+ ... Returns:
+ ... str: Description of return value.
+ ... '''
+ >>> print(GoogleDocstring(docstring, config))
+ One line summary.
+ <BLANKLINE>
+ Extended description.
+ <BLANKLINE>
+ :param arg1: Description of `arg1`
+ :type arg1: int
+ :param arg2: Description of `arg2`
+ :type arg2: str
+ <BLANKLINE>
+ :returns: Description of return value.
+ :rtype: str
+ <BLANKLINE>
+
+ """
+
+ _name_rgx = re.compile(r"^\s*((?::(?P<role>\S+):)?`(?P<name>~?[a-zA-Z0-9_.-]+)`|"
+ r" (?P<name2>~?[a-zA-Z0-9_.-]+))\s*", re.X)
+
+ def __init__(
+ self,
+ docstring: str | list[str],
+ config: SphinxConfig | None = None,
+ app: Sphinx | None = None,
+ what: str = '',
+ name: str = '',
+ obj: Any = None,
+ options: Any = None,
+ ) -> None:
+ self._app = app
+ if config:
+ self._config = config
+ elif app:
+ self._config = app.config
+ else:
+ from sphinx.ext.napoleon import Config
+
+ self._config = Config() # type: ignore[assignment]
+
+ if not what:
+ if inspect.isclass(obj):
+ what = 'class'
+ elif inspect.ismodule(obj):
+ what = 'module'
+ elif callable(obj):
+ what = 'function'
+ else:
+ what = 'object'
+
+ self._what = what
+ self._name = name
+ self._obj = obj
+ self._opt = options
+ if isinstance(docstring, str):
+ lines = docstring.splitlines()
+ else:
+ lines = docstring
+ self._lines = Deque(map(str.rstrip, lines))
+ self._parsed_lines: list[str] = []
+ self._is_in_section = False
+ self._section_indent = 0
+ if not hasattr(self, '_directive_sections'):
+ self._directive_sections: list[str] = []
+ if not hasattr(self, '_sections'):
+ self._sections: dict[str, Callable] = {
+ 'args': self._parse_parameters_section,
+ 'arguments': self._parse_parameters_section,
+ 'attention': partial(self._parse_admonition, 'attention'),
+ 'attributes': self._parse_attributes_section,
+ 'caution': partial(self._parse_admonition, 'caution'),
+ 'danger': partial(self._parse_admonition, 'danger'),
+ 'error': partial(self._parse_admonition, 'error'),
+ 'example': self._parse_examples_section,
+ 'examples': self._parse_examples_section,
+ 'hint': partial(self._parse_admonition, 'hint'),
+ 'important': partial(self._parse_admonition, 'important'),
+ 'keyword args': self._parse_keyword_arguments_section,
+ 'keyword arguments': self._parse_keyword_arguments_section,
+ 'methods': self._parse_methods_section,
+ 'note': partial(self._parse_admonition, 'note'),
+ 'notes': self._parse_notes_section,
+ 'other parameters': self._parse_other_parameters_section,
+ 'parameters': self._parse_parameters_section,
+ 'receive': self._parse_receives_section,
+ 'receives': self._parse_receives_section,
+ 'return': self._parse_returns_section,
+ 'returns': self._parse_returns_section,
+ 'raise': self._parse_raises_section,
+ 'raises': self._parse_raises_section,
+ 'references': self._parse_references_section,
+ 'see also': self._parse_see_also_section,
+ 'tip': partial(self._parse_admonition, 'tip'),
+ 'todo': partial(self._parse_admonition, 'todo'),
+ 'warning': partial(self._parse_admonition, 'warning'),
+ 'warnings': partial(self._parse_admonition, 'warning'),
+ 'warn': self._parse_warns_section,
+ 'warns': self._parse_warns_section,
+ 'yield': self._parse_yields_section,
+ 'yields': self._parse_yields_section,
+ }
+
+ self._load_custom_sections()
+
+ self._parse()
+
+ def __str__(self) -> str:
+ """Return the parsed docstring in reStructuredText format.
+
+ Returns
+ -------
+ unicode
+ Unicode version of the docstring.
+
+ """
+ return '\n'.join(self.lines())
+
+ def lines(self) -> list[str]:
+ """Return the parsed lines of the docstring in reStructuredText format.
+
+ Returns
+ -------
+ list(str)
+ The lines of the docstring in a list.
+
+ """
+ return self._parsed_lines
+
+ def _consume_indented_block(self, indent: int = 1) -> list[str]:
+ lines = []
+ line = self._lines.get(0)
+ while (
+ not self._is_section_break() and
+ (not line or self._is_indented(line, indent))
+ ):
+ lines.append(self._lines.next())
+ line = self._lines.get(0)
+ return lines
+
+ def _consume_contiguous(self) -> list[str]:
+ lines = []
+ while (self._lines and
+ self._lines.get(0) and
+ not self._is_section_header()):
+ lines.append(self._lines.next())
+ return lines
+
+ def _consume_empty(self) -> list[str]:
+ lines = []
+ line = self._lines.get(0)
+ while self._lines and not line:
+ lines.append(self._lines.next())
+ line = self._lines.get(0)
+ return lines
+
+ def _consume_field(self, parse_type: bool = True, prefer_type: bool = False,
+ ) -> tuple[str, str, list[str]]:
+ line = self._lines.next()
+
+ before, colon, after = self._partition_field_on_colon(line)
+ _name, _type, _desc = before, '', after
+
+ if parse_type:
+ match = _google_typed_arg_regex.match(before)
+ if match:
+ _name = match.group(1).strip()
+ _type = match.group(2)
+
+ _name = self._escape_args_and_kwargs(_name)
+
+ if prefer_type and not _type:
+ _type, _name = _name, _type
+
+ if _type and self._config.napoleon_preprocess_types:
+ _type = _convert_type_spec(_type, self._config.napoleon_type_aliases or {})
+
+ indent = self._get_indent(line) + 1
+ _descs = [_desc] + self._dedent(self._consume_indented_block(indent))
+ _descs = self.__class__(_descs, self._config).lines()
+ return _name, _type, _descs
+
+ def _consume_fields(self, parse_type: bool = True, prefer_type: bool = False,
+ multiple: bool = False) -> list[tuple[str, str, list[str]]]:
+ self._consume_empty()
+ fields = []
+ while not self._is_section_break():
+ _name, _type, _desc = self._consume_field(parse_type, prefer_type)
+ if multiple and _name:
+ for name in _name.split(","):
+ fields.append((name.strip(), _type, _desc))
+ elif _name or _type or _desc:
+ fields.append((_name, _type, _desc))
+ return fields
+
+ def _consume_inline_attribute(self) -> tuple[str, list[str]]:
+ line = self._lines.next()
+ _type, colon, _desc = self._partition_field_on_colon(line)
+ if not colon or not _desc:
+ _type, _desc = _desc, _type
+ _desc += colon
+ _descs = [_desc] + self._dedent(self._consume_to_end())
+ _descs = self.__class__(_descs, self._config).lines()
+ return _type, _descs
+
+ def _consume_returns_section(self, preprocess_types: bool = False,
+ ) -> list[tuple[str, str, list[str]]]:
+ lines = self._dedent(self._consume_to_next_section())
+ if lines:
+ before, colon, after = self._partition_field_on_colon(lines[0])
+ _name, _type, _desc = '', '', lines
+
+ if colon:
+ if after:
+ _desc = [after] + lines[1:]
+ else:
+ _desc = lines[1:]
+
+ _type = before
+
+ if (_type and preprocess_types and
+ self._config.napoleon_preprocess_types):
+ _type = _convert_type_spec(_type, self._config.napoleon_type_aliases or {})
+
+ _desc = self.__class__(_desc, self._config).lines()
+ return [(_name, _type, _desc)]
+ else:
+ return []
+
+ def _consume_usage_section(self) -> list[str]:
+ lines = self._dedent(self._consume_to_next_section())
+ return lines
+
+ def _consume_section_header(self) -> str:
+ section = self._lines.next()
+ stripped_section = section.strip(':')
+ if stripped_section.lower() in self._sections:
+ section = stripped_section
+ return section
+
+ def _consume_to_end(self) -> list[str]:
+ lines = []
+ while self._lines:
+ lines.append(self._lines.next())
+ return lines
+
+ def _consume_to_next_section(self) -> list[str]:
+ self._consume_empty()
+ lines = []
+ while not self._is_section_break():
+ lines.append(self._lines.next())
+ return lines + self._consume_empty()
+
+ def _dedent(self, lines: list[str], full: bool = False) -> list[str]:
+ if full:
+ return [line.lstrip() for line in lines]
+ else:
+ min_indent = self._get_min_indent(lines)
+ return [line[min_indent:] for line in lines]
+
+ def _escape_args_and_kwargs(self, name: str) -> str:
+ if name.endswith('_') and getattr(self._config, 'strip_signature_backslash', False):
+ name = name[:-1] + r'\_'
+
+ if name[:2] == '**':
+ return r'\*\*' + name[2:]
+ elif name[:1] == '*':
+ return r'\*' + name[1:]
+ else:
+ return name
+
+ def _fix_field_desc(self, desc: list[str]) -> list[str]:
+ if self._is_list(desc):
+ desc = [''] + desc
+ elif desc[0].endswith('::'):
+ desc_block = desc[1:]
+ indent = self._get_indent(desc[0])
+ block_indent = self._get_initial_indent(desc_block)
+ if block_indent > indent:
+ desc = [''] + desc
+ else:
+ desc = ['', desc[0]] + self._indent(desc_block, 4)
+ return desc
+
+ def _format_admonition(self, admonition: str, lines: list[str]) -> list[str]:
+ lines = self._strip_empty(lines)
+ if len(lines) == 1:
+ return [f'.. {admonition}:: {lines[0].strip()}', '']
+ elif lines:
+ lines = self._indent(self._dedent(lines), 3)
+ return ['.. %s::' % admonition, ''] + lines + ['']
+ else:
+ return ['.. %s::' % admonition, '']
+
+ def _format_block(
+ self, prefix: str, lines: list[str], padding: str | None = None,
+ ) -> list[str]:
+ if lines:
+ if padding is None:
+ padding = ' ' * len(prefix)
+ result_lines = []
+ for i, line in enumerate(lines):
+ if i == 0:
+ result_lines.append((prefix + line).rstrip())
+ elif line:
+ result_lines.append(padding + line)
+ else:
+ result_lines.append('')
+ return result_lines
+ else:
+ return [prefix]
+
+ def _format_docutils_params(self, fields: list[tuple[str, str, list[str]]],
+ field_role: str = 'param', type_role: str = 'type',
+ ) -> list[str]:
+ lines = []
+ for _name, _type, _desc in fields:
+ _desc = self._strip_empty(_desc)
+ if any(_desc):
+ _desc = self._fix_field_desc(_desc)
+ field = f':{field_role} {_name}: '
+ lines.extend(self._format_block(field, _desc))
+ else:
+ lines.append(f':{field_role} {_name}:')
+
+ if _type:
+ lines.append(f':{type_role} {_name}: {_type}')
+ return lines + ['']
+
+ def _format_field(self, _name: str, _type: str, _desc: list[str]) -> list[str]:
+ _desc = self._strip_empty(_desc)
+ has_desc = any(_desc)
+ separator = ' -- ' if has_desc else ''
+ if _name:
+ if _type:
+ if '`' in _type:
+ field = f'**{_name}** ({_type}){separator}'
+ else:
+ field = f'**{_name}** (*{_type}*){separator}'
+ else:
+ field = f'**{_name}**{separator}'
+ elif _type:
+ if '`' in _type:
+ field = f'{_type}{separator}'
+ else:
+ field = f'*{_type}*{separator}'
+ else:
+ field = ''
+
+ if has_desc:
+ _desc = self._fix_field_desc(_desc)
+ if _desc[0]:
+ return [field + _desc[0]] + _desc[1:]
+ else:
+ return [field] + _desc
+ else:
+ return [field]
+
+ def _format_fields(self, field_type: str, fields: list[tuple[str, str, list[str]]],
+ ) -> list[str]:
+ field_type = ':%s:' % field_type.strip()
+ padding = ' ' * len(field_type)
+ multi = len(fields) > 1
+ lines: list[str] = []
+ for _name, _type, _desc in fields:
+ field = self._format_field(_name, _type, _desc)
+ if multi:
+ if lines:
+ lines.extend(self._format_block(padding + ' * ', field))
+ else:
+ lines.extend(self._format_block(field_type + ' * ', field))
+ else:
+ lines.extend(self._format_block(field_type + ' ', field))
+ if lines and lines[-1]:
+ lines.append('')
+ return lines
+
+ def _get_current_indent(self, peek_ahead: int = 0) -> int:
+ line = self._lines.get(peek_ahead)
+ while line is not self._lines.sentinel:
+ if line:
+ return self._get_indent(line)
+ peek_ahead += 1
+ line = self._lines.get(peek_ahead)
+ return 0
+
+ def _get_indent(self, line: str) -> int:
+ for i, s in enumerate(line):
+ if not s.isspace():
+ return i
+ return len(line)
+
+ def _get_initial_indent(self, lines: list[str]) -> int:
+ for line in lines:
+ if line:
+ return self._get_indent(line)
+ return 0
+
+ def _get_min_indent(self, lines: list[str]) -> int:
+ min_indent = None
+ for line in lines:
+ if line:
+ indent = self._get_indent(line)
+ if min_indent is None or indent < min_indent:
+ min_indent = indent
+ return min_indent or 0
+
+ def _indent(self, lines: list[str], n: int = 4) -> list[str]:
+ return [(' ' * n) + line for line in lines]
+
+ def _is_indented(self, line: str, indent: int = 1) -> bool:
+ for i, s in enumerate(line): # noqa: SIM110
+ if i >= indent:
+ return True
+ elif not s.isspace():
+ return False
+ return False
+
+ def _is_list(self, lines: list[str]) -> bool:
+ if not lines:
+ return False
+ if _bullet_list_regex.match(lines[0]):
+ return True
+ if _enumerated_list_regex.match(lines[0]):
+ return True
+ if len(lines) < 2 or lines[0].endswith('::'):
+ return False
+ indent = self._get_indent(lines[0])
+ next_indent = indent
+ for line in lines[1:]:
+ if line:
+ next_indent = self._get_indent(line)
+ break
+ return next_indent > indent
+
+ def _is_section_header(self) -> bool:
+ section = self._lines.get(0).lower()
+ match = _google_section_regex.match(section)
+ if match and section.strip(':') in self._sections:
+ header_indent = self._get_indent(section)
+ section_indent = self._get_current_indent(peek_ahead=1)
+ return section_indent > header_indent
+ elif self._directive_sections:
+ if _directive_regex.match(section):
+ for directive_section in self._directive_sections:
+ if section.startswith(directive_section):
+ return True
+ return False
+
+ def _is_section_break(self) -> bool:
+ line = self._lines.get(0)
+ return (not self._lines or
+ self._is_section_header() or
+ (self._is_in_section and
+ line and
+ not self._is_indented(line, self._section_indent)))
+
+ def _load_custom_sections(self) -> None:
+ if self._config.napoleon_custom_sections is not None:
+ for entry in self._config.napoleon_custom_sections:
+ if isinstance(entry, str):
+ # if entry is just a label, add to sections list,
+ # using generic section logic.
+ self._sections[entry.lower()] = self._parse_custom_generic_section
+ else:
+ # otherwise, assume entry is container;
+ if entry[1] == "params_style":
+ self._sections[entry[0].lower()] = \
+ self._parse_custom_params_style_section
+ elif entry[1] == "returns_style":
+ self._sections[entry[0].lower()] = \
+ self._parse_custom_returns_style_section
+ else:
+ # [0] is new section, [1] is the section to alias.
+ # in the case of key mismatch, just handle as generic section.
+ self._sections[entry[0].lower()] = \
+ self._sections.get(entry[1].lower(),
+ self._parse_custom_generic_section)
+
+ def _parse(self) -> None:
+ self._parsed_lines = self._consume_empty()
+
+ if self._name and self._what in ('attribute', 'data', 'property'):
+ res: list[str] = []
+ with contextlib.suppress(StopIteration):
+ res = self._parse_attribute_docstring()
+
+ self._parsed_lines.extend(res)
+ return
+
+ while self._lines:
+ if self._is_section_header():
+ try:
+ section = self._consume_section_header()
+ self._is_in_section = True
+ self._section_indent = self._get_current_indent()
+ if _directive_regex.match(section):
+ lines = [section] + self._consume_to_next_section()
+ else:
+ lines = self._sections[section.lower()](section)
+ finally:
+ self._is_in_section = False
+ self._section_indent = 0
+ else:
+ if not self._parsed_lines:
+ lines = self._consume_contiguous() + self._consume_empty()
+ else:
+ lines = self._consume_to_next_section()
+ self._parsed_lines.extend(lines)
+
+ def _parse_admonition(self, admonition: str, section: str) -> list[str]:
+ # type (str, str) -> List[str]
+ lines = self._consume_to_next_section()
+ return self._format_admonition(admonition, lines)
+
+ def _parse_attribute_docstring(self) -> list[str]:
+ _type, _desc = self._consume_inline_attribute()
+ lines = self._format_field('', '', _desc)
+ if _type:
+ lines.extend(['', ':type: %s' % _type])
+ return lines
+
+ def _parse_attributes_section(self, section: str) -> list[str]:
+ lines = []
+ for _name, _type, _desc in self._consume_fields():
+ if not _type:
+ _type = self._lookup_annotation(_name)
+ if self._config.napoleon_use_ivar:
+ field = ':ivar %s: ' % _name
+ lines.extend(self._format_block(field, _desc))
+ if _type:
+ lines.append(f':vartype {_name}: {_type}')
+ else:
+ lines.append('.. attribute:: ' + _name)
+ if self._opt:
+ if 'no-index' in self._opt or 'noindex' in self._opt:
+ lines.append(' :no-index:')
+ lines.append('')
+
+ fields = self._format_field('', '', _desc)
+ lines.extend(self._indent(fields, 3))
+ if _type:
+ lines.append('')
+ lines.extend(self._indent([':type: %s' % _type], 3))
+ lines.append('')
+ if self._config.napoleon_use_ivar:
+ lines.append('')
+ return lines
+
+ def _parse_examples_section(self, section: str) -> list[str]:
+ labels = {
+ 'example': _('Example'),
+ 'examples': _('Examples'),
+ }
+ use_admonition = self._config.napoleon_use_admonition_for_examples
+ label = labels.get(section.lower(), section)
+ return self._parse_generic_section(label, use_admonition)
+
+ def _parse_custom_generic_section(self, section: str) -> list[str]:
+ # for now, no admonition for simple custom sections
+ return self._parse_generic_section(section, False)
+
+ def _parse_custom_params_style_section(self, section: str) -> list[str]:
+ return self._format_fields(section, self._consume_fields())
+
+ def _parse_custom_returns_style_section(self, section: str) -> list[str]:
+ fields = self._consume_returns_section(preprocess_types=True)
+ return self._format_fields(section, fields)
+
+ def _parse_usage_section(self, section: str) -> list[str]:
+ header = ['.. rubric:: Usage:', '']
+ block = ['.. code-block:: python', '']
+ lines = self._consume_usage_section()
+ lines = self._indent(lines, 3)
+ return header + block + lines + ['']
+
+ def _parse_generic_section(self, section: str, use_admonition: bool) -> list[str]:
+ lines = self._strip_empty(self._consume_to_next_section())
+ lines = self._dedent(lines)
+ if use_admonition:
+ header = '.. admonition:: %s' % section
+ lines = self._indent(lines, 3)
+ else:
+ header = '.. rubric:: %s' % section
+ if lines:
+ return [header, ''] + lines + ['']
+ else:
+ return [header, '']
+
+ def _parse_keyword_arguments_section(self, section: str) -> list[str]:
+ fields = self._consume_fields()
+ if self._config.napoleon_use_keyword:
+ return self._format_docutils_params(
+ fields,
+ field_role="keyword",
+ type_role="kwtype")
+ else:
+ return self._format_fields(_('Keyword Arguments'), fields)
+
+ def _parse_methods_section(self, section: str) -> list[str]:
+ lines: list[str] = []
+ for _name, _type, _desc in self._consume_fields(parse_type=False):
+ lines.append('.. method:: %s' % _name)
+ if self._opt:
+ if 'no-index' in self._opt or 'noindex' in self._opt:
+ lines.append(' :no-index:')
+ if _desc:
+ lines.extend([''] + self._indent(_desc, 3))
+ lines.append('')
+ return lines
+
+ def _parse_notes_section(self, section: str) -> list[str]:
+ use_admonition = self._config.napoleon_use_admonition_for_notes
+ return self._parse_generic_section(_('Notes'), use_admonition)
+
+ def _parse_other_parameters_section(self, section: str) -> list[str]:
+ if self._config.napoleon_use_param:
+ # Allow to declare multiple parameters at once (ex: x, y: int)
+ fields = self._consume_fields(multiple=True)
+ return self._format_docutils_params(fields)
+ else:
+ fields = self._consume_fields()
+ return self._format_fields(_('Other Parameters'), fields)
+
+ def _parse_parameters_section(self, section: str) -> list[str]:
+ if self._config.napoleon_use_param:
+ # Allow to declare multiple parameters at once (ex: x, y: int)
+ fields = self._consume_fields(multiple=True)
+ return self._format_docutils_params(fields)
+ else:
+ fields = self._consume_fields()
+ return self._format_fields(_('Parameters'), fields)
+
+ def _parse_raises_section(self, section: str) -> list[str]:
+ fields = self._consume_fields(parse_type=False, prefer_type=True)
+ lines: list[str] = []
+ for _name, _type, _desc in fields:
+ m = self._name_rgx.match(_type)
+ if m and m.group('name'):
+ _type = m.group('name')
+ elif _xref_regex.match(_type):
+ pos = _type.find('`')
+ _type = _type[pos + 1:-1]
+ _type = ' ' + _type if _type else ''
+ _desc = self._strip_empty(_desc)
+ _descs = ' ' + '\n '.join(_desc) if any(_desc) else ''
+ lines.append(f':raises{_type}:{_descs}')
+ if lines:
+ lines.append('')
+ return lines
+
+ def _parse_receives_section(self, section: str) -> list[str]:
+ if self._config.napoleon_use_param:
+ # Allow to declare multiple parameters at once (ex: x, y: int)
+ fields = self._consume_fields(multiple=True)
+ return self._format_docutils_params(fields)
+ else:
+ fields = self._consume_fields()
+ return self._format_fields(_('Receives'), fields)
+
+ def _parse_references_section(self, section: str) -> list[str]:
+ use_admonition = self._config.napoleon_use_admonition_for_references
+ return self._parse_generic_section(_('References'), use_admonition)
+
+ def _parse_returns_section(self, section: str) -> list[str]:
+ fields = self._consume_returns_section()
+ multi = len(fields) > 1
+ use_rtype = False if multi else self._config.napoleon_use_rtype
+ lines: list[str] = []
+
+ for _name, _type, _desc in fields:
+ if use_rtype:
+ field = self._format_field(_name, '', _desc)
+ else:
+ field = self._format_field(_name, _type, _desc)
+
+ if multi:
+ if lines:
+ lines.extend(self._format_block(' * ', field))
+ else:
+ lines.extend(self._format_block(':returns: * ', field))
+ else:
+ if any(field): # only add :returns: if there's something to say
+ lines.extend(self._format_block(':returns: ', field))
+ if _type and use_rtype:
+ lines.extend([':rtype: %s' % _type, ''])
+ if lines and lines[-1]:
+ lines.append('')
+ return lines
+
+ def _parse_see_also_section(self, section: str) -> list[str]:
+ return self._parse_admonition('seealso', section)
+
+ def _parse_warns_section(self, section: str) -> list[str]:
+ return self._format_fields(_('Warns'), self._consume_fields())
+
+ def _parse_yields_section(self, section: str) -> list[str]:
+ fields = self._consume_returns_section(preprocess_types=True)
+ return self._format_fields(_('Yields'), fields)
+
+ def _partition_field_on_colon(self, line: str) -> tuple[str, str, str]:
+ before_colon = []
+ after_colon = []
+ colon = ''
+ found_colon = False
+ for i, source in enumerate(_xref_or_code_regex.split(line)):
+ if found_colon:
+ after_colon.append(source)
+ else:
+ m = _single_colon_regex.search(source)
+ if (i % 2) == 0 and m:
+ found_colon = True
+ colon = source[m.start(): m.end()]
+ before_colon.append(source[:m.start()])
+ after_colon.append(source[m.end():])
+ else:
+ before_colon.append(source)
+
+ return ("".join(before_colon).strip(),
+ colon,
+ "".join(after_colon).strip())
+
+ def _strip_empty(self, lines: list[str]) -> list[str]:
+ if lines:
+ start = -1
+ for i, line in enumerate(lines):
+ if line:
+ start = i
+ break
+ if start == -1:
+ lines = []
+ end = -1
+ for i in reversed(range(len(lines))):
+ line = lines[i]
+ if line:
+ end = i
+ break
+ if start > 0 or end + 1 < len(lines):
+ lines = lines[start:end + 1]
+ return lines
+
+ def _lookup_annotation(self, _name: str) -> str:
+ if self._config.napoleon_attr_annotations:
+ if self._what in ("module", "class", "exception") and self._obj:
+ # cache the class annotations
+ if not hasattr(self, "_annotations"):
+ localns = getattr(self._config, "autodoc_type_aliases", {})
+ localns.update(getattr(
+ self._config, "napoleon_type_aliases", {},
+ ) or {})
+ self._annotations = get_type_hints(self._obj, None, localns)
+ if _name in self._annotations:
+ return stringify_annotation(self._annotations[_name],
+ 'fully-qualified-except-typing')
+ # No annotation found
+ return ""
+
+
+def _recombine_set_tokens(tokens: list[str]) -> list[str]:
+ token_queue = collections.deque(tokens)
+ keywords = ("optional", "default")
+
+ def takewhile_set(tokens):
+ open_braces = 0
+ previous_token = None
+ while True:
+ try:
+ token = tokens.popleft()
+ except IndexError:
+ break
+
+ if token == ", ":
+ previous_token = token
+ continue
+
+ if not token.strip():
+ continue
+
+ if token in keywords:
+ tokens.appendleft(token)
+ if previous_token is not None:
+ tokens.appendleft(previous_token)
+ break
+
+ if previous_token is not None:
+ yield previous_token
+ previous_token = None
+
+ if token == "{":
+ open_braces += 1
+ elif token == "}":
+ open_braces -= 1
+
+ yield token
+
+ if open_braces == 0:
+ break
+
+ def combine_set(tokens):
+ while True:
+ try:
+ token = tokens.popleft()
+ except IndexError:
+ break
+
+ if token == "{":
+ tokens.appendleft("{")
+ yield "".join(takewhile_set(tokens))
+ else:
+ yield token
+
+ return list(combine_set(token_queue))
+
+
+def _tokenize_type_spec(spec: str) -> list[str]:
+ def postprocess(item):
+ if _default_regex.match(item):
+ default = item[:7]
+ # can't be separated by anything other than a single space
+ # for now
+ other = item[8:]
+
+ return [default, " ", other]
+ else:
+ return [item]
+
+ tokens = [
+ item
+ for raw_token in _token_regex.split(spec)
+ for item in postprocess(raw_token)
+ if item
+ ]
+ return tokens
+
+
+def _token_type(token: str, location: str | None = None) -> str:
+ def is_numeric(token):
+ try:
+ # use complex to make sure every numeric value is detected as literal
+ complex(token)
+ except ValueError:
+ return False
+ else:
+ return True
+
+ if token.startswith(" ") or token.endswith(" "):
+ type_ = "delimiter"
+ elif (
+ is_numeric(token) or
+ (token.startswith("{") and token.endswith("}")) or
+ (token.startswith('"') and token.endswith('"')) or
+ (token.startswith("'") and token.endswith("'"))
+ ):
+ type_ = "literal"
+ elif token.startswith("{"):
+ logger.warning(
+ __("invalid value set (missing closing brace): %s"),
+ token,
+ location=location,
+ )
+ type_ = "literal"
+ elif token.endswith("}"):
+ logger.warning(
+ __("invalid value set (missing opening brace): %s"),
+ token,
+ location=location,
+ )
+ type_ = "literal"
+ elif token.startswith(("'", '"')):
+ logger.warning(
+ __("malformed string literal (missing closing quote): %s"),
+ token,
+ location=location,
+ )
+ type_ = "literal"
+ elif token.endswith(("'", '"')):
+ logger.warning(
+ __("malformed string literal (missing opening quote): %s"),
+ token,
+ location=location,
+ )
+ type_ = "literal"
+ elif token in ("optional", "default"):
+ # default is not a official keyword (yet) but supported by the
+ # reference implementation (numpydoc) and widely used
+ type_ = "control"
+ elif _xref_regex.match(token):
+ type_ = "reference"
+ else:
+ type_ = "obj"
+
+ return type_
+
+
+def _convert_numpy_type_spec(
+ _type: str, location: str | None = None, translations: dict | None = None,
+) -> str:
+ if translations is None:
+ translations = {}
+
+ def convert_obj(obj, translations, default_translation):
+ translation = translations.get(obj, obj)
+
+ # use :class: (the default) only if obj is not a standard singleton
+ if translation in _SINGLETONS and default_translation == ":class:`%s`":
+ default_translation = ":obj:`%s`"
+ elif translation == "..." and default_translation == ":class:`%s`":
+ # allow referencing the builtin ...
+ default_translation = ":obj:`%s <Ellipsis>`"
+
+ if _xref_regex.match(translation) is None:
+ translation = default_translation % translation
+
+ return translation
+
+ tokens = _tokenize_type_spec(_type)
+ combined_tokens = _recombine_set_tokens(tokens)
+ types = [
+ (token, _token_type(token, location))
+ for token in combined_tokens
+ ]
+
+ converters = {
+ "literal": lambda x: "``%s``" % x,
+ "obj": lambda x: convert_obj(x, translations, ":class:`%s`"),
+ "control": lambda x: "*%s*" % x,
+ "delimiter": lambda x: x,
+ "reference": lambda x: x,
+ }
+
+ converted = "".join(converters.get(type_)(token) # type: ignore[misc]
+ for token, type_ in types)
+
+ return converted
+
+
+class NumpyDocstring(GoogleDocstring):
+ """Convert NumPy style docstrings to reStructuredText.
+
+ Parameters
+ ----------
+ docstring : :obj:`str` or :obj:`list` of :obj:`str`
+ The docstring to parse, given either as a string or split into
+ individual lines.
+ config: :obj:`sphinx.ext.napoleon.Config` or :obj:`sphinx.config.Config`
+ The configuration settings to use. If not given, defaults to the
+ config object on `app`; or if `app` is not given defaults to the
+ a new :class:`sphinx.ext.napoleon.Config` object.
+
+
+ Other Parameters
+ ----------------
+ app : :class:`sphinx.application.Sphinx`, optional
+ Application object representing the Sphinx process.
+ what : :obj:`str`, optional
+ A string specifying the type of the object to which the docstring
+ belongs. Valid values: "module", "class", "exception", "function",
+ "method", "attribute".
+ name : :obj:`str`, optional
+ The fully qualified name of the object.
+ obj : module, class, exception, function, method, or attribute
+ The object to which the docstring belongs.
+ options : :class:`sphinx.ext.autodoc.Options`, optional
+ The options given to the directive: an object with attributes
+ inherited_members, undoc_members, show_inheritance and no_index that
+ are True if the flag option of same name was given to the auto
+ directive.
+
+
+ Example
+ -------
+ >>> from sphinx.ext.napoleon import Config
+ >>> config = Config(napoleon_use_param=True, napoleon_use_rtype=True)
+ >>> docstring = '''One line summary.
+ ...
+ ... Extended description.
+ ...
+ ... Parameters
+ ... ----------
+ ... arg1 : int
+ ... Description of `arg1`
+ ... arg2 : str
+ ... Description of `arg2`
+ ... Returns
+ ... -------
+ ... str
+ ... Description of return value.
+ ... '''
+ >>> print(NumpyDocstring(docstring, config))
+ One line summary.
+ <BLANKLINE>
+ Extended description.
+ <BLANKLINE>
+ :param arg1: Description of `arg1`
+ :type arg1: int
+ :param arg2: Description of `arg2`
+ :type arg2: str
+ <BLANKLINE>
+ :returns: Description of return value.
+ :rtype: str
+ <BLANKLINE>
+
+ Methods
+ -------
+ __str__()
+ Return the parsed docstring in reStructuredText format.
+
+ Returns
+ -------
+ str
+ UTF-8 encoded version of the docstring.
+
+ __unicode__()
+ Return the parsed docstring in reStructuredText format.
+
+ Returns
+ -------
+ unicode
+ Unicode version of the docstring.
+
+ lines()
+ Return the parsed lines of the docstring in reStructuredText format.
+
+ Returns
+ -------
+ list(str)
+ The lines of the docstring in a list.
+
+ """
+ def __init__(
+ self,
+ docstring: str | list[str],
+ config: SphinxConfig | None = None,
+ app: Sphinx | None = None,
+ what: str = '',
+ name: str = '',
+ obj: Any = None,
+ options: Any = None,
+ ) -> None:
+ self._directive_sections = ['.. index::']
+ super().__init__(docstring, config, app, what, name, obj, options)
+
+ def _get_location(self) -> str | None:
+ try:
+ filepath = inspect.getfile(self._obj) if self._obj is not None else None
+ except TypeError:
+ filepath = None
+ name = self._name
+
+ if filepath is None and name is None:
+ return None
+ elif filepath is None:
+ filepath = ""
+
+ return ":".join([filepath, "docstring of %s" % name])
+
+ def _escape_args_and_kwargs(self, name: str) -> str:
+ func = super()._escape_args_and_kwargs
+
+ if ", " in name:
+ return ", ".join(func(param) for param in name.split(", "))
+ else:
+ return func(name)
+
+ def _consume_field(self, parse_type: bool = True, prefer_type: bool = False,
+ ) -> tuple[str, str, list[str]]:
+ line = self._lines.next()
+ if parse_type:
+ _name, _, _type = self._partition_field_on_colon(line)
+ else:
+ _name, _type = line, ''
+ _name, _type = _name.strip(), _type.strip()
+ _name = self._escape_args_and_kwargs(_name)
+
+ if parse_type and not _type:
+ _type = self._lookup_annotation(_name)
+
+ if prefer_type and not _type:
+ _type, _name = _name, _type
+
+ if self._config.napoleon_preprocess_types:
+ _type = _convert_numpy_type_spec(
+ _type,
+ location=self._get_location(),
+ translations=self._config.napoleon_type_aliases or {},
+ )
+
+ indent = self._get_indent(line) + 1
+ _desc = self._dedent(self._consume_indented_block(indent))
+ _desc = self.__class__(_desc, self._config).lines()
+ return _name, _type, _desc
+
+ def _consume_returns_section(self, preprocess_types: bool = False,
+ ) -> list[tuple[str, str, list[str]]]:
+ return self._consume_fields(prefer_type=True)
+
+ def _consume_section_header(self) -> str:
+ section = self._lines.next()
+ if not _directive_regex.match(section):
+ # Consume the header underline
+ self._lines.next()
+ return section
+
+ def _is_section_break(self) -> bool:
+ line1, line2 = self._lines.get(0), self._lines.get(1)
+ return (not self._lines or
+ self._is_section_header() or
+ ['', ''] == [line1, line2] or
+ (self._is_in_section and
+ line1 and
+ not self._is_indented(line1, self._section_indent)))
+
+ def _is_section_header(self) -> bool:
+ section, underline = self._lines.get(0), self._lines.get(1)
+ section = section.lower()
+ if section in self._sections and isinstance(underline, str):
+ return bool(_numpy_section_regex.match(underline))
+ elif self._directive_sections:
+ if _directive_regex.match(section):
+ for directive_section in self._directive_sections:
+ if section.startswith(directive_section):
+ return True
+ return False
+
+ def _parse_see_also_section(self, section: str) -> list[str]:
+ lines = self._consume_to_next_section()
+ try:
+ return self._parse_numpydoc_see_also_section(lines)
+ except ValueError:
+ return self._format_admonition('seealso', lines)
+
+ def _parse_numpydoc_see_also_section(self, content: list[str]) -> list[str]:
+ """
+ Derived from the NumpyDoc implementation of _parse_see_also.
+
+ See Also
+ --------
+ func_name : Descriptive text
+ continued text
+ another_func_name : Descriptive text
+ func_name1, func_name2, :meth:`func_name`, func_name3
+
+ """
+ items = []
+
+ def parse_item_name(text: str) -> tuple[str, str | None]:
+ """Match ':role:`name`' or 'name'"""
+ m = self._name_rgx.match(text)
+ if m:
+ g = m.groups()
+ if g[1] is None:
+ return g[3], None
+ else:
+ return g[2], g[1]
+ raise ValueError("%s is not a item name" % text)
+
+ def push_item(name: str | None, rest: list[str]) -> None:
+ if not name:
+ return
+ name, role = parse_item_name(name)
+ items.append((name, list(rest), role))
+ del rest[:]
+
+ def translate(func, description, role):
+ translations = self._config.napoleon_type_aliases
+ if role is not None or not translations:
+ return func, description, role
+
+ translated = translations.get(func, func)
+ match = self._name_rgx.match(translated)
+ if not match:
+ return translated, description, role
+
+ groups = match.groupdict()
+ role = groups["role"]
+ new_func = groups["name"] or groups["name2"]
+
+ return new_func, description, role
+
+ current_func = None
+ rest: list[str] = []
+
+ for line in content:
+ if not line.strip():
+ continue
+
+ m = self._name_rgx.match(line)
+ if m and line[m.end():].strip().startswith(':'):
+ push_item(current_func, rest)
+ current_func, line = line[:m.end()], line[m.end():]
+ rest = [line.split(':', 1)[1].strip()]
+ if not rest[0]:
+ rest = []
+ elif not line.startswith(' '):
+ push_item(current_func, rest)
+ current_func = None
+ if ',' in line:
+ for func in line.split(','):
+ if func.strip():
+ push_item(func, [])
+ elif line.strip():
+ current_func = line
+ elif current_func is not None:
+ rest.append(line.strip())
+ push_item(current_func, rest)
+
+ if not items:
+ return []
+
+ # apply type aliases
+ items = [
+ translate(func, description, role)
+ for func, description, role in items
+ ]
+
+ lines: list[str] = []
+ last_had_desc = True
+ for name, desc, role in items:
+ if role:
+ link = f':{role}:`{name}`'
+ else:
+ link = ':obj:`%s`' % name
+ if desc or last_had_desc:
+ lines += ['']
+ lines += [link]
+ else:
+ lines[-1] += ", %s" % link
+ if desc:
+ lines += self._indent([' '.join(desc)])
+ last_had_desc = True
+ else:
+ last_had_desc = False
+ lines += ['']
+
+ return self._format_admonition('seealso', lines)
diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py
new file mode 100644
index 0000000..e540e7e
--- /dev/null
+++ b/sphinx/ext/todo.py
@@ -0,0 +1,246 @@
+"""Allow todos to be inserted into your documentation.
+
+Inclusion of todos can be switched of by a configuration variable.
+The todolist directive collects all todos of your project and lists them along
+with a backlink to the original location.
+"""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from docutils.parsers.rst.directives.admonitions import BaseAdmonition
+
+import sphinx
+from sphinx import addnodes
+from sphinx.domains import Domain
+from sphinx.errors import NoUri
+from sphinx.locale import _, __
+from sphinx.util import logging, texescape
+from sphinx.util.docutils import SphinxDirective, new_document
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import OptionSpec
+ from sphinx.writers.html import HTML5Translator
+ from sphinx.writers.latex import LaTeXTranslator
+
+logger = logging.getLogger(__name__)
+
+
+class todo_node(nodes.Admonition, nodes.Element):
+ pass
+
+
+class todolist(nodes.General, nodes.Element):
+ pass
+
+
+class Todo(BaseAdmonition, SphinxDirective):
+ """
+ A todo entry, displayed (if configured) in the form of an admonition.
+ """
+
+ node_class = todo_node
+ has_content = True
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {
+ 'class': directives.class_option,
+ 'name': directives.unchanged,
+ }
+
+ def run(self) -> list[Node]:
+ if not self.options.get('class'):
+ self.options['class'] = ['admonition-todo']
+
+ (todo,) = super().run()
+ if isinstance(todo, nodes.system_message):
+ return [todo]
+ elif isinstance(todo, todo_node):
+ todo.insert(0, nodes.title(text=_('Todo')))
+ todo['docname'] = self.env.docname
+ self.add_name(todo)
+ self.set_source_info(todo)
+ self.state.document.note_explicit_target(todo)
+ return [todo]
+ else:
+ raise RuntimeError # never reached here
+
+
+class TodoDomain(Domain):
+ name = 'todo'
+ label = 'todo'
+
+ @property
+ def todos(self) -> dict[str, list[todo_node]]:
+ return self.data.setdefault('todos', {})
+
+ def clear_doc(self, docname: str) -> None:
+ self.todos.pop(docname, None)
+
+ def merge_domaindata(self, docnames: list[str], otherdata: dict) -> None:
+ for docname in docnames:
+ self.todos[docname] = otherdata['todos'][docname]
+
+ def process_doc(self, env: BuildEnvironment, docname: str,
+ document: nodes.document) -> None:
+ todos = self.todos.setdefault(docname, [])
+ for todo in document.findall(todo_node):
+ env.app.emit('todo-defined', todo)
+ todos.append(todo)
+
+ if env.config.todo_emit_warnings:
+ logger.warning(__("TODO entry found: %s"), todo[1].astext(),
+ location=todo)
+
+
+class TodoList(SphinxDirective):
+ """
+ A list of all todo entries.
+ """
+
+ has_content = False
+ required_arguments = 0
+ optional_arguments = 0
+ final_argument_whitespace = False
+ option_spec: OptionSpec = {}
+
+ def run(self) -> list[Node]:
+ # Simply insert an empty todolist node which will be replaced later
+ # when process_todo_nodes is called
+ return [todolist('')]
+
+
+class TodoListProcessor:
+ def __init__(self, app: Sphinx, doctree: nodes.document, docname: str) -> None:
+ self.builder = app.builder
+ self.config = app.config
+ self.env = app.env
+ self.domain = cast(TodoDomain, app.env.get_domain('todo'))
+ self.document = new_document('')
+
+ self.process(doctree, docname)
+
+ def process(self, doctree: nodes.document, docname: str) -> None:
+ todos: list[todo_node] = sum(self.domain.todos.values(), [])
+ for node in list(doctree.findall(todolist)):
+ if not self.config.todo_include_todos:
+ node.parent.remove(node)
+ continue
+
+ if node.get('ids'):
+ content: list[Element] = [nodes.target()]
+ else:
+ content = []
+
+ for todo in todos:
+ # Create a copy of the todo node
+ new_todo = todo.deepcopy()
+ new_todo['ids'].clear()
+
+ self.resolve_reference(new_todo, docname)
+ content.append(new_todo)
+
+ todo_ref = self.create_todo_reference(todo, docname)
+ content.append(todo_ref)
+
+ node.replace_self(content)
+
+ def create_todo_reference(self, todo: todo_node, docname: str) -> nodes.paragraph:
+ if self.config.todo_link_only:
+ description = _('<<original entry>>')
+ else:
+ description = (_('(The <<original entry>> is located in %s, line %d.)') %
+ (todo.source, todo.line))
+
+ prefix = description[:description.find('<<')]
+ suffix = description[description.find('>>') + 2:]
+
+ para = nodes.paragraph(classes=['todo-source'])
+ para += nodes.Text(prefix)
+
+ # Create a reference
+ linktext = nodes.emphasis(_('original entry'), _('original entry'))
+ reference = nodes.reference('', '', linktext, internal=True)
+ try:
+ reference['refuri'] = self.builder.get_relative_uri(docname, todo['docname'])
+ reference['refuri'] += '#' + todo['ids'][0]
+ except NoUri:
+ # ignore if no URI can be determined, e.g. for LaTeX output
+ pass
+
+ para += reference
+ para += nodes.Text(suffix)
+
+ return para
+
+ def resolve_reference(self, todo: todo_node, docname: str) -> None:
+ """Resolve references in the todo content."""
+ for node in todo.findall(addnodes.pending_xref):
+ if 'refdoc' in node:
+ node['refdoc'] = docname
+
+ # Note: To resolve references, it is needed to wrap it with document node
+ self.document += todo
+ self.env.resolve_references(self.document, docname, self.builder)
+ self.document.remove(todo)
+
+
+def visit_todo_node(self: HTML5Translator, node: todo_node) -> None:
+ if self.config.todo_include_todos:
+ self.visit_admonition(node)
+ else:
+ raise nodes.SkipNode
+
+
+def depart_todo_node(self: HTML5Translator, node: todo_node) -> None:
+ self.depart_admonition(node)
+
+
+def latex_visit_todo_node(self: LaTeXTranslator, node: todo_node) -> None:
+ if self.config.todo_include_todos:
+ self.body.append('\n\\begin{sphinxadmonition}{note}{')
+ self.body.append(self.hypertarget_to(node))
+
+ title_node = cast(nodes.title, node[0])
+ title = texescape.escape(title_node.astext(), self.config.latex_engine)
+ self.body.append('%s:}' % title)
+ node.pop(0)
+ else:
+ raise nodes.SkipNode
+
+
+def latex_depart_todo_node(self: LaTeXTranslator, node: todo_node) -> None:
+ self.body.append('\\end{sphinxadmonition}\n')
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_event('todo-defined')
+ app.add_config_value('todo_include_todos', False, 'html')
+ app.add_config_value('todo_link_only', False, 'html')
+ app.add_config_value('todo_emit_warnings', False, 'html')
+
+ app.add_node(todolist)
+ app.add_node(todo_node,
+ html=(visit_todo_node, depart_todo_node),
+ latex=(latex_visit_todo_node, latex_depart_todo_node),
+ text=(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)
+ app.add_domain(TodoDomain)
+ app.connect('doctree-resolved', TodoListProcessor)
+ return {
+ 'version': sphinx.__display_version__,
+ 'env_version': 2,
+ 'parallel_read_safe': True,
+ }
diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py
new file mode 100644
index 0000000..c5fcda5
--- /dev/null
+++ b/sphinx/ext/viewcode.py
@@ -0,0 +1,361 @@
+"""Add links to module code in Python object descriptions."""
+
+from __future__ import annotations
+
+import posixpath
+import traceback
+from importlib import import_module
+from os import path
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.nodes import Element, Node
+
+import sphinx
+from sphinx import addnodes
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.locale import _, __
+from sphinx.pycode import ModuleAnalyzer
+from sphinx.transforms.post_transforms import SphinxPostTransform
+from sphinx.util import logging
+from sphinx.util.display import status_iterator
+from sphinx.util.nodes import make_refnode
+
+if TYPE_CHECKING:
+ from collections.abc import Generator, Iterable
+
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+
+logger = logging.getLogger(__name__)
+
+
+OUTPUT_DIRNAME = '_modules'
+
+
+class viewcode_anchor(Element):
+ """Node for viewcode anchors.
+
+ This node will be processed in the resolving phase.
+ For viewcode supported builders, they will be all converted to the anchors.
+ For not supported builders, they will be removed.
+ """
+
+
+def _get_full_modname(modname: str, attribute: str) -> str | None:
+ try:
+ if modname is None:
+ # Prevents a TypeError: if the last getattr() call will return None
+ # then it's better to return it directly
+ return None
+ module = import_module(modname)
+
+ # Allow an attribute to have multiple parts and incidentally allow
+ # repeated .s in the attribute.
+ value = module
+ for attr in attribute.split('.'):
+ if attr:
+ value = getattr(value, attr)
+
+ return getattr(value, '__module__', None)
+ except AttributeError:
+ # sphinx.ext.viewcode can't follow class instance attribute
+ # then AttributeError logging output only verbose mode.
+ logger.verbose("Didn't find %s in %s", attribute, modname)
+ return None
+ except Exception as e:
+ # sphinx.ext.viewcode follow python domain directives.
+ # because of that, if there are no real modules exists that specified
+ # by py:function or other directives, viewcode emits a lot of warnings.
+ # It should be displayed only verbose mode.
+ logger.verbose(traceback.format_exc().rstrip())
+ logger.verbose('viewcode can\'t import %s, failed with error "%s"', modname, e)
+ return None
+
+
+def is_supported_builder(builder: Builder) -> bool:
+ if builder.format != 'html':
+ return False
+ if builder.name == 'singlehtml':
+ return False
+ if builder.name.startswith('epub') and not builder.config.viewcode_enable_epub:
+ return False
+ return True
+
+
+def doctree_read(app: Sphinx, doctree: Node) -> None:
+ env = app.builder.env
+ if not hasattr(env, '_viewcode_modules'):
+ env._viewcode_modules = {} # type: ignore[attr-defined]
+
+ def has_tag(modname: str, fullname: str, docname: str, refname: str) -> bool:
+ entry = env._viewcode_modules.get(modname, None) # type: ignore[attr-defined]
+ if entry is False:
+ return False
+
+ code_tags = app.emit_firstresult('viewcode-find-source', modname)
+ if code_tags is None:
+ try:
+ analyzer = ModuleAnalyzer.for_module(modname)
+ analyzer.find_tags()
+ except Exception:
+ env._viewcode_modules[modname] = False # type: ignore[attr-defined]
+ return False
+
+ code = analyzer.code
+ tags = analyzer.tags
+ else:
+ code, tags = code_tags
+
+ if entry is None or entry[0] != code:
+ entry = code, tags, {}, refname
+ env._viewcode_modules[modname] = entry # type: ignore[attr-defined]
+ _, tags, used, _ = entry
+ if fullname in tags:
+ used[fullname] = docname
+ return True
+
+ return False
+
+ for objnode in list(doctree.findall(addnodes.desc)):
+ if objnode.get('domain') != 'py':
+ continue
+ names: set[str] = set()
+ for signode in objnode:
+ if not isinstance(signode, addnodes.desc_signature):
+ continue
+ modname = signode.get('module')
+ fullname = signode.get('fullname')
+ refname = modname
+ if env.config.viewcode_follow_imported_members:
+ new_modname = app.emit_firstresult(
+ 'viewcode-follow-imported', modname, fullname,
+ )
+ if not new_modname:
+ new_modname = _get_full_modname(modname, fullname)
+ modname = new_modname
+ if not modname:
+ continue
+ fullname = signode.get('fullname')
+ if not has_tag(modname, fullname, env.docname, refname):
+ continue
+ if fullname in names:
+ # only one link per name, please
+ continue
+ names.add(fullname)
+ pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/'))
+ signode += viewcode_anchor(reftarget=pagename, refid=fullname, refdoc=env.docname)
+
+
+def env_merge_info(app: Sphinx, env: BuildEnvironment, docnames: Iterable[str],
+ other: BuildEnvironment) -> None:
+ if not hasattr(other, '_viewcode_modules'):
+ return
+ # create a _viewcode_modules dict on the main environment
+ if not hasattr(env, '_viewcode_modules'):
+ env._viewcode_modules = {} # type: ignore[attr-defined]
+ # now merge in the information from the subprocess
+ for modname, entry in other._viewcode_modules.items():
+ if modname not in env._viewcode_modules: # type: ignore[attr-defined]
+ env._viewcode_modules[modname] = entry # type: ignore[attr-defined]
+ else:
+ if env._viewcode_modules[modname]: # type: ignore[attr-defined]
+ used = env._viewcode_modules[modname][2] # type: ignore[attr-defined]
+ for fullname, docname in entry[2].items():
+ if fullname not in used:
+ used[fullname] = docname
+
+
+def env_purge_doc(app: Sphinx, env: BuildEnvironment, docname: str) -> None:
+ modules = getattr(env, '_viewcode_modules', {})
+
+ for modname, entry in list(modules.items()):
+ if entry is False:
+ continue
+
+ code, tags, used, refname = entry
+ for fullname in list(used):
+ if used[fullname] == docname:
+ used.pop(fullname)
+
+ if len(used) == 0:
+ modules.pop(modname)
+
+
+class ViewcodeAnchorTransform(SphinxPostTransform):
+ """Convert or remove viewcode_anchor nodes depends on builder."""
+ default_priority = 100
+
+ def run(self, **kwargs: Any) -> None:
+ if is_supported_builder(self.app.builder):
+ self.convert_viewcode_anchors()
+ else:
+ self.remove_viewcode_anchors()
+
+ def convert_viewcode_anchors(self) -> None:
+ for node in self.document.findall(viewcode_anchor):
+ anchor = nodes.inline('', _('[source]'), classes=['viewcode-link'])
+ refnode = make_refnode(self.app.builder, node['refdoc'], node['reftarget'],
+ node['refid'], anchor)
+ node.replace_self(refnode)
+
+ def remove_viewcode_anchors(self) -> None:
+ for node in list(self.document.findall(viewcode_anchor)):
+ node.parent.remove(node)
+
+
+def get_module_filename(app: Sphinx, modname: str) -> str | None:
+ """Get module filename for *modname*."""
+ source_info = app.emit_firstresult('viewcode-find-source', modname)
+ if source_info:
+ return None
+ else:
+ try:
+ filename, source = ModuleAnalyzer.get_module_source(modname)
+ return filename
+ except Exception:
+ return None
+
+
+def should_generate_module_page(app: Sphinx, modname: str) -> bool:
+ """Check generation of module page is needed."""
+ module_filename = get_module_filename(app, modname)
+ if module_filename is None:
+ # Always (re-)generate module page when module filename is not found.
+ return True
+
+ builder = cast(StandaloneHTMLBuilder, app.builder)
+ basename = modname.replace('.', '/') + builder.out_suffix
+ page_filename = path.join(app.outdir, '_modules/', basename)
+
+ try:
+ if path.getmtime(module_filename) <= path.getmtime(page_filename):
+ # generation is not needed if the HTML page is newer than module file.
+ return False
+ except OSError:
+ pass
+
+ return True
+
+
+def collect_pages(app: Sphinx) -> Generator[tuple[str, dict[str, Any], str], None, None]:
+ env = app.builder.env
+ if not hasattr(env, '_viewcode_modules'):
+ return
+ if not is_supported_builder(app.builder):
+ return
+ highlighter = app.builder.highlighter # type: ignore[attr-defined]
+ urito = app.builder.get_relative_uri
+
+ modnames = set(env._viewcode_modules)
+
+ for modname, entry in status_iterator(
+ sorted(env._viewcode_modules.items()),
+ __('highlighting module code... '), "blue",
+ len(env._viewcode_modules),
+ app.verbosity, lambda x: x[0]):
+ if not entry:
+ continue
+ if not should_generate_module_page(app, modname):
+ continue
+
+ code, tags, used, refname = entry
+ # construct a page name for the highlighted source
+ pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/'))
+ # highlight the source using the builder's highlighter
+ if env.config.highlight_language in {'default', 'none'}:
+ lexer = env.config.highlight_language
+ else:
+ lexer = 'python'
+ linenos = 'inline' * env.config.viewcode_line_numbers
+ highlighted = highlighter.highlight_block(code, lexer, linenos=linenos)
+ # split the code into lines
+ lines = highlighted.splitlines()
+ # split off wrap markup from the first line of the actual code
+ before, after = lines[0].split('<pre>')
+ lines[0:1] = [before + '<pre>', after]
+ # nothing to do for the last line; it always starts with </pre> anyway
+ # now that we have code lines (starting at index 1), insert anchors for
+ # the collected tags (HACK: this only works if the tag boundaries are
+ # properly nested!)
+ max_index = len(lines) - 1
+ link_text = _('[docs]')
+ for name, docname in used.items():
+ type, start, end = tags[name]
+ backlink = urito(pagename, docname) + '#' + refname + '.' + name
+ lines[start] = (f'<div class="viewcode-block" id="{name}">\n'
+ f'<a class="viewcode-back" href="{backlink}">{link_text}</a>\n'
+ + lines[start])
+ lines[min(end, max_index)] += '</div>\n'
+
+ # try to find parents (for submodules)
+ parents = []
+ parent = modname
+ while '.' in parent:
+ parent = parent.rsplit('.', 1)[0]
+ if parent in modnames:
+ parents.append({
+ 'link': urito(pagename,
+ posixpath.join(OUTPUT_DIRNAME, parent.replace('.', '/'))),
+ 'title': parent})
+ parents.append({'link': urito(pagename, posixpath.join(OUTPUT_DIRNAME, 'index')),
+ 'title': _('Module code')})
+ parents.reverse()
+ # putting it all together
+ context = {
+ 'parents': parents,
+ 'title': modname,
+ 'body': (_('<h1>Source code for %s</h1>') % modname +
+ '\n'.join(lines)),
+ }
+ yield (pagename, context, 'page.html')
+
+ if not modnames:
+ return
+
+ html = ['\n']
+ # the stack logic is needed for using nested lists for submodules
+ stack = ['']
+ for modname in sorted(modnames):
+ if modname.startswith(stack[-1]):
+ stack.append(modname + '.')
+ html.append('<ul>')
+ else:
+ stack.pop()
+ while not modname.startswith(stack[-1]):
+ stack.pop()
+ html.append('</ul>')
+ stack.append(modname + '.')
+ relative_uri = urito(posixpath.join(OUTPUT_DIRNAME, 'index'),
+ posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/')))
+ html.append(f'<li><a href="{relative_uri}">{modname}</a></li>\n')
+ html.append('</ul>' * (len(stack) - 1))
+ context = {
+ 'title': _('Overview: module code'),
+ 'body': (_('<h1>All modules for which code is available</h1>') +
+ ''.join(html)),
+ }
+
+ yield (posixpath.join(OUTPUT_DIRNAME, 'index'), context, 'page.html')
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_config_value('viewcode_import', None, False)
+ app.add_config_value('viewcode_enable_epub', False, False)
+ app.add_config_value('viewcode_follow_imported_members', True, False)
+ app.add_config_value('viewcode_line_numbers', False, 'env', (bool,))
+ app.connect('doctree-read', doctree_read)
+ app.connect('env-merge-info', env_merge_info)
+ app.connect('env-purge-doc', env_purge_doc)
+ app.connect('html-collect-pages', collect_pages)
+ # app.add_config_value('viewcode_include_modules', [], 'env')
+ # app.add_config_value('viewcode_exclude_modules', [], 'env')
+ app.add_event('viewcode-find-source')
+ app.add_event('viewcode-follow-imported')
+ app.add_post_transform(ViewcodeAnchorTransform)
+ return {
+ 'version': sphinx.__display_version__,
+ 'env_version': 1,
+ 'parallel_read_safe': True,
+ }
diff --git a/sphinx/extension.py b/sphinx/extension.py
new file mode 100644
index 0000000..78ef968
--- /dev/null
+++ b/sphinx/extension.py
@@ -0,0 +1,82 @@
+"""Utilities for Sphinx extensions."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from packaging.version import InvalidVersion, Version
+
+from sphinx.errors import VersionRequirementError
+from sphinx.locale import __
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+
+logger = logging.getLogger(__name__)
+
+
+class Extension:
+ def __init__(self, name: str, module: Any, **kwargs: Any) -> None:
+ self.name = name
+ self.module = module
+ self.metadata = kwargs
+ self.version = kwargs.pop('version', 'unknown version')
+
+ # The extension supports parallel read or not. The default value
+ # is ``None``. It means the extension does not tell the status.
+ # It will be warned on parallel reading.
+ self.parallel_read_safe = kwargs.pop('parallel_read_safe', None)
+
+ # The extension supports parallel write or not. The default value
+ # is ``True``. Sphinx writes parallelly documents even if
+ # the extension does not tell its status.
+ self.parallel_write_safe = kwargs.pop('parallel_write_safe', True)
+
+
+def verify_needs_extensions(app: Sphinx, config: Config) -> None:
+ """Check that extensions mentioned in :confval:`needs_extensions` satisfy the version
+ requirement, and warn if an extension is not loaded.
+
+ Warns if an extension in :confval:`needs_extension` is not loaded.
+
+ :raises VersionRequirementError: if the version of an extension in
+ :confval:`needs_extension` is unknown or older than the required version.
+ """
+ if config.needs_extensions is None:
+ return
+
+ for extname, reqversion in config.needs_extensions.items():
+ extension = app.extensions.get(extname)
+ if extension is None:
+ logger.warning(__('The %s extension is required by needs_extensions settings, '
+ 'but it is not loaded.'), extname)
+ continue
+
+ fulfilled = True
+ if extension.version == 'unknown version':
+ fulfilled = False
+ else:
+ try:
+ if Version(reqversion) > Version(extension.version):
+ fulfilled = False
+ except InvalidVersion:
+ if reqversion > extension.version:
+ fulfilled = False
+
+ if not fulfilled:
+ raise VersionRequirementError(__('This project needs the extension %s at least in '
+ 'version %s and therefore cannot be built with '
+ 'the loaded version (%s).') %
+ (extname, reqversion, extension.version))
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.connect('config-inited', verify_needs_extensions, priority=800)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/highlighting.py b/sphinx/highlighting.py
new file mode 100644
index 0000000..7e0d94a
--- /dev/null
+++ b/sphinx/highlighting.py
@@ -0,0 +1,199 @@
+"""Highlight code blocks using Pygments."""
+
+from __future__ import annotations
+
+from functools import partial
+from importlib import import_module
+from typing import TYPE_CHECKING, Any
+
+from pygments import highlight
+from pygments.filters import ErrorToken
+from pygments.formatters import HtmlFormatter, LatexFormatter
+from pygments.lexers import (
+ CLexer,
+ PythonConsoleLexer,
+ PythonLexer,
+ RstLexer,
+ TextLexer,
+ get_lexer_by_name,
+ guess_lexer,
+)
+from pygments.styles import get_style_by_name
+from pygments.util import ClassNotFound
+
+from sphinx.locale import __
+from sphinx.pygments_styles import NoneStyle, SphinxStyle
+from sphinx.util import logging, texescape
+
+if TYPE_CHECKING:
+ from pygments.formatter import Formatter
+ from pygments.lexer import Lexer
+ from pygments.style import Style
+
+logger = logging.getLogger(__name__)
+
+lexers: dict[str, Lexer] = {}
+lexer_classes: dict[str, type[Lexer] | partial[Lexer]] = {
+ 'none': partial(TextLexer, stripnl=False),
+ 'python': partial(PythonLexer, stripnl=False),
+ 'pycon': partial(PythonConsoleLexer, stripnl=False),
+ 'rest': partial(RstLexer, stripnl=False),
+ 'c': partial(CLexer, stripnl=False),
+}
+
+
+escape_hl_chars = {ord('\\'): '\\PYGZbs{}',
+ ord('{'): '\\PYGZob{}',
+ ord('}'): '\\PYGZcb{}'}
+
+# used if Pygments is available
+# MEMO: no use of \protected here to avoid having to do hyperref extras,
+# (if in future code highlighting in sectioning titles is activated):
+# the definitions here use only robust, protected or chardef tokens,
+# which are all known to the hyperref re-encoding for bookmarks.
+# The " is troublesome because we would like to use \text\textquotedbl
+# but \textquotedbl is *defined to raise an error* (!) if the font
+# encoding is OT1. This however could happen from 'fontenc' key.
+# MEMO: the Pygments escapes with \char`\<char> syntax, if the document
+# uses old OT1 font encoding, work correctly only in monospace font.
+# MEMO: the Pygmentize output mark-up is always with a {} after.
+_LATEX_ADD_STYLES = r'''
+% Sphinx redefinitions
+% Originally to obtain a straight single quote via package textcomp, then
+% to fix problems for the 5.0.0 inline code highlighting (captions!).
+% The \text is from amstext, a dependency of sphinx.sty. It is here only
+% to avoid build errors if for some reason expansion is in math mode.
+\def\PYGZbs{\text\textbackslash}
+\def\PYGZus{\_}
+\def\PYGZob{\{}
+\def\PYGZcb{\}}
+\def\PYGZca{\text\textasciicircum}
+\def\PYGZam{\&}
+\def\PYGZlt{\text\textless}
+\def\PYGZgt{\text\textgreater}
+\def\PYGZsh{\#}
+\def\PYGZpc{\%}
+\def\PYGZdl{\$}
+\def\PYGZhy{\sphinxhyphen}% defined in sphinxlatexstyletext.sty
+\def\PYGZsq{\text\textquotesingle}
+\def\PYGZdq{"}
+\def\PYGZti{\text\textasciitilde}
+\makeatletter
+% use \protected to allow syntax highlighting in captions
+\protected\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+{\PYG@do{#2}}}
+\makeatother
+'''
+
+
+class PygmentsBridge:
+ # Set these attributes if you want to have different Pygments formatters
+ # than the default ones.
+ html_formatter = HtmlFormatter
+ latex_formatter = LatexFormatter
+
+ def __init__(self, dest: str = 'html', stylename: str = 'sphinx',
+ latex_engine: str | None = None) -> None:
+ self.dest = dest
+ self.latex_engine = latex_engine
+
+ style = self.get_style(stylename)
+ self.formatter_args: dict[str, Any] = {'style': style}
+ if dest == 'html':
+ self.formatter = self.html_formatter
+ else:
+ self.formatter = self.latex_formatter
+ self.formatter_args['commandprefix'] = 'PYG'
+
+ def get_style(self, stylename: str) -> Style:
+ if stylename is None or stylename == 'sphinx':
+ return SphinxStyle
+ elif stylename == 'none':
+ return NoneStyle
+ elif '.' in stylename:
+ module, stylename = stylename.rsplit('.', 1)
+ return getattr(import_module(module), stylename)
+ else:
+ return get_style_by_name(stylename)
+
+ def get_formatter(self, **kwargs: Any) -> Formatter:
+ kwargs.update(self.formatter_args)
+ return self.formatter(**kwargs)
+
+ def get_lexer(self, source: str, lang: str, opts: dict | None = None,
+ force: bool = False, location: Any = None) -> Lexer:
+ if not opts:
+ opts = {}
+
+ # find out which lexer to use
+ if lang in {'py', 'python', 'py3', 'python3', 'default'}:
+ if source.startswith('>>>'):
+ # interactive session
+ lang = 'pycon'
+ else:
+ lang = 'python'
+ if lang == 'pycon3':
+ lang = 'pycon'
+
+ if lang in lexers:
+ # just return custom lexers here (without installing raiseonerror filter)
+ return lexers[lang]
+ elif lang in lexer_classes:
+ lexer = lexer_classes[lang](**opts)
+ else:
+ try:
+ if lang == 'guess':
+ lexer = guess_lexer(source, **opts)
+ else:
+ lexer = get_lexer_by_name(lang, **opts)
+ except ClassNotFound:
+ logger.warning(__('Pygments lexer name %r is not known'), lang,
+ location=location)
+ lexer = lexer_classes['none'](**opts)
+
+ if not force:
+ lexer.add_filter('raiseonerror')
+
+ return lexer
+
+ def highlight_block(self, source: str, lang: str, opts: dict | None = None,
+ force: bool = False, location: Any = None, **kwargs: Any) -> str:
+ if not isinstance(source, str):
+ source = source.decode()
+
+ lexer = self.get_lexer(source, lang, opts, force, location)
+
+ # highlight via Pygments
+ formatter = self.get_formatter(**kwargs)
+ try:
+ hlsource = highlight(source, lexer, formatter)
+ except ErrorToken as err:
+ # this is most probably not the selected language,
+ # so let it pass un highlighted
+ if lang == 'default':
+ lang = 'none' # automatic highlighting failed.
+ else:
+ logger.warning(
+ __('Lexing literal_block %r as "%s" resulted in an error at token: %r. '
+ 'Retrying in relaxed mode.'),
+ source, lang, str(err),
+ type='misc', subtype='highlighting_failure',
+ location=location)
+ if force:
+ lang = 'none'
+ else:
+ force = True
+ lexer = self.get_lexer(source, lang, opts, force, location)
+ hlsource = highlight(source, lexer, formatter)
+
+ if self.dest == 'html':
+ return hlsource
+ else:
+ # MEMO: this is done to escape Unicode chars with non-Unicode engines
+ return texescape.hlescape(hlsource, self.latex_engine)
+
+ def get_stylesheet(self) -> str:
+ formatter = self.get_formatter()
+ if self.dest == 'html':
+ return formatter.get_style_defs('.highlight')
+ else:
+ return formatter.get_style_defs() + _LATEX_ADD_STYLES
diff --git a/sphinx/io.py b/sphinx/io.py
new file mode 100644
index 0000000..4874fdf
--- /dev/null
+++ b/sphinx/io.py
@@ -0,0 +1,189 @@
+"""Input/Output files"""
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+import docutils
+from docutils import nodes
+from docutils.core import Publisher
+from docutils.io import FileInput, Input, NullOutput
+from docutils.readers import standalone
+from docutils.transforms.references import DanglingReferences
+from docutils.writers import UnfilteredWriter
+
+from sphinx import addnodes
+from sphinx.transforms import AutoIndexUpgrader, DoctreeReadEvent, SphinxTransformer
+from sphinx.transforms.i18n import (
+ Locale,
+ PreserveTranslatableMessages,
+ RemoveTranslatableInline,
+)
+from sphinx.transforms.references import SphinxDomains
+from sphinx.util import logging
+from sphinx.util.docutils import LoggingReporter
+from sphinx.versioning import UIDTransform
+
+if TYPE_CHECKING:
+ from docutils.frontend import Values
+ from docutils.parsers import Parser
+ from docutils.transforms import Transform
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+
+
+logger = logging.getLogger(__name__)
+
+
+class SphinxBaseReader(standalone.Reader):
+ """
+ A base class of readers for Sphinx.
+
+ This replaces reporter by Sphinx's on generating document.
+ """
+
+ transforms: list[type[Transform]] = []
+
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ from sphinx.application import Sphinx
+ if len(args) > 0 and isinstance(args[0], Sphinx):
+ self._app = args[0]
+ self._env = self._app.env
+ args = args[1:]
+
+ super().__init__(*args, **kwargs)
+
+ def setup(self, app: Sphinx) -> None:
+ self._app = app # hold application object only for compatibility
+ self._env = app.env
+
+ def get_transforms(self) -> list[type[Transform]]:
+ transforms = super().get_transforms() + self.transforms
+
+ # remove transforms which is not needed for Sphinx
+ unused = [DanglingReferences]
+ for transform in unused:
+ if transform in transforms:
+ transforms.remove(transform)
+
+ return transforms
+
+ def new_document(self) -> nodes.document:
+ """
+ Creates a new document object which has a special reporter object good
+ for logging.
+ """
+ document = super().new_document()
+ document.__class__ = addnodes.document # replace the class with patched version
+
+ # substitute transformer
+ document.transformer = SphinxTransformer(document)
+ document.transformer.set_environment(self.settings.env)
+
+ # substitute reporter
+ reporter = document.reporter
+ document.reporter = LoggingReporter.from_reporter(reporter)
+
+ return document
+
+
+class SphinxStandaloneReader(SphinxBaseReader):
+ """
+ A basic document reader for Sphinx.
+ """
+
+ def setup(self, app: Sphinx) -> None:
+ self.transforms = self.transforms + app.registry.get_transforms()
+ super().setup(app)
+
+ def read(self, source: Input, parser: Parser, settings: Values) -> nodes.document:
+ self.source = source
+ if not self.parser:
+ self.parser = parser
+ self.settings = settings
+ self.input = self.read_source(settings.env)
+ self.parse()
+ return self.document
+
+ def read_source(self, env: BuildEnvironment) -> str:
+ """Read content from source and do post-process."""
+ content = self.source.read()
+
+ # emit "source-read" event
+ arg = [content]
+ env.events.emit('source-read', env.docname, arg)
+ return arg[0]
+
+
+class SphinxI18nReader(SphinxBaseReader):
+ """
+ A document reader for i18n.
+
+ This returns the source line number of original text as current source line number
+ to let users know where the error happened.
+ Because the translated texts are partial and they don't have correct line numbers.
+ """
+
+ def setup(self, app: Sphinx) -> None:
+ super().setup(app)
+
+ self.transforms = self.transforms + app.registry.get_transforms()
+ unused = [PreserveTranslatableMessages, Locale, RemoveTranslatableInline,
+ AutoIndexUpgrader, SphinxDomains, DoctreeReadEvent,
+ UIDTransform]
+ for transform in unused:
+ if transform in self.transforms:
+ self.transforms.remove(transform)
+
+
+class SphinxDummyWriter(UnfilteredWriter):
+ """Dummy writer module used for generating doctree."""
+
+ supported = ('html',) # needed to keep "meta" nodes
+
+ def translate(self) -> None:
+ pass
+
+
+def SphinxDummySourceClass(source: Any, *args: Any, **kwargs: Any) -> Any:
+ """Bypass source object as is to cheat Publisher."""
+ return source
+
+
+class SphinxFileInput(FileInput):
+ """A basic FileInput for Sphinx."""
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ kwargs['error_handler'] = 'sphinx'
+ super().__init__(*args, **kwargs)
+
+
+def create_publisher(app: Sphinx, filetype: str) -> Publisher:
+ reader = SphinxStandaloneReader()
+ reader.setup(app)
+
+ parser = app.registry.create_source_parser(app, filetype)
+ if parser.__class__.__name__ == 'CommonMarkParser' and parser.settings_spec == ():
+ # a workaround for recommonmark
+ # If recommonmark.AutoStrictify is enabled, the parser invokes reST parser
+ # internally. But recommonmark-0.4.0 does not provide settings_spec for reST
+ # parser. As a workaround, this copies settings_spec for RSTParser to the
+ # CommonMarkParser.
+ from docutils.parsers.rst import Parser as RSTParser
+
+ parser.settings_spec = RSTParser.settings_spec
+
+ pub = Publisher(
+ reader=reader,
+ parser=parser,
+ writer=SphinxDummyWriter(),
+ source_class=SphinxFileInput,
+ destination=NullOutput(),
+ )
+ # Propagate exceptions by default when used programmatically:
+ defaults = {"traceback": True, **app.env.settings}
+ # Set default settings
+ if docutils.__version_info__[:2] >= (0, 19):
+ pub.get_settings(**defaults)
+ else:
+ pub.settings = pub.setup_option_parser(**defaults).get_default_values()
+ return pub
diff --git a/sphinx/jinja2glue.py b/sphinx/jinja2glue.py
new file mode 100644
index 0000000..cfe92b0
--- /dev/null
+++ b/sphinx/jinja2glue.py
@@ -0,0 +1,221 @@
+"""Glue code for the jinja2 templating engine."""
+
+from __future__ import annotations
+
+from os import path
+from pprint import pformat
+from typing import TYPE_CHECKING, Any, Callable
+
+from jinja2 import BaseLoader, FileSystemLoader, TemplateNotFound
+from jinja2.sandbox import SandboxedEnvironment
+from jinja2.utils import open_if_exists
+
+from sphinx.application import TemplateBridge
+from sphinx.util import logging
+from sphinx.util.osutil import mtimes_of_files
+
+try:
+ from jinja2.utils import pass_context
+except ImportError:
+ from jinja2 import contextfunction as pass_context
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from jinja2.environment import Environment
+
+ from sphinx.builders import Builder
+ from sphinx.theming import Theme
+
+
+def _tobool(val: str) -> bool:
+ if isinstance(val, str):
+ return val.lower() in ('true', '1', 'yes', 'on')
+ return bool(val)
+
+
+def _toint(val: str) -> int:
+ try:
+ return int(val)
+ except ValueError:
+ return 0
+
+
+def _todim(val: int | str) -> str:
+ """
+ Make val a css dimension. In particular the following transformations
+ are performed:
+
+ - None -> 'initial' (default CSS value)
+ - 0 -> '0'
+ - ints and string representations of ints are interpreted as pixels.
+
+ Everything else is returned unchanged.
+ """
+ if val is None:
+ return 'initial'
+ elif str(val).isdigit():
+ return '0' if int(val) == 0 else '%spx' % val
+ return val # type: ignore[return-value]
+
+
+def _slice_index(values: list, slices: int) -> Iterator[list]:
+ seq = list(values)
+ length = 0
+ for value in values:
+ length += 1 + len(value[1][1]) # count includes subitems
+ items_per_slice = length // slices
+ offset = 0
+ for slice_number in range(slices):
+ count = 0
+ start = offset
+ if slices == slice_number + 1: # last column
+ offset = len(seq) # noqa: SIM113
+ else:
+ for value in values[offset:]:
+ count += 1 + len(value[1][1])
+ offset += 1
+ if count >= items_per_slice:
+ break
+ yield seq[start:offset]
+
+
+def accesskey(context: Any, key: str) -> str:
+ """Helper to output each access key only once."""
+ if '_accesskeys' not in context:
+ context.vars['_accesskeys'] = {}
+ if key and key not in context.vars['_accesskeys']:
+ context.vars['_accesskeys'][key] = 1
+ return 'accesskey="%s"' % key
+ return ''
+
+
+class idgen:
+ def __init__(self) -> None:
+ self.id = 0
+
+ def current(self) -> int:
+ return self.id
+
+ def __next__(self) -> int:
+ self.id += 1
+ return self.id
+ next = __next__ # Python 2/Jinja compatibility
+
+
+@pass_context
+def warning(context: dict, message: str, *args: Any, **kwargs: Any) -> str:
+ if 'pagename' in context:
+ filename = context.get('pagename') + context.get('file_suffix', '')
+ message = f'in rendering {filename}: {message}'
+ logger = logging.getLogger('sphinx.themes')
+ logger.warning(message, *args, **kwargs)
+ return '' # return empty string not to output any values
+
+
+class SphinxFileSystemLoader(FileSystemLoader):
+ """
+ FileSystemLoader subclass that is not so strict about '..' entries in
+ template names.
+ """
+
+ def get_source(self, environment: Environment, template: str) -> tuple[str, str, Callable]:
+ for searchpath in self.searchpath:
+ filename = path.join(searchpath, template)
+ f = open_if_exists(filename)
+ if f is not None:
+ break
+ else:
+ raise TemplateNotFound(template)
+
+ with f:
+ contents = f.read().decode(self.encoding)
+
+ mtime = path.getmtime(filename)
+
+ def uptodate() -> bool:
+ try:
+ return path.getmtime(filename) == mtime
+ except OSError:
+ return False
+ return contents, filename, uptodate
+
+
+class BuiltinTemplateLoader(TemplateBridge, BaseLoader):
+ """
+ Interfaces the rendering environment of jinja2 for use in Sphinx.
+ """
+
+ # TemplateBridge interface
+
+ def init(
+ self,
+ builder: Builder,
+ theme: Theme | None = None,
+ dirs: list[str] | None = None,
+ ) -> None:
+ # create a chain of paths to search
+ if theme:
+ # the theme's own dir and its bases' dirs
+ pathchain = theme.get_theme_dirs()
+ # the loader dirs: pathchain + the parent directories for all themes
+ loaderchain = pathchain + [path.join(p, '..') for p in pathchain]
+ elif dirs:
+ pathchain = list(dirs)
+ loaderchain = list(dirs)
+ else:
+ pathchain = []
+ loaderchain = []
+
+ # prepend explicit template paths
+ self.templatepathlen = len(builder.config.templates_path)
+ if builder.config.templates_path:
+ cfg_templates_path = [path.join(builder.confdir, tp)
+ for tp in builder.config.templates_path]
+ pathchain[0:0] = cfg_templates_path
+ loaderchain[0:0] = cfg_templates_path
+
+ # store it for use in newest_template_mtime
+ self.pathchain = pathchain
+
+ # make the paths into loaders
+ self.loaders = [SphinxFileSystemLoader(x) for x in loaderchain]
+
+ use_i18n = builder.app.translator is not None
+ extensions = ['jinja2.ext.i18n'] if use_i18n else []
+ self.environment = SandboxedEnvironment(loader=self,
+ extensions=extensions)
+ self.environment.filters['tobool'] = _tobool
+ self.environment.filters['toint'] = _toint
+ self.environment.filters['todim'] = _todim
+ self.environment.filters['slice_index'] = _slice_index
+ self.environment.globals['debug'] = pass_context(pformat)
+ self.environment.globals['warning'] = warning
+ self.environment.globals['accesskey'] = pass_context(accesskey)
+ self.environment.globals['idgen'] = idgen
+ if use_i18n:
+ self.environment.install_gettext_translations(builder.app.translator)
+
+ def render(self, template: str, context: dict) -> str: # type: ignore[override]
+ return self.environment.get_template(template).render(context)
+
+ def render_string(self, source: str, context: dict) -> str:
+ return self.environment.from_string(source).render(context)
+
+ def newest_template_mtime(self) -> float:
+ return max(mtimes_of_files(self.pathchain, '.html'))
+
+ # Loader interface
+
+ def get_source(self, environment: Environment, template: str) -> tuple[str, str, Callable]:
+ loaders = self.loaders
+ # exclamation mark starts search from theme
+ if template.startswith('!'):
+ loaders = loaders[self.templatepathlen:]
+ template = template[1:]
+ for loader in loaders:
+ try:
+ return loader.get_source(environment, template)
+ except TemplateNotFound:
+ pass
+ raise TemplateNotFound(template)
diff --git a/sphinx/locale/.tx/config b/sphinx/locale/.tx/config
new file mode 100644
index 0000000..11f13fb
--- /dev/null
+++ b/sphinx/locale/.tx/config
@@ -0,0 +1,7 @@
+[main]
+host = https://www.transifex.com
+
+[o:sphinx-doc:p:sphinx-1:r:sphinx-pot]
+file_filter = <lang>/LC_MESSAGES/sphinx.po
+source_file = sphinx.pot
+source_lang = en
diff --git a/sphinx/locale/__init__.py b/sphinx/locale/__init__.py
new file mode 100644
index 0000000..05e63b0
--- /dev/null
+++ b/sphinx/locale/__init__.py
@@ -0,0 +1,231 @@
+"""Locale utilities."""
+
+from __future__ import annotations
+
+import locale
+from gettext import NullTranslations, translation
+from os import path
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+ from typing import Any, Callable
+
+
+class _TranslationProxy:
+ """
+ The proxy implementation attempts to be as complete as possible, so that
+ the lazy objects should mostly work as expected, for example for sorting.
+ """
+ __slots__ = '_catalogue', '_namespace', '_message'
+
+ def __init__(self, catalogue: str, namespace: str, message: str) -> None:
+ self._catalogue = catalogue
+ self._namespace = namespace
+ self._message = message
+
+ def __str__(self) -> str:
+ try:
+ return translators[self._namespace, self._catalogue].gettext(self._message)
+ except KeyError:
+ # NullTranslations().gettext(self._message) == self._message
+ return self._message
+
+ def __dir__(self) -> list[str]:
+ return dir(str)
+
+ def __getattr__(self, name: str) -> Any:
+ return getattr(self.__str__(), name)
+
+ def __getstate__(self) -> tuple[str, str, str]:
+ return self._catalogue, self._namespace, self._message
+
+ def __setstate__(self, tup: tuple[str, str, str]) -> None:
+ self._catalogue, self._namespace, self._message = tup
+
+ def __copy__(self) -> _TranslationProxy:
+ return _TranslationProxy(self._catalogue, self._namespace, self._message)
+
+ def __repr__(self) -> str:
+ try:
+ return f'i{self.__str__()!r}'
+ except Exception:
+ return (self.__class__.__name__
+ + f'({self._catalogue}, {self._namespace}, {self._message})')
+
+ def __add__(self, other: str) -> str:
+ return self.__str__() + other
+
+ def __radd__(self, other: str) -> str:
+ return other + self.__str__()
+
+ def __mod__(self, other: str) -> str:
+ return self.__str__() % other
+
+ def __rmod__(self, other: str) -> str:
+ return other % self.__str__()
+
+ def __mul__(self, other: Any) -> str:
+ return self.__str__() * other
+
+ def __rmul__(self, other: Any) -> str:
+ return other * self.__str__()
+
+ def __hash__(self):
+ return hash(self.__str__())
+
+ def __eq__(self, other):
+ return self.__str__() == other
+
+ def __lt__(self, string):
+ return self.__str__() < string
+
+ def __contains__(self, char):
+ return char in self.__str__()
+
+ def __len__(self):
+ return len(self.__str__())
+
+ def __getitem__(self, index):
+ return self.__str__()[index]
+
+
+translators: dict[tuple[str, str], NullTranslations] = {}
+
+
+def init(
+ locale_dirs: Iterable[str | None],
+ language: str | None,
+ catalog: str = 'sphinx',
+ namespace: str = 'general',
+) -> tuple[NullTranslations, bool]:
+ """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`` reentrant).
+ """
+ translator = translators.get((namespace, catalog))
+ # ignore previously failed attempts to find message catalogs
+ if translator.__class__ is NullTranslations:
+ translator = None
+
+ if language:
+ if '_' in language:
+ # for language having country code (like "de_AT")
+ languages: list[str] | None = [language, language.split('_')[0]]
+ else:
+ languages = [language]
+ else:
+ languages = None
+
+ # loading
+ # the None entry is the system's default locale path
+ for dir_ in locale_dirs:
+ try:
+ trans = translation(catalog, localedir=dir_, languages=languages)
+ if translator is None:
+ translator = trans
+ else:
+ translator.add_fallback(trans)
+ except Exception:
+ # Language couldn't be found in the specified path
+ pass
+ if translator is not None:
+ has_translation = True
+ else:
+ translator = NullTranslations()
+ has_translation = False
+ # guarantee translators[(namespace, catalog)] exists
+ translators[namespace, catalog] = translator
+ return translator, has_translation
+
+
+_LOCALE_DIR = path.abspath(path.dirname(__file__))
+
+
+def init_console(
+ locale_dir: str | None = None,
+ catalog: str = 'sphinx',
+) -> tuple[NullTranslations, bool]:
+ """Initialize locale for console.
+
+ .. versionadded:: 1.8
+ """
+ if locale_dir is None:
+ locale_dir = _LOCALE_DIR
+ try:
+ # encoding is ignored
+ language, _ = locale.getlocale(locale.LC_MESSAGES)
+ except AttributeError:
+ # LC_MESSAGES is not always defined. Fallback to the default language
+ # in case it is not.
+ language = None
+ return init([locale_dir], language, catalog, 'console')
+
+
+def get_translator(catalog: str = 'sphinx', namespace: str = 'general') -> NullTranslations:
+ return translators.get((namespace, catalog), NullTranslations())
+
+
+def is_translator_registered(catalog: str = 'sphinx', namespace: str = 'general') -> bool:
+ return (namespace, catalog) in translators
+
+
+def get_translation(catalog: str, namespace: str = 'general') -> Callable[[str], str]:
+ """Get a translation function based on the *catalog* and *namespace*.
+
+ The extension can use this API to translate the messages on the
+ extension::
+
+ import os
+ from sphinx.locale import get_translation
+
+ MESSAGE_CATALOG_NAME = 'myextension' # name of *.pot, *.po and *.mo files
+ _ = get_translation(MESSAGE_CATALOG_NAME)
+ text = _('Hello Sphinx!')
+
+
+ def setup(app):
+ package_dir = os.path.abspath(os.path.dirname(__file__))
+ locale_dir = os.path.join(package_dir, 'locales')
+ app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)
+
+ With this code, sphinx searches a message catalog from
+ ``${package_dir}/locales/${language}/LC_MESSAGES/myextension.mo``.
+ The :confval:`language` is used for the searching.
+
+ .. versionadded:: 1.8
+ """
+ def gettext(message: str) -> str:
+ if not is_translator_registered(catalog, namespace):
+ # not initialized yet
+ return _TranslationProxy(catalog, namespace, message) # type: ignore[return-value] # noqa: E501
+ else:
+ translator = get_translator(catalog, namespace)
+ return translator.gettext(message)
+
+ return gettext
+
+
+# A shortcut for sphinx-core
+#: Translation function for messages on documentation (menu, labels, themes and so on).
+#: This function follows :confval:`language` setting.
+_ = get_translation('sphinx')
+#: Translation function for console messages
+#: This function follows locale setting (`LC_ALL`, `LC_MESSAGES` and so on).
+__ = get_translation('sphinx', 'console')
+
+
+# labels
+admonitionlabels = {
+ 'attention': _('Attention'),
+ 'caution': _('Caution'),
+ 'danger': _('Danger'),
+ 'error': _('Error'),
+ 'hint': _('Hint'),
+ 'important': _('Important'),
+ 'note': _('Note'),
+ 'seealso': _('See also'),
+ 'tip': _('Tip'),
+ 'warning': _('Warning'),
+}
diff --git a/sphinx/locale/ar/LC_MESSAGES/sphinx.js b/sphinx/locale/ar/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..072ade6
--- /dev/null
+++ b/sphinx/locale/ar/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ar",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "\u0627\u0644\u0645\u062d\u062a\u0648\u0649",
+ "Copyright": "\u0627\u0644\u062d\u0642\u0648\u0642",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "\u0627\u0644\u0641\u0647\u0631\u0633 \u0627\u0644\u0639\u0627\u0645",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "\u062a\u062c\u0647\u064a\u0632 \u0627\u0644\u0628\u062d\u062b",
+ "Navigation": "",
+ "Next topic": "\u0627\u0644\u0645\u0648\u0636\u0648\u0639 \u0627\u0644\u062a\u0627\u0644\u064a",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "\u0627\u0644\u0645\u0648\u0636\u0648\u0639 \u0627\u0644\u0633\u0627\u0628\u0642",
+ "Quick search": "\u0627\u0644\u0628\u062d\u062b \u0627\u0644\u0633\u0631\u064a\u0639",
+ "Search": "\u0628\u062d\u062b",
+ "Search Page": "\u0635\u0641\u062d\u0629 \u0627\u0644\u0628\u062d\u062b",
+ "Search Results": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0628\u062d\u062b",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "\u0627\u0644\u0628\u062d\u062b \u0636\u0645\u0646 %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0645\u0635\u062f\u0631",
+ "Table of Contents": "\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u062d\u062a\u0648\u064a\u0627\u062a",
+ "This Page": "\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629",
+ "Welcome! This is": "\u0623\u0647\u0644\u0627 \u0648\u0633\u0647\u0644\u0627 \u0647\u0630\u0627",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "\u0627\u0644\u0641\u0635\u0644 \u0627\u0644\u062a\u0627\u0644\u064a",
+ "previous chapter": "\u0627\u0644\u0642\u0633\u0645 \u0627\u0644\u0633\u0627\u0628\u0642",
+ "quick access to all modules": "",
+ "search": "\u0628\u062d\u062b",
+ "search this documentation": "",
+ "the documentation for": "\u0627\u0644\u062a\u0648\u062b\u064a\u0642 \u0644"
+ },
+ "plural_expr": "n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ar/LC_MESSAGES/sphinx.mo b/sphinx/locale/ar/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..8e4caa2
--- /dev/null
+++ b/sphinx/locale/ar/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ar/LC_MESSAGES/sphinx.po b/sphinx/locale/ar/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..51c7203
--- /dev/null
+++ b/sphinx/locale/ar/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Abdullah ahmed <Alhadab@hotmail.co.uk>, 2020
+# Mohammed Shannaq <sam@ms.per.jo>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Abdullah ahmed <Alhadab@hotmail.co.uk>, 2020\n"
+"Language-Team: Arabic (http://app.transifex.com/sphinx-doc/sphinx-1/language/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "لا يمكن العثور على المجلد المصدر (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "لا يمكن ان يكون المجلد المصدر والمجلد الهد٠متطابقين"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "تشغيل Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "يحتاج هذا المشروع على الاقل الى الاصدار %s من Sphinx وبالتالي لا يمكن بناءه باستخدام الاصدار الحالي"
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "تحميل الترجمات [ %s ]"
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "تم"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "غير متوÙرة للرسائل الاÙتراضية المدمجة"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "Ùشل: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "لم يتم اختيار نوع البناء، تم استخدام نوع البناء الاÙتراضي: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "نجح"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "انتهى مع وجود مشاكل"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "بناء %s، %sتحذير."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "بناء %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "مجلد الاعدادات لا يحتوي على مل٠conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "قسم %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "جدول %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r لتم يتم العثور عليه، لهذا تم تجاهلة"
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "حدث غير معروÙ: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "التصميم %r "
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "بناء [mo]:"
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "جميع ملÙات المصدر"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "بناء [%s]"
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "التحقق من التواÙÙ‚"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "تحديث البيئة:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "تجهيز المستندات"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "نسخ الصور..."
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "قراءة القوالب"
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "صÙحة الHTML موجودة ÙÙŠ %(outdir)s"
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "كتابة ملÙات إضاÙية"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "معالجة %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "ملÙات الXML موجودة ÙÙŠ %(outdir)s"
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "صÙحة الHTML موجودة ÙÙŠ %(outdir)s"
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "الÙهرس العام"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "الÙهرس"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "التالي"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "السابق"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "إنشاء الÙهرس"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "كتابة صÙحات إضاÙية "
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "نسخ الملÙات القابلة للتحميل للنسخ..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "غير قادر على نسخ الملÙات القابلة للتحميل %r : %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "غير قادر على نسخ المل٠الثابت %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "نسخ ملÙات إضاÙية"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "غير قادر على نسخ الم٠الإضاÙÙŠ %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "مل٠الشعار %r غير موجود"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "مل٠الايقونة %r غير موجود"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "الرجاء ادخال بعض النصوص"
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "أدخل إما 'نعم' أو'لا'"
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "أدخل امتداد الملÙ, مثلا '.rst' أو '.txt'"
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "اسم المشروع"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "اسم المؤلÙ(ون)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "نسخة المشروع"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "إصدار المشروع"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "لغة المشروع"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "امتداد مل٠المصدر"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "إنشاء Makefile ؟ (نعم / لا)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "إنشاء مل٠أوامر للويندوز؟ (نعم/لا)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "اسم المشروع"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "أسماء المؤلÙين"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "إنشاء Makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "إنشاء Batchfile ؟"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "عر٠متغير للقالب"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "مؤل٠القسم:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "كاتب الكود:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "المؤلÙ"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "متغير"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "نوع"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "كائن"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "متغيرات"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "متغير بيئة العمل"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "صÙحة البحث"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s ليس مجلد."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[المصدر]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[المستندات]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "مثال"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "أمثلة"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "ملاحظات"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "مراجع"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "تنبيه"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "احتياط"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "خطر"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "خطأ"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "تلميح"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "مهم"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "ملاحظة"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "شاهد أيضا"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "نصيحة"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "تحذير"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "استمرار ÙÙŠ الصÙحة التالية"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "أرقام"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "صÙحة"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "قائمة المحتويات"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "بحث"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "إظهار المصدر"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "أهلا وسهلا هذا"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "التوثيق ل"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "البحث ضمن %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "الحقوق"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "البحث %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "الموضوع السابق"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "القسم السابق"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "الموضوع التالي"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "الÙصل التالي"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "بحث"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "نتائج البحث"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "البحث السريع"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "تجهيز البحث"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "المحتوى"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "Ùشل"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/bg/LC_MESSAGES/sphinx.js b/sphinx/locale/bg/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..b09ff5f
--- /dev/null
+++ b/sphinx/locale/bg/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "bg",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/bg/LC_MESSAGES/sphinx.mo b/sphinx/locale/bg/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..0740c16
--- /dev/null
+++ b/sphinx/locale/bg/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/bg/LC_MESSAGES/sphinx.po b/sphinx/locale/bg/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..1a201ea
--- /dev/null
+++ b/sphinx/locale/bg/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Bulgarian (http://app.transifex.com/sphinx-doc/sphinx-1/language/bg/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: bg\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.js b/sphinx/locale/bn/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..93af27f
--- /dev/null
+++ b/sphinx/locale/bn/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "bn",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "\u098f\u0987 \u09a1\u0995\u09c1\u09ae\u09c7\u09a8\u09cd\u099f \u09b8\u09ae\u09cd\u09aa\u09b0\u09cd\u0995\u09c7",
+ "Automatically generated list of changes in version %(version)s": "\u09b8\u09cd\u09ac\u09df\u0982\u0995\u09cd\u09b0\u09bf\u09df\u09ad\u09be\u09ac\u09c7 \u09a4\u09c8\u09b0\u09c0 %(version)s-\u098f \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u09b8\u09ae\u09c2\u09b9\u09c7\u09b0 \u09a4\u09be\u09b2\u09bf\u0995\u09be\u0964",
+ "C API changes": "C API \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "\u09aa\u09c2\u09b0\u09cd\u09a3\u09be\u0999\u09cd\u0997 \u09b8\u09c2\u099a\u09c0\u09aa\u09a4\u09cd\u09b0",
+ "Contents": "",
+ "Copyright": "\u0995\u09aa\u09bf\u09b0\u09be\u0987\u099f",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "\u098f\u0995 \u09aa\u09be\u09a4\u09be\u09df \u09b8\u09ae\u09cd\u09aa\u09c2\u09b0\u09cd\u09a3 \u0987\u09a8\u09a1\u09c7\u0995\u09cd\u09b8",
+ "General Index": "\u09b8\u09be\u09a7\u09be\u09b0\u09a3 \u0987\u09a8\u09a1\u09c7\u0995\u09cd\u09b8",
+ "Global Module Index": "\u0997\u09cd\u09b2\u09c7\u09be\u09ac\u09be\u09b2 \u09ae\u09a1\u09bf\u0989\u09b2 \u0987\u09a8\u09a1\u09c7\u0995\u09cd\u09b8",
+ "Go": "\u09af\u09be\u09a8",
+ "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",
+ "Index": "\u0987\u09a8\u09a1\u09c7\u0995\u09cd\u09b8",
+ "Index &ndash; %(key)s": "\u0987\u09a8\u09a1\u09c7\u0995\u09cd\u09b8 &ndash; %(key)s",
+ "Index pages by letter": "\u09ac\u09b0\u09cd\u09a3\u09be\u09a8\u09c1\u09b8\u09be\u09b0\u09c7 \u0987\u09a8\u09a1\u09c7\u0995\u09cd\u09b8 \u09aa\u09be\u09a4\u09be",
+ "Indices and tables:": "\u0987\u09a8\u09a1\u09c7\u0995\u09cd\u09b8 \u0993 \u099f\u09c7\u09ac\u09bf\u09b2 \u09b8\u09ae\u09c2\u09b9:",
+ "Last updated on %(last_updated)s.": "%(last_updated)s \u09b8\u09b0\u09cd\u09ac\u09b6\u09c7\u09b7 \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u09df\u09c7\u099b\u09c7\u0964",
+ "Library changes": "\u09b2\u09be\u0987\u09ac\u09cd\u09b0\u09c7\u09b0\u09bf\u09b0 \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8",
+ "Navigation": "\u09a8\u09c7\u09ad\u09bf\u0997\u09c7\u09b6\u09a8",
+ "Next topic": "\u09aa\u09b0\u09ac\u09b0\u09cd\u09a4\u09c0 \u099f\u09aa\u09bf\u0995",
+ "Other changes": "\u0985\u09a8\u09cd\u09af\u09be\u09a8\u09cd\u09af \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8",
+ "Overview": "\u09ad\u09c1\u09ae\u09bf\u0995\u09be",
+ "Please activate JavaScript to enable the search\n functionality.": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u0995\u09b0\u09be\u09b0 \u099c\u09a8\u09cd\u09af \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9\u09aa\u09c2\u09b0\u09cd\u09ac\u0995 \u099c\u09be\u09ad\u09be\u09b8\u09cd\u0995\u09cd\u09b0\u09bf\u09aa\u09cd\u099f \n \u09b8\u0995\u09cd\u09b0\u09bf\u09df \u0995\u09b0\u09c1\u09a8\u0964",
+ "Preparing search...": "",
+ "Previous topic": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u099f\u09aa\u09bf\u0995",
+ "Quick search": "\u09a6\u09cd\u09b0\u09c1\u09a4 \u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8",
+ "Search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8",
+ "Search Page": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8 \u09aa\u09be\u09a4\u09be",
+ "Search Results": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8\u09c7\u09b0 \u09ab\u09b2\u09be\u09ab\u09b2",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "%(docstitle)s \u098f\u09b0 \u09ae\u09a7\u09cd\u09af\u09c7 \u0996\u09c1\u0981\u099c\u09c1\u09a8",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u09b8\u09c7\u09be\u09b0\u09cd\u09b8 \u09a6\u09c7\u0996\u09c1\u09a8",
+ "Table of Contents": "",
+ "This Page": "\u098f\u0987 \u09aa\u09be\u09a4\u09be",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "\u09b8\u0995\u09b2 \u09ab\u09be\u0982\u09b6\u09a8, \u0995\u09cd\u09b2\u09be\u09b8, \u099f\u09be\u09b0\u09cd\u09ae",
+ "can be huge": "\u0996\u09c1\u09ac \u09ac\u09dc \u09b9\u09a4\u09c7 \u09aa\u09be\u09b0\u09c7",
+ "last updated": "",
+ "lists all sections and subsections": "\u09b8\u0995\u09b2 \u0985\u09a8\u09c1\u099a\u09cd\u099b\u09c7\u09a6 \u09b8\u09ae\u09c2\u09b9\u09c7\u09b0 \u09a4\u09be\u09b2\u09bf\u0995\u09be",
+ "next chapter": "\u09aa\u09b0\u09ac\u09b0\u09cd\u09a4\u09c0 \u0985\u09a7\u09cd\u09af\u09be\u09df",
+ "previous chapter": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u0985\u09a7\u09cd\u09af\u09be\u09df",
+ "quick access to all modules": "\u09b8\u0995\u09b2 \u09ae\u09a1\u09bf\u0989\u09b2\u09c7 \u09a6\u09cd\u09b0\u09c1\u09a4 \u09aa\u09cd\u09b0\u09ac\u09c7\u09b6",
+ "search": "\u0996\u09c1\u0981\u099c\u09c1\u09a8",
+ "search this documentation": "\u098f\u0987 \u09b8\u09b9\u09be\u09df\u09bf\u0995\u09be\u09a4\u09c7 \u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be \u0995\u09b0\u09c1\u09a8",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/bn/LC_MESSAGES/sphinx.mo b/sphinx/locale/bn/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..53ddf4d
--- /dev/null
+++ 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
new file mode 100644
index 0000000..ea013f4
--- /dev/null
+++ b/sphinx/locale/bn/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2009
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FIRST AUTHOR <EMAIL@ADDRESS>, 2009\n"
+"Language-Team: Bengali (http://app.transifex.com/sphinx-doc/sphinx-1/language/bn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "পাইথন উনà§à¦¨à§Ÿà¦¨ পরামরà§à¦¶; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "বিলà§à¦Ÿà¦‡à¦¨ সমূহ"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "মডিউল লেভেল"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(-"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "সাধারণ ইনডেকà§à¦¸"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "ইনডেকà§à¦¸"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "পরবরà§à¦¤à§€"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "ইনডেকà§à¦¸"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "রিলিজ"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "অনà§à¦šà§à¦›à§‡à¦¦ লেখক:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "মডিউল লেখক:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "লেখক:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦°"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "রিটারà§à¦¨à¦¸"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "রিটারà§à¦¨ টাইপ"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "ফাংশন"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "%s ভারà§à¦¸à¦¨à§‡ নতà§à¦¨"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "%s ভারà§à¦¸à¦¨à§‡ পরিবরà§à¦¤à¦¿à¦¤"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "%s ভারà§à¦¸à¦¨ থেকে ডেপà§à¦°à¦¿à¦•à§‡à¦Ÿà§‡à¦¡"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "কà§à¦²à¦¾à¦¸"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (বিলà§à¦Ÿ-ইন ফাংশন)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s মেথড)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (কà§à¦²à¦¾à¦¸à§‡)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s à¦à§à¦¯à¦Ÿà§à¦°à¦¿à¦¬à¦¿à¦‰à¦Ÿ)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (মডিউল)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "মেথড"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "ডাটা"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "à¦à§à¦¯à¦Ÿà§à¦°à¦¿à¦¬à¦¿à¦‰à¦Ÿ"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "মডিউল"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "রেইজেস"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s মডিউলে)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s মডিউলে)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (বিলà§à¦Ÿ-ইন ভà§à¦¯à¦¾à¦°à¦¿à§Ÿà§‡à¦¬à¦²)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (বিলà§à¦Ÿ-ইন কà§à¦²à¦¾à¦¸)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s কà§à¦²à¦¾à¦¸à§‡)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s কà§à¦²à¦¾à¦¸ মেথড)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s সà§à¦Ÿà§à¦¯à¦¾à¦Ÿà¦¿à¦• মেথড)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "মডিউল সমূহ"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "ডেপà§à¦°à¦¿à¦•à§‡à¦Ÿà§‡à¦¡"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "à¦à¦•à§à¦¸à§‡à¦ªà¦¶à¦¨"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "কà§à¦²à¦¾à¦¸ মেথড"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "সà§à¦Ÿà§à¦¯à¦¾à¦Ÿà¦¿à¦• মেথড"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "à¦à¦¨à¦­à¦¾à§Ÿà¦°à¦¨à¦®à§‡à¦¨à§à¦Ÿ ভà§à¦¯à¦¾à¦°à¦¿à§Ÿà§‡à¦¬à¦²; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "শবà§à¦¦à¦•à§‡à¦¾à¦·"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "বà§à¦¯à¦•à¦°à¦£ টোকেন"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "à¦à¦¨à¦­à¦¾à§Ÿà¦°à¦¨à¦®à§‡à¦¨à§à¦Ÿ ভà§à¦¯à¦¾à¦°à¦¿à§Ÿà§‡à¦¬à¦²"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "পà§à¦°à§‡à¦¾à¦—à§à¦°à¦¾à¦® অপশন"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "মডিউল ইনডেকà§à¦¸"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ পাতা"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "অসমাপà§à¦¤ কাজ"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "দৃষà§à¦Ÿà¦¿ আকরà§à¦·à¦£"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "সতরà§à¦•à§€à¦•à¦°à¦£"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "বিপজà§à¦œà¦¨à¦•"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "ভà§à¦² (à¦à¦°à¦°)"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "আভাস"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "নোট"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "আরও দেখà§à¦¨"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "পরামরà§à¦¶"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "সতরà§à¦•à¦¤à¦¾"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ পাতা হতে চলমান"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "যান"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "সোরà§à¦¸ দেখà§à¦¨"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "ভà§à¦®à¦¿à¦•à¦¾"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "ইনডেকà§à¦¸ &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "নেভিগেশন"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s à¦à¦° মধà§à¦¯à§‡ খà§à¦à¦œà§à¦¨"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "à¦à¦‡ ডকà§à¦®à§‡à¦¨à§à¦Ÿ সমà§à¦ªà¦°à§à¦•à§‡"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "কপিরাইট"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "%(last_updated)s সরà§à¦¬à¦¶à§‡à¦· পরিবরà§à¦¤à¦¨ করা হয়েছে।"
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s-ঠখà§à¦à¦œà§à¦¨"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ টপিক"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ অধà§à¦¯à¦¾à§Ÿ"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "পরবরà§à¦¤à§€ টপিক"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "পরবরà§à¦¤à§€ অধà§à¦¯à¦¾à§Ÿ"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করার জনà§à¦¯ অনà§à¦—à§à¦°à¦¹à¦ªà§‚রà§à¦¬à¦• জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ \n সকà§à¦°à¦¿à§Ÿ করà§à¦¨à¥¤"
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "খà§à¦à¦œà§à¦¨"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° ফলাফল"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "দà§à¦°à§à¦¤ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° মà§à¦¯à¦¾à¦šà¦—à§à¦²à§‡à¦¾ লà§à¦•à¦¾à¦¨"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "পাদটীকা"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[ছবি]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.js b/sphinx/locale/ca/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..da37e54
--- /dev/null
+++ b/sphinx/locale/ca/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ca",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "&#169; %(copyright_prefix)s %(copyright)s.",
+ ", in ": ", a ",
+ "About these documents": "Quant a aquests documents",
+ "Automatically generated list of changes in version %(version)s": "Llista de canvis de la versi\u00f3 %(version)s generada autom\u00e0ticament",
+ "C API changes": "Canvis a l'API de C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Canvis en la versi\u00f3 %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Redueix la barra lateral",
+ "Complete Table of Contents": "Taula de contingut completa",
+ "Contents": "Contingut",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Creada mitjan\u00e7ant <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "Expandeix la barra lateral",
+ "Full index on one page": "\u00cdndex complet en una p\u00e0gina",
+ "General Index": "\u00cdndex general",
+ "Global Module Index": "\u00cdndex global de m\u00f2duls",
+ "Go": "Ves a",
+ "Hide Search Matches": "Oculta els resultats de cerca",
+ "Index": "\u00cdndex",
+ "Index &ndash; %(key)s": "\u00cdndex &ndash; %(key)s",
+ "Index pages by letter": "P\u00e0gines d'\u00edndex per lletra",
+ "Indices and tables:": "\u00cdndexs i taules:",
+ "Last updated on %(last_updated)s.": "Darrera actualitzaci\u00f3 el %(last_updated)s.",
+ "Library changes": "Canvis a la biblioteca",
+ "Navigation": "Navegaci\u00f3",
+ "Next topic": "Tema seg\u00fcent",
+ "Other changes": "Altres canvis",
+ "Overview": "Vista general",
+ "Please activate JavaScript to enable the search\n functionality.": "Activa JavaScript per a usar la funcionalitat\n de cerca.",
+ "Preparing search...": "S'est\u00e0 preparant la cerca...",
+ "Previous topic": "Tema anterior",
+ "Quick search": "Cerca r\u00e0pida",
+ "Search": "Cerca",
+ "Search Page": "P\u00e0gina de cerca",
+ "Search Results": "Resultats de la cerca",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "Cerca acabada, s'han trobat ${resultCount} p\u00e0gines que coincideixen amb la consulta de cerca.",
+ "Search within %(docstitle)s": "Cerca dins de %(docstitle)s",
+ "Searching": "S'est\u00e0 cercant",
+ "Searching for multiple words only shows matches that contain\n all words.": "Cercar m\u00faltiples paraules nom\u00e9s mostrar\u00e0 les coincid\u00e8ncies\n que continguin totes les paraules.",
+ "Show Source": "Mostra el codi font",
+ "Table of Contents": "Taula de continguts",
+ "This Page": "Aquesta p\u00e0gina",
+ "Welcome! This is": "Us donem la benvinguda! Aix\u00f2 \u00e9s",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "La vostra cerca no ha coincidit amb cap document. Assegureu-vos que s'escriuen correctament totes les paraules i que heu seleccionat prou categories.",
+ "all functions, classes, terms": "totes les funcions, classes, termes",
+ "can be huge": "pot ser gegant",
+ "last updated": "darrera actualitzaci\u00f3",
+ "lists all sections and subsections": "llista totes les seccions i subseccions",
+ "next chapter": "cap\u00edtol seg\u00fcent",
+ "previous chapter": "cap\u00edtol anterior",
+ "quick access to all modules": "acc\u00e9s r\u00e0pid a tots els m\u00f2duls",
+ "search": "cerca",
+ "search this documentation": "cerca aquesta documentaci\u00f3",
+ "the documentation for": "la documentaci\u00f3 per a"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ca/LC_MESSAGES/sphinx.mo b/sphinx/locale/ca/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..71f2999
--- /dev/null
+++ 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
new file mode 100644
index 0000000..1e4764a
--- /dev/null
+++ b/sphinx/locale/ca/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3698 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Adam Turner, 2023
+# Antoni Bella Pérez <antonibella5@yahoo.com>, 2023
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2009
+# Pau Fernández <pau.fernandez@upc.edu>, 2009
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Antoni Bella Pérez <antonibella5@yahoo.com>, 2023\n"
+"Language-Team: Catalan (http://app.transifex.com/sphinx-doc/sphinx-1/language/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "No es pot trobar el directori d'origen (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "El directori de sortida (%s) no és un directori"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "El directori d'origen i el de destinació no poden ser idèntics"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "S'està executant Sphinx versió %s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Aquest projecte almenys necessita Sphinx versió %s i, per tant, no es pot crear amb aquesta versió."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "es crea el directori de sortida"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "mentre es configura l'extensió %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "«setup» tal com es defineix actualment a conf.py no és una crida de Python. Modifiqueu la seva definició per a convertir-la en una funció que es pugui cridar. Això és necessari perquè conf.py es comporti com a una extensió de Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "s'estan carregant les traduccions [%s]..."
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "fet"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "no està disponible per a missatges integrats"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "s'està carregant l'entorn preparat"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "ha fallat: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "No s'ha seleccionat cap constructor, s'usa el predeterminat: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "ha tingut èxit"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "ha acabat amb problemes"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "construcció %s, %s avís (amb els avisos tractats com a errors)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "construcció %s, %s avisos (amb els avisos tractats com a errors)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "construcció %s, %s avís."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "construcció %s, %s avisos."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "construcció %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "la classe del node %r ja està registrada, els seus visitants seran anul·lats"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "la directiva %r ja està registrada, s'anul·larà"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "el rol %r ja està registrat, s'anul·larà"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "l'extensió %s no declara si és segur per a la lectura en paral·lel, suposant que no ho sigui, demaneu a l'autor de l'extensió que ho comprovi i faci que sigui explícit"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "l'extensió %s no és segura per a la lectura en paral·lel"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "l'extensió %s no declara si és segur per a l'escriptura en paral·lel, suposant que no ho sigui, demaneu a l'autor de l'extensió que ho comprovi i faci que sigui explícit"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "l'extensió %s no és segura per a l'escriptura en paral·lel"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "s'està executant %s en sèrie"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "el directori de configuració no conté un fitxer conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "S'ha trobat un valor de configuració no vàlid: «language = None». Actualitzeu la vostra configuració a un codi d'idioma vàlid. Es torna «en» (anglès)."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "no s'ha pogut substituir l'ajust de la configuració del diccionari %r, s'ignora (useu %r per a establir elements individuals)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "nombre no vàlid %r del valor de configuració %r, s'ignora"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "no s'ha pogut substituir l'ajust de la configuració %r amb tipus no compatibles, s'ignora"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "valor de configuració desconegut %r en substituir, s'ignora"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Aquest valor de configuració no existeix: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "El valor de configuració %r ja està present"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Hi ha un error de sintaxi en el fitxer de configuració: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "El fitxer de configuració (o un dels mòduls que s'importen) ha cridat «sys.exit()»"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Hi ha un error programable en el fitxer de configuració:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "El valor de configuració «source_suffix» espera una cadena, una llista de cadenes o un diccionari. Però s'ha donat «%r»."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Secció %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Fig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Taula %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Llistat %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "El valor de configuració «{name}» ha de ser un de {candidates}, però s'ha donat «{current}»."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "El valor de configuració «{name}» té el tipus «{current.__name__}», s'espera {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "El valor de configuració «{name}» té el tipus «{current.__name__}», el valor predeterminat és «{default.__name__}»."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "no s'ha trobat primary_domain %r, s'ignora."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Des de la versió 2.0, Sphinx usa «index» de manera predeterminada com a root_doc. Afegiu «root_doc = 'contents'» al vostre conf.py."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "L'esdeveniment %r ja està present"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Nom desconegut de l'esdeveniment: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "El gestor %r per a l'esdeveniment %r ha retornat una excepció"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "L'extensió %s és requerida per la configuració de needs_extensions, però aquesta no està carregada."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Aquest projecte necessita l'extensió %s almenys a la versió %s i, per tant, no es pot construir amb la versió carregada (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "No es coneix el nom del lexer de pigments %r"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "s'han trobat múltiples fitxers per al document «%s»: %r\nUseu %r per a la compilació."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr "S'ha ignorat el document il·legible %r."
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "La classe del constructor %s no té cap atribut «name»"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "El constructor %r ja existeix (al mòdul %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "El nom del constructor %s no està registrat o disponible a través del punt d'entrada"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "El nom del constructor %s no està registrat"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "el domini %s ja està registrat"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "el domini %s encara no està registrat"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "La directiva %r ja està registrada al domini %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "El rol %r ja està registrat al domini %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "L'índex %r ja està registrat al domini %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "L'object_type %r ja està registrat"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "El crossref_type %r ja està registrat"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r ja està registrat"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser per a %r ja està registrat"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "L'analitzador de fonts per a %s no registrat"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "El traductor per a %r ja existeix"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "kwargs per a add_node() haurà de ser una funció (visita, sortida) tupla: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r ja està registrat"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "la representació matemàtica %s ja està registrada"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "l'extensió %r ja es va fusionar amb Sphinx des de la versió %s. Aquesta extensió s'ignorarà."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Excepció original:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "No s'ha pogut importar l'extensió %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "l'extensió %r no té cap funció setup(). És realment un mòdul d'extensions de Sphinx?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "L'extensió %s usada per aquest projecte almenys necessita Sphinx versió %s i, per tant, no es pot crear amb aquesta versió."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "l'extensió %r ha retornat un objecte no admès des de la seva funció setup(). No n'hauria de retornar cap o retornar un diccionari de metadades"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Propostes de millora a Python; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "número de PEP no vàlid %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "número de RFC no vàlid %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "el tema %r no té la configuració «theme»"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "el tema %r no té la configuració «inherit» (heretat)"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "no s'ha trobat cap tema anomenat %r, heretat per %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "configuració %s. %s no es produeix en cap de les configuracions de temes cercats"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "opció de tema no admesa, s'ha donat %r"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "el fitxer %r en el camí de temes no és un fitxer ZIP vàlid ni conté cap tema"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "no s'ha trobat cap tema anomenat %r (manca el theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "no s'ha trobat una imatge adequada per al constructor %s: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "no s'ha trobat una imatge adequada per al constructor %s: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "s'estan construint [mo]:"
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "s'està escrivint la sortida..."
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "tots els %d fitxers PO"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "objectius per als %d fitxers PO que s'han especificat"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "objectius per als %d fitxers PO que estan desfasats"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "tots els fitxers font"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "el fitxer %r proporcionat a la línia d'ordres no existeix, "
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "el fitxer %r proporcionat a la línia d'ordres no es troba sota el directori d'origen, s'ignora"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "el fitxer %r proporcionat a la línia d'ordres no és un document vàlid, s'ignora"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d fitxers font proporcionats a la línia d'ordres"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "els objectius per a %d fitxers font que estan desfasats"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "s'està construint [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "s'està cercant per fitxers sense actualitzar... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "s'han trobat %d"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "no se n'ha trobat cap"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "s'està preparant l'ambient"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "s'està comprovant la coherència"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "no hi ha cap objectiu desfasat."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "s'està actualitzant l'entorn: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s afegits, %s canviats, %s eliminats"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "s'estan llegint les fonts... "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "els docname que s'escriuran: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "s'estan preparant els documents"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr "s'estan copiant els recursos"
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "s'ha trobat una entrada ToC duplicada: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "s'estan copiant les imatges... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "no s'ha pogut llegir el fitxer d'imatge %r: en el seu lloc, es copia"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "no s'ha pogut copiar el fitxer d'imatge %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "no s'ha pogut escriure el fitxer d'imatge %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "No s'ha trobat el Pillow: es copien els fitxers d'imatge"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "s'està escrivint un fitxer de tipus MIME..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "s'està escrivint el fitxer META-INF/container.xml..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "s'està escrivint el fitxer content.opf..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "tipus MIME desconegut per a %s, s'ignora"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "s'està escrivint el fitxer toc.ncx..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "s'està escrivint el fitxer %s..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "El fitxer de vista general es troba a %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "no hi ha canvis en la versió %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "s'està escrivint el fitxer de vista general..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Elements incorporats"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Nivell de mòdul"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "s'estan copiant els fitxers font..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "no s'ha pogut llegir %r per a la creació del registre de canvis"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "El constructor fictici no genera cap fitxer."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "El fitxer ePub es troba a %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "s'està escrivint el fitxer nav.xhtml..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_language» (o «language») no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "el valor de configuració «epub_uid» haurà de ser un XML NAME per a EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_title» (o «html_title») no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_author» no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_contributor» no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_description» no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_publisher» no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_copyright» (o «copyright») no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "el valor de configuració «epub_identifier» no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "el valor de configuració «version» no pot estar buit per a EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "css_file no vàlid: %r, s'ignora"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Els catàlegs de missatges es troben a %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "objectius per a %d fitxers de plantilla"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "s'estan llegint les plantilles... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "s'estan escrivint els catàlegs de missatges... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Cerqueu qualsevol error a la sortida anterior o en el fitxer %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "enllaç trencat: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "Ha fallat en compilar expressions regulars a linkcheck_allowed_redirects: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Les pàgines del manual es troben a %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "no s'ha trobat el valor de configuració «man_pages»: no s'escriuran les pàgines del manual"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "s'està escrivint"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "El valor de configuració «man_pages» fa referència a un document %s desconegut"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "La pàgina HTML es troba a %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "s'està muntant un únic document"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "s'estan escrivint els fitxers addicionals"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Els fitxers de Texinfo es troben a %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nExecuteu l'ordre «make» en aquest directori per a executar-les mitjançant\nde makeinfo (useu l'ordre «make info» per a fer-ho automàticament)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "no s'ha trobat el valor de configuració «texinfo_documents»: no s'escriurà cap document"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "El valor de configuració «texinfo_documents» fa referència a un document %s desconegut"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "s'està processant %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "s'estan resolent les referències..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (a "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "s'estan copiant els fitxers de suport de Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "error en escriure el fitxer Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Els fitxers de text es troben a %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "error en escriure al fitxer %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Els fitxers en XML es troben a %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Els fitxers en pseudo XML es troben a %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "el fitxer d'informació de la compilació està trencat: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Les pàgines en HTML es troben a %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Ha fallat en llegir el fitxer d'informació de la construcció: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%-d %b, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ãndex general"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "índex"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "següent"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "s'estan generant els índexs"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "s'estan escrivint les pàgines addicionals"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "s'estan copiant els fitxers que es poden baixar... "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "no s'ha pogut copiar el fitxer que es podia baixar %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "Ha fallat en copiar un fitxer a html_static_file: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "s'estan copiant els fitxers estàtics"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "no s'ha pogut copiar el fitxer estàtic %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "s'estan copiant els fitxers addicionals"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "no s'ha pogut copiar el fitxer addicional %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Ha fallat en escriure el fitxer d'informació de la construcció: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "no s'ha pogut carregar l'índex de cerca, i no es construiran tots els documents: l'índex estarà incomplet."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "la pàgina %s coincideix amb dos patrons a html_sidebars: %r i %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "s'ha produït un error d'Unicode en representar la pàgina %s. Assegureu-vos que tots els valors de configuració que contenen contingut que no és ASCII són cadenes Unicode."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "S'ha produït un error en representar la pàgina %s.\nMotiu: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "s'està bolcant l'inventari d'objectes"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "s'està bolcant l'índex de cerca a %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "js_file no vàlid: %r, s'ignora"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "S'han enregistrat molts math_renderer. Però no s'ha seleccionat math_renderer."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "S'ha donat un math_renderer %r desconegut."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "l'entrada html_extra_path %r no existeix"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "l'entrada html_extra_path %r es col·loca dins del directori de sortida"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "l'entrada html_static_path %r no existeix"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "l'entrada html_static_path %r es col·loca dins del directori de sortida"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "el fitxer de logotip %r no existeix"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "el fitxer icona de web %r no existeix"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr "HTML 4 ja no és compatible amb Sphinx. (s'ha detectat «html4_writer=true» a les opcions de configuració)"
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentació"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Els fitxers en LaTeX es troben a %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nExecuteu l'ordre «make» en aquest directori per a executar-les\nmitjançant (pdf)latex (useu l'ordre «make latexpdf» per a fer-ho\nautomàticament)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "no s'ha trobat el valor de configuració «latex_documents»: no s'escriurà cap document"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "El valor de configuració «latex_documents» fa referència a un document %s desconegut"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Ãndex"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Versió"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "no es coneix l'opció de Babel per a l'idioma %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "s'estan copiant els fitxers de suport de TeX"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "s'estan copiant els fitxers de suport de TeX..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "s'estan copiant els fitxers addicionals"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Clau de configuració desconeguda: latex_elements[%r], s'ignora."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "Opció desconeguda de tema: latex_theme_options[%r], s'ignora."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r no té la configuració «theme»"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r no té la configuració «%s»"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr "Ha fallat en obtenir el docname!"
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr "Ha fallat en obtenir un docname per a l'origen {source!r}!"
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr "No s'ha trobat cap nota a peu de pàgina per al node de referència %r donat"
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "S'ha produït una excepció en construir, s'està iniciant el depurador:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "S'ha interromput!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "Error de marcatge reST:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Error de codificació:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "La traça completa s'ha guardat a %s, si voleu informar del problema als desenvolupadors."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Error de recursivitat:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "Es pot produir amb fitxers molt grans o profundament imbricats. Podeu augmentar amb cura el límit predeterminat de la recursivitat de 1000 en el fitxer conf.py, amb, per exemple:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "S'ha produït una excepció:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Informeu-ho també si es tractava d'un error d'usuari, de manera que la pròxima vegada es pugui proporcionar un missatge d'error millor."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Es pot presentar un informe d'error en el seguidor <https://github.com/sphinx-doc/sphinx/issues>. Moltes gràcies!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "el número de treball hauria de ser un nombre positiu"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "Per a més informació, visiteu <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nGenerar la documentació a partir dels fitxers font.\n\nL'eina «sphinx-build» generarà la documentació a partir dels fitxers\na SOURCEDIR i els situarà a OUTPUTDIR. Cerqueu el «conf.py» en el\nSOURCEDIR per als paràmetres de configuració. L'eina «sphinx-quickstart» es pot usar per a generar fitxers de plantilla, inclòs el «conf.py».\n\nL'eina «sphinx-build» pot crear documentació en formats diferents. A la\nlínia d'ordres se selecciona un format que especifica el nom del constructor.\nDe manera predeterminada és HTML. Els constructors també poden dur a terme\naltres tasques relacionades amb el processament de la documentació.\n\nDe manera predeterminada, es construeix tot el que està desactualitzat. Es pot\ngenerar la sortida només per als fitxers seleccionats especificant noms de fitxer\nindividuals.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "camí cap als fitxers font de la documentació"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "camí cap al directori de sortida"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "una llista de fitxers específics que s'han de reconstruir. S'ignorarà si s'especifica -a"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "opcions generals"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "constructor que s'usarà (predeterminat: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "escriu tots els fitxers (predeterminat: només escriu els fitxers nous i els que han canviat)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "no usar un entorn desat, llegeix sempre tots els fitxers"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "camí per a l'entorn en la memòria cau i els fitxers doctree (predeterminat: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "construeix en paral·lel amb N processos quan sigui possible (el valor especial «auto» estableix N al recompte de CPU)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "camí on es troba el fitxer de configuració (conf.py) (predeterminat: igual que el SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "no usar cap fitxer de configuració, només les opcions -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "superposa una configuració en el fitxer de configuració"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "passa un valor a les plantilles HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "defineix l'etiqueta: inclou blocs «only» amb TAG"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "Mode exhaustiu, adverteix sobre totes les referències que manquen"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "opcions de sortida de la consola"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "augmenta la loquacitat (es pot repetir)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "sense sortida a la sortida estàndard, només avisos a la sortida d'error estàndard"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "sense sortida, ni tan sols els avisos"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "emet una sortida amb colors (predeterminada: detecció automàtica)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "no emetre una sortida amb colors (predeterminada: detecció automàtica)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "escriviu els avisos (i errors) al fitxer indicat"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "converteix els avisos en errors"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "amb -w, se seguirà endavant quan es rebin avisos"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "mostra la traça completa en excepció"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "executa Pdb en excepció"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "no es pot combinar l'opció -a i els noms de fitxer"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "no s'ha pogut obrir el fitxer d'avisos %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "l'argument de l'opció -D haurà d'estar en la forma «nom=valor»"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "l'argument de l'opció -A haurà d'estar en la forma «nom=valor»"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "insereix automàticament les docstring des dels mòduls"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "prova automàticament els fragments de codi en els blocs doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "enllaç entre la documentació de Sphinx de projectes diferents"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "escriu les entrades «todo» que es poden mostrar o ocultar durant la construcció"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "comprovacions per a la cobertura de la documentació"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "inclou expressions matemàtiques, mostrades com a imatges PNG o SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "inclou expressions matemàtiques, representades en el navegador per MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "inclusió condicional de contingut basat en els valors de la configuració"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "inclou els enllaços cap al codi font dels objectes documentats en Python"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "crea un fitxer .nojekyll per a publicar el document a les pàgines de GitHub"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Si us plau, introduïu un nom de camí vàlid."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Si us plau, introduïu algun text."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Si us plau, introduïu un dels %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Si us plau, introduïu qualsevol de «y» o «n»."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Si us plau, introduïu un sufix de fitxer, p. ex., «.rst» o «.txt»."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Us donem la benvinguda a la utilitat d'inici ràpid de Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Introduïu els valors per a les configuracions següents (només premeu «Retorn»\nper a acceptar un valor predeterminat, si se'n dona un entre parèntesis)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Camí arrel seleccionat: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Introduïu el camí arrel per a la documentació."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Camí arrel per a la documentació"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Error: ja existeix un fitxer conf.py en el camí arrel seleccionat."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "«sphinx-quickstart» no sobreescriurà els projectes de Sphinx existents."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Introduïu un camí arrel nou (o premeu «Retorn» per a sortir)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Teniu dues opcions per a col·locar el directori de construcció per a la\nsortida de Sphinx. O useu un directori «_build» dins del camí arrel,\no els directoris separats «source» i «build» dins del camí arrel."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Separa els directoris «source» i «build» (s/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "Dins del directori arrel, es crearan dos directoris més: «_templates» per a\nles plantilles HTML personalitzades i «_static» per als fulls d'estil\npersonalitzats i altres fitxers estàtics. Podeu introduir un altre prefix\n(com «.») per a substituir el guió baix."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Prefix de nom per als directoris «templates» i «static»"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "El nom del projecte apareixerà en diversos llocs de la documentació construïda."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Nom del projecte"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Noms de l'autoria"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx té la noció d'una «versió» i un «llançament» per al programari.\nCada versió pot tenir múltiples versions. Per exemple, per a Python,\nla versió és una cosa semblant a 2.5 o 3.0, mentre que el llançament és\ncom 2.5.1 o 3.0a1. Si no necessiteu aquesta doble estructura, senzillament\nestabliu ambdues amb el mateix valor."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Versió del projecte"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Llançament del projecte"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "Si els documents s'han d'escriure en un idioma que no sigui l'anglès,\npodeu seleccionar un idioma aquí per al vostre codi d'idioma.\nA continuació, Sphinx traduirà el text que es genera en aquest idioma.\n\nPer a obtenir una llista dels codis admesos, vegeu\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Idioma del projecte"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "El sufix del nom del fitxer per als fitxers d'origen. Normalment, aquest és\n«.txt» o «.rst». Només els fitxers amb aquest sufix es consideraran documents."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Sufix del fitxer font"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "Un document és especial perquè es considera el node superior de l'«arbre de\ncontingut», és a dir, és l'arrel de l'estructura jeràrquica dels documents.\nNormalment, es tracta de l'«index», però si el document «index» és una\nplantilla personalitzada, també podreu establir-la a un altre nom de fitxer."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Nom del document mestre (sense sufix)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Error: el fitxer mestre %s ja es troba en el camí arrel seleccionat."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "«sphinx-quickstart» no sobreescriurà el fitxer existent."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Introduïu un nom de fitxer nou o canvieu-ne el nom i premeu «Retorn»"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Indiqueu quines de les extensions següents de Sphinx haurien d'estar habilitades:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Nota: «imgmath» i «mathjax» no es poden habilitar alhora. «imgmath» ha estat desseleccionat."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Es pot generar un fitxer Makefile i un fitxer d'ordres de Windows,\nde manera que només haureu d'executar, p. ex., «make html»\nen lloc d'invocar directament «sphinx-build»."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Voleu crear el Makefile? (s/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Voleu crear el fitxer d'ordres de Windows? (s/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "S'està creant el fitxer %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "El fitxer %s ja existeix, se salta."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Finalitzat: s'ha creat una estructura inicial del directori."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Ara heu de completar el fitxer mestre %s i crear altres fitxers font de documentació. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Useu el Makefile per a construir els documents, com segueix:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Useu l'ordre «sphinx-build» per a construir els documents, com segueix:\n sphinx-build -b constructor %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "on «constructor» és un dels constructors admesos, p. ex., html, latex o linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nGenereu els fitxers necessaris per a un projecte Sphinx.\n\n«sphinx-quickstart» és una eina interactiva que fa algunes preguntes sobre el\nprojecte i després genera un directori complet de documentació i un\nexemple del fitxer Makefile per a ser usat amb l'ordre «sphinx-build».\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "mode silenciós"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "arrel del projecte"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Opcions de l'estructura"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "Si s'especifica, se separarà el codi font i els directoris de compilació"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "Si s'especifica, es crearà el directori de construcció a dins del directori d'origen"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "substitució per a punts a _templates, etc."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Opcions bàsiques del projecte"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "nom del projecte"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "noms de l'autoria"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "versió del projecte"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "llançament del projecte"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "idioma del document"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "sufix del fitxer font"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "nom del document mestre"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "usa epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Opcions de l'extensió"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "habilita l'extensió %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "habilita les extensions arbitràries"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Creació dels fitxers Makefile i de processament per lots"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "es crea el Makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "no es crea el Makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "es crea el fitxer de processament per lots"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "no es crea el fitxer de processament per lots"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "usa el mode make per a Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "no usis el mode make per a Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Plantilles de projecte"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "directori de plantilles per als fitxers de plantilla"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "defineix una variable de plantilla"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "s'especifica «quiet», però no s'especifica cap «project» o «author»."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Error: el camí especificat no és un directori o ja hi ha els fitxers de Sphinx."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "«sphinx-quickstart» només generarà dins d'un directori buit. Especifiqueu un camí arrel nou."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Variable no vàlida de plantilla: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "cap espai en blanc eliminat en disminuir el sagnat"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Subtítol no vàlid: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "l'especificació del número de línia queda fora de l'interval (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "No es poden usar ambdues opcions «%s» i «%s»"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "El fitxer inclòs %r no s'ha trobat o s'ha fallat en llegir-lo"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "La codificació %r usada per a la lectura del fitxer inclòs %r sembla estar malament, intenteu donar una opció «:encoding:»"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "L'objecte anomenat %r no es troba en el fitxer inclòs %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "No podeu usar «lineno-match» amb un conjunt desarticulat de «línies»"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Línia específica %r: No hi ha cap línia llançada des del fitxer inclòs %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "El patró global toctree %r no coincideix amb cap document"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "el toctree conté una referència cap al document exclòs %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "el toctree conté una referència cap al document %r, el qual no existeix"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "s'ha trobat una entrada duplicada en el toctree: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor de la secció:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor del mòdul: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor del codi: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr "... el contingut dels reconeixements no és una llista"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr "... el contingut de l'historial no és una llista"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "«:file:» l'opció per a la directiva «csv-table» ara reconeix un camí absolut com a camí relatiu des del directori d'origen. Actualitzeu el vostre document."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "Declaració de C duplicada, també definida a %s:%s.\nLa declaració és «.. c:%s:: %s»."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Paràmetres"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "Valors retornats"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Retorna"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Tipus de retorn"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "membre"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variable"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funció"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "estructura"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "unió"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enumera"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "numerador"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipus"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "paràmetre de la funció"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Novetat de la versió %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Canviat a la versió %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsolet des de la versió %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "citació duplicada %s, una altra instància a %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "No es fa referència a la citació [%s]."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "Declaració de C** duplicada, també definida a %s:%s.\nLa declaració és «.. cpp:%s:: %s»."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Paràmetres de la plantilla"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Llançaments"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "classe"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "concepte"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "paràmetre de la plantilla"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funció interna)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (mètode %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variable global o constant)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atribut %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Arguments"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (mòdul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "mètode"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dades"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "mòdul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "descripció %s duplicada de %s, una altra %s a %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "etiqueta duplicada de l'equació %s, una altra instància a %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "math_eqref_format no vàlid: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variables"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Llença"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (al mòdul %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (al mòdul %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable interna)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe interna)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe a %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (mètode de classe %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (mètode estàtic %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (propietat %s)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Ãndex de mòduls en Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "mòduls"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Obsolet"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "excepció"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "mètode de classe"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "mètode estàtic"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "propietat"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr "descripció de l'objecte duplicat de %s, una altra instància a %s, ús «:no-index:» per a un d'ells"
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "s'ha trobat més d'un objectiu per a la referència creuada %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (obsolet)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directiva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (opció de la directiva)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rol)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "directiva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "opció_de_la_directiva"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rol"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "descripció duplicada del %s %s, una altra instància a %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "variable d'entorn; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Descripció de l'opció amb format incorrecte %r, s'ha de veure com «opt», «-opt args», «--opt args», «/opt args» o «+opt args»"
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "opció de la línia d'ordres %s"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "opció de la línia d'ordres"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "el terme del glossari ha d'estar precedit per una línia buida"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "els termes del glossari no han d'estar separats per línies buides"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "el glossari sembla estar mal formatat, verifiqueu el sagnat"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "terme del glossari"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "gramàtica simbòlica"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "etiqueta de referència"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "variable d'entorn"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opció del programa"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "document"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Ãndex de mòduls"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Pàgina de cerca"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "etiqueta duplicada %s, una altra instància a %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "descripció %s duplicada del %s, una altra instància a %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "«numfig» està desactivat. :numref: s'ignora."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "Ha fallat en crear una referència creuada. No s'assigna cap número: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "l'enllaç no té cap subtítol: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "numfig_format no vàlid: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "numfig_format no vàlid: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "etiqueta sense definir: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "Ha fallat en crear una referència creuada. No es troba un títol o subtítol: %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "configuració nova"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "configuració modificada"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "extensions modificades"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "la versió de l'entorn de compilació no és actual"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "el directori d'origen ha estat modificat"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Aquest entorn és incompatible amb el constructor seleccionat, trieu un altre directori doctree."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Ha fallat en escanejar els documents a %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "El domini %r no està registrat"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "el document no està inclòs en cap toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "S'ha trobat un toctree autoreferenciat. S'ignora."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "vegeu %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "vegeu també %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "tipus d'entrada %r amb un índex desconegut"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Símbols"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "s'han detectat referències circulars del toctree, s'ignora: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "el toctree conté una referència cap al document %r, el qual no conté un títol: no es generarà cap enllaç"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "el toctree conté una referència cap a un document no inclòs %r"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "el fitxer d'imatge no es pot llegir: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "el fitxer d'imatge %s no es pot llegir: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "el fitxer de baixada no es pot llegir: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s ja té assignats números de secció (toctree amb numeració imbricada?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "S'hauria de crear el fitxer %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nMireu recursivament a <MODULE_PATH> per als mòduls i paquets de Python\ni creeu un fitxer reST amb les directives «automodule» per paquet en el <OUTPUT_PATH>.\n\nEls <EXCLUDE_PATTERN> poden ser fitxers i/o patrons de directori que seran\nexclosos de la generació.\n\nNota: De manera predeterminada, aquest script no sobreescriurà els fitxers que ja s'han creat."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "camí cap al mòdul que es documenta"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "fitxer d'estil fnmatch i/o patrons de directori que s'exclouran de la generació"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "directori per a col·locar tota la sortida"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "profunditat màxima dels submòduls que es mostraran a la TOC (predeterminada: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "sobreescriu els fitxers existents"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "seguir els enllaços simbòlics. Potent quan es combina amb el paquet collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "executa l'script sense crear els fitxers"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "posa la documentació per a cada mòdul a la seva pròpia pàgina"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "inclou «_private» en els mòduls"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "nom de fitxer de la taula de contingut (predeterminat: mòduls)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "no crea un fitxer de taula de contingut"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "no crea capçaleres per als paquets del mòdul/paquet (p. ex., quan les cadenes de documentació ja les contenen)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "posa la documentació del mòdul abans de la documentació del submòdul"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "interpreta els camins dels mòduls segons l'especificació d'espais de noms implícits al PEP-0420"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "sufix del fitxer (predeterminat: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "genera un projecte complet amb «sphinx-quickstart»"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "afegeix module_path a sys.path, s'usa quan s'indica el paràmetre --full"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "nom del projecte (predeterminat: nom del mòdul arrel)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "autoria del projecte, s'usa quan s'indica el paràmetre --full"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "versió del projecte, s'usa quan s'indica el paràmetre --full"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "llançament del projecte, s'usa quan s'indica el paràmetre --full"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "opcions de l'extensió"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s no és cap directori."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "la secció «%s» s'etiqueta com a «%s»"
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "expressions regulars no vàlides %r a %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Proves de cobertura en les fonts acabades, mireu el resultat a %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "expressions regulars no vàlides %r a coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "API de C sense documentar: %s [ %s] en el fitxer %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "el mòdul %s no s'ha pogut importar: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "funció de Python sense documentar: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "classe de Python sense documentar: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "mètode de Python sense documentar: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "manca «+» o «-» a l'opció «%s»."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "«%s» no és una opció vàlida."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "«%s» no és una opció pyversion vàlida"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "tipus de TestCode no vàlid"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Proves de doctests en les fonts acabades, mireu el resultat a %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "no hi ha codi/sortida en el bloc %s a %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "s'ignora el codi doctest no vàlid: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "==================== durades de lectura més lentes ====================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "l'enllaç codificat %r podria substituir-se per un enllaç extern (en el seu lloc intenteu usar %r)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "La directiva del Graphviz no pot tenir tant el contingut com un argument del nom de fitxer"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "El fitxer extern %r del Graphviz no s'ha trobat ni es pot llegir"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "S'està ignorant la directiva «graphviz» sense contingut."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr "S'ha d'establir el camí de l'executable «graphviz_dot»! %r"
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "l'ordre «dot» %r no s'ha pogut executar (necessària per a la sortida del Graphviz), comproveu la configuració de «graphviz_dot»"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "«dot» ha sortit amb un error:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "«dot» no ha produït un fitxer de sortida:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format haurà de ser un de «png» o «svg», però és %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "codi del «dot» %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[gràfica: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[gràfica]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "No es pot executar l'ordre de conversió d'imatges %r. «sphinx.ext.imgconverter» requereix de manera predeterminada ImageMagick. Assegureu-vos que està instal·lat o configureu l'opció «image_converter» a una ordre de conversió personalitzada.\n\nTraça: %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "«convert» ha sortit amb un error:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "l'ordre «convert» %r no s'ha pogut executar, comproveu la configuració d'«image_converter»"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "l'ordre de LaTeX %r no s'ha pogut executar (necessària per a la visualització matemàtica), comproveu la configuració d'«imgmath_latex»"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s l'ordre de %r no s'ha pogut executar (necessària per a la visualització matemàtica), comproveu la configuració d'«imgmath_%s»"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "visualització de latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "latex inclòs %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr "Enllaça amb aquesta equació"
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "l'inventari intersphinx s'ha mogut: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "s'està carregant l'inventari intersphinx des de %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "s'han trobat alguns problemes amb alguns dels inventaris, però tenien alternatives funcionals:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "s'ha fallat en arribar a cap dels inventaris amb els problemes següents:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(a %s versió %s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(a %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "no es troba l'inventari per a la referència creuada externa: %s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "no es troba el rol per a la referència creuada externa: %s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "%s externa: no es troba la destinació de la referència %s: %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "l'identificador %r d'intersphinx no és una cadena. S'ignora"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "Ha fallat en llegir intersphinx_mapping[%s], s'ignora: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[font]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Tasca pendent"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "S'ha trobat una entrada TODO: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<entrada original>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(L'<<original entry>> es troba a %s, línia %d)."
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "entrada original"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "s'està ressaltant el codi del mòdul... "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[documents]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Codi del mòdul"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Codi font per a %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Vista general: codi del mòdul"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Tots els mòduls per als quals hi ha codi</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "valor no vàlid per a l'opció de l'ordre de membre: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "valor no vàlid per a l'opció des de la documentació de classes: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "signatura no vàlida per a auto%s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "error mentre es donava format als arguments per a %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc: ha fallat en determinar %s. %s (%r) que s'ha de documentar, s'ha plantejat l'excepció següent:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "es desconeix quin és el mòdul que s'importarà per al document automàtic %r (proveu de col·locar una directiva «module» o «currentmodule» en el document o doneu-li un nom explícit al mòdul)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "S'ha detectat un objecte simulat: %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "error mentre es donava format a la signatura per a %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "«::» en el nom de l'«automodule» no té sentit"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "arguments de signatura o anotació de retorn indicats per a «automodule» %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ ha de ser una llista de cadenes, no %r (en el mòdul %s) -s'ignora __all__-"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "manca l'atribut esmentat a l'opció «:members:»: mòdul %s, atribut %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "Ha fallat en obtenir una signatura de funció per a %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "Ha fallat en obtenir un constructor de funció per a %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Bases: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "manca l'atribut %s a l'objecte %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "àlies de %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "àlies de TypeVar(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "Ha fallat en obtenir una signatura de mètode per a %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "S'han trobat __slots__ no vàlids a %s. S'ignora."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "Ha fallat en analitzar un valor d'argument predeterminat per a %r: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "Ha fallat en actualitzar la signatura per a %r: no es troba el paràmetre: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "Ha fallat en analitzar type_comment per a %r: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "referències autosummary excloses del document %r. S'ignora."
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary: no s'ha trobat el fitxer stub %r. Verifiqueu la vostra configuració autosummary_generate."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "Un resum automàtic amb subtítols requereix l'opció «:toctree:». S'ignora."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "autosummary: ha fallat en importar %s.\nPossibles pistes:\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "ha fallat en analitzar el nom %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "ha fallat en importar l'objecte %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: no s'ha trobat el fitxer: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary genera els fitxers .rst internament. Però el vostre source_suffix no en conté. S'omet."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary: ha fallat en determinar %r que s'ha de documentar, s'ha plantejat l'excepció següent:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] s'està generant autosummary per a: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] s'està escrivint a %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary]: ha fallat en importar %s.\nPossibles pistes:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nGenera ReStructuredText mitjançant directrius de resum automàtic «autosummary».\n\n«sphinx-autogen» és un frontal per a sphinx.ext.autosummary.generate.\nGenera els fitxers en reStructuredText des de les directrius d'autosummary\ncontingudes en els fitxers d'entrada indicats.\n\nEl format de les directrius d'autosummary està documentat en el mòdul\n``sphinx.ext.autosummary`` de Python i es pot llegir mitjançant l'ordre següent::\n\npydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "fitxers font per a generar els fitxers rST per a"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "directori per a col·locar tota la sortida a"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "sufix predeterminat per als fitxers (predeterminat: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "directori de plantilles personalitzades (predeterminat: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "document de membres importats (predeterminat: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "documenta exactament els membres en l'atribut __all__ del mòdul. (predeterminat: %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Arguments de paraules clau"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Exemple"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Exemples"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Notes"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Altres paràmetres"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "Rebudes"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Referències"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Avisos"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Rendiments"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "conjunt de valors no vàlid (manca el claudàtor de tancament): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "conjunt de valors no vàlid (manca el claudàtor d'obertura): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "Cadena incorrecta literal (manquen les cometes de tancament): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "Cadena incorrecta literal (manquen les cometes d'obertura): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Atenció"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Compte"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Perill"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Error"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Suggeriment"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Important"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Vegeu també"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Truc"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Avís"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "ve de la pàgina anterior"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "continua a la pàgina següent"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "No alfabètic"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Números"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "pàgina"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Taula de continguts"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Cerca"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Ves a"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Mostra el codi font"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Vista general"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Us donem la benvinguda! Això és"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "la documentació per a"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "darrera actualització"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Ãndexs i taules:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Taula de contingut completa"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "llista totes les seccions i subseccions"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "cerca aquesta documentació"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Ãndex global de mòduls"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "accés ràpid a tots els mòduls"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "totes les funcions, classes, termes"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndex &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Ãndex complet en una pàgina"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Pàgines d'índex per lletra"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "pot ser gegant"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navegació"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Cerca dins de %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Quant a aquests documents"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr "&#169; %(copyright_prefix)s %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Darrera actualització el %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "Creada mitjançant <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Cercar a %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Tema anterior"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "capítol anterior"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Tema següent"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "capítol següent"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Activa JavaScript per a usar la funcionalitat\n de cerca."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Cercar múltiples paraules només mostrarà les coincidències\n que continguin totes les paraules."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "cerca"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Resultats de la cerca"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 vostra cerca no ha coincidit amb cap document. Assegureu-vos que s'escriuen correctament totes les paraules i que heu seleccionat prou categories."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Cerca ràpida"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Aquesta pàgina"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Canvis en la versió %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Llista de canvis de la versió %(version)s generada automàticament"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Canvis a la biblioteca"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Canvis a l'API de C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Altres canvis"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "Cerca acabada, s'han trobat ${resultCount} pàgines que coincideixen amb la consulta de cerca."
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "S'està cercant"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "S'està preparant la cerca..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", a "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Oculta els resultats de cerca"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Redueix la barra lateral"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Expandeix la barra lateral"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Contingut"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr "no s'ha pogut calcular el progrés de la traducció!"
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr "No hi ha cap element traduït!"
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "S'ha trobat un índex basat en 4 columnes. Pot ser un error de les extensions que utilitzeu: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "La nota al peu [%s] no té una referència."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "La nota al peu [núm.] no té una referència."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referències incoherents de nota al peu en el missatge traduït. Original: {0}, traduït: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "referències incoherents en el missatge traduït. Original: {0}, traduït: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referències incoherents de citació en el missatge traduït. Original: {0}, traduït: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referències incoherents de terme en el missatge traduït. Original: {0}, traduït: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "No s'ha pogut determinar el text alternatiu per a la referència creuada. Podria ser un error."
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "s'ha trobat més d'una destinació per a «any» en la referència creuada %r: podria ser %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s no es troba la destinació de la referència: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r no es troba la destinació de la referència: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "No s'ha pogut recuperar la imatge remota: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "No s'ha pogut recuperar la imatge remota: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Format d'imatge desconegut: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "caràcters font no codificables, substituint per «?»: %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "s'omet"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "ha fallat"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "Problema en el domini %s: se suposa que el camp usa el rol «%s», però no es troba en el domini."
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "directiva o nom de rol desconegut: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "tipus de node desconegut: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "error de lectura: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "error d'escriptura: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr "locale_dir %s no existeix"
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Format de data no vàlid. Citeu la cadena amb cometes senzilles si voleu generar-la directament: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr "%r està en desús per a les entrades d'índex (des de l'entrada %r). En el seu lloc useu «pair: %s»."
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "el toctree conté una referència cap al fitxer %r que no existeix"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "excepció mentre només s'avaluava l'expressió directiva: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "no s'ha trobat el rol predeterminat %s"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr "Enllaça amb aquesta definició"
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format no s'ha definit per a %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Qualsevol ID no assignat per al node %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr "Enllaça amb aquest terme"
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr "Enllaça amb aquesta capçalera"
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr "Enllaça amb aquesta taula"
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr "Enllaça amb aquest codi"
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr "Enllaça amb aquesta imatge"
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr "Enllaça amb aquest toctree"
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "No s'ha pogut obtenir la mida de la imatge. S'ignora l'opció «:scale:»."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "%r toplevel_sectioning desconegut per a la classe %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: massa gran, s'ignora."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "el títol del document no és només un node de text"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "el node del títol no s'ha trobat en la secció, tema, taula, advertiment o nota al marge"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Notes al peu"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "s'indiquen tant les columnes tabulars com l'opció «:widths:». S'ignora l'opció «:widths:»."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "la unitat de dimensió %s no és vàlida. S'ignora."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "s'ha trobat el tipus d'entrada %s amb un índex desconegut"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[imatge: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[imatge]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "el subtítol no es troba dins d'una figura."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "tipus de node sense implementar: %r"
diff --git a/sphinx/locale/cak/LC_MESSAGES/sphinx.js b/sphinx/locale/cak/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..a334f37
--- /dev/null
+++ b/sphinx/locale/cak/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "None",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", pa",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "Konojel cholwuj",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "Cholwuj",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "Ruxaq wuj re'",
+ "Welcome! This is": "\u00dctz apet\u00efk! Wawe' k'o",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": "ri wuj richin"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/cak/LC_MESSAGES/sphinx.mo b/sphinx/locale/cak/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..0adb8c6
--- /dev/null
+++ b/sphinx/locale/cak/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/cak/LC_MESSAGES/sphinx.po b/sphinx/locale/cak/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..503a89b
--- /dev/null
+++ b/sphinx/locale/cak/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Julien Malard <julien.malard@mail.mcgill.ca>, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Julien Malard <julien.malard@mail.mcgill.ca>, 2019\n"
+"Language-Team: Kaqchikel (http://app.transifex.com/sphinx-doc/sphinx-1/language/cak/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: cak\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "xk'isïk"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "sachoj: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Ruwachib'äl %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Kik'ajtz'ïk %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "tajin nutz'ib'aj"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(chupam"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Konojel cholwuj"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "cholwuj"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "jun chïk"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "chi rij kan"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Cholwuj"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Rusachoj nuk'unem:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Rusachoj kamulunem:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Ütz apetïk pa rokisanem runuk'ik Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Rub'i' samäj"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Kib'i' ajtz'ib'anel(a')"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Rujalwäch samäj"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Ruch'ab'äl samaj"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Jalajöj"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "retal jalöj"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "Ruwäch"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Retal jalöj"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "wuj"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "tatz'u %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "tatz'u chuqa' %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(chupam %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Chi tiqib'ana'"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(Ri <<original entry>> k'o chupam %s, pa juch' %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Tz'etb'äl"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Tz'etb'äl"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Jalajöj chïk"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Sachoj"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Tatz'u chuqa'"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Ajilanïk"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Ütz apetïk! Wawe' k'o"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "ri wuj richin"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Ruxaq wuj re'"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", pa"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "rusachoj rusik'inïk: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "rusachoj rutz'ib'axïk: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[wachib'äl: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[wachib'äl]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.js b/sphinx/locale/cs/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..6423fdf
--- /dev/null
+++ b/sphinx/locale/cs/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "cs",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", v ",
+ "About these documents": "O t\u011bchto dokumentech",
+ "Automatically generated list of changes in version %(version)s": "Automaticky generovan\u00fd seznam zm\u011bn ve verzi %(version)s",
+ "C API changes": "Zm\u011bny API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Sbalit bo\u010dn\u00ed li\u0161tu",
+ "Complete Table of Contents": "Celkov\u00fd obsah",
+ "Contents": "Obsah",
+ "Copyright": "Ve\u0161ker\u00e1 pr\u00e1va vyhrazena",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Rozbalit bo\u010dn\u00ed li\u0161tu",
+ "Full index on one page": "Cel\u00fd rejst\u0159\u00edk na jedn\u00e9 str\u00e1nce",
+ "General Index": "Obecn\u00fd rejst\u0159\u00edk",
+ "Global Module Index": "Celkov\u00fd rejst\u0159\u00edk modul\u016f",
+ "Go": "OK",
+ "Hide Search Matches": "Skr\u00fdt v\u00fdsledky vyhled\u00e1v\u00e1n\u00ed",
+ "Index": "Rejst\u0159\u00edk",
+ "Index &ndash; %(key)s": "Rejst\u0159\u00edk &ndash; %(key)s",
+ "Index pages by letter": "Rejst\u0159\u00edk podle p\u00edsmene",
+ "Indices and tables:": "Rejst\u0159\u00edky a tabulky:",
+ "Last updated on %(last_updated)s.": "Aktualizov\u00e1no dne %(last_updated)s.",
+ "Library changes": "Zm\u011bny v knihovn\u00e1ch",
+ "Navigation": "Navigace",
+ "Next topic": "Dal\u0161\u00ed t\u00e9ma",
+ "Other changes": "Ostatn\u00ed zm\u011bny",
+ "Overview": "P\u0159ehled",
+ "Please activate JavaScript to enable the search\n functionality.": "Pro podporu vyhled\u00e1v\u00e1n\u00ed aktivujte JavaScript.",
+ "Preparing search...": "Vyhled\u00e1v\u00e1n\u00ed se p\u0159ipravuje...",
+ "Previous topic": "P\u0159echoz\u00ed t\u00e9ma",
+ "Quick search": "Rychl\u00e9 vyhled\u00e1v\u00e1n\u00ed",
+ "Search": "Vyhled\u00e1v\u00e1n\u00ed",
+ "Search Page": "Vyhled\u00e1vac\u00ed str\u00e1nka",
+ "Search Results": "V\u00fdsledky vyhled\u00e1v\u00e1n\u00ed",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Prohledat %(docstitle)s",
+ "Searching": "Prob\u00edh\u00e1 vyhled\u00e1n\u00ed",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Uk\u00e1zat zdroj",
+ "Table of Contents": "",
+ "This Page": "Tato str\u00e1nka",
+ "Welcome! This is": "V\u00edtejte! Toto je",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Vyhled\u00e1v\u00e1n\u00ed nenalezlo \u017e\u00e1dn\u00fd odpov\u00eddaj\u00edc\u00ed dokument. Ujist\u011bte se, \u017ee jste v\u0161echna slova zapsal/a spr\u00e1vn\u011b a \u017ee jste vybral/a dostatek kategori\u00ed.",
+ "all functions, classes, terms": "v\u0161echny funkce, t\u0159\u00eddy, term\u00edny",
+ "can be huge": "m\u016f\u017ee b\u00fdt obrovsk\u00fd",
+ "last updated": "naposledy aktualizov\u00e1no",
+ "lists all sections and subsections": "seznam v\u0161ech sekc\u00ed a podsekc\u00ed",
+ "next chapter": "dal\u0161\u00ed kapitola",
+ "previous chapter": "p\u0159edchoz\u00ed kapitola",
+ "quick access to all modules": "rychl\u00fd p\u0159\u00edstup ke v\u0161em modul\u016fm",
+ "search": "hledat",
+ "search this documentation": "prohledat tuto dokumentaci",
+ "the documentation for": "dokumentace pro"
+ },
+ "plural_expr": "(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3"
+}); \ No newline at end of file
diff --git a/sphinx/locale/cs/LC_MESSAGES/sphinx.mo b/sphinx/locale/cs/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..84585aa
--- /dev/null
+++ 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
new file mode 100644
index 0000000..ae63f85
--- /dev/null
+++ b/sphinx/locale/cs/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008
+# Vilibald W. <vilibald.wanca@gmail.com>, 2014-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Vilibald W. <vilibald.wanca@gmail.com>, 2014-2015\n"
+"Language-Team: Czech (http://app.transifex.com/sphinx-doc/sphinx-1/language/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Obr. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabulka %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Výpis %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Vestavěné funkce"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Úroveň modulu"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (v "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Obecný rejstřík"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "rejstřík"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "další"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "předchozí"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Dokumentace pro %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Rejstřík"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Vydání"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor sekce: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor modulu: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor kódu:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Vrací"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Typ návratové hodnoty"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "Älen"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "proměnná"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkce"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "typ"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nové ve verzi %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Změněno ve verzi %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastaralé od verze %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Vyvolá"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "třída"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vestavěná funkce)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metoda %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (třída)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globální proměnná nebo konstanta)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atribut %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumenty"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metoda"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Proměnné"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Vyvolá"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (v modulu %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (vestavěná proměnná)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (vestavěná třída)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (třída v %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (třídní metoda %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statická metoda %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Rejstřík modulů Pythonu"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduly"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Zastaralé"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "výjimka"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "třídní metoda"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statická metoda"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (zastaralé)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (role)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktiva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "role"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "proměnná prostředí; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "termín v glosáři"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "token gramatiky"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "referenÄní návÄ›stí"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "proměnná prostředí"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "volba programu"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Rejstřík modulů"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Vyhledávací stránka"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "viz %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "viz také %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symboly"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graf: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graf]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(v %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[zdroj]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "původní záznam"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumentace]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Kód modulu"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Zdrojový kód pro %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Přehled: kód modulu"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Všechny moduly s dostupným kódem</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Výstraha"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Upozornění"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "NebezpeÄí"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Chyba"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Rada"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Důležité"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Poznámka"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Viz také"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Varování"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "pokraÄujte na pÅ™edchozí stránce"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Vyhledávání"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "OK"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Ukázat zdroj"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Přehled"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Vítejte! Toto je"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentace pro"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "naposledy aktualizováno"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Rejstříky a tabulky:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Celkový obsah"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "seznam všech sekcí a podsekcí"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "prohledat tuto dokumentaci"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Celkový rejstřík modulů"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "rychlý přístup ke všem modulům"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "všechny funkce, třídy, termíny"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Rejstřík &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Celý rejstřík na jedné stránce"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Rejstřík podle písmene"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "může být obrovský"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigace"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Prohledat %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "O těchto dokumentech"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Veškerá práva vyhrazena"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Aktualizováno dne %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Prohledat %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Přechozí téma"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "předchozí kapitola"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Další téma"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "další kapitola"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Pro podporu vyhledávání aktivujte JavaScript."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "hledat"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Výsledky vyhledávání"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Vyhledávání nenalezlo žádný odpovídající dokument. Ujistěte se, že jste všechna slova zapsal/a správně a že jste vybral/a dostatek kategorií."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Rychlé vyhledávání"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Tato stránka"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automaticky generovaný seznam změn ve verzi %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Změny v knihovnách"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Změny API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostatní změny"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Probíhá vyhledání"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Vyhledávání se připravuje..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", v "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Skrýt výsledky vyhledávání"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Sbalit boÄní liÅ¡tu"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Rozbalit boÄní liÅ¡tu"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Obsah"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Poznámky pod Äarou"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[obrázek: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[obrázek]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/cy/LC_MESSAGES/sphinx.js b/sphinx/locale/cy/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..887b9fa
--- /dev/null
+++ b/sphinx/locale/cy/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "cy",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", yn ",
+ "About these documents": "Yngl\u0177n \u00e2'r dogfennau hyn",
+ "Automatically generated list of changes in version %(version)s": "Rhestr o newidiadau yn fersiwn %(version)s wedi'i cynhyrchu'n awtomatig",
+ "C API changes": "Newidiadau i'r C-API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Cyfangu'r bar ochr",
+ "Complete Table of Contents": "Tabl Cynnwys Llawn",
+ "Contents": "Cynnwys",
+ "Copyright": "Hawlfraint",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Ehangu'r bar ochr",
+ "Full index on one page": "Indecs llawn ar un tudalen",
+ "General Index": "Indecs cyffredinol",
+ "Global Module Index": "Indecs Modiwl Byd-Eang",
+ "Go": "Ewch",
+ "Hide Search Matches": "Cuddio Canlyniadau Chwilio",
+ "Index": "Indecs",
+ "Index &ndash; %(key)s": "Indecs &ndash; %(key)s",
+ "Index pages by letter": "Indecs tudalennau gan lythyren",
+ "Indices and tables:": "Indecsau a tablau:",
+ "Last updated on %(last_updated)s.": "Diweddarwyd yn ddiwethaf ar %(last_updated)s.",
+ "Library changes": "Newidiadau i'r llyfrgell",
+ "Navigation": "Llywio",
+ "Next topic": "Pwnc nesaf",
+ "Other changes": "Newidiadau arall",
+ "Overview": "Trosolwg",
+ "Please activate JavaScript to enable the search\n functionality.": "Trwoch JavaScript ymlaen i alluogi'r chwilio.",
+ "Preparing search...": "Paratoi chwilio...",
+ "Previous topic": "Pwnc blaenorol",
+ "Quick search": "Chwilio cyflym",
+ "Search": "Chwilio",
+ "Search Page": "Tudalen Chwilio",
+ "Search Results": "Canlyniadau chwilio",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Chwilio o fewn %(docstitle)s",
+ "Searching": "Yn chwilio",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Dangos Ffynhonell",
+ "Table of Contents": "",
+ "This Page": "Y Dudalen Hon",
+ "Welcome! This is": "Croeso! Dyma",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Nid yw eich chwiliad yn cyfateb unrhyw ddogfennau. Gwnewch yn si\u0175r fod pob gair wedi'i sillafu'n gywir, ac eich bod wedi dewis digon o gategor\u00efau.",
+ "all functions, classes, terms": "holl ffwythiannau, dosbarthau a thermau",
+ "can be huge": "gall fod yn enfawr",
+ "last updated": "diweddarwyd yn ddiwethaf",
+ "lists all sections and subsections": "rhestru holl adrannau ac isadrannau",
+ "next chapter": "pennod nesaf",
+ "previous chapter": "pennod blaenorol",
+ "quick access to all modules": "mynediad cloi i bob modiwl",
+ "search": "chwilio",
+ "search this documentation": "chwiliwch y ddogfennaeth",
+ "the documentation for": "y dogfennaeth am"
+ },
+ "plural_expr": "(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3"
+}); \ No newline at end of file
diff --git a/sphinx/locale/cy/LC_MESSAGES/sphinx.mo b/sphinx/locale/cy/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..343e8b0
--- /dev/null
+++ b/sphinx/locale/cy/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/cy/LC_MESSAGES/sphinx.po b/sphinx/locale/cy/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..4b9cc94
--- /dev/null
+++ b/sphinx/locale/cy/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2016
+# Geraint Palmer <palmer.geraint@googlemail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Geraint Palmer <palmer.geraint@googlemail.com>, 2016\n"
+"Language-Team: Welsh (http://app.transifex.com/sphinx-doc/sphinx-1/language/cy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: cy\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Ffig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabl %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Listing %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Lefel modiwl"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (yn "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Indecs cyffredinol"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indecs"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "nesaf"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "blaenorol"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Dogfennaeth %s %s "
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indecs"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Rhyddhad"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Awdur yr adran:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Awdur y fodiwl:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Awdur y cod:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Awdur:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Paramedrau"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "aelod"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "ffwythiant"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Newydd yn fersiwn %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Wedi newid yn fersiwn %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Dibrisiwyd ers fersiwn %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (newidyn byd-eang neu cysonyn)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modiwl"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Indecs Modiwlau"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Tudalen Chwilio"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "gweler %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "gweler hefyd %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symbolau"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graff: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graff]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(yn %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[ffynhonnell]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "eitem wreiddiol"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Cod y modiwl"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Cod ffynhonnell ar gyfer %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Trosolwg: cod y modiwl"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Holl fodiwlau lle mae'r cod ar gael</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Sylw"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Gofal"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Perygl"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Gwall"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Awgrym"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Pwysig"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Nodyn"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Gweler hefyd"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Awgrym"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Rhybudd"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "wedi'i barhau o'r tudalen blaenorol"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Chwilio"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Ewch"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Dangos Ffynhonell"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Trosolwg"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Croeso! Dyma"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "y dogfennaeth am"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "diweddarwyd yn ddiwethaf"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indecsau a tablau:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Tabl Cynnwys Llawn"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "rhestru holl adrannau ac isadrannau"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "chwiliwch y ddogfennaeth"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Indecs Modiwl Byd-Eang"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "mynediad cloi i bob modiwl"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "holl ffwythiannau, dosbarthau a thermau"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indecs &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Indecs llawn ar un tudalen"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indecs tudalennau gan lythyren"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "gall fod yn enfawr"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Llywio"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Chwilio o fewn %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Ynglŷn â'r dogfennau hyn"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Hawlfraint"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Diweddarwyd yn ddiwethaf ar %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Chwilio %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Pwnc blaenorol"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "pennod blaenorol"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Pwnc nesaf"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "pennod nesaf"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Trwoch JavaScript ymlaen i alluogi'r chwilio."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "chwilio"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Canlyniadau chwilio"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Nid yw eich chwiliad yn cyfateb unrhyw ddogfennau. Gwnewch yn siŵr fod pob gair wedi'i sillafu'n gywir, ac eich bod wedi dewis digon o gategorïau."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Chwilio cyflym"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Y Dudalen Hon"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Rhestr o newidiadau yn fersiwn %(version)s wedi'i cynhyrchu'n awtomatig"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Newidiadau i'r llyfrgell"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Newidiadau i'r C-API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Newidiadau arall"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Yn chwilio"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Paratoi chwilio..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", yn "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Cuddio Canlyniadau Chwilio"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Cyfangu'r bar ochr"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Ehangu'r bar ochr"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Cynnwys"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Troednodiadau"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[delwedd: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[delwedd]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.js b/sphinx/locale/da/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..4a0a13f
--- /dev/null
+++ b/sphinx/locale/da/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "da",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", i",
+ "About these documents": "Om disse dokumenter",
+ "Automatically generated list of changes in version %(version)s": "Automatisk oprettet liste af \u00e6ndringer i version %(version)s",
+ "C API changes": "\u00c6ndringer i C-API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u00c6ndringer i version %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Sammenfold sidebj\u00e6lke",
+ "Complete Table of Contents": "Fuldst\u00e6ndig indholdsfortegnelse",
+ "Contents": "Indhold",
+ "Copyright": "Ophavsret",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Udfold sidebj\u00e6lke",
+ "Full index on one page": "Fuldt indeks p\u00e5 \u00e9n side",
+ "General Index": "Generelt indeks",
+ "Global Module Index": "Globalt modulindeks",
+ "Go": "S\u00f8g",
+ "Hide Search Matches": "Skjul s\u00f8geresultater",
+ "Index": "Indeks",
+ "Index &ndash; %(key)s": "Indeks &ndash; %(key)s",
+ "Index pages by letter": "Indeks\u00e9r sider efter bogstav",
+ "Indices and tables:": "Indeks og tabeller:",
+ "Last updated on %(last_updated)s.": "Sidst opdateret %(last_updated)s.",
+ "Library changes": "Biblioteks\u00e6ndringer",
+ "Navigation": "Navigation",
+ "Next topic": "N\u00e6ste emne",
+ "Other changes": "Andre \u00e6ndringer",
+ "Overview": "Oversigt",
+ "Please activate JavaScript to enable the search\n functionality.": "Aktiv\u00e9r venligst JavaScript for at aktivere\n s\u00f8gefunktionalitet.",
+ "Preparing search...": "Forbereder s\u00f8gning...",
+ "Previous topic": "Forrige emne",
+ "Quick search": "Hurtig s\u00f8gning",
+ "Search": "S\u00f8g",
+ "Search Page": "S\u00f8geside",
+ "Search Results": "S\u00f8geresultater",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "S\u00f8g i %(docstitle)s",
+ "Searching": "S\u00f8ger",
+ "Searching for multiple words only shows matches that contain\n all words.": "Bem\u00e6rk: Hvis du s\u00f8ger efter flere ord, vises kun resultater der indeholder alle ordene.",
+ "Show Source": "Vis kilde",
+ "Table of Contents": "",
+ "This Page": "Denne side",
+ "Welcome! This is": "Velkommen! Dette er",
+ "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 matchede ikke nogen dokumenter. Sikr dig at alle ord er stavet korrekt og at du har valgt nok kategorier.",
+ "all functions, classes, terms": "alle funktioner, klasser, begreber",
+ "can be huge": "kan v\u00e6re enormt",
+ "last updated": "sidst opdateret",
+ "lists all sections and subsections": "viser alle afsnit og underafsnit",
+ "next chapter": "n\u00e6ste kapitel",
+ "previous chapter": "forrige kapitel",
+ "quick access to all modules": "hurtig adgang til alle moduler",
+ "search": "s\u00f8g",
+ "search this documentation": "s\u00f8g i denne dokumentation",
+ "the documentation for": "dokumentationen for"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/da/LC_MESSAGES/sphinx.mo b/sphinx/locale/da/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..55497d6
--- /dev/null
+++ 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
new file mode 100644
index 0000000..68cfd89
--- /dev/null
+++ b/sphinx/locale/da/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3698 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# askhl <asklarsen@gmail.com>, 2010-2011
+# Jakob Lykke Andersen <jakob@caput.dk>, 2014,2016
+# Joe Hansen <joedalton2@yahoo.dk>, 2016,2019
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2021
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Komiya Takeshi <i.tkomiya@gmail.com>, 2021\n"
+"Language-Team: Danish (http://app.transifex.com/sphinx-doc/sphinx-1/language/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Kan ikke finde kildemappen (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Kildemappe og destinationsmappe kan ikke være identiske"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Kører Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Dette projekt kræver mindst Sphinx v%s og kan derfor ikke bygges med denne version."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "indlæser oversættelser [%s] ..."
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "færdig"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "ikke tilgængelig for indbyggede beskeder"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "fejlede: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "lykkedes"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "færdig med problemer"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "kompilering %s, %s advarsel."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "kompilering %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "konfigurationsmappe indeholder ikke en conf.py-fil (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Ingen sådan konfigurationsværdi: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Konfigurationsværdien %r er allerede til stede"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "figur %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "tabel %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Kildekode %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r blev ikke fundet, ignorerer."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Ukendt hændelsesnavn: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domænet %s er allerede registreret"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "Rollen %r er allerede registreret til domæne %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser for %r er allerede registreret"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Kunne ikke importere udvidelse %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Udvidelsen %s brugt af dette projekt kræver mindst Sphinx v%s; den kan derfor ikke bygges med denne version."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "læser kilder ..."
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "forbereder dokumenter"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Indbyggede"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modulniveau"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "konfigurationsværdien »epub_contributor« bør ikke være tom for EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "ugyldig css_file: %r, ignoreret"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Beskedkatalogerne er i %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "læser skabeloner ..."
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "skriver beskedkataloger ..."
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML-siden er i %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (i "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTML-siderne er i %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d. %b, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Generelt indeks"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indeks"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "næste"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "forrige"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "kan ikke kopiere statisk fil %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "udgyldig js_file: %r, ignoreret"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon-filen %r findes ikke"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentation"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Udgave"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Kodningsfejl:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Indtast venligst noget tekst."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Indtast venligst enten »y« eller »n«."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Indtast venligt et filsuffiks, f.eks. ».rst« eller ».txt«"
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Filen %s findes allerede, udelader."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "opret ikke makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "skabelonmappe for skabelonfiler"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Afsnitsforfatter: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Modulforfatter: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Kodeforfatter: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Forfatter: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametre"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Returnerer"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Returtype"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "medlem"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variabel"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funktion"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "optæl"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "optælling"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "type"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Ny i version %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Ændret i version %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Forældet siden version %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Template-parametre"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Kaster"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klasse"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "koncept"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (indbygget funktion)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metode i %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasse)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variabel eller konstant)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (attribut i %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Parametre"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metode"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variable"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Rejser"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (i modulet %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (i modulet %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (indbygget variabel)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (indbygget klasse)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasse i %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (klassemetode i %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statisk metode i %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python-modulindeks"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduler"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Forældet"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "undtagelse"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klassemetode"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statisk metode"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (forældet)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiv)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rolle)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktiv"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rolle"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "miljøvariabel; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "begreb i ordliste"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "grammatisk element"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "referenceetiket"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "miljøvariabel"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programtilvalg"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "dokument"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Modulindeks"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Søgeside"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "ny konfiguration"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "udvidelser ændret"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "kildemappe er ændret"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "se %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "se også %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symboler"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "overskriv eksisterende filer"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s er ikke en mappe"
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graf: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graf]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(i %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[kilde]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<oprindeligt punkt>>"
+
+#: sphinx/ext/todo.py:160
+#, 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:170
+msgid "original entry"
+msgstr "oprindeligt punkt"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dok]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modulkode"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Kildekode for %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Oversigt: modulkode"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Alle moduler, der er kode tilgængelig for</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Nøgleordsargumenter"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Eksempler"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Andre parametre"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Referencer"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Vær opmærksom"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Forsigtig"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Fare"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Fejl"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Fif"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Vigtigt"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Bemærk"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Se også"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Advarsel"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "fortsat fra forrige side"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "fortsætter på næste side"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "side"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Søg"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Søg"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Vis kilde"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Oversigt"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Velkommen! Dette er"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentationen for"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "sidst opdateret"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indeks og tabeller:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Fuldstændig indholdsfortegnelse"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "viser alle afsnit og underafsnit"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "søg i denne dokumentation"
+
+#: 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:31
+msgid "all functions, classes, terms"
+msgstr "alle funktioner, klasser, begreber"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeks &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Fuldt indeks på én side"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indeksér sider efter bogstav"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "kan være enormt"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Søg i %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Om disse dokumenter"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Ophavsret"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Sidst opdateret %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Søg i %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Forrige emne"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "forrige kapitel"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Næste emne"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "næste kapitel"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Aktivér venligst JavaScript for at aktivere\n søgefunktionalitet."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Bemærk: Hvis du søger efter flere ord, vises kun resultater der indeholder alle ordene."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "søg"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Søgeresultater"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 matchede ikke nogen dokumenter. Sikr dig at alle ord er stavet korrekt og at du har valgt nok kategorier."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Hurtig søgning"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Denne side"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Ændringer i version %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisk oprettet liste af ændringer i version %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Biblioteksændringer"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Ændringer i C-API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andre ændringer"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Søger"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Forbereder søgning..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", i"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Skjul søgeresultater"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Sammenfold sidebjælke"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Udfold sidebjælke"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Indhold"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Fodnoter"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[billede: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[billede]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.js b/sphinx/locale/de/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..2106c7d
--- /dev/null
+++ b/sphinx/locale/de/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "de",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", in ",
+ "About these documents": "\u00dcber dieses Dokument",
+ "Automatically generated list of changes in version %(version)s": "Automatisch generierte Liste der \u00c4nderungen in Version %(version)s",
+ "C API changes": "C API-\u00c4nderungen",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Seitenleiste einklappen",
+ "Complete Table of Contents": "Vollst\u00e4ndiges Inhaltsverzeichnis",
+ "Contents": "Inhalt",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Seitenleiste ausklappen",
+ "Full index on one page": "Gesamtes Stichwortverzeichnis auf einer Seite",
+ "General Index": "Stichwortverzeichnis",
+ "Global Module Index": "Globaler Modulindex",
+ "Go": "Los",
+ "Hide Search Matches": "Suchergebnisse ausblenden",
+ "Index": "Stichwortverzeichnis",
+ "Index &ndash; %(key)s": "Stichwortverzeichnis &ndash; %(key)s",
+ "Index pages by letter": "Stichwortverzeichnis nach Anfangsbuchstabe",
+ "Indices and tables:": "Verzeichnisse und Tabellen:",
+ "Last updated on %(last_updated)s.": "Zuletzt aktualisiert am %(last_updated)s.",
+ "Library changes": "Bibliotheks-\u00c4nderungen",
+ "Navigation": "Navigation",
+ "Next topic": "N\u00e4chstes Thema",
+ "Other changes": "Andere \u00c4nderungen",
+ "Overview": "\u00dcbersicht",
+ "Please activate JavaScript to enable the search\n functionality.": "Bitte aktivieren Sie JavaScript, wenn Sie die Suchfunktion nutzen wollen.",
+ "Preparing search...": "Suche wird vorbereitet...",
+ "Previous topic": "Vorheriges Thema",
+ "Quick search": "Schnellsuche",
+ "Search": "Suche",
+ "Search Page": "Suche",
+ "Search Results": "Suchergebnisse",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Suche in %(docstitle)s",
+ "Searching": "Suchen",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Quellcode anzeigen",
+ "Table of Contents": "Inhaltsverzeichnis",
+ "This Page": "Diese Seite",
+ "Welcome! This is": "Willkommen! Dies ist",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Ihre Suche ergab keine Treffer. Bitte stellen Sie sicher, dass alle W\u00f6rter richtig geschrieben sind und gen\u00fcgend Kategorien ausgew\u00e4hlt sind.",
+ "all functions, classes, terms": "alle Funktionen, Klassen, Begriffe",
+ "can be huge": "kann gro\u00df sein",
+ "last updated": "zuletzt aktualisiert",
+ "lists all sections and subsections": "Liste aller Kapitel und Unterkapitel",
+ "next chapter": "n\u00e4chstes Kapitel",
+ "previous chapter": "vorheriges Kapitel",
+ "quick access to all modules": "schneller Zugriff auf alle Module",
+ "search": "suchen",
+ "search this documentation": "durchsuche diese Dokumentation",
+ "the documentation for": "die Dokumentation f\u00fcr"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/de/LC_MESSAGES/sphinx.mo b/sphinx/locale/de/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..e06ab48
--- /dev/null
+++ 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
new file mode 100644
index 0000000..5909ab3
--- /dev/null
+++ b/sphinx/locale/de/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3698 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Georg Brandl <g.brandl@gmx.net>, 2013-2015
+# Jean-François B. <jfbu@free.fr>, 2018
+# Lukas Prokop <admin@lukas-prokop.at>, 2016-2018
+# Michael Hierweck <michael@hierweck.de>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Jean-François B. <jfbu@free.fr>, 2018\n"
+"Language-Team: German (http://app.transifex.com/sphinx-doc/sphinx-1/language/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Kann Quellverzeichnis nicht finden (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Quellverzeichnis und Zielverzeichnis können nicht identisch sein"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx v%s in Verwendung"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Dieses Projekt benötigt Version %s oder später und kann daher nicht gebaut werden."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "Lade Übersetzungen [%s]…"
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "erledigt"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "nicht verfügbar für vordefinierte Nachrichten"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "Fehlgeschlagen: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Kein builder ausgewählt, verwende 'html' per default"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "abgeschlossen"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "mit Problemen beendet"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "Die Erweiterung %s gibt nicht an ob paralleles Datenlesen fehlerfrei möglich ist, es wird daher nicht davon ausgegangen - bitte kontaktiere den Erweiterungsautor zur Überprüfung und Angabe"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "Die Erweiterung %s gibt nicht an ob paralleles Datenschreiben fehlerfrei möglich ist, es wird daher nicht davon ausgegangen - bitte kontaktiere den Erweiterungsautor zur Überprüfung und Angabe"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "Konfigurationsverzeichnis enthält keine conf.py Datei (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "Ungültige Nummer %r for Konfiguration %r, wird ignoriert"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Keine solche Konfigurationseinstellung: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Konfigurationswert %r bereits gesetzt"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Abschnitt %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Abb. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tab. %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Quellcode %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r nicht gefunden, daher ignoriert."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Event %r bereits verfügbar"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Unbekannter Event name: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Pygments Lexer Name %r ist unbekannt"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Ursprüngliche Ausnahme:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modulebene"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (in "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Stichwortverzeichnis"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "Index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "weiter"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "zurück"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s Dokumentation"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Stichwortverzeichnis"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor des Abschnitts: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor des Moduls: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor des Quellcode: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s-%s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parameter"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Rückgabe"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Rückgabetyp"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "Member"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "Variable"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "Funktion"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "Makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "Aufzählung"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "Enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "Typ"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Neu in Version %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Geändert in Version %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Veraltet ab Version %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Template Parameter"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Wirft"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "Klasse"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (Standard-Funktion)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (Methode von %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (Klasse)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globale Variable oder Konstante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (Attribut von %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Parameter"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (Modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "Methode"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "Wert"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "Attribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "Modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variablen"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Verursacht"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (im Modul %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in Modul %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (Standard-Variable)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (Builtin-Klasse)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (Klasse in %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (Klassenmethode von %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statische Methode von %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python-Modulindex"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "Module"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Veraltet"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "Exception"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "Klassenmethode"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statische Methode"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (veraltet)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (Direktive)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (Rolle)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "Direktive"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "Rolle"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "Umgebungsvariable; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "Glossareintrag"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "Grammatik-Token"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "Referenz-Label"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "Umgebungsvariable"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "Programmoption"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Modulindex"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Suche"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "siehe %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "siehe auch %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Sonderzeichen"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[Diagramm: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[Diagramm]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(in %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[Quellcode]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Zu tun"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<ursprüngliche Eintrag>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(Der <<ursprüngliche Eintrag>> steht in %s, Zeile %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "ursprüngliche Eintrag"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[Doku]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modul-Quellcode"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Quellcode für %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Ãœberblick: Modul-Quellcode"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Alle Module, für die Quellcode verfügbar ist</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Achtung"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Vorsicht"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Gefahr"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Fehler"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Hinweis"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Wichtig"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Bemerkung"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Siehe auch"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tipp"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Warnung"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "Fortsetzung der vorherigen Seite"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "Fortsetzung auf der nächsten Seite"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "Seite"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Inhaltsverzeichnis"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Suche"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Los"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Quellcode anzeigen"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Ãœbersicht"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Willkommen! Dies ist"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "die Dokumentation für"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "zuletzt aktualisiert"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Verzeichnisse und Tabellen:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Vollständiges Inhaltsverzeichnis"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "Liste aller Kapitel und Unterkapitel"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "durchsuche diese Dokumentation"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Globaler Modulindex"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "schneller Zugriff auf alle Module"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "alle Funktionen, Klassen, Begriffe"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Stichwortverzeichnis &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Gesamtes Stichwortverzeichnis auf einer Seite"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Stichwortverzeichnis nach Anfangsbuchstabe"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "kann groß sein"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Ãœber dieses Dokument"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Zuletzt aktualisiert am %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Suche in %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Vorheriges Thema"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "vorheriges Kapitel"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Nächstes Thema"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "nächstes Kapitel"
+
+#: sphinx/themes/basic/search.html:27
+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:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "suchen"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Suchergebnisse"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Ihre Suche ergab keine Treffer. Bitte stellen Sie sicher, dass alle Wörter richtig geschrieben sind und genügend Kategorien ausgewählt sind."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Schnellsuche"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Diese Seite"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch generierte Liste der Änderungen in Version %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Bibliotheks-Änderungen"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API-Änderungen"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere Änderungen"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Suchen"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Suche wird vorbereitet..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", in "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Suchergebnisse ausblenden"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Seitenleiste einklappen"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Seitenleiste ausklappen"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Inhalt"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Fußnoten"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[Bild: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[Bild]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/de_DE/LC_MESSAGES/sphinx.js b/sphinx/locale/de_DE/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..c8fa40e
--- /dev/null
+++ b/sphinx/locale/de_DE/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "de_DE",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo b/sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..c6e42fd
--- /dev/null
+++ b/sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/de_DE/LC_MESSAGES/sphinx.po b/sphinx/locale/de_DE/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..a9c7b14
--- /dev/null
+++ b/sphinx/locale/de_DE/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: German (Germany) (http://app.transifex.com/sphinx-doc/sphinx-1/language/de_DE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: de_DE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/el/LC_MESSAGES/sphinx.js b/sphinx/locale/el/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..008356c
--- /dev/null
+++ b/sphinx/locale/el/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "el",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", \u03c3\u03c4\u03bf ",
+ "About these documents": "\u03a3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03b1\u03c5\u03c4\u03ac \u03c4\u03b1 \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03b1",
+ "Automatically generated list of changes in version %(version)s": "\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1 \u03c0\u03b1\u03c1\u03b1\u03b3\u03cc\u03bc\u03b5\u03bd\u03b7 \u03bb\u03af\u03c3\u03c4\u03b1 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd \u03c3\u03c4\u03b7\u03bd \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 %(version)s",
+ "C API changes": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2 \u03c3\u03c4\u03bf API \u03c4\u03b7\u03c2 C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2 \u03c3\u03c4\u03b7\u03bd \u0388\u03ba\u03b4\u03bf\u03c3\u03b7 %(version)s &#8212'\n%(docstitle)s",
+ "Collapse sidebar": "\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03c0\u03bb\u03b1\u03ca\u03bd\u03ae\u03c2 \u03bc\u03c0\u03ac\u03c1\u03b1\u03c2",
+ "Complete Table of Contents": "\u03a0\u03bb\u03ae\u03c1\u03b7\u03c2 \u03a0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2 \u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd",
+ "Contents": "\u03a0\u03b5\u03c1\u03b9\u03b5\u03c7\u03cc\u03bc\u03b5\u03bd\u03b1",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c0\u03bb\u03b1\u03ca\u03bd\u03ae\u03c2 \u03bc\u03c0\u03ac\u03c1\u03b1\u03c2",
+ "Full index on one page": "\u03a0\u03bb\u03ae\u03c1\u03b5\u03c2 \u03b5\u03c5\u03c1\u03b5\u03c4\u03ae\u03c1\u03b9\u03bf \u03c3\u03b5 \u03bc\u03af\u03b1 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1",
+ "General Index": "\u039a\u03b5\u03bd\u03c4\u03c1\u03b9\u03ba\u03cc \u0395\u03c5\u03c1\u03b5\u03c4\u03ae\u03c1\u03b9\u03bf\u03bf",
+ "Global Module Index": "\u039a\u03b1\u03b8\u03bf\u03bb\u03b9\u03ba\u03cc \u0395\u03c5\u03c1\u03b5\u03c4\u03ae\u03c1\u03b9\u03bf \u039c\u03bf\u03bd\u03ac\u03b4\u03c9\u03bd",
+ "Go": "\u03a0\u03ac\u03bc\u03b5",
+ "Hide Search Matches": "\u0391\u03c0\u03cc\u03ba\u03c1\u03c5\u03c8\u03b7 \u0395\u03c5\u03c1\u03b5\u03b8\u03ad\u03bd\u03c4\u03c9\u03bd \u0391\u03bd\u03b1\u03b6\u03b7\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd",
+ "Index": "\u0395\u03c5\u03c1\u03b5\u03c4\u03ae\u03c1\u03b9\u03bf",
+ "Index &ndash; %(key)s": "\u0395\u03c5\u03c1\u03b5\u03c4\u03ae\u03c1\u03b9\u03bf &ndash; %(key)s",
+ "Index pages by letter": "\u03a3\u03b5\u03bb\u03af\u03b4\u03b5\u03c2 \u03b5\u03c5\u03c1\u03b5\u03c4\u03b7\u03c1\u03af\u03bf\u03c5 \u03b1\u03bd\u03ac \u03b3\u03c1\u03ac\u03bc\u03bc\u03b1",
+ "Indices and tables:": "\u0395\u03c5\u03c1\u03b5\u03c4\u03ae\u03c1\u03b9\u03b1 \u03ba\u03b1\u03b9 \u03c0\u03af\u03bd\u03b1\u03ba\u03b5\u03c2:",
+ "Last updated on %(last_updated)s.": "\u03a4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03b1 \u03b5\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7 \u03c3\u03c4\u03b9\u03c2 %(last_updated)s.",
+ "Library changes": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2 \u03b2\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2",
+ "Navigation": "\u03a0\u03bb\u03bf\u03ae\u03b3\u03b7\u03c3\u03b7",
+ "Next topic": "\u0395\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf \u03b8\u03ad\u03bc\u03b1",
+ "Other changes": "\u0386\u03bb\u03bb\u03b5\u03c2 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2",
+ "Overview": "\u0395\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7",
+ "Please activate JavaScript to enable the search\n functionality.": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce, \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b7 JavaScript \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\n \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7\u03c2.",
+ "Preparing search...": "\u03a0\u03c1\u03bf\u03b5\u03c4\u03bf\u03b9\u03bc\u03b1\u03c3\u03af\u03b1 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7\u03c2...",
+ "Previous topic": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03b8\u03ad\u03bc\u03b1",
+ "Quick search": "\u03a3\u03cd\u03bd\u03c4\u03bf\u03bc\u03b7 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7",
+ "Search": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7",
+ "Search Page": "\u03a3\u03b5\u03bb\u03af\u03b4\u03b1 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7\u03c2",
+ "Search Results": "\u0391\u03c0\u03bf\u03c4\u03b5\u03bb\u03ad\u03c3\u03bc\u03b1\u03c4\u03b1 \u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7\u03c2",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c3\u03c4\u03bf %(docstitle)s",
+ "Searching": "\u0395\u03ba\u03c4\u03b5\u03bb\u03b5\u03af\u03c4\u03b1\u03b9 \u03b7 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03ba\u03ce\u03b4\u03b9\u03ba\u03b1",
+ "Table of Contents": "\u03a0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2 \u03c0\u03b5\u03c1\u03b9\u03b5\u03c7\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd",
+ "This Page": "\u0391\u03c5\u03c4\u03ae \u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1",
+ "Welcome! This is": "\u039a\u03b1\u03bb\u03c9\u03c3\u03ae\u03c1\u03b8\u03b1\u03c4\u03b5! \u0391\u03c5\u03c4\u03ae \u03b5\u03af\u03bd\u03b1\u03b9",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u0397 \u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03ae \u03c3\u03b1\u03c2 \u03b4\u03b5\u03bd \u03c4\u03b1\u03c5\u03c4\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5 \u03bc\u03b5 \u03ba\u03b1\u03bd\u03ad\u03bd\u03b1 \u03ba\u03b5\u03af\u03bc\u03b5\u03bd\u03bf. \u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce, \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03cc\u03bb\u03b5\u03c2 \u03bf\u03b9 \u03bb\u03ad\u03be\u03b5\u03b9\u03c2 \u03ad\u03c7\u03bf\u03c5\u03bd \u03c4\u03b7 \u03c3\u03c9\u03c3\u03c4\u03ae \u03bf\u03c1\u03b8\u03bf\u03b3\u03c1\u03b1\u03c6\u03af\u03b1 \u03ba\u03b1\u03b9 \u03cc\u03c4\u03b9 \u03ad\u03c7\u03b5\u03c4\u03b5 \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03b5\u03b9\u03c2 \u03b1\u03c1\u03ba\u03b5\u03c4\u03ad\u03c2 \u03ba\u03b1\u03c4\u03b7\u03b3\u03bf\u03c1\u03af\u03b5\u03c2.",
+ "all functions, classes, terms": "\u03cc\u03bb\u03b5\u03c2 \u03bf\u03b9 \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2, \u03ba\u03bb\u03ac\u03c3\u03b5\u03b9\u03c2, \u03cc\u03c1\u03bf\u03b9",
+ "can be huge": "\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c4\u03b5\u03c1\u03ac\u03c3\u03c4\u03b9\u03bf",
+ "last updated": "\u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03b1 \u03b5\u03bd\u03b7\u03bc\u03ad\u03c1\u03c9\u03c3\u03b7",
+ "lists all sections and subsections": "\u03b1\u03c0\u03b1\u03c1\u03b9\u03b8\u03bc\u03b5\u03af \u03cc\u03bb\u03b1 \u03c4\u03b1 \u03ba\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03b1 \u03ba\u03b1\u03b9 \u03c5\u03c0\u03bf\u03ba\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03b1",
+ "next chapter": "\u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03bf \u03ba\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03bf",
+ "previous chapter": "\u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03ba\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03bf",
+ "quick access to all modules": "\u03b3\u03c1\u03ae\u03b3\u03bf\u03c1\u03b7 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03bc\u03bf\u03bd\u03ac\u03b4\u03b5\u03c2",
+ "search": "\u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7",
+ "search this documentation": "\u03b1\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03b1\u03c5\u03c4\u03ae\u03c2 \u03c4\u03b7\u03c2 \u03c4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7\u03c2",
+ "the documentation for": "\u03b7 \u03c4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/el/LC_MESSAGES/sphinx.mo b/sphinx/locale/el/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..97120ed
--- /dev/null
+++ b/sphinx/locale/el/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/el/LC_MESSAGES/sphinx.po b/sphinx/locale/el/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..584579a
--- /dev/null
+++ b/sphinx/locale/el/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3697 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Stelios Vitalis <liberostelios@gmail.com>, 2015
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2021
+# tzoumakers tzoumakers <tzoumakersx@gmail.com>, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Komiya Takeshi <i.tkomiya@gmail.com>, 2021\n"
+"Language-Team: Greek (http://app.transifex.com/sphinx-doc/sphinx-1/language/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Δεν είναι δυνατή η εÏÏεση του καταλόγου πηγής (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Ο κατάλογος πηγής και ο κατάλογος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î´ÎµÎ½ είναι δυνατό να είναι ίδιοι"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Εκτέλεση Sphinx έκδοση %s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Αυτό το έÏγο απαιτεί Sphinx έκδοσης τουλάχιστον %s και επομένως δεν είναι δυνατή η μεταγλωτισση με αυτή την έκδοση."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "δημιουÏγία καταλόγου εξόδου"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "κατά τον καθοÏισμό της επέκτασης %s"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "η 'παÏαμετÏοποίηση' σÏμφωνα με τον Ï„Ïέχοντα οÏισμό στο conf.py δεν αποτελεί καλέσιμο. ΠαÏακαλείσθε να Ï„Ïοποποιήσετε τον οÏισμό ώστε να το κάνετε μία καλέσιμη συνάÏτηση. Αυτό απαιτείται Ï€Ïοκειμένου το conf.py να συμπεÏιφέÏεται ως μία επέκταση Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "φόÏτωση μεταφÏάσεων [%s]..."
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "ολοκλήÏωση"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "δεν είναι διαθέσιμο για εσωτεÏικά μηνÏματα"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "φόÏτωση πακτωμένου πεÏιβάλλοντος"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "αποτυχία: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Δεν επιλέχθηκε μεταγλωττιστής, θα χÏησιμοποιηθεί ο Ï€Ïοεπιλεγμένος: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "επιτυχία"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "ολοκλήÏωση με Ï€Ïοβλήματα"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "μεταγλώττιση %s, %s Ï€Ïοειδοποίηση"
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "μεταγλώττιση %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "η κλάση κόμβου %r έχει ήδη καταχωÏηθεί, οι επισκέπτες της θα υπεÏσκελιστοÏν"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "η οδηγία %r έει ήδη καταχωÏηθεί, θα υπεÏσκελιστεί"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "ο Ïόλος %r έχει ήδη καταχωÏηθεί, θα υπεÏσκελιστεί"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "η επέκταση %s δεν καθοÏίζει αν είναι ασφαλής η παÏάλληλη ανάγνωση, υποθέτοντας ότι δεν είναι - παÏακαλείσθε να ζητήσετε από το δημιουÏγό της επέκτασης να το ελέγχει και να το κάνει σαφές"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "η επέκταση %s δεν καθοÏίζει αν είναι ασφαλής η παÏάλληλη ανάγνωση, υποθέτοντας ότι δεν είναι - παÏακαλείσθε να ζητήσετε το δημιουÏγό της επέκτασης να το ελέγξει και να το κάνει σαφές"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "εκτέλεση σειÏιακής %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "ο κατάλογος παÏαμετÏοποίησης δεν πεÏιλαμβάνει κανένα αÏχείο conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "δεν είναι δυνατή η υπεÏσκέλιση της ÏÏθμισης παÏαμετÏοποίησης καταλόγου %r, θα αγνοηθεί (χÏησιμοποιήστε το %r για να καθοÏίσετε τα επιμέÏους στοιχεία)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "ανέγκυÏος αÏιθμός %r για τιμή παÏαμετÏοποίησης %r, θα αγνοηθεί"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "δεν είναι δυνατή η υπεÏσκέλιση της ÏÏθμισης παÏαμετÏοποίησης %r με Ï„Ïπο ο οποίος δεν υποστηÏίζεται, θα αγνοηθεί"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "άγνωστη τιμή παÏαμετÏοποίσης %r στην υπεÏσκέλιση, θα αγνοηθεί"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Δεν υπάÏχει τέτοια τιμή παÏαμετÏοποίησης: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Η τιμή παÏαμετÏοποίησης %r υφίσταται ήδη."
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "ΥπάÏχει ένα συντακτικό λάθος στο αÏχείο παÏαμετÏοποίησής σας: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Το αÏχείο παÏαμετÏοποίησης (ή ένα από τα στοιχεία που εισάγει) κάλεσε την sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "ΥπάÏχει ένα Ï€ÏογÏαμματιστικό λάθος στο αÏχείο παÏαμετÏοποίησής σας:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "Η τιμή παÏαμτετÏοποίησης 'source_suffix' αναμένει στοιχειοσειÏά, στοιχειοσειÏά καταλόγου, ή λεξικό. Αλλά παÏαδόθηκε %r."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Τομέας %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Εικ. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Πίνακας %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Λίστα %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "Η τιμή παÏαμετÏοποίησης '{name}' Ï€Ïέπει να λαμβάνει μία από τις {candidates} αλλά εκχωÏήθηκε η '{current}'."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "Η τιμή παÏαμετÏοποίησης '{name]' έχει Ï„Ïπο '[current__name__}'; αναμενόμενη {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "Η τιμή παÏαμετÏοποίησης '{name}' έχει Ï„Ïπο '{current__name__}', αÏχικοποίηση σε '{default__name__}'."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "το primary_domain %r δεν βÏέθηκε, θα αγνοηθεί."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Το συμβάν %r υπάÏχει ήδη"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Άγνωστο όνομα συμβάντος: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "Η επέκταση %s απαιτείται από τις Ïυθμίσεις needs_extensions, αλλά δεν είναι φοÏτωμένη."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Το έÏγο χÏειάζεται την επέκταση %s τουλάχιστον στην έκδοση %s και επομένως δεν είναι δυνατή η μεταγλώττιση με τη φοÏτωμένη έκδοση (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Το όνομα %r δεν είναι γνωστό"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Η κλάση μεταγλώττισης %s δεν έχει χαÏακτηÏιστικό \"name\" "
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Ο μεταγλωττιστής %r υφίσταται ήδη (στο δομοστοιχείο %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Το όνομα μεταγλωττιστή %s δεν είναι καταχωÏημένο ή διαθέσιμο δια μέσου του σημείου εισαγωγής"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Το όνομα μεταγλωττιστή %sδεν είναι καταχοÏημένο"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "ο τομέας %s είναι ήδη καταχωÏημένος"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "ο τομέας %s δεν έχει καταχωÏηθεί ακόμη"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "Η οδηγία %r είναι ήδη καταχωÏημένη στον τομέα %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "Ο Ïόλος %r είναι ήδη καταχωÏημένος στον τομέα %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "Ο δείκτης %r είναι ήδη καταχωÏημένος στον τομέα %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "Το object_type %r είναι ήδη καταχωÏημένο"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "Το crossref_type %r είναι ήδη καταχωÏημένο"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "το source_suffix %r είναι ήδη καταχωÏημένο"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "το source_parser για το %r είναι ήδη καταχωÏημένο"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Ο αναλυτής πηγής για το %s δεν είναι καταχωÏημένος"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Ο μεταφÏαστής για το %r υφίσταται ήδη"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "το kwargs για το add_node() Ï€Ïέπει να είναι μία (visit, depart) συνάÏτηση πλειάδας: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "το enumerable_node %r είναι ήδη καταχωÏημένο"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "η επέκταση %r συγχωνεÏθηκε ήδη με το Sphinx από την έκδοση %s; η επέκταση αυτή θα αγνοηθεί."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "ΑÏχική εξαίÏεση:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Δεν ήταν δυνατή η εισαγωγή της επέκτασης %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "η επέκταση %r δεν έχει συνάÏτηση setup(); αποτελεί δομοστοιχείο επέκτασης του Sphinx;"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Η επέκταση %s η οποία χÏησιμοποιείται από αυτό το έÏγο απαιτεί Sphinx έκδοσης τουλάχιστον %s: επομένως δεν είναι δυνατή η μεταγλώττιση με αυτή την έκδοση."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "η επέκταση %r επιστÏέφει ένα μη υποστηÏιζόμενο αντικείμενο από τη συνάÏτησή της setup(): θα έπÏεπε να επιστÏέφει None ή έναν κατάλογο μεταδεδομένων"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "το θέμα %r δεν έχει ÏÏθμιση \"theme\""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "το θέμα %r δεν έχει ÏÏθμιση \"inherit\""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "δεν βÏέθηκε θέμα με το όνομα %r, το οποίο κληÏονομήθηκε από το %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "η ÏÏθμιση %s.%s δεν εμφανίζεται από τις παÏαμετÏοποιήσεις θέματος που αναζητήθηκαν"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "δόθηκε μη υποστηÏιζόμενη επιλογή θέματος %r"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "το αÏχείο %r στο μονοπάτι θέματος δεν αποτελεί ένα έγκυÏο zipfile ή δεν πεÏιλαμβάνει ένα θέμα"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "δεν βÏέθηκε θέμα με όνομα %r (απουσιάζει το theme.conf;)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "δεν βÏέθηκε μία κατάλληλη εικόνα για τον μεταγλωττιστή %s: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "δεν βÏέθηκε μία κατάλληλη εικόνα για τον μεταγλωττιστή %s: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "μεταγλώττιση [mo]:"
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "εγγÏαφή εξόδου..."
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "όλα τα αÏχεία po του %d"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "στόχοι για τα αÏχεία po του %d οι οποίοι έχουν καθοÏιστεί"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "στόχοι για τα αÏχεία po του %d τα οποία είναι ξεπεÏασμένα"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "όλα τα αÏχεία πηγής"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "το αÏχείο %r που δόθηκε στη γÏαμμή εντολής δεν βÏίσκεται κάτω από τον κατάλογο πηγής, θα αγνοηθεί"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "τα αÏχεία πηγής %d που δόθηκαν στη γÏαμμή εντολής"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "στόχοι για τα αÏχεία πηγής %d τα οποία είναι ξεπεÏασμένα"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "μεταγλώττιση [%s]:"
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "αναζήτηση για νεοξεπεÏασμένα αÏχεία..."
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "βÏέθηκε %d"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "δεν βÏέθηκε κανένα"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "ΠεÏιβάλλον μετατÏοπής αντικειμένων Python σε Ïοή bytes"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "έλεγχος συνοχής"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "κανένας στόχος δεν είναι ξεπεÏασμένος."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "αναβάθμιση πεÏιβάλλοντος:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s Ï€Ïοστέθηκε, %s άλλαξε, %s απομακÏÏνθηκε"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "ανάγνωση πηγών..."
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "docname Ï€Ïος εγγÏαφή: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "Ï€Ïοετοιμασία κειμένων"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "βÏέθηκε διπλότυπη εγγÏαφή ToC: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "αντιγÏαφή εικόνων..."
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "δεν είναι δυνατή η ανάγωνση αÏχείου εικόνας %r: αντί Î±Ï…Ï„Î¿Ï Î¸Î± αντιγÏαφεί"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "δεν είναι δυνατή η αντιγÏαφή αÏχείου εικόνας %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "δεν είναι δυνατή η εγγÏαφή αÏχείου %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Το pillow δεν βÏέθηκε - αντιγÏαφή αÏχείων εικόνας"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "άγνωστο mimetype για %s, θα ανγοηθεί"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "εγγÏαφή %s αÏχείου..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "Το αÏχείο επισκόπησης είναι σε %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "καμία αλλαγή στην έκδοση %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "εγγÏαφή αÏχείου σÏνοψης"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Ενσωματωμένες λειτουÏγίες"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Επίπεδο μονάδας λειτουÏγίας"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "αντιγÏαφή αÏχείων πηγής..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "δεν ήταν δυνατή η ανάγνωση %r για τη δημιουÏγία changelog"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "Ο Ï€ÏοσωÏινός μεταγλωττιστής δεν δημιουÏγεί αÏχεία."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "Το αÏχείο ePub βÏίσκεται σε %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_language\" (ή \"language\") δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_uid\" Ï€Ïέπει να είναι XML NAME για EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_title\" (ή \"html_title\") δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_author\" δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_contributor\" δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_description\" δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_publisher\" δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_copyright\" (ή \"copyright\") δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"epub_identifier\" δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "η τιμή παÏαμετÏοποίησης \"version\" δεν Ï€Ïέπει να είναι κενή για EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "ανέγκυÏο css_file: %r, θα αγνοηθεί"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Οι κατάλογοι των μηνυμάτων είναι στο %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "στόχοι για %d Ï€Ïότυπα αÏχεία"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "ανάγνωση Ï€ÏοτÏπων..."
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "εγγÏαφή καταλόγων μηνÏματος..."
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Αναζητήστε οποιαδήποτε λάθη στο παÏαπάνω αποτέλεσμα ή σε %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "λανθασμένος σÏνδεσμος: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Οι σελίδες manual βÏίσκονται σε %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "δεν βÏέθηκε τιμή παÏαμετÏοποίησης \"man_pages\"; δεν θα καταγÏαφοÏν manual pages"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "εγγÏαφή"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "η τιμή παÏαμετÏοποίησης \"man_pages\" κάνει αναφοÏά το άγνωστο κείμενο %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "Η σελίδα HTML είναι στο %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "συναÏμολόγηση Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "εγγÏαφή επιπÏόσθετων αÏχείων"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Τα αÏχεία Texinfo βÏίσκονται σε %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nΕκτελέστε 'make' σε αυτό τον κατάλογο για να εκτελέσετε αυτά μέσω του makeinfo\n(χÏησιμοποιήστε το 'make info' εδώ για να το κάνετε αυτόματα)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "δεν βÏέθηκε τιμή \"texinfo_documents\": δεν θα γίνει εγγÏαφή κανενός κειμένου"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "η τιμή παÏαμετÏοποίησης \"texninfo_documents\" αναφέÏεται σε άγνωστο κείμενο %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "επεξεÏγασία %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "επίλυση αναφοÏών..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (σε "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "αντιγÏαφή αÏχείων υποστήÏιξης Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "σφάλμα κατά την εγγÏαφή του αÏχείου Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Τα αÏχεία κειένου βÏίσκονται σε %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "σφάλμα καταγÏαφής αÏχείου %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Τα αÏχεία XML βÏίσκονται σε %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Τα αÏχεία XML βÏίσκονται σε %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "το αÏχείο πληÏοφοÏιών μεταγλώττισης είναι κατεστÏαμμένο: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Οι σελίδες HTML βÏίσκονται σε %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Αδυναμία ανάγνωσης αÏχείου πληÏοφοÏιών μεταγλώττισης: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %B %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "ΚεντÏικό ΕυÏετήÏιοο"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "ευÏετήÏιο"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "επόμενο"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "Ï€ÏοηγοÏμενο"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "αντιγÏαφή αÏχείων μεταφόÏτωσης..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "δεν είναι δυνατή η αντιγÏαφή του μεταφοÏτωμένου αÏχείου %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "δεν είναι δυνατή η αντιγÏαφή ÏƒÏ„Î±Ï„Î¹ÎºÎ¿Ï Î±Ïχείου %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "δεν είναι δυνατή η αντιγÏαφή του επιπλέον αÏχείου %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Αδυναμία εγγÏαφής του αÏχείου πληÏοφοÏιών μεταγλώττισης: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "ο κατάλογος εÏÏεσης δεν ήταν δυνατό να φοÏτωθεί, αλλά δε θα μεταγλωττιστοÏν όλα τα έγγÏαφα: ο κατάλογος δε θα είναι πλήÏης."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "η σελιδα %s ταιÏιάζει δÏο σχέδια στo html_sidebars: %r and %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "ένα σφάλμα Unicode παÏουσιάστηκε κατά τη δημιουÏγία της σελίδας %s. ΠαÏακαλείστε να επιβεβαιώσετε ότι όλες οι τιμές παÏαμετÏοποίησης οι οποίες πεÏιλαμβάνουν μη-ASCII πεÏιεχόμενο είναι στοιχειοσειÏές Unicode."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Ένα σφάλμα συνέβη κατά τη σÏνθεση της σελίδας %s.\n\nΑιτία %r "
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "ανέγκυÏο js_file: %r, θα αγνοηθεί"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Πολλά math_renderers έχουν καταγÏαφεί. Αλλά δεν έχει επιλεγεί κανένα math_renderer."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "Δόθηκε άγνωστο math_renderer %r."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "Η εγγÏαφή html_extra_path %r δεν υπάÏχει"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "η εγγÏαφή html_static_path %r δεν υπάÏχει"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "το αÏχείο logo %r δεν υπάÏχει"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "το αÏχείο favicon %r δεν υπάÏχει"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "ΤεκμηÏίωση του %s - %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Τα αÏχεία LaTeX βÏίσκονται σε %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nΕκτελέστε 'make' σε αυτό τον κατάλογο για να εκτελέσετε αυτά μέσω του (pdf)latex\n(χÏησιμοποιήστε το 'make latexpdf' εδώ για να το κάνετε αυτόματα)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "δεν βÏέθηκε τιμή παÏαμετÏοποίησης \"latex_documents\": δεν θα Ï€Ïαγματοποιηθεί εγγÏαφή για κανένα κείμενο"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "η τιμή παÏαμετÏοποίησης \"latex_documents\" κάνει αναφοÏά το άγνωστο κείμενο %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "ΕυÏετήÏιο"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Δημοσίευση"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "καμία γνωστή επιλογή Babel για τη γλώσσα %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "αντιγÏαφή αÏχείων υποστήÏιξης TeX"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "αντιγÏαφή αÏχείων υποστήÏιξης TeX..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "αντιγÏαφή επιπÏόσθετων αÏχείων"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "ΠαÏουσιάστηκε εξαίÏεση κατά τη μεταγλώττιση, εκκίνηση αποσφαλματιστή: "
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "σφάλμα reST markup:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Σφάλμα κωδικοποίησης:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "Το πλήÏες ιστοÏικό έχει αποθηκευτεί σε %s, σε πεÏίπτωση που επιθυμείτε να αναφέÏετε το ζήτημα στους Ï€ÏογÏαμματιστές."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Σφάλμα αναδÏομής:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Εμφανίστηκε εξαίÏεση:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "ΠαÏακαλείστε να το αναφέÏετε αν ήταν ένα σφάλμα χÏήσης, ώστε ένα καλÏτεÏο μήνυμα σφάλματος να δοθεί την επόμενη φοÏά."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Μία αναφοÏά σφάλματος μποÏεί να υποβληθεί στον ινχηλάτη στο https://github.com/sphinx-doc/sphinx/issues>. ΕυχαÏιστοÏμε!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "ο αÏιθμός εÏγασίας θα Ï€Ïέπει να είναι θετικός αÏιθμός"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "μονοπάτι για τα αÏχεία πηγής τεκμηÏίωσης"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "μονοπάτι στον κατάλογο εξόδου"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "μία λίστα με συγκεκÏιμένα αÏχεία να επαναμεταγλωττιστοÏν. Θα αγνοηθεί αν δοθεί το -a"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "γενικές επιλογές"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "μεταγλωττιστής για χÏήση (Ï€Ïοεπιλογή: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "εγγÏαφή όλων των αÏχείων (Ï€Ïοεπιλογή: εγγÏαφή μόνο νέων και αλλαγμένων αÏχείων)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "μην χÏησιμοποιείτε ένα αποθηκευμένο πεÏιβάλλον, πάντα να διαβάζετε όλα τα αÏχεία"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "μονοπάτι για το αποθηκευμένο πεÏιβάλλον και τα αÏχεία doctree (Ï€Ïοεπιλογή: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "παÏάλληλος μεταγλωττισμός με ΠδιεÏγασίες όπου είναι δυνατό (ιδιαίτεÏη τιμή \"auto\" θα οÏίσει Πστο cpu-count)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "το μονοπάτι όπου βÏίσκεται το αÏχείο παÏαμετÏοποίησης (conf.py) (Ï€Ïοεπιλογή: το ίδιο όπως το SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "να μη χÏησιμοποιηθεί κανένα αÏχείο παÏαμετÏοποίησης, μόνο επιλογές -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "παÏάκαμψη ÏÏθμισης στο αÏχείο παÏαμετÏοποίησης"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "μεταφοÏά τιμής στα Ï€Ïότυπα HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "οÏίστε ετικέτα: συμπεÏιλάβατε \"only\" τμήματα με TAG"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "Ο Ï„Ïόπος nit-picky, Ï€Ïοειδοποιεί για όλες τις αναφοÏές που απουσιάζουν"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "επιλογές εξόδου κονσόλας"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "αυξήστε τον βεÏμπαλισμό (μποÏεί να επαναληφθεί)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "καμία έξοδος στο stdout, μόνο Ï€Ïοειδοποιήσεις στο stderr"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "κανένα αποτέλεσμα οÏτε Ï€Ïοειδοποιήσεις"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "να γίνεται εκπομπή χÏωματιστής εξόδου (Ï€Ïοεπιλογή: auto-detect)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "να μην παÏουσιάζεται έγχÏωμο αποτέλεσμα (Ï€Ïοεπιλογή: αυτόματη αναγνώÏιση)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "Ï€Ïοειδοποιήσεις εγγÏαφής (και σφάλματα) στο δοθέν αÏχείο"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "μετατÏοπή Ï€Ïοειδοποιήσεων σε σφάλματα"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "απεικόνιση πλήÏους ιστοÏÎ¹ÎºÎ¿Ï ÏƒÎµ πεÏίπτωση εξαίÏεσης"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "εκτέλεση Pdb σε πεÏίπτωση εξαίÏεσης"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "δεν γίνεται συνδιασμός της επιλογής -a και των ονομάτων αÏχείων"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "δεν είναι δυνατό το άνοιγμα του αÏχείου Ï€Ïοειδοποίησης %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "Το ÏŒÏισμα -D Ï€Ïέπει να είναι της μοÏφής όνομα=τιμέ"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "Το ÏŒÏισμα -Α Ï€Ïέπει να είναι της μοÏφής όνομα=τιμή"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "αυτόματη εισαγωγή docstrings από τα δομοστοιχεία"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "αυτόματα κομμάτια Î´Î¿ÎºÎ¹Î¼Î±ÏƒÏ„Î¹ÎºÎ¿Ï ÎºÏŽÎ´Î¹ÎºÎ± σε τμήματα doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "σÏνδεσμος Î¼ÎµÏ„Î±Î¾Ï Ï„ÎµÎºÎ¼Î·Ïίωσης Sphinx διαφόÏων έÏγων"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "γÏάψτε εγγÏαφές \"todo\" οι οποίες μποÏοÏν αν εμφανίζονται ή να αποκÏÏπτονται κατά τη μεταγλώττιση"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "αναζήτηση για κάλυψη βιβλιογÏαφίας"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "να συμπεÏιληφθεί το math, απεικονισμένο ως εικόνες PNG η SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "να συμπεÏιληφθεί το math, απεικονισμένο στο φυλλομετÏηÏή απο το MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "υποθετική εισαγωγή πεÏιεχομένου βασισμένη στις τιμές παÏαμετÏοποίησης"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "να συμπεÏιληφθοÏν σÏνδεσμοι στον πηγαίο κώδικα των τεκμηÏιωμένων αντικειμένων Python"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "δημιουÏγία αÏχείου .nojekyll για έκδοση του εγγÏάφου στις σελίδες GitHub "
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "ΠαÏακαλείστε να εισάγετε ένα έγκυÏο όνομα μονοπατιοÏ."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "ΠαÏακαλείστε να εισάγετε κάποιο κείμενο."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "ΠαÏακαλείστε να εισάγετε ένα από τα %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "ΠαÏακαλείστε να εισάγετε είτε 'y' είτε 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "ΠαÏακαλείστε να εισάγετε μία επέκταση αÏχείου, Ï€.χ. '.rst' ή '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Καλώς ήÏθατε στο εÏγαλείο γÏήγοÏης εκκίνησης Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Ριζικό μονοπάτι για την τεκμηÏίωση"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Σφάλμα: ένα υπάÏχον conf.py έχει βÏεθεί στοn επιλεγμένο Ïιζικό κατάλογο."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "το sphinx-quickstart δεν θα αντικαταστήσει υπάÏχοντα έÏγα Sphinx."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "ΠαÏακαλείστε να εισάγετε ένα νέο Ïιζικό μονοπάτι (ή απλά πιέστε το Enter για έξοδο)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "ΞεχωÏιστοί κατάλογοι για πηγή και μεταγλώττιση (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "ΠÏόθεμα ονόματος για Ï€Ïότυπα και στατικοÏÏ‚ καταλόγους"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Όνομα έÏγου"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Όνομα(τα) συγγÏαφέα"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Έκδοση έÏγου"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "ΚυκλοφοÏία έÏγου"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Γλώσσα έÏγου"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Επέκταση αÏχείου πηγής"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Όνομα του κυÏίους σας εγγÏάφου (χωÏίς επέκταση)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Σφάλμα: το κÏÏιο αÏχείο %s έχει ήδη βÏεθεί στο επιλεγμένο Ïιζικό κατάλογο."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "το sphinx-quickstart δεν θα αντικαταστήσει υπάÏχοντα αÏχεία."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "ΠαÏακαλείσθε να εισάγετε ένα νέο όνομα αÏχείου, ή να μεταονομάσετε το υπάÏχον αÏχείο και να πιέσετε το Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Υποδείξτε ποιά απο τις ακόλουθες επεκτάσεις Sphinx Ï€Ïέπει να ενεÏγοποιηθοÏν:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Σημείωση: τα imgmath και mathjax δεν είναι δυνατό να ενεÏγοποιηθοÏν ταυτόχÏονα. Το imgmath έχει αποεπιλεγθεί. "
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "ΔημιουÏγία Makefile; (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "ΔημιουÏγία αÏχείου εντολών Windows; (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "ΔημιουÏγία αÏχείου %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Το αÏχείο %s υπάÏχει ήδη, παÏαλείπεται."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "ΟλοκλήÏωση: μία αÏχική δομή καταλόγου δημιουÏγήθηκε."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nΔημιουÏγία απαιτοÏμενων αÏχείων για ένα έÏγο Sphinx.\n\nΤο sphinx-quickstart είναι ένα διαδÏαστικό εÏγαλείο το οποίο κάνει κάποιες εÏωτήσεις για το δικό σας \nέÏγο και μετά δημιουÏγεί έναν πλήÏη κατάλογο τεκμηÏίωσης και δείγμα \nMakefile για να χÏησιμοποιηθεί με το sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "ήσυχος Ï„Ïόπος"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Επιλογές δομής"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "αν οÏίζεται, θα ξεχωÏίσουν οι κατάλογοι πηγής και μεταγλώττισης"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "αντικατάσταση για τελεία σε _templates κλπ."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Βασικές επιλογές έÏγου"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "όνομα έÏγου"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "ονόματα συγγÏαφέων"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "έκδοση του έÏγου"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "δημοσίευση του έÏγου"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "γλώσσα εγγÏάφου"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "επέκταση αÏχείου πηγής"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "κÏÏιο όνομα εγγÏάφου"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "χÏηση epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Επιλογές επέκτασης"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "ενεÏγοποίηση της επέκτασης %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "ενεÏγοποίηση αυθαίÏετων επεκτάσεων"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "ΔημιουÏγία Makefile και Batchfile"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "δημιουÏγία makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "να μη δημιουÏγηθεί makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "δημιουÏγία batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "να μη δημιουÏγηθεί batchfile"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "χÏησιμοποιήστε το make-mode για το Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "μην χÏησιμοποιείτε make-mode για Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "ΠÏοτυποποίηση έÏγου"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "Ï€Ïότυπος κατάλογος για Ï€Ïότυπα αÏχεία"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "οÏίστε μία τιμή Ï€ÏοτÏπου"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "καθοÏίστηκε το \"quiet\", αλλά δεν καθοÏίστηκε είτε το \"project\" είτε το \"author\"."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Σφάλμα: το καθοÏισθέν μονοπάτι δεν είναι κατάλογος, ή τα αÏχεία sphinx υπάÏχουν ήδη."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "Το sphinx-quickstart δημιουÏγεί μόνο εντός ενός ÎºÎµÎ½Î¿Ï ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…. ΠαÏακαλείσθε να καθοÏίσετε ένα νέο Ïιζικό μονοπάτι."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "ΑνέγκυÏη μεταβλητή Ï€ÏοτÏπου: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "ΑνέγκυÏη λεζάντα: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "η Ï€ÏοδιαγÏαφή αÏÎ¹Î¸Î¼Î¿Ï ÏƒÎµÎ¹Ïάς είναι εκτός e;yroyw (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Δεν είναι δυνατή η ταυτόχÏονη χÏήση των επιλογών \"%s\" και \"%s\""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Το συμπεÏιληφθέν αÏχείο %r δεν βÏέθηκε ή απέτυχε η ανάγνωσή του"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Η κωδικοποίηση %r που χÏησιμοποιήθηκε για την ανάγνωση του συμπεÏιληφθέντος αÏχείου %r φαίνεται να είναι λανθασμένη, Ï€Ïοσπαθήστε να δώσετε μία επιλογή :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Το αντικείμενο με όνομα %r δεν βÏέθηκε στο συμπεÏιληφθέν αÏχείο %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Δεν είναι δυνατή η χÏήση \"leneno-match\" με ένα κομματιασμένο σετ απο \"lines\""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "ΠÏοσδιοÏισμός γÏαμμής %r: δεν ελήφθησαν γÏαμμές από το συμπεÏιληφθέν αÏχείο %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "Το toctree πεÏιλαμβάνει αναφοÏά στο αποκλεισμένο κείμενο %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "το toctree πεÏιλαμβάνει αναφοÏά στο μη υπαÏκτό έγγÏαφο %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Συντάκτης τμήματος: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Συντάκτης μονάδας: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Συντάκτης κώδικα: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Συντάκτης: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "ΠαÏάμετÏοι"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "ΕπιστÏέφει"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "ΕπιστÏεφόμενος Ï„Ïπος"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "μέλος"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "μεταβλητή"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "συνάÏτηση"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "μακÏοεντολή"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "ένωση"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "Ï„Ïπος"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Îέο στην έκδοση %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Άλλαξε στην έκδοση %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "ΑποσÏÏθηκε στην έκδοση %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "διπλότυπη ετικέτα %s, άλλη εμφάνιση στο %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Η παÏαπομπή [%s] δεν αναφέÏεται."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "ΠαÏάμετÏοι ΠÏοτÏπου"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "ΠÏοκαλεί"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "κλάση"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "έννοια"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (ενσωματωμένη συνάÏτηση)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (μέθοδος της %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (κλάση)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (καθολική μεταβλητή ή σταθεÏά)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (ιδιότητα της %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "ΠαÏάμετÏοι"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (μονάδα)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "μέθοδος"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "δεδομένα"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "ιδιότητα"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "μονάδα"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "διπλότυπη ετικέτα της εξίσωσης %s, άλλη εμφάνιση στο %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "ΑνέγκυÏο math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Μεταβλητές"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "ΠÏοκαλεί"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (στη μονάδα %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (στη μονάδα %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (ενσωματωμένη μεταβλητή)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (ενσωματωμένη κλάση)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (κλάση σε %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (μέθοδος κλάσης της %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (στατική μέθοδος της %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "ΕυÏετήÏιο Μονάδων της Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "μονάδες"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "ΑποσÏÏθηκε"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "εξαίÏεση"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "μέθοδος της κλάσης"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "στατική μέθοδος"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "πεÏισσότεÏοι από έναν στόχοι βÏέθηκα για την παÏαπομπή %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (αποσÏÏθηκε)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (οδηγία)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (Ïόλος)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "οδηγία"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "Ïόλος"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "μεταβλητή πεÏιβάλλοντος; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Λανθασμένη πεÏιγÏαφή επιλογής %r, θα Ï€Ïέπει να μοιάζει με \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" ή \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "γλωσσάÏι"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "γÏαμματική ένδειξη"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "ετικέτα αναφοÏάς"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "μεταβλητή πεÏιβάλλοντος"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "επιλογή Ï€ÏογÏάμματος"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "έγγÏαφο"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "ΕυÏετήÏιο μονάδων"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Σελίδα αναζήτησης"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "διπλότυπη ετικέτα %s, άλλη εμφάνιση στο %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "το numfig έχει απενεÏγοποιηθεί. Το :numref: θα ανγοηθεί."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "ο σÏνδεσμος δεν έχει λεζάντα: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "ανέγκυÏο numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "ανέγκυÏο numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "νέα παÏαμετÏοποίηση"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "η παÏαμετÏοποίηση άλλαξε"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "αλλαγμένες επεκτάσεις"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "η έκδοση του πεÏιβάλλοντος μεταλώττισης δεν είναι η Ï„Ïέχουσα"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "ο πηγαίος κατάλογος έχει αλλάξει"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Το πεÏιβάλλον δεν είναι συμβατό με τον επιλεγμένο μεταγλωττιστή, παÏακαλείστε να επιλέξετε ένα διαφοÏετικό κατάλογο toctree."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Αδυναμία σάÏωσης εγγÏάφων σε %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Ο τομέας %r δεν είναι καταχωÏημένος"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "το έγγÏαφο δεν συμπεÏιλαμβάνεται σε κανένα toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "Î’Ïέθηκε αυτοαναφεÏόμενο toctree. Θα αγνοηθεί."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "δείτε %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "δείτε επίσης %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "άγνωστος Ï„Ïπος εγγÏαφής ευÏετηÏίου %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "ΣÏμβολα"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "αναγνωÏίστηκαν κυκλικές αναφοÏές toctree, θα αγνοηθοÏν: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "το toctree πεÏιλαμβάνει αναφοÏά στο έγγÏαφο %r η οποία δεν έχει τίτλο: δεν θα δημιουÏγηθεί σÏνδεσμος"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "το αÏχείο εικόνας δεν είναι αναγνώσιμο: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "το αÏχείο εικόνας %s δεν είναι αναγνώσιμο: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "το μεταφοÏτωμένο αÏχείο δεν είναι αναγνώσιμο: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "στο %s έχουν ήδη ανατεθεί αÏιθμοί τομέα (εμφωλιασμένο αÏιθμημένο toctree;)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "Θα δημιουÏγοÏσε το αÏχείο %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nΑναζητήστε αναδÏομικα σε <MODULE_PATH>για δομοστοιχεία Python και πακέτα και δημιουÏγήστε \nένα αÏχείο reST με οδηγίες automodule για κάθε πακέτο στο <OUTPUT_PATH>.\n\nΤα <EXCLUDE_PATTERN>μποÏεί να αποτελοÏν αÏχεία ή/και σχέδια καταλόγων τα οποία θα \nεκτελεστοÏν κατά τη δημιουÏγία.\n\nΣημείωση: από Ï€Ïοεπιλογή αυτό το σενάÏιο δεν θα αντικαταστήσει τα ήδη δημιουÏγημένα αÏχεία."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "μονοπάτι για το δομοστοιχείο για το έγγÏαφο"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "αÏχεία fnmatch-style και/ή υποδείγματα καταλόγου που θα εξαιÏεθοÏν από τη δημιουÏγία"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "κατάλογο για τοποθέτηση όλων των Ï€Ïοϊόντων"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "μέγιστο βάθος από υποδομοστοιχεία για απεικόνιση στο TOC (Ï€Ïοεπιλογή: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "αντικατάσταση υπάÏχοντων αÏχείων"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "ακολουθία συμβολικών συνδέσμων. ΙσχυÏÏŒ όταν συνδυάζεται με το collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "εκτελέστε το σενάÏιο χωÏίς τη δημιουÏγία αÏχείων"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "τοποθετήστε βιβλιογÏαφία για κάθε δομοστοιχείο στη δικής της σελίδα"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "να συμπεÏιληφθοÏν τα δομοστοιχεία \"_private\""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "όνομα αÏχείου του πίνακα πεÏιεχομένων (Ï€Ïοεπιλογή: δομοστοιχεία)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "να μη δημιουÏγηθεί αÏχείο με πίνακα πεÏιεχομένων"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "μη δημιουÏγείτε κεφαλίδες για πακέτα δομοστοιχείων/πακέτων (Ï€.χ. όταν τα docstrings τα πεÏιλαμβάνουν ήδη)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "τοποθέτηση βιβλιογÏαφίας δομοστοιχείου Ï€Ïιν από την βιβλιογÏαφία υπόδομοστοιχείου"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "εÏμηνεία μονοπατιών δομοστοιχείων σÏμφωνα με την Ï€ÏοδιαγÏαφή POP-0420 αυτονόητων namespaces"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "επέκταση αÏχείου (Ï€Ïοεπιλογή: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "δημιουÏγία ενός πλήÏους έÏγου με το sphinx-quickstart"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "η Ï€Ïοσθήκη του module_path στο sys.path, χÏησιμοποιείται όταν δίδεται το --full"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "όνομα έÏγου (Ï€Ïοεπιλογή: όνομα ÏÎ¹Î¶Î¹ÎºÎ¿Ï Î´Î¿Î¼Î¿ÏƒÏ„Î¿Î¹Ï‡ÎµÎ¯Î¿Ï…)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "συγγÏαφέας(εις) έÏγου, χÏησιμοποιείται όταν δίδεται το --full"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "έκδοση έÏγου, χÏησιμοποιείται όταν δίνεται το --full"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "έκδοση έÏγου, χÏησιμοποιείται όταν δίδεται το --full, Ï€Ïοεπιλογή σε --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "επιλογές επέκτασης"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "το %s δεν είναι κατάλογος."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "ανέγκυÏο regex %r σε %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Η δοκιμή της κάλυψης στις πηγές ολοκληÏώθηκε, δείτε τα αποτελέσματα στο %(outdir)s python.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "ανέγκυÏο regex %r στο coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "το δομοστοιχείο %s δεν ήταν δυνατό να εισαχθεί: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "λείπει '+' ή '-' στην επιλογή '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "Η '%s δεν είναι μία έγκυÏη επιλογή."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' δεν αποτελεί μία έγκυÏη επιλογή για pyversion"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "ανέγκυÏος Ï„Ïπος TestCode"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "ΟλοκληÏώθηκε η δοκιμή των doctests στις πηγές, δείτε τα αποτελέσματα σε %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "δεν υπάÏχει κώδικας/αποτέλεσμα στο τμήμα %s στο %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "Ο ανέγκυÏος κώδικας doctest θα αγνοηθεί: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Η οδηγία Graphviz δεν είναι δυνατό να πεÏιλαμβάνει και πεÏιεχόμενο και ένα ÏŒÏισμα ονόματος αÏχείου"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Το εξωτεÏικό αÏχείο Graphviz %r δεν βÏέθηκε ή απέτυχε η ανάγνωσή του"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Η οδηγία χωÏίς πεÏιεχόμενο \"graphviz\" θα αγνοηθεί."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "η εντολή dot %r δεν είναι δυνατό να εκτελεστεί (απαιτείται για αποτέλεσμα graphviz), ελέγξτε τη ÏÏθμιση graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "το dot ολοκλήÏωσε με σφάλμα:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "το dot δεν παÏήγαγε κανένα αÏχείο εξόδου:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "Το graphviz_output_format Ï€Ïέπει να είναι ένα από τα 'png', 'svg', αλλά είναι %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "κωδικός dot %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[γÏάφημα: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[γÏάφημα]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "η μετατÏοπή ολοκλήÏωσε με σφάλμα:[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "Η εντολή LaTex %r δεν είναι δυνατό να εκτελεστεί (απαιτείται για απεικόνιση μαθηματικών), ελέγξτε τη ÏÏθμιση imgmath_latex"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s η εντολή %r δεν είναι δυνατό να εκτελεστεί (απαιτείται για μαθηματική απεικόνιση), ελέγξτε τη ÏÏθμιση imgmath_%s"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "απεικόνιση latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "σε σειÏά latex %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "το απόθεμα intersphinx έχει μεταφεÏθεί: %s->%s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "φότωση του αποθέματος intersphinx από %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "παÏουσιάστηκαν κάποια ζητήματα με μεÏικά απο τα αποθέματα, αλλά υπήÏξαν λειτουÏγικές εναλλακτικές:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "αδυναμία Ï€Ïοσέγγισης οποιασδήποτε αποθήκης με τα ακόλουθα ζητήματα:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(στη %s έκδοση %s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(στο %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "το αναγνωÏιστικό intersphinx %r δεν είναι στοιχειοσειÏά. Θα αγνοηθεί"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[πηγή]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "ΕκκÏεμότητα"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "βÏέθηκε εγγÏαφή TODO:%s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(Το <<original entry>> βÏίσκεται στο %s, γÏαμή %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "αÏχική εγγÏαφή"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "επισήμανση κώδικα δομοστοιχείου..."
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[τεκμηÏίωση]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Κώδικας μονάδας"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Πηγαίος κώδικας για το %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Επισκόπηση: κώδικας της μονάδας"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Όλες οι μονάδες για τις οποίες υπάÏχει διαθέσιμος κώδικας</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "ανέγκυÏη υπογÏαφή για αυτόματο %s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "σφάλμα κατά τη μοÏφοποίηση των οÏισμάτων για %s:%s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "δεν γνωÏίζω ποιο δομοστοιχείο να εισάγω για αυτόματη τεκμηÏίωση %r (Ï€Ïοσπαθήστε να τοποθετήσετε μία οδηγία \"module\" ή \"currentmodule\" στο έγγÏαφο, ή να δώσετε ένα σαφές όνομα δομοστοιχείου)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" στο όνομα automodule δεν βγάζει νόημα"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "οÏίσματα υπογÏαφής ή επιστÏοφή σημείωσης η οποία δόθηκε για το automodule %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ Ï€Ïέπει να είναι λίστα στοιχειοσειÏάς, όχι %r (στο δομοστοιχείο %s) -- θα αγνοηθεί το __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Βάσεις: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "απουσιάζει το χαÏακτηÏιστικό %s στο αντικείμενο %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "αδυναμία ανάλυσης ονόματος %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "αδυναμία εισαγωγής αντικειμένου %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "Το autosummary δημιουÏγεί αÏχεία .rst εσωτεÏικά. Αλλά το δικό σας source_suffix δεν πεÏιλαμβάνει .rst. Θα παÏαλειφθεί."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] δημιουÏγία autosummary για: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[αυτόματη πεÏίληψη] εγγÏαφή στο %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nΔημιουÏγία ReStrucuredText χÏησιμοποιώντας τις οδηγίες autosummary.\n\nΤο sphinx-autogen αποτελεί ένα Ï€Ïόσθιο εÏγαλείο για το sphinx.ext.autosummary.generate. ΔημιουÏγεί \nτα αÏχεία reStructuredText από τις οδηγίες autosummary οι οποίες πεÏιλαμβάνονται στα \nπαÏαδοθέντα αÏχεία εισόδου.\n\nΗ μοÏφή της οδηγίας autosummary τεκμηÏειώνεται στο \nδομοστοιχείο ``sphinx.ext.autosummary`` της Python και μποÏεί να αναγνωστεί χÏησιμοποιώντας το :: \n\npydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "αÏχεία πηγής για να δημιουÏγηθοÏν τα αÏχεία reST"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "ο κατάλογος που θα τοποθετεί όλο το αποτέλεσμα εξόδου"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "Ï€Ïοεπιλεγμένη επέκταση για αÏχεία (Ï€Ïοεπιλογή: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "Ï€ÏοσαÏμοσμένος κατάλογος Ï€ÏοτÏπου (Ï€Ïοεπιλογή: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "μέλη εισαγμένα στο έγγÏαφο (Ï€Ïοεπιλογή: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "ΟÏίσματα λέξης-κλειδί"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "ΠαÏάδειγμα"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "ΠαÏαδείγματα"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Σημειώσεις"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Άλλες παÏάμετÏοι"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "ΑναφοÏές"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "ΠÏοειδοποιήσεις"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Αποδόσεις"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "ΠÏοσοχή"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "ΠÏοσοχή"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Κίνδυνος"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Σφάλμα"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Συμβουλή"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Σημαντικό"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Σημείωση"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Δείτε επίσης"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "ΠÏακτική συμβουλή"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "ΠÏοειδοποίηση"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "συνεχίζεται από την Ï€ÏοηγοÏμενη σελίδα"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "συνέχεια στην επόμενη σελίδα"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "μη-αλφαβιτικά"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "ΑÏιιθμοί"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "σελίδα"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Πίνακας πεÏιεχομένων"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Αναζήτηση"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Πάμε"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "ΠÏοβολή κώδικα"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Επισκόπηση"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "ΚαλωσήÏθατε! Αυτή είναι"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "η τεκμηÏίωση του"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "ΕυÏετήÏιο &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "Πλοήγηση"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Αναζήτηση στο %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Σχετικά με αυτά τα κείμενα"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Τελευταία ενημέÏωση στις %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Αναζήτηση %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "ΠÏοηγοÏμενο θέμα"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Ï€ÏοηγοÏμενο κεφάλαιο"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Επόμενο θέμα"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "επόμενο κεφάλαιο"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "ΠαÏακαλώ, ενεÏγοποιήστε τη JavaScript για να είναι δυνατή η λειτουÏγία\n αναζήτησης."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "αναζήτηση"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Αποτελέσματα Αναζήτησης"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "ΣÏντομη αναζήτηση"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "Αλλαγές στην Έκδοση %(version)s &#8212'\n%(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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 "Αλλαγές στο API της C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Άλλες αλλαγές"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Εκτελείται η αναζήτηση"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "ΠÏοετοιμασία αναζήτησης..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", στο "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "ΑπόκÏυψη ΕυÏεθέντων Αναζητήσεων"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Κλείσιμο πλαϊνής μπάÏας"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Άνοιγμα πλαϊνής μπάÏας"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "ΠεÏιεχόμενα"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "βÏέθηκε ευÏετήÏιο βασιζόμενο σε 4 στήλες. ΜποÏεί να αποτελεί σφάλμα της επέκτασης που χÏησιμοποιείτε: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Δεν υπάÏχει αναφοÏά για την υποσημείωση [%s]."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Η υποσημείωση [#] δεν αναφέÏεται."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ασυνεπείς αναφοÏές υποσημείωσης στα μεταφÏασμένα μηνÏματα. original: {0}, translated: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "ασυνεπείς αναφοÏές στα μεταφÏασμένα μηνÏματα. αÏχικό: {0}, μεταφÏασμένο: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ασυνεπείς αναφοÏές παÏαπομπής στο μεταφÏασμένο μήνυμα. αÏχικό: {0}, μεταφÏασμένο: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ασυνεπείς αναφοÏές ÏŒÏων στα μεταφÏασμένα μηνÏματα. αÏχικό: {0}, μεταφÏασμένο: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "πεÏισσότεÏοι από ένας στόχοι βÏέθηκαν για 'οποιαδήποτε' παÏαπομπή %r: θα μποÏοÏσε να είναι %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "Δεν ήταν δυνατή η λήψη απομακÏυσμένης εικόνας: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "Δεν ήταν δυνατή η λήψη απομακÏυσμένης εικόνας: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Άγνωστος Ï„Ïπος αÏχείου: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "μη κωδικοποιήσιμοι χαÏακτήÏες πηγής, θα αντικατασταθοÏν με \"?\": %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "παÏάβλεψη"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "αποτυχία"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "άγνωστος Ï„Ïπος κόμβου: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "σφάλμα ανάγνωσης: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "καταγÏαφή λάθους: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "ΑνέγκυÏος Ï„Ïπος ημεÏομηνίας. Τοποθετείστε στη στοιχειοσειÏά μονά εισαγωγικά εάν θέλετε να το εξάγετε απευθείας: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "το toctree πεÏιλαμβάνει αναφοÏά σε άγνωστο αÏχείο %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "εξαίÏεση κατά την αξιολόγηση μόνο της έκφÏασης οδηγίας: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "ο Ï€Ïοεπιλεγμένος Ïόλος %s δεν βÏέθηκε"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "δεν έχει καθοÏιστεί numfig_format για το %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Κανένα ID δεν έχει ανατεθεί στο κόμβο %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "Δεν ήταν δυνατή η λήψη του μεγέθους της εικόνας. Η επιλογή :scale: θα αγνοηθεί."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "άγνωστο toplevel_sectioning %r για την κλάσση %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr "Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿ :maxdepth:, θα αγνοηθεί."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "ο τίτλος του εγγÏάφου δεν είναι μονός κόμβος κειμένου"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "ο ανακαλυφθέν τίτλος κόμβος δεν βÏίσκεται σε τομέα, θέμα, πίνακα, Ï€Ïοειδοποίηση ή πλαϊνή μπάÏα"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Σημειώσεις υποσέλιδου"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "τόσο η επιλογή για tabularcolumns όσο και για :widths: δίνονται. Η επιλογή :widths: θα αγνοηθεί."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "η μονάδα διάστασης %s δεν είναι έγκυÏη. Θα αγνοηθεί."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "βÏέθηκε άγνωστος Ï„Ïπος εγγÏαφής ευÏετηÏίου %s"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[εικόνα: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[εικόνα]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "η λεζάντα δεν βÏίσκεται εντός μίας εικόνας."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "μη υλοποιημένος Ï„Ïπος κόμβου: %r"
diff --git a/sphinx/locale/en_DE/LC_MESSAGES/sphinx.js b/sphinx/locale/en_DE/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..86ed65e
--- /dev/null
+++ b/sphinx/locale/en_DE/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "en_DE",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo b/sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..6ac726b
--- /dev/null
+++ b/sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/en_DE/LC_MESSAGES/sphinx.po b/sphinx/locale/en_DE/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..74dd1c4
--- /dev/null
+++ b/sphinx/locale/en_DE/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: English (Germany) (http://app.transifex.com/sphinx-doc/sphinx-1/language/en_DE/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: en_DE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/en_FR/LC_MESSAGES/sphinx.js b/sphinx/locale/en_FR/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..b61b563
--- /dev/null
+++ b/sphinx/locale/en_FR/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "None",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo b/sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..2c153d4
--- /dev/null
+++ b/sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/en_FR/LC_MESSAGES/sphinx.po b/sphinx/locale/en_FR/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..e13ab81
--- /dev/null
+++ b/sphinx/locale/en_FR/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: English (France) (http://app.transifex.com/sphinx-doc/sphinx-1/language/en_FR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: en_FR\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/en_GB/LC_MESSAGES/sphinx.js b/sphinx/locale/en_GB/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..b079762
--- /dev/null
+++ b/sphinx/locale/en_GB/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "en_GB",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "&#169; %(copyright_prefix)s %(copyright)s.",
+ ", in ": ", in ",
+ "About these documents": "About these documents",
+ "Automatically generated list of changes in version %(version)s": "Automatically generated list of changes in version %(version)s",
+ "C API changes": "C API changes",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Changes in Version %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Collapse sidebar",
+ "Complete Table of Contents": "Complete Table of Contents",
+ "Contents": "Contents",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "Expand sidebar",
+ "Full index on one page": "Full index on one page",
+ "General Index": "General Index",
+ "Global Module Index": "Global Module Index",
+ "Go": "Go",
+ "Hide Search Matches": "Hide Search Matches",
+ "Index": "Index",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Index pages by letter",
+ "Indices and tables:": "Indices and tables:",
+ "Last updated on %(last_updated)s.": "Last updated on %(last_updated)s.",
+ "Library changes": "Library changes",
+ "Navigation": "Navigation",
+ "Next topic": "Next topic",
+ "Other changes": "Other changes",
+ "Overview": "Overview",
+ "Please activate JavaScript to enable the search\n functionality.": "Please activate JavaScript to enable the search\n functionality.",
+ "Preparing search...": "Preparing search...",
+ "Previous topic": "Previous topic",
+ "Quick search": "Quick search",
+ "Search": "Search",
+ "Search Page": "Search Page",
+ "Search Results": "Search Results",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "Search finished, found ${resultCount} page(s) matching the search query.",
+ "Search within %(docstitle)s": "Search within %(docstitle)s",
+ "Searching": "Searching",
+ "Searching for multiple words only shows matches that contain\n all words.": "Searching for multiple words only shows matches that contain\n all words.",
+ "Show Source": "Show Source",
+ "Table of Contents": "Table of Contents",
+ "This Page": "This Page",
+ "Welcome! This is": "Welcome! This is",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.",
+ "all functions, classes, terms": "all functions, classes, terms",
+ "can be huge": "can be huge",
+ "last updated": "last updated",
+ "lists all sections and subsections": "lists all sections and subsections",
+ "next chapter": "next chapter",
+ "previous chapter": "previous chapter",
+ "quick access to all modules": "quick access to all modules",
+ "search": "search",
+ "search this documentation": "search this documentation",
+ "the documentation for": "the documentation for"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo b/sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..b7dd186
--- /dev/null
+++ b/sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/en_GB/LC_MESSAGES/sphinx.po b/sphinx/locale/en_GB/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..6dd6136
--- /dev/null
+++ b/sphinx/locale/en_GB/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Adam Turner, 2022-2023
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Adam Turner, 2022-2023\n"
+"Language-Team: English (United Kingdom) (http://app.transifex.com/sphinx-doc/sphinx-1/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Cannot find source directory (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Output directory (%s) is not a directory"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Source directory and destination directory cannot be identical"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Running Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "This project needs at least Sphinx v%s and therefore cannot be built with this version."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "making output directory"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "while setting up extension %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' as currently defined in conf.py isn't a Python callable. Please modify its definition to make it a callable function. This is needed for conf.py to behave as a Sphinx extension."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "loading translations [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "done"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "not available for built-in messages"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "loading pickled environment"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "failed: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "No builder selected, using default: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "succeeded"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "finished with problems"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "build %s, %s warning (with warnings treated as errors)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "build %s, %s warnings (with warnings treated as errors)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "build %s, %s warning."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "build %s, %s warnings."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "build %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "node class %r is already registered, its visitors will be overridden"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "directive %r is already registered, it will be overridden"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "role %r is already registered, it will be overridden"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "the %s extension does not declare if it is safe for parallel reading, assuming it isn't - please ask the extension author to check and make it explicit"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "the %s extension is not safe for parallel reading"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "the %s extension does not declare if it is safe for parallel writing, assuming it isn't - please ask the extension author to check and make it explicit"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "the %s extension is not safe for parallel writing"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "doing serial %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "config directory doesn't contain a conf.py file (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "Invalid configuration value found: 'language = None'. Update your configuration to a valid language code. Falling back to 'en' (English)."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "cannot override dictionary config setting %r, ignoring (use %r to set individual elements)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "invalid number %r for config value %r, ignoring"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "cannot override config setting %r with unsupported type, ignoring"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "unknown config value %r in override, ignoring"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "No such config value: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Config value %r already present"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "There is a syntax error in your configuration file: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "The configuration file (or one of the modules it imports) called sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "There is a programmable error in your configuration file:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "The config value `source_suffix' expects a string, list of strings, or dictionary. But `%r' is given."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Section %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Fig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Table %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Listing %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "The config value `{name}` has to be a one of {candidates}, but `{current}` is given."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "The config value `{name}' has type `{current.__name__}'; expected {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "The config value `{name}' has type `{current.__name__}', defaults to `{default.__name__}'."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r not found, ignored."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add \"root_doc = 'contents'\" to your conf.py."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Event %r already present"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Unknown event name: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "Handler %r for event %r threw an exception"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "The %s extension is required by needs_extensions settings, but it is not loaded."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "This project needs the extension %s at least in version %s and therefore cannot be built with the loaded version (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Pygments lexer name %r is not known"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "multiple files found for the document \"%s\": %r\nUse %r for the build."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Builder class %s has no \"name\" attribute"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Builder %r already exists (in module %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Builder name %s not registered or available through entry point"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Builder name %s not registered"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domain %s already registered"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domain %s not yet registered"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "The %r directive is already registered to domain %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "The %r role is already registered to domain %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "The %r index is already registered to domain %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "The %r object_type is already registered"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "The %r crossref_type is already registered"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r is already registered"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser for %r is already registered"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Source parser for %s not registered"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Translator for %r already exists"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r already registered"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "maths renderer %s is already registered"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "the extension %r was already merged with Sphinx since version %s; this extension is ignored."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Original exception:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Could not import extension %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "extension %r has no setup() function; is it really a Sphinx extension module?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "The %s extension used by this project needs at least Sphinx v%s; it therefore cannot be built with this version."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "extension %r returned an unsupported object from its setup() function; it should return None or a metadata dictionary"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "invalid PEP number %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "invalid RFC number %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "theme %r doesn't have \"theme\" setting"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "theme %r doesn't have \"inherit\" setting"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "no theme named %r found, inherited by %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "setting %s.%s occurs in none of the searched theme configs"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "unsupported theme option %r given"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "file %r on theme path is not a valid zipfile or contains no theme"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "no theme named %r found (missing theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "a suitable image for %s builder not found: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "a suitable image for %s builder not found: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "building [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "writing output... "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "all of %d po files"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "targets for %d po files that are specified"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "targets for %d po files that are out of date"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "all source files"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "file %r given on command line does not exist, "
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "file %r given on command line is not under the source directory, ignoring"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "file %r given on command line is not a valid document, ignoring"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d source files given on command line"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "targets for %d source files that are out of date"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "building [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "looking for now-outdated files... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d found"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "none found"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "pickling environment"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "checking consistency"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "no targets are out of date."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "updating environment: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s added, %s changed, %s removed"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "reading sources... "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "docnames to write: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "preparing documents"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr "copying assets"
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "duplicated ToC entry found: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "copying images... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "cannot read image file %r: copying it instead"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "cannot copy image file %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "cannot write image file %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow not found - copying image files"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "writing mimetype file..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "writing META-INF/container.xml file..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "writing content.opf file..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "unknown mimetype for %s, ignoring"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "writing toc.ncx file..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "writing %s file..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "The overview file is in %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "no changes in version %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "writing summary file..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Module level"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "copying source files..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "could not read %r for changelog creation"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "The dummy builder generates no files."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "The ePub file is in %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "writing nav.xhtml file..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "conf value \"epub_uid\" should be XML NAME for EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "conf value \"epub_author\" should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "conf value \"epub_contributor\" should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "conf value \"epub_description\" should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "conf value \"epub_publisher\" should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "conf value \"epub_identifier\" should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "conf value \"version\" should not be empty for EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "invalid css_file: %r, ignored"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "The message catalogues are in %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "targets for %d template files"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "reading templates... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "writing message catalogues... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Look for any errors in the above output or in %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "broken link: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "The manual pages are in %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "no \"man_pages\" config value found; no manual pages will be written"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "writing"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "\"man_pages\" config value references unknown document %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "The HTML page is in %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "assembling single document"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "writing additional files"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "The Texinfo files are in %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nRun 'make' in that directory to run these through makeinfo\n(use 'make info' here to do that automatically)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "no \"texinfo_documents\" config value found; no documents will be written"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "\"texinfo_documents\" config value references unknown document %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "processing %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "resolving references..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (in "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "copying Texinfo support files"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "error writing file Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "The text files are in %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "error writing file %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "The XML files are in %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "The pseudo-XML files are in %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "build info file is broken: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "The HTML pages are in %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Failed to read build info file: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "General Index"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "next"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "previous"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "generating indices"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "writing additional pages"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "copying downloadable files... "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "cannot copy downloadable file %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "Failed to copy a file in html_static_file: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "copying static files"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "cannot copy static file %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "copying extra files"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "cannot copy extra file %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Failed to write build info file: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "search index couldn't be loaded, but not all documents will be built: the index will be incomplete."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "page %s matches two patterns in html_sidebars: %r and %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "a Unicode error occurred when rendering the page %s. Please make sure all config values that contain non-ASCII content are Unicode strings."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "An error happened in rendering the page %s.\nReason: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "dumping object inventory"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "dumping search index in %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "invalid js_file: %r, ignored"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Many math_renderers are registered. But no math_renderer is selected."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "Unknown math_renderer %r is given."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path entry %r does not exist"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path entry %r is placed inside outdir"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path entry %r does not exist"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path entry %r is placed inside outdir"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "logo file %r does not exist"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon file %r does not exist"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr "HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in configuration options)"
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentation"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "The LaTeX files are in %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nRun 'make' in that directory to run these through (pdf)latex\n(use `make latexpdf' here to do that automatically)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "no \"latex_documents\" config value found; no documents will be written"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "\"latex_documents\" config value references unknown document %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "no Babel option known for language %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "copying TeX support files"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "copying TeX support files..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "copying additional files"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Unknown configure key: latex_elements[%r], ignored."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "Unknown theme option: latex_theme_options[%r], ignored."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r doesn't have \"theme\" setting"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r doesn't have \"%s\" setting"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr "Failed to get a docname!"
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr "Failed to get a docname for source {source!r}!"
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr "No footnote was found for given reference node %r"
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "Exception occurred while building, starting debugger:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "Interrupted!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "reST markup error:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Encoding error:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "The full traceback has been saved in %s, if you want to report the issue to the developers."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Recursion error:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "This can happen with very large or deeply nested source files. You can carefully increase the default Python recursion limit of 1000 in conf.py with e.g.:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Exception occurred:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Please also report this if it was a user error, so that a better error message can be provided next time."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "A bug report can be filed in the tracker at <https://github.com/sphinx-doc/sphinx/issues>. Thanks!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "job number should be a positive number"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "For more information, visit <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nGenerate documentation from source files.\n\nsphinx-build generates documentation from the files in SOURCEDIR and places it\nin OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\nsettings. The 'sphinx-quickstart' tool may be used to generate template files,\nincluding 'conf.py'\n\nsphinx-build can create documentation in different formats. A format is\nselected by specifying the builder name on the command line; it defaults to\nHTML. Builders can also perform other tasks related to documentation\nprocessing.\n\nBy default, everything that is outdated is built. Output only for selected\nfiles can be built by specifying individual filenames.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "path to documentation source files"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "path to output directory"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "a list of specific files to rebuild. Ignored if -a is specified"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "general options"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "builder to use (default: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "write all files (default: only write new and changed files)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "don't use a saved environment, always read all files"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "path for the cached environment and doctree files (default: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "build in parallel with N processes where possible (special value \"auto\" will set N to cpu-count)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "path where configuration file (conf.py) is located (default: same as SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "use no config file at all, only -D options"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "override a setting in configuration file"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "pass a value into HTML templates"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "define tag: include \"only\" blocks with TAG"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "nit-picky mode, warn about all missing references"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "console output options"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "increase verbosity (can be repeated)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "no output on stdout, just warnings on stderr"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "no output at all, not even warnings"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "do emit colored output (default: auto-detect)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "do not emit coloured output (default: auto-detect)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "write warnings (and errors) to given file"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "turn warnings into errors"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "with -W, keep going when getting warnings"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "show full traceback on exception"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "run Pdb on exception"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "cannot combine -a option and filenames"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "cannot open warning file %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-D option argument must be in the form name=value"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-A option argument must be in the form name=value"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "automatically insert docstrings from modules"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "automatically test code snippets in doctest blocks"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "link between Sphinx documentation of different projects"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "write \"todo\" entries that can be shown or hidden on build"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "checks for documentation coverage"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "include maths, rendered as PNG or SVG images"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "include maths, rendered in the browser by MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "conditional inclusion of content based on config values"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "include links to the source code of documented Python objects"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "create .nojekyll file to publish the document on GitHub pages"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Please enter a valid path name."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Please enter some text."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Please enter one of %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Please enter either 'y' or 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Please enter a file suffix, e.g. '.rst' or '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Welcome to the Sphinx %s quickstart utility."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Please enter values for the following settings (just press Enter to\naccept a default value, if one is given in brackets)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Selected root path: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Enter the root path for documentation."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Root path for the documentation"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Error: an existing conf.py has been found in the selected root path."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart will not overwrite existing Sphinx projects."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Please enter a new root path (or just Enter to exit)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "You have two options for placing the build directory for Sphinx output.\nEither, you use a directory \"_build\" within the root path, or you separate\n\"source\" and \"build\" directories within the root path."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Separate source and build directories (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "Inside the root directory, two more directories will be created; \"_templates\"\nfor custom HTML templates and \"_static\" for custom stylesheets and other static\nfiles. You can enter another prefix (such as \".\") to replace the underscore."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Name prefix for templates and static dir"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "The project name will occur in several places in the built documentation."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Project name"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Author name(s)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx has the notion of a \"version\" and a \"release\" for the\nsoftware. Each version can have multiple releases. For example, for\nPython the version is something like 2.5 or 3.0, while the release is\nsomething like 2.5.1 or 3.0a1. If you don't need this dual structure,\njust set both to the same value."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Project version"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Project release"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "If the documents are to be written in a language other than English,\nyou can select a language here by its language code. Sphinx will then\ntranslate text that it generates into that language.\n\nFor a list of supported codes, see\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Project language"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "The file name suffix for source files. Commonly, this is either \".txt\"\nor \".rst\". Only files with this suffix are considered documents."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Source file suffix"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "One document is special in that it is considered the top node of the\n\"contents tree\", that is, it is the root of the hierarchical structure\nof the documents. Normally, this is \"index\", but if your \"index\"\ndocument is a custom template, you can also set this to another filename."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Name of your master document (without suffix)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Error: the master file %s has already been found in the selected root path."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart will not overwrite the existing file."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Please enter a new file name, or rename the existing file and press Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Indicate which of the following Sphinx extensions should be enabled:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Note: imgmath and mathjax cannot be enabled at the same time. imgmath has been deselected."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "A Makefile and a Windows command file can be generated for you so that you\nonly have to run e.g. `make html' instead of invoking sphinx-build\ndirectly."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Create Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Create Windows command file? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Creating file %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "File %s already exists, skipping."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Finished: An initial directory structure has been created."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "You should now populate your master file %s and create other documentation\nsource files. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Use the Makefile to build the docs, like so:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Use the sphinx-build command to build the docs, like so:\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "where \"builder\" is one of the supported builders, e.g. html, latex or linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nGenerate required files for a Sphinx project.\n\nsphinx-quickstart is an interactive tool that asks some questions about your\nproject and then generates a complete documentation directory and sample\nMakefile to be used with sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "quiet mode"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "project root"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Structure options"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "if specified, separate source and build dirs"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "if specified, create build dir under source dir"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "replacement for dot in _templates etc."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Project basic options"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "project name"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "author names"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "version of project"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "release of project"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "document language"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "source file suffix"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "master document name"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "use epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Extension options"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "enable %s extension"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "enable arbitrary extensions"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Makefile and Batchfile creation"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "create makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "do not create makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "create batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "do not create batchfile"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "use make-mode for Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "do not use make-mode for Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Project templating"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "template directory for template files"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "define a template variable"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Error: specified path is not a directory, or sphinx files already exist."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart only generate into a empty directory. Please specify a new root path."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Invalid template variable: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "non-whitespace stripped by dedent"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Invalid caption: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "line number spec is out of range(1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Cannot use both \"%s\" and \"%s\" options"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Include file %r not found or reading it failed"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Encoding %r used for reading included file %r seems to be wrong, try giving an :encoding: option"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Object named %r not found in include file %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Line spec %r: no lines pulled from include file %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "toctree glob pattern %r didn't match any documents"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree contains reference to excluded document %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree contains reference to nonexisting document %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "duplicated entry found in toctree: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Section author: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Module author: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Code author: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Author: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ".. acks content is not a list"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ".. hlist content is not a list"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "\":file:\" option for csv-table directive now recognises an absolute path as a relative path from source directory. Please update your document."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "Duplicate C declaration, also defined at %s:%s.\nDeclaration is '.. c:%s:: %s'."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parameters"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "Return values"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Returns"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "member"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variable"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "function"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "struct"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "union"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "type"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "function parameter"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "New in version %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Changed in version %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Deprecated since version %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "duplicate citation %s, other instance in %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Citation [%s] is not referenced."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "Duplicate C++ declaration, also defined at %s:%s.\nDeclaration is '.. cpp:%s:: %s'."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Template Parameters"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Throws"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "class"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "concept"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "template parameter"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (built-in function)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s method)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (class)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variable or constant)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribute)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Arguments"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "method"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attribute"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "module"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "duplicate %s description of %s, other %s in %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "duplicate label of equation %s, other instance in %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "Invalid math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variables"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Raises"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in module %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in module %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (built-in variable)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (built-in class)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (class in %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s class method)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s static method)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (%s property)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python Module Index"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Deprecated"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "exception"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "class method"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "static method"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "property"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "more than one target found for cross-reference %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (deprecated)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directive)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (directive option)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (role)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "directive"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "directive-option"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "role"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "duplicate description of %s %s, other instance in %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "environment variable; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Malformed option description %r, should look like \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" or \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s command line option"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "command line option"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "glossary term must be preceded by empty line"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "glossary terms must not be separated by empty lines"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "glossary seems to be misformatted, check indentation"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "glossary term"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "grammar token"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "reference label"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "environment variable"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programme option"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "document"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Module Index"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Search Page"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "duplicate label %s, other instance in %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "duplicate %s description of %s, other instance in %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig is disabled. :numref: is ignored."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "Failed to create a cross reference. Any number is not assigned: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "the link has no caption: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "invalid numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "invalid numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "undefined label: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "Failed to create a cross reference. A title or caption not found: %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "new config"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "config changed"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "extensions changed"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "build environment version not current"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "source directory has changed"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "This environment is incompatible with the selected builder, please choose another doctree directory."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Failed to scan documents in %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Domain %r is not registered"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "document isn't included in any toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "self referenced toctree found. Ignored."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "see %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "see also %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "unknown index entry type %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symbols"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "circular toctree references detected, ignoring: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree contains reference to document %r that doesn't have a title: no link will be generated"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "toctree contains reference to non-included document %r"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "image file not readable: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "image file %s not readable: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "download file not readable: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s is already assigned section numbers (nested numbered toctree?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "Would create file %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nLook recursively in <MODULE_PATH> for Python modules and packages and create\none reST file with automodule directives per package in the <OUTPUT_PATH>.\n\nThe <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\nexcluded from generation.\n\nNote: By default this script will not overwrite already created files."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "path to module to document"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "fnmatch-style file and/or directory patterns to exclude from generation"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "directory to place all output"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "maximum depth of submodules to show in the TOC (default: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "overwrite existing files"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "follow symbolic links. Powerful when combined with collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "run the script without creating files"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "put documentation for each module on its own page"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "include \"_private\" modules"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "filename of table of contents (default: modules)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "don't create a table of contents file"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "don't create headings for the module/package packages (e.g. when the docstrings already contain them)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "put module documentation before submodule documentation"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "interpret module paths according to PEP-0420 implicit namespaces specification"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "file suffix (default: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "generate a full project with sphinx-quickstart"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "append module_path to sys.path, used when --full is given"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "project name (default: root module name)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "project author(s), used when --full is given"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "project version, used when --full is given"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "project release, used when --full is given, defaults to --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "extension options"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s is not a directory."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "section \"%s\" gets labeled as \"%s\""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "invalid regex %r in %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Testing of coverage in the sources finished, look at the results in %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "invalid regex %r in coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "undocumented c api: %s [%s] in file %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "module %s could not be imported: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "undocumented python function: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "undocumented python class: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "undocumented python method: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "missing '+' or '-' in '%s' option."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' is not a valid option."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' is not a valid pyversion option"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "invalid TestCode type"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Testing of doctests in the sources finished, look at the results in %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "no code/output in %s block at %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "ignoring invalid doctest code: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== slowest reading durations ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "hardcoded link %r could be replaced by an extlink (try using %r instead)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Graphviz directive cannot have both content and a filename argument"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "External Graphviz file %r not found or reading it failed"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Ignoring \"graphviz\" directive without content."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "dot command %r cannot be run (needed for graphviz output), check the graphviz_dot setting"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot exited with error:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot did not produce an output file:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format must be one of 'png', 'svg', but is %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "dot code %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graph: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graph]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n\nTraceback: %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "convert exited with error:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "convert command %r cannot be run, check the image_converter setting"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "LaTeX command %r cannot be run (needed for maths display), check the imgmath_latex setting"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s command %r cannot be run (needed for maths display), check the imgmath_%s setting"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "display latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "inline latex %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "intersphinx inventory has moved: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "loading intersphinx inventory from %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "encountered some issues with some of the inventories, but they had working alternatives:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "failed to reach any of the inventories with the following issues:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(in %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(in %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "inventory for external cross-reference not found: %s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "role for external cross-reference not found: %s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "external %s:%s reference target not found: %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "intersphinx identifier %r is not string. Ignored"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "Failed to read intersphinx_mapping[%s], ignored: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[source]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "TODO entry found: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(The <<original entry>> is located in %s, line %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "original entry"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "highlighting module code... "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Module code"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Source code for %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Overview: module code"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>All modules for which code is available</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "invalid value for member-order option: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "invalid value for class-doc-from option: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "invalid signature for auto%s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "error while formatting arguments for %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "don't know which module to import for autodocumenting %r (try placing a \"module\" or \"currentmodule\" directive in the document, or giving an explicit module name)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "A mocked object is detected: %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "error while formatting signature for %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" in automodule name doesn't make sense"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "signature arguments or return annotation given for automodule %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ should be a list of strings, not %r (in module %s) -- ignoring __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "missing attribute mentioned in :members: option: module %s, attribute %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "Failed to get a function signature for %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "Failed to get a constructor signature for %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Bases: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "missing attribute %s in object %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "alias of %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "alias of TypeVar(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "Failed to get a method signature for %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "Invalid __slots__ found on %s. Ignored."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "Failed to parse a default argument value for %r: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "Failed to update signature for %r: parameter not found: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "Failed to parse type_comment for %r: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "autosummary references excluded document %r. Ignored."
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary: stub file not found %r. Check your autosummary_generate setting."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "A captioned autosummary requires :toctree: option. ignored."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "autosummary: failed to import %s.\nPossible hints:\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "failed to parse name %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "failed to import object %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: file not found: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary generats .rst files internally. But your source_suffix does not contain .rst. Skipped."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary: failed to determine %r to be documented, the following exception was raised:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] generating autosummary for: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] writing to %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary] failed to import %s.\nPossible hints:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nGenerate ReStructuredText using autosummary directives.\n\nsphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\nthe reStructuredText files from the autosummary directives contained in the\ngiven input files.\n\nThe format of the autosummary directive is documented in the\n``sphinx.ext.autosummary`` Python module and can be read using::\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "source files to generate rST files for"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "directory to place all output in"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "default suffix for files (default: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "custom template directory (default: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "document imported members (default: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "document exactly the members in module __all__ attribute. (default: %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Keyword Arguments"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Example"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Examples"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Notes"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Other Parameters"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "Receives"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "References"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Warns"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Yields"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "invalid value set (missing closing brace): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "invalid value set (missing opening brace): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "malformed string literal (missing closing quote): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "malformed string literal (missing opening quote): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Attention"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Caution"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Danger"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Error"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Hint"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Important"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Note"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "See also"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Warning"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "continued from previous page"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "continues on next page"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "Non-alphabetical"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Numbers"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "page"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Table of Contents"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Search"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Show Source"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Overview"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Welcome! This is"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "the documentation for"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "last updated"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indices and tables:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Complete Table of Contents"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "lists all sections and subsections"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "search this documentation"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Global Module Index"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "quick access to all modules"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "all functions, classes, terms"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Full index on one page"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Index pages by letter"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "can be huge"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Search within %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "About these documents"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr "&#169; %(copyright_prefix)s %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Last updated on %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Search %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Previous topic"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "previous chapter"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Next topic"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "next chapter"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Please activate JavaScript to enable the search\n functionality."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Searching for multiple words only shows matches that contain\n all words."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "search"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Search Results"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Quick search"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "This Page"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Changes in Version %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatically generated list of changes in version %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Library changes"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API changes"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Other changes"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "Search finished, found ${resultCount} page(s) matching the search query."
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Searching"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Preparing search..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", in "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Hide Search Matches"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Collapse sidebar"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Expand sidebar"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Contents"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "4 column based index found. It might be a bug of extensions you use: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Footnote [%s] is not referenced."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Footnote [#] is not referenced."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "inconsistent footnote references in translated message. original: {0}, translated: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "inconsistent references in translated message. original: {0}, translated: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "inconsistent citation references in translated message. original: {0}, translated: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "inconsistent term references in translated message. original: {0}, translated: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "Could not determine the fallback text for the cross-reference. Might be a bug."
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "more than one target found for 'any' cross-reference %r: could be %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s reference target not found: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r reference target not found: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "Could not fetch remote image: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "Could not fetch remote image: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Unknown image format: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "undecodable source characters, replacing with \"?\": %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "skipped"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "failed"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "Problem in %s domain: field is supposed to use role '%s', but that role is not in the domain."
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "unknown directive or role name: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "unknown node type: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "reading error: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "writing error: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Invalid date format. Quote the string by single quote if you want to output it directly: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr "%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "toctree contains ref to nonexisting file %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "exception while evaluating only directive expression: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "default role %s not found"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format is not defined for %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Any IDs not assigned for %s node"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "Could not obtain image size. :scale: option is ignored."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "unknown %r toplevel_sectioning for class %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr "too large :maxdepth:, ignored."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "document title is not a single Text node"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "encountered title node not in section, topic, table, admonition or sidebar"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Footnotes"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "both tabularcolumns and :widths: option are given. :widths: is ignored."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "dimension unit %s is invalid. Ignored."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "unknown index entry type %s found"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[image: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "caption not inside a figure."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "unimplemented node type: %r"
diff --git a/sphinx/locale/en_HK/LC_MESSAGES/sphinx.js b/sphinx/locale/en_HK/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..96761bc
--- /dev/null
+++ b/sphinx/locale/en_HK/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "en_HK",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo b/sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..d2a9903
--- /dev/null
+++ b/sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/en_HK/LC_MESSAGES/sphinx.po b/sphinx/locale/en_HK/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..bb9316f
--- /dev/null
+++ b/sphinx/locale/en_HK/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: English (Hong Kong) (http://app.transifex.com/sphinx-doc/sphinx-1/language/en_HK/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: en_HK\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/eo/LC_MESSAGES/sphinx.js b/sphinx/locale/eo/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..706f506
--- /dev/null
+++ b/sphinx/locale/eo/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "eo",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "A\u016dtora rajto",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "Indico universala",
+ "Global Module Index": "Universala modjulindico",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "Indico &ndash; %(key)s",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "Sekva temo",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "Anta\u016da temo",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "sekvo \u0109apitro",
+ "previous chapter": "anta\u016da \u0109apitro",
+ "quick access to all modules": "",
+ "search": "ser\u0109u",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/eo/LC_MESSAGES/sphinx.mo b/sphinx/locale/eo/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..3d9b26a
--- /dev/null
+++ b/sphinx/locale/eo/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/eo/LC_MESSAGES/sphinx.po b/sphinx/locale/eo/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..0d33621
--- /dev/null
+++ b/sphinx/locale/eo/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Dinu Gherman <gherman@darwin.in-berlin.de>, 2014
+# Tatsuro YOKOTA <hidaruma@outlook.jp>, 2021
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Tatsuro YOKOTA <hidaruma@outlook.jp>, 2021\n"
+"Language-Team: Esperanto (http://app.transifex.com/sphinx-doc/sphinx-1/language/eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Ne povas trovi fontan dosierujon (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Indico universala"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indico"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "sekva"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "antaÅ­a"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentaro"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "AÅ­toro:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametroj"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "membro"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkcio"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "nomaĵo"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipo"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klaso"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klaso)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "datenoj"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atributo"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "escepto"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "vidu %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "vidu ankaÅ­ %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Simboloj"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Avertoj"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Eraro"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Averto"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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 "Universala modjulindico"
+
+#: 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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indico &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "AÅ­tora rajto"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "AntaÅ­a temo"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "antaŭa ĉapitro"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Sekva temo"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "sekvo ĉapitro"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "serĉu"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.js b/sphinx/locale/es/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..26dcfb7
--- /dev/null
+++ b/sphinx/locale/es/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "es",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", en ",
+ "About these documents": "Sobre este documento",
+ "Automatically generated list of changes in version %(version)s": "Lista de cambios generada autom\u00e1ticamente en la versi\u00f3n %(version)s",
+ "C API changes": "Cambios en la API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Cambios en la versi\u00f3n %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Contraer barra lateral",
+ "Complete Table of Contents": "\u00cdndice de contenidos completo",
+ "Contents": "Contenidos",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Creado usando <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "Expandir barra lateral",
+ "Full index on one page": "\u00cdndice completo en una p\u00e1gina",
+ "General Index": "\u00cdndice General",
+ "Global Module Index": "\u00cdndice Global de M\u00f3dulos",
+ "Go": "Ir a",
+ "Hide Search Matches": "Ocultar coincidencias de la b\u00fasqueda",
+ "Index": "\u00cdndice",
+ "Index &ndash; %(key)s": "\u00cdndice &ndash; %(key)s",
+ "Index pages by letter": "\u00cdndice alfab\u00e9tico de p\u00e1ginas",
+ "Indices and tables:": "\u00cdndices y tablas:",
+ "Last updated on %(last_updated)s.": "Actualizado por \u00faltima vez en %(last_updated)s.",
+ "Library changes": "Cambios en la biblioteca",
+ "Navigation": "Navegaci\u00f3n",
+ "Next topic": "Pr\u00f3ximo tema",
+ "Other changes": "Otros cambios",
+ "Overview": "Resumen",
+ "Please activate JavaScript to enable the search\n functionality.": "Por favor, active JavaScript para habilitar la funcionalidad\n de b\u00fasqueda.",
+ "Preparing search...": "Preparando b\u00fasqueda...",
+ "Previous topic": "Tema anterior",
+ "Quick search": "B\u00fasqueda r\u00e1pida",
+ "Search": "B\u00fasqueda",
+ "Search Page": "P\u00e1gina de B\u00fasqueda",
+ "Search Results": "Resultados de la b\u00fasqueda",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "B\u00fasqueda finalizada, se encontraron ${resultCount} p\u00e1ginas que coinciden con la consulta de b\u00fasqueda.",
+ "Search within %(docstitle)s": "Buscar en %(docstitle)s",
+ "Searching": "Buscando",
+ "Searching for multiple words only shows matches that contain\n all words.": "La b\u00fasqueda de varias palabras solo muestra coincidencias que contienen\n todas las palabras.",
+ "Show Source": "Mostrar el c\u00f3digo",
+ "Table of Contents": "Tabla de contenido",
+ "This Page": "Esta p\u00e1gina",
+ "Welcome! This is": "\u00a1Bienvenido! Este es",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Su b\u00fasqueda no coincide con ning\u00fan documentos. Por favor, aseg\u00farese de que todas las palabras est\u00e9n correctamente escritas y que usted all\u00e1 seleccionado las suficientes categor\u00edas.",
+ "all functions, classes, terms": "todas las funciones, clases, t\u00e9rminos",
+ "can be huge": "puede ser muy grande",
+ "last updated": "actualizado por \u00faltima vez el",
+ "lists all sections and subsections": "muestra todas las secciones y subsecciones",
+ "next chapter": "pr\u00f3ximo cap\u00edtulo",
+ "previous chapter": "cap\u00edtulo anterior",
+ "quick access to all modules": "acceso r\u00e1pido a todos los m\u00f3dulos",
+ "search": "buscar",
+ "search this documentation": "buscar en esta documentaci\u00f3n",
+ "the documentation for": "la documentaci\u00f3n para"
+ },
+ "plural_expr": "n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/es/LC_MESSAGES/sphinx.mo b/sphinx/locale/es/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..59eba65
--- /dev/null
+++ 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
new file mode 100644
index 0000000..350c41d
--- /dev/null
+++ b/sphinx/locale/es/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3703 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Adam Turner, 2023
+# Edward Villegas-Pulgarin <cosmoscalibur@gmail.com>, 2018
+# Edward Villegas-Pulgarin <cosmoscalibur@gmail.com>, 2018-2019
+# Edward Villegas-Pulgarin <cosmoscalibur@gmail.com>, 2018
+# Guillem Borrell <guillem@torroja.dmt.upm.es>, 2011
+# Ivan García <ivan.garcia@studio-point.com>, 2019
+# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2013-2018,2020,2022
+# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2022
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016,2021
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Adam Turner, 2023\n"
+"Language-Team: Spanish (http://app.transifex.com/sphinx-doc/sphinx-1/language/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: es\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "No se encuentra directorio fuente (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Directorio de salida (%s) no es un directorio"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Directorio fuente y directorio destino no pueden ser idénticos"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Ejecutando Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Este proyecto necesita al menos Sphinx v%s y por lo tanto no se puede construir con esta versión."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "creando directorio de salida"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "mientras configura la extensión %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' como se define actualmente en el archivo conf.py no es un Python invocable. Por favor, modifique su definición para que sea una función invocable. Esto es necesario para que el archivo conf.py se comporte como una extensión de Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "cargando traducciones [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "hecho"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "no disponible para mensajes incorporados"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "cargando el ambiente pickled"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "fallo: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Ningún constructor seleccionado, utilizando el valor predeterminado: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "éxitoso"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "finalizo con problemas"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "compilación %s, %sadvertencia (con advertencias tratadas como errores)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "compilación %s, %s advertencias (con advertencias tratadas como errores)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "construir %s, %s advertencia."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "compilación %s, %s advertencias."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "construir %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "la clase de nodo %r ya está registrada, sus visitantes serán reemplazados"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "la directiva %r ya está registrada, esa se reemplazará"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "el rol %r ya está registrado, ese se reemplazará"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "la extensión de %s no declara si es seguro para la lectura en paralelo, asumiendo que no es - consulte con el autor de la extensión para comprobar y hacer explícito"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "la extensión %s no es segura para lectura paralela"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "la extensión %s no declara si es seguro para la escritura paralela, suponiendo que no lo sea - solicite al autor de la extensión que lo verifique y haga explicito"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "la extensión %s no es segura para escritura paralela"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "realizando serialmente %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "directorio de configuración no contiene un archivo conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "Se encontró un valor de configuración no válido: 'language = None'. Actualice su configuración a un código de idioma válido. Volviendo a definir 'en' (Inglés)."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "no se puede reemplazar el ajuste de la configuración del diccionario %r, haciendo caso omiso (utilice %r para definir elementos individuales)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "número no válido %r de valor de configuración %r, haciendo caso omiso"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "no se puede reemplazar los ajustes de configuración %r con tipo no compatible, haciendo caso omiso"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "valor de configuración desconocido %r en anulación, ignorando"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "No hay tal valor de configuración: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Valor de configuración %r ya presente"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Hay un error de sintaxis en su archivo de configuración: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "El archivo de configuración (o uno de los módulos que importa) invocó sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Hay un error programable en su archivo de configuración:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "El valor de configuración `source_suffix' espera una cadena de caracteres, una lista de cadena de caracteres o un diccionario. Pero `%r' es dado."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Sección %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Figura %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabla %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Lista %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "El valor de configuración `{name}` tiene que ser uno de {candidates}, pero fue dado `{current}`."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "El valor de configuración `{name}' tiene tipo `{current.__name__}'; esperado {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "El valor de configuración `{name}' tiene el tipo `{current.__name__}', el valor predeterminado es `{default.__name__}'."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r no fue encontrado, se ignora."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Desde v2.0, Sphinx usa \"index\" como root_doc por defecto. Agregue \"root_doc = 'contents'\" a su archivo conf.py."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Evento %r ya presente"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Nombre de evento desconocido: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "Manipulador %r para el evento %r lanzó una excepción"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "La extensión %s es requerida por la configuración de needs_extensions, pero esta no es cargada."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Este proyecto necesita la extensión %s por lo menos en la versión %s y por lo tanto no puede ser construido con la versión cargada (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "El nombre del lexer de pigmentos %r se desconoce"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "varios archivos encontrados para el documento \"%s\": %r\nUse %r para la compilación."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Constructor clase %s no tiene ningún atributo \"name\""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Constructor %r ya existe (en el módulo %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Nombre de constructor %s no registrados o disponibles a través del punto de entrada"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Nombre de constructor %s no registrado"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "dominio %s ya esta registrado"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "dominio %s no esta registrado"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "La directiva %r ya fue registrada en el dominio %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "El rol %r ya fue registrado en el dominio %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "El índice %r ya fue registrado en el dominio %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "El %r object_type ya está registrado"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "El %r crossref_type ya está registrado"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r ya está registrado"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser para %r ya está registrado"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Analizador de fuentes para %s no registrado"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Traductor para %r ya existe"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "kwargs para la función add_node() debe ser una tupla de función (visitar, salir): %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r ya esta registrado"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "el renderizador matemático %s ya está registrado"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "la extensión %r ya se fusionó con Sphinx desde la versión %s; esta extensión se omite."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Excepción original:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "No puede importar la extensión %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "extensión %r no tiene ninguna función setup(); ¿es realmente un módulo de extensión de Sphinx?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "La extensión %s utilizada por este proyecto necesita al menos la versión de Sphinx v%s; por lo tanto no puede ser construido con esta versión."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "extensión %r devuelve un objeto no soportado de su función setup(); debe devolver un diccionario de metadatos o ninguno"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "número de PEP inválido %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "número RFC inválido %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "tema %r no tiene configuraciones de \"tema\""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "tema %r no tiene configuraciones de \"heredar\""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "no encontrado ningún tema llamado %r, heredado por %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "configuración de %s.%s se produce en ninguna de las configuraciones de tema buscado"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "opción de tema no soportada %r fue dada"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "archivo %r o ruta del tema no es un archivo zip válido o no contiene ningún tema"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "sin tema llamado %r encontrado (¿falta el archivo theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "una imagen adecuada para %s constructor no encontrado: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "una imagen adecuada para %s constructor no encontrado: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "compilando [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "escribiendo salida... "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "todos los %d archivos po"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "los objetivos para %d los archivos po que se especifican"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "los objetivos para %d los archivos po que estan desactualizados"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "todos los archivos fuente"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "archivo %r dado en la línea de comandos no está en el directorio fuente, ignorado"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d archivos fuente dados en la línea de comandos"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "los objetivos para %d los archivos fuentes que estan desactualizados"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "compilando [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "buscando por archivos no actualizados... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d encontrado"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "no encontrado"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "preparando ambiente"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "verificando consistencia"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "no hay archivos objetivo desactualizados."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "actualizando ambiente: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%sañadido, %s cambiado, %s removido"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "leyendo fuentes... "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "docnames para escribir: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "preparando documentos"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "entrada de tabla de contenido duplicada encontrada: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "copiando imágenes... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "no puede leer el archivo de imagen %r: en su lugar, lo copia"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "no se puede copiar archivo de imagen %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "no se puede escribir archivo de imagen %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow no encontrada - copiando archivos de imágenes"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "escribiendo el archivo mimetype..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "escribiendo el archivo META-INF/container.xml..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "escribiendo el archivo content.opf..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "mimetype desconocido para %s, ignorando"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "escribiendo el archivo toc.ncx..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "escribiendo archivo %s..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "El archivo de resumen está en %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "no hay cambios en versión %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "escribiendo archivo de resumen..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Funciones incorporadas"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Nivel de módulo"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "copiando archivos fuente..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "no se pudo leer %r for para la creación del registro de cambios"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "El constructor ficticio no genera archivos."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "El archivo ePub está en %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "escribiendo el archivo nav.xhtml..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_language\" (o \"language\") no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "el valor de configuración \"epub_uid\" debe ser XML NAME para EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_title\" (or \"html_title\") no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_author\" no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_contributor\" no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_description\" no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_publisher\" no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_copyright\" (or \"copyright\") no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "el valor de configuración \"epub_identifier\" no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "el valor de configuración \"version\" no debe estar vacío para EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "css_file inválido: %r, ignorado"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Los catálogos de mensajes están en %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "objetivos para los archivos de plantillas %d"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "leyendo plantillas... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "escribiendo catálogos de mensajes... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Busque cualquier error en la salida anterior o en el archivo %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "enlace roto: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "Error al compilar expresiones regulares en linkcheck_allowed_redirects: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Las páginas del manual están en %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "no se encontró el valor de configuración \"man_pages\"; no se escribirán las páginas del manual"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "escribiendo"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "El valor de configuración \"man_pages\" hace referencia a un documento desconocido %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "Página HTML está en %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "ensamblando documento sencillo"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "escribiendo archivos adicionales"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Los archivos Texinfo están en %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nEjecute el comando 'make' en ese directorio para ejecutarlos a través de makeinfo\n(usa el comando 'make info' aquí para hacer esto automáticamente)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "no se encontró el valor de configuración \"texinfo_documents\"; no se escribirán documentos"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "El valor de configuración \"texinfo_documents\" hace referencia a un documento desconocido %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "procesando %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "resolviendo referencias..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (en "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "copiando archivos de soporte Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "error escribiendo archivo Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Los archivos de texto están en %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "error escribiendo archivo %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Los archivos XML están en %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Los archivos pseudo-XML están en %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "el archivo de información de compilación está roto: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Las páginas HTML están en %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Error al leer la información de compilación del fichero: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d de %B de %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ãndice General"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "siguiente"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "generando índices"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "escribiendo páginas adicionales"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "copiando archivos descargables... "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "no se puede copiar archivo descargable %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "Error al copiar un archivo en html_static_file: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "copiar archivos estáticos"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "no se puede copiar archivo estático %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "copiando archivos extras"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "no se puede copiar archivo extra %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Error al escribir el archivo de información de compilación: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "no se pudo cargar el índice de búsqueda, pero no se crearán todos los documentos: el índice estará incompleto."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "página %s coincide con dos patrones en html_sidebars: %r y %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "Se produjo un error Unicode al representar la página %s. Asegúrese de que todos los valores de configuración que contengan contenido que no sea ASCII sean cadenas Unicode."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Ha ocurrido un error al renderizar la pagina %s.\nRazón: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "volcar inventario de objetos"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "volcar el índice de búsqueda en %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "js_file inválido: %r, ignorado"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Muchos math_renderers están registrados. Pero no se ha seleccionado math_renderer."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "Desconocido math_renderer %r es dado."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "entrada html_extra_path %r no existe"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "entrada html_extra_path %r se coloca dentro de outdir"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "entrada html_static_path %r no existe"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "entrada html_static_path %r se coloca dentro de outdir"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "archivo de logo %r no existe"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "el archivo %r usado para el favicon no existe"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "documentación de %s - %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Los archivos LaTeX están en %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nEjecuta el comando 'make' en este directorio para compilarlos usando (pdf)latex\n(usa el comando 'make latexpdf' aquí para hacer esto automáticamente)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "no se encontró el valor de configuración \"latex_documents\"; no se escribirán documentos"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "valor de configuración \"latex_documents\" hace referencia a un documento desconocido %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Versión"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "No se conoce la opción de Babel para el idioma %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "copiando archivos de soporte TeX"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "copiando archivos de soporte TeX..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "copiando archivos adicionales"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Clave de configuración desconocida: latex_elements[%r], ignorada."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "Opción de tema desconocida: latex_theme_options[%r], ignorado."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r no tiene configuración de \"tema\""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r no tiene configuración de \"%s\""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "Ha ocurrido un error al compilar, iniciando depurador:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "¡Interrumpido!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "error en marcado de reST:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Error de codificación:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "El rastreo completo se ha guardado en %s, si desea informar el problema a los desarrolladores."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Error de recursión:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "Esto puede ocurrir con archivos de origen muy grandes o profundamente anidados. Puede aumentar cuidadosamente el límite de recurrencia predeterminado de Python de 1000 en el archivo conf.py con, por ej.:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Ha ocurrido una excepción:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Por favor, informe también esto si fue un error del usuario, de modo que la próxima vez se pueda proporcionar un mejor mensaje de error."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Se puede presentar un informe de error en el rastreador en <https://github.com/sphinx-doc/sphinx/issues>. ¡Gracias!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "número de trabajo debe ser un número positivo"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "Para más información visite <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nGenerar documentación a partir de archivos fuente.\n\nsphinx-build genera documentación a partir de los archivos en SOURCEDIR y la\ncoloca en OUTPUTDIR. Busca 'conf.py' en SOURCEDIR para los ajustes de configuración.\nLa herramienta 'sphinx-quickstart' se puede usar para generar archivos de plantilla,\nincluido 'conf.py'\n\nsphinx-build puede crear documentación en diferentes formatos. Se selecciona un\nformato especificando el nombre del constructor en la línea de comando; por defecto\nes HTML. Los constructores también pueden realizar otras tareas relacionadas con\nel procesamiento de la documentación.\n\nDe forma predeterminada, se construye todo lo que está desactualizado. La salida solo\npara archivos seleccionados se puede generar especificando nombres de archivo individuales.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "ruta a los archivos fuente de la documentación"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "ruta al directorio de salida"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "una lista de archivos específicos para reconstruir. Ignorado si se especifica -a"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "opciones generales"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "constructor a usar (por defecto: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "escribir todos los archivos (por defecto: solo escribir archivos nuevos y modificados)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "no usar un entorno guardado, siempre leer todos los archivos"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "ruta para el entorno en caché y los archivos doctree (predeterminado: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "construir en paralelo con N procesos donde sea posible (el valor especial \"auto\" establecerá N en recuento de CPU)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "ruta del archivo de configuración (conf.py) donde se encuentra (predeterminado: igual que el valor SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "no use ningún archivo de configuración, solomente opciones -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "sobreescribir un ajuste en el fichero de configuración"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "pasar un valor a la plantilla HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "define la etiqueta: incluye bloques \"only\" con TAG"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "modo quisquilloso, advierte sobre todas las referencias faltantes"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "opciones de salida de consola"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "aumentar la verbosidad (puede repetirse)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "sin salida en salida estándar, solo advertencias en los mensajes de error estándar"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "sin salida, ni siquiera advertencias"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "emitir salida de color (predeterminado: detección automática)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "no emite salida de color (predeterminado: detección automática)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "escribir avisos (y errores) al fichero indicado"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "convertir advertencias en errores"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "con -W, sigue adelante cuando recibas advertencias"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "mostrar rastreo completo en excepción"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "ejecutar Pdb en excepción"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "no se puede combinar la opción -a y nombres de archivo"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "no se puede abrir el archivo de advertencia %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "argumento de la opción -D debe estar en la forma nombre=valor"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "argumento de la opción -A debe estar en la forma nombre=valor"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "insertar automáticamente docstrings de los módulos"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "probar automáticamente fragmentos de código en bloques doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "enlace entre la documentación de Sphinx de diferentes proyectos"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "escribir entradas de \"todo\" que se pueden mostrar u ocultar en la compilación"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "verificación para el cubrimiento de la documentación"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "incluir expresiones matemáticas, mostradas como imágenes PNG o SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "incluir matemática, mostrada en el navegador por MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "inclusión condicional de contenido basado en valores de configuración"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "incluir enlaces al código fuente de objetos documentados de Python"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "crear archivo .nojekyll para publicar el documento en páginas GitHub"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Por favor, ingrese un nombre de ruta válido."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Por favor, ingrese algún texto."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Por favor, ingrese uno de %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Por favor, ingrese cualquiera de 'y' o 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Por favor, ingrese un archivo de sufijo, por ejemplo, '.rst' o '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Bienvenido a la utilidad de inicio rápido de Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Ingrese los valores para las siguientes configuraciones (solo presione Entrar para\naceptar un valor predeterminado, si se da uno entre paréntesis)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Ruta raíz seleccionada: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Ingrese la ruta raíz para la documentación."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Ruta raíz para la documentación"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Error: un archivo conf.py ya existe en la ruta raíz seleccionada."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart no sobreescribirá proyectos existentes de Sphinx."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Por favor, ingrese una nueva ruta raíz (o ingrese Enter para salir)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Tiene dos opciones para colocar el directorio de compilación para la salida de Sphinx.\nO usas un directorio \"_build\" dentro de la ruta raíz, o separas\ndirectorios \"fuente\" y \"compilación\" dentro de la ruta raíz."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Separar directorios fuente y compilado (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "Dentro del directorio raíz, se crearán dos directorios más; \"_templates\"\npara plantillas HTML personalizadas y \"_static\" para hojas de estilo personalizadas y otras archivos\nestáticos. Puede ingresar otro prefijo (como \".\") Para reemplazar el guión bajo."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Prefijo de nombre para directorios de plantillas y estático"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "El nombre del proyecto aparecerá en varios lugares en la documentación construida."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Nombre de proyecto"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Autor(es)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx tiene la noción de una \"versión\" y un \"lanzamiento\" para el\nsoftware. Cada versión puede tener varios lanzamientos. Por ejemplo, para\nPython, la versión es algo así como 2.5 o 3.0, mientras que el lanzamiento es\nalgo así como 2.5.1 o 3.0a1. Si no necesita esta estructura dual, simplemente\nconfigure ambas con el mismo valor."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Versión del proyecto"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Liberación del proyecto"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "Si los documentos deben escribirse en un idioma que no sea inglés,\npuede seleccionar un idioma aquí por su código de idioma. Sphinx entonces\ntraducir el texto que genera a ese idioma.\n\nPara obtener una lista de códigos compatibles, vea\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Lenguaje del proyecto"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "El sufijo del nombre de archivo para los archivos de fuente. Comúnmente, esto es \".txt\"\no \".rst\". Solo los archivos con este sufijo se consideran documentos."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Sufijo del archivo fuente"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "Un documento es especial porque se considera el nodo superior del\n\"contents tree\", es decir, es la raíz de la estructura jerárquica\nde los documentos. Normalmente, esto es \"index\", pero si su documento \"index\"\nes una plantilla personalizada, también puede establecerlo en otro nombre de archivo."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Nombre del documento maestro (sin sufijo)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Error: el archivo maestro %s ya se ha encontrado en la ruta raíz seleccionada."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart no sobreescribirá el archivo existente."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Ingrese un nuevo nombre de archivo o cambie el nombre del archivo existente y presione Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Indique cuál de las siguientes extensiones de Sphinx deben habilitarse:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Nota: imgmath y mathjax no se pueden habilitar al mismo tiempo. imgmath ha sido deseleccionado."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Se puede generar un archivo Makefile y un archivo de comandos de Windows para que usted\nsolo tiene que ejecutar, por ejemplo, `make html' en lugar de invocar sphinx-build\ndirectamente."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "¿Crear Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "¿Crear archivo de comandos para Windows? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Creando archivo %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "El archivo %s ya existe, omitiendo."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Terminado: se ha creado una estructura de directorio inicial."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Ahora debe completar su archivo maestro %s y crear otros archivos fuente\nde documentación. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Use el archivo Makefile para compilar los documentos, así ejecute el comando:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Use el comando sphinx-build para compilar los documentos, así ejecute el comando:\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "donde \"builder\" es uno de los constructores compatibles, por ejemplo, html, latex o linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nGenere los archivos necesarios para un proyecto Sphinx.\n\nsphinx-quickstart es una herramienta interactiva que hace algunas preguntas sobre su\nproyecto y luego genera un directorio completo de documentación y un ejemplo del archivo\nMakefilepara ser utilizado con el comando sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "modo silencioso"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "raíz del proyecto"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Opciones de estructura"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "si se especifica, separe los directorios de fuentes y de compilación"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "si se especifica, cree un directorio de compilación en el directorio de origen"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "reemplazo para punto en _templates, etc."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Opciones básicas del proyecto"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "nombre del proyecto"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "autores"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "versión del proyecto"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "liberación del proyecto"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "lenguaje del documento"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "sufijo de archivo fuente"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "nombre de documento maestro"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "usar epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Opciones de extensión"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "habilitada extensión %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "habilitar extensiones arbitrarias"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "creación del Makefile y Batchfile"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "crear makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "no crear makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "crear batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "no crear batchfile"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "use el modo make para Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "no use el modo make para Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Plantillas de proyecto"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "directorio de plantillas para archivos de plantillas"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "definir una variable de proyceto"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "se especifica \"quiet\", pero no se especifica ninguno de \"project\" o \"author\"."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Error: la ruta especificada no es un directorio, o ya existen archivos sphinx."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart solo se genera en un directorio vacío. Por favor, especifique una nueva ruta raíz."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Variable de plantilla inválida: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "no espacios en blanco eliminados por identado"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Subtítulo inválido: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "la especificación del número de línea está fuera de range(1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "No puede utilizar ambas opciones \"%s\" y \"%s\""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Archivo incluido %r no encontrado o la lectura del mismo fallo"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Codificación %r usado para la lectura archivo incluido %r parece estar mala, trate de darle una opción :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Objeto nombrado %r no encontrado en el archivo incluido %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "No puede utilizar a \"lineno-match\" con un conjunto desunido de \"líneas\""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Línea especifico %r: sin líneas tiradas desde el archivo incluido %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "patrón global toctree %r no coincide con ningún documento"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree contiene referencia al documento excluido %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree contiene referencias a documentos inexistentes %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "entrada duplicada encontrada en toctree: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor de la sección: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor del módulo: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Código del autor: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ".. contenido de los reconocimientos no es una lista"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ".. hlist contenido no es una lista"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "\":file:\" La opción para la directiva csv-table ahora reconoce una ruta absoluta como una ruta relativa desde el directorio de origen. Actualice su documento."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "Declaración de C duplicada, también definida en %s:%s.\nLa declaración es '.. c:%s:: %s'."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parámetros"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "Valores devueltos"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Devuelve"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Tipo del valor devuelto"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "miembro"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variable"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "función"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "estructura"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "unión"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumeración"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipo"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "parámetro de función"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nuevo en la versión %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Distinto en la versión %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde la versión %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "citación duplicada %s, otra instancia en %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Citación [%s] no está referenciada."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "Declaración de C++ duplicada, también definida en %s:%s.\nLa declaración es '.. cpp:%s:: %s'."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parametros de Plantilla"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Lanzamientos"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "clase"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "concepto"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "parámetro de plantilla"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (función incorporada)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (método de %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (clase)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variable global o constante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atributo de %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumentos"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "método"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dato"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atributo"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "duplicada %s descripción de %s, otra %s en %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "etiqueta duplicada de la ecuación %s, otra instancia en %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "No válido math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variables"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Muestra"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (en el módulo %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (en el módulo %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable incorporada)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (clase incorporada)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (clase en %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (método de clase de %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (método estático de %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (%s propiedad)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Ãndice de Módulos Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "excepción"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "método de la clase"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "método estático"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "propiedad"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "se encontró más de un objetivo para la referencia cruzada %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (obsoleto)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directiva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (opción directiva)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rol)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "directiva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "directive-option"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rol"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "descripción duplicada de %s %s, otra instancia en %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "variables de entorno; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Descripción de la opción con formato incorrecto %r, debe verse como \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" o \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "opción de línea de comando %s"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "opción de línea de comando"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "el término del glosario debe ir precedido de una línea vacía"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "los términos del glosario no deben estar separados por líneas vacías"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "el glosario parece estar mal formateado, verifique la sangría"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "termino de glosario"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "gramática simbólica"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "etiqueta de referencia"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "variables de entorno"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opción de programa"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "documento"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Ãndice de Módulos"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Página de Búsqueda"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "etiqueta duplicada %s, otra instancia en %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "duplicada %s descripción de %s, otra instancia en %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig está deshabilitado. :numref: se ignora."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "Error al crear una referencia cruzada. No se asigna ningún número: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "el enlace no tiene subtítulo: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "inválido numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "inválido numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "etiqueta indefinida: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "No se pudo crear una referencia cruzada. Un título o subtítulo no encontrado: %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "nueva configuración"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "configuración modificada"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "extensiones modificadas"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "la versión del entorno de compilación no es actual"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "directorio fuente ha cambiado"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Este entorno es incompatible con el generador seleccionado, elija otro directorio doctree."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Error al escanear los documentos en %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Dominio %r no está registrado"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "documento no está incluido en ningún toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "toctree auto referenciado encontrado. Ignorado."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "ver %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "ver también %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "tipo de entrada de índice desconocido %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Símbolos"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "referencias circulares de toctree detectadas, ignorando: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree contiene una referencia al documento %r que no tiene título: no se generará ningún enlace"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "el árbol de la tabla de contenido contiene una referencia a un documento no incluido %r"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "archivo de imagen no legible: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "archivo de imagen %s no legible: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "el archivo de descarga no es legible: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s ya tiene asignados números de sección (¿número de árbol anidado?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "Debería crear archivo %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nMire recursivamente en <MODULE_PATH> para módulos y paquetes de Python y cree\nun archivo reST con directivas automodule por paquete en el <OUTPUT_PATH>.\n\nLos <EXCLUDE_PATTERN>s pueden ser patrones de archivo y/o directorio que serán\nexcluidos de la generación.\n\nNota: Por defecto, este script no sobrescribirá los archivos ya creados."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "ruta al módulo al documento"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "archivo de estilo fnmatch y/o patrones de directorio para excluir de la generación"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "directorio para colocar toda la salida"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "rofundidad máxima de submódulos para mostrar en la tabla de contenido (predeterminado: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "sobreescribir archivos existentes"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "seguir enlaces simbólicos. Potente cuando se combina con el paquete collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "ejecutar la rutina sin crear archivos"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "poner documentación para cada módulo en su propia página"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "incluir \"_private\" en módulos"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "nombre de archivo de la tabla de contenido (predeterminado: módulos)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "no crear un archivo de tabla de contenido"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "no cree encabezados para los paquetes de módulos/paquetes (por ejemplo, cuando las cadenas de documentación docstrings ya los contienen)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "poner la documentación del módulo antes de la documentación del submódulo"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "interpretar las rutas del módulo de acuerdo con la especificación de espacios de nombres implícitos en la PEP-0420"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "sufijo de archivo (por defecto: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "generar un proyecto completo con sphinx-quickstart"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "agregue module_path al sys.path, que se usa cuando se da el parámetro --full"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "nombre del proyecto (predeterminado: nombre del módulo raíz)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "autor(es) del proyecto, utilizado cuando se da el parámetro --full"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "versión del proyecto, utilizado cuando se da el parámetro --full"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "lanzamiento del proyecto, utilizado cuando se da el parámetro --full, por defecto es --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "opciones de extensión"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s no es un directorio."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "expresiones regulares inválidas %r en %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Pruebas de cobertura en las fuentes terminadas, mira los resultados en %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "expresiones regulares inválidas %r en coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "api c indocumentado: %s [%s] en archivo %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "el módulo %s no podía ser importado: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "función python indocumentada: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "clase python indocumentada: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "método python indocumentado: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "falta '+' o '-' en la opción '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' no es una opción válida."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' no es una opción pyversion válida"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "tipo de TestCode inválido"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Prueba de doctests en las fuentes terminadas, mira los resultados en %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "sin código/salida en el bloque %s en %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "ignorando el código doctest no válido: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== duraciones de lectura más lentas ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "enlace codificado %r podría reemplazarse por un enlace externo (intente usar %r en su lugar)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Directiva Graphviz no puede tener tanto el contenido y un argumento de nombre de archivo"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Archivo externo Graphviz %r no encontrado o la lectura del mismo fallo"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Ignorando la directiva \"graphviz\" sin contenido."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "comando dot %r no se puede ejecutar (necesarios para la salida de graphviz), Compruebe la configuración de graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot salió con error:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot no produjo un archivo de salida:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "el valor del parámetro graphviz_output_format debe ser uno de 'png', 'svg', pero es %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "dot código %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[gráfica: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[gráfica]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "No se puede ejecutar el comando de conversión de imagen %r. 'sphinx.ext.imgconverter' requiere ImageMagick por defecto. Asegúrese de que esté instalado o configure la opción 'image_converter' a un comando de conversión personalizado.\n\nRastrear: %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "convert salió con error:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "el comando convert %r no puede ejecutar, compruebe el valor de configuración image_converter"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "comando LaTeX %r no se puede ejecutar (necesario para la visualización matemática), compruebe la configuración de imgmath_latex"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "comando %s %r no se puede ejecutar (necesario para la visualización matemática), verifique la configuración imgmath_%s"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "visualizar latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "en línea latex %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "el inventario intersphinx se ha movido: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "cargando inventario intersphinx desde %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "encontró algunos problemas con algunos de los inventarios, pero tenían alternativas de trabajo:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "no se pudo llegar a ninguno de los inventarios con los siguientes problemas:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(en %s versión %s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(en %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "inventario para referencia cruzada externa no encontrado: %s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "rol para referencia cruzada externa no encontrado: %s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "%s externo: destino de referencia %s no encontrado: %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "el identificador de intersphinx %r no es una cadena. Ignorado"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "Error al leer intersphinx_mapping[%s], ignorado: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[fuente]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Por hacer"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "Marca TODO encontrada: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<entrada original>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(La <<entrada original>> se encuentra en %s, línea %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "entrada original"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "resaltando el código del módulo... "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[documentos]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Código de módulo"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Código fuente para %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Resumen: código de modulo"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Todos los módulos para los cuales disponen código</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "valor no válido para la opción de pedido de miembro: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "valor no válido para la opción class-doc-from: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "firma inválida para auto%s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "error al formatear argumentos para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc: no pudo determinar %s.%s (%r) para ser documentado, se planteó la siguiente excepción:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "no sabe qué módulo importar para el autodocumento %r (intente colocar una directiva \"module\" o \"currentmodule\" en el documento o dar un nombre explícito al módulo)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "Se detecta un objeto simulado: %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "error al formatear la firma para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" en el nombre del automodule no tiene sentido"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "argumentos de firma o anotación de retorno dada para automodule %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ debe ser una lista de cadenas, no %r (en el módulo %s) -- ignorando __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "atributo faltante mencionado en la :members: módulo %s, atributo %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "Error al obtener una firma de función para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "Error al obtener una firma de constructor para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Bases: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "falta el atributo %s en el objeto %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "alias de %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "alias de TypeVar(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "Error al obtener una firma de método para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "Se encontraron __slots__ no válidas en %s. Ignorado."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "Error al analizar un valor de argumento predeterminado para %r: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "Error al actualizar la firma para %r: parámetro no encontrado: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "Error al analizar type_comment para %r: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "referencias autosummary excluidas documento %r. Ignorado."
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary: no se encontró el archivo stub %r. Verifique su configuración de autosummary_generate."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "Un resumen automático con subtítulos requiere la opción :toctree: ignorado."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "autosummary: no se pudo importar %s.\nPosibles pistas:\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "fallo al analizar el nombre %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "fallo al importar el objeto %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: archivo no encontrado: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary genera archivos .rst internamente. Pero su source_suffix no contiene archivo .rst. Saltado."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary: no se pudo determinar %r que se documentará, se produjo la siguiente excepción:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] generar autosummary para: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] escribiendo a %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary] no se pudo importar %s.\nPosibles pistas:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nGenere ReStructuredText usando directivas de resumen automático \"autosummary\".\n\nsphinx-autogen es una interfaz para sphinx.ext.autosummary.generate. Genera\nlos archivos reStructuredText de las directivas autosummary contenidas en el\nlos archivos de entrada dados.\n\nEl formato de la directiva autosummary está documentado en el módulo Python\n``sphinx.ext.autosummary`` y se puede leer usando el siguiente comando::\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "archivos fuente para generar archivos rST para"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "directorio para colocar toda la salida en"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "sufijo predeterminado para archivos (predeterminado: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "directorio de plantillas personalizadas (predeterminado: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "documento importados miembros (predeterminado: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "documentar exactamente los miembros en module __all__ attribute. (por defecto: %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argumentos de palabras clave"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Ejemplo"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Ejemplos"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Notas"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Otros parámetros"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "Recibe"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Referencias"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Avisos"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Campos"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "conjunto de valores no válidos (falta la llave de cierre): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "conjunto de valor no válido (falta llave de apertura): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "literal de cadena con formato incorrecto (falta la comilla de cierre): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "literal de cadena con formato incorrecto (falta la comilla de apertura): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Atención"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Prudencia"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Peligro"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Error"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Consejo"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Ver también"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Truco"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Advertencia"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "proviene de la página anterior"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "continúe en la próxima página"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "No alfabético"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Números"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "página"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Tabla de contenido"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Búsqueda"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Ir a"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Mostrar el código"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Resumen"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "¡Bienvenido! Este es"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "la documentación para"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "actualizado por última vez el"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Ãndices y tablas:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Ãndice de contenidos completo"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "muestra todas las secciones y subsecciones"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "buscar en esta documentación"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "acceso rápido a todos los módulos"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "todas las funciones, clases, términos"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Ãndice completo en una página"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Ãndice alfabético de páginas"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "puede ser muy grande"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navegación"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Sobre este documento"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Actualizado por última vez en %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "Creado usando <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Buscar en %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Tema anterior"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "capítulo anterior"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Próximo tema"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "próximo capítulo"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Por favor, active JavaScript para habilitar la funcionalidad\n de búsqueda."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "La búsqueda de varias palabras solo muestra coincidencias que contienen\n todas las palabras."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "buscar"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Resultados de la búsqueda"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Su búsqueda no coincide con ningún documentos. Por favor, asegúrese de que todas las palabras estén correctamente escritas y que usted allá seleccionado las suficientes categorías."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Búsqueda rápida"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Esta página"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Cambios en la versión %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de cambios generada automáticamente en la versión %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Cambios en la biblioteca"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Cambios en la API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Otros cambios"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "Búsqueda finalizada, se encontraron ${resultCount} páginas que coinciden con la consulta de búsqueda."
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Buscando"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Preparando búsqueda..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", en "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Ocultar coincidencias de la búsqueda"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Contraer barra lateral"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Expandir barra lateral"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Contenidos"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "Ãndice basado en 4 columnas encontrado. Puede ser un error de extensiones que usted usa: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Pie de página [%s] no está referenciado."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Pie de página [#] no está referenciado."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referencias de pie de página inconsistentes en el mensaje traducido. original: {0}, traducido: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "referencias inconsistentes en el mensaje traducido. original: {0}, traducido: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referencias de citas inconsistentes en el mensaje traducido. original: {0}, traducido: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referencias de término inconsistentes en el mensaje traducido. original: {0}, traducido: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "No se pudo determinar el texto alternativo para la referencia cruzada. Podría ser un error."
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "más de un objetivo destino encontrado para 'cualquier' referencia cruzada %r: podría ser %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s objetivo de referencia no encontrado: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r objetivo de referencia no encontrado: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "No se pudo recuperar la imagen remota: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "No se pudo recuperar la imagen remota: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Formato de imagen desconocido: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "caracteres fuente no codificables, reemplazando con \"?\": %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "omitido"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "fallado"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "Problema en el dominio %s: se supone que el campo debe usar el rol '%s', pero ese rol no está en el dominio."
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "directiva desconocida o nombre de rol: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "tipo de nodo desconocido: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "leyendo error: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "escribiendo error: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Formato de fecha inválido. Cite la cadena con comillas simples si desea generarla directamente: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "toctree contiene referencia al archivo inexistente %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "excepción al evaluar solamente la expresión directiva: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "rol por defecto %s no encontrado"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format no está definido para %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Cualquier ID no asignado para el nodo %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "No se pudo obtener el tamaño de la imagen. La opción :scale: se ignora."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "desconocida %r toplevel_sectioning para la clase %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr "demasiado grande :maxdepth:, ignorado."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "título del documento no es un nodo de Texto único"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "no se encontró el nodo de título en la sección, tema, tabla, advertencia o barra lateral"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Notas a pie de página"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "ambas columnas tabulares y la opción :widths: se dan. La opción :widths: se ignora."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "la unidad de dimensión %s no es válida. Ignorado."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "tipo de entrada de índice desconocido %s encontrado"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[imagen: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[imagen]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "subtítulo no dentro de una figura."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "tipo de nodo no implementado: %r"
diff --git a/sphinx/locale/es_CO/LC_MESSAGES/sphinx.js b/sphinx/locale/es_CO/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..8559601
--- /dev/null
+++ b/sphinx/locale/es_CO/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "es_CO",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo b/sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..1a213b5
--- /dev/null
+++ b/sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/es_CO/LC_MESSAGES/sphinx.po b/sphinx/locale/es_CO/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..858362a
--- /dev/null
+++ b/sphinx/locale/es_CO/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Colombia) (http://app.transifex.com/sphinx-doc/sphinx-1/language/es_CO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: es_CO\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/et/LC_MESSAGES/sphinx.js b/sphinx/locale/et/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..970c9f2
--- /dev/null
+++ b/sphinx/locale/et/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "et",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "Info selle dokumentatsiooni kohta",
+ "Automatically generated list of changes in version %(version)s": "Automaatselt genereeritud nimekiri versiooni %(version)s muutustest",
+ "C API changes": "C API muutused",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Muutused versioonis %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Varja k\u00fclgriba",
+ "Complete Table of Contents": "T\u00e4ielik sisukorratabel",
+ "Contents": "Sisukord",
+ "Copyright": "Autori\u00f5igus",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "N\u00e4ita k\u00fclgriba",
+ "Full index on one page": "T\u00e4isindeks \u00fchel lehel",
+ "General Index": "\u00dcldindeks",
+ "Global Module Index": "Globaalne moodulite indeks",
+ "Go": "Otsi",
+ "Hide Search Matches": "Varja otsingu tulemused",
+ "Index": "Indeks",
+ "Index &ndash; %(key)s": "Indeks &ndash; %(key)s",
+ "Index pages by letter": "Indeksi lehek\u00fcljed algust\u00e4he kaupa",
+ "Indices and tables:": "Indeksid ja tabelid:",
+ "Last updated on %(last_updated)s.": "Viimati uuendatud %(last_updated)s.",
+ "Library changes": "Teegi muutused",
+ "Navigation": "Navigatsioon",
+ "Next topic": "J\u00e4rgmine teema",
+ "Other changes": "\u00dclej\u00e4\u00e4nud muutused",
+ "Overview": "\u00dclevaade",
+ "Please activate JavaScript to enable the search\n functionality.": "Otsingu v\u00f5imaldamiseks tuleb aktiveerida JavaScript.",
+ "Preparing search...": "Otsingu ettevalmistamine...",
+ "Previous topic": "Eelmine teema",
+ "Quick search": "Kiirotsing",
+ "Search": "Otsing",
+ "Search Page": "Otsinguleht",
+ "Search Results": "Otsingu tulemused",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Otsi %(docstitle)s piires",
+ "Searching": "Otsimine",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "N\u00e4ita l\u00e4htekoodi",
+ "Table of Contents": "Sisukorratabel",
+ "This Page": "K\u00e4esolev leht",
+ "Welcome! This is": "Tervitused! See on",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sinu otsingule ei vastanud \u00fckski dokument. Palun veendu, et k\u00f5ik sisestatud s\u00f5nad on \u00f5igesti kirjutatud ja sa oled valinud piisavalt kategooriaid.",
+ "all functions, classes, terms": "k\u00f5ik funktsioonid, klassid ja terminid",
+ "can be huge": "v\u00f5ib olla v\u00e4ga suur",
+ "last updated": "viimati uuendatud",
+ "lists all sections and subsections": "toob v\u00e4lja k\u00f5ik sektsioonid ja alamsektsioonid",
+ "next chapter": "j\u00e4rgmine jaotis",
+ "previous chapter": "eelmine jaotis",
+ "quick access to all modules": "kiire ligip\u00e4\u00e4s k\u00f5igile moodulitele",
+ "search": "otsi",
+ "search this documentation": "otsi sellest dokumentatsioonist",
+ "the documentation for": "dokumentatsioon projektile"
+ },
+ "plural_expr": "(n != 1)"
+}); \ 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 0000000..ce4890c
--- /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 0000000..1f89fea
--- /dev/null
+++ b/sphinx/locale/et/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3698 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Aivar Annamaa <aivar.annamaa@gmail.com>, 2011
+# Ivar Smolin <okul at linux ee>, 2012
+# Ivar Smolin <okul@linux.ee>, 2013-2022
+# Luc Saffre <luc.saffre@gmail.com>, 2015
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Ivar Smolin <okul@linux.ee>, 2013-2022\n"
+"Language-Team: Estonian (http://app.transifex.com/sphinx-doc/sphinx-1/language/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Lähtekataloogi (%s) pole võimalik leida"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Väljundkataloog (%s) ei ole kataloog"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Lähtekataloog ja sihtkataloog ei tohi olla identsed"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx v%s käitamine"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "See projekt vajab vähemalt Sphinxi v%s ja seetõttu pole projekti võimalik käesoleva versiooniga ehitada."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "väljundkataloogi loomine"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "tõlgete laadimine [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "valmis"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "serialiseeritud keskkonna laadimine"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "tõrge: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Ehitajat pole valitud, kasutatakse vaikimisi ehitajat: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "oli edukas"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "lõppes probleemidega"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "ehitamine %s, %s hoiatus."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "ehitamine %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "laiendus %s pole rööbiti lugemiseks turvaline"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "laiendus %s pole rööbiti kirjutamiseks turvaline"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "seadistuste kataloog (%s) ei sisalda faili conf.py"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "vigane arv %r seadistuse väärtusele %r, eiratakse"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Puudub määratud seadistusväärtus: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Seadistuste väärtus %r on juba olemas"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Sinu seadistusfailis on süntaksi viga: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Seadistusfail (või mõni selle poolt imporditud moodulitest) kutsus välja sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Sektsioon %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Joonis %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabel %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Nimekiri %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r ei leitud, eiratakse."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Sündmus %r on juba olemas"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Tundmatu sündmuse nimi: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "needs_extensions sätted nõuavad laiendust %s, kuid see pole laaditud."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "See projekt vajab laiendust %s vähemalt versiooniga %s ja seetõttu pole projekti võimalik laaditud versiooniga (%s) ehitada."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Ehitaja klassil %s puudub atribuut \"name\""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Ehitaja %r on juba olemas (moodulis %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Ehitajat nimega %s pole registreeritud"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domeen %s on juba registreeritud"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domeen %s pole veel registreeritud"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser on %r jaoks juba registreeritud"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Lähtekoodi analüsaatorit pole %s jaoks registreeritud"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Algne erind:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Laiendust %s pole võimalik importida"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "erindil %r puudub funktsioon setup(); kas see on päriselt Sphinxi laiendusmoodul?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Pythoni täiustusettepanekud; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "teemal %r puudub \"theme\" säte"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "teemal %r puudub \"inherit\" säte"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "fail %r teemarajal pole korrektni zip-fail või ei sisalda see teemat"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "teemat nimega %r ei leitud (kas theme.conf on puudu?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "ehitamine [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "väljundi kirjutamine... "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "%d määratud po-faili sihtfailid"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "%d po-faili sihtfailid on aegunud"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "kõik lähtefailid"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "%d lähtefaili sihtfailid on aegunud"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "ehitamine [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "praeguseks aegunud failide otsimine... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "leitud %d"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "ei leitud"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "kooskõla kontrollimine"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "aegunud sihtfaile pole"
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "keskkonna uuendamine:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "lisatud %s, muudetud %s, eemaldatud %s"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "lähtefailide lugemine..."
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "dokumentide ettevalmistamine"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "kujutiste kopeerimine... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "kujutise faili %r pole võimalik kopeerida: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "kujutise faili %r pole võimalik kirjutada: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "faili %s kirjutamine..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "Ãœlevaatefail asub kataloogis %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "versioonis %s pole muutusi."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "kokkuvõttefaili kirjutamine..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Sisseehitatud"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Mooduli tase"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "lähtefailide kopeerimine..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "vigane css_file: %r, eiratakse"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Sõnumikataloogid asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "%d mallifaili sihtfailid"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "mallide lugemine... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "sõnumikataloogide kirjutamine... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Otsi vigu ülalolevast väljundist või failist %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Juhendi lehed asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "seadistusparameetrit \"man_pages\" ei leitud, juhendi lehti ei kirjutata"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "seadistusparameeter \"man_pages\" viitab tundmatule dokumendile %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML-leht asub kataloogis %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "täiendavate failide kirjutamine"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Texinfo failid asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "seadistusparameetrit \"texinfo_documents\" ei leitud, dokumente ei kirjutata"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "seadistusparameeter \"texinfo_documents\" viitab tundmatule dokumendile %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "viidete lahendamine..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (pealkirjas "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "Texinfo tugifailide kopeerimine"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "viga faili Makefile kirjutamisel: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Tekstifailid asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "viga faili %s kirjutamisel: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "XML-failid asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "PseudoXML-failid asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTML-lehed asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Viga ehitamise infofaili lugemisel: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d. %b %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ãœldindeks"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indeks"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "järgmine"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "eelmine"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "indeksite genereerimine"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "täiendavate lehtede kirjutamine"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "allalaaditavate failide kopeerimine..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "staatilist faili %r pole võimalik kopeerida"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "lisafailide kopeerimine"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "lisafaili %r pole võimalik kopeerida"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Viga ehitamise infofaili kirjutamisel: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "lehe %s renderdamisel tekkis Unicode viga. Palun veendu, et kõik mitte-ASCII sisuga seadistusparameetrid on kirjeldatud Unicode stringidena."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "otsinguindeksi tõmmise kirjutamine keelele %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "vigane js_file: %r, eiratakse"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path kirjet %r pole olemas"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path kirje %r asub väljaspool väljundkataloogi"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "logofaili %r pole olemas"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon faili %r pole olemas"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentatsioon"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTeX-failid asuvad kataloogis %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nNende jooksutamiseks läbi (pdf)latex programmi käivita selles kataloogis\n'make' (selle automaatseks tegemiseks kasuta `make latexpdf')."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "seadistusparameetrit \"latex_documents\" ei leitud, dokumente ei kirjutata"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "seadistusparameeter \"latex_documents\" viitab tundmatule dokumendile %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Redaktsioon"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "TeX-i tugifailide kopeerimine"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "TeX-i tugifailide kopeerimine..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "lisafailide kopeerimine"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "Katkestatud!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Rekursiooni viga:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Kui see oli kasutaja viga, siis anna palun sellest teada, et tulevikus oleks võimalik parem veateade väljastada."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Vearaportit on võimalik esitada träkkeris aadressil <https://github.com/sphinx-doc/sphinx/issues>. Aitäh!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "dokumentatsiooni lähtefailide rada"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "väljundkataloogi rada"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "määratud failide uuestiehitamine. Võtme -a korral eiratakse"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "üldsuvandid"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "kasutatav ehitaja (vaikimisi: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "kõikide failide kirjutamine (vaikimisi kirjutatakse ainult uued ja muutunud failid)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "salvestatud keskkonda ei kasutata, alati loetakse kõik failid"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "puhverdatud keskkonna ja dokumendipuu rada (vaikimisi: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "rööbiti ehitamine N protsessiga, kui võimalik (eriväärtus \"auto\" määrab N väärtuseks protsessorite arvu)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "seadistusfaili (conf.py) asukoha rada (vaikimisi sama mis SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "seadistusfaili ei kasutata üldse, ainult -D suvandid"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "seadistusfailis määratud väärtuse asendamine"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "väärtuse edastamine HTML-mallidesse"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "konsooliväljundi suvandid"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "hoiatuste (ja vigade) kirjutamine määratud faili"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "hoiatuste muutmine vigadeks"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "erindi korral täieliku tagasijälituse näitamine"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "erindi korral Pdb käivitamine"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "suvandit -a ja failinimesid pole võimalik kombineerida"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "hoiatuste faili %r pole võimalik avada: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-D suvandi argument peab olema vormingus nimi=väärtus"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-A suvandi argument peab olema vormingus nimi=väärtus"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "moodulite dokumentatsioonistringide automaatne lisamine"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "dokumentatsioonistringides olevate koodijuppide automaattestimine"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "eri projektide Sphinx-dokumentatsiooni omavaheline viitamine"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "\"teha\" sissekannete kirjutamine, mida võib ehitamisega peita või näidata"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "dokumentatsiooni katvuse kontrollid"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "matemaatika kaasamine, mis renderdatakse PNG- või SVG-kujutisteks"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "matemaatika kaasamine, mis renderdatakse veebisirvikus MathJax-i abil"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "sisu tingimuslik kaasamine seadistusparameetrite alusel"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "dokumenteeritud Python-objektide lähtekoodile viitamise kaasamine"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ".nojekyll faili loomine dokumentide avaldamiseks GitHub-i lehtedel"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Palun sisesta mingi tekst."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Palun sisesta kas 'y' või 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Tere tulemast kasutama Sphinx %s lendstardi utiliiti."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Palun sisesta väärtused järgnevate sätete jaoks (kandiliste sulgude vahel\nvõib olla vaikeväärtus, millega nõustumiseks vajuta lihtsalt Enter)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Valitud juurkataloog: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Viga: valitud juurkataloogist leiti olemasolev conf.py."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart ei kirjuta olemasolevaid Sphinx-projekte üle."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Palun sisesta uus juurkataloog (või vajuta Enter lõpetamiseks)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Sphinx'i väljundi ehitamise kataloogi asetamiseks on kaks valikut.\nVõid kasutada kataloogi \"_build\" juurkataloogis või eraldiseisvaid \n\"source\" ja \"build\" katalooge juurkataloogis."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Lähtekoodi ja ehitamise kataloogide eraldamine (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Mallide ja staatilise kataloogi nime eesliide"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Projekti nimi"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Autorite nimed"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Projekti versioon"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Projekti väljalase"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Projekti keel"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Lähtefaili järelliide"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Sinu põhidokumendi nimi (ilma järelliiteta)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Viga: valitud juurkataloogist leiti peafail %s."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart ei kirjuta olemasolevat faili üle."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Palun sisesta uus failinimi või nimeta olemasolev fail ümber ja vajuta Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Märkus: imgmath ja mathjax ei saa korraga lubatud olla. imgmath eemaldati valikust."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Kas luua Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Kas luua Windowsi käsufail? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Faili %s loomine."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Fail %s on juba olemas ja jäetakse vahele."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Lõpetamine: Algne kataloogistruktuur on loodud."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Sa peaks nüüd asustama oma peafaili %s ja looma ülejäänud dokumentatsiooni\nlähtefailid. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Dokumentide ehitamiseks kasuta Makefile, näiteks:\n make ehitaja"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Dokumentide ehitamiseks kasuta käsku sphinx-build, näiteks:\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "kus \"ehitaja\" on üks toetatud ehitajatest, nt. html, latex või linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nSphinx-projekti jaoks vajalike failide genereerimine.\n\nsphinx-quickstart on interaktiivne tööriist, mis küsib mõned küsimused Sinu\nprojekti kohta ja seepeale genereerib täieliku dokumentatsioonikataloogi ning\nnäidis-Makefile kasutamiseks koos sphinx-buildiga.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "vaikne režiim"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Struktuuri suvandid"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "kasutamise korral eraldatakse lähtefailide ja ehitamise kataloogid"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Projekti põhisuvandid"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "projekti nimi"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "autorite nimed"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "projekti versioon"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "projekti väljalase"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "dokumendi keel"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "lähtefaili järelliide"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "põhidokumendi nimi"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Laienduste suvandid"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "laienduse %s lubamine"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "suvaliste laienduste määramine"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Makefile ja Batchfile loomine"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "makefile loomine"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "makefile loomata jätmine"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "batchfile loomine"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "batchfile loomata jätmine"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Projekti loomine mallist"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "mallifailide kataloog"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "malli muutuja kirjeldamine"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Vigane mallimuutuja: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Vigane selgitustekst: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Suvandeid \"%s\" ja \"%s\" pole võimalik korraga kasutada"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Sektsiooni autor: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Mooduli autor: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Koodi autor: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parameetrid"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Tagastab"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Tagastustüüp"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "liige"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "muutuja"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funktsioon"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "loend"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tüüp"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "funktsiooni parameeter"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Uus versioonis %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Muudetud versioonis %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Iganenud alates versioonist %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Malli parameetrid"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klass"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (sisseehitatud funktsioon)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s meetod)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klass)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globaalmuutuja või konstant)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atribuut)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumendid"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (moodul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "meetod"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "andmed"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribuut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "moodul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "võrrandil %s on topeltsilt, teine instants on %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "Vigane math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Muutujad"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (moodulis %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (moodulis %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (sisseehitatud muutuja)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (sisseehitatud klass)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klass moodulis %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (klassi %s meetod)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s staatiline meetod)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Pythoni moodulite indeks"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moodulid"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Iganenud"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "erind"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klassi meetod"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "staatiline meetod"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (iganenud)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiiv)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (roll)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktiiv"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "roll"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "keskkonnamuutuja; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s käsureasuvand"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "käsureasuvand"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "sõnastiku termin"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "grammatika märk"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "viite silt"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "keskkonnamuutuja"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programmi suvand"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "dokument"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Mooduli indeks"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Otsinguleht"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "vigane numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "vigane numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "See keskkond pole valitud ehitajaga ühilduv, palun vali mõni teine dokumendipuu kataloog."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "dokument pole ühegi sisukorrapuu osa"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "vaata %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "vaata ka %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Sümbolid"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "kujutise fail pole loetav: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "kujutise fail %s pole loetav: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "laienduse suvandid"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s pole kataloog."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Lähtefailide katvustestimine on lõppenud, vaata tulemusi failist %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "vigane TestCode tüüp"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Lähtefailide doctest-testimine on lõppenud, vaata tulemusi failist %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "vigase doctest koodi eiramine: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Graphviz direktiivil ei tohi samaaegselt olla argumendid content ja filename"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Välist Graphviz-faili %r ei leitud või esines tõrge selle lugemisel"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Ilma sisuta \"graphviz\" direktiivi eiramine."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "dot käsku %r pole võimalik käivitada (vajalik graphvizi väljundi jaoks), kontrolli graphviz_dot sätteid"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format peab olema kas 'png' või 'svg', kuid mitte %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[joonis: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[joonis]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "teisendamise käsku %r pole võimalik käivitada, kontrolli image_converter sätteid"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(projektis %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[lähtekood]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Teha"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "Leitud TEHA kirje: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<algne kirje>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<algne kirje>> asub failis %s, real %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "algne kirje"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumentatsioon]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Mooduli kood"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s lähtekood</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Ãœlevaade: mooduli kood"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Kõik lähtekoodiga moodulid</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Põlvnemine: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "tõrge objekti %s importimisel"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] automaatkokkuvõtte genereerimine failile: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] kirjutamine kataloogi %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "lähtefailid, mille kohta rST-faile genereerida"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "väljundfailide kataloog"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "failide vaikimisi järelliide (vaikimisi: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "kohandatud mallide kataloog (vaikimisi: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "imporditud liikmete dokumenteerimine (vaikimisi: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Võtmesõnadega argumendid"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Näide"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Näited"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Märkused"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Tähelepanu"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Ettevaatust"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Oht"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Viga"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Vihje"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Tähtis"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Märkus"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Vaata ka"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Nõuanne"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Hoiatus"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "jätk eelmisele leheküljele"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "jätkub järgmisel leheküljel"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "lehekülg"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Sisukorratabel"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Otsing"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Otsi"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Näita lähtekoodi"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Ãœlevaade"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Tervitused! See on"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentatsioon projektile"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "viimati uuendatud"
+
+#: 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 sisukorratabel"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "toob välja kõik 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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeks &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "Navigatsioon"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Otsi %(docstitle)s piires"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Info selle dokumentatsiooni kohta"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Autoriõigus"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Viimati uuendatud %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Otsi %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Eelmine teema"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "eelmine jaotis"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Järgmine teema"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "järgmine jaotis"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Otsingu võimaldamiseks tuleb aktiveerida JavaScript."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "otsi"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Otsingu tulemused"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Sinu otsingule ei vastanud ükski dokument. Palun veendu, et kõik sisestatud sõnad on õigesti kirjutatud ja sa oled valinud piisavalt kategooriaid."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Kiirotsing"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Käesolev leht"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Muutused versioonis %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &8212; %(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 muutustest"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Teegi muutused"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API muutused"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ülejäänud muutused"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Otsimine"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Otsingu ettevalmistamine..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Varja otsingu tulemused"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Varja külgriba"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Näita külgriba"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Sisukord"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Tundmatu pildivorming: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "viga lugemisel: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "viga kirjutamisel: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: on liiga suur ja seda eiratakse."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Joonealused märkused"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[pilt: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[pilt]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/eu/LC_MESSAGES/sphinx.js b/sphinx/locale/eu/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..429666b
--- /dev/null
+++ b/sphinx/locale/eu/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "eu",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "Dokumentu hauen inguruan",
+ "Automatically generated list of changes in version %(version)s": "Automatikoki sortutako %(version)s bertsioaren aldaketen zerrenda",
+ "C API changes": "C API aldaketak",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Alboko barra tolestu",
+ "Complete Table of Contents": "Eduki taula osoa",
+ "Contents": "Edukiak",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Alboko barra luzatu",
+ "Full index on one page": "Indize guztia orri batean",
+ "General Index": "Indize orokorra",
+ "Global Module Index": "Modulu indize globala",
+ "Go": "Joan",
+ "Hide Search Matches": "Bilaketa bat-etortzeak ezkutatu",
+ "Index": "Indizea",
+ "Index &ndash; %(key)s": "Indizea &ndash; %(key)s",
+ "Index pages by letter": "Indize orriak hizkika",
+ "Indices and tables:": "Indizeak eta taulak:",
+ "Last updated on %(last_updated)s.": "Azken aldaketa: %(last_updated)s.",
+ "Library changes": "Liburutegi aldaketak",
+ "Navigation": "Nabigazioa",
+ "Next topic": "Hurrengo gaia",
+ "Other changes": "Beste aldaketak",
+ "Overview": "Gainbegirada",
+ "Please activate JavaScript to enable the search\n functionality.": "Mesedez, gaitu JavaScript-a bilaketa erabili ahal izateko.",
+ "Preparing search...": "",
+ "Previous topic": "Aurreko gaia",
+ "Quick search": "Bilaketa azkarra",
+ "Search": "Bilatu",
+ "Search Page": "Bilaketa orria",
+ "Search Results": "Bilaketa emaitzak",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Bilatu %(docstitle)s(e)n",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Iturburua ikusi",
+ "Table of Contents": "",
+ "This Page": "Orri hau",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "funtzio, klase, termino guztiak",
+ "can be huge": "handia izan daiteke",
+ "last updated": "",
+ "lists all sections and subsections": "atal eta azpiatal guztiak zerrendatu",
+ "next chapter": "hurrengo kapitulua",
+ "previous chapter": "aurreko kapitulua",
+ "quick access to all modules": "modulu guztietara atzipen azkarra",
+ "search": "bilatu",
+ "search this documentation": "dokumentazio honetan bilatu",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/eu/LC_MESSAGES/sphinx.mo b/sphinx/locale/eu/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..4fb8171
--- /dev/null
+++ b/sphinx/locale/eu/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/eu/LC_MESSAGES/sphinx.po b/sphinx/locale/eu/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..b88884a
--- /dev/null
+++ b/sphinx/locale/eu/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Ales Zabala Alava <shagi@gisa-elkartea.org>, 2011
+# Asier Iturralde Sarasola <asier.iturralde@gmail.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Asier Iturralde Sarasola <asier.iturralde@gmail.com>, 2018\n"
+"Language-Team: Basque (http://app.transifex.com/sphinx-doc/sphinx-1/language/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Hobekuntza Proposamena; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modulu maila"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (hemen: "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y %b %d"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Indize orokorra"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indizea"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "hurrengoa"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "aurrekoa"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentazioa"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indizea"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Argitalpena"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Atalaren egilea: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Moduluaren egilea: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Kodearen egilea: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Egilea:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametroak"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Itzultzen du"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Itzulketa mota"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "partaidea"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "aldagaia"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funtzioa"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makroa"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "mota"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Berria %s bertsioan"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "%s bertsioan aldatuta"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "%s bertsiotik aurrera zaharkituta"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Jaurtitzen du"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klasea"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metodoa)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasea)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (aldagai globala edo konstantea)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atributua)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumentuak"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modulua)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metodoa"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "datuak"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atributua"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modulua"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Aldagaiak"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Goratzen du"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s moduluan)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s moduluan)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasea %s-(e)n)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klaseko metodoa)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s metodo estatikoa)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python moduluen indizea"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduluak"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Zaharkitua"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "salbuespena"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klaseko metodoa"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "metodo estatikoa"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (zaharkitua)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rola)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rola"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "inguruneko aldagaia; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "glosarioko terminoa"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "gramatikako token-a"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "erreferentzia etiketa"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "inguruneko aldagaia"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programako aukera"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Moduluen indizea"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Bilaketa orria"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "%s ikusi"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "ikusi %s baita ere"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[iturburua]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Egitekoa"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "jatorrizko sarrera"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumentazioa]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Moduluko kodea"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s(r)en iturburu kodea</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Gainbegirada: moduluko kodea"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Kodea eskuragarri duten modulu guztiak</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Adi"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Kontuz"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Arriskua"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Errorea"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Argibidea"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Garrantzitsua"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Oharra"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Ikusi baita ere"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Iradokizuna"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Kontuz"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "aurreko orritik jarraitzen du"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Bilatu"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Joan"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Iturburua ikusi"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Gainbegirada"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indizeak eta taulak:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Eduki taula osoa"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "atal eta azpiatal guztiak zerrendatu"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "dokumentazio honetan bilatu"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Modulu indize globala"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "modulu guztietara atzipen azkarra"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "funtzio, klase, termino guztiak"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indizea &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Indize guztia orri batean"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indize orriak hizkika"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "handia izan daiteke"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Nabigazioa"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Bilatu %(docstitle)s(e)n"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Dokumentu hauen inguruan"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Azken aldaketa: %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s bilatu"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Aurreko gaia"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "aurreko kapitulua"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Hurrengo gaia"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "hurrengo kapitulua"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Mesedez, gaitu JavaScript-a bilaketa erabili ahal izateko."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "bilatu"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Bilaketa emaitzak"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Bilaketa azkarra"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Orri hau"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatikoki sortutako %(version)s bertsioaren aldaketen zerrenda"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Liburutegi aldaketak"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API aldaketak"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Beste aldaketak"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Bilaketa bat-etortzeak ezkutatu"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Alboko barra tolestu"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Alboko barra luzatu"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Edukiak"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Oin-oharrak"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[irudia]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/fa/LC_MESSAGES/sphinx.js b/sphinx/locale/fa/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..e985264
--- /dev/null
+++ b/sphinx/locale/fa/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "fa",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "\u060c \u062f\u0631 ",
+ "About these documents": "\u062f\u0631\u0628\u0627\u0631\u0647 \u0627\u06cc\u0646 \u0645\u0633\u062a\u0646\u062f\u0627\u062a",
+ "Automatically generated list of changes in version %(version)s": "\u0644\u06cc\u0633\u062a \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u0632 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u062f\u0631 \u0646\u0633\u062e\u0647 %(version)s",
+ "C API changes": "C API \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u062f\u0631 \u0646\u0633\u062e\u0647 %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "\u062a\u0627 \u06a9\u0631\u062f\u0646 \u0646\u0648\u0627\u0631 \u06a9\u0646\u0627\u0631\u0647",
+ "Complete Table of Contents": "\u0641\u0647\u0631\u0633\u062a \u06a9\u0627\u0645\u0644 \u0645\u0637\u0627\u0644\u0628",
+ "Contents": "\u0645\u062d\u062a\u0648\u0627 \u0647\u0627",
+ "Copyright": "\u06a9\u067e\u06cc \u0631\u0627\u06cc\u062a",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "\u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0628\u0627<a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "\u06af\u0633\u062a\u0631\u0634 \u0646\u0648\u0627\u0631 \u06a9\u0646\u0627\u0631\u0647",
+ "Full index on one page": "\u0641\u0647\u0631\u0633\u062a \u06a9\u0627\u0645\u0644 \u062f\u0631 \u06cc\u06a9 \u0635\u0641\u062d\u0647",
+ "General Index": "\u0641\u0647\u0631\u0633\u062a \u06a9\u0644\u06cc",
+ "Global Module Index": "\u0641\u0647\u0631\u0633\u062a \u06a9\u0644\u06cc \u0645\u0627\u0698\u0648\u0644 \u0647\u0627",
+ "Go": "\u0628\u0631\u0648",
+ "Hide Search Matches": "\u0639\u062f\u0645 \u0646\u0645\u0627\u06cc\u0634 \u0646\u062a\u0627\u06cc\u062c \u06cc\u0627\u0641\u062a \u0634\u062f\u0647",
+ "Index": "\u0641\u0647\u0631\u0633\u062a",
+ "Index &ndash; %(key)s": "\u0641\u0647\u0631\u0633\u062a &ndash; %(key)s",
+ "Index pages by letter": "\u0641\u0647\u0631\u0633\u062a \u0635\u0641\u062d\u0627\u062a \u0628\u0631 \u0627\u0633\u0627\u0633 \u062d\u0631\u0648\u0641",
+ "Indices and tables:": "\u0627\u06cc\u0646\u062f\u06a9\u0633 \u0647\u0627 \u0648 \u062c\u062f\u0627\u0648\u0644:",
+ "Last updated on %(last_updated)s.": "\u0622\u062e\u0631\u06cc\u0646 \u0628\u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc \u062f\u0631 %(last_updated)s .",
+ "Library changes": "\u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc\u06cc",
+ "Navigation": "\u0646\u0627\u0648\u0628\u0631\u06cc",
+ "Next topic": "\u0645\u0648\u0636\u0648\u0639 \u0628\u0639\u062f\u06cc",
+ "Other changes": "\u062f\u06af\u0631 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a",
+ "Overview": "\u0628\u0631\u0631\u0633\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc",
+ "Please activate JavaScript to enable the search\n functionality.": "\u0644\u0637\u0641\u0627\u064b \u0628\u0631\u0627\u06cc \u0641\u0639\u0651\u0627\u0644 \u06a9\u0631\u062f\u0646 \u06a9\u0627\u0631\u06a9\u0631\u062f \u062c\u0633\u062a\u062c\u0648\n\u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0641\u0639\u0651\u0627\u0644 \u06a9\u0646\u06cc\u062f.",
+ "Preparing search...": "\u0622\u0645\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u062c\u0633\u062a \u0648 \u062c\u0648...",
+ "Previous topic": "\u0645\u0648\u0636\u0648\u0639 \u0642\u0628\u0644\u06cc",
+ "Quick search": "\u062c\u0633\u062a\u062c\u0648 \u0633\u0631\u06cc\u0639",
+ "Search": "\u062c\u0633\u062a\u062c\u0648",
+ "Search Page": "\u0635\u0641\u062d\u0647 \u062c\u0633\u062a\u062c\u0648",
+ "Search Results": "\u0646\u062a\u0627\u06cc\u062c \u062c\u0633\u062a\u062c\u0648",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "\u062c\u0633\u062a\u062c\u0648 \u062f\u0631 %(docstitle)s",
+ "Searching": "\u062f\u0631 \u062d\u0627\u0644 \u062c\u0633\u062a \u0648 \u062c\u0648",
+ "Searching for multiple words only shows matches that contain\n all words.": "\u062f\u0631 \u062d\u0627\u0644 \u062c\u0633\u062a\u062c\u0648 \u0628\u0631\u0627\u06cc \u0686\u0646\u062f\u06cc\u0646 \u0648\u0627\u0698\u0647. \u0641\u0642\u0637 \u0648\u0627\u0698\u06af\u0627\u0646\u06cc \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0634\u0627\u0645\u0644 \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f \u0628\u0627\u0634\u062f:\n \u0647\u0645\u0647\u200c\u06cc \u06a9\u0644\u0645\u0647\u200c\u0647\u0627.",
+ "Show Source": "\u0646\u0645\u0627\u06cc\u0634 \u0633\u0648\u0631\u0633",
+ "Table of Contents": "\u0641\u0647\u0631\u0633\u062a \u0639\u0646\u0627\u0648\u06cc\u0646",
+ "This Page": "\u0635\u0641\u062d\u0647 \u0641\u0639\u0644\u06cc",
+ "Welcome! This is": "\u062e\u0648\u0634 \u0622\u0645\u062f\u06cc\u062f! \u0627\u06cc\u0646",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u062c\u0633\u062a\u062c\u0648\u06cc \u0634\u0645\u0627 \u0628\u0627 \u0647\u06cc\u0686 \u0633\u0646\u062f\u06cc \u0647\u0645 \u062e\u0648\u0627\u0646\u06cc \u0646\u062f\u0627\u0634\u062a. \u0644\u0637\u0641\u0627\u064b \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0647\u0645\u0647 \u06cc \u0648\u0627\u0698\u0647 \u0647\u0627 \u0627\u0645\u0644\u0627\u06cc \u062f\u0631\u0633\u062a\u06cc \u062f\u0627\u0631\u0646\u062f \u0648 \u062f\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0647\u0627\u06cc \u06a9\u0627\u0641\u06cc \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f.",
+ "all functions, classes, terms": "\u062a\u0645\u0627\u0645\u06cc \u062a\u0648\u0627\u0628\u0639 \u060c \u06a9\u0644\u0627\u0633 \u0647\u0627 \u060c \u0627\u0635\u0637\u0644\u0627\u062d\u0627\u062a",
+ "can be huge": "\u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0633\u062a\u0631\u06af \u0628\u0627\u0634\u062f",
+ "last updated": "\u0622\u062e\u0631\u06cc\u0646 \u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc",
+ "lists all sections and subsections": "\u0641\u0647\u0631\u0633\u062a \u062a\u0645\u0627\u0645\u06cc \u0628\u062e\u0634 \u0647\u0627 \u0648 \u0632\u06cc\u0631 \u0645\u062c\u0645\u0648\u0639\u0647 \u0647\u0627",
+ "next chapter": "\u0641\u0635\u0644 \u0628\u0639\u062f\u06cc",
+ "previous chapter": "\u0641\u0635\u0644 \u0642\u0628\u0644\u06cc",
+ "quick access to all modules": "\u062f\u0633\u062a\u0631\u0633\u06cc \u0633\u0631\u06cc\u0639 \u0628\u0647 \u062a\u0645\u0627\u0645\u06cc \u0645\u062a\u062f\u0647\u0627",
+ "search": "\u062c\u0633\u062a\u062c\u0648",
+ "search this documentation": "\u062c\u0633\u062a\u062c\u0648 \u062f\u0631 \u0627\u06cc\u0646 \u0627\u0633\u0646\u0627\u062f",
+ "the documentation for": "\u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0628\u0631\u0627\u06cc"
+ },
+ "plural_expr": "(n > 1)"
+}); \ 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 0000000..68e026b
--- /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 0000000..58d1cb5
--- /dev/null
+++ b/sphinx/locale/fa/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3698 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Hadi F <h_adi_f@yahoo.com>, 2020
+# Hadi F <h_adi_f@yahoo.com>, 2020-2021
+# Pikhosh <pikhosh@gmail.com>, 2020
+# Pikhosh <pikhosh@gmail.com>, 2020
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Hadi F <h_adi_f@yahoo.com>, 2020-2021\n"
+"Language-Team: Persian (http://app.transifex.com/sphinx-doc/sphinx-1/language/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: fa\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "شاخه‌ی منبع(%s) پیدا نشد."
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "نشانی (%s) شاخه نیست"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "شاخه‌های مبدأ و مقصد نمی توانند یکسان باشند"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "اجرای اسÙینکس نگارش %s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "این پروژه دست Ú©Ù‡ به اÙینکس نگارش%s نیاز دارد Ùˆ برای همین با این نسخه قابل ساخت نیست."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "ایجاد پوشه ی برون داد"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "در حال راه اندازی اÙزونه‌ی%s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' آن طور Ú©Ù‡ در conf.py تعری٠شده شیئ قابل Ùراخوانی پایتون نیست. لطÙاً تعریÙØ´ را تغییر دهید تا تابع قابل Ùراخوان پایتون شود. این کار لازمه‌ی conf.py است تا به عنوان اÙزنه‌ی اسÙینکس کار کند."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "بارگذاری ترجمه ها [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "انجام شد"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "برای پیام‌های داخلی در دسترس نیست"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "بارگذاری محیط pckle شده"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "شکست خورد: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "هیچ سازنده‌ای برگزیده نشده، استÙاده از قالب خروجی پیش‌Ùرض: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "موÙّقیّت‌آمیز بود"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "انجام شد ولی با مشکل"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "ساخت %sØŒ %s هشدار (با هشدار به عنوان خطا رÙتار می‌شود)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "ساخت %sØŒ %s هشدار (با هشدار به عنوان خطا رÙتار می‌شود)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "ساخت %s، %s هشدار."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "ساخت %s، %s هشدار."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "ساخت %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "بست کلاس %r در حال حاضر ثبت نام شده است، بازدیدکنندگان این پیوند نادیده گرÙته خواهد شد"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "دستور %r از قبل ثبت شده Ú©Ù‡ مقدار قبلی نادیده گرÙته خواهد شد"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "نقش %r از قبل ثبت شده Ú©Ù‡ مقدار قبلی نادیده گرÙته خواهد شد"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "اÙزونه‌ی %s مشخّص نکرده Ú©Ù‡ آیا برای خواندن موازی امن هست یا نه. Ú©Ù‡ Ùرض می‌گیریم نیست. لطÙاً از نویسنده‌ی اÙزونه بخواهید این موضوع را بررسی Ùˆ آن را مشخّص کند"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "اÙزونه ÛŒ %sبرای خواندن موازی امن نیست"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "اÙزونه‌ی %s مشخّص نکرده Ú©Ù‡ آیا برای نوشتن موازی امن هست یا نه. Ú©Ù‡ Ùرض می‌گیریم نیست. لطÙاً از نویسنده‌ی اÙزونه بخواهید این موضوع را بررسی Ùˆ آن را مشخّص کند"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "اÙزونه‌ی %s برای نوشتن موازی امن نیست"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "انجام چندباره‌ی %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "شاخه‌ی پیکربندی(%s)، پرونده‌ی conf.py را ندارد"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "امکان لغو تنظیمات پیکربندیdictionary %r ØŒ نادیده گرÙته می‌شود (برای تعیین تک تک عناصر %r را به کار ببرید)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "شماره نامعتبر %r برای پیکربندی مقدار %rØŒ نادیده گرÙته می‌شود"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "امکان لغو تنظیمات پیکربندی %r با نوع پشتیبانی نشده نبود، نادیده گرÙته می‌شود"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "مقدار پیکربندی ناشناخته %r در ابطال، نادیده گرÙته شد"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "چنین مقداری برای پیکربندی نبود: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "مقدار پیکربندی %r از قبل موجود است"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "خطای نحوی در پرونده‌ی پیکربندی شما وجود دارد: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "پرونده‌ی پیکربندی (یا یکی از ماژول هایی Ú©Ù‡ وارد Ù…ÛŒ کند) sys.exit() را Ùراخواند"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "یک خطای قابل برنامه ریزی در پرونده‌ی پیکربندی شما وجود دارد:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "مقدار پیکربندی 'source_suffix' انتظار یک رشته، لیست رشته ها، یا Ùرهنگ لغت را داشت. اما '%r' داده شده است."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "بخش%s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Ø´Ú©Ù„ %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "جدول %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Ùهرست %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "مقدار پیکربندی '{name}' باید یکی از {candidates} باشد، اما '{current}' داده شده."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "مقدار پیکربندی '{name}' دارای نوع '{current.__name__}' است، ولی انتظار می‌رÙت {permitted} می‌بود."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "مقدار پیکربندی '{name}' دارای نوع '{current.__name__}' است، حالت پیش‌Ùرض {permitted} است."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "دامنه‌ی اصلی %r یاÙت نشد، نادیده گرÙته می‌شوند."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "از زمان نسخه‌ی Û² تا به حال، اسÙیکنس به صورت پیش Ùرض از \"index\" به عنوان ریشه‌ی سند(root_doc) استÙاده می‌کند. لطÙاً \"root_doc = 'contents'\" را به پرونده conf.py تان اضاÙÙ‡ کنید."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "رویداد %r در حال حاضر موجود است"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "نوع اتÙاق نامشخّص است: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "مدیر %r برای رویداد %r یک باعث ایراد شد"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "تنظیمات needs_extensions (نیازهای اÙزونه) اÙزونه‌ی %s را نیاز دارد، ولی بارگذاری نمی شود."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "این پروژه اÙزونه‌ی %s (دست Ú©Ù… نسخه‌ی %s) را نیاز دارد، بنابراین نمی تواند با نسخه بارگذاری شده (%s) ساخته شود."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "نام رنگ‌مایه خوان %r شناخته شده نیست"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "برای سند \"%s\": %r پرونده های متعدد یاÙت شده \nاز %r برای ساخت استÙاده کنید."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "کلاس سازنده %s هیچ ویژگی‌ای به عنوان \"name\" ندارد"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "سازنده %r در حال حاضر وجود دارد (در پیمانه‌ی %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "نام سازنده %s یا ثبت شده نیست Ùˆ یا Ùقط از طریق نقطه ورود در دسترس است"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "نام سازنده %s ثبت نشده است"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "دامنه ی %sپیش تر ثبت شده"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "دامنه %s هنوز ثبت نشده است"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "دستورالعمل %r قبلاً برای دامنه %s ثبت شده"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "نقش %r قبلاً برای دامنه %s ثبت شده"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "شاخص %r قبلاً برای دامنه %s ثبت شده"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "نوع شیئ (object_type) %r قبلاً برای دامنه ثبت شده"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "ارجاع متقابل (crossref_type) %r قبلاً ثبت شده"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "پسوند (source_suffix) %r قبلاً ثبت شده است"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "تحلیل‌گر منبع (source_parser) %r قبلاً ثبت شده است"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "تجزیه کننده مبدإ برای %s ثبت نشده است"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "در حال حاضر برای %r مترجم وجود دارد"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "مؤلّÙه‌های کلیدی برای تابع add_node() باید تاپل تابعی (بازدید، خروج) باشند: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "بست قابل شمارش (enumerable_node) %r قبلاً ثبت شده است"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "ترسیم‌گر ریاضی %s قبلاً ثبت شده"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "اÙزونه‌ی %r از نسخه‌ی %s اسÙینکس به بعد، در آن ادغام شده؛ بنابراین نادیده گرÙته می‌شود."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "ایراد اصلی:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "امکان وارد کردن اÙزونه‌ی %s نبود"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "اÙزونه‌ی %r هیچ تابع setup()ÛŒ ندارد؛ آیا این مورد واقعاً یک پیمانه‌ی اÙزونه‌ی اسÙینکس است؟"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "اÙزونه‌ی %s Ú©Ù‡ در این پروژه استÙاده شده دست Ú©Ù… نیازمند اسÙینکس نسخه‌ی %s است؛ بنابراین با این نسخه قابل ساخت نیست."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "اÙزونه‌ی %r شیئ پشتیبانی نشده‌‌ای از تابع setup()Ø´ برگرداند؛ در حالی Ú©Ù‡ Ù…ÛŒ بایست مقدار تهی/هیچ Ùˆ یا یک دیکشنری Ùراداده‌ برمی‌گرداند"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "زمینه ÛŒ %r Ùاقد تنظیمات است"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "زمینه‌ی %r تنظیمات به ارث بری ندارد"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "هیچ زمینه‌ای به نام %r پیدا نشد، که با %r جایگزین شود"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "تنظیمات %s. %s در هیچ یک از پیکربندی‌های جستجو شده رخ نمی‌دهد"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "گزینه‌ی پشتیبانی نشده‌ی زمینه %r داده شده"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "پرونده‌ی %r که مسیر زمینه به آن اشاره دارد یا پرونده زیپ معتبری نیست یا هیچ زمینه‌ای درونش ندارد"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "هیچ زمینه‌ای با نام %r پیدا نشد(آیا پرونده theme.conf گم شده؟)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "تصویر مناسبی برای سازنده‌ی %s پیدا نشد: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "تصویر مناسبی برای سازنده‌ی %s پیدا نشد: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "ساخت پرونده‌ی [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "نوشتن برون‌داد... "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "همه‌ی پرونده‌های %d po"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "اهدا٠برای %d پرونده‌های poی که مشخّص شده"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "مقصد‌های %d پرونده‌های poی هستند که منسوخ شده‌اند"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "همه‌ی پرونده‌های منبع"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "پرونده‌ی %r Ú©Ù‡ در خط Ùرمان داده شده، در شاخه‌ی منبع نیست, نادیده گرÙته می‌شود"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "پرونده‌های منبع %d داده شده در خط Ùرمان"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "مقصد‌های %d پرونده‌های منبعی هستند که منسوخ شده‌اند"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "ساخت [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "در پی پرونده‌هایی که الآن منسوخ هستند... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d تا مورد پیدا شد"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "چیزی پیدا نشد"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "بارگذاری محیط pickle شده"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "بررسی ثبات"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "هیچ مقدار تاریخ منسوخ نیست."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "به روز رسانی محیط: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s اضاÙÙ‡ شد، %s تغییر کرد، %s حذ٠شد"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "خواندن منبع‌ها... "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "نام مستندات برای نوشتن: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "آماده سازی اسناد"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "عنوان تکراری در Ùهرست مطالب پیدا شد:%s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "در حال رونوشت از تصاویر... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "امکان خواندن پرونده‌ی تصویری %r نبود: در عوض کپی می‌شود"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "نمی تواند پرونده‌ی تصویر %r: %s را کپی کند"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "نمی تواند پرونده‌ی تصویری %r: %s را بنویسد"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow پیدا نشد- رونوشت برداشتن از پرونده‌های تصویری"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "نوشتن پرونده‌های نوع رسانه..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "نوشتن پرونده META-INF/container.xml..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "نوشتن پرونده‌ی content.opf..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "نوع رسانه‌ی ناشناخته %sØŒ نادیده گرÙته شد"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "نوشتن پرونده‌ی خلاصه toc.ncx..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "نوشتن پرونده‌ی %s..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "پرونده‌ی بازبینی در پوشه‌ی %(outdir)s است."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "بدون تغییرات در نسخه‌ی %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "نوشتن پرونده‌ی خلاصه..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "درونی سازی"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "در سطح ماژول"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "رونوشت از پرونده‌های مبدأ..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "نمی‌توان %r را برای ایجاد گزارش تغییرات خواند"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "سازنده‌ی بدلی هیچ پرونده‌ای تولید نمی کند."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "پرونده‌ی ePub در پوشه‌ی %(outdir)s است."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "نوشتن پرونده‌ی nav.xhtml..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "مقدار پیکربندی زبان پرونده epub (\"epub_language\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "مقدار پیکربندی شناسه‌ی یکتای انتشار الکترونیکی (\"epub_uid\") باید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) یک XML NAME باشد"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "مقدار پیکربندی عنوان (\"html_title\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "مقدار پیکربندی مؤلّ٠(\"epub_author\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "مقدار پیکربندی حامی (\"epub_contributor\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "مقدار پیکربندی توضیحات (\"epub_description\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "مقدار پیکربندی ناشر (\"epub_publisher\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "مقدار پیکربندی حق انتشار (\"epub_copyright\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "مقدار پیکربندی شناسه (\"epub_identifier\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "مقدار پیکربندی ویراست (\"version\") نباید برای نسخه‌ی سوم پرونده‌های انتشار الکترونیک(EPUB3) خالی باشد"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "پرونده‌ی css نامعتبر%r: نادیده گرÙته می‌شود"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "سیاهه‌های پیام‌ها در %(outdir)s است."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "مقصد‌های قالب پرونده‌های %d"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "خواندن قالب‌ها... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "نوشتن سیاهه‌های پیام... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "به دنبال هر یک از خطاهای بالا در یا در برون‌داد و یا در %(outdir)s/output.txt بگردید"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "پیوند خراب: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "شکست در گردآوری عبارات باقاعده در linkcheck_allowed_redirects: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "صÙحات راهنما در %(outdir)s است."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "هیچ مقداری برای تنظیمات «صÙحات راهنما» ا نشد؛ بنابراین هیچ صÙحه‌ی راهنمایی نوشته نخواهد شد"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "در حال نوشتن"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "پیکربندی مقدارهای «صÙحات راهنما» به سند ناشناخته‌ای ارجاع می‌دهند %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "صÙحه HTML در %(outdir)s است."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "سر جمع کرد تک سند"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "نوشتن پرونده‌های اضاÙÛŒ"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "پرونده‌ی اطّلاعات متن در پوشه‌ی %(outdir)s است."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nدر آن شاخه Ùرمان 'make' را اجرا کنید تا این‌ها رh با makeinfo اجرا کند\n(برای انجام خودکار `make info' را به کار ببرید)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "هیچ تنظیماتی برای «صÙحات راهنما» پیدا نشد؛ بنابراین هیچ صÙحه‌ی راهنمایی نوشته نخواهد شد"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "مقدار پیکربندی اطّلاعات متن سندها (texinfo_documents) به سند ناشناخته‌ی %s ارجاع می‌دهد"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "در حال پردازش %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "حل ارجاع‌ها..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (در "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "رونوشت از پرونده‌های با پشتیبانی اطلاعات متن"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "خطای نوشتن پرونده‌ی ساخت (Makefile) : %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "پرونده‌ی متنی در پوشه‌ی %(outdir)s است."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "خطای نوشتن پرونده: %s, %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "پرونده‌ی XML در پوشه‌ی %(outdir)s است."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "پرونده‌های شبه XML در پوشه‌ی %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "پرونده‌ی اطّلاعات ساخت خراب است: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "صÙحات HTML در %(outdir)s است."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "شکست در خواندن پرونده‌ی اطّلاعات ساخت: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ùهرست Ú©Ù„ÛŒ"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "Ùهرست"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "بعدی"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "قبلی"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "تولید نمایه‌ها"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "نوشتن صÙحات اضاÙÛŒ"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "رونوشت از پرونده‌های قابل دریاÙت... "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "نمی تواند از پرونده‌ی قابل دریاÙت %r: %s رونوشت بگیرد"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "شکست در رونوشت یک پرونده‌ی به html_static_file: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "رونوشت از پرونده‌های ثابت"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "نمی تواند از پرونده‌ی ثابت %r رونوشت بگیرد"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "رونوشت برداری از پرونده‌های اضاÙÛŒ"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "نمی تواند از پرونده‌ی اضاÙه‌ی %r رونوشت بگیرد"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "شکست در نوشتن پرونده‌ی اطّلاعات ساخت: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "نمایه‌ی جستجو نمی‌تواند بارگزاری شود، ولی برای همه‌ی مستندات ساخته‌ نمی‌شود: نمایه‌ ناقص خواهد بود."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "صÙحه‌ی %s با دو الگو در نوار کناری صÙحه (html_sidebars) هم‌خوانی دارد: %r Ùˆ%r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "هنگام ارائه‌ی صÙحه‌ی %s خطای یونیکد رخ داد. لطÙاً اطمینان حاصل کنید Ú©Ù‡ تمام مقدارهای پیکربندی‌ها دارای محتوای غیر اَسکی، رشته‌متن‌های یونکد هستند."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "خطایی در نمایش صÙحه‌ی %s رخ داد.\nعلّت: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "خالی کردن Ùهرست اشیاء"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "خالی کردن نمایه‌ی جستجو در %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "پرونده‌ی js نامعتبر%r: نادیده گرÙته می‌شود"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "ارا‌ئه کننده‌های ریاضی زیادی ثبت شده‌اند، ولی هیچ کدام انتخاب نشده."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "نمایش‌دهنده‌ی ریاضی نامشخّص %r داده شده."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "مدخل مسیر اضاÙÛŒ (html_extra_path) %r وجود ندارد"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "مدخل مسیر اضاÙÛŒ (html_extra_path) %r درون شاخه‌ی خارجی قرار دارد"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "مدخل مسیر ثابت (html_static_path) %r وجود ندارد"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "مدخل مسیر ثابت (html_static_path) %r درون شاخه‌ی خارجی قرار دارد"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "پرونده‌ی آرم %r وجود ندارد"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "پرونده‌ی آیکون مورد علاقه %r وجود ندارد"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "مستندات %s%s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "پرونده‌ی LaTeX در پوشه‌ی %(outdir)s است."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nدر آن شاخه Ùرمان 'make' را اجرا کنید تا این‌ها را با لتکس(pdf) اجرا کند\n(برای انجام خودکار `make latexpdf' را به کار ببرید)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "هیچ مقدار پیکربندی اسناد لتکسی (latex_documents) پیدا نشد؛ بنابراین هیچ سندی نوشته نخواهد شد"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "مقدار پیکربندی سندهای لتکس (latex_documents) به سند ناشناخته‌ی %s ارجاع می‌دهد"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Ùهرست"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "انتشار"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "بدون گزینه‌ی Babel شناخته شده برای زبان %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "رونوشت از پرونده‌های پشتیبانی لتکس"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "رونوشت از پرونده‌های پشتیبانی لتکس..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "رونوشت برداری از پرونده‌های اضاÙÛŒ"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "کلید پیکربندی ناشناخته: latex_elements[%r]ØŒ نادیده گرÙته می‌شود."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "کلید زمینه‌ی ناشناخته: latex_theme_options[%r]ØŒ نادیده گرÙته می‌شود."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r Ùاقد تنظیمات زمینه است"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r Ùاقد تنظیمات \"%s\" است"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "در حین ساخت ایرادی رخ داد، شروع اشکال زدا:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "قطع شد!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "خطای نشانه‌گذاری متن بازساختمند (reST)"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "خطای کدگذاری نویسه:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "اگر می‌‌خواهید مشکل را به توسعه‌دهندگان گزارش دهید، ردیابی کامل خطا در %s ذخیره شده است."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "خطای بازگشتی:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "این اتّÙاق ممکن است برای پرونده‌های بسیار تو در توی منبع بیاÙتد. شما می‌توانید محدودیّت Û±Û°Û°Û° تایی مقدار پیش‌Ùرض اجرای بازگشت پایتون را در conf.py زیاد کنید، مثلاً با:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "ایراد رخ داد:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "لطÙاً اگر این مورد خطای کاربر بوده، آن را گزارش دهید تا برای بارهای بعدی پیام خطای بهتری بتواند ارائه شود."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "گزارش اشکال می تواند در ردیاب در مسیر <https://github.com/sphinx-doc/sphinx/issues> ثبت شود. با سپاس!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "شماره‌ی کار باید یک عدد مثبت باشد"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "برای اطّلاعات بیشتر به <https://www.sphinx-doc.org/> بروید."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nایجاد مستندات از پرونده‌های مبدأ.\n\nسازنده‌ی اسÙنکس مستندات را از روی پرونده های مبنع در پوشه‌‌ی منبع تولید کرده در پوشه‌ی برون‌داد قرار می‌دهد.\nاین سازنده در پوشه‌ی مبدأ به دنبال پرونده 'conf.py' تنظیمات پیکربندی می‌گردد.\nاین امکان وجود دارد Ú©Ù‡ از ابزار شروع سریع اسÙینکس ('sphinx-quickstart') برای تولید پرونده‌های قالب، Ú©Ù‡ شامل پرونده 'conf.py' هم می‌شود استÙاده شود.\n\nسازنده‌ی اسÙینکس Ù…ÛŒ توند مستندات را در قالب‌های گوناگونی از پرونده‌های خروجی ایجاد کند. قالب پرونده خروجی با مشخّص کردن نام سازنده در خط Ùرمان مشخّص می‌شود Ú©Ù‡ به صورت پیش Ùرض HTML است. همچنین، سازنده‌ها می‌توانند کارهای دیگر مربوط به Ùرآیند پردازش مستندسازی را انجام دهند.\n\nبه صورت پیش Ùرض، هر چیزی Ú©Ù‡ منسوخ شده باشد تولید می‌شود. برون‌داد برای پرونده‌های منتخب می‌تواند Ùقط با مشخّص کردن نام تک تک پرونده‌ها ساخته شود.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "مسیر پرونده‌های مستندات"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "مسیری برای شاخه‌ی برون داد"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "لیست پرونده‌هایی Ú©Ù‡ قرار است دوباره ساخته شوند. اگر با -a مشخّص شده باشند نادیده گرÙته می‌شوند"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "گزینه‌های کلی"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "قالب سازنده مورد استÙاده (پیش‌Ùرض:html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "نوشتن همه‌ی پرونده‌ها (پیش‌گزیده: Ùقط پرونده‌های جدید نو تغییر یاÙته را بنویس)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "از محیط ذخیره شده استÙاده نکن، همیشه همه پرونده ها را بخوان"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "مسیر برای محیط ذخیره‌ شده Ùˆ پرونده‌های doctree (پیش Ùرض: OUTPUTDIR /.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "درصورت امکان ساخت به صورت موازی با N Ùرآیند پردازشی (مقدار ویژه‌ی «خودکار» شمار N را به تعداد پردازنده تنظیم می‌کند)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "مسیر جایی که پرونده‌ی پیکربندی (conf.py) قرار دارد ( پیش‌گزیده: مثل پوشه‌ی منبع)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "هیچ پرونده‌ی پیکربندی‌ای استÙاده نکن، Ùقط گزینه‌ی -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "نادیده گرÙتن تنظیماتی در پرونده‌ی پیکره‌بندی"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "مقداری را به قالب‌های HTML بدهید"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "تعری٠برچسب: «Ùقط» تکّه‌های با برچسب گنجانده شود"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "حالت ریزبینانه، هشدار درباره‌ی همه‌ی ارجاع‌های ناپیدا"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "گزنیه‌های برون‌داد میز Ùرمان"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "اÙزایش ارائه‌ی جزئیّات (Ù…ÛŒ تواند تکرار شود)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "بدون برون‌داد در درگاه خروجی استاندارد(stdout)ØŒ Ùقط هشدارها در درگاه استاندارد خطاها (stderr)"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "بدون هیچ برون‌داد، حتّی بدون هشدار"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "خروجی رنگ شده منتشر شود (پیش‌Ùرض: تشخیص خودکار)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "خروجی رنگ شده منتشر نشود (پیش‌Ùرض: تشخیص خودکار)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "نوشتن هشدارها (و خطاها) در پرونده‌ی داده شده"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "تغییر هشدارها به خطاها"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "با سوییچ -WØŒ در هنگام گرÙتن هشدار ادامه بده"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "نمایش گزارش کامل ردیابی ایراد"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "ایراد در اجرای Pdb"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "نمی توان گزینه‌ی -a را با نام پرونده‌ها ترکیب کرد"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "امکان باز کردن پرونده هشدار نبود %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "نشانوند گزینه‌ی D- می‌بایست در قالب نام=مقدار (name=value) باشد"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "نشانوند گزینه‌ی A- می‌بایست در قالب نام=مقدار (name=value) باشد"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "درج خودکار رشته‌مستندات را از پیمانه‌ها"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "آزمایش خودکار تکّه‌کدها در قسمت‌های مختل٠پیمانه‌ی doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "پیوند بین اسناد Sphinx از پروژه های گوناگون"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "نوشتن مدخل‌های لیست اقدام‌ها (\"todo\")که در ساخت می تواند نشان داده و یا پنهان شوند"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "بررسی برای پوشش اسناد"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "گنجاندن رابطه‌های ریاضی که در قالب PNG یا SVG به نمایش در آمده"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "گنجاندن رابطه‌های ریاضی که MathJax در مرورگر نمایش در آورده"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "گنجاندن شرطی محتوا بر اساس مقادیر پیکربندی"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "گنجاندن ویندهای کد منبع اشیاء مستند شده‌ی پایتون"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "ساخت پرونده‌ی nojekyll برای انتشار سند در صÙحات گیت-هاب"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "لطÙاً نام مسیر معتبری را وارد کنید."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "لطÙاً متنی وارد کنید."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "لطÙاً یکی از %s وارد کنید."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "لطÙاً یا y Ùˆ یا n وارد کنید."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "لطÙاً یک پسوند را وارد کنید، مثل: '.rst' یا '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "به ابزار شروع سریع اسÙینکس %s خوش آمدید."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "لطÙاً مقدارهای تنظیمات زیر را وارد کنید\n(اگر مقدار پیش‌گزیده‌ای درون داده کروشه شده بود، برای برای پذیرش آن Ùقط کلید Enter‌را Ùشار دهید)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "مسیر برگزیده‌ی ریشه‌ی مستندات: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "مسیر ریشه‌ی مستندات را وارد کنید."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "مسیر ریشه‌ی مستندات"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "خطا: در مسیر ریشه‌ی انتخاب شده‌، پرونده‌ی conf.pyی دیگری یپدا شد."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "ابراز شروع سریع اسÙینکس روی پروژه‌های از قبل موجود اسÙینکس بازنویسی نمی‌کند."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "لطÙاً یک مسیر ریشه‌ی جدید وارد کنید (یا برای خروج Enter‌ را بزنید)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "شما برای تعیین شاخه‌ی ساخت برای برون‌داد اسÙینکس دو گزینه دارید.\nیا از شاخه‌ای با نام \"_build\" درون شاخه‌ی ریشه استÙاده کنید،\nÙˆ یا شاخه‌های را درون یک مسیر ریشه با نام‌های منبع (source) Ùˆ ساخت (build) جدا کنید."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "شاخه‌های منبع و ساخت از یکدیگر جدا شوند؟(y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "درون شاخه‌ی ریشه، دو شاخه‌ی دیگر ساخته خواهد شد؛\n\"_templates\" برای قالب‌های سÙارشی HTML Ùˆ \"_static\" برای قالب برگه‌ها Ùˆ بقیّه‌ی پرونده‌های ثابت.\nشما می‌توانید پیشوند دیگری (مانند «.») برای جایگزینی نویسه‌ی خط به کار ببرید."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "برای شاخه‌های قالب‌ها (templates) و ثابت‌ها (static) نویسه‌ی پیشوندی را بنویسید"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "نام پروژه در چندین جا در سند ساخته شده به کار می‌رود."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "نام پروژه"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "نام نویسنده (ها)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "اسÙینکس نظریّه‌ای برای یک «نسخه» Ùˆ یک «نگارش» برای نرم اÙزار دارد.\nهر نسخه‌ای Ù…ÛŒ تواند چندید نگارش داشته باشد.\n مثلاً برای پایتون نسخه‌ چیزی شبیه به Û²/Ûµ یا Û³/Û° است،\n در حالی Ú©Ù‡ انتشار چیزیست شبیه به Û²/Ûµ/Û± یا Û³/Û°aÛ± \n.\nاگر شما نیازی به این ساختار دوگانه ندارید، هر دو را یکی تعیین کنید."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "نسخه انتشار پروژه"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "انتشار پروژه"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "اگر مستندات قرار است با زبانی غیر از انگلیسی نوشته شود،\nÙ…ÛŒ توانید همین‌جا یک زبان را با انتخاب کد زبانیش انتخاب کنید.\nاسÙینکس سپس متن‌هایی را Ú©Ù‡ تولید می‌کند را به آن زبان ترجمه می‌کند.\n\nبرای Ùهرست زبان‌های پشتیبانی شده، به این نشانی مراجعه کنید\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "زبان پروژه"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "پسوند نام پرونده برای پرونده‌های منبع. معمولاً این پسوند یا \".txt\" است Ùˆ یا \".rst\".\nÙقط پرونده‌هایی بای این پسوند به عنوان اسناد در نظر گرÙته می‌شوند."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "پسوند پرونده‌ی منبع"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "یک سند از آن جهت خاص است Ú©Ù‡ به عنوان بست بالایی «درختواره‌ی محتوا» در نظر گرÙته می‌شود.\nیعنی، این سند ریشه‌ی ساختار سلسله مراتبی اسناد است.\nمعمولاً سند این کار «نمایه» است، ولی اگر سند «نمایه‌»‌ی شما قالب سÙارشی است؛ Ù…ÛŒ توانید آن را به نام دیگری تغییر دهید."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "نام سند اصلی شما (بدون پسوند)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "خطا: پرونده‌ی اصلی %s از قبل در مسیر ریشه‌ی برگزیده بوده‌است."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "ابراز شروع سریع اسÙینکس روی پرونده‌های از قبل موجود بازنویسی نمی‌کند."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "لطÙا٠یک نام جدید وارد کنید، یا نام پرونده‌ی موجود را تغییر دهید Ùˆ Enter‌ را Ùشار دهید"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "مشخّص کنید کدام یک از این اÙزونه‌های اسÙینکس باید Ùعّال باشد:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "یادداشت: ابزارهای‌ imgmath Ùˆ mathjax نمی‌توانند در یک زمان Ùعّال باشند. انتخاب imgmath لغو شد."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "پرونده‌های خط‌Ùرمان ویندوز Ùˆ Makefile می‌توانند برای شما تولید شوند، به گونه‌ای Ú©Ù‡ شما Ùقط نیاز باشد تا مثلاً Ùرمان `make html' را به جای Ùراخوان مستقیم ابزار ساخت اسÙینکس اجرا کنید."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "آیا پرونده‌ی‌ make ایجاد شود؟ (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "آیا پرونده‌ی خط Ùرمان ویندوز ساخته شود؟ (y/n)Ù"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "ایجاد پرونده‌ی %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "پرونده‌ی %s در حال حاضر وجود دارد، رد شدن."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "پایان یاÙت: ساختار آغازین شاخه ایجاد شد."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "شما باید حالا دیگر پرونده‌ی اصلی‌تان %s را جمع آوری کنید\n و بقیّه‌ی پرونده‌های منبع مستندات را ایجاد کنید. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "از Makefile برای ساختن مستندات استÙاده کنید، مانند این:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "از Ùرمان ساخت اسÙینکس برای ساختن مستندات استÙاده کنید، مانند این:\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "که در آن سازنده یکی از سازنده‌های پشتیبانی شده است، مانند html, latex و یا linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nتولید پرونده‌های مورد نیاز برای یک پروژه‌ی اسÙینکس\n\nابزار شروع سریع اسÙینکس ابزاری تعاملی است Ú©Ù‡ شماری سؤال درباره‌ی پروژه‌یتان از شما Ù…ÛŒ پرسد\nÙˆ سپس یک شاخه‌ی کامل مستندات Ùˆ پرونده ساخت Makefile را برای استÙاده به همراه ابزار ساخت اسÙینکس تولید می‌کند.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "حالت سکوت"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "ریشه‌ی پروژه"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "گزینه‌های ساختار"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "در صورتی مشخّص شدن، شاخه‌های منبع و ساخت از یکدیگر جدا می‌شوند"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "در صورت مشخّص بودن، شاخه‌ی build (ساخت) را درون شاخه‌ی منبع بساز"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "جایگزینی نقطه در _templates (قالب‌ها) و ... ."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "گزینه‌های اساسی پروژه"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "نام پروژه"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "نام نویسندگان"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "نسخه انتشار پروژه"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "انتشار پروژه"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "زبان سند"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "پسوند پرونده‌ی منبع"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "نام سند اصلی"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "استÙاده epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "گزینه‌های اÙزونه"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "Ùعّال‌سازی %s اÙزونه"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "Ùعّال‌سازی اÙزونه‌های اختیاری"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "ایجاد Makefile و Batchfile"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "ایجاد پرونده‌ی سازنده (makefile)"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "پرونده‌ی سازنده (makefile) را ایجاد نکن"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "ایجاد Batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "batchfile را ایجاد نکن"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "اسÙتاده از حالت ایجاد برای پرونده‌های Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "عدم اسÙتاده از حالت ایجاد برای پرونده‌های Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "قالب سازی پروژه"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "شاخه‌ی قالب شامل پرونده‌های قالب"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "تعری٠متغیّر قالب"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "حالت «ساکت» تعیین شده، ولی یکی از موارد «پروژه» یا «نویسنده» مشخّص نشده."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "خطا: مسیر مشخّص شده پوشه نیست، یا از قبل پرونده‌های اسÙینکس وجود داشته‌اند."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "ابزار شروع سریع اسÙینکس Ùقط یک پوشه‌ی خالی درست Ù…ÛŒ کند. لطÙاً یک مسیر ریشه‌ی جدید مشخّص کنید."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "متغیرهای نامعتبرقالب؛ %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "غیرÙاصله‌ در Ùرآیند حذ٠Ùاصله‌ از ابتدای سطر حذ٠شد"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "برچسب نامعتبر:%s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "شماره‌ی سطر مشخّص شده خارج از بازه‌ی (1-%d) است: %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "امکان استÙاده از هر دوی %sÙˆ%s نیست"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "پرونده‌ی گنجانده شده %r یا پیدا نشد و یا خواندن آن شکست خورد"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "کدگذاری %r Ú©Ù‡ باری خواندن پرونده‌ی گنجانده شده‌ی %r اسÙتاده شده به نظر Ù…ÛŒ رسد اشتباه باشد، استÙاده از گزینه‌ی کدگذاری ( :encoding:) را امتحان کنید"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "شیئ با نام %r در پرونده‌ی %r پیدا نشد"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "امکان استÙاده‌ی گزینه‌ی «هم‌خوان شماره‌ی سطر» (lineno-match) با مجموعه‌ی سطرهای گسیخته وجود ندارد"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "سطر مشخّص شده %r: هیچ سطری از پرونده‌ی گنجانده شده %r بیرون کشیده نشده"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "درختواره‌ی Ùهرست مطالب ارجاعی به سند کنار گذاشته شده %r را دارد"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "Ùهرست مطالب شامل ارجاع به سند ناموجود %r است"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "نویسنده این بخش: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "نویسنده این ماژول: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "نویسنده ی کد: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "نویسنده: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "گزینه‌ی \":file:\" برای دستورالمعل جدول داده‌های جداشده با کاما (csv-table) حالا دیگر مسیر ثابت را یک مسیر نسبی از شاخه‌ی منبع در نظر Ù…ÛŒ گیرد. لطÙا٠سندتان را به روز رسانی کنید."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "اعلان C تکراری، که در %s:%s هم تعری٠شده.\nاعلان '.. c:%s:: %s' است."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "پارامترها"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "بازگشت ها"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "نوع برگشتی"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "عضو"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "متغیّر"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "تابع"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "ماکرو"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "ساختار"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "اجتماع"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "شمارش"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "شمارنده"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "گونه"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "مؤلّÙه‌ی تابع"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "جدید در نسخه %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "تغییر داده شده در نسخه %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "منسوخ شده از نسخه %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "نقل‌قول %s تکراری، مورد دیگر در %s قرار دارد"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "نقل [%s] قول ارجاع داده نشده."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "اعلان ++C تکراری، که در %s:%s هم تعری٠شده.\nاعلان '.. cpp:%s:: %s' است."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "پارامترهای قالب"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "ایجاد"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "کلاس"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "کانسپت"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "مؤلّÙه‌ی قالب"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (توابع درونی)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s متد)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s (کلاس)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (متغیّر عمومی یا مقدار ثابت)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s مشخصه)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "نشانوندها"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (ماژول)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "متد"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "داده"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "مشخّصه"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "ماژول"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "توضیح %s تکراری از %s، مورد دیگر%s در %s قرار دارد"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "بر چسب معادله ی %s تکرار است، مورد دیگر در %s قرار دارد"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "قالب مرجع معادله‌‌ی ریاضی (math_eqref_format) نامعتبر: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "متغیر ها"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "برانگیختن"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (در ماژول %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (در ماژول %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (متغیر درونی)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (کلاس درونی)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (کلاس در %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s شگرد کلاس)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s متد استاتیک)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s(%sویژگی)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "نمایه ی ماژول های پایتون"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "ماژول ها"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "منسوخ شده"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "ایراد"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "class method"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "متد استاتیک"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "ویژگی"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "برای ارجاع متقابل %r بیش از یک هد٠پیدا شد: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (منسوخ)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (دستورالمعل)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr "%s (گزینه‌ی دستورالمعل)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (نقش)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "دستورالمعل"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "گزینه‌ی دستورالمعل"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "نقش"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "توضیح تکراری از %s %s، مورد دیگر در %s قرار دارد"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "متغیرهای عمومی؛ %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "توضیح بدشکل برای گزینه‌ی %r، باید شبیه این‌ها باشد \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" یا \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s گزینه‌ی خط Ùرمان"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "گزینه خط Ùرمان"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "یک خط خالی باید پیش از اصطلاح واژه‌نامه باشد"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "اصطلاحات واژه‌نامه نباید با خطوط خالی از هم جدا شوند"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "به نظر Ù…ÛŒ رسد واژه‌نامه اشتباه Ø´Ú©Ù„ داده شده است، Ùاصله‌گذاری از ابتدای سطر را بررسی کنید"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "اصطلاح واژه‌نامه"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "نشانه ی گرامری"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "برچسب ارجاع"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "متغیّر عمومی"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "اختیارات برنامه"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "سند"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Ùهرست ماژول ها"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "صÙحه جستجو"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "بر چسب تکراری %s، مورد دیگر در %s قرار دارد"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "تکرار توضیح %s از %s، مورد دیگر در%s قرار دارد"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "شماره‌ی Ø´Ú©Ù„ غیر Ùعّال است. گزینه‌ی :numref: نادیده گرÙته می‌شود."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "شکست در ایجاد ارجاع متقابل. هیچ شماره انتساب داده نشده: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "پیوند هیچ برچسبی ندارد: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "قالب شماره‌ی شکل نامعتبر: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "قالب شماره‌ی شکل نامعتبر: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "پیکربندی جدید"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "پیکربندی تغییر داده شد"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "اÙزونه‌ها تغییر کردند"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "نسخه‌ی محیط ساخت به‌روز نیست"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "شاخه ی منبع تغییر کرد"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "این محیط با سازنده‌ی انتخاب شده سازگار نیست، لطÙاً یک خوشه‌ی اسناد دیگری را انتخاب کنید."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "پویش اسناد %s: %r شکست خورد"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "دامنه ی %r ثبت نشده"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "سند در هیچ درختواره‌ی Ùهرست مطالبی گنجانده نشده"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "درختواره‌ی Ùهرست مطالب با ارجاع به خود پیدا شده. نادیده گرÙته می‌شود."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "%s را ببینید"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "%s را هم ببینید"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "نوع ناشناخته مدخل نمایه %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "نماد ها"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "دور تسلسل در درختواره‌ی ارجاعات Ùهرست مطالب تشخیص داده شده، نادیده گرÙته می‌شوند: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "Ùهرست مطالب دارای ارجاع به سند %r است Ú©Ù‡ عنوانی ندارد: هیچ پیوندی تولید نخواهد شد"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "پرونده‌ی تصویر خوانا نیست: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "پرونده‌ی عکس %s خوانا نیست: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "پرونده‌ی دریاÙت شده خوانا نیست: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "شماره‌ی قسمت‌ها پیش‌تر به %s نسبت داده شده ( آیا درختواره‌ی Ùهرست مطالب شماره‌گذاری تو در تو دارد؟)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "پرونده‌ی %s را می سازد."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nبه صورت بازگشتی در مسیر <MODULE_PATH> دنبال پیمانه‌هاو بسته‌های پایتون بگرد Ùˆ \nبا به ازای دستورالمعل‌های خودکار پیمانه‌ی هر بسته در مسیر خروجی <OUTPUT_PATH> یک پرونده‌ی reST بساز.\n\nالگوی استثتاء های <EXCLUDE_PATTERN> می‌تواند الگوی پرونده‌ها Ùˆ یا شاخه‌هایی باشد Ú©Ù‡ از تولید کنار گذاشته شده‌اند.\n\nتوجّه: به صورت پیش Ùرض این اسکریپت روی پرونده‌های از پیش ساخته شده دوباره نویسی نمی‌کند."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "مسیر پیمانه به سند"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "الگوها‌ی به سبک fnmatch در پرونده و یا شاخه برای کنار گذاشتن از تولید"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "پوشه‌ای برای قرار دادن همه‌ی برون دادها"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "نهایت عمق زیر پیمانه‌ها برای نشان دادن در Ùهرست مطالب (پیش‌گزیده: Û´)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "بازنویسی پرونده‌های موجود"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "ردگیری پیوند نمادین. وقتی با collective.recipe.omelette ترکیب می‌شود توانمند است."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "اجرای اسکریپت بدون ساخت پرونده"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "قرار دادن مستندات هر پیمانه در صÙحه‌ی خودش"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "در برداشتن پیمانه‌های «خصوصی»(_private)"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "نام پرونده Ùهرست مطالب (پیش‌گزیده: پیمانه‌ها)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "پرونده‌ی Ùهرست مطالب را ایجاد Ù†Ú©Ù†"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "برای بسته‌ها و پیمانه‌ها سربرگ نساز (مثلاً وقتی رشته‌متن‌های مستندات از قبل آن‌ها را داشته باشند)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "قرار دادن مستندات پیمانه پیش از مستندات پیمانه‌ی زیرمجموعه‌‌اش"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "تÙسیر مسیرهای پیمانه بر اساس ویژگی‌های ضمنی Ùضای نام‌ها در PEP -0420"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "پسوند پرونده ( پیش Ùرض: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "تولید یک پروژه‌ی کامل با ابزار شروع سریع اسÙینکس"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "پیوست مسیر پیمانه (module_path) به مسیر سیستم (sys.path)، هنگامی به کار می‌رود که گزینه‌ی full-- داده شود"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "نام پروژه (پیش‌گزیده: نام پیمانه‌ی ریشه)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "نویسنده(های) پروژه، وقتی Ú©Ù‡ گزینه‌ی --full داده شده باشد استÙاده Ù…ÛŒ شود"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "نسخه‌ی پروژه، وقتی Ú©Ù‡ گزینه‌ی --full داده شده باشد استÙاده Ù…ÛŒ شود"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "نگارش پروژه، وقتی Ú©Ù‡ گزینه‌ی --full داده شده باشد استÙاده Ù…ÛŒ شود، پیش‌گزیده همان شماره‌ی نسخه (--doc-version) است"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "گزینه های اÙزونه"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s شاخه نیست."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "عبارت باقاعده‌ی نامعتبر %r در %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "آزمودن پوشش منابع پایان یاÙت، به نتایج در %(outdir)spython.txt نگاهی بیاندازید."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "عبارات باقاعده‌ی نامعتبر %r در پوشش عبارت باقاعده‌ی زبان سی (coverage_c_regexes)"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "رابط برنامه‌نویسی مستند نشده‌ی C: %s [%s] در پرونده‌ی %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "امکان وارد کردن پیمانه‎ی %s نبود: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "تابع پایتونی بدون مستندات: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "کلاس مستندسازی نشده‌ی پایتون: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "شگرد مستندسازی نشده‌ی پایتون: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "Ùاقد «+» یا «-» در گزینه‌ی '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "\"%s\" یک گزینه‌ی معتبر نیست."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' یک گزینه‌ی معتبر نسخه‌ی پایتون (pyversion) نیست"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "نوع TestCode نامعتبر"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "آزمایش مستندات منابع به پایان رسید، به نتایج در %(outdir)s/output.txt نگاهی بیاندازید."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "بدون کد/خروجی در تکّه‌ی %s در %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "نادیده گرÙتن کد پیمانه‌ی doctest : %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== کند ترین زمان خواندن ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "دستورالعمل Graphviz نمی تواند هم نشانوند محتوا را داشته باشد و هم نام پرونده"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "پرونده گنجانده شده‌ی خارجی Graphviz %r یا پیدا نشد و یا خواندنش با شکست رو به رو شد"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "نادیده گرÙتن دستورالعمل «graphviz» بدون محتوا."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "Ùرمان dot %r نمی‌تواند اجرا شود (زیرا نیازمند برون‌داد graphviz است)ØŒ تنظیمات graphviz_dot را بررسی کنید"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot با خطایی از کار اÙتاد:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot هیچ پرونده‌ی برون‌دادی تولید نکرد:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "قالب خروجی graphviz باید یکی از قالب های 'png' یا 'svg' باشد ولی %r است"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "کد دات: %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[گراÙ:%s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[گراÙ:]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "تبدیل با خطایی از کار اÙتاد:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "Ùرمان تبدیل %r را نمی توان اجرا کرد، تنظیمات image_converter را بررسی کنید"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "Ùرمان لتکس %r را نمی توان اجرا کرد(برای نمایش ریاضی لازم است)ØŒ تنظیمات imgmath_latex را بررسی کنید"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%sÙرمان %r را نمی توان اجرا کرد(برای نمایش ریاضی لازم است)ØŒ تنظیمات imgmath_%s را بررسی کنید"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "نمایش لتکس: %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "لتکس بین سطری: %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "سیاهه‌ی بین اسÙینکس جا به جایی را انجام داد: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "بارگذاری سیاهه‌ی بین اسÙینکس از %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "مشکلاتی در برخی از سیاهه‌ها به وجود آمد،ولی این مشکلات راه‌های جایگزین های داشته‌اند:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "شکست در رسیدن به یکی از سیاهه‌ها به خاطر مشکلات زیر:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(در %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(در %s )"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "شناساگر بین اسÙینکس %r رشته‌متن نیست. نادیده گرÙته شد"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "شکست در خواندن intersphinx_mapping[%s]ØŒ نادیده گرÙته می‌شود: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[منبع]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "در دست انجام"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "مدخل Ùهرست اقدام پیدا شد: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<original entry> در%s Ùˆ سطر %d جای گرÙته است.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "مدخل اصلی"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "برجسته کردن کد پیمانه... "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[مستندات]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "کد ماژول"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>کد منبع برای %s </h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "بررسی اجمالی: کد ماژول"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1> همه‌ی پیمانه‌هایی که برایشان کد در دسترس است</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "مقدار نامعتبر برای گزینه‌ی ترتیب اعضا (member-order): %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "مقدار نامعتبر برای گزینه‌ی «از مستندات کلاس» class-doc-from:%s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "امضای ناشناخته‌ برای %s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "خطا در قالب بندی نشانوند برای %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "مشخّص نیست کدام پیمانه را برای مستندسازی خودکار Ùراخوان کند %r (سعی کنید دستورالعمل «module» یا «currentmodule» را در سند قرار دهید، یا یک نام واضح برای پیمانه ارائه دهید)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "شیئ ساختگی شناسایی شد: %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "خطا در قالب بندی امضا برای %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" در پیمانه‌ی خودکار معنی نمی‌دهد"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "نشانوند‌های امضا یا یادداشت مقدار برگشتی داده شده برای پیمانه‌ی خودکار %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ باید لیستی از رشته‌متن ها باشد، نه %r (در پیمانه‌ی %s) -- __all__ نادیده گرÙته می‌شود"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "ویژگی نایاب در گزینه‌ی :members: قید شده: پیمانه‌ی:%s، ویژگی %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "شکست در دریاÙت امضای تابع برای %s: مؤلّÙÙ‡ پیدا نشد: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "شکست در دریاÙت امضای سازنده‌ی شیئ برای %s: مؤلّÙÙ‡ پیدا نشد: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "پایه ها:%s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "ویژگی ناموجود %s در شیئ %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "نام جانشین %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "نام جانشین نوع متغیر(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "شکست در دریاÙت امضای شگرد برای %s: مؤلّÙÙ‡ پیدا نشد: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "__slots__ نامعتبر در %sیدا شد Ùˆ نادیده گرÙته شد."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "شکست در تحلیل مقدار پیش‌گزیده‌‌ی نشانوند برای %r: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "شکست در به روز رسانی امضا برای %r: مؤلّÙÙ‡ پیدا نشد: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "شکست در تحلیل نوع یادداشت برای %r: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "ارجاعات خلاصه‌ی خودکار سند %r حذ٠کنار گذاشته. نادیده گرÙته می‌شود."
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "خلاصه‌ی خودکار: خرده‌پرونده‌ی %r پیدا نشد. تنظیمات تولید خلاصه‌ی خودکار(autosummary_generate) را بررسی کنید."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "خلاصه‌ی خودکار عنوان‌ٔار نیازمند گزینه‌ی :toctree: است، نادیده گرÙته می‌شود."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "شکست در تجزیه تحلیل نام %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "شکست در وارد کردن شیئ %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "تولید خلاصه خودکار: پرونده پیدا نشد: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "خلاصه‌ی خودکار به طور داخلی پرونده‌های rst را ایجاد می‌کند. ولی پسوند منبع شما شامل rst نیست. نادیده گرÙته می‌شود."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "خلاصه‌ی خودکار: شکست در تشخیص %r برای مستندسازی، این ایراد به وجود آمد:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[خلاصه‌ی خودکار] تولید خلاصه‌ی خودکار برای: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[خلاصه‌ی خودکار] نوشتن در %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nتولید ReStructuredText با استÙاده از دستورالعمل‌های خلاصه‌ی خودکار.\n\nخودکارساز اسÙینکس رابط کابر پسندی برای sphinx.ext.autosummary.generate (پیمانه‌ی اÙزونه‌ی خلاصه‌ساز اسÙنیکس) است.\nاین اÙزونه پرونده های متن reStructuredText را از دستورالعمل‌های خلاصه‌ی خودکاری تولید می‌کند Ú©Ù‡ در پرونده‌های درون‌داد مشخّص شده قرار دارد.\n\nقالب دستورالعمل خلاصه‌ی خودکار درپیمانه‌ی اÙزونه‌ی خلاصه‌ی خودکار اسÙنیکس (sphinx.ext.autosummary) مستند سازی شده Ù…ÛŒ توان آن را با دستور زیر خواند::\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "پرونده‌های منبع برای تولید پرونده‌های rST"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "پوشه‌ای برای قرار دادن همه‌ی برون دادها در آن"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "پسوند پیش Ùرض برای پرونده‌ها (پیش‌Ùرض: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "شاخه‌ی سÙارشی قالب (پیش‌گزیده: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "اجزای Ùراخوان شده‌ی سند (پیش‌گزیده: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "نشانوندهای کلیدی"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "مثال"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "نمونه‎ها"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "یادداشت‌ها"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "مؤلّÙه‌های دیگر"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "دریاÙت‌ها"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "منابع"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "هشدارها"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Ùرآورده"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "مقدار نامعتبر تعیین شده (بدون کمانک انتهایی): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "مقدار نامعتبر تعیین شده (بدون کمانک ابتدایی): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "رشته‌متن ادبی ناقص (بدون علامت نقل‌قول انتهایی): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "رشته‌متن ادبی ناقص (بدون علامت نقل‌قول ابتدایی): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "دقت"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "ملاحظه"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "خطر"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "خطا"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "راهنمایی"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "مهم"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "توجه"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "همچنین ملاحظه نمائید"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "نکته"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "هشدار"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "ادامه از صÙحه‌ی قبل"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "ادامه در صÙحه‌ی بعد"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "غیر الÙبایی"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "شماره ها"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "صÙحه"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Ùهرست عناوین"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "جستجو"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "برو"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "نمایش سورس"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "بررسی اجمالی"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "خوش آمدید! این"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "مستندات برای"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ùهرست &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ناوبری"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "جستجو در %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "درباره این مستندات"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "کپی رایت"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "آخرین بروز رسانی در %(last_updated)s ."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "ایجاد شده با<a href=\"https://www.sphinx-doc.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:12
+msgid "Previous topic"
+msgstr "موضوع قبلی"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Ùصل قبلی"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "موضوع بعدی"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "Ùصل بعدی"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "لطÙاً برای Ùعّال کردن کارکرد جستجو\nجاوا اسکریپت را Ùعّال کنید."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "در حال جستجو برای چندین واژه. Ùقط واژگانی را نشان می‌دهد Ú©Ù‡ شامل این موارد باشد:\n همه‌ی کلمه‌ها."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "جستجو"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "نتایج جستجو"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "جستجو سریع"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "تغییرات در نسخه %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "در حال جست و جو"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "آماده سازی جست و جو..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr "، در "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "عدم نمایش نتایج یاÙت شده"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "تا کردن نوار کناره"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "گسترش نوار کناره"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "محتوا ها"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "نمایه‌ای بر پایه‌ی Û´ ستون پیدا شد. شاید یک اشکال برنامه‌نویسی از اÙزونه‌هایی Ú©Ù‡ استÙاده می‌کنید باشد: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "پانویس [%s] ارجاع داده نشده است."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "پانویس [#] ارجاع داده نشده است."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ارجاعات پانویس ناهناهنگ در پیام‌های ترجمه شده. اصلی:{0}، ترجمه شده:{1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "ارجاعات ناهناهنگ در پیام‌های ترجمه شده. اصلی:{0}، ترجمه شده:{1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ارجاعات نقل قول ادبی ناهناهنگ در پیام‌های ترجمه شده. اصلی:{0}، ترجمه شده:{1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ارجاعات اصطلاحی ناهناهنگ در پیام‌های ترجمه شده. اصلی:{0}، ترجمه شده:{1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "امکان تشخیص متن جایگزین برای ارجاع متقابل نبود. شاید یک اشکال برنامه نویسی باشد."
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "برای «هر» ارجاع متقابل بیشتر از یک Ù‡Ùد پیدا شد: %r شاید %s باشد"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s مرجع هد٠پیدا نشد: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "مقصد ارجاع %r پیدا نشد %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "امکان دریاÙت تصویر از منبع راه دور نبود: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "امکان دریاÙت تصویر از منبع راه دور نبود: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "قالب تصویر ناشناخته: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "نویسه‌ی منبع غیرقابل رمزگشایی، جایگزین با «؟» : %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "رد شدن و نادیده انگاشتن"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "شکست خورد"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "نام نقش یا دستورالعمل ناشناخته: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "بست از نوع ناشناخته: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "خطای خواندن: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "خطای نوشتن: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "قالب تاریخ ناشناخته. اگر می‌خواهید از رشته‌متن مستقیماً خروجی بگیرید، آن را با نقل قول رشته‌متنی محصور کنید: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "درختواره‌ی Ùهرست مطالب شامل ارجاع به پرونده ناموجود %r است"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "ایراد در هنگام ارزیابی تنها عبارت دستور العمل: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "نقش پیش‌Ùرض %s یاÙت نشد"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "قالب عدد شکل برای %s تعری٠نشده"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "هر کدام از شناسه‌هایی که به بست %s اختصاص داده نشده"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "امکان دست یابی به اندازه‌ی عکس نبود. گزینه‌ی تغییر اندازه :scale: نادیده گرÙته می‌شود."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "قسمت‌بندی رده‌بالای %r ناشناخته برای کلاس %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr "مقدار بسیار بزرگ :maxdepth:ØŒ نادیده گرÙته شد."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "عنوان سند یک بست متنی نیست"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "به بست عنوانی برخورد که در قسمت، موضوع، جدول، اندرز یا نوارکناری نبود"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "پانویس ها"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "هر دو مقدار tabularcolumns و :widths: داده شده، بنابراین :widths: حذ٠می شود."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "ابعاد واحد %sنامعتبر است Ùˆ نادیده گرÙته شد."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "نوع ناشناخته مدخل نمایه%s پیدا شد"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[تصویر%s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[تصویر]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "عنوان درون شکل نیست."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "بست به کار نرÙته: %r"
diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.js b/sphinx/locale/fi/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..5d60788
--- /dev/null
+++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "fi",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "Tietoja t\u00e4st\u00e4 documentist\u00e4",
+ "Automatically generated list of changes in version %(version)s": "Automaattisesti luotu muutoshistoria alkaen versiosta %(version)s",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "Hakemisto yhten\u00e4 luettelona",
+ "General Index": "Yleinen sis\u00e4llysluettelo",
+ "Global Module Index": "Yleinen moduulien sis\u00e4llysluettelo",
+ "Go": "Siirry",
+ "Hide Search Matches": "Piilota l\u00f6ydetyt",
+ "Index": "Sis\u00e4llysluettelo",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "Hakemisto aakkostus sivuttain",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "Navikointi",
+ "Next topic": ">>",
+ "Other changes": "",
+ "Overview": "Yhteenveto",
+ "Please activate JavaScript to enable the search\n functionality.": "Javascript pit\u00e4\u00e4 olla sallittu, jotta etsint\u00e4 toimii.",
+ "Preparing search...": "",
+ "Previous topic": "<<",
+ "Quick search": "Pikahaku",
+ "Search": "Etsi",
+ "Search Page": "Etsi sivu",
+ "Search Results": "Etsinn\u00e4n tulos",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "N\u00e4yt\u00e4 l\u00e4hdekoodina",
+ "Table of Contents": "",
+ "This Page": "T\u00e4m\u00e4 sivu",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "voi olla iso",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": ">>",
+ "previous chapter": "<<",
+ "quick access to all modules": "",
+ "search": "etsi",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/fi/LC_MESSAGES/sphinx.mo b/sphinx/locale/fi/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..8573639
--- /dev/null
+++ 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
new file mode 100644
index 0000000..1259e61
--- /dev/null
+++ b/sphinx/locale/fi/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2009
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FIRST AUTHOR <EMAIL@ADDRESS>, 2009\n"
+"Language-Team: Finnish (http://app.transifex.com/sphinx-doc/sphinx-1/language/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Moduulitaso"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Yleinen sisällysluettelo"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "hakemisto"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ">"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "<"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Sisällysluettelo"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Luvun kirjoittaja: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Moduulin kirjoittaja: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Tekijä: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Uusi versiossa %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Muutettu versiossa %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Poistettu versiosta %s alkaen"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (moduuli)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "moduuli"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduulit"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Poistettu"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (poistettu)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Moduuli sisällysluettelo"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Etsi sivu"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Tehtävä vielä"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Huom"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Varoitus"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Vaara"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Virhe"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Vihje"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Tärkeä"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Muista"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Katso myös"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Vihje"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Varoitus"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Etsi"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Siirry"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Näytä lähdekoodina"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Yhteenveto"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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 "Yleinen moduulien sisällysluettelo"
+
+#: 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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Hakemisto yhtenä luettelona"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Hakemisto aakkostus sivuttain"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "voi olla iso"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navikointi"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Tietoja tästä documentistä"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "<<"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "<<"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ">>"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ">>"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Javascript pitää olla sallittu, jotta etsintä toimii."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "etsi"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Etsinnän tulos"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Pikahaku"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Tämä sivu"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automaattisesti luotu muutoshistoria alkaen versiosta %(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 ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Piilota löydetyt"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.js b/sphinx/locale/fr/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..291b36c
--- /dev/null
+++ b/sphinx/locale/fr/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "fr",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", dans ",
+ "About these documents": "\u00c0 propos de ces documents",
+ "Automatically generated list of changes in version %(version)s": "Liste auto-g\u00e9n\u00e9r\u00e9e des modifications dans la version %(version)s",
+ "C API changes": "Modifications de l'API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Changements dans la version %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "R\u00e9duire la barre lat\u00e9rale",
+ "Complete Table of Contents": "Table des mati\u00e8res compl\u00e8te",
+ "Contents": "Contenu",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Cr\u00e9\u00e9 en utilisant <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "Agrandir la barre lat\u00e9rale",
+ "Full index on one page": "Index complet sur une seule page",
+ "General Index": "Index g\u00e9n\u00e9ral",
+ "Global Module Index": "Index g\u00e9n\u00e9ral des modules",
+ "Go": "Go",
+ "Hide Search Matches": "Cacher les r\u00e9sultats de la recherche",
+ "Index": "Index",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Indexer les pages par lettre",
+ "Indices and tables:": "Index et tables :",
+ "Last updated on %(last_updated)s.": "Mis \u00e0 jour le %(last_updated)s.",
+ "Library changes": "Modifications de la biblioth\u00e8que",
+ "Navigation": "Navigation",
+ "Next topic": "Sujet suivant",
+ "Other changes": "Autres modifications",
+ "Overview": "R\u00e9sum\u00e9",
+ "Please activate JavaScript to enable the search\n functionality.": "Veuillez activer le JavaScript pour que la recherche fonctionne.",
+ "Preparing search...": "Pr\u00e9paration de la recherche...",
+ "Previous topic": "Sujet pr\u00e9c\u00e9dent",
+ "Quick search": "Recherche rapide",
+ "Search": "Recherche",
+ "Search Page": "Page de recherche",
+ "Search Results": "R\u00e9sultats de la recherche",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "Recherche termin\u00e9e, ${resultCount} page(s) correspondant \u00e0 la requ\u00eate de recherche ont \u00e9t\u00e9 trouv\u00e9es.",
+ "Search within %(docstitle)s": "Recherchez dans %(docstitle)s",
+ "Searching": "Recherche en cours",
+ "Searching for multiple words only shows matches that contain\n all words.": "Une recherche sur plusieurs mots ne retourne que les r\u00e9sultats contenant tous les mots.",
+ "Show Source": "Montrer le code source",
+ "Table of Contents": "Table des mati\u00e8res",
+ "This Page": "Cette page",
+ "Welcome! This is": "Bienvenue ! Ceci est",
+ "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. Veuillez v\u00e9rifier que les mots sont correctement orthographi\u00e9s et que vous avez s\u00e9lectionn\u00e9 assez de cat\u00e9gories.",
+ "all functions, classes, terms": "toutes les fonctions, classes, termes",
+ "can be huge": "peut \u00eatre \u00e9norme",
+ "last updated": "derni\u00e8re modification",
+ "lists all sections and subsections": "lister l'ensemble des sections et sous-sections",
+ "next chapter": "Chapitre suivant",
+ "previous chapter": "Chapitre pr\u00e9c\u00e9dent",
+ "quick access to all modules": "acc\u00e8s rapide \u00e0 l'ensemble des modules",
+ "search": "rechercher",
+ "search this documentation": "rechercher dans cette documentation",
+ "the documentation for": "la documentation pour"
+ },
+ "plural_expr": "(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/fr/LC_MESSAGES/sphinx.mo b/sphinx/locale/fr/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..c11b9d1
--- /dev/null
+++ 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
new file mode 100644
index 0000000..0703e23
--- /dev/null
+++ b/sphinx/locale/fr/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3722 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# ABOU SAMRA Jean <jean@abou-samra.fr>, 2020
+# Adam Levine <adam.l.levine@gmail.com>, 2020
+# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2017
+# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2013,2015
+# cyrille gachot <cyrille.gachot@smile.fr>, 2019
+# David Georges, 2021
+# Larlet David <david@larlet.fr>, 2008
+# Denis Bitouzé <dbitouze@wanadoo.fr>, 2020-2022
+# fgallaire <fgallaire@gmail.com>, 2010
+# fgallaire <fgallaire@gmail.com>, 2010
+# François Poirotte <clicky@erebot.net>, 2016-2017,2020
+# Georg Brandl <g.brandl@gmx.net>, 2014
+# Hugo Herbelin <Hugo.Herbelin@inria.fr>, 2021
+# Jean-Daniel Browne <jeandaniel.browne@gmail.com>, 2010
+# Jean-François B. <jfbu@free.fr>, 2017-2019,2022-2023
+# Jérémie Tarot <silopolis@gmail.com>, 2022-2023
+# Julien Palard <github@mandark.fr>, 2017
+# Julien Malard <julien.malard@mail.mcgill.ca>, 2019
+# Kim S. <kim.sylvestre@gmail.com>, 2019
+# Larlet David <david@larlet.fr>, 2008
+# LAURENT Raphaël <laurent@ined.fr>, 2018-2019
+# 751bad527461b9b1a5628371fac587ce_51f5b30 <748bb51e7ee5d7c2fa68b9a5e88dc8fb_87395>, 2013-2014
+# Nicolas Friedli <nicolas.friedli@gmail.com>, 2021
+# Nikolaj van Omme <nikolaj.van.omme@gmail.com>, 2014-2015
+# Olivier Bonaventure <bonaventure@acm.org>, 2019
+# Pierre Grépon <pgrepon@yahoo.fr>, 2016
+# Sebastien Douche <sdouche@gmail.com>, 2008
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016,2020
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Jérémie Tarot <silopolis@gmail.com>, 2022-2023\n"
+"Language-Team: French (http://app.transifex.com/sphinx-doc/sphinx-1/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Impossible de trouver le répertoire source (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Le répertoire de sortie (%s) n'est pas un répertoire"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Les dossiers source et destination ne doivent pas être identiques"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx v%s en cours d'exécution"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Ce projet nécessite au minimum Sphinx v%s et ne peut donc être construit avec cette version."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "Création du répertoire de sortie"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "lors de l'initialisation de l'extension %s :"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' tel que défini dans conf.py n'est pas un objet Python appelable. Veuillez modifier sa définition pour en faire une fonction appelable. Ceci est nécessaire pour que conf.py se comporte comme une extension Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "chargement des traductions [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "fait"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "traductions indisponibles"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "Chargement de l'environnement pickled"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "échec : %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Aucun constructeur sélectionné, utilisation du défaut : html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "a réussi"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "s'est terminée avec des problèmes"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "La compilation %s, %s avertissement (avec les avertissements considérés comme des erreurs)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "La compilation %s, %s avertissements (avec les avertissements considérés comme des erreurs)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "La compilation %s, %s avertissement."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "La compilation %s, %s avertissements."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "La compilation %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "la classe de nœud %r est déjà enregistrée, ses visiteurs seront écrasés"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "la directive %r est déjà enregistrée, elle sera écrasée"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "le rôle %r est déjà enregistré, il sera écrasé"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "l’extension %s ne se déclare pas compatible à la lecture en parallèle, on supposera qu’elle ne l'est pas - merci de demander à l'auteur de l’extension de vérifier ce qu’il en est et de le préciser explicitement"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "l'extension %s n'est pas compatible avec les lectures parallèles"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "l’extension %s ne se déclare pas compatible à l’écriture en parallèle, on supposera qu’elle ne l’est pas - merci de demander à l'auteur de l’extension de vérifier ce qu’il en est et de le préciser explicitement"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "l'extension %s n'est pas compatible avec les écritures parallèles"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "sérialisation en cours %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "Le dossier de configuration ne contient pas de fichier conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "Valeur de configuration invalide trouvée: 'language = None'. Mettez à jour la configuration avec un code de langage valide. Utilisation de 'en' (English) comme substitut."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "impossible d'écraser le dictionnaire de configuration %r ; ignoré (utilisez %r pour modifier les éléments individuellement)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "nombre non valide %r pour l'option de configuration %r ; ignoré"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "impossible de remplacer le paramètre de configuration %r par un type non-supporté ; ignoré"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "paramètre de configuration %r inconnu dans override ; ignoré"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Option de configuration inexistante : %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "L'option de configuration %r est déjà présente"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Votre fichier de configuration comporte une erreur de syntaxe : %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Le fichier de configuration (ou un des modules qu'il utilise) génère un sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Votre fichier de configuration comporte une erreur de programmation : \n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "Le paramètre « source_suffix » s'attend à recevoir une chaîne de caractères, une liste de chaînes de caractères ou un dictionnaire. Mais vous avez fourni un « %r »."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Section %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Fig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tableau %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Code source %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "La valeur « {current} » du paramètre « {name} » ne figure pas dans la liste des possibilités valables « {candidates} »."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "Le type du paramètre de configuration « {name} » doit être {permitted} et non « {current.__name__} »."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "Le paramètre de configuration « {name} » a pour type « {current.__name__} », tandis que le type par défaut est « {default.__name__} »."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r non trouvé; ignoré."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Depuis sa version 2.0, Sphinx utilise \"index\" comme root_doc par défaut. Veuillez ajouter \"root_doc = 'contents'\" à votre conf.py."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Évènement %r déjà présent"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Nom d'évènement inconnu : %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "Le gestionnaire %r de l'évènement %r a créé une exception."
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "L'extension %s est exigée par le paramètre needs_extensions, mais n'est pas chargée."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Ce projet nécessite que l'extension %s soit au minimum en version %s et par conséquent il ne peut pas être construit avec la version chargée (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Le nom du l'analyseur Pygments %r est inconnu"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "plusieurs fichiers trouvés pour le document \"%s\" : %r\nUtiliser %r pour la compilation."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "La classe Builder %s n'a pas d'attribut « name »"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Le constructeur %r existe déjà (dans le module %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Le nom de Constructeur %s n'est ni enregistré ni accessible par point d'entrée"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Constructeur %s non enregistré"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domaine %s déjà enregistré"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domaine 1%s pas encore enregistré"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "La directive %r est déjà enregistrée sur le domaine %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "Le rôle %r est déjà enregistré sur le domaine %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "L'index %r est déjà enregistré sur le domaine %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "Le type de l'objet %r est déjà enregistré"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "Le type %r crossref_type est déjà enregistré"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "L'extension source %r est déjà enregistrée"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser pour %r est déjà enregistré"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "source_parser pour %s non enregistré"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Il existe déjà un traducteur pour %r"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "Les kwargs pour add_node() doivent être un tuple de fonction (visite, départ) : %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r est déjà enregistré"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "le moteur de rendu mathématique %s est déjà enregistré"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "l'extension %r a été intégrée à Sphinx depuis la version %s ; cette extension est ignorée."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Exception initiale :\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "L'extension %s ne peut pas être importée"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "l'extension %r n'a pas de fonction setup(); est-elle réellement un module d'extension de Sphinx ?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "L'extension %s utilisée par ce projet nécessite au moins Sphinx v%s ; il ne peut donc pas être construit avec la version courante."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "l'extension %r a renvoyé par sa fonction setup() un type d'objet non supporté ; elle devrait renvoyer None ou un dictionnaire de méta-données"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "numéro PEP %s non valide"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "numéro RFC %snon valide"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "Le thème %r n'a pas de paramètre « theme »"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "Le thème %r n'a pas de paramètre « inherit »"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "Aucun thème nommé %r n'est trouvé, hérité de %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "le paramètre %s.%s n'apparaît dans aucune des configurations de thème recherchées"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "L'option %r n'est pas supportée pour ce thème"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "le fichier %r dans le dossier des thèmes n'est pas une archive zip valide ou ne contient aucun thème"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "Le thème nommé %r n'a pas été trouvé (le fichier theme.conf est-il bien présent ?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "l'image appropriée pour le constructeur %s n'a pas été trouvée : %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "l'image appropriée pour le constructeur %s n'a pas été trouvée : %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "Construction en cours [mo] : "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "Écriture... "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "tous les %d fichiers po"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "cibles spécifiées pour les fichiers po %d"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "cibles périmées pour les fichiers po %d"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "tous les fichiers source"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "le fichier %r passé dans la ligne de commande n'existe pas, "
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "le fichier %r saisi en ligne de commande n'est pas présent dans le dossier source, il sera ignoré"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "le fichier %r passé dans la ligne de commande n'est pas un document valide, ignoré"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d fichiers source saisis en ligne de commande"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "cibles périmées pour les fichiers sources %d"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "Construction [%s] : "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "Recherche des fichiers périmés... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d trouvé"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "aucun résultat"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "Environnement de sérialisation"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "Vérification de la cohérence"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "Aucune cible n'est périmée."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "Mise à jour de l'environnement : "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s ajouté(s), %s modifié(s), %s supprimé(s)"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "Lecture des sources... "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "documents à écrire : %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "Document en préparation"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "Entrées dupliquées de la table des matières trouvées : %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "Copie des images... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "impossible de lire le fichier image %r: il sera copié à la place"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "impossible de copier le fichier image %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "impossible d'écrire le fichier image %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow introuvable - copie des fichiers image"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "écriture du type MIME du fichier ..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "écriture du fichier META-INF/container.xml..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "Enregistrement du fichier content.opf..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "mimetype inconnu pour %s, il sera ignoré"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "Enregistrement du fichier toc.ncx..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "fichier %s en cours d'écriture..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "Le fichier d'aperçu se trouve dans %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "aucun changement dans la version %s"
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "écriture du fichier de résumé..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Fonctions de base"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Module"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "Copie des fichiers sources..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "impossible de lire %r pour la création du changelog"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "Le constructeur factice ne génère aucun fichier."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "Le fichier ePub se trouve dans %(outdir)s ."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "Enregistrement du fichier nav.xhtml..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "la variable de configuration \"epub_language\" (ou \"language\") ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "le paramètre de configuration \"epub_uid\" ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"epub_title\" (ou \"html_title\") ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"epub_author\" ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"epub_contributor\" ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"epub_description\" ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"epub_publisher\" ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"epub_copyright\" (ou \"copyright\") ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"epub_identifier\" ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "le paramètre de configuration \"version\" ne peut pas être vide pour EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "Fichier CSS invalide : %r, sera ignoré"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "La liste des messages se trouve dans %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "cibles pour les modèles de fichiers %d"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "lecture des gabarits... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "écriture des catalogues de messages... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Recherchez les éventuelles erreurs dans la sortie ci-dessus ou dans %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "lien mort: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "Échec de la compilation de la regex dans linkcheck_allowed_redirects : %r%s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Le manuel se trouve dans %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "aucun valeur de configuration \"man_pages\" trouvée; aucun page du manuel ne sera enregistrée"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "Enregistrement"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "le paramètre de configuration \"man_pages\" référence un document inconnu %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "Les pages HTML sont dans %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "création du document unique"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "Enregistrement des fichiers supplémentaires"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Les fichiers Texinfo se trouvent dans %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nExécuter 'make' dans ce répertoire pour les soumettre à makeinfo\n(ou 'make info' directement ici pour l'automatiser)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "aucun paramètre de configuration \"texinfo_documents\" trouvé: aucun document ne sera écrit"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "La valeur du paramètre \"texinfo_documents\" référence un document inconnu %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "Traitement de %s en cours"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "résolution des références..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(dans"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "Copie des fichiers de support Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "erreur lors l'écriture du fichier Makefile : %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Les fichiers texte se trouvent dans %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "erreur lors l'écriture du fichier %s : %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Les fichiers XML se trouvent dans %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Le fichier pseudo-XML se trouve dans %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "Le fichier de configuration de construction est corrompu : %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Les pages HTML sont dans %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Échec de lecture du fichier de configuration de construction : %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Index général"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "suivant"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "précédent"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "Génération des index"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "Écriture des pages additionnelles"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "Copie des fichiers téléchargeables... "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "impossible de copier le fichier téléchargeable %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "Échec de la copie du fichier dans html_static_file : %s : %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "Copie des fichiers statiques"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "impossible de copier le fichier static %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "Copie des fichiers complémentaires"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "Copie des fichiers supplémentaires impossible %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Échec d'écriture du fichier de configuration de construction : %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "L'index de recherche n'a pas pu être chargé, mais tous les documents ne seront pas construits: l'index sera incomplet."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "La page %s correspond à deux motifs dans html_sidebars: %r et %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "une erreur Unicode est survenue lors du rendu de la page %s. Veuillez vous assurer que toutes les valeurs de configuration comportant des caractères non-ASCII sont des chaînes Unicode."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Un erreur est survenue lors de la génération de la page: %s.\nLa raison est: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "Export de l'inventaire des objets"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "Export de l'index de recherche en %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "Fichier js_file : %r invalide, sera ignoré"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Plusieurs math_renderers sont enregistrés. Mais aucun n'est sélectionné."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "math_renderer inconnu %r saisi."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "L’entrée %r de html_extra_path n’existe pas"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "L’entrée %r de html_extra_path se trouve à l’intérieur de outdir"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "L’entrée %r de html_static_path n’existe pas"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "L’entrée %r de html_static_path se trouve à l’intérieur de outdir"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "Le fichier de logo %r n’existe pas"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "Le fichier de favicon %r n’existe pas "
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Documentation %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Les fichiers LaTex se trouvent dans %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nExécuter 'make' dans ce répertoire pour les soumettre à (pdf)latex\n(ou 'make latexpdf' directement ici pour l’automatiser)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "aucune valeur de configuration \"latex_documents\" trouvée; aucun document de sera généré"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "La valeur du paramètre \"latex_documents\" référence un document inconnu %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Version"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "Aucune option Babel disponible pour la langue %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "Copie des fichiers de support TeX"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "Copie des fichiers de support TeX..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "Copie de fichiers supplémentaires"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Clé de configuration inconnue : latex_elements[%r]; ignorée."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "Option de thème inconnue : latex_theme_options[%r], ignoré."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r n'a pas d'option « theme »"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r n'a pas d'option « %s »"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "Une exception a été levée lors de la génération, démarrage du débogueur :"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "Interrompu !"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "Erreur de balise reST :"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Erreur d'encodage :"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "La trace d’appels complète a été sauvegardée dans %s, au cas où vous souhaiteriez signaler le problème aux développeurs."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Erreur de récursion :"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "Cela peut se produire avec des fichiers sources très volumineux ou profondément imbriqués. Vous pouvez augmenter avec attention la limite de récursivité par défaut de Python de 1000 dans conf.py avec p. ex. :"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Une exception a été levée :"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Merci de rapporter ceci s'il s'agit d'une erreur utilisateur, afin d'améliorer le message d'erreur à l'avenir."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Un rapport d'erreur peut être déposé dans le système de tickets à <https://github.com/sphinx-doc/sphinx/issues>. Merci !"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "Le numéro du job doit être strictement positif"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "Pour plus d'informations, visitez le site <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nGénération de la documentation à partir des fichiers sources.\n\nsphinx-build génère de la documentation à partir des fichiers de SOURCEDIR et la place\ndans OUTPUTDIR. Il recherche 'conf.py' dans SOURCEDIR pour les paramètres de configuration.\nL'outil 'sphinx-quickstart' peut être utilisé pour générer des fichiers modèles,\ny compris 'conf.py'.\n\nsphinx-build peut créer de la documentation dans différents formats. Un format est\nsélectionné en spécifiant le nom du constructeur sur la ligne de commande ; le format par défaut est\nHTML. Les constructeurs peuvent également effectuer d'autres tâches liées au traitement de la documentation.\n\nPar défaut, tout ce qui est obsolète est construit. La sortie pour les fichiers sélectionnés seulement\npeut être construite en spécifiant des noms de fichiers individuels.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "chemin des fichiers sources de la documentation"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "chemin du répertoire de sortie"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "une liste de fichiers spécifiques à reconstruire. Sera ignoré si l'option -a est spécifiée."
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "options générales"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "constructeur à utiliser (par defaut: HTML)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "enregistrer tous les fichiers (par défaut : enregistrer seulement les fichiers nouveaux ou modifiés)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "ne pas utiliser un environnement sauvegardé, relire toujours tous les fichiers"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "chemin pour le cache d'environnement et de fichiers doctree (défaut : OUTPUTDIR/.doctrees) "
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "build parallèle avec N processus si possible (la valeur spéciale \"auto\" ajuste N à cpu-count)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "chemin dans lequel se trouve le fichier de configuration (conf.py). (valeur par défaut : identique à SOURCEDIR)."
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "n'utilisez aucun fichier de configuration, seulement l'option -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "outre passer un paramètre du fichier de configuration"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "passer une valeur aux templates HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "définit une balise : seules les blocs \"only\" avec TAG seront inclus"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "mode sourcilleux, signale toute référence manquante"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "options de la console de sortie"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "augmenter la verbosité (peut être répété)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "aucune sortie vers stdout, seulement les avertissements vers stderr"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "aucune sortie du tout, même pas les avertissements"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "émettre une sortie de couleur (par défaut : auto-détection)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "ne pas émettre une sortie de couleur (par défaut : auto-détection)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "écrire les avertissements (et les erreurs) vers le fichier spécifié"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "modifier les avertissements en erreurs"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "avec -W, l'exécution se poursuit en cas d'avertissements"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "montrer la trace d’appels complète si une exception est levée"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "exécuter Pdb si une exception se produit."
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "impossible de combiner l'option -a avec le nom du fichier"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "impossible d'ouvrir le fichier des avertissements %r : %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "l'option -D doit être sous la forme nom=valeur"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "l'option -A doit être sous la forme nom=valeur"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "insère automatiquement les docstrings des modules"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "tester automatiquement des extraits de code dans des blocs doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "lien entre la documentation Sphinx de différents projets"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "entrées \"todo\" pouvant être montrées ou cachées à la compilation"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "vérification de la couverture de la documentation"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "expressions mathématiques, traduites en images PNG ou SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "expressions mathématiques, transmises dans le navigateur à MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "inclusion conditionnelle du contenu basé sur la valeur de configuration"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "inclure des liens vers le code source documenté des objets Python"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "crée un fichier .nojekyll pour publier le document sur GitHub pages"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Merci de saisir un chemin valide."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Merci de saisir du texte."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Merci de saisir un des %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Merci de saisir 'y' ou 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Merci de saisir l'extension du fichier, par exemple '.rst' ou '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Bienvenue dans le kit de démarrage rapide de Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Veuillez saisir des valeurs pour les paramètres suivants (tapez Entrée pour accepter la valeur par défaut, lorsque celle-ci est indiquée entre crochets)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Chemin racine sélectionné : %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Saisissez le répertoire racine de la documentation."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "racine de la documentation."
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Erreur : un fichier conf.py a été trouvé dans le répertoire racine."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart n'écrasera pas un projet Sphinx existant."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Merci de saisir un nouveau répertoire racine (ou tapez juste Entrée)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Vous avez deux options pour l'emplacement du répertoire de construction de la sortie de Sphinx.\nSoit vous utilisez un répertoire \"_build\" dans le chemin racine, soit vous séparez les répertoires \"source\" et \"build\" dans le chemin racine."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Séparer les répertoires source et de sortie (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "Dans le répertoire racine, deux autres répertoires seront créés : \"_templates\" pour les modèles HTML personnalisés et \"_static\" pour les feuilles de style personnalisées et autres fichiers statiques. Vous pouvez entrer un autre préfixe (p. ex. \".\") pour remplacer le tiret bas (\"_\")."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Préfixe de nom pour les répertoires static et de gabarits (templates)"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "Le nom du projet apparaîtra à plusieurs endroits dans la documentation construite."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Nom du projet"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Nom(s) de(s) l'auteur(s)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx a la notion de « version » et de « release » pour le\nlogiciel. Chaque version peut avoir plusieurs « releases ». Par exemple, pour\nPython, la version est quelque chose comme 2.5 ou 3.0, tandis que la « release » est\nquelque chose comme 2.5.1 ou 3.0a1. Si vous n'avez pas besoin de cette double structure,\nmettez simplement la même valeur aux deux."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Version du projet"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Version du projet"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "Si les documents doivent être rédigés dans une langue autre que l’anglais, vous pouvez sélectionner une langue ici grâce à son identifiant. Sphinx utilisera ensuite cette langue pour traduire les textes que lui-même génère.\n\nPour une liste des identifiants supportés, voir\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Langue du projet"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "L'extension de fichier pour les fichiers sources. En général : \".txt\" ou \".rst\". Seuls les fichiers avec cette extension sont considérés."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Extension des fichiers sources"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "Un document est particulier en ce sens qu'il est considéré comme le nœud supérieur de \"l'arbre des contenus\", c'est-à-dire la racine de la structure hiérarchique des documents. Normalement, il s'agit d'un \"index\", mais si votre \"index\" est un modèle personnalisé, vous pouvez également le définir sous un autre nom de fichier."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Non du fichier principal (sans extension)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Erreur : le fichier principal %s est déjà présent dans le répertoire racine du projet."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart n'écrasera pas les fichiers existants."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Merci de saisir un nouveau nom de fichier, ou de renommer le fichier existant et valider avec Entrée"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Indiquer lesquelles de ces extensions Sphinx doivent être activées :"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Note : imgmath et mathjax ne peuvent pas être activés en même temps. imgmath a été désactivé."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Un fichier Makefile et un fichier de commandes Windows peuvent être générés pour vous, afin que vous puissiez exécuter par exemple `make html' au lieu d'appeler directement sphinx-build."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Création du Makefile ? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Création du fichier de commandes Windows ? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Fichier en cours de création %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Le fichier %s existe déjà, il ne sera pas remplacé"
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Terminé : la structure initiale a été créée."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Vous devez maintenant compléter votre fichier principal %s et créer d'autres fichiers sources de documentation. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Utilisez le Makefile pour construire la documentation comme ceci :\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Utilisez sphinx-build pour construire la documentation comme ceci : \n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "où « builder » est l'un des constructeurs disponibles, tel que html, latex, ou linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nEngendre les fichiers requis pour un projet Sphinx.\n\nsphinx-quickstart est un outil interactif qui pose des questions à propos de votre projet et génère un répertoire avec la structure complète nécessaire ainsi qu'un Makefile qui peut être utilisé comme alternative à sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "mode silencieux"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "racine du projet"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Options de structure"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "si spécifié, les répertoires source et build seront séparés"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "si spécifié, créé le dossier build dans le dossier source"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "remplace le point dans _templates etc."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Options basiques du projet."
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "nom du projet"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "nom de l'auteur"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "version du projet"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "version du projet"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "langue du document"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "préfixe des fichiers source"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "nom du document principal"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "utilisé epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Options d'extension"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "autoriser l'extension %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "active l'emploi d'extensions quelconques"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Création des fichiers Batchfile et Makefile"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "créer un fichier makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "ne pas créer un fichier makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "créer un fichier batch"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "ne pas créer un fichier batch"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "utiliser make-mode pour Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "ne pas utiliser make-mode pour Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Gabarits de projet"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "répertoire des templates"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "définissez une variable de template"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "vous avez spécifiez \"quit\" , mais \"project\" ou \"author\" ne sont pas spécifiés."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Erreur : le chemin spécifié n'est pas un répertoire, ou les fichiers Sphinx existent déjà."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart peut générer ces fichiers seulement dans un répertoire vide. Merci de spécifier un nouveau répertoire racine."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Variable de template invalide : %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "les espaces non blancs sont supprimés par dedent"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Légende invalide: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "le numéro de ligne spécifiée est en dehors des limites (1-%d):%r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Impossible d'utiliser les options \"%s\" et \"%s\" en même temps."
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Le fichier d'include %r est introuvable ou sa lecture a échouée."
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "L’encodage %r utilisé pour lire le fichier inclus %r semble erroné, veuillez ajouter une option :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "L'objet nommé %r est introuvable dans le fichier d'include %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "On ne peut pas utiliser \"lineno-match\" avec un \"lines\" non contigu "
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Spécification de lignes %r : aucune ligne extraite du fichier inclus %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "le motif global toctree %r ne correspond à aucun document"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "le toctree contient une référence à des documents exclus %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "la table des matières contient des références à des documents inexistants %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "entrée dupliquée trouvée dans toctree: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Auteur de la section : "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Auteur du module : "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Auteur du code : "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Auteur : "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr "... le contenu de acks n'est pas une liste"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr "... le contenu de hlist n'est pas une liste"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "L'option \":file :\" de la directive csv-table reconnaît désormais un chemin absolu comme un chemin relatif du répertoire source. Veuillez mettre à jour votre document."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "Déclaration C dupliquée, également définie à %s:%s.\nLa déclaration est '.. c:%s:: %s'."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Paramètres"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "Valeurs retournées"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Renvoie"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Type renvoyé"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "membre"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variable"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "fonction"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "structure"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "union"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "énumération"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "énumérateur"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "type"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "paramètre de fonction"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nouveau dans la version %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Modifié dans la version %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsolète depuis la version %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "citation dupliquée %s, une autre instance dans %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "La citation [%s] n'est pas référencée"
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "Déclaration C++ dupliquée, également définie à %s:%s.\nLa déclaration est '.. cpp:%s:: %s'."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Paramètres du modèle"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Déclenche"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "classe"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "concept"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "paramètre du modèle"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (fonction de base)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (méthode %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variable globale ou constante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (attribut %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Arguments"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "méthode"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "données"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "module"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "description de %s dupliquée pour%s; l'autre %s se trouve dans %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "Libellé dupliqué pour l'équation %s, autre instance dans %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "math_eqref_format invalide : %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variables"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Lève"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (dans le module %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (dans le module %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variable de base)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe de base)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe dans %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (méthode de la classe %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (méthode statique %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (propriété %s)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Index des modules Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Obsolète"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "exception"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "méthode de classe"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "méthode statique"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "propriété"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "plusieurs cibles trouvées pour le renvoi %r : %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (obsolète)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directive)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (option de directive)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (role)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "directive"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "option de directive"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "role"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "description dupliquée pour %s %s; l'autre instance se trouve dans %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "variable d'environnement; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "description de l'option malformée, elle doit ressembler à \nMalformed option description %r, should look like \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" or \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "option de ligne de commande %s"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "option de ligne de commande"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "le terme du glossaire doit être précédé d'une ligne vide"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "les termes du glossaire ne doivent pas être séparés par des lignes vides"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "le glossaire semble être mal formaté; vérifiez l'indentation"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "terme du glossaire"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "élément de grammaire"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "étiquette de référence"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "variable d'environnement"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "option du programme"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "document"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Index du module"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Page de recherche"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "libellé dupliqué %s, l'autre instance se trouve dans %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "description %s dupliquée pour %s; l'autre instance se trouve dans %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "le paramètre numfig est désactivé : le paramètre :numref: est ignoré"
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "Impossible de créer une référence croisée. Aucun nombre n'est attribué: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "le lien n'a pas de légende : %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "numfig_format invalide : %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "numfig_format invalide : %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "label non défini: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "Échec de création d'une référence. Ni titre ni légende trouvé : %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "nouvelle configuration"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "la configuration a changé"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "les extensions ont changé"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "version non à jour de l’environnement de construction"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "le répertoire racine a changé"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Cet environnement est incompatible avec le constructeur sélectionné, veuillez choisir un autre répertoire doctree."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Échec du scan des documents dans %s : %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "le domaine %r n'est pas enregistré."
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "Le document n'est inclus dans aucune toctree."
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "une table des matières auto-référencée a été trouvée. Elle sera ignorée."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "voir %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "voir aussi %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "type d'index saisie inconnu %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symboles"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "table des matières avec une référence circulaire détectée, elle sera ignorée : %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "la table des matières contient une référence à un document %r qui n'a pas de titre : aucun lien ne sera généré"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "toctree contient une référence au document non inclu %r"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "fichier image %s illisible "
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "fichier image %s illisible : %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "le fichier téléchargé n’est pas lisible: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s a déjà des numéros de section attribués (toctree numérotés emboîtés ?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "Créerait le fichier %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nCherche récursivement dans <MODULE_PATH> des modules et packages Python et crée\ndans <OUTPUT_PATH> un fichier reST par package avec des directives automodule.\n\nLes <EXCLUDE_PATTERN>s peuvent être tout pattern de fichiers et/ou de répertoires à exclure.\n\nNote : par défaut ce script n'écrasera pas des fichiers déjà créés."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "chemin vers le module à documenter"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "patterns de fichier fnmatch-style et/ou répertoire à exclure"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "répertoire où placer toutes les sorties"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "Nombre maximum de sous-modules visibles dans la table des matières (par défaut : 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "remplacer les fichiers existants"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "suivre les liens symboliques. Très utile en combinaison avec collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "exécuter le script sans créer les fichiers"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "afficher la documentation de chaque module sur sa propre page"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "inclure le module \"_private\""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "nom du fichier de table des matières (défaut : modules)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "ne pas créer de fichier de table des matières"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "ne pas créer de titres pour le module ou package (e.g. lorsque les doctrings en fournissent déjà)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "mettre la documentation du module avant celle du sous-module"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "interprète les chemins de module selon la spécification PEP-0420 des espaces implicites de noms"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "extension du fichier (par défaut : rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "générer un projet complet avec sphinx-quickstart"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "ajoute module_path à la fin de sys.path, utilisé lorsque --full est présent"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "nom du projet (par défaut : nom du module principal)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "auteur(s) du projet, utilisé quand l'option -full est précisée"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "version du projet, utilisé quand l'option -full est précisée"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "révision du projet, utilisé lorsque --full est présent, par défaut reprend --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "options relatives aux extensions"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s n'est pas un répertoire"
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "la section \"%s\" est étiquettée \"%s\""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "regex invalide %r dans %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Vérification du taux de couverture documentaire dans les sources achevée, voir les résultats dans %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "regex invalide %r dans coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "API C non documentée : %s [%s] dans le fichier %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "le module %s ne pas être importé : %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "fonction python non documentée: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "classe python non documentée: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "méthode python non documentée: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "option '+' ou '-' manquante dans %s."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' n'est pas une option valide."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "%s n'est pas une option pyversion valide"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "type invalide de TestCode"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Exécution des doctests des sources achevée, voir les résultats dans %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "pas de code ou sortie dans le bloc %s en %s : %s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "code doctest invalide sera ignoré : %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== durées de lecture les plus lentes ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "le lien %r codé en dur pourrait être remplacé par un extlink (essayez d'utiliser %r à la place)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "La directive Graphviz ne peut pas avoir simultanément du contenu et un argument de nom de fichier"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Fichier externe Graphviz %r non trouvé ou échec de sa lecture"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Directive « graphviz » sans contenu ignorée."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "la commande dot %r ne peut pas être exécutée (nécessaire pour le rendu graphviz). Vérifiez le paramètre graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot a terminé avec une erreur :\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot n'a pas produit de fichier de sortie : \n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format doit être « png » ou « svg », mais est %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "dot code %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graphe: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graphe]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "Impossible d’exécuter la commande de conversion d'image %r. 'sphinx.ext.imgconverter' nécessite par défaut ImageMagick. Assurez-vous que ce dernier est installé, ou configurez l’option 'image_converter' pour faire référence à une commande de conversion ad hoc.\n\nTrace d’appels : %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "convert a terminé avec une erreur :\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "la commande convert %r ne peut pas être exécutée; vérifiez le paramètre image_converter"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "La commande LaTeX %r (nécessaire pour le rendu des équations mathématiques), ne peut pas être exécutée, vérifier le paramètre imgmath_latex"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "La commande de %s, %r, ne pas être exécuté (nécessaire pour display mathématique), vérifier la configuration imgmath_%s"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "latex de type display %r : %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "latex en ligne %r : %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "l’inventaire intersphinx a bougé : %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "chargement de l'inventaire intersphinx de %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "quelques problèmes ont été rencontrés avec quelques uns des inventaires, mais ils disposaient d'alternatives fonctionnelles :"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "échec d'accès à un quelconque inventaire, messages de contexte suivants :"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(disponible dans %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(dans %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "inventaire pour la référence croisée externe non trouvé : %s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "rôle pour la référence croisée externe non trouvé : %s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "%sexterne :%s cible de référence non trouvée : %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "l’identifiant intersphinx %r n'est pas une chaîne. Il sera ignoré"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "Échec de la lecture de intersphinx_mapping[%s]; ignoré : %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[source]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "À faire"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "Entrée TODO trouvée : %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<entrée originale>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(l'<<entrée originale>> se trouve dans %s, à la ligne %d)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "entrée originale"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "Coloration syntaxique du code du module..."
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Code du module"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Code source de %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Vue d'ensemble : code du module"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Modules pour lesquels le code est disponible</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "valeur invalide pour l'option member-order : %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "valeur invalide pour l'option class-doc-from : %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "signature invalide pour auto%s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "erreur pendant la mise en forme de l'argument %s:%s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc : n'a pas réussi à déterminer %s.%s (%r) devait être documenté, l'exception suivante a été levée :\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "module à importer pour auto-documenter %r est inconnu (essayer de placer une directive \"module\" ou \"currentmodule\" dans le document, ou de donner un nom de module explicite)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "Un faux objet a été détecté : %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "erreur lors du formatage de la signature pour %s : %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" dans le nom d'automodule n'a pas de sens"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "arguments de signature ou annotation de return donnés pour l’automodule %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ devrait être une liste de chaînes, pas %r (dans module %s) -- __all__ sera ignoré"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "attribut manquant mentionné dans l'option :members: : module %s, attribut %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "Échec pour obtenir la signature de la fonction pour %s : %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "Échec pour obtenir la signature du constructeur pour %s : %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Bases : %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "attribut manquant %s dans l'objet %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "alias de %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "alias de TypeVar(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "Échec pour obtenir la signature de la méthode pour %s : %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "Invalide __slots__ trouvé sur %s. Ignoré."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "Impossible d'analyser une valeur d'argument par défaut pour %r : %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "Échec de la mise à jour de la signature pour %r : paramètre non trouvé : %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "Échec de l'analyse de type_comment pour %r : %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "autosummary fait référence au document exclu %r. Ignoré"
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary : fichier stub non trouvé %r. Vérifiez votre paramètre autosummary_generate."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "Un résumé automatique sous-titré nécessite l'option :toctree:. Ignoré."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "autosummary : échec de l'importation de %s.\nIndications possibles :\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "échec de l’analyse du nom %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "échec d’importation de l'object %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate : fichier nontrouvé : %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary engendre les fichiers .rst de manière interne. Mais votre source_suffix ne contient pas .rst. Ignoré."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary : impossible de déterminer si %r est documenté; l'exception suivante a été levée :\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] engendrement d’un auto-sommaire pour : %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] écriture dans %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary] échec de l'importation de %s.\nIndications possibles :\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nEngendre du ReStructuredText par les directives autosummary.\n\nsphinx-autogen est une interface à sphinx.ext.autosummary.generate. Il\nengendre les fichiers reStructuredText à partir des directives autosummary\ncontenues dans les fichiers donnés en entrée.\n\nLe format de la directive autosummary est documentée dans le module\nPython \"sphinx.ext.autosummary\" et peut être lu via : ::\n\npydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "fichiers sources pour lesquels il faut produire des fichiers rST"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "répertoire où placer toutes les sorties"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "extension par défaut pour les fichiers (par défaut : %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "répertoire des templates spécifiques (par défaut : %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "membres importés du document (défaut : %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "documenter exactement les membres dans l'attribut __all__ du module. (par défaut : %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Arguments de mots-clés"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Exemple"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Exemples"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Notes"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Autres paramètres"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "Reçoit"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Références"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Avertissements"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Yields"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "ensemble invalide de valeurs (accolade fermante manquante) : %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "ensemble invalide de valeurs (accolade ouvrante manquante) :%s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "chaîne littérale malformée (guillemet fermant manquant) : %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "chaîne littérale malformée (guillemet ouvrant manquant) : %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Attention"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Prudence"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Danger"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Erreur"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Indication"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Important"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Note"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Voir aussi"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Astuce"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Avertissement"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "suite de la page précédente"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "suite sur la page suivante"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "Non alphabétique"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Chiffres"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "page"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Table des matières"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Recherche"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Montrer le code source"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Résumé"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Bienvenue ! Ceci est"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "la documentation pour"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "dernière modification"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Index et tables :"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Table des matières complète"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "lister l'ensemble des sections et sous-sections"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "rechercher dans cette documentation"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Index général des modules"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "accès rapide à l'ensemble des modules"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "toutes les fonctions, classes, termes"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Index complet sur une seule page"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indexer les pages par lettre"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "peut être énorme"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Recherchez dans %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "À propos de ces documents"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Mis à jour le %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "Créé en utilisant <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Rechercher %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Sujet précédent"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Chapitre précédent"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Sujet suivant"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "Chapitre suivant"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Veuillez activer le JavaScript pour que la recherche fonctionne."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Une recherche sur plusieurs mots ne retourne que les résultats contenant tous les mots."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "rechercher"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Résultats de la recherche"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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. Veuillez vérifier que les mots sont correctement orthographiés et que vous avez sélectionné assez de catégories."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Recherche rapide"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Cette page"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Changements dans la version %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Liste auto-générée des modifications dans la version %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Modifications de la bibliothèque"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Modifications de l'API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Autres modifications"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "Recherche terminée, ${resultCount} page(s) correspondant à la requête de recherche ont été trouvées."
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Recherche en cours"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Préparation de la recherche..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", dans "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Cacher les résultats de la recherche"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Réduire la barre latérale"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Agrandir la barre latérale"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Contenu"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "index trouvé avec style ancien à 4 colonnes. Possiblement un bogue d’extensions que vous utilisez : %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "La note de bas de page [%s] n'est pas référencée."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "La note de bas de page [#] n'est pas référencée."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "incohérences de références de notes de bas de page dans le message traduit. Original : {0}, traduit : {1} "
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "incohérences de références dans le message traduit. Original : {0}, traduit : {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "incohérences de références de citation dans le message traduit. Original : {0}, traduit : {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "incohérences de références de terme dans le message traduit. Original : {0}, traduit : {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "Impossible de déterminer le texte de remplacement pour le renvoi. Il peut s'agir d'un bogue."
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "plus d'une cible trouvée pour la référence %r de type 'any' : pourrait être %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s cible de référence non trouvée : %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r cible de référence non trouvée : %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "impossible d'atteindre l'image distante %s[%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "impossible d'atteindre l'image distante %s[%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Format d'image inconnu : %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "le caractère source est indécodable, il sera remplacé par \"?\" : %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "ignoré"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "échoué"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "Problème dans le domaine %s : le champ est censé utiliser le rôle '%s', mais ce rôle ne figure pas dans le domaine."
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "nom de rôle ou de directive inconnu: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "type de node inconnu : %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "erreur de lecture : %s,%s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "erreur d'écriture : %s,%s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Format de date invalide. Insérez la chaîne de caractères entre des guillemets simples si vous voulez l'afficher telle quelle : %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "la table des matières contient des références à des fichiers inexistants %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "exception pendant l’évaluation de l'expression de la directive only : %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "rôle par défaut %s introuvable"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format n'est pas défini %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Aucun ID assigné au node %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "impossible d'obtenir la taille de l'image. L'option :scale: est ignorée."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "toplevel_sectioning %r inconnu pour la classe %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: trop grand, ignoré."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "le titre du document n'est pas un unique node de type Text"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "le titre de node rencontré n'est apparenté à aucun parmi section, topic, table, admonition ou sidebar"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Notes de bas de page"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "options tabularcolumns et :widths: simultanément présentes. :widths: sera ignoré."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "%s est invalide comme unité de dimension. Ignoré."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "le type inconnu d’entrée d’index %s a été trouvé"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[image: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "la légende n'est pas à l'intérieur de la figure."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "type de node non-implémenté : %r"
diff --git a/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js b/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..8529eb2
--- /dev/null
+++ b/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "fr_FR",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo b/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..312f50f
--- /dev/null
+++ b/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po b/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..a24e259
--- /dev/null
+++ b/sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: French (France) (http://app.transifex.com/sphinx-doc/sphinx-1/language/fr_FR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: fr_FR\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/gl/LC_MESSAGES/sphinx.js b/sphinx/locale/gl/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..fc63ba3
--- /dev/null
+++ b/sphinx/locale/gl/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "gl",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/gl/LC_MESSAGES/sphinx.mo b/sphinx/locale/gl/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..aaa18b8
--- /dev/null
+++ b/sphinx/locale/gl/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/gl/LC_MESSAGES/sphinx.po b/sphinx/locale/gl/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..4f7f87f
--- /dev/null
+++ b/sphinx/locale/gl/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Miguel Anxo Bouzada <mbouzada@gmail.com>, 2023
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Miguel Anxo Bouzada <mbouzada@gmail.com>, 2023\n"
+"Language-Team: Galician (http://app.transifex.com/sphinx-doc/sphinx-1/language/gl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: gl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Non é posíbel atopar o directorio de orixe (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "O directorio de saída (%s) non é un directorio"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "O directorio de orixe e o directorio de destino non poden ser idénticos"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Executando Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Este proxecto necesita polo menos Sphinx v%s e, polo tanto, non se pode construír con esta versión."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "facendo o directorio de saída"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "ao configurar a extensión %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "«setup» tal como se define actualmente en conf.py non é un invocábel de Python. Modifique a súa definición para que sexa unha función invocábel. Isto é necesario para que conf.py se comporte como unha extensión Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "cargando traducións [%s]…"
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "feito"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "non dispoñíbel para mensaxes integradas"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "cargando ambiente en preparado (pickled)"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "produciuse un fallo: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Non se seleccionou ningún construtor, usando de xeito predeterminado: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "conseguido"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "rematou con problemas"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "compilación %s,%s advertencia (coas advertencias tratadas como erros)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "compilación %s,%s advertencias (coas advertencias tratadas como erros)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "compilación %s, %s advertencia."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "compilación %s, %s advertencias."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "compilación %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "a clase de nodo %r xa está rexistrada, os seus visitantes van ser substituídos"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "a directiva %r xa está rexistrada, vai ser substituída"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "o rol %r xa está rexistrado, vai ser substituído"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "a extensión %s non declara se é segura para a lectura en paralelo, asumindo que non o sexa; pídalle ao autor da extensión que o comprobe e que o faga explícito"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "a extensión %s non é segura para a lectura en paralelo"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr "Ligazón a esta definición"
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr "Ligazón a este termo"
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr "Ligazón a este título"
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr "Ligazón a esta táboa"
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr "Ligazón a este código"
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr "Ligazón a esta imaxe"
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr "Ligazón a esta árbore de índice"
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Notas a rodapé"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "indícanse tanto a opción «tabularcolumns» como «:widths:». Ignorase «:widths:»."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "a unidade de dimensión %s non é válida. Ignorado."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "atopouse o tipo descoñecido de entrada de índice %s"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[imaxe: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[imaxe]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "a lenda non se atopa nunha figura."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "tipo de nodo non implementado: %r"
diff --git a/sphinx/locale/he/LC_MESSAGES/sphinx.js b/sphinx/locale/he/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..cd02a75
--- /dev/null
+++ b/sphinx/locale/he/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "he",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "\u05e2\u05dc \u05de\u05e1\u05de\u05db\u05d9\u05dd \u05d0\u05dc\u05d5",
+ "Automatically generated list of changes in version %(version)s": "\u05d9\u05e6\u05e8 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea \u05e8\u05e9\u05d9\u05de\u05d4 \u05e9\u05dc \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05d1\u05d2\u05e8\u05e1\u05d4 %(version)s",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "\u05db\u05d5\u05d5\u05e5 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3",
+ "Complete Table of Contents": "\u05ea\u05d5\u05db\u05df \u05e2\u05e0\u05d9\u05d9\u05e0\u05d9\u05dd \u05de\u05dc\u05d0",
+ "Contents": "\u05ea\u05d5\u05db\u05df",
+ "Copyright": "\u05d6\u05db\u05d5\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "\u05d4\u05e8\u05d7\u05d1 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3",
+ "Full index on one page": "\u05d0\u05d9\u05e0\u05d3\u05e7\u05e1 \u05de\u05dc\u05d0 \u05d1\u05e2\u05de\u05d5\u05d3 \u05d0\u05d7\u05d3",
+ "General Index": "",
+ "Global Module Index": "\u05d0\u05d9\u05e0\u05d3\u05e7\u05e1 \u05de\u05d5\u05d3\u05d5\u05dc\u05d9\u05dd \u05d2\u05dc\u05d5\u05d1\u05dc\u05d9",
+ "Go": "\u05dc\u05da",
+ "Hide Search Matches": "\u05d4\u05e1\u05ea\u05e8 \u05ea\u05d5\u05e6\u05d0\u05d5\u05ea \u05d7\u05d9\u05e4\u05d5\u05e9",
+ "Index": "\u05d0\u05d9\u05e0\u05d3\u05e7\u05e1",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "\u05e2\u05de\u05d5\u05d3\u05d9 \u05d0\u05d9\u05e0\u05d3\u05e7\u05e1 \u05dc\u05e4\u05d9 \u05d0\u05d5\u05ea\u05d9\u05d5\u05ea",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "\u05e2\u05d5\u05d3\u05db\u05df \u05dc\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05d1 %(last_updated)s.",
+ "Library changes": "",
+ "Navigation": "\u05e0\u05d9\u05d5\u05d5\u05d8",
+ "Next topic": "\u05e0\u05d5\u05e9\u05d0 \u05d4\u05d1\u05d0",
+ "Other changes": "\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05d0\u05d7\u05e8\u05d9\u05dd",
+ "Overview": "\u05e1\u05e7\u05d9\u05e8\u05d4 \u05db\u05dc\u05dc\u05d9\u05ea",
+ "Please activate JavaScript to enable the search\n functionality.": "\u05d0\u05e0\u05d0 \u05d4\u05e4\u05e2\u05dc \u05d2'\u05d0\u05d5\u05d0\u05e1\u05e7\u05e8\u05d9\u05e4\u05d8 \u05e2\"\u05de \u05dc\u05d0\u05e4\u05e9\u05e8 \u05d0\u05ea\n \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9.",
+ "Preparing search...": "",
+ "Previous topic": "\u05e0\u05d5\u05e9\u05d0 \u05e7\u05d5\u05d3\u05dd",
+ "Quick search": "\u05d7\u05d9\u05e4\u05d5\u05e9 \u05de\u05d4\u05d9\u05e8",
+ "Search": "\u05d7\u05d9\u05e4\u05d5\u05e9",
+ "Search Page": "\u05d3\u05e3 \u05d7\u05d9\u05e4\u05d5\u05e9",
+ "Search Results": "\u05ea\u05d5\u05e6\u05d0\u05d5\u05ea \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "\u05d7\u05e4\u05e9 \u05d1\u05ea\u05d5\u05da %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u05d4\u05e6\u05d2 \u05de\u05e7\u05d5\u05e8",
+ "Table of Contents": "",
+ "This Page": "\u05e2\u05de\u05d5\u05d3 \u05d6\u05d4",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "\u05db\u05dc \u05d4\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea, \u05d4\u05de\u05d7\u05dc\u05e7\u05d5\u05ea, \u05d4\u05de\u05d5\u05e9\u05d2\u05d9\u05dd",
+ "can be huge": "\u05e2\u05e9\u05d5\u05d9 \u05dc\u05d4\u05d9\u05d5\u05ea \u05e2\u05e6\u05d5\u05dd",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "\u05e4\u05e8\u05e7 \u05d4\u05d1\u05d0",
+ "previous chapter": "\u05e4\u05e8\u05e7 \u05e7\u05d5\u05d3\u05dd",
+ "quick access to all modules": "\u05d2\u05d9\u05e9\u05d4 \u05de\u05d4\u05d9\u05e8\u05d4 \u05dc\u05db\u05dc \u05d4\u05de\u05d5\u05d3\u05d5\u05dc\u05d9\u05dd",
+ "search": "\u05d7\u05d9\u05e4\u05d5\u05e9",
+ "search this documentation": "\u05d7\u05e4\u05e9 \u05d1\u05ea\u05d9\u05e2\u05d5\u05d3 \u05d6\u05d4",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3"
+}); \ No newline at end of file
diff --git a/sphinx/locale/he/LC_MESSAGES/sphinx.mo b/sphinx/locale/he/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..cb6c4a9
--- /dev/null
+++ b/sphinx/locale/he/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/he/LC_MESSAGES/sphinx.po b/sphinx/locale/he/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..fe07947
--- /dev/null
+++ b/sphinx/locale/he/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FIRST AUTHOR <EMAIL@ADDRESS>, 2011\n"
+"Language-Team: Hebrew (http://app.transifex.com/sphinx-doc/sphinx-1/language/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: he\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "רמת המודול"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(בתוך"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "×ינדקס"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "הב×"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "הקוד×"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "תיעוד %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "×ינדקס"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "מהדורה"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "מחבר הקטע:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "מחבר המודול:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "מחבר הקוד:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "מחבר:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "פרמטרי×"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "משתנה"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "פונקציה"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "מ×קרו"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "חדש בגרסה %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "השתנה בגרסה %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr " ×œ× ×ž×•×ž×œ×¥ לשימוש מגרסה %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "מחלקה"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "מודול"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "משתני×"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "משתנה סביבה; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "משתנה סביבה"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "מודול ×ינדקס"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "דף חיפוש"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "ר××” %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "ר××” ×’× %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[מקור]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "לעשות"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "הטקסט המקורי"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[תיעוד]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>הר××” קוד מקור ל %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>כל ×”×ž×•×“×•×œ×™× ×©×™×© ×œ×”× ×§×•×“ זמין</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "תשומת לב"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "זהירות"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "סכנה"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "שגי××”"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "רמז"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "חשוב"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "הערה"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "ר××” ×’×"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "טיפ"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "×זהרה"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "המשך מעמוד קוד×"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "חיפוש"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "לך"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "הצג מקור"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "סקירה כללית"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ניווט"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "חפש בתוך %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "על ×ž×¡×ž×›×™× ×לו"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "זכויות שמורות"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "עודכן ל×חרונה ב %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "חפש %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "× ×•×©× ×§×•×“×"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "פרק קוד×"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "× ×•×©× ×”×‘×"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "פרק הב×"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "×× × ×”×¤×¢×œ ×’'×ו×סקריפט ×¢\"מ ל×פשר ×ת\n החיפוש."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "חיפוש"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "תוצ×ות החיפוש"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "חיפוש מהיר"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(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 ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "×©×™× ×•×™×™× ×חרי×"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "הסתר תוצ×ות חיפוש"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "כווץ סרגל צד"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "הרחב סרגל צד"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "תוכן"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "הערות שוליי×"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[תמונה]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/hi/LC_MESSAGES/sphinx.js b/sphinx/locale/hi/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..4c6e562
--- /dev/null
+++ b/sphinx/locale/hi/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "hi",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", \u092e\u0947\u0902 ",
+ "About these documents": "\u0907\u0928 \u0932\u0947\u0916\u092a\u0924\u094d\u0930\u094b\u0902 \u0915\u0947 \u092c\u093e\u0930\u0947 \u092e\u0947\u0902",
+ "Automatically generated list of changes in version %(version)s": "\u0938\u0902\u0938\u094d\u0915\u0930\u0923 %(version)s \u092e\u0947\u0902 \u0938\u094d\u0935\u0924\u0903 \u0930\u091a\u093f\u0924 \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928\u094b\u0902 \u0915\u0940 \u0938\u0942\u091a\u0940",
+ "C API changes": "\u0938\u0940 \u0910.\u092a\u0940.\u0906\u0908. \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u092a\u0930\u093f\u0935\u0930\u094d\u0924\u093f\u0924 \u0938\u0902\u0938\u094d\u0915\u0930\u0923 %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "\u0915\u093f\u0928\u093e\u0930\u0947 \u0915\u093e \u0938\u094d\u0925\u093e\u0928 \u0918\u091f\u093e\u090f\u0902",
+ "Complete Table of Contents": "\u0935\u093f\u0938\u094d\u0924\u0943\u0924 \u0935\u093f\u0937\u092f-\u0938\u0942\u091a\u0940",
+ "Contents": "\u0935\u093f\u0937\u092f \u0938\u093e\u092e\u093f\u0917\u094d\u0930\u0940",
+ "Copyright": "\u0938\u0930\u094d\u0935\u093e\u0927\u093f\u0915\u093e\u0930",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "\u0915\u093f\u0928\u093e\u0930\u0947 \u0915\u093e \u0938\u094d\u0925\u093e\u0928 \u092c\u095d\u093e\u090f\u0902",
+ "Full index on one page": "\u090f\u0915 \u092a\u0943\u0937\u094d\u0920 \u092a\u0930 \u092a\u0942\u0930\u0940 \u0905\u0928\u0941\u0915\u094d\u0930\u092e\u0923\u093f\u0915\u093e",
+ "General Index": "\u0938\u093e\u092e\u093e\u0928\u094d\u092f \u0905\u0928\u0941\u0915\u094d\u0930\u092e\u093e\u0923\u093f\u0915\u093e",
+ "Global Module Index": "\u0938\u093e\u0930\u094d\u0935\u092d\u094c\u092e\u093f\u0915 \u092a\u094d\u0930\u092d\u093e\u0917 \u0938\u0942\u091a\u0940",
+ "Go": "\u091a\u0932\u093f\u090f",
+ "Hide Search Matches": "\u0916\u094b\u091c\u0947 \u0917\u090f \u091c\u094b\u095c\u0947 \u091b\u093f\u092a\u093e\u090f\u0902",
+ "Index": "\u0905\u0928\u0941\u0915\u094d\u0930\u092e\u0923\u093f\u0915\u093e",
+ "Index &ndash; %(key)s": "\u0905\u0928\u0941\u0915\u094d\u0930\u092e\u0923\u093f\u0915\u093e &ndash; %(key)s",
+ "Index pages by letter": "\u0905\u0915\u094d\u0937\u0930 \u0926\u094d\u0935\u093e\u0930\u093e \u0905\u0928\u0941\u0915\u094d\u0930\u092e\u093f\u0924 \u092a\u0943\u0937\u094d\u0920",
+ "Indices and tables:": "\u0938\u0942\u091a\u093f\u092f\u093e\u0901 \u0914\u0930 \u0938\u093e\u0930\u0923\u093f\u092f\u093e\u0901:",
+ "Last updated on %(last_updated)s.": "\u0905\u0902\u0924\u093f\u092e \u092c\u093e\u0930 \u0938\u092e\u094d\u092a\u093e\u0926\u093f\u0924 %(last_updated)s.",
+ "Library changes": "\u092a\u0941\u0938\u094d\u0924\u0915\u093e\u0932\u092f \u092e\u0947\u0902 \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928",
+ "Navigation": "\u0938\u0902\u091a\u093e\u0932\u0928",
+ "Next topic": "\u0905\u0917\u0932\u093e \u092a\u094d\u0930\u0915\u0930\u0923",
+ "Other changes": "\u0905\u0928\u094d\u092f \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928",
+ "Overview": "\u0938\u093f\u0902\u0939\u093e\u0935\u0932\u094b\u0915\u0928",
+ "Please activate JavaScript to enable the search\n functionality.": "\u0916\u094b\u091c \u0915\u093e\u0930\u094d\u092f \u0915\u0947 \u0932\u093f\u090f \u091c\u093e\u0935\u093e \u0938\u094d\u0915\u094d\u0930\u093f\u092a\u094d\u091f \u0915\u093e \u0939\u094b\u0928\u093e \u0906\u0935\u0936\u094d\u092f\u0915 \u0939\u0948. \u0915\u0943\u092a\u092f\u093e \u091c\u093e\u0935\u093e \u0938\u094d\u0915\u094d\u0930\u093f\u092a\u094d\u091f \u0915\u094b \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902.",
+ "Preparing search...": "\u0916\u094b\u091c \u0915\u0940 \u0924\u0948\u092f\u093e\u0930\u0940",
+ "Previous topic": "\u092a\u093f\u091b\u0932\u093e \u092a\u094d\u0930\u0915\u0930\u0923",
+ "Quick search": "\u0924\u094d\u0935\u0930\u093f\u0924 \u0916\u094b\u091c",
+ "Search": "\u0916\u094b\u091c",
+ "Search Page": "\u0916\u094b\u091c \u092a\u0943\u0937\u094d\u0920",
+ "Search Results": "\u0916\u094b\u091c \u092a\u0930\u0940\u0923\u093e\u092e ",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "%(docstitle)s \u092e\u0947\u0902 \u0916\u094b\u091c\u0947\u0902",
+ "Searching": "\u0916\u094b\u091c \u091c\u093e\u0930\u0940",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u0938\u094d\u0930\u094b\u0924 \u0926\u093f\u0916\u093e\u090f\u0901",
+ "Table of Contents": "\u0935\u093f\u0937\u092f-\u0938\u0942\u091a\u0940",
+ "This Page": "\u092f\u0939 \u092a\u0943\u0937\u094d\u0920 ",
+ "Welcome! This is": "\u0928\u092e\u0938\u094d\u0924\u0947! \u092f\u0939 \u0939\u0948",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u0906\u092a\u0915\u0947 \u0916\u094b\u091c \u092a\u0930\u093f\u0923\u093e\u092e\u094b\u0902 \u092e\u0947\u0902 \u0915\u094b\u0908 \u092a\u094d\u0930\u0932\u0947\u0916 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932\u093e. \u0915\u0943\u092a\u092f\u093e \u0938\u0941\u0928\u093f\u0936\u094d\u091a\u093f\u0924 \u0915\u0930\u0947\u0902 \u0915\u093f \u0938\u092d\u0940 \u0936\u092c\u094d\u0926\u094b\u0902 \u0915\u0940 \u0935\u0930\u094d\u0924\u0928\u0940 \u0936\u0941\u0926\u094d\u0927 \u0939\u0948 \u0914\u0930 \u0906\u092a\u0928\u0947 \u092f\u0925\u0947\u0937\u094d\u091f \u0936\u094d\u0930\u0947\u0923\u093f\u092f\u093e\u0902 \u091a\u0941\u0928\u0940 \u0939\u0948\u0902.",
+ "all functions, classes, terms": "\u0938\u092d\u0940 \u0915\u093e\u0930\u094d\u092f\u092f\u0941\u0915\u094d\u0924\u093f\u092f\u093e\u0902, \u0935\u0930\u094d\u0917, \u0936\u092c\u094d\u0926",
+ "can be huge": "\u092c\u0943\u0939\u0926\u093e\u0915\u093e\u0930 \u0939\u094b \u0938\u0915\u0924\u093e \u0939\u0948",
+ "last updated": "\u0905\u0902\u0924\u093f\u092e \u092a\u0930\u093f\u0935\u0930\u094d\u0927\u0928",
+ "lists all sections and subsections": "\u0938\u092d\u0940 \u0905\u0928\u0941\u092d\u093e\u0917\u094b\u0902 \u090f\u0935\u0902 \u0909\u092a-\u0905\u0928\u0941\u092d\u093e\u0917\u094b\u0902 \u0915\u0940 \u0938\u0942\u091a\u0940",
+ "next chapter": "\u0905\u0917\u0932\u093e \u0905\u0927\u094d\u092f\u093e\u092f",
+ "previous chapter": "\u092a\u093f\u091b\u0932\u093e \u0905\u0927\u094d\u092f\u093e\u092f",
+ "quick access to all modules": "\u0938\u092d\u0940 \u092a\u094d\u0930\u092d\u093e\u0917 \u0924\u0915 \u0924\u0941\u0930\u0902\u0924 \u092a\u0939\u0941\u0901\u091a",
+ "search": "\u0916\u094b\u091c",
+ "search this documentation": "\u0907\u0938 \u0906\u0932\u0947\u0916 \u092e\u0947\u0902 \u0916\u094b\u091c\u0947\u0902",
+ "the documentation for": "\u0906\u0932\u0947\u0916 \u0935\u093f\u0937\u092f"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/hi/LC_MESSAGES/sphinx.mo b/sphinx/locale/hi/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..3a2983a
--- /dev/null
+++ b/sphinx/locale/hi/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/hi/LC_MESSAGES/sphinx.po b/sphinx/locale/hi/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..60d6bb0
--- /dev/null
+++ b/sphinx/locale/hi/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3698 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Ajay Singh <ajaysajay@gmail.com>, 2019
+# Purnank H. Ghumalia <me@purnank.in>, 2015-2016
+# Sumanjali Damarla <damarlasumanjali@gmail.com>, 2020
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Sumanjali Damarla <damarlasumanjali@gmail.com>, 2020\n"
+"Language-Team: Hindi (http://app.transifex.com/sphinx-doc/sphinx-1/language/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "सà¥à¤°à¥‹à¤¤ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ (%s) नहीं मिली"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "सà¥à¤°à¥‹à¤¤ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ और गंतवà¥à¤¯ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ समरूप नहीं हो सकतीं"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "सà¥à¤«à¤¿à¤‚कà¥à¤¸ %s संसà¥à¤•à¤°à¤£ चल रहा है"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "इस परियोजना में सà¥à¤«à¤¿à¤‚कà¥à¤¸ का कम से कम %s संसà¥à¤•à¤°à¤£ चाहिठऔर इसलिठइस संसà¥à¤•à¤°à¤£ से बनाना संभव नहीं है."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "परिणाम निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ बनाई जा रही है"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "%s आयाम को सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करते हà¥à¤:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'सà¥à¤¥à¤¾à¤ªà¤¨à¤¾' को जैसा कि अभी कोनà¥à¥ž.पाई में परिभाषित किया गया है, पाइथन से निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ नहीं है. कृपया इसकी परिभाषा में परिवरà¥à¤¤à¤¨ करके इसे निरà¥à¤¦à¥‡à¤¶ योगà¥à¤¯ करà¥à¤® बनाà¤à¤‚. कोनà¥à¥ž.पाई को सà¥à¤«à¤¿à¤‚कà¥à¤¸ के आयाम की तरह वà¥à¤¯à¤µà¤¹à¤¾à¤° के लिठइसकी आवशà¥à¤•à¤¯à¤¤à¤¾ है."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "[%s] अनà¥à¤µà¤¾à¤¦ पà¥à¤¾ जा रहा है..."
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "संपनà¥à¤¨"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "अंतरà¥à¤¨à¤¿à¤°à¥à¤®à¤¿à¤¤ संदेशों में उपलबà¥à¤§ नहीं है"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "रकà¥à¤·à¤¿à¤¤ सà¥à¤¥à¤¿à¤¤à¤¿ को लागू किया जा रहा है"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "असफल: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "किसी निरà¥à¤®à¤¾à¤¤à¤¾ को नहीं चà¥à¤¨à¤¾ गया, मानक उपयोग: à¤à¤šà¥.टी.à¤à¤®.à¤à¤²."
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "सफल हà¥à¤†"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "समसà¥à¤¯à¤¾à¤“ं के साथ समापà¥à¤¤ हà¥à¤†"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "%s निरà¥à¤®à¤¾à¤£, चेतावनी %s (चेतावनी को गलती माने)| "
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "%s समà¥à¤ªà¥‚रà¥à¤£, %s चेतावनी."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "%s निरà¥à¤®à¤¿à¤¤."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "निरà¥à¤¦à¥‡à¤¶à¤• ककà¥à¤·à¤¾ #node class# %r पहले से पंजीकृत है, इसके अभà¥à¤¯à¤¾à¤—त निरसà¥à¤¤ हो जाà¤à¤‚गे "
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "निरà¥à¤¦à¥‡à¤¶ %r पहले से पंजीकृत है, यह निरसà¥à¤¤ हो जाà¤à¤—ा"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "भूमिका %r पहले से पंजीकृत है, यह निरसà¥à¤¤ हो जाà¤à¤—ी"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s आयाम यह घोषित नहीं करता कि यह समानांतर पाठन के लिठसà¥à¤°à¤•à¥à¤·à¤¿à¤¤ है. यह मानते हà¥à¤ की à¤à¤¸à¤¾ नहीं है - कृपया आयाम के लेखक को जांच करने और सà¥à¤ªà¤·à¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤ करने के लिठकहें."
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "समानांतर पठन के लिठयह %s विसà¥à¤¤à¤¾à¤° अथवा आयाम सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ नहीं है | "
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s आयाम यह घोषित नहीं करता कि यह समानांतर लेखन के लिठसà¥à¤°à¤•à¥à¤·à¤¿à¤¤ है. यह मानते हà¥à¤ की à¤à¤¸à¤¾ नहीं है - कृपया आयाम के लेखक को जांच करने और सà¥à¤ªà¤·à¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤ करने के लिठकहें."
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "समानांतर लेखन के लिठ%s विसà¥à¤¤à¤¾à¤° अथवा आयाम सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ नहीं है | "
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "%s पर काम कर रहे हैं"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "विनà¥à¤¯à¤¾à¤¸ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में कोनà¥à¥ž.पाय #conf.py# फाइल (%s) नहीं है "
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "शबà¥à¤¦à¤•à¥‹à¤· विनà¥à¤¯à¤¾à¤¸ मान %r की उलà¥à¤²à¤‚घन नहीं किया जा सकता, अनदेखा किया गया (पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• अवयव का मान रखने के लिठ%r का उपयोग करें)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "विनà¥à¤¯à¤¾à¤¸ मान %r के लिठअमानà¥à¤¯ संखà¥à¤¯à¤¾ %r, अनदेखा किया गया"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "असमरà¥à¤¥à¤¿à¤¤ पà¥à¤°à¤•à¤¾à¤° के साथ विनà¥à¤¯à¤¾à¤¸ मान %r का उलà¥à¤²à¤‚घन नहीं किया जा सकता, अनदेखा किया गया"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "आरोहण में अजà¥à¤žà¤¾à¤¤ विनà¥à¤¯à¤¾à¤¸ मान %r, अनदेखा किया गया"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "à¤à¤¸à¤¾ कोई विनà¥à¤¯à¤¾à¤¸ मान नहीं है: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "विनà¥à¤¯à¤¾à¤¸ मान %r पहले से विदà¥à¤¯à¤®à¤¾à¤¨ है"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "आपकी विनà¥à¤¯à¤¾à¤¸ फाइल में रचनाकà¥à¤°à¤® की तà¥à¤°à¥à¤Ÿà¤¿ है: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "विनà¥à¤¯à¤¾à¤¸ फाइल (अथवा इसके दà¥à¤µà¤¾à¤°à¤¾ आयातित पà¥à¤°à¤­à¤¾à¤—ों) दà¥à¤µà¤¾à¤°à¤¾ sys.exit() का आहà¥à¤µà¤¾à¤¨ किया गया"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "विनà¥à¤¯à¤¾à¤¸ फाइल में पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® के योगà¥à¤¯ तà¥à¤°à¥à¤Ÿà¤¿ है:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "विनà¥à¤¯à¤¾à¤¸ मान `source_suffix' में अकà¥à¤·à¤°-समूह, अकà¥à¤·à¤°-समूहों की सूची, अथवा कोष की अनà¥à¤®à¤¤à¤¿ है. लेकिन `%r' दिया गया है."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "भाग %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "चितà¥à¤° %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "सारणी %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "सूची %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "`{name}` विनà¥à¤¯à¤¾à¤¸ मान, {candidates} में से à¤à¤• होना चाहिà¤, परनà¥à¤¤à¥ `{current}` दिया गया है."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "विनà¥à¤¯à¤¾à¤¸ मान `{name}' का पà¥à¤°à¤•à¤¾à¤° `{current.__name__}' है; अपेकà¥à¤·à¤¿à¤¤ {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "विनà¥à¤¯à¤¾à¤¸ मान `{name}' का पà¥à¤°à¤•à¤¾à¤° `{current.__name__}' है; मानक `{default.__name__}' का पà¥à¤°à¤¯à¥‹à¤— किया गया."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r नहीं मिला, अनदेखा किया गया."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "%r घटना पहले से विदà¥à¤¯à¤®à¤¾à¤¨ है"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "अजà¥à¤žà¤¾à¤¤ घटना नाम: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "आयाम %s की needs_extensions मान में आवशà¥à¤•à¤¤à¤¾ है, पर यह नहीं चà¥à¤¾à¤¯à¤¾ गया है."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "इस परियोजना में आयाम %s का कम से कम %s संसà¥à¤•à¤°à¤£ चाहिठइसलिठउपलबà¥à¤§ संसà¥à¤•à¤°à¤£ (%s) से बनाना संभव नहीं है."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "पिगमेंटस लेकà¥à¤¸à¤° नाम %r अजà¥à¤žà¤¾à¤¤ है"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "निरà¥à¤®à¤¾à¤£ वरà¥à¤— %s का कोई \"नाम\" भाव नहीं है"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "निरà¥à¤®à¤¾à¤¤à¤¾ %r पहले से (%s पà¥à¤°à¤­à¤¾à¤— में) उपलबà¥à¤§ है"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "निरà¥à¤®à¤¾à¤¤à¤¾ नाम %s पंजीकृत नहीं है अथवा पà¥à¤°à¤µà¥‡à¤¶ सà¥à¤¥à¤¾à¤¨ पर उपलबà¥à¤§ नहीं है."
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "निरà¥à¤®à¤¾à¤¤à¤¾ नाम %s पंजीकृत नहीं है"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "अधिकारकà¥à¤·à¥‡à¤¤à¥à¤° %s पहले से पंजीकृत है"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "अधिकारकà¥à¤·à¥‡à¤¤à¥à¤° %s अभी पंजीकृत नहीं है"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "%r निरà¥à¤¦à¥‡à¤¶ पहले से अधिकार-कà¥à¤·à¥‡à¤¤à¥à¤° %s में पंजीकृत है, "
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "%r भूमिका पहले से अधिकार-कà¥à¤·à¥‡à¤¤à¥à¤° %s में पंजीकृत है, "
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "%r अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾ पहले से अधिकार-कà¥à¤·à¥‡à¤¤à¥à¤° %s में पंजीकृत है"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "%r object_type पहले से पंजीकृत है"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "%r crossref_type पहले से पंजीकृत है"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r पहले से पंजीकृत है"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "%r का source_parser पहले से पंजीकृत है"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "%s का सà¥à¤°à¥‹à¤¤ वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾à¤¤à¤¾ पंजीकृत नहीं है"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "%r के लिठअनà¥à¤µà¤¾à¤¦à¤• पहले से विदà¥à¤¯à¤®à¤¾à¤¨ है"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "add_node() के kwargs à¤à¤• (visit, depart) फंकà¥à¤¶à¤¨ टपल #function tuple# होने चाहिà¤: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r पहले से पंजीकृत है"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "%r आयाम को %sसंसà¥à¤•à¤°à¤£ से सà¥à¤«à¤¿à¤‚कà¥à¤¸ में समà¥à¤®à¤¿à¤²à¤¿à¤¤ किया जा चà¥à¤•à¤¾ है; आयाम की उपेकà¥à¤·à¤¾ की गयी."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "मौलिक अपवाद:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "%s आयाम का आयात नहीं किया जा सका"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "आयाम %r में कोई सेटअप #setup()# कारक नहीं है; कà¥à¤¯à¤¾ यह वासà¥à¤¤à¤µ में सà¥à¤«à¤¿à¤‚कà¥à¤¸ का परिवरà¥à¤§à¤• पà¥à¤°à¤­à¤¾à¤— है?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "इस परियोजना में पà¥à¤°à¤¯à¥à¤•à¥à¤¤ %s परिवरà¥à¤§à¤• को सà¥à¤«à¤¿à¤‚कà¥à¤¸ का कम से कम %s संसà¥à¤•à¤°à¤£ चाहिà¤; इसलिठइस संसà¥à¤•à¤°à¤£ से बनाना संभव नहीं है."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "परिवरà¥à¤§à¤• %r के सेटअप() करà¥à¤® से à¤à¤• असहाय वसà¥à¤¤à¥ वापस मिली है; इसको 'कà¥à¤› नहीं' अथवा मेटाडाटा कोश भेजना चाहिठथा"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "पाइथन अभिवृदà¥à¤§à¤¿ पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µ; पी.ई.पी. %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "रà¥à¤ªà¤µà¤¿à¤¨à¥à¤¯à¤¾à¤¸ %r में कोई \"रूप\" मान नहीं है"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "रà¥à¤ªà¤µà¤¿à¤¨à¥à¤¯à¤¾à¤¸ %r में कोई अनà¥à¤—त मान नहीं है"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "%r नाम से कोई रूप नहीं मिला, %r दà¥à¤µà¤¾à¤°à¤¾ अनà¥à¤—त"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "विनà¥à¤¯à¤¾à¤¸ मान %s.%s खोजे गठकिसी भी रूप विनà¥à¤¯à¤¾à¤¸ में नहीं दिखा"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "विनà¥à¤¯à¤¾à¤¸ का असमरà¥à¤¥à¤¿à¤¤ रूप विकलà¥à¤ª %r दिया गया"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "रà¥à¤ªà¤µà¤¿à¤¨à¥à¤¯à¤¾à¤¸ के पथ में फाइल %r कोई पà¥à¤°à¤®à¤¾à¤£à¤¿à¤• ज़िप फाइल नहीं है या इसमें कोई रà¥à¤ªà¤µà¤¿à¤¨à¥à¤¯à¤¾à¤¸ नहीं सहेजा गया है"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "%r नामक कोई रूप विनà¥à¤¯à¤¾à¤¸ नहीं मिला (theme.conf अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "%s निरà¥à¤®à¤¾à¤¤à¤¾ के लिठयोगà¥à¤¯ चितà¥à¤° नहीं मिला: %s.(%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "%s निरà¥à¤®à¤¾à¤¤à¤¾ के लिठयोगà¥à¤¯ चितà¥à¤° नहीं मिला: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "निरà¥à¤®à¤¾à¤£à¤¾à¤§à¥€à¤¨ [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "परिणाम लिखा जा रहा है..."
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "सभी %d पी.ओ. फाइलें"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ %d पी.ओ. फाइलों के लकà¥à¤·à¥à¤¯"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "%d पी.ओ. फाइलों के लकà¥à¤·à¥à¤¯ कालातीत है"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "सभी सà¥à¤°à¥‹à¤¤ फाइलें"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "आदेश सà¥à¤¥à¤¾à¤¨ में दी गयी फाइल %r सà¥à¤°à¥‹à¤¤ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में नहीं है, उपेकà¥à¤·à¤¾ की जा रही है"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d सà¥à¤°à¥‹à¤¤ फाइलें आदेश सà¥à¤¥à¤¾à¤¨ में दी "
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "%d फाइलों के लकà¥à¤·à¥à¤¯ कालातीत है"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "निरà¥à¤®à¤¾à¤£à¤¾à¤§à¥€à¤¨ [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "अपà¥à¤°à¤šà¤²à¤¿à¤¤ फाइलों को चिनà¥à¤¹à¤¿à¤¤ किया जा रहा है..."
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d मिला"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "à¤à¤• भी नहीं मिला"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "सà¥à¤¥à¤¿à¤¤à¤¿ को परिरकà¥à¤·à¤¿à¤¤ किया जा रहा है"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "संगतता की जांच की जा रही है"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "कोई पà¥à¤°à¤¯à¥‹à¤œà¤¨ कालातीत नहीं है"
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "सà¥à¤¥à¤¿à¤¤à¤¿ का नवीनीकरण किया जा रहा है"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s जोड़ा गया, %s बदला गया, %s हटाया गया"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "सà¥à¤°à¥‹à¤¤à¥‹à¤‚ को पà¥à¤¾ जा रहा है..."
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "लेखन के लिठशेष लेखपतà¥à¤°: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "लेखपतà¥à¤° बनाठजा रहे हैं"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "विषय-सूची पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ पायी गई: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "चितà¥à¤°à¥‹à¤‚ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाई जा रही है..."
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "चितà¥à¤°à¤²à¥‡à¤– फाइल %r नहीं पà¥à¤¾ जा सका: इसकी पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाई जा रही है"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "चितà¥à¤°à¤²à¥‡à¤– फाइल %r की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ नहीं की जा सकी:%s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "चितà¥à¤°à¤²à¥‡à¤– फाइल %r नहीं लिखा जा सका:%s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "पिलो नहीं मिला - चितà¥à¤° फाइलों की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाई जा रही है"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "%s के लिठअजà¥à¤žà¤¾à¤¤ लेख पà¥à¤°à¤•à¤¾à¤°, छोड़ा गया"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "%s फाइल को लिखा जा रहा है..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "संकà¥à¤·à¤¿à¤ªà¥à¤¤ विवरण फाइल %(outdir)s में है."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "%s संसà¥à¤•à¤°à¤£ में कोई परिवरà¥à¤¤à¤¨ नहीं हैं."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "सार फाइल को लिखा जा रहा है..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "अंतरà¥à¤¨à¤¿à¤°à¥à¤®à¤¿à¤¤"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "पà¥à¤°à¤­à¤¾à¤— सà¥à¤¤à¤°"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "सà¥à¤°à¥‹à¤¤ फाइलों की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाई जा रही है..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "परिवरà¥à¤¤à¤¨ सूची बनाने के लिठ%r को नहीं पà¥à¤¾ जा सका"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "मूक निरà¥à¤®à¤¾à¤¤à¤¾ से किसी फाइलों की उतà¥à¤ªà¤¤à¥à¤¤à¤¿ नहीं होती."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "ई-पब फाइल %(outdir)s में है."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_language\" (अथवा \"language\") खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_uid\" à¤à¤•à¥à¤¸.à¤à¤®à¥.à¤à¤². नाम होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_title\" (अथवा \"html_title\") खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_author\" खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_contributor\" खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_description\" खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_publisher\" खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_copyright\" (अथवा \"copyright\") खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"epub_identifier\" खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "ई-पब3 के लिठविनà¥à¤¯à¤¾à¤¸ मान \"version\" खाली नहीं होना चाहिà¤"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "अमानà¥à¤¯ css_file: %r, उपेकà¥à¤·à¤¿à¤¤"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "सनà¥à¤¦à¥‡à¤¶ सूचीपतà¥à¤° %(outdir)s में हैं."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "%d नमूना फाइलों के लकà¥à¤·à¥à¤¯"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "नमूनों को पà¥à¤¾ जा रहा है..."
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "सनà¥à¤¦à¥‡à¤¶ सूचीपतà¥à¤°à¥‹à¤‚ को लिखा जा रहा है..."
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "उपरोकà¥à¤¤ परिणाम में अथवा %(outdir)s /output.txt में तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤ ढूà¤à¤¢à¤¨à¥‡ का पà¥à¤°à¤¯à¤¾à¤¸ "
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "खंडित कड़ी: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "पà¥à¤¸à¥à¤¤à¤¿à¤•à¤¾ पृषà¥à¤  %(outdir)sमें हैं."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "कोई \"man_pages\" विनà¥à¤¯à¤¾à¤¸ मान नहीं मिला; कोई नियमावली पृषà¥à¤  नहीं लिखे जाà¤à¤‚गे"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "लिखा जा रहा है"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "\"man_pages\" विनà¥à¤¯à¤¾à¤¸ मान अजà¥à¤žà¤¾à¤¤ लेखपतà¥à¤° %s का सनà¥à¤¦à¤°à¥à¤­ है"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "à¤à¤š.टी.à¤à¤®à¥.à¤à¤². पृषà¥à¤  %(outdir)sमें है."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "à¤à¤•à¤² लेखपतà¥à¤° संकलन किया जा रहा है"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "अतिरिकà¥à¤¤ फाइलों को लिखा जा रहा है"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "टेकà¥à¤¸à¤‡à¤¨à¥à¤«à¥‹ पृषà¥à¤  %(outdir)sमें हैं."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nइनà¥à¤¹à¥‡à¤‚ मेकइनà¥à¤«à¥‹ से चलाने के लिठउस निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में 'मेक' आदेश चलायें\n(à¤à¤¸à¤¾ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से करने के लिठयहाठ'मेक इनà¥à¤«à¥‹' आदेश का उपयोग करें)"
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "कोई \"texinfo_documents\" विनà¥à¤¯à¤¾à¤¸ मान नहीं मिला; कोई लेखपतà¥à¤° नहीं लिखे जाà¤à¤‚गे"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "\"texinfo_documents\" विनà¥à¤¯à¤¾à¤¸ मान अजà¥à¤žà¤¾à¤¤ लेखपतà¥à¤° %s का सनà¥à¤¦à¤°à¥à¤­ है"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "%s की पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ जारी"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "सनà¥à¤¦à¤°à¥à¤­à¥‹à¤‚ का विशà¥à¤²à¥‡à¤·à¤£ किया जा रहा है..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (में"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "टेकà¥à¤¸à¤‡à¤¨à¥à¤«à¥‹ सहायक फाइलों की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ की जा रही है..."
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "मेकफाइल लिखने में तà¥à¤°à¥à¤Ÿà¤¿: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "पाठ फाइल %(outdir)s में हैं."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "%s फाइल लिखने में वà¥à¤¯à¤µà¤§à¤¾à¤¨: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "à¤à¤•à¥à¤¸.à¤à¤®à¥.à¤à¤². लेखपतà¥à¤° %(outdir)s में हैं."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "छदà¥à¤®-à¤à¤•à¥à¤¸.à¤à¤®à¥.à¤à¤². लेखपतà¥à¤° %(outdir)s में हैं."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "निरà¥à¤®à¤¾à¤£ सूचनापतà¥à¤° फाइल खंडित है: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "à¤à¤š.टी.à¤à¤®à¥.à¤à¤². पृषà¥à¤  %(outdir)sमें हैं."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "निरà¥à¤®à¤¾à¤£ सूचनापतà¥à¤° फाइल को नहीं पà¥à¤¾ जा सका: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "सामानà¥à¤¯ अनà¥à¤•à¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤¾"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "आगामी"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "पूरà¥à¤µà¤µà¤°à¥à¤¤à¥€"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "अनà¥à¤•à¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤¾ निरà¥à¤®à¤¿à¤¤ की जा रही है"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "अतिरिकà¥à¤¤ पृषà¥à¤  लिखे जा रहे हैं"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "उतारी गई फाइलों की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाई जा रही है..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "उतारी गई फाइलों %r की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ नहीं की जा सकी: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "सà¥à¤¥à¥ˆà¤¤à¤¿à¤• फाइल %r की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ नहीं की जा सकी"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "अतिरिकà¥à¤¤ फाइलों की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿à¤¯à¤¾à¤‚ बनाये जा रहे है| "
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "अतिरिकà¥à¤¤ फाइल %r की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ नहीं की जा सकी"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "निरà¥à¤®à¤¾à¤£ फाइल को नहीं लिखा जा सका: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "खोज अनà¥à¤•à¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤¾ नहीं चढाई जा सकी, लेकिन सभी लेखपतà¥à¤° नहीं बनाठजाà¤à¤‚गे: अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾ अपूरà¥à¤£ रहेगी."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "पृषà¥à¤  %s html_sidebars में दो आकृतियों से मिलता है: %r %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "पृषà¥à¤  %s की पà¥à¤°à¤¸à¥à¤¤à¥à¤¤à¤¿ करते समय यूनिकोड तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ. कृपया यह सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ कर लें कि सभी नॉन-असकी #non-ASCII# विहित विनà¥à¤¯à¤¾à¤¸ मान यूनिकोड अकà¥à¤·à¤°à¥‹à¤‚ में हैं."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "पृषà¥à¤  %s की पà¥à¤°à¤¸à¥à¤¤à¥à¤¤à¤¿ करते समय à¤à¤• तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ.\nकारण: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "विषयवसà¥à¤¤à¥à¤“ं का भंडार बनाया जा रहा है"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "%s में खोज अनà¥à¤•à¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤¾ भंडार बनाया जा रहा है"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "अमानà¥à¤¯ js_file: %r, उपेकà¥à¤·à¤¿à¤¤"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "कई math_renderers पंजीकृत हैं. लेकिन कोई math_renderers नहीं चà¥à¤¨à¤¾ गया है."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "अजà¥à¤žà¤¾à¤¤ math_renderer %r दिया गया."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ %r का असà¥à¤¤à¤¿à¤¤à¥à¤µ नहीं है"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path का पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ %r outdir में है| "
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ %r का असà¥à¤¤à¤¿à¤¤à¥à¤µ नहीं है"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path का पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ %r outdir में है| "
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "पà¥à¤°à¤¤à¥€à¤•à¤šà¤¿à¤¨à¥à¤¹ फाइल %r का असà¥à¤¤à¤¿à¤¤à¥à¤µ नहीं है"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "इषà¥à¤Ÿ चिनà¥à¤¹ फाइल %r का असà¥à¤¤à¤¿à¤¤à¥à¤µ नहीं है"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s दिगà¥à¤¦à¤°à¥à¤¶à¤¿à¤•à¤¾"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "लाटेकà¥à¤¸ लेखपतà¥à¤° %(outdir)s में हैं."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nइनà¥à¤¹à¥‡à¤‚ (pdf)latex से चलाने के लिठउस निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में 'मेक' आदेश चलायें\n(à¤à¤¸à¤¾ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से करने के लिठयहाठ'make latexpdf' आदेश का उपयोग करें)"
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "कोई \"latex_documents\" विनà¥à¤¯à¤¾à¤¸ मान नहीं मिला; कोई नहीं लिखे जाà¤à¤‚गे"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "\"latex_documents\" विनà¥à¤¯à¤¾à¤¸ मान अजà¥à¤žà¤¾à¤¤ लेखपतà¥à¤° %s का सनà¥à¤¦à¤°à¥à¤­ है"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "आवृतà¥à¤¤à¤¿"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "%r भाषा के लिठकोई बाबेल विकलà¥à¤ª नहीं "
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "टेकà¥à¤¸ सहायक फाइलों की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ की जा रही है..."
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "टेकà¥à¤¸ सहायक फाइलों की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ की जा रही है..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "अतिरिकà¥à¤¤ फाइलों की पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¤¿ बनाई जा रही है"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r में कोई \"रूप\" मान नहीं है"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r में कोई \"%s \" मान नहीं है"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "निरà¥à¤®à¤¾à¤£ के दौरान अपवाद घटित हà¥à¤† है, दोष-मà¥à¤•à¥à¤¤à¤• चालू किया जा रहा "
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "कारà¥à¤¯ खंडित "
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "रेसà¥à¤Ÿ सà¥à¤¸à¤œà¥à¤œà¤¾ तà¥à¤°à¥à¤Ÿà¤¿:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "कूटलेखन तà¥à¤°à¥à¤Ÿà¤¿:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "यदि आप इस विषय को कूटलिपिकारों के संजà¥à¤žà¤¾à¤¨ में लाना चाहते है तो पिछला पूरा विवरण %s में सहेज दिया गया है"
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "पà¥à¤¨à¤°à¤¾à¤µà¤°à¥à¤¤à¤¨ तà¥à¤°à¥à¤Ÿà¤¿:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "अपवाद घटित:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "यदि यह पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ की गलती थी तो कृपया इसको भी रिपोरà¥à¤Ÿ करें ताकि अगली बार गलती होने पर अधिक अरà¥à¤¥à¤ªà¥‚रà¥à¤£ सनà¥à¤¦à¥‡à¤¶ दिया जा सके."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "तà¥à¤°à¥à¤Ÿà¤¿ की सूचना <https://github.com/sphinx-doc/sphinx/issues> पर उपसà¥à¤¥à¤¿à¤¤ पंजिका में दरà¥à¤œ की जा सकती है. धनà¥à¤¯à¤µà¤¾à¤¦!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "कारà¥à¤¯ संखà¥à¤¯à¤¾ à¤à¤• धनातà¥à¤®à¤• संखà¥à¤¯à¤¾ होनी चाहिà¤"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "अभिलेख की सà¥à¤°à¥‹à¤¤ फाइलों का पथ"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "परिणाम निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ का पथ"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤®à¤¾à¤£ के लिठनिशà¥à¤šà¤¿à¤¤ फाइलों की सूची. यदि -a निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ है तो उपेकà¥à¤·à¤¾ कर दी जाà¤à¤—ी"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "सामानà¥à¤¯ विकलà¥à¤ª"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "पà¥à¤°à¤¯à¥‹à¤— के लिठनिरà¥à¤®à¤¾à¤¤à¤¾ (मानक: à¤à¤š.टी.à¤à¤®à¥.à¤à¤². #html#)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "सभी फाइलें लिखें (मानक: केवल नई और परिवरà¥à¤¤à¤¿à¤¤ फाइलें लिखें)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "सहेजी गयी परिसà¥à¤¥à¤¿à¤¤à¤¿ का पà¥à¤°à¤¯à¥‹à¤— न करें, सदैव सभी फाइलों को पà¥à¥‡à¤‚"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "संचित परिसà¥à¤¥à¤¿à¤¤à¤¿ और डॉक-टà¥à¤°à¥€ फाइलों का पथ (मानक: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "यदि संभव हो तो समानांतर N पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾à¤“ं में निरà¥à¤®à¤¾à¤£ करें (ऑटो #auto# विशेष मान दà¥à¤µà¤¾à¤°à¤¾ cpu-count को N पर लगा दिया जाà¤à¤—ा)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "पथ जहाठपर विनà¥à¤¯à¤¾à¤¸ फाइल (conf.py) सà¥à¤¥à¤¿à¤¤ है (मानक: SOURCEDIR के समरूप)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "किसी भी विनà¥à¤¯à¤¾à¤¸ फाइल का उपयोग ही न करें, मातà¥à¤° -D विकलà¥à¤ª"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "विनà¥à¤¯à¤¾à¤¸ फाइल के à¤à¤• मान का उलà¥à¤²à¤‚घन करें "
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "à¤à¤š.टी.à¤à¤®à¥.à¤à¤². के नमूने में राशि पà¥à¤°à¥‡à¤·à¤¿à¤¤ करें"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "नाम-पतà¥à¤° परिभाषित करें: केवल नाम-पतà¥à¤° वाले खणà¥à¤¡à¥‹à¤‚ का समावेश करें"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "गहन जांच का पालन करें, सभी अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤ संदरà¥à¤­à¥‹à¤‚ के बारे में सचेत करें"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ परिणामों के विकलà¥à¤ª"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "शबà¥à¤¦-पà¥à¤°à¤¯à¥‹à¤— बà¥à¤¾à¤à¤‚ (पà¥à¤¨à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿ की जा सकती है) "
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "à¤à¤¸.टी.डी आउट #stdout# पर कोई परिणाम नहीं, à¤à¤¸.टी.डी à¤à¤°à¤° #stderr# पर चेतावनियाठ"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "कà¥à¤› भी निरà¥à¤—मित नहीं, यहाठतक कि चेतावनी भी नहीं"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "रंगीन परिणाम ही दिखाà¤à¤ (मानक: सà¥à¤µà¤¤à¤ƒ अनà¥à¤®à¤¾à¤¨à¤¿à¤¤)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "रंगीन परिणाम नहीं दिखाà¤à¤ (मानक: सà¥à¤µà¤¤à¤ƒ अनà¥à¤®à¤¾à¤¨à¤¿à¤¤)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "चेतावनियाठ(और तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤) दी गई फाइल में लिखें"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "चेतावनियों को अशà¥à¤¦à¥à¤§à¤¿ मानें"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "अपवाद होने पर पूरा विलोम-अनà¥à¤—मन देखें"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "अपवाद होने पर पी.डी.बी. चलाà¤à¤‚"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "-a विकलà¥à¤ª और फाइल के नामों को समà¥à¤®à¤¿à¤²à¤¿à¤¤ नहीं किया जा सकता"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "चेतावनी फाइल %r नहीं खोली जा सकी: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-D विकलà¥à¤ª का मान नाम = मान के रूप में होना आवशà¥à¤¯à¤• है"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-A विकलà¥à¤ª का मान नाम = मान के रूप में होना आवशà¥à¤¯à¤• है"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "पà¥à¤°à¤­à¤¾à¤—ों में से डॉकà¥-सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग सà¥à¤µà¤¤à¤ƒà¤¸à¤®à¥à¤®à¤¿à¤²à¤¿à¤¤ करें"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "डॉकà¥-टेसà¥à¤Ÿ अंशों के निरà¥à¤¦à¥‡à¤¶ भाग की सà¥à¤µà¤¤à¤ƒ जाà¤à¤š करें"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "भिनà¥à¤¨ परियोजनाओं के सà¥à¤«à¤¿à¤‚कà¥à¤¸ पà¥à¤°à¤²à¥‡à¤–ों का पारसà¥à¤ªà¤°à¤¿à¤• समà¥à¤¬à¤¨à¥à¤§ करने दें"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "वह \"शेष\" पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤¯à¤¾à¤ लिख लें, जिनà¥à¤¹à¥‡à¤‚ निरà¥à¤®à¤¾à¤£ के समय दिखाया या छिपाया जा सकता है"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "पà¥à¤°à¤²à¥‡à¤–ों की वà¥à¤¯à¤¾à¤ªà¥à¤¤à¤¿ की जाà¤à¤š करें"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "गणित को समà¥à¤®à¤¿à¤²à¤¿à¤¤ करें, पी.à¤à¤¨.जी. अथवा à¤à¤¸.वी.जी. में चितà¥à¤°à¤¿à¤¤"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "गणित को समà¥à¤®à¤¿à¤²à¤¿à¤¤ करें, दिगà¥à¤¦à¤°à¥à¤¶à¤• में मैथजाकà¥à¤¸ #MathJax# दà¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "विनà¥à¤¯à¤¾à¤¸ मान के आधार पर सामिगà¥à¤°à¥€ का सशरà¥à¤¤ समावेश"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "पाइथन विषयवसà¥à¤¤à¥à¤“ं के पà¥à¤°à¤²à¥‡à¤–ों के सà¥à¤°à¥‹à¤¤ निरà¥à¤¦à¥‡à¤¶ की कड़ी जोड़ें"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "गिटहब GitHub पर लेखपतà¥à¤° पà¥à¤°à¤•à¤¾à¤¶à¤¿à¤¤ करने के लिठ.nojekyll फाइल बनाà¤à¤‚"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "कृपया à¤à¤• मानà¥à¤¯ पथ का नाम दें"
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "कृपया कà¥à¤› वाकà¥à¤¯à¤¾à¤‚श लिखें"
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "%s में से à¤à¤• चà¥à¤¨à¥‡à¤‚"
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "कृपया हाठके लिठ'y' अथवा नहीं के लिठ'n' मातà¥à¤° दें. "
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "कृपया à¤à¤• फाइल पà¥à¤°à¤¤à¥à¤¯à¤¯ दें, जैसे कि '.rst' अथवा '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "सà¥à¤«à¤¿à¤‚कà¥à¤¸ %s तà¥à¤µà¤°à¤¿à¤¤-आरंभ #sphinx-quickstart# उपकरण के लिठअभिननà¥à¤¦à¤¨"
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "कृपया निमà¥à¤¨ विनà¥à¤¯à¤¾à¤¸à¥‹à¤‚ के लिठमान पà¥à¤°à¤¦à¤¾à¤¨ करें (मानक मान, यदि कोषà¥à¤ à¤• में हो तो, सà¥à¤µà¥€à¤•à¤¾à¤° करने के लिठà¤à¤¨à¥à¤Ÿà¤° दबाà¤à¤)"
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "चà¥à¤¨à¤¾ हà¥à¤† बà¥à¤¨à¤¿à¤¯à¤¾à¤¦à¥€ तथा मूल सà¥à¤¥à¤¾à¤¨: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "आलेख का बà¥à¤¨à¤¿à¤¯à¤¾à¤¦à¥€ सà¥à¤¥à¤¾à¤¨ बताà¤à¤‚."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "आलेख का बà¥à¤¨à¤¿à¤¯à¤¾à¤¦à¥€ पथ"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "तà¥à¤°à¥à¤Ÿà¤¿: à¤à¤• मौजूदा conf.py फाइल दिठगठमूल पथ में पà¥à¤°à¤¾à¤ªà¥à¤¤ हà¥à¤ˆ है."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "सà¥à¤«à¤¿à¤‚कà¥à¤¸-तà¥à¤µà¤°à¤¿à¤¤-आरमà¥à¤­ #sphinx-quickstart# मौजूदा सà¥à¤«à¤¿à¤‚कà¥à¤¸ परियोजनाओं पर पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न नहीं करेगा."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "कृपया à¤à¤• नया मूल पथ दें (अथवा निकलने हेतॠसिरà¥à¤« à¤à¤¨à¥à¤Ÿà¤° #Enter# कर दें)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "आपके पास Sphinx दà¥à¤µà¤¾à¤°à¤¾ बनाई गई फाइलों को सहेजने के लिठदो विकलà¥à¤ª हैं.\nया तो आप मूल सà¥à¤¥à¤¾à¤¨ में ही \"_build\" निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ पà¥à¤°à¤¯à¥‹à¤— करें, अथवा\nमूल पथ में भिनà¥à¤¨ \"सà¥à¤°à¥‹à¤¤\" और \"build\" निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ पà¥à¤°à¤¯à¥‹à¤— करें."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "विभिनà¥à¤¨ सà¥à¤°à¥‹à¤¤ और निरà¥à¤®à¤¾à¤£ डायरेकà¥à¤Ÿà¤°à¥€ (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "मूल निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ के अनà¥à¤¦à¤°, दो और निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ बनाई जाà¤à¤à¤—ी;\nपरिवरà¥à¤§à¤¿à¤¤ à¤à¤š.टी.à¤à¤®à¥.à¤à¤². नमूनों के लिठ\"_templates\" और परिवरà¥à¤§à¤¿à¤¤ रà¥à¤ªà¤ªà¤¤à¥à¤°à¥‹à¤‚ और अनà¥à¤¯ सà¥à¤¥à¥ˆà¤¤à¤¿à¤• फाइलों के लिठ\"_static\"\nआप अधोरेखा के सà¥à¤¥à¤¾à¤¨ पर अनà¥à¤¯ पूरà¥à¤µ-पà¥à¤°à¤¤à¥à¤¯à¤¯ (जैसे कि \".\") का पà¥à¤°à¤¯à¥‹à¤— कर सकते हैं."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "नमूने और सà¥à¤¥à¥ˆà¤¤à¤¿à¤• डायरेकà¥à¤Ÿà¤°à¥€ के लिठपूरà¥à¤µ-पà¥à¤°à¤¤à¥à¤¯à¤¯"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "परियोजना का नाम बनाये गठपà¥à¤°à¤ªà¤¤à¥à¤°à¥‹à¤‚ में बहà¥à¤¤ से सà¥à¤¥à¤¾à¤¨à¥‹à¤‚ पर पà¥à¤°à¤¯à¥à¤•à¥à¤¤ होगा."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "परियोजना का नाम"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "लेखक(कों) का नाम"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "परियोजना संसà¥à¤•à¤°à¤£"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "परियोजना आवृतà¥à¤¤à¤¿"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "यदि पà¥à¤°à¤²à¥‡à¤–ों को अंगà¥à¤°à¥‡à¤œà¥€ के अलावा अनà¥à¤¯ किसी भाषा में लिखा जाना है,\nतो यहाठपर आप भाषा का कूटशबà¥à¤¦ दे सकते हैं. सà¥à¤«à¤¿à¤‚कà¥à¤¸ तदपà¥à¤°à¤¾à¤‚त,\nजो वाकà¥à¤¯à¤¾à¤‚श बनाता है उसे उस भाषा में अनà¥à¤µà¤¾à¤¦à¤¿à¤¤ करेगा.\n\nमानà¥à¤¯ भाषा कूटशबà¥à¤¦ सूची यहाठपर देखें\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "परियोजना की भाषा"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "सà¥à¤°à¥‹à¤¤ फाइल का पà¥à¤°à¤¤à¥à¤¯à¤¯"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "आपने मà¥à¤–à¥à¤¯ लेखपतà¥à¤° का नाम दें (पà¥à¤°à¤¤à¥à¤¯à¤¯ रहित)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "तà¥à¤°à¥à¤Ÿà¤¿: मà¥à¤–à¥à¤¯ फाइल %s चà¥à¤¨à¥‡ हà¥à¤ मूल पथ में पहले से उपलबà¥à¤§ है."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "सà¥à¤«à¤¿à¤‚कà¥à¤¸-तà¥à¤µà¤°à¤¿à¤¤-आरमà¥à¤­ मौजूदा फाइलों पर पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न नहीं करेगा."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "कृपया à¤à¤• नया फाइल नाम दें, अथवा मौजूदा फाइल का पà¥à¤¨à¤°à¥à¤¨à¤¾à¤®à¤•à¤°à¤£ करें और à¤à¤¨à¥à¤Ÿà¤° दबाà¤à¤"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "इनमें से कौन सा सà¥à¤«à¤¿à¤‚कà¥à¤¸ आयाम पà¥à¤°à¤¯à¥‹à¤— करना है, इंगित करें:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "टिपà¥à¤ªà¤£à¥€: imgmath और mathjax à¤à¤• साथ समरà¥à¤¥ नहीं हो सकते. imgmath को अचिनà¥à¤¹à¤¿à¤¤ कर दिया गया है."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "मेकफाइल बनाà¤à¤‚? (हाठके लिठy/ ना के लिठn)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "विंडोज़ कमांड फाइल बनाà¤à¤‚? (हाठके लिठy/ ना के लिठn)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "फाइल बनाई जा रही है ...%s"
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "फाइल %s पहले से उपसà¥à¤¥à¤¿à¤¤ है, छोड़ दी गई."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "समापà¥à¤¤: à¤à¤• पà¥à¤°à¤¾à¤°à¤‚भिक निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ का ढांचा बना दिया गया है."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nसà¥à¤«à¤¿à¤‚कà¥à¤¸ परियोजना के लिठआवशà¥à¤¯à¤• फाइल बनाà¤à¤‚.\n\nसà¥à¤«à¤¿à¤‚कà¥à¤¸-तà¥à¤µà¤°à¤¿à¤¤-आरमà¥à¤­ à¤à¤• संवादपूरà¥à¤£ उपकरण है जो आपकी परियोजना के \nबारे में कà¥à¤› पà¥à¤°à¤¶à¥à¤¨ पूछकर पूरी पà¥à¤°à¤²à¥‡à¤–ों की निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ और नमूना मेकफाइल \nबना देता है जिसे सà¥à¤«à¤¿à¤‚कà¥à¤¸-बिलà¥à¤¡ में पà¥à¤°à¤¯à¥‹à¤— किया जा सकता है.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "शांत ढंग "
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "ढांचे के विकलà¥à¤ª"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "यदि निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ हो तो विभिनà¥à¤¨ सà¥à¤°à¥‹à¤¤ और निरà¥à¤®à¤¾à¤£ पथ"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "_templates आदि में बिंदॠका बदलाव"
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "परोयोजना के मूलभूत विकलà¥à¤ª"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "परियोजना का नाम"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "लेखकों के नाम"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "परियोजना का संसà¥à¤•à¤°à¤£"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "परियोजना की आवृतà¥à¤¤à¤¿"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "लेखपतà¥à¤° की भाषा"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "सà¥à¤°à¥‹à¤¤ फाइल का पà¥à¤°à¤¤à¥à¤¯à¤¯"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "मà¥à¤–à¥à¤¯ लेखपतà¥à¤° का नाम"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "ई-पब पà¥à¤°à¤¯à¥‹à¤— करें"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "आयाम के विकलà¥à¤ª"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "आयाम %s सकà¥à¤·à¤® करें"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "सà¥à¤µà¥‡à¤šà¥à¤›à¤¿à¤¤ आयाम सकà¥à¤·à¤® करें"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "मेकफाइल और बैचफाइल का सरà¥à¤œà¤¨"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "मेकफाइल बनाà¤à¤‚"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "मेकफाइल नहीं बनाà¤à¤‚"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "बैचफाइल बनाà¤à¤‚"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "बैचफाइल नहीं बनाà¤à¤‚"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.bat के लिठmake-mode का पà¥à¤°à¤¯à¥‹à¤— करें"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.bat के लिठmake-mode का पà¥à¤°à¤¯à¥‹à¤— नहीं करें"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "परियोजना नमूनावृतà¥à¤¤à¤¿"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "नमूना फाइलों के लिठनमूना निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "नमूना चर-पद का निरूपण करें"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"शांत\" निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ है, परनà¥à¤¤à¥ कोई भी \"परियोजना\" अथवा \"लेखक\" निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ नहीं है."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "तà¥à¤°à¥à¤Ÿà¤¿: दिया गया पथ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ नहीं है, अथवा सà¥à¤«à¤¿à¤‚कà¥à¤¸ फाइलें पहले से उपसà¥à¤¥à¤¿à¤¤ हैं."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "सà¥à¤«à¤¿à¤‚कà¥à¤¸-तà¥à¤µà¤°à¤¿à¤¤-आरमà¥à¤­ केवल à¤à¤• खाली निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ में कारà¥à¤¯à¤¶à¥€à¤² हो सकती है. कृपया à¤à¤• नया मूल पथ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करें."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "अमानà¥à¤¯ नमूना चर-पद: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "अमानà¥à¤¯ शीरà¥à¤·à¤•: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "पंकà¥à¤¤à¤¿ संखà¥à¤¯à¤¾ का बà¥à¤¯à¥Œà¤°à¤¾ सीमा से बाहर है (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "दोनों \"%s\" और \"%s\" विकलà¥à¤ªà¥‹à¤‚ का पà¥à¤°à¤¯à¥‹à¤— नहीं किया जा सकता"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "समावेशित फाइल %r नहीं मिली अथवा पढने में असफलता मिली"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "कूटलेखन %r जो कि समà¥à¤®à¤¿à¤²à¤¿à¤¤ फाइल %r में पà¥à¤°à¤¯à¥à¤•à¥à¤¤ है, अशà¥à¤¦à¥à¤§ पà¥à¤°à¤¤à¥€à¤¤ हो रही है, à¤à¤• :encoding: विकलà¥à¤ª देकर पà¥à¤°à¤¯à¤¤à¥à¤¨ करें"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "%r नामक विषयवसà¥à¤¤à¥ समà¥à¤®à¤¿à¤²à¤¿à¤¤ फाइल %r में नहीं मिली"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "\"lineno-match\" का पà¥à¤°à¤¯à¥‹à¤— बिना जà¥à¤¡à¥€ \"lines\" के यà¥à¤—à¥à¤® के साथ नहीं हो सकता"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "लाइन बà¥à¤¯à¥Œà¤°à¤¾ %r: समà¥à¤®à¤¿à¤²à¤¿à¤¤ फाइल %r से कोई लाइन नहीं ली जा सकीं"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "विषय-सूची-संरचना में छोड़े गठलेखपतà¥à¤° %r का सनà¥à¤¦à¤°à¥à¤­ है"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "विषय-सूची-संरचना में अविदà¥à¤¯à¤®à¤¾à¤¨ लेखपतà¥à¤° %r का सनà¥à¤¦à¤°à¥à¤­ है"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "भाग के लेखक:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "पà¥à¤°à¤­à¤¾à¤— लेखक:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "निरà¥à¤¦à¥‡à¤¶ लेखक:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "लेखक:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "मापदणà¥à¤¡"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "पà¥à¤°à¤¦à¤¤à¥à¤¤ "
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "पà¥à¤°à¤¦à¤¤à¥à¤¤ पà¥à¤°à¤•à¤¾à¤° "
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "सदसà¥à¤¯"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "चर पद"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "फंकà¥à¤¶à¤¨"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "मैकà¥à¤°à¥‹"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "यà¥à¤—à¥à¤®"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "गणक"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "पà¥à¤°à¤—णक "
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "पà¥à¤°à¤•à¤¾à¤°"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "संसà¥à¤•à¤°à¤£ %s से नया "
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "संसà¥à¤•à¤°à¤£ %s से अलग "
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "संसà¥à¤•à¤°à¤£ %s से पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित "
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "पà¥à¤°à¤¤à¤¿à¤°à¥‚प उदà¥à¤§à¤°à¤£ %s, दूसरी पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¤¿ %s में है "
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "उदà¥à¤§à¤°à¤£ [%s] सनà¥à¤¦à¤°à¥à¤­ कहीं नहीं है"
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "नमूना मानदणà¥à¤¡ "
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "देता है "
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "वरà¥à¤—"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "अवधारणा "
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (अंतरà¥à¤¨à¤¿à¤°à¥à¤®à¤¿à¤¤ फंकà¥à¤¶à¤¨)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s विधि)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (वरà¥à¤—)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (वैशà¥à¤µà¤¿à¤• चरपद अथवा अचर) "
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s लकà¥à¤·à¤£)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "चर "
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (पà¥à¤°à¤­à¤¾à¤—)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "पदà¥à¤§à¤¤à¤¿"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "आंकड़े "
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "लकà¥à¤·à¤£"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "पà¥à¤°à¤­à¤¾à¤—"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "समीकरण का पà¥à¤°à¤¤à¤¿à¤°à¥‚प शीरà¥à¤·à¤• %s, दूसरी पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¤¿ %s में है "
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "अमानà¥à¤¯ math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "चर पद "
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "उभारता है "
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s पà¥à¤°à¤­à¤¾à¤— में )"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s पà¥à¤°à¤­à¤¾à¤— में )"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (अंतरà¥à¤¨à¤¿à¤°à¥à¤®à¤¿à¤¤ चर पद)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (अंतरà¥à¤¨à¤¿à¤°à¥à¤®à¤¿à¤¤ वरà¥à¤—)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s वरà¥à¤— में)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s वरà¥à¤— विधि) "
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s सà¥à¤¥à¥ˆà¤¤à¤¿à¤• विधि)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "पाइथन पà¥à¤°à¤­à¤¾à¤— सूची"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "पà¥à¤°à¤­à¤¾à¤—"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "अवमानित "
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "अपवाद "
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "वरà¥à¤— विधि"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "सà¥à¤¥à¥ˆà¤¤à¤¿à¤• पदà¥à¤§à¤¤à¤¿"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "पारसà¥à¤ªà¤°à¤¿à¤•-सनà¥à¤¦à¤°à¥à¤­à¥‹à¤‚ के लिठà¤à¤• से अधिक लकà¥à¤·à¥à¤¯ मिले %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr "(अवमानित)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (निरà¥à¤¦à¥‡à¤¶)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (भूमिका)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "निरà¥à¤¦à¥‡à¤¶"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "भूमिका"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "परिसà¥à¤¥à¤¿à¤¤à¤¿ चर पद; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "अशà¥à¤¦à¥à¤§ रूप विकलà¥à¤ª विवरण %r, अपेकà¥à¤·à¤¿à¤¤ पà¥à¤°à¤¾à¤°à¥‚प \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" अथवा \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "पारिभाषिक पद"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "वà¥à¤¯à¤¾à¤•à¤°à¤£ संकेत "
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "सनà¥à¤¦à¤°à¥à¤­ शीरà¥à¤·à¤•"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "परिसà¥à¤¥à¤¿à¤¤à¤¿ चर पद "
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® विकलà¥à¤ª "
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "लेखपतà¥à¤°"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "पà¥à¤°à¤­à¤¾à¤— सूची"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "खोज पृषà¥à¤ "
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "पà¥à¤°à¤¤à¤¿à¤°à¥‚प शीरà¥à¤·à¤• %s, दूसरी पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¤¿ %s में है "
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig असमरà¥à¤¥ है. :numref: उपेकà¥à¤·à¤¿à¤¤ है."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "कड़ी का कोई शीरà¥à¤·à¤• नहीं है: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "अमानà¥à¤¯ numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "अमानà¥à¤¯ numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "नव विनà¥à¤¯à¤¾à¤¸"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "विनà¥à¤¯à¤¾à¤¸ परिवरà¥à¤¤à¤¿à¤¤"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "आयाम परिवरà¥à¤¤à¤¿à¤¤"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "निरà¥à¤®à¤¿à¤¤ परिसà¥à¤¥à¤¿à¤¤à¤¿ वरà¥à¤¤à¤®à¤¾à¤¨ संसà¥à¤•à¤°à¤£ नहीं है "
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "सà¥à¤°à¥‹à¤¤ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ परिवरà¥à¤¤à¤¿à¤¤ हो चà¥à¤•à¥€ है "
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "यह परिसà¥à¤¥à¤¿à¤¤à¤¿ चà¥à¤¨à¥‡ गठनिरà¥à¤®à¤¾à¤¤à¤¾ से मेल नहीं खाती, कृपया दूसरी डॉक-टà¥à¤°à¥€ निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ चà¥à¤¨à¥‡à¤‚. "
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "लेखपतà¥à¤°à¥‹à¤‚ के परà¥à¤¯à¤µà¥‡à¤•à¥à¤·à¤£ में असफलता %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "अधिकारकà¥à¤·à¥‡à¤¤à¥à¤° %r पंजीकृत नहीं है"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "लेखपतà¥à¤° किसी भी विषय-सूची-संरचना में समà¥à¤®à¤¿à¤²à¤¿à¤¤ नहीं है"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "सà¥à¤µà¤¯à¤‚-संदरà¥à¤­à¤¿à¤¤ विषय-सूची-संरचना मिली है. उपेकà¥à¤·à¤¾ की गई."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "%s देखिà¤"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "%s भी देखिà¤"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾ की पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ का पà¥à¤°à¤•à¤¾à¤° अजà¥à¤žà¤¾à¤¤ %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "संकेत "
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "पारसà¥à¤ªà¤°à¤¿à¤• संदरà¥à¤­à¤¿à¤¤ विषय-सूची-संरचना सनà¥à¤¦à¤°à¥à¤­ पाठगà¤, उपेकà¥à¤·à¤¾ की जा रही है: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "विषय-सूची-संरचना में लेखपतà¥à¤° %r, जिसका कोई शीरà¥à¤·à¤• नहीं है, का सनà¥à¤¦à¤°à¥à¤­ है: कोई समà¥à¤¬à¤¨à¥à¤§ नहीं बनाया जा सकेगा"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "चितà¥à¤° फाइल पठनीय नहीं है: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "चितà¥à¤° फाइल %s पठनीय नहीं है: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "उतारी गई फाइल पठनीय नहीं है: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s में पहले से भाग संखà¥à¤¯à¤¾ नियत है (à¤à¤• के अनà¥à¤¦à¤° दूसरा अंकित विषय-सूची-संरचना)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "%s फाइल बन जाà¤à¤—ी."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\n<MODULE_PATH> में पाइथन पà¥à¤°à¤­à¤¾à¤— और पैकेज की पà¥à¤¨à¤°à¤¾à¤µà¤°à¥à¤¤à¤¿à¤¤ खोज करें और\nसà¥à¤µà¤¤à¤ƒà¤ªà¥à¤°à¤­à¤¾à¤— निरà¥à¤¦à¥‡à¤¶ दà¥à¤µà¤¾à¤°à¤¾ <OUTPUT_PATH> में पà¥à¤°à¤¤à¤¿ पैकेज à¤à¤• रेसà¥à¤Ÿ #reST# फाइल बनाà¤à¤‚.\n\n<EXCLUDE_PATTERN> फाइल और/ अथवा निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ सà¥à¤µà¤°à¥à¤ª हो सकते हैं\nजो निरà¥à¤®à¤¾à¤£ पà¥à¤°à¤•à¤¿à¤¯à¤¾ में छोड़ दिठजाà¤à¤‚गे.\n\nनोट: सामानà¥à¤¯à¤¤à¤¯à¤¾ यह सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ किसी पहले से बनाई गई फाइल पर पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न नहीं करती."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "पà¥à¤°à¤­à¤¾à¤— से लेखपतà¥à¤° का पथ"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "fnmatch-style फाइल और/ अथवा निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ सà¥à¤µà¤°à¥à¤ª जो निरà¥à¤®à¤¾à¤£ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ से छोड़ने हैं"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "सभी परिणामों को सहेजने के लिठनिरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "विषय-सूची में दिखाठजाने वाले उपपà¥à¤°à¤­à¤¾à¤—ों की अधिकतम गहराई (मानक: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "मौजूदा फाइलों पर पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न करें"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "सांकेतिक कड़ियों का अनà¥à¤¸à¤°à¤£ करें. कलेकà¥à¤Ÿà¤¿à¤µ.रेसिपी.ऑमलेट के साथ पà¥à¤°à¤­à¤¾à¤µà¤¶à¤¾à¤²à¥€. "
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "फाइलों को बनाठबिना सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चलाà¤à¤‚ "
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• पà¥à¤°à¤­à¤¾à¤— के आलेख उसके अपने पृषà¥à¤  में रखें"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "\"_private\" पà¥à¤°à¤­à¤¾à¤— को समà¥à¤®à¤¿à¤²à¤¿à¤¤ करें "
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "विषय-सूची की फाइल का नाम (मानक: पà¥à¤°à¤­à¤¾à¤—) "
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "विषय-सूची की फाइल न बनाà¤à¤‚ "
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "पà¥à¤°à¤­à¤¾à¤—/पैकेज पैकेजों का शीरà¥à¤·à¤• न बनाà¤à¤‚ (उदाहरणारà¥à¤¥, जब डॉकसà¥à¤Ÿà¥à¤°à¤¿à¤‚गà¥à¤¸ में यह पहले से हों) "
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr " मà¥à¤–à¥à¤¯ पà¥à¤°à¤­à¤¾à¤— के आलेख को उपपà¥à¤°à¤­à¤¾à¤— के आलेख से पहले रखें"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "पà¥à¤°à¤­à¤¾à¤— पथ की वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ 'पी.ई.पी.-0420 निहित नामराशि विवरण' के आधार पर करें "
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "फाइल पà¥à¤°à¤¤à¥à¤¯à¤¯ (मानक: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "सà¥à¤«à¤¿à¤‚कà¥à¤¸-तà¥à¤µà¤°à¤¿à¤¤-आरमà¥à¤­ के साथ पूरà¥à¤£ परियोजना उतà¥à¤ªà¤¨à¥à¤¨ करें "
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "मोडà¥à¤¯à¥‚ल_पाथ #module_path# को सिस.पाथ #sys.path# में जोड़ें, जब --full दिया जाता है तब इसका पà¥à¤°à¤¯à¥‹à¤— होता है "
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "परियोजना का नाम (मानक: मूल पà¥à¤°à¤­à¤¾à¤— का नाम) "
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "परियोजना लेखक(गण), जब --full दिया जाता है तब इसका पà¥à¤°à¤¯à¥‹à¤— होता है "
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "परियोजना संसà¥à¤•à¤°à¤£, जब --full दिया जाता है तब इसका पà¥à¤°à¤¯à¥‹à¤— होता है "
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "परियोजना आवृतà¥à¤¤à¤¿, जब --full दिया जाता है तब इसका पà¥à¤°à¤¯à¥‹à¤— होता है "
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "आयाम विकलà¥à¤ª "
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s à¤à¤• निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ नहीं है. "
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "अमानà¥à¤¯ रेगà¤à¤•à¥à¤¸ #regex# %r, %s में "
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "सà¥à¤°à¥‹à¤¤à¥‹à¤‚ की वà¥à¤¯à¤¾à¤ªà¤•à¤¤à¤¾ की जांच पूरी, परिणाम %(outdir)spython.txt में देखें. "
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "अमानà¥à¤¯ रेगà¤à¤•à¥à¤¸ #regex# %r, coverage_c_regexes में "
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "पà¥à¤°à¤­à¤¾à¤— %s का आयत नहीं किया जा सका: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "'%s' विकलà¥à¤ª में अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤ '+' या '-'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' à¤à¤• मानà¥à¤¯ विकलà¥à¤ª नहीं है."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' à¤à¤• मानà¥à¤¯ पाईवरà¥à¤¶à¤¨ #pyversion# विकलà¥à¤ª नहीं है. "
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "अमानà¥à¤¯ टेसà¥à¤Ÿà¤•à¥‹à¤¡ का पà¥à¤°à¤•à¤¾à¤° "
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "सà¥à¤°à¥‹à¤¤à¥‹à¤‚ में डॉकटेसà¥à¤Ÿà¥à¤¸ की जांच पूरी, परिणाम %(outdir)s/output.txt में देखें. "
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "%s भाग में %s पर कोई निरà¥à¤¦à¥‡à¤¶ / परिणाम नहीं: %s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "अमानà¥à¤¯ डॉकटेसà¥à¤Ÿ निरà¥à¤¦à¥‡à¤¶ की उपेकà¥à¤·à¤¾ की जा रही है: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "गà¥à¤°à¤¾à¤«à¤µà¤¿à¥› निरà¥à¤¦à¥‡à¤¶ में दोनों मापदंड, विषय-वसà¥à¤¤à¥ और फाइल का नाम, नहीं हो सकते"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "बाहरी गà¥à¤°à¤¾à¤«à¤µà¤¿à¥› फाइल %r नहीं मिली अथवा पढने में असफलता मिली"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "विषय-वसà¥à¤¤à¥ के बिना गà¥à¤°à¤¾à¤«à¤µà¤¿à¥› निरà¥à¤¦à¥‡à¤¶ की उपेकà¥à¤·à¤¾ की जा रही है. "
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "डॉट निरà¥à¤¦à¥‡à¤¶ %r नहीं चलाया जा सकता (गà¥à¤°à¤¾à¤«à¤µà¤¿à¥› परिणाम के लिठआवशà¥à¤¯à¤•), गà¥à¤°à¤¾à¤«à¤µà¤¿à¥›_डॉट मान की जांच करें"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "डॉट तà¥à¤°à¥à¤Ÿà¤¿ के साथ बहार आ गया:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "डॉट ने किसी परिणाम फाइल का नहीं बनाया:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "गà¥à¤°à¤¾à¤«à¤µà¤¿à¥›_आउटपà¥à¤Ÿ_फॉरà¥à¤®à¥‡à¤Ÿ का 'पी.à¤à¤¨.जी', 'à¤à¤¸.वी.जी.', होना आवशà¥à¤¯à¤• है, पर यह %r है"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "डॉट निरà¥à¤¦à¥‡à¤¶ %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graph: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graph]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "परिवरà¥à¤¤à¤• तà¥à¤°à¥à¤Ÿà¤¿ के साथ बहार आ गया:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "लाटेकà¥à¤¸ आदेश %r नहीं चलाया जा सकता (गणित दिखाने के लिठआवशà¥à¤¯à¤•). आई.à¤à¤®à¥.जी.मैथ_लाटेकà¥à¤¸ मान की जाà¤à¤š करें"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s आदेश %r नहीं चलाया जा सकता (गणित दिखाने के लिठआवशà¥à¤¯à¤•). imgmath_%s मान की जाà¤à¤š करें"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "लाटेकà¥à¤¸ दिखाà¤à¤ %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "पंकà¥à¤¤à¤¿à¤¬à¤¦à¥à¤§ लाटेकà¥à¤¸ %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "इनà¥à¤Ÿà¤°à¤¸à¥à¤«à¤¿à¤‚कà¥à¤¸ सामान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित हो चà¥à¤•à¤¾ है: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "इनà¥à¤Ÿà¤°à¤¸à¥à¤«à¤¿à¤‚कà¥à¤¸ सामान को %s से चà¥à¤¾à¤¯à¤¾ जा रहा है ..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "कà¥à¤› चीजों के साथ कà¥à¤› समसà¥à¤¯à¤¾ है, लेकिन काम के दूसरे विकलà¥à¤ª उपलबà¥à¤§ हैं: "
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "कà¥à¤› चीजों पहà¥à¤à¤šà¤¨à¥‡ में असफलता मिली और यह समसà¥à¤¯à¤¾à¤à¤ मिलीं: "
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(%s v%s में)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(%s में)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "इनà¥à¤Ÿà¤°à¤¸à¥à¤«à¤¿à¤‚कà¥à¤¸ निरà¥à¤§à¤¾à¤°à¤• %r अकà¥à¤·à¤°à¤®à¤¾à¤²à¤¾ नहीं है. उपेकà¥à¤·à¤¿à¤¤"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[सà¥à¤°à¥‹à¤¤]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "अपूरà¥à¤£ "
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "अपूरà¥à¤£ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ मिली: %s "
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<मूल पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<मूल पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿>> %s, पंकà¥à¤¤à¤¿ %d में उपसà¥à¤¥à¤¿à¤¤ है.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "मौलिक पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "पà¥à¤°à¤­à¤¾à¤— निरà¥à¤¦à¥‡à¤¶ विशिषà¥à¤Ÿ रूप से दरà¥à¤¶à¤¾à¤¯à¤¾ जा रहा है..."
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "पà¥à¤°à¤­à¤¾à¤— निरà¥à¤¦à¥‡à¤¶"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s का सà¥à¤°à¥‹à¤¤ निरà¥à¤¦à¥‡à¤¶ </h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "सिंहावलोकन: पà¥à¤°à¤­à¤¾à¤— निरà¥à¤¦à¥‡à¤¶"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>सभी पà¥à¤°à¤­à¤¾à¤— जिनके लिठनिरà¥à¤¦à¥‡à¤¶ उपलबà¥à¤§ है</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "सà¥à¤µà¤¤à¤ƒ %s (%r) के लिठअमानà¥à¤¯ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "%s के पदों का पà¥à¤°à¤¾à¤°à¥‚प बनाने में वà¥à¤¯à¤µà¤§à¤¾à¤¨: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "पता नहीं है कि कौन सा पà¥à¤°à¤­à¤¾à¤— सà¥à¤µà¤¤à¤ƒà¤ªà¥à¤°à¤²à¥‡à¤–न %r के लिठआयात करना है (लेखपतà¥à¤° में \"पà¥à¤°à¤­à¤¾à¤—\" या \"वरà¥à¤¤à¤®à¤¾à¤¨-पà¥à¤°à¤­à¤¾à¤—\" निरà¥à¤¦à¥‡à¤¶ रख कर देखें; अथवा सà¥à¤ªà¤·à¥à¤Ÿ पà¥à¤°à¤­à¤¾à¤— नाम देकर देखें)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "सà¥à¤µà¤¤à¤ƒ पà¥à¤°à¤­à¤¾à¤— नाम में \"::\" विवेकहीन है"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "सà¥à¤µà¤¤à¤ƒ-पà¥à¤°à¤­à¤¾à¤— %s के लिठहसà¥à¤¤à¤¾à¤•à¥à¤·à¤° पद अथवा पà¥à¤°à¤¤à¥à¤¯à¥à¤¤à¥à¤¤à¤°à¤¿à¤¤ टिपà¥à¤ªà¤£à¥€ पà¥à¤°à¤¦à¤¾à¤¨ की गई"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ अंतिम अकà¥à¤·à¤°à¤®à¤¾à¤²à¤¾ होनी चाहिà¤, न कि %r (%s पà¥à¤°à¤­à¤¾à¤— में) -- __all__ की उपेकà¥à¤·à¤¾ की जाà¤à¤—ी"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "आधार: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "%s गà¥à¤£ %s वसà¥à¤¤à¥ में अनà¥à¤ªà¤¸à¥à¤¥à¤¿à¤¤"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "पद-विचà¥à¤›à¥‡à¤¦à¤¨ में असफलता: %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "विषय-वसà¥à¤¤à¥ के आयात में असफलता: %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "ऑटोसमरी आतंरिक रूप से आर.à¤à¤¸.टी. फाइलें बनाता है. आपके सोरà¥à¤¸_सफिकà¥à¤¸ में आर.à¤à¤¸.टी. समà¥à¤®à¤¿à¤²à¤¿à¤¤ नहीं है. छोड़ा गया."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[ऑटोसमरी] अब इसका सà¥à¤µà¤¤à¤ƒà¤¸à¤¾à¤°à¤¾à¤‚श बना रहा है: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[ऑटोसमरी] %s पर लिख रहा है"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nसà¥à¤µà¤¤à¤ƒ सारांश #autosummary# निरà¥à¤¦à¥‡à¤¶ का पà¥à¤°à¤¯à¥‹à¤— करते हà¥à¤ पà¥à¤°à¥à¤¨à¤¸à¤°à¤‚चितपाठ बनाता है.\n\nसà¥à¤«à¤¿à¤‚कà¥à¤¸-ऑटोजेन सà¥à¤«à¤¿à¤‚कà¥à¤¸.à¤à¤•à¥à¤¸à¥à¤Ÿ.ऑटोसमरी.जेनेरेट का मà¥à¤–ड़ा है.\nयह पà¥à¤°à¤¦à¤¤à¥à¤¤ फाइलों में समà¥à¤®à¤¿à¤²à¤¿à¤¤ ऑटो समरी निरà¥à¤¦à¥‡à¤¶à¥‹à¤‚ के अनà¥à¤¸à¤¾à¤° पà¥à¤°à¥à¤¨à¤¸à¤°à¤‚चितपाठ बनाता है\n\nसà¥à¤µà¤¤à¤ƒ सारांश #autosummary# निरà¥à¤¦à¥‡à¤¶ का पà¥à¤°à¤¾à¤°à¥‚प सà¥à¤«à¤¿à¤‚कà¥à¤¸.à¤à¤•à¥à¤¸à¥à¤Ÿ.ऑटोसमरी \nपाइथन पà¥à¤°à¤­à¤¾à¤— में निबंधित है और इसे आप निमà¥à¤¨à¤²à¤¿à¤–ित माधà¥à¤¯à¤® से पॠसकते हैं:\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "आर.à¤à¤¸.टी. फाइलें बनाने के लिठसà¥à¤°à¥‹à¤¤ फाइलें"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "सभी परिणाम रखने के लिठनिरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "फाइलों के लिठमानक पà¥à¤°à¤¤à¥à¤¯à¤¯ (मानक: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "पारंपरिक पà¥à¤°à¤¾à¤°à¥‚प निरà¥à¤¦à¥‡à¤¶à¤¿à¤•à¤¾ (मानक: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "लेखपतà¥à¤° आयातित सदसà¥à¤¯ (मानक: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "मà¥à¤–à¥à¤¯ शबà¥à¤¦à¥‹à¤‚ के चर-पद"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "उदाहरण"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "कà¥à¤› उदाहरण"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "टिपà¥à¤ªà¤£à¤¿à¤¯à¤¾à¤"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "अनà¥à¤¯ मापदणà¥à¤¡"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "सनà¥à¤¦à¤°à¥à¤­"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "चेतावनी देता है"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "मिलता है"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "सावधानी"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "चेतावनी"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "खतरा"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "गलती"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "संकेत"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "टिपà¥à¤ªà¤£à¥€ "
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "यह भी देखिà¤"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "सलाह"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "चेतावनी"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "पिछले पृषà¥à¤  से जारी"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "अगले पृषà¥à¤  पर जारी"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "अकारादि-कà¥à¤°à¤®à¤¹à¥€à¤¨ "
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "संखà¥à¤¯à¤¾à¤à¤‚ "
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "पृषà¥à¤ "
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "विषय-सूची"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "खोज"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "चलिà¤"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "सà¥à¤°à¥‹à¤¤ दिखाà¤à¤"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "सिंहावलोकन"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "नमसà¥à¤¤à¥‡! यह है"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "आलेख विषय"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾ &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "संचालन"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s में खोजें"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "इन लेखपतà¥à¤°à¥‹à¤‚ के बारे में"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "सरà¥à¤µà¤¾à¤§à¤¿à¤•à¤¾à¤°"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "अंतिम बार समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr " %(docstitle)s में खोजें"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "पिछला पà¥à¤°à¤•à¤°à¤£"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "पिछला अधà¥à¤¯à¤¾à¤¯"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "अगला पà¥à¤°à¤•à¤°à¤£"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "अगला अधà¥à¤¯à¤¾à¤¯"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "खोज कारà¥à¤¯ के लिठजावा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ का होना आवशà¥à¤¯à¤• है. कृपया जावा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ को शà¥à¤°à¥‚ करें."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "खोज"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "खोज परीणाम "
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "तà¥à¤µà¤°à¤¿à¤¤ खोज"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "परिवरà¥à¤¤à¤¿à¤¤ संसà¥à¤•à¤°à¤£ %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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 "सी à¤.पी.आई. परिवरà¥à¤¤à¤¨"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "अनà¥à¤¯ परिवरà¥à¤¤à¤¨"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "खोज जारी"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "खोज की तैयारी"
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", में "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "खोजे गठजोड़े छिपाà¤à¤‚"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "किनारे का सà¥à¤¥à¤¾à¤¨ घटाà¤à¤‚"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "किनारे का सà¥à¤¥à¤¾à¤¨ बà¥à¤¾à¤à¤‚"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "विषय सामिगà¥à¤°à¥€"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "4 पंकà¥à¤¤à¤¿à¤¬à¤¦à¥à¤§ सूचियाठमिलीं. यह आपके दà¥à¤µà¤¾à¤°à¤¾ उपयोग किठगठआयाम की तà¥à¤°à¥à¤Ÿà¤¿ हो सकती है: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "पाद-टिपà¥à¤ªà¤£à¥€ [%s] का कोई सनà¥à¤¦à¤°à¥à¤­ नहीं है."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "पाद-टिपà¥à¤ªà¤£à¥€ [#] सनà¥à¤¦à¤°à¥à¤­ कहीं नहीं है"
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "अनà¥à¤µà¤¾à¤¦à¤¿à¤¤ संदेश में असंगत पाद-टिपà¥à¤ªà¤£à¥€ के पà¥à¤°à¤¸à¤‚ग. मूल: {0}, अनà¥à¤µà¤¾à¤¦à¤¿à¤¤: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "अनà¥à¤µà¤¾à¤¦à¤¿à¤¤ संदेश में असंगत पà¥à¤°à¤¸à¤‚ग. मूल: {0}, अनà¥à¤µà¤¾à¤¦à¤¿à¤¤: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "अनà¥à¤µà¤¾à¤¦à¤¿à¤¤ संदेश में असंगत उदà¥à¤§à¤°à¤£ के पà¥à¤°à¤¸à¤‚ग. मूल: {0}, अनà¥à¤µà¤¾à¤¦à¤¿à¤¤: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "अनà¥à¤µà¤¾à¤¦à¤¿à¤¤ संदेश में असंगत शबà¥à¤¦ के पà¥à¤°à¤¸à¤‚ग. मूल: {0}, अनà¥à¤µà¤¾à¤¦à¤¿à¤¤: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "किसी भी पारसà¥à¤ªà¤°à¤¿à¤•-सनà¥à¤¦à¤°à¥à¤­ के लिठà¤à¤• से अधिक लकà¥à¤·à¥à¤¯ मिले %r: %s संभव"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "दूरसà¥à¤¥ चितà¥à¤° नहीं लाया जा सका: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "दूरसà¥à¤¥ चितà¥à¤° नहीं लाया जा सका: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "अजà¥à¤žà¤¾à¤¤ चितà¥à¤° पà¥à¤°à¤¾à¤°à¥‚प: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "असाधनीय सà¥à¤°à¥‹à¤¤ अकà¥à¤·à¤°, \"?\" दà¥à¤µà¤¾à¤°à¤¾ बदले जा रहे हैं: %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "छोड़ा "
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "असफल"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "अजà¥à¤žà¤¾à¤¤ बिंदॠपà¥à¤°à¤•à¤¾à¤°: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "अशà¥à¤¦à¥à¤§à¤¿ पाठन: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "अशà¥à¤¦à¥à¤§à¤¿ लेखन: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "अमानà¥à¤¯ तिथि पà¥à¤°à¤¾à¤°à¥‚प. यदि आप सीधे परिणाम में दरà¥à¤¶à¤¾à¤¨à¤¾ चाहते हैं तो अकà¥à¤·à¤°à¤®à¤¾à¤²à¤¾ को à¤à¤•à¤¾à¤•à¥€ उदà¥à¤§à¤°à¤£ चिनà¥à¤¹ दà¥à¤µà¤¾à¤°à¤¾ चिनà¥à¤¹à¤¿à¤¤ करें: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "विषय-सूची-संरचना में अविदà¥à¤¯à¤®à¤¾à¤¨ फाइल %r का सनà¥à¤¦à¤°à¥à¤­ है"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "केवल निरà¥à¤¦à¥‡à¤¶à¤• भाव का मूलà¥à¤¯à¤¾à¤‚कन करते समय अपवाद: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "मानक भूमिका '%s' नहीं मिली"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "%s के लिठनमफिग_फॉरà¥à¤®à¥‡à¤Ÿ नहीं बताया गया है"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "%s बिंदॠके लिठकोई पहचान-चिनà¥à¤¹ नहीं दिया गया"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "चितà¥à¤° का आकार नहीं मिल सका. :scale: विकलà¥à¤ª की उपेकà¥à¤·à¤¾ की जा रही है."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "अजà¥à¤žà¤¾à¤¤ %r उचà¥à¤šà¤¤à¤®à¤¸à¥à¤¤à¤°_विभाजन #toplevel_sectioning# %r वरà¥à¤— के लिà¤"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr "अतà¥à¤¯à¤¾à¤§à¤¿à¤• अधिकतम गहराई # :maxdepth: #, उपेकà¥à¤·à¤¿à¤¤ किया गया."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "लेखपतà¥à¤° का शीरà¥à¤·à¤• à¤à¤•à¤² पाठ बिंदॠनहीं है"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "पाया गया शीरà¥à¤· बिंदॠकिसी भाग, पà¥à¤°à¤¸à¤‚ग, तालिका, विषय-पà¥à¤°à¤¬à¥‹à¤§ अथवा पारà¥à¤¶à¥à¤µ-सà¥à¤¥à¤¾à¤¨ में नहीं है"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "पाद टिपà¥à¤ªà¤£à¤¿à¤¯à¤¾à¤‚"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "दोनों तालिका-सà¥à¤¤à¤‚भ और :चौड़ाई: विकलà¥à¤ª दिठगठहैं. :चौड़ाई: मान की उपेकà¥à¤·à¤¾ की जाà¤à¤—ी."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "परिमाण मातà¥à¤°à¤• %s अमानà¥à¤¯ है. उपेकà¥à¤·à¤¾ की जाà¤à¤—ी."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾ की पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ का पà¥à¤°à¤•à¤¾à¤° %s मिला"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[चितà¥à¤°: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[चितà¥à¤°]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "शीरà¥à¤·à¤• रेखाचितà¥à¤° के भीतर नहीं है"
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "अकारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¿à¤¤ बिंदॠपà¥à¤°à¤•à¤¾à¤°: %r"
diff --git a/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js b/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..c73e10b
--- /dev/null
+++ b/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "hi_IN",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo b/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..f1e1853
--- /dev/null
+++ b/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po b/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..b1d83ed
--- /dev/null
+++ b/sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Hindi (India) (http://app.transifex.com/sphinx-doc/sphinx-1/language/hi_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: hi_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.js b/sphinx/locale/hr/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..f4ecdac
--- /dev/null
+++ b/sphinx/locale/hr/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "hr",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", u ",
+ "About these documents": "O ovim dokumentima",
+ "Automatically generated list of changes in version %(version)s": "Automatski generirani popis promjena u verziji %(version)s",
+ "C API changes": "C API promjene",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Promjene u verziji %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Sakrij pomo\u0107nu traku",
+ "Complete Table of Contents": "Detaljni sadr\u017eaj",
+ "Contents": "Sadr\u017eaj",
+ "Copyright": "Sva prava zadr\u017eana",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Poka\u017ei pomo\u0107nu traku",
+ "Full index on one page": "Potpun indeks na jednoj stranici",
+ "General Index": "Opceniti abecedni indeks",
+ "Global Module Index": "Op\u0107eniti popis modula",
+ "Go": "Tra\u017ei",
+ "Hide Search Matches": "Sakrij rezultate pretrage",
+ "Index": "Abecedni popis",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Indeksiraj stranice po slovu",
+ "Indices and tables:": "Kazala i tablice:",
+ "Last updated on %(last_updated)s.": "Zadnji put a\u017eurirano %(last_updated)s.",
+ "Library changes": "Promjene lib-ova",
+ "Navigation": "Navigacija",
+ "Next topic": "Sljede\u0107a tema",
+ "Other changes": "Ostale promjene",
+ "Overview": "Pregled",
+ "Please activate JavaScript to enable the search\n functionality.": "Molimo omogu\u0107ite JavaScript\n za djelovanje tra\u017eilice.",
+ "Preparing search...": "Priprema pretrage...",
+ "Previous topic": "Prija\u0161nja tema",
+ "Quick search": "Brzo pretra\u017eivanje",
+ "Search": "Tra\u017ei",
+ "Search Page": "Tra\u017eilica",
+ "Search Results": "Rezultati pretrage",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Tra\u017ei izme\u0111u %(docstitle)s",
+ "Searching": "Pretra\u017eivanje",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Prika\u017ei izvorni kod",
+ "Table of Contents": "",
+ "This Page": "Trenutna stranica",
+ "Welcome! This is": "Dobro do\u0161li! Ovo je",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Zadanim uvjetima nije prona\u0111en dokument. Molim provjerite to\u010dnost upisanih rije\u010di i odabir ozna\u010denih kategija.",
+ "all functions, classes, terms": "sve funkcije, razredi, izrazi",
+ "can be huge": "mo\u017ee biti ogromno",
+ "last updated": "posljednja promjena",
+ "lists all sections and subsections": "prika\u017ei sve sekcije i podsekcije",
+ "next chapter": "sljede\u0107e poglavlje",
+ "previous chapter": "Prija\u0161nje poglavlje",
+ "quick access to all modules": "brz dostup do svih modula",
+ "search": "tra\u017ei",
+ "search this documentation": "tra\u017ei po dokumentaciji",
+ "the documentation for": "dokumentacija za"
+ },
+ "plural_expr": "n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/hr/LC_MESSAGES/sphinx.mo b/sphinx/locale/hr/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..40dbdc2
--- /dev/null
+++ 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
new file mode 100644
index 0000000..e704ce1
--- /dev/null
+++ b/sphinx/locale/hr/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Mario Šarić, 2015-2020
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Mario Šarić, 2015-2020\n"
+"Language-Team: Croatian (http://app.transifex.com/sphinx-doc/sphinx-1/language/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Nema izvornog direktorija (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Izvorni i odredišni direktorij ne smiju biti jednaki"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Izrada pomoću Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Ovaj projekt se ne može izgraditi s instaliranom verzijom, potrebno je instalirati Sphinx v%s ili višu verziju."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "izrada izlazne mape"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' koji je postavljen u conf.py nije moguće pozvati. Molimo izmijenite definiciju 'setup' funkcije kako bi ju mogli izvršiti iz Pythona. Ovo je potrebno kako bi conf.py imao karakter Sphinx proširenja. "
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "uÄitavanje prijevoda [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "napravljeno"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "neuspješno: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Nije odabran format, koristi se zadani: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "uspješno"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "završeno uz probleme"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "build %s, %s upozorenje."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "build %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s proÅ¡irenje nema deklaraciju paralelnog Äitanja, uz pretpostavku da nije - zamolite autora za provjeru i postavljanje deklaracije"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s proÅ¡irenje nema deklaraciju paralelnog Äitanja, uz pretpostavku da nije - zamolite autora za provjeru i postavljanje deklaracije"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "u konfiguracijskom direktoriju ne postoji datoteka conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "ne može se nadjaÄati osnovna konf. postavka %r, zanemarena je (koristite %r za postavljanje pojedinaÄnih elemenata)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "nepravilan broj %r za konf. vrijednost %r, zanemaruje se"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "ne može se nadjaÄati konf. vrijednost %r zbog nepodržanog tipa, zanemareno"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "nepoznata konfiguracijska vrijednost %r, zanemaruje se"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Ne postoji konfiguracijska vrijednost: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Konfiguracijska vrijednost %r već postoji"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Postoji sintaksna greška u konfiguracijskoj datoteci: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Poglavlje %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Slika %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tablica %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Ispis %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r nije pronađen, zanemareno je."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Događaj %r već postoji"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Nepoznato ime događaja: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Ovaj projekt treba proširenje %s najmanje u verziji %si stoga se ne može izraditi s postojećom verzijom (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Klasa %s nema \"name\" svojstvo"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Builder %r već postoji (u modulu %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Builder imena %s nije registriran ili dostupan pomoću poziva"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Builder %s nije registriran"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domena %s je već registrirana"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domena %s nije još registrirana"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser za %r je već registriran"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "proširenje %r se već nalazi u Sphinxu od verzije %s; ovo proširenje se zanemaruje."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Izvorna iznimka:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Proširenje %s ne može biti uvezena"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "proširenje %r nema funkciju setup(); radi li se o ispravnom Sphinx modulu proširenja?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "%s proširenje traži Sphinx verzije v%s; stoga projekt ne može biti izgrađen s ovom verzijom."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "proÅ¡irenje %r vratio je nepodržan objekt iz setup() funkcije; rezultat treba biti None ili rijeÄnik metapodataka"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "tema %r nema postavku \"theme\""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "tema %r nema postavku \"inherit\""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "tema %r nije pronađena, nasljeđuje ju %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "postavka %s.%s ne pojavljuje se u pretraženim konfiguracijama tema"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "datoteka %r iz teme nije ispravna (zip) arhiva ili ne sadrži temu"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "nema teme %r (nedostaje theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Ugrađeni dijelovi"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Nivo modula"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (u "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Opceniti abecedni indeks"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "abecedni indeks"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "naprijed"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "nazad"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentacija"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Abecedni popis"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Distribucija"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Neispravan navod: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Ne mogu se istovremeno koristiti *%s* i *%s* opcije"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Include datoteka %r nije pronaÄ‘ena ili se ne može proÄitati"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Encoding %r za Äitanje import datoteke %r nije ispravan, pokuÅ¡ajte dodati :encoding: opciju"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Objekt %r nije pronađen u include datoteci %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Ne može se koristiti \"lineno-match\" sa nespojivom grupom \"lines\""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Specifikacija retka %r: nema redaka preuzetih iz include datoteke %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor sekcije: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor modula: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor koda:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Vraća"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Vraća tip"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "Älan"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "varijabla"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkcija"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tip"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Novo u verziji %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Promijenjeno u verziji %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastarijelo od verzije %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parametri predloška"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Baca (iznimke)"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "razred"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "koncept"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (ugrađene funkcije)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (razred)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globalna varijabla ili konstanta)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atribut)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumenti"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metoda"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "podaci"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "dvostruka oznaka jednakosti %s, drugo pojavljivanje u %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Varijable"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Podiže"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (u modulu %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (u modulu %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (ugrađene variable)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (ugrađen razred)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (razred u %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s metoda klase)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statiÄna metoda)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python indeks modula"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "Moduli"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Zastarjelo"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "izuzetak"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "metoda klase"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statiÄna metoda"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (zastarjelo)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directive)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (role)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "Direktive"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "uloga"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "varijabla okruženja; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "termin rjeÄnika"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "token gramatike"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "referentna oznaka"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "varijabla okruženja"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programske mogućnosti"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "dokument"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Popis modula"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Tražilica"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "pogledajte %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "Dodatne informacije: %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Simboli"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "nedostaje '+' ili '-' u '%s' opciji."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' nije valjana opcija."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' nije valjana pyversion opcija"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Graphviz direktiva ne može imati i sadržaj i ime datoteke za argumente"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Vanjska Graphviz datoteka %r ne postoji ili se ne može Äitati"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Ignoriranje \"graphviz\" direktive bez sadržaja."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "dot naredba %r ne može se pokrenuti (potrebna za graphviz izlaz), provjerite postavku graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format mora biti 'png' ili 'svg', ali je %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graph: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graph]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(u %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[source]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> se nalazi u %s, redak %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "izvorna stavka"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Kod modula"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Izvorni kod za %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Pregled: kod modula"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Svi moduli za koje je dostupan kod</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Osnovice: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argumenti"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Primjeri"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Pozor"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Pažnja"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Opasnost"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Greška"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Savjet"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Važno"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Napomena"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Više informacija"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Savjet"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Upozorenje"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "nastavak sa prethodne stranice"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "stranica"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Traži"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Traži"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Prikaži izvorni kod"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Pregled"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Dobro došli! Ovo je"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentacija za"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "posljednja promjena"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Kazala i tablice:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Detaljni sadržaj"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "prikaži sve sekcije i podsekcije"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "traži po dokumentaciji"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Općeniti popis modula"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "brz dostup do svih modula"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "sve funkcije, razredi, izrazi"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Potpun indeks na jednoj stranici"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indeksiraj stranice po slovu"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "može biti ogromno"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Traži između %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "O ovim dokumentima"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Sva prava zadržana"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Zadnji put ažurirano %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Traži %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Prijašnja tema"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Prijašnje poglavlje"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Sljedeća tema"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "sljedeće poglavlje"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Molimo omogućite JavaScript\n za djelovanje tražilice."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "traži"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Rezultati pretrage"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Zadanim uvjetima nije pronaÄ‘en dokument. Molim provjerite toÄnost upisanih rijeÄi i odabir oznaÄenih kategija."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Brzo pretraživanje"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Trenutna stranica"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Promjene u verziji %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatski generirani popis promjena u verziji %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Promjene lib-ova"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API promjene"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostale promjene"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Pretraživanje"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Priprema pretrage..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", u "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Sakrij rezultate pretrage"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Sakrij pomoćnu traku"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Pokaži pomoćnu traku"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Sadržaj"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "više od jednog targeta za 'any' referencu %r: može biti %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Fusnote"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[slika: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[slika]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/hu/LC_MESSAGES/sphinx.js b/sphinx/locale/hu/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..917dc2a
--- /dev/null
+++ b/sphinx/locale/hu/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "hu",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", ",
+ "About these documents": "N\u00e9vjegy ezekr\u0151l a dokumentumokr\u00f3l",
+ "Automatically generated list of changes in version %(version)s": "Automatikusan gener\u00e1lt v\u00e1ltoz\u00e1slista a(z) %(version)s v\u00e1ltozathoz",
+ "C API changes": "C API v\u00e1ltoz\u00e1sok",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Oldals\u00e1v \u00f6sszez\u00e1r\u00e1sa",
+ "Complete Table of Contents": "Teljes tartalomjegyz\u00e9k",
+ "Contents": "Tartalom",
+ "Copyright": "Minden jog fenntartva",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Oldals\u00e1v kinyit\u00e1sa",
+ "Full index on one page": "Teljes t\u00e1rgymutat\u00f3 egy oldalon",
+ "General Index": "\u00c1ltal\u00e1nos t\u00e1rgymutat\u00f3",
+ "Global Module Index": "Teljes modul t\u00e1rgymutat\u00f3",
+ "Go": "Ok",
+ "Hide Search Matches": "Keres\u00e9si Tal\u00e1latok Elrejt\u00e9se",
+ "Index": "T\u00e1rgymutat\u00f3",
+ "Index &ndash; %(key)s": "T\u00e1rgymutat\u00f3 &ndash; %(key)s",
+ "Index pages by letter": "Oldalak ABC sorrendben",
+ "Indices and tables:": "T\u00e1rgymutat\u00f3 \u00e9s t\u00e1bl\u00e1zatok",
+ "Last updated on %(last_updated)s.": "Utols\u00f3 friss\u00edt\u00e9s %(last_updated)s.",
+ "Library changes": "K\u00f6nyvt\u00e1r v\u00e1ltoz\u00e1sok",
+ "Navigation": "Navig\u00e1ci\u00f3",
+ "Next topic": "K\u00f6vetkez\u0151 t\u00e9mak\u00f6r",
+ "Other changes": "Egy\u00e9b v\u00e1ltoz\u00e1sok",
+ "Overview": "\u00c1ttekint\u00e9s",
+ "Please activate JavaScript to enable the search\n functionality.": "K\u00e9rem enged\u00e9lyezze a JavaScriptet a keres\u0151 funkci\u00f3\n haszn\u00e1lat\u00e1hoz.",
+ "Preparing search...": "Felk\u00e9sz\u00fcl\u00e9s a keres\u00e9sre...",
+ "Previous topic": "El\u0151z\u0151 t\u00e9mak\u00f6r",
+ "Quick search": "Gyorskeres\u00e9s",
+ "Search": "Keres\u00e9s",
+ "Search Page": "Keres\u00e9s",
+ "Search Results": "Keres\u00e9si Eredm\u00e9nyek",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Keres\u00e9s k\u00f6zt\u00fck: %(docstitle)s",
+ "Searching": "Keres\u00e9s folyamatban",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Forr\u00e1s megtekint\u00e9se",
+ "Table of Contents": "",
+ "This Page": "Ez az Oldal",
+ "Welcome! This is": "\u00dcdv\u00f6z\u00f6lj\u00fck! Ez a",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "A keres\u00e9se nem hozott eredm\u00e9nyt. Ellen\u0151rizze, a megadott kulcsszavakat \u00e9s azt, hogy megfelel\u0151 sz\u00e1m\u00fa kateg\u00f3ria van-e kiv\u00e1lasztva.",
+ "all functions, classes, terms": "\u00f6sszes funkci\u00f3, oszt\u00e1ly \u00e9s kifejez\u00e9s",
+ "can be huge": "nagy lehet",
+ "last updated": "utolj\u00e1ra friss\u00edtve",
+ "lists all sections and subsections": "kilist\u00e1zza az \u00f6sszes fejezetet \u00e9s alfejezetet",
+ "next chapter": "k\u00f6vetkez\u0151 fejezet",
+ "previous chapter": "el\u0151z\u0151 fejezet",
+ "quick access to all modules": "gyors hozz\u00e1f\u00e9r\u00e9s az \u00f6sszes modulhoz",
+ "search": "keres\u00e9s",
+ "search this documentation": "keres\u00e9s ebben a dokument\u00e1ci\u00f3ban",
+ "the documentation for": "dokument\u00e1ci\u00f3"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/hu/LC_MESSAGES/sphinx.mo b/sphinx/locale/hu/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..da1462a
--- /dev/null
+++ b/sphinx/locale/hu/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/hu/LC_MESSAGES/sphinx.po b/sphinx/locale/hu/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..7138d32
--- /dev/null
+++ b/sphinx/locale/hu/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3700 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Balázs Úr, 2020
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
+# Molnár Dénes <denes.molnar2@stud.uni-corvinus.hu>, 2017
+# Peter Schön <slapec@gmail.com>, 2018
+# Tibor Toth <szunyog@gmail.com>, 2013,2015
+# Tibor Toth <szunyog@gmail.com>, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Balázs Úr, 2020\n"
+"Language-Team: Hungarian (http://app.transifex.com/sphinx-doc/sphinx-1/language/hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Nem található a forráskönyvtár (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "A forráskönyvtár és célkönyvtár nem lehet azonos"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx %s verzió futtatása"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Ez a projekt legalább a Sphinx %s verzióját igényli, és emiatt nem állítható össze ezzel a verzióval."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "kimeneti könyvtár elkészítése"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "a(z) %s kiterjesztés beállításakor:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "A „setupâ€, ahogy jelenleg a conf.py fájlban meg van határozva, nem meghívható Python függvény. Módosítsa a meghatározását, hogy meghívható függvénnyé tegye. Ez ahhoz szükséges, hogy a conf.py Sphinx kiterjesztésként viselkedjen."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "fordítások betöltése [%s]…"
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "kész"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "nem érhető el beépített üzenetekhez"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "pickle-t környezet betöltése"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "sikertelen: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Nincs összeállító kiválasztva, az alapértelmezett használata: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "sikerült"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "problémákkal befejeződött"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "%s összeállítás, %s figyelmeztetés (a figyelmeztetések hibákként való kezelésével)"
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "%s összeállítás, %s figyelmeztetés (a figyelmeztetések hibákként való kezelésével)"
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "%s összeállítás, %s figyelmeztetés."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "%s összeállítás, %s figyelmeztetés."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "%s összeállítás."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "a(z) %r csomópontosztály már regisztrálva van, a látogatói felül lesznek bírálva"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "a(z) %r direktíva már regisztrálva van, felül lesz bírálva"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "a beállítási könyvtár nem tartalmaz conf.py fájlt (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "%s. bekezdés"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "%s. ábra"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "%s. táblázat"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "%s. felsorlás"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Fejlesztési Javaslatok; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Beépített"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modul szint"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " ("
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ãltalános tárgymutató"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "nyitóoldal"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "következő"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "előző"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s dokumentáció"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Tárgymutató"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Kiadás"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "A megadott útvonal nem egy mappa vagy a sphinx állományok már léteznek."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Fejezet szerző: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Modul szerző: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Kód szerző: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Szerző: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Paraméterek"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Visszatérési érték"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Visszatérés típusa"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "tag"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "változó"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "függvény"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makró"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enumeráció"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerátor"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "típus"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Új a(z) %s verzióban"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "A %s verzióban változott"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Elavult a(z) %s verzió óta"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Sablonparaméterek"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Dob"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "osztály"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (beépített függvény)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metódus)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (osztály)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globális változó vagy konstans)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribútum)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumentum"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metódus"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "adat"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attribútum"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Változók"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Kivétel"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s modulban)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s modulban)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (beépített változó)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (beépített osztály)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (osztály %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s osztály metódus)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statikus metódus)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python Modul Mutató"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "modulok"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Elavult"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "kivétel"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "osztály szintű metódus"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statikus metódus"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (elavult)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktíva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (szerepkör)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktíva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "szerepkör"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "környezeti változó; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "szójegyzék"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "nyelvtani jel"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "referencia cimke"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "környezeti változó"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "program opció"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Modulok"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Keresés"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "forrás mappa megváltozott"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "lásd %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "lásd még %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Szimbólumok"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s nem mappa"
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graph: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graph]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(%s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[source]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Tennivaló"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "eredeti bejegyzés"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modul forráskód"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s forráskódja</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Ãttekintés: modul forráskód"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Az összes modul, melynek forrása elérhető</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Figyelem"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Figyelem"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Veszély"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Hiba"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Tipp"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Fontos"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Megjegyzés"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Lásd még"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Javaslat"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Figyelem"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "folytatás az előző oldalról"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "oldal"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Keresés"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Ok"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Forrás megtekintése"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Ãttekintés"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Üdvözöljük! Ez a"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentáció"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "utoljára frissítve"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Tárgymutató és táblázatok"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Teljes tartalomjegyzék"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "kilistázza az összes fejezetet és alfejezetet"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "keresés ebben a dokumentációban"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Teljes modul tárgymutató"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "gyors hozzáférés az összes modulhoz"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "összes funkció, osztály és kifejezés"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Tárgymutató &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Teljes tárgymutató egy oldalon"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Oldalak ABC sorrendben"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "nagy lehet"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigáció"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Keresés köztük: %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Névjegy ezekről a dokumentumokról"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Minden jog fenntartva"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Utolsó frissítés %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Keresés %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Előző témakör"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "előző fejezet"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Következő témakör"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "következő fejezet"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Kérem engedélyezze a JavaScriptet a kereső funkció\n használatához."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "keresés"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Keresési Eredmények"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "A keresése nem hozott eredményt. Ellenőrizze, a megadott kulcsszavakat és azt, hogy megfelelő számú kategória van-e kiválasztva."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Gyorskeresés"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Ez az Oldal"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatikusan generált változáslista a(z) %(version)s változathoz"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Könyvtár változások"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API változások"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Egyéb változások"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Keresés folyamatban"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Felkészülés a keresésre..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Keresési Találatok Elrejtése"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Oldalsáv összezárása"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Oldalsáv kinyitása"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Tartalom"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Lábjegyzetek"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[image: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/id/LC_MESSAGES/sphinx.js b/sphinx/locale/id/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..bd4b35e
--- /dev/null
+++ b/sphinx/locale/id/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "id",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", di",
+ "About these documents": "Tentang dokumen ini",
+ "Automatically generated list of changes in version %(version)s": "Daftar perubahan dibuat otomatis untuk versi %(version)s",
+ "C API changes": "Perubahan API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Perubahan pada Versi %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Tutup sidebar",
+ "Complete Table of Contents": "Daftar Isi Lengkap",
+ "Contents": "Konten",
+ "Copyright": "Hak Cipta",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Buka sidebar",
+ "Full index on one page": "Index penuh dalam satu halaman",
+ "General Index": "Indeks Umum",
+ "Global Module Index": "Index Modul Global",
+ "Go": "Go",
+ "Hide Search Matches": "Sembunyikan Hasil Pencarian",
+ "Index": "Indeks",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Index halaman berdasarkan huruf",
+ "Indices and tables:": "Indeks dan tabel:",
+ "Last updated on %(last_updated)s.": "Terakhir diperbarui pada %(last_updated)s.",
+ "Library changes": "Perubahan library",
+ "Navigation": "Navigasi",
+ "Next topic": "Topik berikutnya",
+ "Other changes": "Perubahan lain",
+ "Overview": "Tinjauan",
+ "Please activate JavaScript to enable the search\n functionality.": "Tolong aktifkan JavaScript untuk melakukan pencarian.\n ",
+ "Preparing search...": "Penyiapkan pencarian...",
+ "Previous topic": "Topik sebelumnya",
+ "Quick search": "Pencarian cepat",
+ "Search": "Pencarian",
+ "Search Page": "Pencarian Halaman",
+ "Search Results": "Hasil Pencarian",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Pencarian dalam %(docstitle)s",
+ "Searching": "Pencarian",
+ "Searching for multiple words only shows matches that contain\n all words.": "Mencari beberapa kata hanya menunjukkan kecocokan yang mengandung\n \u00a0\u00a0 semua kata.",
+ "Show Source": "Lihat Sumber",
+ "Table of Contents": "Daftar Isi",
+ "This Page": "Halaman Ini",
+ "Welcome! This is": "Selamat Datang! Ini adalah",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Tidak ada dokumen yang cocok dengan pencarian anda. Pastikan semua kata ditulis dengan benar dan sudah memilih cukup kategori.",
+ "all functions, classes, terms": "semua fungsi, class, term",
+ "can be huge": "dapat menjadi besar",
+ "last updated": "terakhir diperbarui",
+ "lists all sections and subsections": "daftar semua seksi dan subseksi",
+ "next chapter": "bab berikutnya",
+ "previous chapter": "bab sebelum",
+ "quick access to all modules": "akses cepat semua modul",
+ "search": "pencarian",
+ "search this documentation": "pencarian pada dokumentasi ini",
+ "the documentation for": "dokumentasi untuk"
+ },
+ "plural_expr": "0"
+}); \ No newline at end of file
diff --git a/sphinx/locale/id/LC_MESSAGES/sphinx.mo b/sphinx/locale/id/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..3bf6ca8
--- /dev/null
+++ b/sphinx/locale/id/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/id/LC_MESSAGES/sphinx.po b/sphinx/locale/id/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..7a40b37
--- /dev/null
+++ b/sphinx/locale/id/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3700 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Arif Budiman <arifpedia@gmail.com>, 2016-2017
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2009
+# oon arfiandwi (OonID) <oon.arfiandwi@gmail.com>, 2019-2020
+# oon arfiandwi (OonID) <oon.arfiandwi@gmail.com>, 2023
+# Sakti Dwi Cahyono <54krpl@gmail.com>, 2013,2015
+# Tumpal Gemelli, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: oon arfiandwi (OonID) <oon.arfiandwi@gmail.com>, 2023\n"
+"Language-Team: Indonesian (http://app.transifex.com/sphinx-doc/sphinx-1/language/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Tidak dapat menemukan direktori sumber (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Direktori keluaran (%s) bukan direktori"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Direktori sumber dan direktori tujuan tidak boleh sama"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Menjalankan Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Proyek ini memerlukan sedikitnya Sphinx v%s dan maka itu tidak bisa dibangun dengan versi ini."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "membuat direktori keluaran"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "saat menyiapkan ekstensi %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' yang saat ini didefinisikan pada conf.py bukanlah sebuah Python callable. Silakan modifikasi definisinya untuk membuatnya menjadi fungsi callable. Hal ini diperlukan guna conf.py berjalan sebagai ekstensi Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "memuat terjemahan [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "selesai"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "tidak tersedia untuk built-in messages"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "memuat lingkungan yang diawetkan"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "gagal: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Tidak ada builder yang dipilih, menggunakan default: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "berhasil"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "selesai with masalah"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "bangun %s, %s peringatan (dengan peringatan dianggap sebagai kesalahan)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "build %s, %s peringatan."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "build %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "kelas simpul %r sudah terdaftar, pengunjungnya akan diganti"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "pengarahan %r sudah terdaftar, itu akan diganti"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "peran %r sudah terdaftar, itu akan diganti"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "ekstensi %s tidak akan dinyatakan jika itu aman untuk pembacaan paralel, dengan anggapan itu tidak aman - silakan tanya pembuat ekstensi untuk memeriksa dan membuatnya eksplisit"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "ekstensi %s tidak aman untuk pembacaan paralel"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr " \nekstensi %s tidak akan dinyatakan jika itu aman untuk penulisan paralel, dengan anggapan itu tidak aman - silakan tanya pembuat ekstensi untuk memeriksa dan membuatnya eksplisit"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "ekstensi %s tidak aman untuk penulisan paralel"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "mengerjakan serial %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "direktori konfigurasi tidak berisi berkas conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "tidak dapat menulis ulang pengaturan direktori konfigurasi %r, mengabaikan (gunakan %r untuk mengatur elemen-elemen satuan)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "nomor %r yang salah untuk konfigurasi nilai %r, mengabaikan"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "tidak dapat menulis ulang pengaturan konfigurasi %r dengan tipe yang tidak didukung, mengabaikan"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "nilai konfigurasi %r yang tidak dikenal pada penulisan ulang, mengabaikan"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Tidak terdapat nilai konfigurasi demikian: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Nilai konfigurasi %r sudah ada"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Ada kesalahan sintaksis dalam file konfigurasi Anda: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Berkas konfigurasi (atau salah satu dari modul terimpor) disebut sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Terdapat kesalahan programmable dalam berkas konfigurasi anda:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "Nilai konfigurasi `source_suffix 'mengharapkan sebuah string, daftar string, atau kamus. Tetapi `%r' diberikan."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Bab %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Gambar. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabel %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Daftar %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "Nilai konfigurasi `{name}` harus salah satu dari {candidates}, tapi `{current}` diberikan."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "Nilai konfigurasi `{name}' memiliki tipe `{current.__name__}'; diharapkan {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "Nilai konfigurasi `{name}` bertipe `{current.__name__}', default menjadi `{default.__name__}'."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r tidak ditemukan, diabaikan."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Event %r sudah ada"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Nama event tidak dikenal: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "Ekstensi %s diperlukan oleh pengaturan needs_extensions, tapi itu tidak dimuat."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Proyek ini memerlukan ekstensi %s sedikitnya pada versi %s dan maka itu tidak bisa dibangun dengan versi yang dimuat (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Nama Pygments lexer %r tidak diketahui"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Class Builder %s tidak punya atribut \"name\""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Builder %r sudah ada (di modul %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Nama Builder %s todal terdaftar atau tersedia melalui entry point"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Nama Builder %s tidak terdaftar"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domain %s telah terdaftar"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domain %s belum didaftarkan"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "Pengarahan %r sudah terdaftar di domain %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "Peran %r sudah terdaftar di domain %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "Indeks %r sudah terdaftar ke domain %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "object_type %r telah didaftarkan"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "crossref_type %r telah didaftarkan"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r telah didaftarkan"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser untuk %r telah didaftarkan"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Parser sumber untuk %s tidak terdaftar"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Penerjemah untuk %r sudah ada"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "kwargs untuk add_node() harus berupa (visit, depart) function tuple: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r telah terdaftar"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "ekstensi %r telah digabungkan dengan Sphinx sejak versi %s; ekstensi diabaikan."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Eksepsi orisinal:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Tidak dapat mengimpor ekstensi %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "ekstensi %r tidak memiliki fungsi setup(); apa itu benar-benar sebuah modul ekstensi Sphinx?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Ekstensi %s yang digunakan proyek ini memerlukan sedikitnya Sphinx v%s; maka itu tidak bisa dibangun dengan versi ini."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "ekstensi %r mengembalikan objek yang tidak didukung dari fungsi setup() nya; seharusnya mengembalikan None atau dictionary metadata"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "nomor PEP %s tidak valid"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "nomor RFC tidak valid %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "tema %r tidak memiliki pengaturan \"tema\""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "tema %r tidak memiliki pengaturan \"inherit\""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "tema berjudul %r tidak ditemukan, inherited oleh %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "pengaturan %s.%s terjadi pada tak satupun konfigurasi tema yang dicari"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "opsi tema yang tidak didukung %r diberikan"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "berkas %r pada path tema merupakan berkas zip yang tidak valid atau tidak berisi tema"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "tema bernama %r tidak ditemukan (kehilangan theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "gambar yang sesuai untuk builder %s tidak ditemukan: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "gambar yang sesuai untuk builder %s tidak ditemukan: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "membangun [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "menulis keluaran... "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "semua dari %d berkas po"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "target untuk %d berkas po yang telah ditetapkan"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "target untuk %d berkas po telah usang"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "semua berkas sumber"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "berkas %r yang diberikan di command line tidak berada dalam direktori sumber, mengabaikan"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d berkas sumber diberikan di command line"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "target untuk %d berkas sumber yang telah usang"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "membangun [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "mencari berkas yang kini-usang... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d ditemukan"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "tidak ditemukan apapun"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "lingkungan pengawetan"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "memeriksa konsistensi"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "tidak ada target yang usang."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "memperbarui lingkungan:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s ditambahkan, %s diubah, %s dihapus"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "membaca sumber... "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "docnames yang akan ditulis: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "menyiapkan dokumen"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "entri ToC ganda ditemukan: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "menyalin gambar... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "tidak dapat membaca berkas gambar %r: menyalin gambar sebagai gantinya"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "tidak dapat menyalin berkas gambar %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "tidak dapat menulis berkas gambar %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow tidak ditemukan - menyalin berkas gambar"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "mimetype yang tidak dikenal untuk %s, mengabaikan"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "menulis %s berkas..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "Berkas tinjauan berada di %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "tidak ada pengubahan dalam versi %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "menulis berkas ringkasan..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Modul Internal"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Level Modul"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "menyalin berkas sumber..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "tidak dapat membaca %r untuk pembuatan changelog"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "Builder contoh tidak menghasilkan berkas apapun."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "Berkas ePub berada di %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "nilai conf \"epub_language\" (atau \"language\") tidak seharsunya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "nilai conf \"epub_uid\" harus berupa XML NAME untuk EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "nilai conf \"epub_title\" (atau \"html_title\") tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "nilai conf \"epub_author\" tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "nilai conf \"epub_contributor\" tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "nilai conf \"epub_description\" tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "nilai conf \"epub_publisher\" tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "nilai conf \"epub_copyright\" (atau \"copyright\") tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "nilai conf \"epub_identifier\" tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "bilai conf \"version\" tidak seharusnya kosong untuk EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "css_file yang salah: %r, mengabaikan"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Katalog pesan berada di %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "target untuk %d berkas templat"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "membaca templat... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "menulis katalog pesan... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Mencari kesalahan sembarang dalam keluaran di atas atau di %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "tautan rusak: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Halaman manual berada di %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "tidak ditemukan nilai konfigurasi \"man_pages\"; halaman manual tidak akan ditulis"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "penulisan"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "\"man_pages\" nilai konfigurasi mengacu pada dokumen tidak diketahui %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "Halaman HTML berada di %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "merakit dokumen tunggal"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "menulis file tambahan"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Berkas Texinfo berada di %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nJalankan 'make' di direktori tersebut untuk menjalankannya melalui makeinfo\n(gunakan 'make info' di sini untuk melakukannya secara otomatis)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "tidak ditemukan nilai konfigurasi \"texinfo_documents\"; dokumen tidak akan ditulis"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "nilai konfigurasi \"texinfo_documents\" mereferensikan dokumen yang tidak dikenal %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "memroses %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "memecahkan referensi..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (dalam "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "menyalin berkas pendukung Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "kesalahan menulis berkas Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Berkas teks berada di %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "kesalahan menulis berkas %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Berkas XML berada di %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Berkas pseudo-XML berada di %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "berkas info build rusak: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Halaman HTML berada di %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Gagal membaca berkas info build: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Indeks Umum"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "berikut"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "sebelum"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "menghasilkan indeks"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "menulis halaman tambahan"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "menyalin berkas yang dapat diunduh... "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "tidak dapat menyalin berkas yang dapat diunduh %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "menyalin file statis"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "tidak dapat menyalin berkas statik %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "menyalin berkas tambahan"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "tidak dapat menyalin berkas ekstra %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Gagal menulis berkas info build: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "indeks pencarian tidak dapat dimuat, tapi tidak semua dokumen akan dibangun: indeks akan jadi tidak lengkap."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "halaman %s sebanding dengan dua pola dalam html_sidebars: %r dan %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "kesalahan Unicode terjadi saat render halaman %s. Silakan pastikan semua nilai konfigurasi yang berisi konten non-ASCII adalah string Unicode."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Kesalahan terjadi saat render halaman %s.\nAlasan: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "menyisihkan persediaan obyek"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "js_file yang salah: %r, mengabaikan"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Banyak math_renderers teregistrasi. Namun tidak satu pun math_renderer yang dipilih."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "math_renderer %r yang tidak diketahui diberikan."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "entri html_extra_path %r tidak ada"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "entri html_static_path %r tidak ada"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "berkas logo %r tidak ada"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "berkas favicon %r tidak ada"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Dokumentasi %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Berkas LaTeX berada di %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nJalankan 'make' di direktori tersebut untuk menjalankannya melalui (pdf)latex\n(gunakan 'make latexpdf' di sini untuk melakukannya secara otomatis)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "tidak ditemukan nilai konfigurasi \"latex_documents\"; dokumen tidak akan ditulis"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "nilai konfigurasi \"latex_documents\" mereferensikan dokumen yang tidak dikenal %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Rilis"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "tidak ada opsi Babel yang dikenal untuk bahasa %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "menyalin berkas pendukung TeX"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "menyalin berkas pendukung TeX... "
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "menyalin berkas tambahan"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr "Gagal mendapatkan docname!"
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "Eksepsi terjadi saat membangun, memulai debugger:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "Diinterupsi"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "markup reST salah:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Kesalahan encoding:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "Traceback lengkap telah disimpan di %s, bila ingin melaporkan masalah ini kepada developer."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Kesalahan rekursi:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Terjadi eksepsi:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Mohon juga melaporkan hal ini jika sebuah kesalahan pengguna sehingga lain kali perintah salah yang lebih baik dapat disediakan."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Laporan bug dapat diisi pada tracker di <https://github.com/sphinx-doc/sphinx/issues>. Terima kasih!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "job number seharusnya sebuah bilangan positif"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "path ke berkas sumber"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "path ke direktori output"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "daftar berkas spesifik yang dibuat ulang. Diabaikan jika -a ditentukan"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "opsi umum"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "builder yang digunakan (default: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "tulis semua berkas (default: hanya tulis berkas yang baru dan diubah)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "jangan pakai saved environment, selalu baca semua berkas"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "path untuk the cached environment dan berkas doctree (default: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "build secara parallel dengan N processes jika memungkinkan (nilai spesial \"auto\" akan menetapkan N ke cpu-count)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "path tempat berkas konfigurasi (conf.py) berada (default: sama seperti SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "jalankan tanpa berkas sama sekali, hanya opsi -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "override sebuah aturan di berkas konfigurasi"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "masukkan sebuah nilai ke templat HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "define tag: masukkan blok \"only\" dengan TAG"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "mode nit-picky, ingatkan tentang semua referensi yang hilang"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "opsi output konsol"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "tingkatkan verbosity (dapat diulang)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "tanpa output pada stdout, hanya peringatan pada stderr"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "tanpa output sama sekali, peringatan sekalipun"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "siarkan output berwarna (default: auto-detect)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "jangan siarkan output berwarna (default: auto-detect)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "tulis peringatan (dan galat) pada berkas terpilih"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "ubah peringatan menjadi galat"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "dengan -W, lanjutkan saat mendapat peringatan"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "tampilkan traceback penuh pada eksepsi"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "jalankan Pdb pada eksepsi"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "tidak dapat menggabungkan opsi -a dan nama berkas"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "tidak dapat membuka berkas peringatan %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "argumen opsi -D harus dalam bentuk name=value"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "argumen opsi -A harus dalam bentuk name=value"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "masukkan docstrings secara otomatis dari modules"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "uji snippet kode secara otomatis pada blok doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "tautkan antara dokumentasi Sphinx dari berbagai proyek"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "tulis entri \"todo\" yang dapat ditampilan atau disembunyikan dalam build"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "periksa coverage dokumentasi"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "masukkan math, yang dirender sebagai gambar PNG atau SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "masukkan math, yang dirender di perambah sebagai gambar PNG atau SVG"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "inklusi bersyarat untuk isi berdasarkan nilai konfig"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "masukkan tautan ke sumber kode untuk objek Python yang terdokumentasi"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "buat berkas .nojekyll untuk menerbitkannya di halaman GitHub"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Mohon masukkan nama path yang sah."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Mohon masukan teks."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Mohon masukkan satu dari %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Mohon ketik salah satu dari 'y' atau 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Mohon masukkan satu suffiks berkas, contohnya '.rst' atau '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Selamat datang ke alat quickstart Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Silakan masukkan nilai untuk pengaturan berikut (cukup tekan Enter to\nmenerima nilai bawaan, jika diberikan dalam tanda kurung)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Masukkan jalur root untuk dokumentasi."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Root path dokumentasi"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Galat: berkas conf.py telah ditemukan dalam root path terpilih."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart tidak akan menulis ulang proyek Sphinx yang ada."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Silakan masukkan root path baru (atau tekan Enter untuk keluar)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Pisahkan direktori source dan build (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Nama prefiks untuk dir templat dan static"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "Nama proyek akan muncul di beberapa tempat dalam dokumentasi yang dibuat."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Nama proyek"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Nama(-nama) pembuat"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Versi proyek"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Rilis proyek"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Bahasa proyek"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Akhiran berkas sumber"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Nama dokumen master Anda (tanpa akhiran)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Kesalahan: file master %s telah ditemukan di jalur utama yang dipilih."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart tidak akan menimpa berkas yang sudah ada."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Silakan masukkan nama file baru, atau ganti nama file yang ada dan tekan Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Tunjukkan ekstensi Sphinx berikut mana yang harus diaktifkan:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Catatan: imgmath dan mathjax tidak dapat diaktifkan secara bersamaan. imgmath telah diubah tidak pilih."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Buat Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Buat berkas perintah Windows? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Membuat file %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "File %s sudah ada, lewati."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Selesai: Struktur direktori awal telah dibuat."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "di mana \"pembangun\" adalah salah satu pembangun yang didukung, mis. html, lateks, atau periksa tautan."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nHasilkan file yang diperlukan untuk proyek Sphinx. \n\nsphinx-quickstart adalah alat interaktif yang menanyakan beberapa pertanyaan tentang proyek Anda \ndan kemudian menghasilkan direktori dokumentasi lengkap dan contoh \nMakefile untuk digunakan dengan sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "mode diam"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "root proyek"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Opsi struktur"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "jika ditentukan, pisahkan direktori sumber dan pembangunan"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "pengganti dot di _templates dll."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Opsi dasar proyek"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "nama proyek"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "nama penulis"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "versi proyek"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "rilis proyek"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "bahasa dokumen"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "akhiran berkas sumber"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "nama dokumen utama"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "gunakan epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Opsi ekstensi"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "aktifkan ekstensi %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "aktifkan ekstensi berubah-ubah"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Pembuatan Makefile dan Batchfile"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "buat makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "jangan membuat makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "buat batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "jangan membuat batchfile"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "gunakan mode-make untuk Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "jangan gunakan make-mode untuk Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Membuat templat proyek"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "direktori templat untuk berkas templat"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "mendefinisikan variabel templat"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"quiet\" ditentukan, tetapi tidak ada \"project\" atau \"author\" yang ditentukan."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Kesalahan: jalur yang ditentukan bukan direktori, atau file sphinx sudah ada."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart hanya menghasilkan direktori kosong. Silakan tentukan jalur utama baru."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Variabel templat tidak valid: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Keterangan tidak valid: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "spesifikasi nomor baris di luar kisaran (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Tidak dapat menggunakan kedua opsi \"%s\" dan \"%s\""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Berkas yang disertakan %r tidak ditemukan atau gagal membacanya"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Pengkodean %r yang digunakan untuk membaca file yang disertakan %r tampaknya salah, mencoba berikan opsi :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Objek bernama %r tidak ditemukan disertakan di berkas %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Tidak dapat menggunakan \"lineno-match\" dengan rangkaian \"baris\" yang terpisah"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Spesifikasi baris %r: tidak ada baris yang ditarik dari berkas %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree berisi referensi ke dokumen yang dikecualikan %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree berisi referensi ke dokumen yang tidak ada %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Penyusun bagian:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Penyusun modul: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Penulis kode:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Penyusun: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parameter"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "Nilai kembalian"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Kembali"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "anggota"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variabel"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "fungsi"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "struct"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "union"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipe"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Baru pada versi %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Berubah pada versi %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Ditinggalkan sejak versi %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "kutipan rangkap %s, contoh lain dalam %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Kutipan [%s] tidak dirujuk."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parameter Templat"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Throws"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "class"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "konsep"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (fungsi built-in)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (method %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (class)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variabel global atau konstan)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atribut %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumen"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "method"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "duplikasi label persamaan %s, misalnya di %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "Math_eqref_format tidak valid: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variabel"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Raises"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (di modul %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (di modul %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variabel built-in)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (class built-in)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (class di %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (method class %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (method static %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Indeks Modul Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "modul"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Akan ditinggalkan"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "eksepsi"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "method class"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "method static"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "property"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "lebih dari satu target ditemukan untuk referensi silang %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (obsolet)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktif)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (role)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktif"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "opsi-direktif"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "role"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "variabel environment; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Deskripsi opsi salah bentuk %r, seharusnya terlihat seperti \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" atau \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "opsi baris perintah"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "Daftar Istilah kata sulit harus didahului dengan baris kosong"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "Daftar istilah kata sulit tidak boleh dipisahkan oleh garis kosong"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "Daftar istilah kata sulit tampaknya salah format, periksa indentasi"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "daftar istilah"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "token grammar"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "label referensi"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "variabel environment"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opsi program"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "dokumen"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Indeks Modul"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Pencarian Halaman"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "label rangkap %s, contoh lain dalam %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig dinonaktifkan. :numref: diabaikan."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "tautan tidak memiliki teks: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "numfig_format tidak valid: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "numfig_format tidak valid: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "label yang tidak ditentukan: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "konfigurasi baru"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "konfigurasi berubah"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "ekstensi berubah"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "membangun lingkungan bukan versi saat ini"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "direktori sumber telah berubah"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Lingkungan ini tidak kompatibel dengan pembangun yang dipilih, silakan pilih direktori doctree lain."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Gagal memindai dokumen dalam %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Domain %r tidak terdaftar"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "dokumen tidak termasuk dalam toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "totree referensikan sendiri ditemukan. Diabaikan"
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "lihat %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "lihat juga %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "tipe entri indeks tidak dikenal %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Simbol"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "referensi toctree melingkar terdeteksi, mengabaikan: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree berisi referensi ke dokumen %r yang tidak memiliki judul: tidak ada tautan yang akan dihasilkan"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "berkas gambar tidak dapat dibaca: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "berkas gambar %s tidak dapat dibaca: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "berkas unduhan tidak dapat dibaca: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s sudah diberi nomor bagian (penomoran bersarang toctree?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "Akan membuat berkas %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nLihat secara rekursif dalam <MODULE_PATH> untuk modul dan paket Python dan buat \nsatu berkas reST dengan arahan automodule per paket di <OUTPUT_PATH>. \n\n<EXCLUDE_PATTERN> dapat berupa pola berkas dan/atau direktori yang akan \ndikecualikan dari pembuatan. \n\nCatatan: Secara bawaan skrip ini tidak akan menimpa berkas yang sudah dibuat."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "jalur ke modul ke dokumen"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "Berkas gaya-fnmatch dan/atau pola direktori untuk dikecualikan dari pembuatan"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "direktori untuk menempatkan semua keluaran"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "kedalaman maksimum submodul untuk ditampilkan di TOC (bawaan: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "menimpa file yang ada"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "ikuti tautan simbolik. Berdaya bila digabungkan dengan collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "operasikan skrip tanpa membuat file"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "letakkan dokumentasi untuk setiap modul di halamannya sendiri"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "termasuk modul \"_private\""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "nama file daftar isi (bawaan: modul)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "jangan membuat berkas daftar isi"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "jangan membuat judul untuk paket modul/paket (mis. ketika docstrings sudah berisi hal tersebut)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "letakkan dokumentasi modul sebelum dokumentasi submodul"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "menafsirkan jalur modul sesuai dengan spesifikasi namespaces implisit PEP-0420"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "akhiran berkas (bawaan: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "menghasilkan proyek penuh dengan sphinx-quickstart"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "menambahkan module_path ke sys.path, digunakan ketika --full diberikan"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "nama proyek (bawaan: nama modul utama)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "penulis-(penulis) proyek, digunakan ketika --full diberikan"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "versi proyek, digunakan ketika --full diberikan"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "rilis proyek, digunakan ketika --full diberikan, bawaan ke --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "opsi ekstensi"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s bukan direktori."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "regex tidak valid %r dalam %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Pengujian cakupan di sumber selesai, lihat hasilnya dalam %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "%r regex tidak valid di coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "modul %s tidak dapat diimpor: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "tidak ada '+' atau '-' dalam opsi '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' bukan opsi yang valid."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' bukan opsi pyversion yang valid"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "tipe TestCode tidak valid"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Pengujian dokumen di sumber selesai, lihat hasil dalam %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "tidak ada kode/keluaran dalam blok %s pada %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "mengabaikan kode dokumen yang tidak valid: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== durasi membaca paling lambat ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Pengarahan Graphviz tidak dapat memiliki konten dan argumen nama berkas sekaligus"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Berkas Graphviz eksternal %r tidak ditemukan atau gagal dibaca"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Mengabaikan pengarahan \"graphviz\" tanpa konten."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "perintah dot %r tidak dapat dioperasikan (diperlukan untuk keluaran graphviz), periksa pengaturan graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot keluar dengan kesalahan: \n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot tidak menghasilkan berkas output: \n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format harus salah satu dari 'png', 'svg', tetapi %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "kode dot %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graph: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graph]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "convert keluar dengan kesalahan: \n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "Perintah LaTeX %r tidak dapat dioperasikan (diperlukan untuk tampilan matematika), periksa pengaturan imgmath_latex"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s perintah %r tidak dapat dioperasikan (diperlukan untuk tampilan matematika), periksa pengaturan imgmath_%s"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "tampilkan latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "inline latex %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "pengimpanan intersphinx telah dipindahkan: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "memuat penyimpanan intersphinx dari %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "mengalami beberapa masalah dengan beberapa inventaris, tetapi mereka memiliki alternatif berfungsi:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "gagal mencapai salah satu inventaris dengan masalah berikut:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(di %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(dalam %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "pengenal intersphinx %r bukan string. Diabaikan"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[sumber]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "Entri TODO ditemukan: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> terletak di %s, baris %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "entri asli"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "menyoroti kode modul..."
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Kode modul"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Kode sumber untuk %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Tinjauan: kode modul"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Semua modul dimana kode tersedia</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "tanda tangan tidak valid untuk outo %s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "kesalahan saat memformat argumen untuk %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "tidak tahu modul mana yang akan diimpor untuk autodocumenting %r (coba letakkan pengarahan \"module\" atau \"currentmodule\" dalam dokumen, atau berikan nama modul yang eksplisit)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" dalam nama automodule tidak masuk akal"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "argumen tanda tangan atau anotasi kembalian diberikan untuk automodule %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ harus berupa daftar string, bukan %r (dalam modul %s) -- mengabaikan __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Basis: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "atribut hilang %s dalam objek %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "gagal mengurai nama %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "gagal mengimpor objek %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary menghasilkan file .rst secara internal. Tapi source_suffix Anda tidak mengandung .rst. Dilewati."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] menghasilkan autosummary untuk: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] menulis ke %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nHasilkan ReStructuredText menggunakan pengarahan autosummary.\n\nsphinx-autogen adalah tampilan depan ke sphinx.ext.autosummary.generate. Ini menghasilkan \nfile reStructuredText dari pengarahan autosummary yang terkandung dalam \nfile input yang diberikan.\n\nFormat pengarahan autosummary didokumentasikan dalam \nmodul ``sphinx.ext.autosummary`` dan dapat dibaca menggunakan::\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "berkas sumber untuk menghasilkan file rST untuk"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "direktori untuk menempatkan semua keluaran dalam"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "akhiran bawaan untuk berkas (bawaan: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "direktori templat ubahsuai (bawaan: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "mendokumentasikan anggota yang diimpor (bawaan: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argumen Kata Kunci"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Contoh"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Contoh-contoh"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Catatan"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Parameter lainnya"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Referensi"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Peringatkan"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Hasil"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Pehatian"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Hati-hati"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Bahaya"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Kesalahan"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Petunjuk"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Penting"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Catatan"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Lihat juga"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Peringatan"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "lanjutan dari halaman sebelumnya"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "berlanjut ke halaman berikutnya"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "Non-abjad"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Angka"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "laman"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Daftar Isi"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Pencarian"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Go"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Lihat Sumber"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Tinjauan"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Selamat Datang! Ini adalah"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentasi untuk"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "terakhir diperbarui"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indeks dan tabel:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Daftar Isi Lengkap"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "daftar semua seksi dan subseksi"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "pencarian pada dokumentasi ini"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Index Modul Global"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "akses cepat semua modul"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "semua fungsi, class, term"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Index penuh dalam satu halaman"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Index halaman berdasarkan huruf"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "dapat menjadi besar"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigasi"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Pencarian dalam %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Tentang dokumen ini"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Hak Cipta"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Terakhir diperbarui pada %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Pencarian %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Topik sebelumnya"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "bab sebelum"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Topik berikutnya"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "bab berikutnya"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Tolong aktifkan JavaScript untuk melakukan pencarian.\n "
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Mencari beberapa kata hanya menunjukkan kecocokan yang mengandung\n    semua kata."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "pencarian"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Hasil Pencarian"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Tidak ada dokumen yang cocok dengan pencarian anda. Pastikan semua kata ditulis dengan benar dan sudah memilih cukup kategori."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Pencarian cepat"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Halaman Ini"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Perubahan pada Versi %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Daftar perubahan dibuat otomatis untuk versi %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Perubahan library"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Perubahan API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Perubahan lain"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Pencarian"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Penyiapkan pencarian..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", di"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Sembunyikan Hasil Pencarian"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Tutup sidebar"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Buka sidebar"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Konten"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "4 kolom berdasarkan indeks ditemukan. Ini mungkin bug ekstensi yang Anda gunakan: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Catatan kaki [%s] tidak dirujuk."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Catatan kaki [#] tidak dirujuk."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referensi catatan kaki yang tidak konsisten dalam pesan yang diterjemahkan. asli: {0}, diterjemahkan: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "referensi yang tidak konsisten dalam pesan yang diterjemahkan. asli: {0}, diterjemahkan: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referensi kutipan tidak konsisten dalam pesan yang diterjemahkan. asli: {0}, diterjemahkan: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referensi istilah yang tidak konsisten dalam pesan yang diterjemahkan. asli: {0}, diterjemahkan: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "lebih dari satu target ditemukan untuk referensi silang 'any' %r: bisa %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "Tidak dapat mengambil gambar jarak jauh: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "Tidak dapat mengambil gambar jarak jauh: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Format gambar tidak dikenal: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "karakter sumber undecodable, menggantinya dengan \"?\": %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "dilewati"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "gagal"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "tipe simpul tidak dikenal: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "kesalahan membaca: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "kesalahan menulis: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Format tanggal tidak valid. Kutip string dengan kutipan tunggal jika Anda ingin menampilkannya secara langsung: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "toctree berisi ref ke berkas yang tidak ada %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "pengecualian saat mengevaluasi hanya ekspresi pengarahan: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "peran bawaan %s tidak ditemukan"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format tidak didefinisikan untuk %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Tidak ada ID apa pun yang ditugaskan untuk simpul %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "Tidak dapat memperoleh ukuran gambar. :scale: option diabaikan."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "%r toplevel_sectioning tidak diketahui untuk kelas %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: terlalu besar, diabaikan."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "judul dokumen bukan simpul Text tunggal"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "simpul judul tidak ditemui dalam bagian, topik, tabel, peringatan atau sisi bilah"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Catatan kaki"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "opsi tabularcolumns dan :widths: opsi diberikan bersamaan. :widths: diabaikan."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "unit dimensi %s tidak valid. Diabaikan"
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "entri indeks tidak diketahui ditemukan tipe %s"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[gambar: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[gambar]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "keterangan tidak di dalam gambar."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "tipe simpul tidak diterapkan: %r"
diff --git a/sphinx/locale/is/LC_MESSAGES/sphinx.js b/sphinx/locale/is/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..103a070
--- /dev/null
+++ b/sphinx/locale/is/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "is",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "Heildarefnisyfirlit",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "Almennt yfirlit",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "Fela leitarni\u00f0urst\u00f6\u00f0ur",
+ "Index": "Yfirlit",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "Atri\u00f0askr\u00e1 og t\u00f6flur:",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "N\u00e6sta efni",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "Undirb\u00fdr leit...",
+ "Previous topic": "Fyrra efni",
+ "Quick search": "Fl\u00fdtileit",
+ "Search": "Leit",
+ "Search Page": "Leitars\u00ed\u00f0a",
+ "Search Results": "Leitarni\u00f0urst\u00f6\u00f0ur",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Leita \u00ed %(docstitle)s",
+ "Searching": "Leitar",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "Efnisyfirlit",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Leitin bar ekki \u00e1rangur. Vinsamlegast gangi\u00f0 \u00far skugga um a\u00f0 or\u00f0in s\u00e9u r\u00e9tt skrifu\u00f0 og a\u00f0 \u00fe\u00fa hafir vali\u00f0 n\u00e6gilega marga flokka.",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "n\u00e6sti kafli",
+ "previous chapter": "fyrri kafli",
+ "quick access to all modules": "",
+ "search": "leita",
+ "search this documentation": "leita",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n % 10 != 1 || n % 100 == 11)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/is/LC_MESSAGES/sphinx.mo b/sphinx/locale/is/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..e7df902
--- /dev/null
+++ b/sphinx/locale/is/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/is/LC_MESSAGES/sphinx.po b/sphinx/locale/is/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..d6090cc
--- /dev/null
+++ b/sphinx/locale/is/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Tryggvi Kalman <tkj3@hi.is>, 2021
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Tryggvi Kalman <tkj3@hi.is>, 2021\n"
+"Language-Team: Icelandic (http://app.transifex.com/sphinx-doc/sphinx-1/language/is/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: is\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Kafli %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Mynd %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tafla %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Listi %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Almennt yfirlit"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "yfirlit"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "næsta"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "fyrri"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Yfirlit"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Útgáfa"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Leitarsíða"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "sjá %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "sjá einnig %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Athugið"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Aðgát"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Hætta"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Villa"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Ãbending"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Mikilvægt"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Athugasemd"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Sjá einnig"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Ãbending"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Aðvörun"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "framhald frá fyrri síðu"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "framhald á næstu síðu"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Efnisyfirlit"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Leit"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Atriðaskrá og töflur:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Heildarefnisyfirlit"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "leita"
+
+#: 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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Leita í %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Leita í %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Fyrra efni"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "fyrri kafli"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Næsta efni"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "næsti kafli"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "leita"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Leitarniðurstöður"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Leitin bar ekki árangur. Vinsamlegast gangið úr skugga um að orðin séu rétt skrifuð og að þú hafir valið nægilega marga flokka."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Flýtileit"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Leitar"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Undirbýr leit..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Fela leitarniðurstöður"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[mynd: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[mynd]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.js b/sphinx/locale/it/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..7aeef34
--- /dev/null
+++ b/sphinx/locale/it/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "it",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", in ",
+ "About these documents": "A proposito di questi documenti",
+ "Automatically generated list of changes in version %(version)s": "Lista delle modifiche generata automaticamente nella versione %(version)s",
+ "C API changes": "Modifiche nelle API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Cambiamenti nella Versione %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Comprimi la barra laterale",
+ "Complete Table of Contents": "Tabella dei contenuti completa",
+ "Contents": "Contenuti",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Espandi la barra laterale",
+ "Full index on one page": "Indice completo in una pagina",
+ "General Index": "Indice generale",
+ "Global Module Index": "Indice dei moduli",
+ "Go": "Vai",
+ "Hide Search Matches": "Nascondi i risultati della ricerca",
+ "Index": "Indice",
+ "Index &ndash; %(key)s": "Indice &ndash; %(key)s",
+ "Index pages by letter": "Indice delle pagine per lettera",
+ "Indices and tables:": "Indici e tabelle:",
+ "Last updated on %(last_updated)s.": "Ultimo aggiornamento %(last_updated)s.",
+ "Library changes": "Modifiche nella libreria",
+ "Navigation": "Navigazione",
+ "Next topic": "Argomento successivo",
+ "Other changes": "Altre modifiche",
+ "Overview": "Sintesi",
+ "Please activate JavaScript to enable the search\n functionality.": "Attiva JavaScript per abilitare la funzione\u23ce\ndi ricerca.",
+ "Preparing search...": "Preparo la ricerca...",
+ "Previous topic": "Argomento precedente",
+ "Quick search": "Ricerca veloce",
+ "Search": "Cerca",
+ "Search Page": "Cerca",
+ "Search Results": "Risultati della ricerca",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Cerca in %(docstitle)s",
+ "Searching": "Cerca",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Mostra sorgente",
+ "Table of Contents": "",
+ "This Page": "Questa pagina",
+ "Welcome! This is": "Benvenuto! Questa \u00e8",
+ "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 corrisponde a nessun documento. Verifica che tutte le parole siano scritte correttamente e di aver scelto un numero sufficiente di categorie.",
+ "all functions, classes, terms": "tutte le funzioni, classi e moduli",
+ "can be huge": "pu\u00f2 essere enorme",
+ "last updated": "ultimo aggiornamento",
+ "lists all sections and subsections": "elenca l'insieme delle sezioni e sottosezioni",
+ "next chapter": "capitolo successivo",
+ "previous chapter": "capitolo precedente",
+ "quick access to all modules": "accesso veloce ai moduli",
+ "search": "cerca",
+ "search this documentation": "cerca in questa documentazione",
+ "the documentation for": "la documentazione per"
+ },
+ "plural_expr": "n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/it/LC_MESSAGES/sphinx.mo b/sphinx/locale/it/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..03822e4
--- /dev/null
+++ 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
new file mode 100644
index 0000000..780d728
--- /dev/null
+++ b/sphinx/locale/it/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3700 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Antonari Palmio, 2022
+# Denis Cappellin <denis@cappell.in>, 2018
+# Paolo Cavallini <cavallini@faunalia.it>, 2013-2017
+# Roland Puntaier <roland.puntaier@chello.at>, 2013
+# Sandro Dentella <sandro@e-den.it>, 2008
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Antonari Palmio, 2022\n"
+"Language-Team: Italian (http://app.transifex.com/sphinx-doc/sphinx-1/language/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: it\n"
+"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Impossibile trovare la cartella sorgente ( %s )"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "La cartella di output (%s) non è una cartella"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "La cartella sorgente e la cartella di destinazione non possono essere identiche"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sto eseguendo Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Questo progetto necessita almeno di Sphinx v%s per cui non può essere creato con la versione attuale."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "sto creando la cartella di output"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "caricamento traduzioni [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "fatto"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "terminato con problemi"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Sezione %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Fig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabella %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Listato %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "il primary_domain %r non è stato trovato, tralasciato."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Al livello del modulo"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (in "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Indice generale"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indice"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "successivo"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "precedente"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentazione"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indice"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Didascalia non valida: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Impossibile usare contemporaneamente le opzioni \"%s\" e \"%s\""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autore della sezione: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autore del modulo: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autore del codice: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autore: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Ritorna"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Tipo di ritorno"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "membro"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variabile"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funzione"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumeratore"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipo"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nuovo nella versione %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Cambiato nella versione %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Deprecato dalla versione %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parametri del modello"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Solleva"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "classe"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "concetto"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funzione built-in)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metodo)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variabile globale o costante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attributo)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Parametri"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modulo)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metodo"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dati"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attributo"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modulo"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "etichetta dell'equazione %s duplicata, altra istanza in %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variabili"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Solleva"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (nel modulo %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (nel modulo %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variabile built-in)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe built-in)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe in %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s metodo della classe)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s metodo statico)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Indice del modulo Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduli"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Deprecato"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "eccezione"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "metodo della classe"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "metodo statico"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (deprecato)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direttiva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (ruolo)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direttiva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "ruolo"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "variabile d'ambiente, %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "voce del glossario"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "elemento grammaticale"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "etichetta di riferimento"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "variabile d'ambiente"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opzione del programma"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "documento"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Indice dei moduli"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Cerca"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "vedi %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "vedi anche %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Simboli"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "manca '+' or'-' nell'opzione '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' non è un'opzione valida."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[grafico: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[grafico]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(in %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[sorgente]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Da fare"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<elemento originale>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(L'<<elemento originale>> si trova in %s, linea %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "riga originale"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[documenti]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Codice del modulo"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Codice sorgente per %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Vista generale: codice del modulo"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Tutti i moduli di cui è disponibile il codice</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr " Basi: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argomenti parole chiave"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Esempi"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Attenzione"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Attenzione"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Pericolo"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Errore"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Suggerimento"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Vedi anche"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Suggerimento"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Avvertimento"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "continua dalla pagina precedente"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "pagina"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Cerca"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Vai"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Mostra sorgente"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Sintesi"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Benvenuto! Questa è"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "la documentazione per"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "ultimo aggiornamento"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indici e tabelle:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Tabella dei contenuti completa"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "elenca l'insieme delle sezioni e sottosezioni"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "cerca in questa documentazione"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Indice dei moduli"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "accesso veloce ai moduli"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "tutte le funzioni, classi e moduli"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indice &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Indice completo in una pagina"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indice delle pagine per lettera"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "può essere enorme"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigazione"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Cerca in %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "A proposito di questi documenti"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ultimo aggiornamento %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Cerca %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Argomento precedente"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "capitolo precedente"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Argomento successivo"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "capitolo successivo"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Attiva JavaScript per abilitare la funzioneâŽ\ndi ricerca."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "cerca"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Risultati della ricerca"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 corrisponde a nessun documento. Verifica che tutte le parole siano scritte correttamente e di aver scelto un numero sufficiente di categorie."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Ricerca veloce"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Questa pagina"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Cambiamenti nella Versione %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista delle modifiche generata automaticamente nella versione %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Modifiche nella libreria"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Modifiche nelle API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Altre modifiche"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Cerca"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Preparo la ricerca..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", in "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Nascondi i risultati della ricerca"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Comprimi la barra laterale"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Espandi la barra laterale"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Contenuti"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Note a piè di pagina"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[immagine: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[immagine]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.js b/sphinx/locale/ja/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..817b128
--- /dev/null
+++ b/sphinx/locale/ja/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ja",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", in ",
+ "About these documents": "\u3053\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u3064\u3044\u3066",
+ "Automatically generated list of changes in version %(version)s": "\u30d0\u30fc\u30b8\u30e7\u30f3 %(version)s \u306e\u5909\u66f4\u70b9\uff08\u3053\u306e\u30ea\u30b9\u30c8\u306f\u81ea\u52d5\u751f\u6210\u3055\u308c\u3066\u3044\u307e\u3059\uff09",
+ "C API changes": "C API \u306b\u95a2\u3059\u308b\u5909\u66f4",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u30d0\u30fc\u30b8\u30e7\u30f3 %(version)s \u306e\u5909\u66f4\u70b9 &#8212; %(docstitle)s",
+ "Collapse sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u305f\u305f\u3080",
+ "Complete Table of Contents": "\u7dcf\u5408\u76ee\u6b21",
+ "Contents": "\u30b3\u30f3\u30c6\u30f3\u30c4",
+ "Copyright": "\u8457\u4f5c\u6a29",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u5c55\u958b",
+ "Full index on one page": "\u7dcf\u7d22\u5f15",
+ "General Index": "\u7dcf\u5408\u7d22\u5f15",
+ "Global Module Index": "\u30e2\u30b8\u30e5\u30fc\u30eb\u7dcf\u7d22\u5f15",
+ "Go": "\u691c\u7d22",
+ "Hide Search Matches": "\u691c\u7d22\u7d50\u679c\u3092\u96a0\u3059",
+ "Index": "\u7d22\u5f15",
+ "Index &ndash; %(key)s": "\u7d22\u5f15 &ndash; %(key)s",
+ "Index pages by letter": "\u982d\u6587\u5b57\u5225\u7d22\u5f15",
+ "Indices and tables:": "\u7d22\u5f15\u3068\u8868\u4e00\u89a7:",
+ "Last updated on %(last_updated)s.": "\u6700\u7d42\u66f4\u65b0: %(last_updated)s",
+ "Library changes": "\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u95a2\u3059\u308b\u5909\u66f4",
+ "Navigation": "\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3",
+ "Next topic": "\u6b21\u306e\u30c8\u30d4\u30c3\u30af\u3078",
+ "Other changes": "\u305d\u306e\u4ed6\u306e\u5909\u66f4",
+ "Overview": "\u6982\u8981",
+ "Please activate JavaScript to enable the search\n functionality.": "\u691c\u7d22\u6a5f\u80fd\u3092\u4f7f\u3046\u306b\u306f JavaScript \u3092\u6709\u52b9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+ "Preparing search...": "\u691c\u7d22\u3092\u6e96\u5099\u3057\u3066\u3044\u307e\u3059...",
+ "Previous topic": "\u524d\u306e\u30c8\u30d4\u30c3\u30af\u3078",
+ "Quick search": "\u30af\u30a4\u30c3\u30af\u691c\u7d22",
+ "Search": "\u691c\u7d22",
+ "Search Page": "\u691c\u7d22\u30da\u30fc\u30b8",
+ "Search Results": "\u691c\u7d22\u7d50\u679c",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "%(docstitle)s \u5185\u3092\u691c\u7d22",
+ "Searching": "\u691c\u7d22\u4e2d",
+ "Searching for multiple words only shows matches that contain\n all words.": "\u8907\u6570\u306e\u5358\u8a9e\u3092\u691c\u7d22\u3059\u308b\u3068\u3001\u6b21\u3092\u542b\u3080\u4e00\u81f4\u306e\u307f\u304c\u8868\u793a\u3055\u308c\u307e\u3059\n \u00a0\u00a0\u00a0 \u3059\u3079\u3066\u306e\u7528\u8a9e\u3002",
+ "Show Source": "\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u8868\u793a",
+ "Table of Contents": "\u76ee\u6b21",
+ "This Page": "\u3053\u306e\u30da\u30fc\u30b8",
+ "Welcome! This is": "Welcome! This is",
+ "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\u3057\u305f\u6587\u5b57\u5217\u306f\u3069\u306e\u6587\u66f8\u306b\u3082\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u3059\u3079\u3066\u306e\u5358\u8a9e\u304c\u6b63\u78ba\u306b\u8a18\u8ff0\u3055\u308c\u3066\u3044\u308b\u304b\u3001\u3042\u308b\u3044\u306f\u3001\u5341\u5206\u306a\u30ab\u30c6\u30b4\u30ea\u30fc\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+ "all functions, classes, terms": "\u95a2\u6570\u3001\u30af\u30e9\u30b9\u304a\u3088\u3073\u7528\u8a9e\u7dcf\u89a7",
+ "can be huge": "\u5927\u304d\u3044\u5834\u5408\u304c\u3042\u308b\u306e\u3067\u6ce8\u610f",
+ "last updated": "\u6700\u7d42\u66f4\u65b0",
+ "lists all sections and subsections": "\u7ae0\uff0f\u7bc0\u4e00\u89a7",
+ "next chapter": "\u6b21\u306e\u7ae0\u3078",
+ "previous chapter": "\u524d\u306e\u7ae0\u3078",
+ "quick access to all modules": "\u5168\u30e2\u30b8\u30e5\u30fc\u30eb\u65e9\u898b\u8868",
+ "search": "\u691c\u7d22",
+ "search this documentation": "\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u691c\u7d22",
+ "the documentation for": "the documentation for"
+ },
+ "plural_expr": "0"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ja/LC_MESSAGES/sphinx.mo b/sphinx/locale/ja/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..239d4d3
--- /dev/null
+++ 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
new file mode 100644
index 0000000..2c6335d
--- /dev/null
+++ b/sphinx/locale/ja/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3711 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# shirou - ã—ã‚ㆠ<shirou.faw@gmail.com>, 2013
+# Akitoshi Ohta <fire.kuma8@gmail.com>, 2011
+# tomo, 2018
+# Hisahiro Ohmura, 2017
+# KaKkouo, 2021
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2021
+# Kouhei Sutou <kou@clear-code.com>, 2011
+# sutefu7, 2019-2020
+# shirou - ã—ã‚ㆠ<shirou.faw@gmail.com>, 2017
+# Taizo Ito <taizo.ito@hennge.com>, 2019
+# Takayuki SHIMIZUKAWA <shimizukawa@gmail.com>, 2013-2016
+# Takayuki SHIMIZUKAWA <shimizukawa@gmail.com>, 2016-2017,2019
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016-2017,2019,2022
+# Tetsuo Koyama <tkoyama010@gmail.com>, 2020-2023
+# tomo, 2019
+# shirou - ã—ã‚ㆠ<shirou.faw@gmail.com>, 2014
+# Yasushi Masuda <whosaysni@gmail.com>, 2008
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Tetsuo Koyama <tkoyama010@gmail.com>, 2020-2023\n"
+"Language-Team: Japanese (http://app.transifex.com/sphinx-doc/sphinx-1/language/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "ソースディレクトリãŒå­˜åœ¨ã—ã¾ã›ã‚“ (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "出力先ディレクトリ (%s) ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "出力先ディレクトリã«ã¯ã‚½ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ç•°ãªã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã—ã¦ãã ã•ã„"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx v%s を実行中"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "ã“ã®ãƒ—ロジェクトã¯Sphinx v%s以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ãªã‘ã‚Œã°ãƒ“ルドã§ãã¾ã›ã‚“。"
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "出力先ディレクトリを作æˆã—ã¦ã„ã¾ã™"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "拡張機能ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—中 %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "conf.pyã«ã‚ã‚‹'setup'ã¯Pythonã®callableã§ã¯ã‚ã‚Šã¾ã›ã‚“。定義を修正ã—ã¦callableã§ã‚る関数ã«ã—ã¦ãã ã•ã„。ã“ã‚Œã¯conf.pyãŒSphinxæ‹¡å¼µã¨ã—ã¦å‹•ä½œã™ã‚‹ã®ã«å¿…è¦ã§ã™ã€‚"
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "翻訳カタログをロードã—ã¦ã„ã¾ã™ [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "完了"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "翻訳ãŒç”¨æ„ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "ä¿å­˜ã•ã‚ŒãŸç’°å¢ƒãƒ‡ãƒ¼ã‚¿ã‚’読ã¿è¾¼ã¿ä¸­"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "失敗: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "ビルダーãŒé¸æŠžã•ã‚Œã¦ã„ãªã„ã®ã§ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã® html を使用ã—ã¾ã™"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "æˆåŠŸ"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "完了(å•é¡Œã‚り)"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "警告%sã€%sをビルドã—ã¾ã™ï¼ˆè­¦å‘Šã¯ã‚¨ãƒ©ãƒ¼ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ï¼‰ã€‚"
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "警告%sã€%sをビルドã—ã¾ã™ï¼ˆè­¦å‘Šã¯ã‚¨ãƒ©ãƒ¼ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ï¼‰ã€‚"
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "ビルド %s, %s warning."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "ビルド %s, %s 警告."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "ビルド %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "nodeクラス %r ã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚visitor関数ã¯ä¸Šæ›¸ãã•ã‚Œã¾ã™"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "ディレクティブ %r ã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚ディレクティブã¯ä¸Šæ›¸ãã•ã‚Œã¾ã™"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "ロール %r ã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚ロールã¯ä¸Šæ›¸ãã•ã‚Œã¾ã™"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "æ‹¡å¼µ %s ã¯ä¸¦åˆ—読ã¿è¾¼ã¿ãŒå¯èƒ½ã‹ã©ã†ã‹ã‚’宣言ã—ã¦ã„ãªã„ãŸã‚ã€ãŠãらã並列読ã¿è¾¼ã¿ã«å¯¾å¿œã—ã¦ã„ãªã„ã§ã—ょã†ã€‚æ‹¡å¼µã®å®Ÿè£…者ã«é€£çµ¡ã—ã¦ã€æ˜Žç¤ºã—ã¦ã‚‚らã£ã¦ãã ã•ã„。"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "%sæ‹¡å¼µã¯ä¸¦åˆ—読ã¿è¾¼ã¿ã«å¯¾ã—ã¦å®‰å…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "æ‹¡å¼µ %s ã¯ä¸¦åˆ—書ãè¾¼ã¿ãŒå¯èƒ½ã‹ã©ã†ã‹ã‚’宣言ã—ã¦ã„ãªã„ãŸã‚ã€ãŠãらã並列書ãè¾¼ã¿ã«å¯¾å¿œã—ã¦ã„ãªã„ã§ã—ょã†ã€‚æ‹¡å¼µã®å®Ÿè£…者ã«é€£çµ¡ã—ã¦ã€æ˜Žç¤ºã—ã¦ã‚‚らã£ã¦ãã ã•ã„。"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "%sæ‹¡å¼µã¯ä¸¦åˆ—書ãè¾¼ã¿ã«å¯¾ã—ã¦å®‰å…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "直列㧠%sã—ã¾ã™"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "conf.py ãŒè¨­å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«å­˜åœ¨ã—ã¾ã›ã‚“ (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "無効ãªè¨­å®šå€¤ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: 'language = None' 。設定を有効ãªè¨€èªžã‚³ãƒ¼ãƒ‰ã«æ›´æ–°ã—ã¦ãã ã•ã„。 'en' (英語)ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¦ã„ã¾ã™ã€‚"
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "設定値ã®è¾žæ›¸ %r ã¯ä¸Šæ›¸ããªã„ãŸã‚無視ã•ã‚Œã¾ã—㟠(%r を使ã£ã¦å€‹åˆ¥ã«è¨­å®šã—ã¦ãã ã•ã„)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "%r ã¯è¨­å®šå€¤ %r ã®æ­£ã—ã„値ã§ã¯ãªã„ãŸã‚無視ã•ã‚Œã¾ã—ãŸ"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "%r ã¯æ­£ã—ã„åž‹ã§ã¯ãªã„ãŸã‚無視ã•ã‚Œã¾ã—ãŸ"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "ä¸æ˜Žãªè¨­å®šå€¤ %r ã«ã‚ˆã‚‹ä¸Šæ›¸ãã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸ"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "%s ã¨ã„ã†è¨­å®šå€¤ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "設定値 %r ã¯æ—¢ã«ç™»éŒ²æ¸ˆã¿ã§ã™"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "設定ファイルã«æ–‡æ³•ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "設定ファイル(ã‚ã‚‹ã„ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ãŸã©ã‚Œã‹ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ï¼‰ãŒsys.exit()を呼ã³ã¾ã—ãŸ"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "設定ファイルã«ãƒ—ログラム上ã®ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "設定値 `source_suffix' ã« `%r' ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸãŒã€æ–‡å­—列ã€æ–‡å­—列ã®ãƒªã‚¹ãƒˆã€è¾žæ›¸ã€ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¦ãã ã•ã„。"
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "%s ç« "
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "図 %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "表 %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "リスト %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr " 設定値 `{name}` ã« `{current}` ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸãŒã€ {candidates} ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¦ãã ã•ã„。"
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "設定値 `{name}' ã« `{current.__name__}' åž‹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ãŒã€ {permitted} 型を指定ã—ã¦ãã ã•ã„。"
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "設定値 `{name}' ã« `{current.__name__}' åž‹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ã€‚デフォルト値㯠`{default.__name__}' ã§ã™ã€‚"
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。無視ã—ã¾ã™ã€‚"
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "v2.0以é™ã€Sphinxã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ \"index \" ã‚’root_docã¨ã—ã¦ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚conf.pyã« \"root_doc = 'contents'\" を追加ã—ã¦ãã ã•ã„。"
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "イベント %r ã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "ä¸æ˜Žãªã‚¤ãƒ™ãƒ³ãƒˆå: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "イベント %r ã®ãƒãƒ³ãƒ‰ãƒ© %r ã§ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "needs_extensions設定㧠%s æ‹¡å¼µãŒè¦æ±‚ã•ã‚Œã¦ã„ã¾ã™ãŒã€ãã®æ‹¡å¼µãŒã‚ã‚Šã¾ã›ã‚“。"
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "ã“ã®ãƒ—ロジェクトã¯æ‹¡å¼µ %s ã® %s 以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¿…è¦ãªãŸã‚ã€ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³(%s)ã§ã¯ãƒ“ルドã§ãã¾ã›ã‚“。"
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Pygments ã« %r ã¨ã„ã†lexerãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "ドキュメント \"%s\" ã§è¤‡æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %r\nビルドã«ã¯ %r を使用ã—ã¦ãã ã•ã„。"
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "ビルダークラス %s ã«ã¯\"name\"属性ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "ビルダー %r (モジュール %s) ãŒã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "ビルダーå %s ã¯ç™»éŒ²ã•ã‚Œã¦ãŠã‚‰ãšã€entry pointã«ã‚‚ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "ビルダーå %s ã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "ドメイン %s ã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "ドメイン %s ã¯ã¾ã ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "ディレクティブ %r ã¯æ—¢ã«%sドメインã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "ロール %r ã¯æ—¢ã«ãƒ‰ãƒ¡ã‚¤ãƒ³%sã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "インデックス %r ã¯ã™ã§ã«%sドメインã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "object_type %r ã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "classref_type %r ã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r ã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "%r ã®source_parserã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "%s ã®source_parserã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "%r ã®Translatorã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "add_node() ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ã¯ (visit, depart) ã®å½¢å¼ã§é–¢æ•°ã‚’タプルã§æŒ‡å®šã—ã¦ãã ã•ã„: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r ã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "math renderer %s ã¯ã™ã§ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "æ‹¡å¼µ %r ã¯Sphinxã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã§Sphinxã«çµ±åˆã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®æ‹¡å¼µã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "å…ƒã®ä¾‹å¤–:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "æ‹¡å¼µ %s ã‚’importã§ãã¾ã›ã‚“"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "æ‹¡å¼µ %r ã«ã¯ setup() 関数ãŒã‚ã‚Šã¾ã›ã‚“。ã“ã‚Œã¯æœ¬å½“ã«Sphinxæ‹¡å¼µã§ã™ã‹ï¼Ÿ"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "ã“ã®ãƒ—ロジェクトã§ä½¿ã‚ã‚Œã¦ã„ã‚‹æ‹¡å¼µ %s ã¯Sphinx v%s 以é™ãŒå¿…è¦ãªãŸã‚ã€ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ãƒ“ルドã§ãã¾ã›ã‚“。"
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "æ‹¡å¼µ %r ã®setup()関数ãŒã€å¯¾å¿œã—ã¦ã„ãªã„オブジェクトを返ã—ã¾ã—ãŸã€‚Noneã¾ãŸã¯ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿è¾žæ›¸ã‚’è¿”ã—ã¦ãã ã•ã„"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "無効ãªPEPç•ªå· %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "無効ãªRFCç•ªå· %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "テーマ %r ã« \"theme\" 設定ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "テーマ %r ã« \"inherit\" 設定ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "テーマ %r ㌠%r ã‹ã‚‰ç¶™æ‰¿ã•ã‚Œã¦ã„ã¾ã™ãŒã€è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "設定 %s.%s ãŒãƒ†ãƒ¼ãƒžè¨­å®šã«ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„テーマオプション %r ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "テーマパス上ã®ãƒ•ã‚¡ã‚¤ãƒ« %r ã¯æ­£ã—ã„zipファイルã§ã¯ãªã„ã‹ã€ãƒ†ãƒ¼ãƒžã‚’å«ã‚“ã§ã„ã¾ã›ã‚“"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "テーマ %r ãŒã‚ã‚Šã¾ã›ã‚“(theme.confãŒè¦‹ã¤ã‹ã‚‰ãªã„?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "%sビルダーå‘ã‘ã®ç”»åƒå½¢å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "%sビルダーå‘ã‘ã®ç”»åƒå½¢å¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "ビルド中 [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "出力中..."
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "å…¨%d件ã®poファイル"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "指定ã•ã‚ŒãŸ %d 件ã®poファイル"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "æ›´æ–°ã•ã‚ŒãŸ %d 件ã®poファイル"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "å…¨ã¦ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "コマンドラインã«æŒ‡å®šã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« %r ãŒãªã„ãŸã‚, "
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "コマンドラインã«æŒ‡å®šã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« %r ã¯ã‚½ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä»¥ä¸‹ã«ãªã„ãŸã‚無視ã•ã‚Œã¾ã™"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "コマンドラインã§æŒ‡å®šã•ã‚ŒãŸ%d件ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "æ›´æ–°ã•ã‚ŒãŸ %d 件ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "ビルド中 [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "æ›´æ–°ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’探ã—ã¦ã„ã¾ã™... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d 件見ã¤ã‹ã‚Šã¾ã—ãŸ"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "環境データをä¿å­˜ä¸­"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "æ•´åˆæ€§ã‚’ãƒã‚§ãƒƒã‚¯ä¸­"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "æ›´æ–°ãŒå¿…è¦ãªå¯¾è±¡ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "環境データを更新中"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s 件追加, %s 件更新, %s 件削除"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "ソースを読ã¿è¾¼ã¿ä¸­..."
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "書ã込むdocname: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "ドキュメントã®å‡ºåŠ›æº–備中"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "TocエントリーãŒé‡è¤‡ã—ã¦ã„ã¾ã™: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "ç”»åƒã‚’コピー中... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "ç”»åƒãƒ•ã‚¡ã‚¤ãƒ« %r ã‚’PILã§èª­ã¿è¾¼ã‚ãªã„ãŸã‚ã€ãã®ã¾ã¾ã‚³ãƒ”ーã—ã¾ã™"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "ç”»åƒãƒ•ã‚¡ã‚¤ãƒ« %r をコピーã§ãã¾ã›ã‚“: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "ç”»åƒãƒ•ã‚¡ã‚¤ãƒ« %r を書ãè¾¼ã‚ã¾ã›ã‚“: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "PillowãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。代ã‚ã‚Šã«ç”»åƒã‚’コピーã—ã¾ã™"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "mimetype を書ãè¾¼ã¿ä¸­..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "META-INF/container.xml を書ãè¾¼ã¿ä¸­..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "content.opf を書ãè¾¼ã¿ä¸­..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "ä¸æ˜Žãªmimetype %sã®ãŸã‚無視ã—ã¾ã™"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "tox.ncx を書ãè¾¼ã¿ä¸­..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "ファイル %s を書ãè¾¼ã¿ä¸­..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "ファイルã¯%(outdir)sã«ã‚ã‚Šã¾ã™"
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "概è¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’書ã出ã—中..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "組ã¿è¾¼ã¿"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "モジュールレベル"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "ソースファイルをコピー中..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "Changelog作æˆä¸­ã« %r を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "dummyビルダーã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’出力ã—ã¾ã›ã‚“"
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "ePubファイルã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "nav.xhtml を書ãè¾¼ã¿ä¸­..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_language\" (ã‚ã‚‹ã„㯠\"language\") ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "EPUB3ã§ã¯è¨­å®šå€¤ \"epub_uid\" ã¯XML NAMEã«ã™ã‚‹ã¹ãã§ã™"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_title\" (ã‚ã‚‹ã„㯠\"html_title\") ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_author\" ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_contributor\" ãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_description\" ãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_publisher\" ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_copyright\" (ã‚ã‚‹ã„㯠\"copyright\") ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"epub_identifier\" ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "EPUB3出力ã§ã¯è¨­å®šå€¤ \"version\" ãŒå¿…è¦ã§ã™"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "無効㪠css_file %r ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸ"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "メッセージカタログã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "指定ã•ã‚ŒãŸ %d 件ã®ãƒ†ãƒ³ãƒ—レートファイル"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "テンプレートã®èª­ã¿è¾¼ã¿ä¸­..."
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "メッセージカタログを出力中... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "上記ã®å‡ºåŠ›çµæžœã€ã¾ãŸã¯ %(outdir)s /output.txt を見ã¦ã‚¨ãƒ©ãƒ¼ã‚’確èªã—ã¦ãã ã•ã„"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "リンクãŒåˆ‡ã‚Œã¦ã„ã¾ã™: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "linkcheck_allowed_redirects 内ã®æ­£è¦è¡¨ç¾ã®ã‚³ãƒ³ãƒ‘イルã«å¤±æ•—ã—ã¾ã—ãŸ: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "マニュアルページ㯠%(outdir)s ã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "設定値 \"man_pages\" ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。マニュアルページã¯æ›¸ã‹ã‚Œã¾ã›ã‚“"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "書ãè¾¼ã¿ä¸­"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "設定値 \"man_pages\" ãŒä¸æ˜Žãªãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ %s ã‚’å‚ç…§ã—ã¦ã„ã¾ã™"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML ページã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "ドキュメントを1ページã«ã¾ã¨ã‚ã¦ã„ã¾ã™"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "追加ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’出力"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Texinfoファイルã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nmakeinfo コマンドã§å‡¦ç†ã™ã‚‹ãŸã‚ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ 'make' を実行ã—ã¦ãã ã•ã„。\n(ã“れを自動的ã«è¡Œã†ã«ã¯ã€ã“ã“㧠'make info' を使用ã—ã¦ãã ã•ã„)。"
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "設定値 \"texinfo_documents\" ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。ドキュメントã¯æ›¸ãè¾¼ã¾ã‚Œã¾ã›ã‚“"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "設定値 \"texinfo_documents\" ã¯ã€ä¸æ˜Žãªãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ %s ã‚’å‚ç…§ã—ã¦ã„ã¾ã™"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "処ç†ä¸­ %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "å‚照を解決ã—ã¦ã„ã¾ã™..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (in "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "Texinfo 関連ファイルをコピーã—ã¦ã„ã¾ã™"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "Makefile ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "テキストファイルã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "ファイル書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼ %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "XMLファイルã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "pseudo-XMLファイルã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "build info ファイルãŒå£Šã‚Œã¦ã„ã¾ã™: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTMLページã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "build info ファイルã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y年%m月%d日"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "ç·åˆç´¢å¼•"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "次ã¸"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "å‰ã¸"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "索引を生æˆä¸­"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "追加ã®ãƒšãƒ¼ã‚¸ã‚’出力中"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "ダウンロードファイルをコピー中..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "ダウンロードファイル %r をコピーã§ãã¾ã›ã‚“: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "html_static_file 内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸ: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "é™çš„ファイルをコピー中"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "é™çš„ファイル %r をコピーã§ãã¾ã›ã‚“"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "extraファイルをコピー中"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "extraファイル %r をコピーã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "build info ファイル %r ã®å‡ºåŠ›ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "検索インデックスを読ã¿è¾¼ã‚ãšã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆãƒ“ルドã®ä¸€éƒ¨ãŒä¸å®Œå…¨ã§ã™ã€‚"
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "ページ %s ãŒhtml_sidebarsã®è¤‡æ•°ã®ãƒ‘ターンã«ä¸€è‡´ã—ã¾ã—ãŸ: %r 㨠%r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "ページ%sã®èª­ã¿è¾¼ã¿ä¸­ã«UnicodeエラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚éžã‚¢ã‚¹ã‚­ãƒ¼æ–‡å­—ã‚’å«ã‚€è¨­å®šå€¤ã¯å…¨ã¦Unicode文字列ã«ã—ã¦ãã ã•ã„。"
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "%sページã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚\nç†ç”±: %r "
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "オブジェクト インベントリを出力"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "%s ã®æ¤œç´¢ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’出力"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "無効㪠js_file %r ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸ"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "複数㮠math_renderer ãŒç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚ã—ã‹ã— math_renderer ã¯é¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "ä¸æ˜Žãª math_renderer %r ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸã€‚"
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path %r ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path %r ãŒoutdir内ã«é…ç½®ã•ã‚Œã¾ã™"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path %r ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path %r ãŒoutdir内ã«é…ç½®ã•ã‚Œã¾ã™"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "ロゴファイル %r ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon ファイル %r ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s ドキュメント"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTeXファイルã¯%(outdir)sã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\n(pdf)latex コマンドã§å‡¦ç†ã™ã‚‹ãŸã‚ã«ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ 'make' を実行ã—ã¦ãã ã•ã„。\n(ã“れを自動的ã«è¡Œã†ã«ã¯ã€ã“ã“㧠'make latexpdf' を使用ã—ã¦ãã ã•ã„)。"
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "設定値 \"latex_documents\" ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。ドキュメントã¯æ›¸ãè¾¼ã¾ã‚Œã¾ã›ã‚“"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "設定値 \"latex_documents\" ã¯ã€ä¸æ˜Žãªãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ %s ã‚’å‚ç…§ã—ã¦ã„ã¾ã™"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "リリース"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "%r 言語å‘ã‘㮠既知㮠Babel オプションã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "TeX 関連ファイルをコピーã—ã¦ã„ã¾ã™"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "TeX 関連ファイルをコピー中..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "追加ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピーã—ã¦ã„ã¾ã™"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "ä¸æ˜Žãªè¨­å®šå€¤ latex_elements[%r] ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸã€‚"
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "ä¸æ˜Žãªãƒ†ãƒ¼ãƒžã‚ªãƒ—ション latex_theme_options[%r] ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸã€‚"
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r ã« \"theme\" 設定ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r ã« \"%s\" 設定ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "ビルド中ã«ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚デãƒãƒƒã‚¬ã‚’èµ·å‹•ã—ã¾ã™:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "割り込ã¾ã‚Œã¾ã—ãŸï¼"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "reST マークアップエラー:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "エンコードエラー:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "完全ãªãƒˆãƒ¬ãƒ¼ã‚¹ãƒãƒƒã‚¯ã‚’%sã«ä¿å­˜ã—ã¾ã—ãŸã€‚å•é¡Œã‚’開発者ã«å ±å‘Šã™ã‚‹ã¨ãã«æ·»ä»˜ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "å†èµ·å‘¼ã³å‡ºã—エラー:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "ã“ã‚Œã¯ã€éžå¸¸ã«å¤§ããªã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚„æ·±ããƒã‚¹ãƒˆã•ã‚ŒãŸã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã§ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚conf.py ã§ã€Python ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®å†å¸°å›žæ•°åˆ¶é™ã§ã‚ã‚‹ 1000 ã‚’ã€ä¾‹ãˆã°æ¬¡ã®ã‚ˆã†ã«æ…Žé‡ã«å¢—ã‚„ã™ã“ã¨ãŒã§ãã¾ã™: "
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "例外ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "次期ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æ”¹å–„ã®ãŸã‚ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¨ãƒ©ãƒ¼ã®å ´åˆã«ã‚‚報告ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "ãƒã‚°å ±å‘Šã¯ã“ã¡ã‚‰ã«ãŠé¡˜ã„ã—ã¾ã™ <https://github.com/sphinx-doc/sphinx/issues> 。ã”å”力ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã™ï¼"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "ジョブ番å·ã¯æ­£æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "詳ã—ãã¯ã€<https://www.sphinx-doc.org/>を見ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nソースファイルã‹ã‚‰ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’生æˆã—ã¾ã™ã€‚\n\nsphinx-build ã¯ã€SOURCEDIR 内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã‚‚ã¨ã«ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’生æˆã—ã€\nOUTPUTDIR 内ã«é…ç½®ã—ã¾ã™ã€‚ã¾ãŸã‚³ãƒ³ãƒ•ã‚£ã‚°\n設定用㫠SOURCEDIR 内ã‹ã‚‰\n 'conf.py' を探ã—ã¾ã™ã€‚'sphinx-quickstart' ツールを使ã†ã¨\n 'conf.py' ã‚’å«ã‚€ãƒ†ãƒ³ãƒ—レートファイルを生æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n\nsphinx-build ã¯ã€ã•ã¾ã–ã¾ãªå½¢å¼ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚フォーマットã¯ã€\nコマンドラインã§ãƒ“ルダーåを指定ã—ã¦é¸æŠžã—ã¾ã™ã€‚デフォルトã¯\nHTML ã§ã™ã€‚ビルダーã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆåŒ–処ç†ã«é–¢é€£ã—ãŸä»–ã®ã‚¿ã‚¹ã‚¯ã‚‚実行ã§ãã¾ã™ã€‚\n\nデフォルトã§ã¯ã€å¤ã„ã‚‚ã®ã¯ã™ã¹ã¦ãƒ“ルドã•ã‚Œã¦ã„ã¾ã™ã€‚個別ã«ãƒ•ã‚¡ã‚¤ãƒ«åを指定ã™ã‚‹ã“ã¨ã§ã€\né¸æŠžã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿å‡ºåŠ›ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "ドキュメントソースファイルã¸ã®ãƒ‘ス"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "出力先ディレクトリã¸ã®ãƒ‘ス"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "å†æ§‹ç¯‰ã™ã‚‹ãŸã‚ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒªã‚¹ãƒˆã€‚ -a ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ç„¡è¦–ã•ã‚Œã¾ã™"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "一般的ãªã‚ªãƒ—ション"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "使用ã™ã‚‹ãƒ“ルダー(デフォルト:html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã込む(デフォルト: æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯å¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿ï¼‰"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "ä¿å­˜ã•ã‚ŒãŸç’°å¢ƒã¯ä½¿ã‚ãšã€å¸¸ã«å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’読ã¿è¾¼ã‚€"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "キャッシュã•ã‚ŒãŸç’°å¢ƒã¨Doctreeファイルã¸ã®ãƒ‘ス(デフォルト:OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "å¯èƒ½ãªå ´åˆã€ãƒ“ルドを N 個ã®ãƒ—ロセスã§ä¸¦åˆ—実行ã™ã‚‹ï¼ˆç‰¹åˆ¥ãªå€¤ \"auto\" 㯠N ã‚’ cpu-count ã«è¨­å®šã™ã‚‹ï¼‰"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "設定ファイル(conf.py)ãŒã‚る場所ã®ãƒ‘ス(デフォルト:SOURCEDIRã¨åŒã˜å ´æ‰€ï¼‰"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "設定ファイルを使用ã›ãšã€-Dオプションã®ã¿ã‚’使用"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "設定ファイルã®è¨­å®šã‚’上書ãã™ã‚‹"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "HTMLテンプレートã«å€¤ã‚’渡ã™"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "定義タグ: TAG ブロック\"ã®ã¿\"å«ã‚€"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "nit-picky モード。ä¸è¶³ã—ã¦ã„ã‚‹ã™ã¹ã¦ã®å‚ç…§ã«ã¤ã„ã¦è­¦å‘Šã™ã‚‹"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "コンソール出力オプション"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "精度ã®å¢—加(繰り返ã—å¯èƒ½ï¼‰"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "標準出力ã«ã¯å‡ºåŠ›ã›ãšã€æ¨™æº–エラー出力ã«è­¦å‘Šã‚’出ã™ã®ã¿"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "何も出力ã›ãšã€è­¦å‘Šã‚‚ã—ãªã„"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "色分ã‘ã§å‡ºåŠ›ã™ã‚‹ï¼ˆãƒ‡ãƒ•ã‚©ãƒ«ãƒˆï¼šè‡ªå‹•æ¤œå‡ºï¼‰"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "色分ã‘ã®å‡ºåŠ›ã‚’ã—ãªã„(デフォルト:自動検出)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "指定ファイルã«è­¦å‘Šï¼ˆãŠã‚ˆã³ã‚¨ãƒ©ãƒ¼ï¼‰ã‚’書ã込む"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "警告をエラーã¨ã—ã¦æ‰±ã†"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "-Wを指定ã™ã‚‹ã¨ã€è­¦å‘ŠãŒè¡¨ç¤ºã•ã‚ŒãŸã¨ãã¯å®Ÿè¡Œã‚’続ã‘ã‚‹"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "例外時ã«ãƒ•ãƒ«ãƒˆãƒ¬ãƒ¼ã‚¹ãƒãƒƒã‚¯ã‚’表示ã™ã‚‹"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "例外ãŒç™ºç”Ÿã—ãŸã¨ãã«Pdbを実行ã™ã‚‹"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "-aオプションã¨ãƒ•ã‚¡ã‚¤ãƒ«åを組ã¿åˆã‚ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "警告ファイル %r ã‚’é–‹ã‘ã¾ã›ã‚“: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-Dオプション引数㯠name = value ã®å½¢å¼ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-Aオプション引数㯠name = value ã®å½¢å¼ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "モジュールã‹ã‚‰è‡ªå‹•çš„ã« docstring を挿入ã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "doctest ブロック内ã®ã‚³ãƒ¼ãƒ‰ã‚¹ãƒ‹ãƒšãƒƒãƒˆã‚’自動的ã«ãƒ†ã‚¹ãƒˆã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "ç•°ãªã‚‹ãƒ—ロジェクトã®Sphinxドキュメント間ã®ãƒªãƒ³ã‚¯"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "ビルド時ã«è¡¨ç¤ºã¾ãŸã¯éžè¡¨ç¤ºã«ã§ãã‚‹ \"todo\" エントリを書ã"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "ドキュメントã®é©ç”¨ç¯„囲を確èªã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "PNG ã¾ãŸã¯ SVG ç”»åƒã¨ã—ã¦ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚ŒãŸæ•°å­¦ã‚’å«ã‚€"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "MathJax ã«ã‚ˆã£ã¦ãƒ–ラウザã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•ã‚ŒãŸæ•°å­¦ã‚’å«ã‚€"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "設定値ã«åŸºã¥ãコンテンツã®æ¡ä»¶ä»˜ã包å«"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "文書化ã•ã‚ŒãŸ Python オブジェクトã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¸ã®ãƒªãƒ³ã‚¯ã‚’å«ã‚ã‚‹"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "GitHub ページã«ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’公開ã™ã‚‹ãŸã‚ã® .nojekyll ファイルを作æˆã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "有効ãªãƒ‘スåを入力ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "何ã‹å…¥åŠ›ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "%sã®ã„ãšã‚Œã‹ã‚’入力ã—ã¦ãã ã•ã„。 "
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "'y' ã¾ãŸã¯ 'n' を入力ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "ファイルã®æ‹¡å¼µå­ã‚’入力ã—ã¦ãã ã•ã„。例: '.rst' ã¾ãŸã¯ '.txt'。"
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Sphinx %s クイックスタートユーティリティã¸ã‚ˆã†ã“ã。"
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "以下ã®è¨­å®šå€¤ã‚’入力ã—ã¦ãã ã•ã„(Enter キーã®ã¿æŠ¼ã—ãŸå ´åˆã€\nã‹ã£ã“ã§å›²ã¾ã‚ŒãŸå€¤ã‚’デフォルト値ã¨ã—ã¦å—ã‘入れã¾ã™ï¼‰ã€‚"
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "é¸æŠžã•ã‚ŒãŸãƒ«ãƒ¼ãƒˆãƒ‘ス: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "ドキュメントã®ãƒ«ãƒ¼ãƒˆãƒ‘スを入力ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "ドキュメントã®ãƒ«ãƒ¼ãƒˆãƒ‘ス"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "エラー:é¸æŠžã•ã‚ŒãŸãƒ«ãƒ¼ãƒˆãƒ‘スã«æ—¢å­˜ã® conf.py ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart ã¯ã€æ—¢å­˜ã® Sphinx プロジェクトを上書ãã—ã¾ã›ã‚“。"
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "æ–°ã—ã„ルートパスを入力ã—ã¦ãã ã•ã„(ã¾ãŸã¯ Enter を押ã™ã“ã¨ã§çµ‚了ã—ã¾ã™ï¼‰ã€‚"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Sphinx 出力用ã®ãƒ“ルドディレクトリをé…ç½®ã™ã‚‹æ–¹æ³•ã¯2ã¤ã‚ã‚Šã¾ã™ã€‚\nルートパス内ã«ã‚ã‚‹ \"_build\" ディレクトリを使ã†ã‹ã€\nルートパス内㫠\"source\" 㨠\"build\" ディレクトリを分ã‘る方法ã§ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "ソースディレクトリã¨ãƒ“ルドディレクトリを分ã‘る(y / n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "プロジェクトã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã« 2ã¤ä»¥ä¸Šã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒä½œæˆã•ã‚Œã¾ã™ã€‚\nカスタマイズã—ãŸHTMLテンプレート用ã®\"_templates\"ディレクトリã¨ã€ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã—ãŸã‚¹ã‚¿ã‚¤ãƒ«ã‚·ãƒ¼ãƒˆç­‰ã‚’ç½®ã\"_static\"ディレクトリãŒã‚ã‚Šã¾ã™ã€‚\nã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ \"_\" ã§å§‹ã¾ã£ã¦ã„ã¾ã™ãŒã€åˆ¥ã®æ–‡å­—(\".\"ãªã©)ã§å§‹ã¾ã‚‹ã‚ˆã†ã«æŒ‡å®šã§ãã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "テンプレートã¨é™çš„ディレクトリã®åå‰ãƒ—レフィックス"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "プロジェクトåã¯ã€ãƒ“ルドã•ã‚ŒãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®ã„ãã¤ã‹ã®å ´æ‰€ã«ã‚ã‚Šã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "プロジェクトå"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "著者å(複数å¯ï¼‰"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx ã«ã¯ã€ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã«å¯¾ã—㦠\"ãƒãƒ¼ã‚¸ãƒ§ãƒ³\" 㨠\"リリース\" ã¨ã„ã†æ¦‚念ãŒ\nã‚ã‚Šã¾ã™ã€‚å„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯è¤‡æ•°ã®ãƒªãƒªãƒ¼ã‚¹ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚\n例ãˆã°ã€Python ã ã¨ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒ 2.5 ã‚„ 3.0 ã®ã‚ˆã†ã«åˆ†ã‹ã‚Œã¦ã„るよã†ã«ã€\nリリースも 2.5.1 ã‚„ 3.0a1 ã®ã‚ˆã†ã«åˆ†ã‘ã¦æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ã‚‚ã—ã“ã®ã‚ˆã†ãªå¤šé‡æ§‹æˆãŒå¿…è¦ãªã„å ´åˆã¯ã€\n両方をåŒã˜å€¤ã«è¨­å®šã™ã‚‹ã ã‘ã§ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "プロジェクトã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "プロジェクトã®ãƒªãƒªãƒ¼ã‚¹"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "ドキュメントを英語以外ã®è¨€èªžã§æ›¸ãå ´åˆã¯ã€\n 言語コードã§è¨€èªžã‚’é¸æŠžã§ãã¾ã™ã€‚Sphinx ã¯ç”Ÿæˆã—ãŸãƒ†ã‚­ã‚¹ãƒˆã‚’ãã®è¨€èªžã«ç¿»è¨³ã—ã¾ã™ã€‚\n\nサãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るコードã®ãƒªã‚¹ãƒˆã«ã¤ã„ã¦ã¯ã€\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "プロジェクトã®è¨€èªž"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "ソースファイルã®ãƒ•ã‚¡ã‚¤ãƒ«åã®æ‹¡å¼µå­ã€‚一般的ã«ã¯ã€\".txt\"ã¾ãŸã¯\".rst \"ã®ã©ã¡ã‚‰ã‹ã§ã™ã€‚ã“ã®æ‹¡å¼µå­ã‚’æŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã ã‘ãŒãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "ソース・ファイルサフィックス"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "1ã¤ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã€\"コンテンツツリー\"ã®æœ€ä¸Šä½ãƒŽãƒ¼ãƒ‰ã¨\n見ãªã•ã‚Œã‚‹ã¨ã„ã†ç‚¹ã§ç‰¹åˆ¥ã§ã™ã€‚ã¤ã¾ã‚Šã€ãã‚Œã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ãŠã‘る階層構造ã®ãƒ«ãƒ¼ãƒˆã§ã‚ã‚‹\nã¨ã„ã†ã“ã¨ã§ã™ã€‚通常ã€ã“れ㯠\"index\" ã§ã™ãŒã€\n\"index\" ドキュメントãŒã‚«ã‚¹ã‚¿ãƒ ãƒ†ãƒ³ãƒ—レートã®å ´åˆã€ã“れを別ã®ãƒ•ã‚¡ã‚¤ãƒ«åã«è¨­å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "マスター文書ã®åå‰ï¼ˆæ‹¡å¼µå­ã‚’除ã)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "エラー:マスタファイル %s ã¯ã€é¸æŠžã•ã‚ŒãŸãƒ«ãƒ¼ãƒˆãƒ‘ス上ã§æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart ã¯æ—¢å­˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’上書ãã—ã¾ã›ã‚“。"
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "æ–°ã—ã„ファイルåを入力ã™ã‚‹ã‹ã€æ—¢å­˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã‚’変更ã—ã¦Enterキーを押ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "次㮠Sphinx 拡張機能ã®ã†ã¡ã©ã‚Œã‚’有効ã«ã™ã‚‹ã‹ã‚’指定ã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "注:imgmath 㨠mathjax ã‚’åŒæ™‚ã«æœ‰åŠ¹ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 imgmath ã¯æœªé¸æŠžã«ãªã‚Šã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Makefile 㨠Windows コマンドファイルã¯ç”Ÿæˆã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã§ã€\n後ã¯å®Ÿè¡Œã™ã‚‹ã ã‘ã§ã™ã€‚例ãˆã°ã€ç›´æŽ¥ sphinx-build を実行ã™ã‚‹ä»£ã‚ã‚Šã« `make html` ã‚’\n実行ã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Makefile を作æˆã—ã¾ã™ã‹ï¼Ÿ (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Windows コマンドファイルを作æˆã—ã¾ã™ã‹ï¼Ÿï¼ˆy/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "ファイル %s を作æˆã—ã¦ã„ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "ファイル %s ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã®ã§ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "終了:åˆæœŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹é€ ãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "マスターファイル %s を作æˆã—ã¦\nä»–ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "次ã®ã‚ˆã†ã« Makefile を使ã£ã¦ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’作æˆã—ã¾ã™ã€‚\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "次ã®ã‚ˆã†ã«ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’構築ã™ã‚‹ã«ã¯ sphinx-build コマンドを使用ã—ã¦ãã ã•ã„。\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "\"builder\" ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るビルダー㮠1 ã¤ã§ã™ã€‚ 例: html, latex, ã¾ãŸã¯ linkcheck。"
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nSphinx プロジェクトã«å¿…è¦ãªãƒ•ã‚¡ã‚¤ãƒ«ã‚’生æˆã—ã¾ã™ã€‚\n\nsphinx-quickstart ã¯ã€ã„ãã¤ã‹ã®è³ªå•ã§ã‚ãªãŸã®\nプロジェクトを生æˆã™ã‚‹ãŸã‚ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ã€sphinx-build ã¨ä¸€ç·’ã«ä½¿ãˆã‚‹\nサンプルã®Makefileを作æˆã—ã¦ãれるインタラクティブãªãƒ„ールã§ã™ã€‚\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "Quiet モード"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "project root"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "構æˆã‚ªãƒ—ション"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "記述ã—ãŸå ´åˆã€ã‚½ãƒ¼ã‚¹ã¨ãƒ“ルドã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’分割ã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "指定ã•ã‚ŒãŸå ´åˆã€ã‚½ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸‹ã«ãƒ“ルドディレクトリを作æˆã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "_templates ãªã©ã®ãƒ‰ãƒƒãƒˆã®ç½®ãæ›ãˆ"
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "プロジェクトã®åŸºæœ¬ã‚ªãƒ—ション"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "プロジェクトå"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "著者å"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "プロジェクトã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "プロジェクトã®ãƒªãƒªãƒ¼ã‚¹"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "ドキュメント言語"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "ソース・ファイルサフィックス"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "マスタードキュメントå"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "epubを利用ã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "拡張オプション"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "%s 拡張を有効ã«ã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "ä»»æ„ã®æ‹¡å¼µã‚’有効ã«ã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Makefileã¨batファイルã®ç”Ÿæˆã‚ªãƒ—ション"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "makefileを作æˆã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "makefileを作æˆã—ãªã„"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "batファイルを作æˆã™ã‚‹"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "batファイルを作æˆã—ãªã„"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "Makefile / make.bat å‘ã‘ã« make-mode を使ã†"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "Makefile / make.bat å‘ã‘ã« make-mode を使ã‚ãªã„ã§ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "プロジェクトテンプレート"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "テンプレートファイルã®ãƒ†ãƒ³ãƒ—レートディレクトリ"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "テンプレート変数ã®å®šç¾©"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"quiet\" ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ãŒã€ \"project\" ã¾ãŸã¯ \"author\" ã®ã„ãšã‚Œã‚‚指定ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "エラー:指定ã•ã‚ŒãŸãƒ‘スã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ãªã„ã‹ã€ã¾ãŸã¯ sphinx ファイルãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart ã¯ç©ºã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã®ã¿ç”Ÿæˆã—ã¾ã™ã€‚æ–°ã—ã„ルートパスを指定ã—ã¦ãã ã•ã„。"
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "無効ãªãƒ†ãƒ³ãƒ—レート変数: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "デデントã«ã‚ˆã‚‹ç©ºç™½ã®é™¤åŽ»"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "ä¸æ­£ãª caption ã§ã™: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "行番å·ã®æŒ‡å®šãŒç¯„囲外ã§ã™ (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "\"%s\" 㨠\"%s\" ã®ã‚ªãƒ—ションã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "インクルードファイル %r ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹èª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "エンコーディング %r ã¯ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ« %r ã®èª­ã¿è¾¼ã¿ã«é©ã•ãªã„よã†ã§ã™ã€‚:encoding: オプションを追加ã—ã¦ã¿ã¦ãã ã•ã„"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "%r ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ« %r 内ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr " \"lineno-match\" ã¯ä¸é€£ç¶šãª \"lines\" ã«å¯¾ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "指定ã•ã‚ŒãŸ %r ã«ä¸€è‡´ã™ã‚‹è¡ŒãŒã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ« %r ã«ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "toctree グローブ・パターン %r ã¯ã©ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ã‚‚マッãƒã—ã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree ã«é™¤å¤–ã—ãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¸ã®å‚ç…§ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree ã«å­˜åœ¨ã—ãªã„ドキュメントã¸ã®å‚ç…§ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "toctree ã§é‡è¤‡ã—ãŸã‚¨ãƒ³ãƒˆãƒªãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "ã“ã®ç¯€ã®ä½œè€…: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "モジュールã®ä½œè€…: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "コードã®ä½œè€…: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "作者: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "csv-table ディレクティブ㮠\":file:\" オプションã¯ã€çµ¶å¯¾ãƒ‘スをソースディレクトリã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã¨ã—ã¦èªè­˜ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ドキュメントを更新ã—ã¦ãã ã•ã„。"
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "パラメータ"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "戻り値"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "戻り値"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "戻り値ã®åž‹"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "ã®ãƒ¡ãƒ³ãƒå¤‰æ•°"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "変数"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "ã®é–¢æ•°"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "ã®ãƒžã‚¯ãƒ­"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "struct"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "union"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "列挙型"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "ã®ãƒ‡ãƒ¼ã‚¿åž‹"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "関数パラメータ"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§è¿½åŠ "
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§å¤‰æ›´"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã§éžæŽ¨å¥¨"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "引用 %s ã¯ã™ã§ã« %s ã§ä½¿ã‚ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "引用 [%s] ã¯å‚ç…§ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "テンプレートパラメータ"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "例外"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "クラス"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "コンセプト"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "テンプレート・パラメータ"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (組ã¿è¾¼ã¿é–¢æ•°)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s ã®ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (クラス)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (グローãƒãƒ«å¤‰æ•°ã¾ãŸã¯å®šæ•°)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s ã®å±žæ€§)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "引数"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (モジュール)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "メソッド"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "データ"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "ã®å±žæ€§"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "モジュール"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "%s ã®è¨˜è¿° %s ã¯ã™ã§ã« %s 㧠%s ãŒä½¿ã‚ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "æ•°å¼ %s ã®ãƒ©ãƒ™ãƒ«ã¯ã™ã§ã« %s ã§ä½¿ã‚ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "無効㪠math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "変数"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "例外"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s モジュール)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s モジュール)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (組ã¿è¾¼ã¿å¤‰æ•°)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (組ã¿è¾¼ã¿ã‚¯ãƒ©ã‚¹)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s ã®ã‚¯ãƒ©ã‚¹)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s ã®ã‚¯ãƒ©ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s ã®é™çš„メソッド)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (%s ã®ãƒ—ロパティ)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Pythonモジュール索引"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "モジュール"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "éžæŽ¨å¥¨"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "クラスメソッド"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "ã®é™çš„メソッド"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "プロパティ"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "相互å‚ç…§ %r ã«è¤‡æ•°ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (éžæŽ¨å¥¨)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (ディレクティブ)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (ディレクティブオプション)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (ロール)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "ディレクティブ"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "ディレクティブオプション"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "ロール"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "%s ã®è¨˜è¿° %s ã¯ã™ã§ã« %s ã§ä½¿ã‚ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境変数; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "ä¸æ­£ãªã‚ªãƒ—ションã®èª¬æ˜Ž %r ã¯ã€\"opt\"ã€\"-opt args\"ã€\"--opt args\"ã€\"/opt args\" ã¾ãŸã¯ \"+opt args\" ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚"
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s コマンドラインオプション"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "コマンドラインオプション"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "用語集ã®å‰ã«ç©ºè¡ŒãŒå¿…è¦ã§ã™"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "用語集ã®ç”¨èªžã¯ç©ºè¡Œã§åŒºåˆ‡ã£ã¦ã¯ã„ã‘ã¾ã›ã‚“"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "用語集ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒé–“é•ã£ã¦ã„るよã†ã§ã™ã€‚インデントを確èªã—ã¦ãã ã•ã„"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "用語集ã®é …ç›®"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "文法トークン"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "å‚照ラベル"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "環境変数"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "プログラムオプション"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "document"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "モジュール索引"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "検索ページ"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "ラベル %s ã¯ã™ã§ã« %s ã§ä½¿ã‚ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "%s ã®è¨˜è¿° %s ã¯ã™ã§ã« %s ã§ä½¿ã‚ã‚Œã¦ã„ã¾ã™"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig ã¯ç„¡åŠ¹ã§ã™ã€‚:numref: ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "クロスリファレンスã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚番å·ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "リンクã«ã‚­ãƒ£ãƒ—ションãŒã‚ã‚Šã¾ã›ã‚“: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "無効㪠numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "無効㪠numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "æ–°ã—ã„設定"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "変更ã•ã‚ŒãŸè¨­å®š"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "変更ã•ã‚ŒãŸæ‹¡å¼µ"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "ビルド環境ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæœ€æ–°ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "ソースディレクトリãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "ã“ã®ç’°å¢ƒã¯é¸æŠžã—ãŸãƒ“ルダーã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“。別㮠doctree ディレクトリーをé¸æŠžã—ã¦ãã ã•ã„。"
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "%s ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’スキャンã§ãã¾ã›ã‚“ã§ã—ãŸ: %r "
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "ドメイン %r ã¯ã¾ã ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "ドキュメントã¯ã©ã® toctree ã«ã‚‚å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "自己å‚ç…§ã—ã¦ã„ã‚‹ toctree ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚無視ã—ã¾ã™ã€‚"
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "%sã‚’å‚ç…§"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "%sã‚‚å‚ç…§"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "ä¸æ˜Žãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¨ãƒ³ãƒˆãƒªã‚¿ã‚¤ãƒ— %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "記å·"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "循環å‚ç…§ã—ã¦ã„ã‚‹ toctree ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã®ã§ç„¡è¦–ã—ã¾ã™: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree ã«ã¯ã‚¿ã‚¤ãƒˆãƒ«ã®ãªã„ドキュメント %r ã¸ã®å‚ç…§ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: リンクã¯ç”Ÿæˆã•ã‚Œã¾ã›ã‚“"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "ç”»åƒãƒ•ã‚¡ã‚¤ãƒ« %s ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "ダウンロードファイルãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s ã¯ã™ã§ã«ã‚»ã‚¯ã‚·ãƒ§ãƒ³ç•ªå·ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ (入れå­ã«ãªã£ãŸç•ªå·ã® toctree ?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "ファイル %s を作æˆã—ãŸã‚‚ã®ã¨ã—ã¾ã™ã€‚"
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\n<MODULE_PATH> 内をå†å¸°çš„ã«èª¿ã¹ã¦Python ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ãƒ‘ッケージã€\n後ã¯1ã¤ã®reST ファイルを <OUTPUT_PATH> 内ã«ã‚るパッケージ毎㮠automodule ディレクティブã«ä½œæˆã—ã¾ã™ã€‚\n\n<EXCLUDE_PATTERN> ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã€ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ã¾ãŸã¯ä¸¡æ–¹ã®ãƒ‘ターンを\n生æˆå‡¦ç†ã‹ã‚‰é™¤å¤–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n\n注:デフォルトã§ã¯ã€ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã¯ã™ã§ã«ä½œæˆã•ã‚Œã¦ã„るファイルを上書ãã—ã¾ã›ã‚“。"
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "ドキュメントã¸ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãƒ‘ス"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "生æˆå‡¦ç†ã‹ã‚‰é™¤å¤–ã™ã‚‹ãŸã‚ã®ã€ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ã¾ãŸã¯ä¸¡æ–¹ã®ãƒ‘ターンを記ã—㟠fnmatch-style å½¢å¼"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "ã™ã¹ã¦ã®ç”Ÿæˆãƒ‡ãƒ¼ã‚¿ã‚’é…ç½®ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "目次ã«è¡¨ç¤ºã™ã‚‹ã‚µãƒ–モジュールã®æœ€å¤§æ·±åº¦ (デフォルト: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "存在ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ä¸Šæ›¸ãã™ã‚‹"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "シンボリックリンクをãŸã©ã‚Šã¾ã™ã€‚collective.recipe.omeletteã¨çµ„ã¿åˆã‚ã›ã‚‹ã¨å¼·åŠ›ã§ã™ã€‚"
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "ファイルを作æˆã›ãšã«ã‚¹ã‚¯ãƒªãƒ—トを実行ã™ã‚‹"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "å„モジュールã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ãã‚Œãžã‚Œã®ãƒšãƒ¼ã‚¸ã«é…ç½®ã™ã‚‹"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "\"_private\" モジュールをå«ã‚ã¾ã™ã€‚"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "目次ã®ãƒ•ã‚¡ã‚¤ãƒ«å (デフォルト: モジュール)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "目次ファイルを生æˆã—ãªã„"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "module/package パッケージã®è¦‹å‡ºã—を生æˆã—ãªã„ (例: docstring ã«ã™ã§ã«ãれらãŒå«ã¾ã‚Œã¦ã„ã‚‹å ´åˆãªã©)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "サブモジュールã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å‰ã«ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ç½®ã"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "PEP-0420 æš—é»™ã®åå‰ç©ºé–“ã®æŒ‡å®šã«å¾“ã£ã¦ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãƒ‘スを解釈ã™ã‚‹"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "ファイルã®æ‹¡å¼µå­ (デフォルト: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "sphinx-quickstart を使ã£ã¦å®Œå…¨ãªãƒ—ロジェクトを生æˆã™ã‚‹"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "module_pathã‚’ sys.path ã«è¿½åŠ ã—ã¾ã™ã€‚--full ãŒä¸Žãˆã‚‰ã‚ŒãŸã¨ãã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "プロジェクトå (デフォルト: ルートモジュールå)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "プロジェクト著者å(複数å¯)。--full ãŒä¸Žãˆã‚‰ã‚ŒãŸã¨ãã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "プロジェクトãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€‚--full ãŒä¸Žãˆã‚‰ã‚ŒãŸã¨ãã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "プロジェクトã®ãƒªãƒªãƒ¼ã‚¹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€‚--full ãŒä¸Žãˆã‚‰ã‚ŒãŸã¨ãã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚デフォルト㯠--doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "拡張オプション"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "無効ãªæ­£è¦è¡¨ç¾ %r ㌠%s 内ã«è¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "ソース内ã®ã‚«ãƒãƒ¬ãƒƒã‚¸ã®ãƒ†ã‚¹ãƒˆãŒçµ‚了ã—ãŸã‚‰ã€%(outdir)spython.txt ã®çµæžœã‚’確èªã—ã¦ãã ã•ã„。"
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "coverage_c_regexes 内ã«ç„¡åŠ¹ãªæ­£è¦è¡¨ç¾ %r ãŒã‚ã‚Šã¾ã™"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "モジュール %s をインãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "'%s' オプション内㫠'+' ã¾ãŸã¯ '-' ãŒä¸è¶³ã—ã¦ã„ã¾ã™"
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' ã¯æ­£ã—ã„オプションã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' ã¯æ­£ã—ã„ pyversion オプションã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "無効㪠TestCode タイプ"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "ソース内㮠doctests ã®ãƒ†ã‚¹ãƒˆãŒçµ‚了ã—ãŸã‚‰ã€%(outdir)s/output.txt ã®çµæžœã‚’確èªã—ã¦ãã ã•ã„。"
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "%sブロックã«ã‚るコード/出力 ㌠%s ã«ã‚ã‚Šã¾ã›ã‚“: %s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "無効㪠doctest コードã¯ç„¡è¦–ã•ã‚Œã¾ã™: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== 最もé…ã„読ã¿å–り時間 ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "ãƒãƒ¼ãƒ‰ã‚³ãƒ¼ãƒ‰ã•ã‚ŒãŸãƒªãƒ³ã‚¯ %r 㯠拡張リンクã«ç½®ãæ›ãˆã‚‰ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ (代ã‚ã‚Šã« %r を使用ã—ã¦ã¿ã¦ãã ã•ã„)。"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Graphviz ディレクティブã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¨ãƒ•ã‚¡ã‚¤ãƒ«åã®ä¸¡æ–¹ã®å¼•æ•°ã‚’æŒã¤ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "外部㮠Graphviz ファイル %r ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹èª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "コンテンツã®ãªã„ \"graphviz\" ディレクティブを無視ã—ã¾ã™"
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "dot コマンド %r ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“ (graphviz 出力ã®ãŸã‚ã«å¿…è¦ã§ã™)。graphviz_dot ã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot ã¯ã‚¨ãƒ©ãƒ¼çµ‚了ã—ã¾ã—ãŸ:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dotã¯å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã‚’生æˆã—ã¾ã›ã‚“ã§ã—ãŸ:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format 㯠%r ã§ã¯ãªã 'png' ã‹ 'svg' ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "dot コード %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[グラフ: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[グラフ]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "変æ›å‡¦ç†ã¯ã‚¨ãƒ©ãƒ¼çµ‚了ã—ã¾ã—ãŸ:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "convert コマンド %r ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。image_converter ã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "LaTeX コマンド %r を実行ã§ãã¾ã›ã‚“ (æ•°å¼è¡¨ç¤ºã®ãŸã‚ã«å¿…è¦ã§ã™)。imgmath_latex ã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s コマンド %r を実行ã§ãã¾ã›ã‚“ (æ•°å¼è¡¨ç¤ºã®ãŸã‚ã«å¿…è¦ã§ã™)。imgmath_%s ã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "latex ã®è¡¨ç¤º %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "latex ã®ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³è¡¨ç¤º %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "intersphinx インベントリã¯ç§»å‹•ã—ã¾ã—ãŸ: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "%s ã‹ã‚‰ intersphinx インベントリをロード中..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "ã„ãã¤ã‹ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã§ã„ãã¤ã‹ã®å•é¡Œã«é­é‡ã—ã¾ã—ãŸãŒã€ä»£æ›¿æ‰‹æ®µã‚’æŒã£ã¦ã„ã¾ã—ãŸ:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "以下ã®å•é¡ŒãŒã‚ã‚‹ãŸã‚ã€ã„ãã¤ã‹ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã¯åˆ°é”ã§ãã¾ã›ã‚“ã§ã—ãŸ:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(in %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(in %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "intersphinx è­˜åˆ¥å­ %r ã¯æ–‡å­—列ã§ã¯ã‚ã‚Šã¾ã›ã‚“。無視ã—ã¾ã™"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "intersphinx_mapping [%s] ã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸã€‚無視ã—ã¾ã™: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[ソース]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "課題"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "TODO エントリーãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> ã¯ã€ %s ã® %d 行目ã§ã™)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "å…ƒã®ã‚¨ãƒ³ãƒˆãƒª"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "モジュールコードをãƒã‚¤ãƒ©ã‚¤ãƒˆã—ã¦ã„ã¾ã™..."
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[ドキュメント]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "モジュールコード"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "概è¦: モジュールコード"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>全モジュールã®ã†ã¡ã€ã‚³ãƒ¼ãƒ‰ã‚’読ã‚ã‚‹ã‚‚ã®</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "member-order オプションã«ç„¡åŠ¹ãªå€¤ãŒã‚ã‚Šã¾ã™: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "class-doc-from オプションã«ç„¡åŠ¹ãªå€¤ãŒã‚ã‚Šã¾ã™: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "auto%s (%r) ã®ç½²åãŒç„¡åŠ¹ã§ã™"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "%sã®å¼•æ•°ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s "
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "ドキュメントã®è‡ªå‹•ç”Ÿæˆ %r ã®ãŸã‚ã«ã©ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã®ã‹åˆ†ã‹ã‚Šã¾ã›ã‚“ (ドキュメント㫠\"module\"ã¾ãŸã¯ \"currentmodule\"ディレクティブをé…ç½®ã™ã‚‹ã‹ã€æ˜Žç¤ºçš„ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«åを指定ã—ã¦ãã ã•ã„)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "モックオブジェクトãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ: %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "%s ã®ã‚·ã‚°ãƒãƒãƒ£ã‚’フォーマット中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "automodule åã® \"::\" ã¯æ„味ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "automodule ã«ä¸Žãˆã‚‰ã‚ŒãŸç½²å引数ã€ã¾ãŸã¯æˆ»ã‚Šå€¤ã¨ãªã‚‹ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ ã¯æ–‡å­—列ã®ãƒªã‚¹ãƒˆã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。%r (%s モジュールã®ä¸­) ã§ã¯ãªã„ã§ã™ -- ignoring __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "members: オプションã§æŒ‡å®šã•ã‚ŒãŸå±žæ€§ãŒã‚ã‚Šã¾ã›ã‚“: モジュール %sã€å±žæ€§ %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "%s ã®é–¢æ•°ã‚·ã‚°ãƒãƒãƒ£ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "%s ã®ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ç½²åã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "ベースクラス: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "オブジェクト %s ã«å±žæ€§ %s ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "%sã®åˆ¥åã§ã™ã€‚"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "TypeVar(%s)ã®ã‚¨ã‚¤ãƒªã‚¢ã‚¹ã§ã™ã€‚"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "%s ã®ãƒ¡ã‚½ãƒƒãƒ‰ãƒ»ã‚·ã‚°ãƒãƒãƒ£ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "無効㪠__slots__ ㌠%s ã§è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚無視ã•ã‚Œã¾ã—ãŸã€‚"
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "%r ã®æ—¢å®šã®å¼•æ•°å€¤ã®è§£æžã«å¤±æ•—ã—ã¾ã—ãŸ: %s。"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "%r ã®ã‚·ã‚°ãƒãƒãƒ£ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ: パラメータãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s。"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "%rã®type_commentを解æžã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "autosummary ã¯é™¤å¤–ã—ãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ %r ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ã€‚無視ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary: stubファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“%r。autosummary_generate設定を確èªã—ã¦ãã ã•ã„。"
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "キャプション付ãオートサマリーã«ã¯ :toctree: オプションãŒå¿…è¦ã§ã™ã€‚"
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "%sã®åå‰ã‚’解æžã§ãã¾ã›ã‚“ã§ã—㟠"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "%sオブジェクトをインãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—㟠"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary ã¯å†…部的㫠rst ファイルを生æˆã—ã¾ã™ã€‚ã—ã‹ã—ã‚ãªãŸã® source_suffix 㯠rst ファイルã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚スキップã—ã¾ã™ã€‚"
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary: ドキュメント化ã™ã‚‹ %r ã®æ±ºå®šã«å¤±æ•—ã—ã¾ã—ãŸã€‚次ã®ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸ:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] %s ã® autosummary を生æˆä¸­"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] %s ã«æ›¸ãè¾¼ã¿ä¸­"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nautosummary ディレクティブを使ã£ã¦ ReStructuredText を生æˆã—ã¾ã™ã€‚\n\nsphinx-autogen 㯠sphinx.ext.autosummary.generate ã®ãƒ•ãƒ­ãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã§ã™ã€‚\n入力ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’å«ã‚€ autosummary ディレクティブã‹ã‚‰ reStructuredText ファイルを\n生æˆã—ã¾ã™ã€‚\n\nautosummary ディレクティブã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯\n``sphinx.ext.autosummary`` ã«è¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚Pythonモジュール㨠:: を使ã£ã¦èª­ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚\n\npydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "rST ファイルを生æˆã™ã‚‹ãŸã‚ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "ã™ã¹ã¦ã®ç”Ÿæˆãƒ‡ãƒ¼ã‚¿ã‚’é…ç½®ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "ファイルã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆæ‹¡å¼µå­ (デフォルト: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "カスタムテンプレートディレクトリ (デフォルト: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "インãƒãƒ¼ãƒˆã—ãŸãƒ¡ãƒ³ãƒãƒ¼ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ (デフォルト: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "モジュール __all__ 属性ã«å«ã¾ã‚Œã‚‹ãƒ¡ãƒ³ãƒãƒ¼ã®ã¿ã‚’対象ã¨ã—ãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’作æˆã—ã¾ã™ã€‚(デフォルト: %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "キーワード引数"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "サンプル"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "サンプル"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "メモ"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "ãã®ä»–ã®ãƒ‘ラメータ"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "å—ã‘å–ã‚‹"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "å‚ç…§"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "警告"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "列挙"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "無効ãªå€¤ã‚»ãƒƒãƒˆ (終了括弧ãŒã‚ã‚Šã¾ã›ã‚“): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "無効ãªå€¤ã‚»ãƒƒãƒˆ (開始括弧ãŒã‚ã‚Šã¾ã›ã‚“): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "ä¸æ­£ãªæ–‡å­—列リテラル (終了引用符ãŒã‚ã‚Šã¾ã›ã‚“): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "ä¸æ­£ãªæ–‡å­—列リテラル (開始引用符ãŒã‚ã‚Šã¾ã›ã‚“): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "å±é™º"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "エラー"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "ヒント"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "注釈"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "å‚考"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "å‰ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ã®ç¶šã"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "次ã®ãƒšãƒ¼ã‚¸ã«ç¶šã"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "アルファベット以外"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "番å·"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "ページ"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "目次"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "検索"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "検索"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "ソースコードを表示"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "概è¦"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Welcome! This is"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "the documentation for"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "索引 &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ナビゲーション"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«ã¤ã„ã¦"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "著作権"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最終更新: %(last_updated)s"
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s 内を検索"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "å‰ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "å‰ã®ç« ã¸"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "次ã®ãƒˆãƒ”ックã¸"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "次ã®ç« ã¸"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "検索機能を使ã†ã«ã¯ JavaScript を有効ã«ã—ã¦ãã ã•ã„。"
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "複数ã®å˜èªžã‚’検索ã™ã‚‹ã¨ã€æ¬¡ã‚’å«ã‚€ä¸€è‡´ã®ã¿ãŒè¡¨ç¤ºã•ã‚Œã¾ã™\n     ã™ã¹ã¦ã®ç”¨èªžã€‚"
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "検索"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "検索çµæžœ"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "クイック検索"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %(version)s ã®å¤‰æ›´ç‚¹ &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "検索中"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "検索を準備ã—ã¦ã„ã¾ã™..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", in "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "検索çµæžœã‚’éš ã™"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "サイドãƒãƒ¼ã‚’ãŸãŸã‚€"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "サイドãƒãƒ¼ã‚’展開"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "コンテンツ"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "4列ベースã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ã‚ãªãŸãŒä½¿ã£ã¦ã„ã‚‹æ‹¡å¼µå­ã®ãƒã‚°ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Footnote [%s] ã¯å‚ç…§ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Footnote [#] ã¯å‚ç…§ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "翻訳ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® footnote å‚ç…§ãŒçŸ›ç›¾ã—ã¦ã„ã¾ã™ã€‚原文: {0}ã€ç¿»è¨³: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "翻訳ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å‚ç…§ãŒçŸ›ç›¾ã—ã¦ã„ã¾ã™ã€‚原文: {0}ã€ç¿»è¨³: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "翻訳ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¼•ç”¨å‚ç…§ãŒçŸ›ç›¾ã—ã¦ã„ã¾ã™ã€‚原文: {0}ã€ç¿»è¨³: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "翻訳ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç”¨èªžå‚ç…§ãŒçŸ›ç›¾ã—ã¦ã„ã¾ã™ã€‚原文: {0}ã€ç¿»è¨³: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "相互å‚照用ã®ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ†ã‚­ã‚¹ãƒˆã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãƒã‚°ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。"
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "'any' クロスリファレンス %r ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãŒ1ã¤ä»¥ä¸Šã¿ã¤ã‹ã‚Šã¾ã—ãŸã€‚ %s ã«å‚照を設定ã—ã¾ã™ã€‚"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s å‚照先ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r å‚照先ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "リモート画åƒã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "リモート画åƒã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "ä¸æ˜Žãªç”»åƒãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "デコードã§ããªã„ソース文字ã§ã™ã€‚\"?\" ã«ç½®ãæ›ãˆã¾ã™: %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "スキップã—ã¾ã—ãŸ"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "失敗ã—ã¾ã—ãŸ"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "ä¸æ˜Žãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã¾ãŸã¯ãƒ­ãƒ¼ãƒ«å: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "ä¸æ˜ŽãªãƒŽãƒ¼ãƒ‰ã‚¿ã‚¤ãƒ—: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "読ã¿å–りエラー: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "日付形å¼ãŒç„¡åŠ¹ã§ã™ã€‚直接出力ã—ãŸã„å ´åˆã¯ã€æ–‡å­—列を一é‡å¼•ç”¨ç¬¦ã§å›²ã¿ã¾ã™: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "toctree ã«å­˜åœ¨ã—ãªã„ファイルã¸ã®å‚ç…§ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "only ディレクティブã®æ¡ä»¶å¼ã®è©•ä¾¡ä¸­ã«ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "デフォルトã®ãƒ­ãƒ¼ãƒ« %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "%s ã« numfig_format ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "ã„ãã¤ã‹ã® ID ㌠%s ノードã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "ç”»åƒã‚µã‚¤ã‚ºã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚:scale: オプションã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "ä¸æ˜Žãªã‚¯ãƒ©ã‚¹ %r ã® toplevel_sectioning %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: ãŒå¤§ãã™ãŽã‚‹ã®ã§ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "ドキュメントã®ã‚¿ã‚¤ãƒˆãƒ«ã¯ã€å˜ä¸€ã® Text ノードã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "セクションã€ãƒˆãƒ”ックã€è¡¨ã€è¨“戒ã¾ãŸã¯ã‚µã‚¤ãƒ‰ãƒãƒ¼ã«ãªã„タイトルノードãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "注記"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "tabularcolumns 㨠:widths: オプションã®ä¸¡æ–¹ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚:widths: ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "ディメンションå˜ä½ %s ãŒç„¡åŠ¹ã§ã™ã€‚無視ã•ã‚Œã¾ã™ã€‚"
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "ä¸æ˜Žãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¨ãƒ³ãƒˆãƒªã‚¿ã‚¤ãƒ— %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[ç”»åƒ: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[ç”»åƒ]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "キャプションã¯å›³ã®ä¸­ã«ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "未実装ã®ãƒŽãƒ¼ãƒ‰ã‚¿ã‚¤ãƒ—: %r"
diff --git a/sphinx/locale/ka/LC_MESSAGES/sphinx.js b/sphinx/locale/ka/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..40eaf84
--- /dev/null
+++ b/sphinx/locale/ka/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ka",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "\u10d0\u10db \u10d3\u10dd\u10d9\u10e3\u10db\u10d4\u10dc\u10e2\u10d4\u10d1\u10d8\u10e1 \u10e8\u10d4\u10e1\u10d0\u10ee\u10d4\u10d1",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "C API \u10ea\u10d5\u10da\u10d8\u10da\u10d4\u10d1\u10d4\u10d1\u10d8",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "\u10d2\u10d5\u10d4\u10e0\u10d3\u10d8\u10d7\u10d8 \u10d6\u10dd\u10da\u10d8\u10e1 \u10e9\u10d0\u10d9\u10d4\u10ea\u10d5\u10d0",
+ "Complete Table of Contents": "\u10e1\u10e0\u10e3\u10da\u10d8 \u10e1\u10d0\u10e0\u10e9\u10d4\u10d5\u10d8",
+ "Contents": "\u10e8\u10d8\u10d2\u10d7\u10d0\u10d5\u10e1\u10d8",
+ "Copyright": "\u10e1\u10d0\u10d0\u10d5\u10e2\u10dd\u10e0\u10dd \u10e3\u10e4\u10da\u10d4\u10d1\u10d4\u10d1\u10d8",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "\u10d2\u10d5\u10d4\u10e0\u10d3\u10d8\u10d7\u10d8 \u10d6\u10dd\u10da\u10d8\u10e1 \u10d2\u10d0\u10e4\u10d0\u10e0\u10d7\u10dd\u10d4\u10d1\u10d0",
+ "Full index on one page": "\u10e1\u10e0\u10e3\u10da\u10d8 \u10d8\u10dc\u10d3\u10d4\u10e5\u10e1\u10d8 \u10d4\u10e0\u10d7 \u10d2\u10d5\u10d4\u10e0\u10d3\u10d6\u10d4",
+ "General Index": "\u10d6\u10dd\u10d2\u10d0\u10d3\u10d8 \u10d8\u10dc\u10d3\u10d4\u10e5\u10e1\u10d8",
+ "Global Module Index": "\u10d2\u10da\u10dd\u10d1\u10d0\u10da\u10e3\u10e0\u10d8 \u10db\u10dd\u10d3\u10e3\u10da\u10d4\u10d1\u10d8\u10e1 \u10d8\u10dc\u10d3\u10d4\u10e5\u10e1\u10d8",
+ "Go": "\u10d2\u10d0\u10d3\u10d0\u10e1\u10d5\u10da\u10d0",
+ "Hide Search Matches": "\u10eb\u10d4\u10d1\u10dc\u10d8\u10e1 \u10d3\u10d0\u10db\u10d7\u10ee\u10d5\u10d4\u10d5\u10d4\u10d1\u10d8\u10e1 \u10d3\u10d0\u10db\u10d0\u10da\u10d5\u10d0",
+ "Index": "\u10d8\u10dc\u10d3\u10d4\u10e5\u10e1\u10d8",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "\u10d8\u10dc\u10d3\u10d4\u10e5\u10e1\u10d8\u10e1 \u10d2\u10d5\u10d4\u10e0\u10d3\u10d4\u10d1\u10d8 \u10d0\u10e1\u10dd\u10d4\u10d1\u10d8\u10e1 \u10db\u10d8\u10ee\u10d4\u10d3\u10d5\u10d8\u10d7",
+ "Indices and tables:": "\u10d8\u10dc\u10d3\u10d4\u10e5\u10e1\u10d4\u10d1\u10d8 \u10d3\u10d0 \u10ea\u10ee\u10e0\u10d8\u10da\u10d4\u10d1\u10d8:",
+ "Last updated on %(last_updated)s.": "\u10d1\u10dd\u10da\u10dd \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d8\u10e1 \u10d3\u10e0\u10dd %(last_updated)s.",
+ "Library changes": "\u10d1\u10d8\u10d1\u10da\u10d8\u10dd\u10d7\u10d4\u10d9\u10d8\u10e1 \u10ea\u10d5\u10da\u10d8\u10da\u10d4\u10d1\u10d4\u10d1\u10d8",
+ "Navigation": "\u10dc\u10d0\u10d5\u10d8\u10d2\u10d0\u10ea\u10d8\u10d0",
+ "Next topic": "\u10e8\u10d4\u10db\u10d3\u10d4\u10d2\u10d8 \u10d7\u10d4\u10db\u10d0",
+ "Other changes": "\u10e1\u10ee\u10d5\u10d0 \u10ea\u10d5\u10da\u10d8\u10da\u10d4\u10d1\u10d4\u10d1\u10d8",
+ "Overview": "\u10db\u10d8\u10db\u10dd\u10ee\u10d8\u10da\u10d5\u10d0",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "\u10eb\u10d4\u10d1\u10dc\u10d8\u10e1 \u10db\u10dd\u10db\u10d6\u10d0\u10d3\u10d4\u10d1\u10d0...",
+ "Previous topic": "\u10ec\u10d8\u10dc\u10d0 \u10d7\u10d4\u10db\u10d0",
+ "Quick search": "\u10e1\u10ec\u10e0\u10d0\u10e4\u10d8 \u10eb\u10d4\u10d1\u10dc\u10d0",
+ "Search": "\u10eb\u10d4\u10d1\u10dc\u10d0",
+ "Search Page": "\u10eb\u10d4\u10d1\u10dc\u10d8\u10e1 \u10d2\u10d5\u10d4\u10e0\u10d3\u10d8",
+ "Search Results": "\u10eb\u10d4\u10d1\u10dc\u10e1 \u10e8\u10d4\u10d3\u10d4\u10d2\u10d4\u10d1\u10d8",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "%(docstitle)s-\u10e8\u10d8 \u10eb\u10d4\u10d1\u10dc\u10d0",
+ "Searching": "\u10eb\u10d4\u10d1\u10dc\u10d0",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u10ec\u10e7\u10d0\u10e0\u10dd\u10e1 \u10e9\u10d5\u10d4\u10dc\u10d4\u10d1\u10d0",
+ "Table of Contents": "\u10e1\u10d0\u10e0\u10e9\u10d4\u10d5\u10d8",
+ "This Page": "\u10d4\u10e1 \u10d2\u10d5\u10d4\u10e0\u10d3\u10d8",
+ "Welcome! This is": "\u10d9\u10d4\u10d7\u10d8\u10da\u10d8 \u10d8\u10e7\u10dd\u10e1 \u10d7\u10e5\u10d5\u10d4\u10dc\u10d8 \u10db\u10dd\u10d1\u10e0\u10eb\u10d0\u10dc\u10d4\u10d1\u10d0",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "\u10e7\u10d5\u10d4\u10da\u10d0 \u10e4\u10e3\u10dc\u10e5\u10ea\u10d8\u10d0, \u10d9\u10da\u10d0\u10e1\u10d8, \u10ec\u10d4\u10e1\u10d8",
+ "can be huge": "\u10e8\u10d4\u10d8\u10eb\u10da\u10d4\u10d1\u10d0 \u10e3\u10d6\u10d0\u10e0\u10db\u10d0\u10d6\u10d0\u10e0\u10d8 \u10d8\u10e7\u10dd\u10e1",
+ "last updated": "",
+ "lists all sections and subsections": "\u10e1\u10d4\u10e5\u10ea\u10d8\u10d4\u10d1\u10d8\u10e1\u10d0 \u10d3\u10d0 \u10e5\u10d5\u10d4\u10e1\u10d4\u10e5\u10ea\u10d8\u10d4\u10d1\u10d8\u10e1 \u10e9\u10d0\u10db\u10dd\u10dc\u10d0\u10d7\u10d5\u10d0\u10da\u10d8",
+ "next chapter": "\u10e8\u10d4\u10db\u10d3\u10d4\u10d2\u10d8 \u10d7\u10d0\u10d5\u10d8",
+ "previous chapter": "\u10ec\u10d8\u10dc\u10d0 \u10d7\u10d0\u10d5\u10d8",
+ "quick access to all modules": "\u10e1\u10ec\u10e0\u10d0\u10e4\u10d8 \u10ec\u10d5\u10d3\u10dd\u10db\u10d0 \u10e7\u10d5\u10d4\u10da\u10d0 \u10db\u10dd\u10d3\u10e3\u10da\u10d7\u10d0\u10dc",
+ "search": "\u10eb\u10d4\u10d1\u10dc\u10d0",
+ "search this documentation": "\u10d0\u10db \u10d3\u10dd\u10d9\u10e3\u10db\u10d4\u10dc\u10e2\u10d0\u10ea\u10d8\u10d0\u10e8\u10d8 \u10eb\u10d4\u10d1\u10dc\u10d0",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n!=1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ka/LC_MESSAGES/sphinx.mo b/sphinx/locale/ka/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..4c3c429
--- /dev/null
+++ b/sphinx/locale/ka/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ka/LC_MESSAGES/sphinx.po b/sphinx/locale/ka/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..5c1c52d
--- /dev/null
+++ b/sphinx/locale/ka/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Georgian (http://app.transifex.com/sphinx-doc/sphinx-1/language/ka/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ka\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "წყáƒáƒ áƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ვერ ვიპáƒáƒ•áƒ” (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (%s) სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ áƒáƒ"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ერთი დრიგივე áƒáƒ  შეიძლებáƒ, იყáƒáƒ¡"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბულირSphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "პრáƒáƒ”ქტს Sphinx-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ v%s სჭირდებრდრáƒáƒ›áƒ˜áƒ¢áƒáƒ› áƒáƒ› ვერსიით ვერ áƒáƒ˜áƒ’ებáƒ."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შექმნáƒ"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის %s მáƒáƒ áƒ’ებისáƒáƒ¡:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup', რáƒáƒ’áƒáƒ áƒª ის conf.py-შირáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რილი, Python-ის მიერ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ. შეცვáƒáƒšáƒ”თ áƒáƒ¦áƒ¬áƒ”რáƒ, რáƒáƒ—რის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბáƒáƒ“ი ფუნქცირგáƒáƒ®áƒ“ეს. ეს სáƒáƒ­áƒ˜áƒ áƒáƒ, რáƒáƒ—რconf.py-ი, რáƒáƒ’áƒáƒ áƒª Sphinx-ის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ, მáƒáƒ˜áƒ¥áƒªáƒ”ს."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "თáƒáƒ áƒ’მáƒáƒœáƒ”ბის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ[%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "შესრულებულიáƒ"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "ჩáƒáƒ¨áƒ”ნებული შეტყáƒáƒ‘ინებებისთვის ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜ áƒáƒ áƒáƒ"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "დáƒáƒ›áƒŸáƒáƒ•áƒ”ბული გáƒáƒ áƒ”მáƒáƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "შეცდáƒáƒ›áƒ˜áƒ—: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "áƒáƒ›áƒ’ები áƒáƒ áƒ©áƒ”ული áƒáƒ áƒáƒ. ვიყენებ ნáƒáƒ’ულისხმევს: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "წáƒáƒ áƒ›áƒáƒ¢áƒ”ბული"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ“რპრáƒáƒ‘ლემებით"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "áƒáƒ’ებრ%s, %s გáƒáƒ¤áƒ áƒ—ხილებრ(გáƒáƒ¤áƒ áƒ—ხილებები áƒáƒ¦áƒ¥áƒ›áƒ£áƒšáƒ˜ იქნებáƒ, რáƒáƒ’áƒáƒ áƒª შეცდáƒáƒ›áƒ”ბი)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "%s-ის áƒáƒ’ებáƒ, %s გáƒáƒ¤áƒ áƒ—ხილებáƒ."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "%s-ის áƒáƒ’ებáƒ, %s გáƒáƒ¤áƒ áƒ—ხილებáƒ."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "%s-ის áƒáƒ’ებáƒ."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "კვáƒáƒœáƒ«áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ %r უკვე რეგისტრირებულიáƒ. მისი მნáƒáƒ®áƒ•áƒ”ლები გáƒáƒ“áƒáƒ¤áƒáƒ áƒ£áƒšáƒ˜ იქნებáƒ"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "დირექტივრ%r უკვე რეგისტრირებულიáƒ. ის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ£áƒšáƒ˜ იქნებáƒ"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "რáƒáƒšáƒ˜ %r უკვე რეგისტრირებულიáƒ. ის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ£áƒšáƒ˜ იქნებáƒ"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ%s áƒáƒ  áƒáƒ¦áƒ¬áƒ”რს, áƒáƒ áƒ˜áƒ¡ თუ áƒáƒ áƒ ის უსáƒáƒ¤áƒ áƒ—ხრპáƒáƒ áƒáƒšáƒ”ლური წáƒáƒ™áƒ˜áƒ—ხვისთვის. ვთვლით, რáƒáƒ› áƒáƒ áƒ - კითხეთ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის áƒáƒ•áƒ¢áƒáƒ áƒ¡ დრáƒáƒ¨áƒ™áƒáƒ áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რეთ ის"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "%s გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრპáƒáƒ áƒáƒšáƒ”ლური წáƒáƒ™áƒ˜áƒ—ხვისთვის უსáƒáƒ¤áƒ áƒ—ხრáƒáƒ áƒáƒ"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ%s áƒáƒ  áƒáƒ¦áƒ¬áƒ”რს, áƒáƒ áƒ˜áƒ¡ თუ áƒáƒ áƒ ის უსáƒáƒ¤áƒ áƒ—ხრპáƒáƒ áƒáƒšáƒ”ლური ჩáƒáƒ¬áƒ”რისთვის. ვთვლით, რáƒáƒ› áƒáƒ áƒ - კითხეთ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის áƒáƒ•áƒ¢áƒáƒ áƒ¡ დრáƒáƒ¨áƒ™áƒáƒ áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რეთ ის"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "%s გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრპáƒáƒ áƒáƒšáƒ”ლური ჩáƒáƒ¬áƒ”რისთვის უსáƒáƒ¤áƒ áƒ—ხრáƒáƒ áƒáƒ"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "ვáƒáƒ™áƒ”თებ სერიულს %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ფáƒáƒ˜áƒšáƒ¡ conf.py áƒáƒ  შეიცáƒáƒ•áƒ¡ (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒ: 'language = None'. გáƒáƒœáƒáƒáƒ®áƒšáƒ”თ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ დრმიუთითეთ სწáƒáƒ áƒ˜ ენáƒ. გáƒáƒ“áƒáƒ˜áƒ áƒ—ვებრ'en'-ზე (ინგლისური)."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "ლექსიკáƒáƒœáƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის %r გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ შეუძლებელიáƒ. ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებრ(ინდივიდუáƒáƒšáƒ£áƒ áƒ˜ ელემენტების დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ %r)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "რიცხვი %r კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘ისთვის %r áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ. ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებáƒ"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ტიპის მქáƒáƒœáƒ” კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის %r გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ შეუძლებელიáƒ. ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებáƒ"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒáƒ¨áƒ˜ მითითებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ%r უცნáƒáƒ‘იáƒ. ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებáƒ"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "áƒáƒ¡áƒ”თი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ%r უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "თქვენს კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირშეცდáƒáƒ›áƒ: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "კáƒáƒœáƒ¤áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ›áƒ (áƒáƒœ მáƒáƒ“ულმáƒ, რáƒáƒ›áƒ”ლის მáƒáƒœ შემáƒáƒ˜áƒ¢áƒáƒœáƒ) sys.exit() გáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒ"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "თქვენს კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ áƒ”ბáƒáƒ“ი შეცდáƒáƒ›áƒáƒ:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ¡ 'source_suffix' სტრიქáƒáƒœáƒ¡, სტრიქáƒáƒœáƒ”ბის სიáƒáƒ¡ áƒáƒœ ლექსიკáƒáƒœáƒ¡ ელáƒáƒ“ებáƒ. თქვენ კი '%r' მიუთითეთ."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "სექცირ%s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "ნáƒáƒ®. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "ცხრილი %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜ %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ`{name}` შეიძლებრიყáƒáƒ¡ ერთ-ერთ სიიდáƒáƒœ `{candidates}`, თქვენ კი `{current}` მიუთითეთ."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘ის `{name}` ტიპირ`{current.__name__}`, მე კი {permitted}-ს ველáƒáƒ“ებáƒáƒ“ი."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘ის `{name}` ტიპირ`{current.__name__}`, ნáƒáƒ’ულისხმებირ`{default.__name__}`."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r ვერ ვიპáƒáƒ•áƒ”. ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებáƒ."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Sphinx v2.0-ის შემდეგ root_doc-ს ნáƒáƒ’ულისხმევáƒáƒ“ \"index\"-ს იყენებს. დáƒáƒáƒ›áƒáƒ¢áƒ”თ თქვენს conf.py-ში 'root_doc = 'contents'\"."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "მáƒáƒ•áƒšáƒ”ნრ%r უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "უცნáƒáƒ‘ი მáƒáƒ•áƒšáƒ”ნის სáƒáƒ®áƒ”ლი: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელმრ%r მáƒáƒ•áƒšáƒ”ნისთვის %r გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜ გáƒáƒ“მáƒáƒ’ვცáƒ"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "%s გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრსáƒáƒ­áƒ˜áƒ áƒáƒ needs_extensons პáƒáƒ áƒáƒ›áƒ”ტრის მიერ, მáƒáƒ’რáƒáƒ› ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული áƒáƒ áƒáƒ."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "პრáƒáƒ”ქტს გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის %s ვერსირმინიმუმ %s სჭირდებრდრáƒáƒ›áƒ˜áƒ¢áƒáƒ› ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ვერსიით (%s) áƒáƒ’ებული ვერ იქნებáƒ."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Pygments lexer-ის სáƒáƒ®áƒ”ლი %r უცნáƒáƒ‘იáƒ"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტისთვის \"%s\" áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირერთზე მეტი ფáƒáƒ˜áƒšáƒ˜: %r\náƒáƒ¡áƒáƒ’ებáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ %r."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "áƒáƒ›áƒ’ებ კლáƒáƒ¡áƒ¡ %s \"name\" áƒáƒ¢áƒ áƒ˜áƒ‘უტი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "áƒáƒ›áƒ’ები %r უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს (მáƒáƒ“ულში %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "áƒáƒ›áƒ’ების სáƒáƒ®áƒ”ლი %s რეგისტრირებული áƒáƒ áƒáƒ áƒáƒœ შესვლის წერტილში ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜ áƒáƒ áƒáƒ"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "áƒáƒ›áƒ’ების სáƒáƒ®áƒ”ლი %s რეგისტრირებული áƒáƒ áƒáƒ"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "დáƒáƒ›áƒ”ნი %s უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "დáƒáƒ›áƒ”ნის %s ჯერ რეგისტრირებული áƒáƒ áƒáƒ"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "%r დირექტივრდáƒáƒ›áƒ”ნისთვის %s უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "%r რáƒáƒšáƒ˜ დáƒáƒ›áƒ”ნისთვის %s უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "%r ინდექსი დáƒáƒ›áƒ”ნისთვის %s უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "%r áƒáƒ‘იექტის ტიპი უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "%r ჯვáƒáƒ áƒ”დინი მიმáƒáƒ áƒ—ვის ტიპი უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser %r-სთვის უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "წყáƒáƒ áƒáƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი %s-სთვის რეგისტრირებული áƒáƒ áƒáƒ"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "მთáƒáƒ áƒ’მნელი %r-სთვის უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "kwarg-ები add_node()-სთვის (შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜, გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜) ფუნქციის კáƒáƒ áƒ¢áƒ”ჟი უნდრიყáƒáƒ¡: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "მáƒáƒ—ემáƒáƒ¢áƒ˜áƒ™áƒ˜áƒ¡ რენდერერი %s უკვე რეგისტრირებულიáƒ"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ%r %s ვერსიის შემდეგ Sphinx-ის ნáƒáƒ¬áƒ˜áƒšáƒ˜áƒ. გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრგáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულიáƒ."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის (%s) შემáƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ %r ფუნქცირsetup() áƒáƒ  áƒáƒ¥áƒ•áƒ¡. დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ბრძáƒáƒœáƒ“ებით, რáƒáƒ› ეს ნáƒáƒ›áƒ“ვილáƒáƒ“ Sphinx-ის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის მáƒáƒ“ულიáƒ?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "áƒáƒ› პრáƒáƒ”ქტში გáƒáƒ›áƒáƒ§áƒ”ნებულ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ %s Sphinx-ის მინიმუმ v%s სჭირდებáƒ. áƒáƒ›áƒ˜áƒ¢áƒáƒ› მáƒáƒ¡ áƒáƒ› ვერსიით ვერ áƒáƒáƒ’ებთ."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ› %r setup() ფუნქციიდáƒáƒœ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი áƒáƒ‘იექტი დáƒáƒáƒ‘რუნáƒ. მáƒáƒœ áƒáƒœ áƒáƒ áƒáƒ¤áƒ”რი, áƒáƒœ მეტáƒáƒ›áƒáƒœáƒáƒªáƒ”მების ლექსიკáƒáƒœáƒ˜ უნდრდáƒáƒáƒ‘რუნáƒáƒ¡"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბის შეთáƒáƒ•áƒáƒ–ებები; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ PEP ნáƒáƒ›áƒ”რი %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ RFC ნáƒáƒ›áƒ”რი %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "თემáƒáƒ¡ %r პáƒáƒ áƒáƒ›áƒ”ტრი \"theme\" áƒáƒ  áƒáƒ¥áƒ•áƒ¡"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "თემáƒáƒ¡ %r პáƒáƒ áƒáƒ›áƒ”ტრი \"inherit\" áƒáƒ  áƒáƒ¥áƒ•áƒ¡"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "თემრსáƒáƒ®áƒ”ლით %r ვერ ვიპáƒáƒ•áƒ”. მემკვიდრეáƒáƒ‘ით %r-სგáƒáƒœ"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი %s.%s თემის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბში áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "თემის პáƒáƒ áƒáƒ›áƒ”ტრი %r მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "თემრსáƒáƒ®áƒ”ლáƒáƒ“ %r áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ (theme.conf áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "áƒáƒ’ებრ[mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ... "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "სულ %d po ფáƒáƒ˜áƒšáƒ˜"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "%d po ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის სáƒáƒ›áƒ˜áƒ–ნე მითითებული áƒáƒ áƒáƒ"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "%d po ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის სáƒáƒ›áƒ˜áƒ–ნე მáƒáƒ«áƒ•áƒ”ლებულიáƒ"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "ყველრკáƒáƒ“ის ფáƒáƒ˜áƒšáƒ˜"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ¨áƒ˜ მითითებული ფáƒáƒ˜áƒšáƒ˜ %r áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. "
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ¨áƒ˜ მითითებული ფáƒáƒ˜áƒšáƒ˜ %r კáƒáƒ“ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში áƒáƒ áƒáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ¨áƒ˜ მითითებული ფáƒáƒ˜áƒšáƒ˜ %r სწáƒáƒ áƒ˜ დáƒáƒ™áƒ£áƒ›áƒ”ნტი áƒáƒ áƒáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ¨áƒ˜ მითითებულირ%d კáƒáƒ“ის ფáƒáƒ˜áƒšáƒ˜"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "%d კáƒáƒ“ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე მáƒáƒ«áƒ•áƒ”ლებულიáƒ"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "áƒáƒ’ებრ[%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "მáƒáƒ«áƒ•áƒ”ლებული ფáƒáƒ˜áƒšáƒ”ბის ძებნáƒ... "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ %d"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "áƒáƒ áƒáƒ¤áƒ”რირნáƒáƒžáƒáƒ•áƒœáƒ˜"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "დáƒáƒ›áƒŸáƒáƒ•áƒ”ბის გáƒáƒ áƒ”მáƒ"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრულáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "მáƒáƒ«áƒ•áƒ”ლებული სáƒáƒ›áƒ˜áƒ–ნეები áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "გáƒáƒ áƒ”მáƒáƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s დáƒáƒ”მáƒáƒ¢áƒ, %s შეიცვáƒáƒšáƒ, %s წáƒáƒ˜áƒ¨áƒáƒšáƒ"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "წყáƒáƒ áƒáƒ”ბის კითხვáƒ... "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "ჩáƒáƒ¡áƒáƒ¬áƒ”რი დáƒáƒ™áƒ£áƒ›áƒ”ნტის სáƒáƒ®áƒ”ლები: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტების მáƒáƒ›áƒ–áƒáƒ“ებáƒ"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირდუბლირებული სáƒáƒ áƒ©áƒ”ვის ჩáƒáƒœáƒáƒ¬áƒ”რი: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების კáƒáƒžáƒ˜áƒ áƒ”ბáƒ... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ˜ %r ვერ წáƒáƒ•áƒ˜áƒ™áƒ˜áƒ—ხე: ის, სáƒáƒ›áƒáƒ’იერáƒáƒ“, დáƒáƒ™áƒáƒžáƒ˜áƒ áƒ“ებáƒ"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ %r კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ %r ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow ვერ ვიპáƒáƒ•áƒ” - სურáƒáƒ—ის ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "mimetype ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს META-INF/container.xml ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "content.opf ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "უცნáƒáƒ‘ი mimetype ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის %s. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "toc.ncx ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "%s ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "გáƒáƒ“áƒáƒ®áƒ”დვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "ვერსიáƒáƒ¨áƒ˜ %s ცვლილებები áƒáƒ áƒáƒ."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "შეჯáƒáƒ›áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "ჩáƒáƒ¨áƒ”ნებულები"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "მáƒáƒ“ულის დáƒáƒœáƒ”"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "კáƒáƒ“ის ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "ცვლილებების ჟურნáƒáƒšáƒ˜áƒ¡ შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ %r-ის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "სულელი áƒáƒ›áƒ’ები, რáƒáƒ›áƒ”ლიც ფáƒáƒ˜áƒšáƒ”ბს áƒáƒ  áƒáƒ’ენერირებს."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "EPub ფáƒáƒ˜áƒšáƒ˜ %(outdir)s-შიáƒ."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "nav.xhtml ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_language\" (áƒáƒœ \"language\") EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრყáƒáƒ¤áƒ˜áƒšáƒ˜áƒ§áƒ"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_uid\" EPUB3-სთვის XML NAME უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_title\" (áƒáƒœ \"html_title\") EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_author\" EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_contributor\" EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_description\" EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_publisher\" EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_copyright\" (áƒáƒœ \"copyright\") EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"epub_identifier\" EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"version\" EPUB3-სთვის ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ css_file: %r. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "შეტყáƒáƒ‘ინების კáƒáƒ¢áƒáƒšáƒáƒ’ების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "%d ნიმუშის ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნეები"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "ნიმუშების კითხვáƒ... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "შეტყáƒáƒ‘ინების კáƒáƒ¢áƒáƒšáƒáƒ’ების ჩáƒáƒ¬áƒ”რáƒ... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "გáƒáƒ¤áƒ£áƒ­áƒ”ბული ბმული: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "სáƒáƒ®áƒ”ლმძღვáƒáƒœáƒ”ლáƒáƒ¡ გვერდების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "ჩáƒáƒ¬áƒ”რáƒ"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "\"man_pages\" პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘რუცნáƒáƒ‘ დáƒáƒ™áƒ£áƒ›áƒ”ნტზე %s მიუთითებს"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML გვერდის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "ერთი დáƒáƒ™áƒ£áƒ›áƒ”ნტის áƒáƒ¬áƒ§áƒáƒ‘áƒ"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¬áƒ”რáƒ"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Texinfo-ის ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"texinfo_documents\" მნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ. დáƒáƒ™áƒ£áƒ›áƒ”ნტების ჩáƒáƒ¬áƒ”რი áƒáƒ  იქნებáƒ"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "\"texinfo_documents\" კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი მიუთითებს უცნáƒáƒ‘ დáƒáƒ™áƒ£áƒ›áƒ”ნტზე %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბრ%s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "მიმáƒáƒ áƒ—ვების áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " ( "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს Texinfo-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "შეცდáƒáƒ›áƒ Makefile-ის ჩáƒáƒ¬áƒ”რისáƒáƒ¡: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "ტექსტური ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "შეცდáƒáƒ›áƒ '%s' ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რისáƒáƒ¡: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "XML ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "ფსევდáƒ-XML ფáƒáƒ˜áƒšáƒ”ბს სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "áƒáƒ’ების ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ გáƒáƒ¤áƒ£áƒ­áƒ”ბულიáƒ: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTML გვერდების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "áƒáƒ’ების ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "ზáƒáƒ’áƒáƒ“ი ინდექსი"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "ინდექსი"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "შემდეგი"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "წინáƒ"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "ინდექსების გენერáƒáƒªáƒ˜áƒ"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი გვერდების ჩáƒáƒ¬áƒ”რáƒ"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "გáƒáƒ“მáƒáƒ¬áƒ”რáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ... "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "გáƒáƒ“მáƒáƒ¬áƒ”რáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜áƒ¡ %r კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ:%s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ html_static_file-ში კáƒáƒžáƒ˜áƒ áƒ”ბს შეცდáƒáƒ›áƒ: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "სტáƒáƒ¢áƒ˜áƒ™áƒ£áƒ áƒ˜ ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "სტáƒáƒ¢áƒ˜áƒ™áƒ£áƒ áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ %r კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ %r კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "áƒáƒ’ების ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "ძებნის ინდექსის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრშეუძლებელიáƒ, მáƒáƒ’რáƒáƒ› ყველრდáƒáƒ™áƒ£áƒ›áƒ”ნტის áƒáƒ’ებრáƒáƒ  მáƒáƒ®áƒ“ებáƒ: ინდექსი დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი იქნებáƒ."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "შეცდáƒáƒ›áƒ %s გვერდის რენდერისáƒáƒ¡.\nმიზეზი: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "áƒáƒ‘იექტის ინვენტáƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ˜"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "%s-ში áƒáƒ áƒ¡áƒ”ბული ძებნის ინდექსის დáƒáƒ›áƒžáƒ˜"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ js_file: %r, გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულიáƒ"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "მითითებული math_renderer %r უცნáƒáƒ‘იáƒ."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path ჩáƒáƒœáƒáƒ¬áƒ”რი %r áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path ჩáƒáƒœáƒáƒ¬áƒ”რი %r გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეშიáƒ"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path ჩáƒáƒœáƒáƒ¬áƒ”რი %r áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path ჩáƒáƒœáƒáƒ¬áƒ”რი %r გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეშიáƒ"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "ლáƒáƒ’áƒáƒ¡ ფáƒáƒ˜áƒšáƒ˜ %r áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon ფáƒáƒ˜áƒšáƒ˜ %r áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTeX-ის ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ერ%(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "ინდექსი"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მáƒ"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "ენისთვის %r Babel-ის პáƒáƒ áƒáƒ›áƒ”ტრი ცნáƒáƒ‘ილი áƒáƒ áƒáƒ"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს TeX-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს TeX-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "უცნáƒáƒ‘ი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი: latex_elements[%r]. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "უცნáƒáƒ‘ი თემის პáƒáƒ áƒáƒ›áƒ”ტრი: latex_theme_options[%r]. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r-ს პáƒáƒ áƒáƒ›áƒ”ტრი \"theme\" áƒáƒ  áƒáƒ¥áƒ•áƒ¡"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r-ს \"%s\" პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ  áƒáƒ¥áƒ•áƒ¡"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "áƒáƒ’ებისáƒáƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜. მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒ›áƒ›áƒáƒ áƒ—ველის გáƒáƒ¨áƒ•áƒ”ბáƒ:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "შეწყდáƒ!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "reST მáƒáƒ áƒ™áƒáƒ¤áƒ˜áƒ¡ შეცდáƒáƒ›áƒ:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "კáƒáƒ“ირების შეცდáƒáƒ›áƒ:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "რეკურსიის შეცდáƒáƒ›áƒ:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "დáƒáƒ•áƒáƒšáƒ”ბის ნáƒáƒ›áƒ”რი დáƒáƒ“ებითი რიცხვი უნდრიყáƒáƒ¡"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მისáƒáƒ¦áƒ”ბáƒáƒ“ ეწვიეთ <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "ბილიკი დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ“ის ფáƒáƒ˜áƒšáƒ”ბáƒáƒ›áƒ“ე"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "ბილიკი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ემდე"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "თáƒáƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ¡áƒáƒ’ები ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულიáƒ, თუ მიუთითებთ პáƒáƒ áƒáƒ›áƒ”ტრს -a"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "áƒáƒ›áƒ’ები. (ნáƒáƒ’ულისხმევი: HTML)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "ყველრფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რრ(ნáƒáƒ’ულისხმევი: მხáƒáƒšáƒáƒ“ áƒáƒ®áƒáƒšáƒ˜ დრშეცვლილი ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¬áƒ”რáƒ)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "შენáƒáƒ®áƒ£áƒšáƒ˜ გáƒáƒ áƒ”მრგáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒ  იქნებáƒ. ყáƒáƒ•áƒ”ლთვის მáƒáƒ®áƒ“ებრყველრფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვáƒ"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბი გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒ  იქნებáƒ. მხáƒáƒšáƒáƒ“ -D-ით მითითებული პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "მნიშვნელáƒáƒ‘ის გáƒáƒ“áƒáƒªáƒ”მრHTML ნიმუშებში"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "კáƒáƒœáƒ¡áƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "დიáƒáƒ’ნáƒáƒ¡áƒ¢áƒ˜áƒ™áƒ£áƒ áƒ˜ შეტყáƒáƒ‘ინებების სიხშირის გáƒáƒ–რდრ(შეგიძლიáƒáƒ—, გáƒáƒ˜áƒ›áƒ”áƒáƒ áƒáƒ—)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "stdout-ზე გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ¤áƒ”რი იქნებáƒ. მხáƒáƒšáƒáƒ“ გáƒáƒ¤áƒ áƒ—ხილებები, stderr-ზე"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "áƒáƒ áƒáƒ¤áƒ áƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ. გáƒáƒ¤áƒ áƒ—ხილებებისáƒáƒª კი"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "ფერáƒáƒ“ი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒ áƒ—ვრ(ნáƒáƒ’ულისხმევი: áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“-áƒáƒ¦áƒ›áƒáƒ©áƒ”ნáƒ)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "ფერáƒáƒ“ი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვრ(ნáƒáƒ’ულისხმევი: áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“-áƒáƒ¦áƒ›áƒáƒ©áƒ”ნáƒ)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებების (დრშეცდáƒáƒ›áƒ”ბის) მითითებულ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებების შეცდáƒáƒ›áƒáƒ“ áƒáƒ¦áƒ¥áƒ›áƒ"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "თუ მითითებულირ-W, გáƒáƒ¤áƒ áƒ—ხილებების მიუხედáƒáƒ•áƒáƒ“ სáƒáƒ›áƒ£áƒ¨áƒáƒáƒ”ბი მáƒáƒ˜áƒœáƒª გáƒáƒ’რძელდებáƒ"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ¡áƒáƒ¡ Pdb-ის გáƒáƒ¨áƒ•áƒ”ბáƒ"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "-a პáƒáƒ áƒáƒ›áƒ”ტრის დრფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლების ერთáƒáƒ“ მითითებრშეუძლებელიáƒ"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებების ფáƒáƒ˜áƒšáƒ˜áƒ¡ %r გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¤áƒáƒ áƒ•áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "მáƒáƒ—ემáƒáƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩáƒáƒ¡áƒ›áƒ, რáƒáƒ›áƒ”ლიც PNG áƒáƒœ SVG გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის სáƒáƒ®áƒ˜áƒ—áƒáƒ დáƒáƒ áƒ”ნდერებული"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "ბრáƒáƒ£áƒ–ერში MathJax-ის მიერ დáƒáƒ áƒ”ნდერებული მáƒáƒ—ემáƒáƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩáƒáƒ¡áƒ›áƒ"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "გთხáƒáƒ•áƒ— შეიყვáƒáƒœáƒáƒ— ბილიკის სწáƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "შეიყვáƒáƒœáƒ”თ რáƒáƒ˜áƒ›áƒ” ტექსტი."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "შეიყვáƒáƒœáƒ”თ %s-დáƒáƒœ ერთ-ერთი."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "შეიყვáƒáƒœáƒ”თ 'y' (დიáƒáƒ®) áƒáƒœ 'n' (áƒáƒ áƒ)"
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "მიუთითეთ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სუფიქსი. მáƒáƒ’: '.rst' áƒáƒœ '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბით Sphinx %s-ის სწრáƒáƒ¤áƒ˜ მáƒáƒ áƒ’ების პრáƒáƒ’რáƒáƒ›áƒ."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "áƒáƒ áƒ©áƒ”ული root ბილიკი: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "შეიყვáƒáƒœáƒ”თ დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ ძირითáƒáƒ“ი ბილიკი."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ ძირითáƒáƒ“ი ბილიკი"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "შეცდáƒáƒ›áƒ: áƒáƒ áƒ©áƒ”ულ ძირითáƒáƒ“ ბილიკზე áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირáƒáƒ áƒ¡áƒ”ბული conf.py ფáƒáƒ˜áƒšáƒ˜."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart-ი áƒáƒ áƒ¡áƒ”ბულ Sphinx-ის პრáƒáƒ”ქტებს თáƒáƒ•áƒ–ე áƒáƒ  გáƒáƒ“áƒáƒáƒ¬áƒ”რს."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "შეიყვáƒáƒœáƒ”თ áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბილიკი (გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლáƒáƒ“ უბრáƒáƒšáƒáƒ“ დáƒáƒáƒ¬áƒ”ქით ღილáƒáƒ™áƒ¡ 'Enter')"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "კáƒáƒ“ის დრáƒáƒ’ების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ“ებáƒ? (y(დიáƒáƒ®)/n(áƒáƒ áƒ))"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "სáƒáƒ®áƒ”ლის პრეფიქსი ნიმუშებისრდრსტáƒáƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებისთვის"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "პრáƒáƒ”ქტს სáƒáƒ®áƒ”ლი áƒáƒ’ებულ დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜ რáƒáƒ›áƒ“ენიმე áƒáƒ“გილáƒáƒ¡ გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "პრáƒáƒ”ქტის სáƒáƒ®áƒ”ლი"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "áƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”ლები"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "პრáƒáƒ”ქტის ვერსიáƒ"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "პრáƒáƒ”ქტის რელიზი"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "პრáƒáƒ”ქტის ენáƒ"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "თქვენი მთáƒáƒ•áƒáƒ áƒ˜ დáƒáƒ™áƒ£áƒ›áƒ”ნტის სáƒáƒ®áƒ”ლი (სუფიქსს გáƒáƒ áƒ”შე)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart áƒáƒ áƒ¡áƒ”ბულ ფáƒáƒ˜áƒšáƒ”ბს თáƒáƒ•áƒ–ე áƒáƒ  გáƒáƒ“áƒáƒáƒ¬áƒ”რს."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "შევქმნრMakefile? (y(დიáƒáƒ®)/n(áƒáƒ áƒ))"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "შევქმნრWindows-ის ბრძáƒáƒœáƒ”ბების ფáƒáƒ˜áƒšáƒ˜? (y(დიáƒáƒ®)/n(áƒáƒ áƒ))"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ შექმნრ%s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "ფáƒáƒ˜áƒšáƒ˜ %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებáƒ."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ: სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების სტრუქტურრშეიქმნáƒ."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "ჩუმი რეჟიმი"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "პრáƒáƒ”ქტის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "სტრუქტურის მáƒáƒ áƒ’ებáƒ"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "თუ მითითებულიáƒ, კáƒáƒ“ის დრáƒáƒ’ების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები ცáƒáƒš-ცáƒáƒšáƒ™áƒ” იქნებáƒ"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "თუ მითითებულიáƒ, áƒáƒ’ების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე კáƒáƒ“ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში იქნებáƒ"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "პრáƒáƒ”ქტის ძირითáƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "პრáƒáƒ”ქტის დáƒáƒ¡áƒáƒ®áƒ”ლებáƒ"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "áƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”ლები"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "პრáƒáƒ”ქტის ვერსიáƒ"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "პრáƒáƒ”ქტის რელიზი"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტის ენáƒ"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "წყáƒáƒ áƒáƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სუფიქსი"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "მთáƒáƒ•áƒáƒ áƒ˜ დáƒáƒ™áƒ£áƒ›áƒ”ნტის სáƒáƒ®áƒ”ლი"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "epub-ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "%s გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის ჩáƒáƒ áƒ—ვáƒ"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Makefile დრBatchfile-ის შექმნáƒ"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "makefile-ის შექმნáƒ"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "makefile-ის áƒáƒ  შეიქმნებáƒ"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "batchfile-ის შექმნáƒ"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "batchfile-ი áƒáƒ  შეიქმნებáƒ"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "პრáƒáƒ”ქტის ნიმუშები"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "ნიმუშების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ნიმუშის ფáƒáƒ˜áƒšáƒ”ბისთვის"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "áƒáƒ¦áƒ¬áƒ”რეთ სáƒáƒœáƒ˜áƒ›áƒ£áƒ¨áƒ” ცვლáƒáƒ“ი"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნიმუშის ცვლáƒáƒ“ი: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒ áƒ¬áƒ”რáƒ: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "\"%s\" დრ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრების ერთდრáƒáƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლი ფáƒáƒ˜áƒšáƒ˜ %r ვერ ვიპáƒáƒ•áƒ” áƒáƒœ მისი წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "áƒáƒ‘იექტი სáƒáƒ®áƒ”ლáƒáƒ“ %r ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლი ფáƒáƒ˜áƒšáƒ¨áƒ˜ %r áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირდუბლირებული სáƒáƒ áƒ©áƒ”ვის ჩáƒáƒœáƒáƒ¬áƒ”რი: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "სექციის áƒáƒ•áƒ¢áƒáƒ áƒ˜: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "მáƒáƒ“ულის áƒáƒ•áƒ¢áƒáƒ áƒ˜: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "კáƒáƒ“ის áƒáƒ•áƒ¢áƒáƒ áƒ˜: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "áƒáƒ•áƒ¢áƒáƒ áƒ˜: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "დáƒáƒ‘რუნებული მნიშვნელáƒáƒ‘ები"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "áƒáƒ‘რუნებს"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "დáƒáƒ‘რუნების ტიპი"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "წვერი"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "ცვლáƒáƒ“ი"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "ფუნქციáƒ"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "მáƒáƒ™áƒ áƒ"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "სტრუქტურáƒ"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "გáƒáƒ”რთიáƒáƒœáƒ”ბáƒ"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "დáƒáƒ›áƒ—ვლელი"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "ტიპი"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "ფუნქციის პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "სიáƒáƒ®áƒšáƒ” ვერსიáƒáƒ¨áƒ˜ %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "ცვლილებები ვერსიáƒáƒ¨áƒ˜ %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "მáƒáƒ«áƒ•áƒ”ლებულირვერსიáƒáƒ¨áƒ˜ %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "ისვრის"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "კლáƒáƒ¡áƒ˜"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "კáƒáƒœáƒªáƒ”ფციáƒ"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s () (ჩáƒáƒ¨áƒ”ნებული ფუნქციáƒ)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s () (%s მეთáƒáƒ“ი)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s () (კლáƒáƒ¡áƒ˜)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ ცვლáƒáƒ“ი áƒáƒœ მუდმივáƒ)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s áƒáƒ¢áƒ áƒ˜áƒ‘უტი)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "áƒáƒ áƒ’უმენტები"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (მáƒáƒ“ული)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "მეთáƒáƒ“ი"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "მáƒáƒœáƒáƒªáƒ”მები"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტი"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "მáƒáƒ“ული"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "ცვლáƒáƒ“ები"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ”ბი"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s () (მáƒáƒ“ულში %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (მáƒáƒ“ულში %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (ჩáƒáƒ¨áƒ”ნებული ცვლáƒáƒ“ი)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (ჩáƒáƒ¨áƒ”ნებული კლáƒáƒ¡áƒ˜)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (კლáƒáƒ¡áƒ˜ %s-ში)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s () (%s კლáƒáƒ¡áƒ˜áƒ¡ მეთáƒáƒ“ი)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s () (%s სტáƒáƒ¢áƒ˜áƒ™áƒ£áƒ áƒ˜ მეთáƒáƒ“ი)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (%s თვისებáƒ)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python-ის მáƒáƒ“ულის ინდექსი"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "მáƒáƒ“ულები"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "მáƒáƒ«áƒ•áƒ”ლებულიáƒ"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "კლáƒáƒ¡áƒ˜áƒ¡ მეთáƒáƒ“ი"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "სტáƒáƒ¢áƒ˜áƒ™áƒ£áƒ áƒ˜ მეთáƒáƒ“ი"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "თვისებáƒ"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (მáƒáƒ«áƒ•áƒ”ლებული)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (დირექტივáƒ)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (დირექტივის პáƒáƒ áƒáƒ›áƒ”ტრი)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (რáƒáƒšáƒ˜)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "დირექტივáƒ"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "დირექტივის-პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "რáƒáƒšáƒ”ბი"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "%s %s-ის დუბლირებული áƒáƒ¦áƒ¬áƒ”რáƒ. სხვრáƒáƒ¡áƒšáƒ˜ %s-შიáƒ"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "სáƒáƒ áƒ©áƒ”ვის ელემენტებს წინ ცáƒáƒ áƒ˜áƒ”ლი ხáƒáƒ–ი უნდრიყáƒáƒ¡"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "სáƒáƒ áƒ©áƒ”ვის ელემენტები ცáƒáƒ áƒ˜áƒ”ლი ხáƒáƒ–ებით უნდრგáƒáƒ›áƒáƒ§áƒáƒ—"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ. გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ შეწევáƒ"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "სáƒáƒ áƒ©áƒ”ვის ელემენტი"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "გრáƒáƒ›áƒáƒ¢áƒ˜áƒ™áƒ˜áƒ¡ კáƒáƒ“ი"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "მიმáƒáƒ áƒ—ვის ჭდე"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტი"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "მáƒáƒ“ულის ინდექსი"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "ძებნის გვერდი"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "დუბლირებული ჭდე %s. სხვრáƒáƒ¦áƒ¬áƒ”რრ%s-შიáƒ"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "დუბლირებული %s áƒáƒ¦áƒ¬áƒ”რისთვის %s. სხვრáƒáƒ¡áƒšáƒ˜ %s-შიáƒ"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig გáƒáƒ›áƒáƒ áƒ—ულიáƒ. :numref: გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებáƒ."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "ბმულს წáƒáƒ áƒ¬áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "áƒáƒ¦áƒ£áƒ¬áƒ”რელი ჭდე: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ შეიცვáƒáƒšáƒ"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბები შეიცვáƒáƒšáƒ"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "áƒáƒ’ების გáƒáƒ áƒ”მáƒáƒ¡ ვერსირმიმდინáƒáƒ áƒ” áƒáƒ áƒáƒ"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე შეიცვáƒáƒšáƒ"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "გáƒáƒ áƒ”მრáƒáƒ áƒ©áƒ”ულ áƒáƒ›áƒ’ებთáƒáƒœ თáƒáƒ•áƒ¡áƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ. áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ სხვრდáƒáƒ™áƒ£áƒ›áƒ”ნტების ხის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "%s-ში დáƒáƒ™áƒ£áƒ›áƒ”ნტების სკáƒáƒœáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "დáƒáƒ›áƒ”ნი %r რეგისტრირებული áƒáƒ áƒáƒ"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტი áƒáƒ áƒª ერთ სáƒáƒ áƒ©áƒ”ვის ხეში ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ áƒáƒ áƒáƒ"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირთვითმიმáƒáƒ áƒ—ვáƒáƒ“ი სáƒáƒ áƒ©áƒ”ვის ხე. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულიáƒ."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "იხილეთ %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "áƒáƒ’რეთვე იხილეთ %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "უცნáƒáƒ‘ი ინდექსის ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპი %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "სიმბáƒáƒšáƒáƒ”ბი"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირსáƒáƒ áƒ©áƒ”ვის ხის წრიული მიმáƒáƒ áƒ—ვები. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებáƒ: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "სáƒáƒ áƒ©áƒ”ვის ხე შეიცáƒáƒ•áƒ¡ მიმáƒáƒ áƒ—ვáƒáƒ¡ დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒ›áƒ“ე %r, რáƒáƒ›áƒ”ლსáƒáƒª სáƒáƒ—áƒáƒ£áƒ áƒ˜ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ. ბმული áƒáƒ  შეიქმნებáƒ"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "სáƒáƒ áƒ©áƒ”ვის ხე áƒáƒ -ჩáƒáƒ áƒ—ულ დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒ›áƒ“ე, %r, მიმáƒáƒ áƒ—ვáƒáƒ¡ შეიცáƒáƒ•áƒ¡"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ˜ წáƒáƒ™áƒ˜áƒ—ხვáƒáƒ“ი áƒáƒ áƒáƒ: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ˜ %s წáƒáƒ™áƒ˜áƒ—ხვáƒáƒ“ი áƒáƒ áƒáƒ: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "გáƒáƒ“მáƒáƒ¬áƒ”რილი ფáƒáƒ˜áƒšáƒ˜ წáƒáƒ™áƒ˜áƒ—ხვáƒáƒ“ი áƒáƒ áƒáƒ: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "შეიქმნებáƒáƒ“რფáƒáƒ˜áƒšáƒ˜ %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "ბილიკი მáƒáƒ“ულიდáƒáƒœ დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒ›áƒ“ე"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "áƒáƒ áƒ¡áƒ”ბულ ფáƒáƒ˜áƒšáƒ”ბზე გáƒáƒ“áƒáƒ¬áƒ”რáƒ"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "სკრიპტის ფáƒáƒ˜áƒšáƒ”ბის შექმნის გáƒáƒ áƒ”შე გáƒáƒ¨áƒ•áƒ”ბáƒ"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "\"_private\" მáƒáƒ“ულების ჩáƒáƒ¡áƒ›áƒ"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜ áƒáƒ  შეიქმნებáƒ"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სუფიქსი (ნáƒáƒ’ულისხმევი: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "sphinx-quickstart-ით სრული პრáƒáƒ”ქტის გენáƒáƒ áƒáƒªáƒ˜áƒ"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "რáƒáƒªáƒ მითითებულირ--full, module_path-ი sys.path-ის ბáƒáƒšáƒáƒ¨áƒ˜ მიეწერებáƒ"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "პრáƒáƒ”ქტის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმევი: ძირითáƒáƒ“ი მáƒáƒ“ულის სáƒáƒ®áƒ”ლი)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "პრáƒáƒ”ქტის áƒáƒ•áƒ¢áƒáƒ (ებ)-ი. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ, რáƒáƒªáƒ მიუთითებთ პáƒáƒ áƒáƒ›áƒ”ტრს --full"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "პრáƒáƒ”ქტის ვერსიáƒ. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ, რáƒáƒªáƒ მითითებულირ--full"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "პრáƒáƒ”ქტის რელიზი. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ, რáƒáƒªáƒ მითითებულირ--full. ნáƒáƒ’ულისხმებ მნიშვნელáƒáƒ‘áƒáƒ იგივე, რáƒáƒª --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "სექცირ\"%s\" მიიღებს ჭდეს \"%s\""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრ%r %s-ში"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' სწáƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ áƒáƒ."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' სწáƒáƒ áƒ˜ pyversion-ის პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ áƒáƒ"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ TestCode ტიპი"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "გáƒáƒ áƒ” Graphviz ფáƒáƒ˜áƒšáƒ˜ %r ვერ ვიპáƒáƒ•áƒ” áƒáƒœ მისი წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "\"graphviz\" დირექტივáƒ, რáƒáƒ›áƒ”ლსáƒáƒª შემცველáƒáƒ‘რáƒáƒ  áƒáƒ¥áƒ•áƒ¡, იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format უნდრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ: 'png', 'svg'. მáƒáƒ’რáƒáƒ› áƒáƒ áƒ˜áƒ¡ %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[გრáƒáƒ¤áƒ˜áƒ™áƒ˜: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[გრáƒáƒ¤áƒ˜áƒ™áƒ˜]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(%s v%s-ში)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "გáƒáƒœáƒ áƒ˜áƒ’ის სიáƒ"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "მáƒáƒ“ულის კáƒáƒ“ის გáƒáƒ›áƒáƒ™áƒ•áƒ”თáƒ... "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "მáƒáƒ“ულის კáƒáƒ“ი"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "გáƒáƒ“áƒáƒ®áƒ”დვáƒ: მáƒáƒ“ულის კáƒáƒ“ი"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "ძირითáƒáƒ“ი კლáƒáƒ¡áƒ”ბი: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტი %s áƒáƒ‘იექტში %s áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "მეტსáƒáƒ®áƒ”ლი TypeVar(%s)-სთვის"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "%s-სთვის მეთáƒáƒ“ის ხელმáƒáƒ¬áƒ”რის მიღებრშეუძლებელიáƒ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "%s-ზე áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ __slots__: გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულიáƒ."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "%r-სთვის ნáƒáƒ’ულისხმევი áƒáƒ áƒ’უმენტის მნიშვნელáƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "%r-სთვის ხელმáƒáƒ¬áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ: პáƒáƒ áƒáƒ›áƒ”ტრი ვერ ვიპáƒáƒ•áƒ”: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "სáƒáƒ®áƒ”ლის %s დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცáƒáƒ›áƒ"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "áƒáƒ‘იექტის %s შემáƒáƒ¢áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: ფáƒáƒ˜áƒšáƒ˜ ვერ ვიპáƒáƒ•áƒ”: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] %s-ში ჩáƒáƒ¬áƒ”რáƒ"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "rST ფáƒáƒ˜áƒšáƒ”ბის დáƒáƒ¡áƒáƒ’ენერირებელიკáƒáƒ“ის ფáƒáƒ˜áƒšáƒ”ბი"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ¬áƒ”რი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ ნáƒáƒ’ულიხმევი სუფიქსი (ნáƒáƒ’ულისხმევი: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ნიმუშების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმევი: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვების áƒáƒ áƒ’უმენტები"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "მáƒáƒ’áƒáƒšáƒ˜áƒ—ი"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "მáƒáƒ’áƒáƒšáƒ˜áƒ—ები"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რები"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "სხვრპáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "იღებს"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "ბმები"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებები"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ების ნáƒáƒ™áƒ áƒ”ბი (áƒáƒ™áƒšáƒ˜áƒ დáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•áƒ˜ ფრჩხილი): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ების ნáƒáƒ™áƒ áƒ”ბი (áƒáƒ™áƒšáƒ˜áƒ გáƒáƒ›áƒ®áƒ¡áƒœáƒ”ლი ფრჩხილი): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "ყურáƒáƒ“ღებáƒ"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "სáƒáƒ¤áƒ áƒ—ხე"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "შეცდáƒáƒ›áƒ"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "მინიშნებáƒ"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "მნიშვნელáƒáƒ•áƒáƒœáƒ˜"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "ნáƒáƒ¢áƒ˜"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "áƒáƒ¡áƒ”ვე იხილეთ"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "რჩევáƒ"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "ყურáƒáƒ“ღებáƒ"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "წინრგვერდიდáƒáƒœ"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "გრძელდებრშემდეგ გვერდზე"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "áƒáƒ áƒáƒáƒœáƒ‘áƒáƒœáƒ£áƒ áƒ˜"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "რიცხვები"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "პáƒáƒœáƒ”ლი"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "სáƒáƒ áƒ©áƒ”ვი"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "ძებნáƒ"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "წყáƒáƒ áƒáƒ¡ ჩვენებáƒ"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "მიმáƒáƒ®áƒ˜áƒšáƒ•áƒ"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "კეთილი იყáƒáƒ¡ თქვენი მáƒáƒ‘რძáƒáƒœáƒ”ბáƒ"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ნáƒáƒ•áƒ˜áƒ’áƒáƒªáƒ˜áƒ"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s-ში ძებნáƒ"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "áƒáƒ› დáƒáƒ™áƒ£áƒ›áƒ”ნტების შესáƒáƒ®áƒ”ბ"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლებები"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "ბáƒáƒšáƒ გáƒáƒœáƒáƒ®áƒšáƒ”ბის დრრ%(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s-შ ძებნáƒ"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "წინრთემáƒ"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "წინრთáƒáƒ•áƒ˜"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "შემდეგი თემáƒ"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "შემდეგი თáƒáƒ•áƒ˜"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "ძებნáƒ"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "ძებნს შედეგები"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "სწრáƒáƒ¤áƒ˜ ძებნáƒ"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: 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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "ძებნáƒ"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "ძებნის მáƒáƒ›áƒ–áƒáƒ“ებáƒ..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "ძებნის დáƒáƒ›áƒ—ხვევების დáƒáƒ›áƒáƒšáƒ•áƒ"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "გვერდითი ზáƒáƒšáƒ˜áƒ¡ ჩáƒáƒ™áƒ”ცვáƒ"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "გვერდითი ზáƒáƒšáƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "შიგთáƒáƒ•áƒ¡áƒ˜"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "ნáƒáƒ™áƒ•áƒáƒšáƒ”ვი [%s] მიმáƒáƒ áƒ—ული áƒáƒ áƒáƒ."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "ნáƒáƒ™áƒ•áƒáƒšáƒ”ვი [#] მიმáƒáƒ áƒ—ული áƒáƒ áƒáƒ."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s მიმáƒáƒ áƒ—ვის სáƒáƒ›áƒ˜áƒ–ნე ვერ ვიპáƒáƒ•áƒ”: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r მიმáƒáƒ áƒ—ვის სáƒáƒ›áƒ˜áƒ–ნე ვერ ვიპáƒáƒ•áƒ”: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის მიღების შეცდáƒáƒ›áƒ: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის მიღების შეცდáƒáƒ›áƒ: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "უცნáƒáƒ‘ი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "შეცდáƒáƒ›áƒ˜áƒ—"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "უცნáƒáƒ‘ი დირექტივრáƒáƒœ რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "უცნáƒáƒ‘ი კვáƒáƒœáƒ«áƒ˜áƒ¡ ტიპი: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "ნáƒáƒ’ულისხმევი რáƒáƒšáƒ˜ %s ვერ ვიპáƒáƒ•áƒ”"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format-ი %s-სთვის áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒáƒ"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "ნებისმიერი ID, რáƒáƒ›áƒ”ლიც %s კვáƒáƒœáƒ«áƒ–ე მინიჭებული áƒáƒ áƒáƒ"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ზáƒáƒ›áƒ˜áƒ¡ მიღებრშეუძლებელიáƒ. :scale: მáƒáƒ®áƒ“ებრპáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr "ძáƒáƒšáƒ˜áƒáƒœ დიდი :maxdepth:. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "დáƒáƒ™áƒ£áƒ›áƒ”ნტის სáƒáƒ—áƒáƒ£áƒ áƒ˜ ერთი ტექსტური კვáƒáƒœáƒ«áƒ˜ áƒáƒ áƒáƒ"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "სქáƒáƒšáƒ˜áƒáƒ”ბი"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "ზáƒáƒ›áƒ˜áƒ¡ ერთეული %s áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირინდექსის ჩáƒáƒœáƒáƒ¬áƒ”რის უცნáƒáƒ‘ი ტიპი %s"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "წáƒáƒ áƒ¬áƒ”რრფიგურის შიგნით áƒáƒ áƒáƒ."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "გáƒáƒœáƒ£áƒ®áƒáƒ áƒªáƒ˜áƒ”ლებელი კვáƒáƒœáƒ«áƒ˜áƒ¡ ტიპი: %r"
diff --git a/sphinx/locale/ko/LC_MESSAGES/sphinx.js b/sphinx/locale/ko/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..aba01b9
--- /dev/null
+++ b/sphinx/locale/ko/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ko",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", \ubb38\uc11c - ",
+ "About these documents": "\uc774 \ubb38\uc11c \uc815\ubcf4",
+ "Automatically generated list of changes in version %(version)s": "\ubc84\uc804 %(version)s\uc758 \ubcc0\uacbd \uc0ac\ud56d (\uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ub41c \ubaa9\ub85d)",
+ "C API changes": "C API \ubcc0\uacbd \uc0ac\ud56d",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\ubc84\uc804 %(version)s\uc758 \ubcc0\uacbd \uc0ac\ud56d &#8212; %(docstitle)s",
+ "Collapse sidebar": "\uc0ac\uc774\ub4dc\ubc14 \ub2eb\uae30",
+ "Complete Table of Contents": "\uc885\ud569 \ubaa9\ucc28",
+ "Contents": "\ub0b4\uc6a9",
+ "Copyright": "\uc800\uc791\uad8c",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "<a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s \ubc84\uc804\uc73c\ub85c \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
+ "Expand sidebar": "\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30",
+ "Full index on one page": "\ud55c \ud398\uc774\uc9c0\uc5d0 \uc804\uccb4 \uc0c9\uc778 \ubcf4\uae30",
+ "General Index": "\uc804\uccb4 \uc0c9\uc778",
+ "Global Module Index": "\ubaa8\ub4c8 \ucd1d \uc0c9\uc778",
+ "Go": "\uc774\ub3d9",
+ "Hide Search Matches": "\uac80\uc0c9 \uc77c\uce58 \uc228\uae30\uae30",
+ "Index": "\uc0c9\uc778",
+ "Index &ndash; %(key)s": "\uc0c9\uc778 &ndash; %(key)s",
+ "Index pages by letter": "\uc54c\ud30c\ubcb3\ubcc4 \uc0c9\uc778",
+ "Indices and tables:": "\uc0c9\uc778 \ubc0f \ud45c \ubaa9\ub85d:",
+ "Last updated on %(last_updated)s.": "\ucd5c\uc885 \uc5c5\ub370\uc774\ud2b8: %(last_updated)s",
+ "Library changes": "\ub77c\uc774\ube0c\ub7ec\ub9ac \ubcc0\uacbd \uc0ac\ud56d",
+ "Navigation": "\ud0d0\uc0c9",
+ "Next topic": "\ub2e4\uc74c \ud56d\ubaa9",
+ "Other changes": "\ub2e4\ub978 \ubcc0\uacbd \uc0ac\ud56d",
+ "Overview": "\uac1c\uc694",
+ "Please activate JavaScript to enable the search\n functionality.": "\uac80\uc0c9 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 JavaScript\ub97c \ud65c\uc131\ud654\ud558\uc2ed\uc2dc\uc624.",
+ "Preparing search...": "\uac80\uc0c9 \uc900\ube44 \uc911\u2026",
+ "Previous topic": "\uc774\uc804 \ud56d\ubaa9",
+ "Quick search": "\ube60\ub978 \uac80\uc0c9",
+ "Search": "\uac80\uc0c9",
+ "Search Page": "\uac80\uc0c9 \ud398\uc774\uc9c0",
+ "Search Results": "\uac80\uc0c9 \uacb0\uacfc",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "\uac80\uc0c9\uc774 \uc644\ub8cc\ub418\uc5c8\uc73c\uba70, \uac80\uc0c9\uc5b4\uc640 \uc77c\uce58\ud558\ub294 ${resultCount} \uac1c \ud398\uc774\uc9c0\ub97c \ucc3e\uc558\uc2b5\ub2c8\ub2e4.",
+ "Search within %(docstitle)s": "%(docstitle)s\uc5d0\uc11c \ucc3e\uae30",
+ "Searching": "\uac80\uc0c9 \uc911",
+ "Searching for multiple words only shows matches that contain\n all words.": "\uc5ec\ub7ec \ub2e8\uc5b4\ub97c \uac80\uc0c9\ud558\uba74 \ubaa8\ub4e0 \ub2e8\uc5b4\uac00 \ud3ec\ud568\ub41c \uc77c\uce58 \ud56d\ubaa9\ub9cc \ud45c\uc2dc\ub429\ub2c8\ub2e4.",
+ "Show Source": "\uc18c\uc2a4 \ubcf4\uae30",
+ "Table of Contents": "\ubaa9\ucc28",
+ "This Page": "\ud604\uc7ac \ubb38\uc11c",
+ "Welcome! This is": "\ud658\uc601\ud569\ub2c8\ub2e4!",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\uac80\uc0c9\uc5b4\uc640 \uc77c\uce58\ud558\ub294 \ubb38\uc11c\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 \ub2e8\uc5b4\uc758 \ucca0\uc790\uac00 \uc62c\ubc14\ub978\uc9c0, \ucda9\ubd84\ud55c \uce74\ud14c\uace0\ub9ac\ub97c \uc120\ud0dd\ud588\ub294\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624.",
+ "all functions, classes, terms": "\ud568\uc218, \ud074\ub798\uc2a4 \ubc0f \uc6a9\uc5b4 \uac1c\uad00",
+ "can be huge": "\ud070 \uacbd\uc6b0\uac00 \uc788\uc73c\ubbc0\ub85c \uc8fc\uc758",
+ "last updated": "\ucd5c\uc885 \uc5c5\ub370\uc774\ud2b8",
+ "lists all sections and subsections": "\ubaa8\ub4e0 \uad6c\uc5ed\uacfc \ud558\uc704 \uad6c\uc5ed \ubaa9\ub85d",
+ "next chapter": "\ub2e4\uc74c \uc7a5",
+ "previous chapter": "\uc774\uc804 \uc7a5",
+ "quick access to all modules": "\ubaa8\ub4e0 \ubaa8\ub4c8 \uc870\uacac\ud45c",
+ "search": "\uac80\uc0c9",
+ "search this documentation": "\ubb38\uc11c \uac80\uc0c9",
+ "the documentation for": "\ubb38\uc11c:"
+ },
+ "plural_expr": "0"
+}); \ 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 0000000..42ab777
--- /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 0000000..c2c594e
--- /dev/null
+++ b/sphinx/locale/ko/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Minho Ryang <minhoryang@gmail.com>, 2019
+# YT H <dev@theYT.net>, 2019-2022
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: YT H <dev@theYT.net>, 2019-2022\n"
+"Language-Team: Korean (http://app.transifex.com/sphinx-doc/sphinx-1/language/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "ì›ë³¸ 디렉토리를 ì°¾ì„ ìˆ˜ 없습니다 (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "출력 디렉토리 %sì€(는) 디렉토리가 아닙니다."
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "ì›ë³¸ 디렉토리와 ëŒ€ìƒ ë””ë ‰í† ë¦¬ëŠ” ê°™ì„ ìˆ˜ 없습니다"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx 버전 %s 실행 중"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "ì´ í”„ë¡œì íŠ¸ëŠ” 최소 Sphinx 버전 %sì´(ê°€) 필요하므로 현재 버전으로 빌드할 수 없습니다."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "출력 디렉토리 만드는 중"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "확장 기능 %s 설정 중:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "현재 conf.py 파ì¼ì— ì •ì˜ëœ 'setup'ì€ í˜¸ì¶œ 가능한 Python ê°ì²´ê°€ 아닙니다. 호출 가능한 함수가 ë˜ë„ë¡ ì •ì˜ë¥¼ 수정하십시오.\nì´ê²ƒì€ conf.pyê°€ Sphinx 확장 기능으로 ë™ìž‘하는 ë° í•„ìš”í•©ë‹ˆë‹¤."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "ë²ˆì—­ì„ ë¶ˆëŸ¬ì˜¤ëŠ” 중 [%s]… "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "완료"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "기본 제공 메시지를 사용할 수 없습니다"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "pickleë¡œ ì €ìž¥ëœ í™˜ê²½ì„ ë¶ˆëŸ¬ì˜¤ëŠ” 중"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "실패: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "ì„ íƒí•œ 빌ë”ê°€ 없으므로, ê¸°ë³¸ê°’ì¸ htmlì„ ì‚¬ìš©í•©ë‹ˆë‹¤"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "성공"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "완료했으나 ë¬¸ì œì  ë°œê²¬"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "빌드 %s, 경고가 %s ê°œ ë°œìƒí–ˆìŠµë‹ˆë‹¤ (경고를 오류로 처리)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "빌드 %s, 경고가 %s ê°œ ë°œìƒí–ˆìŠµë‹ˆë‹¤ (경고를 오류로 처리)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "빌드 %s, 경고가 %s ê°œ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "빌드 %s, 경고가 %s ê°œ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "빌드 %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "%r 노드 í´ëž˜ìŠ¤ê°€ ì´ë¯¸ 등ë¡ë˜ì–´ 있으며, 방문ìžë¥¼ 무시합니다"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "%r ì§€ì‹œë¬¸ì´ ì´ë¯¸ 등ë¡ë˜ì–´ 있으며, 재정ì˜ë©ë‹ˆë‹¤"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "%r ì—­í• ì´ ì´ë¯¸ 등ë¡ë˜ì–´ 있으며, 재정ì˜ë©ë‹ˆë‹¤"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s 확장 ê¸°ëŠ¥ì€ ë³‘ë ¬ ì½ê¸°ì— 안전한지 선언하지 않았으므로, 그렇지 않다고 가정합니다. 확장 기능 작성ìžì—게 확ì¸í•˜ê³  명시하ë„ë¡ ìš”ì²­í•˜ì‹­ì‹œì˜¤"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "%s 확장 ê¸°ëŠ¥ì€ ë³‘ë ¬ ì½ê¸°ì— 안전하지 않습니다"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s 확장 ê¸°ëŠ¥ì€ ë³‘ë ¬ ì“°ê¸°ì— ì•ˆì „í•œì§€ 선언하지 않았으므로, 그렇지 않다고 가정합니다. 확장 기능 작성ìžì—게 확ì¸í•˜ê³  명시하ë„ë¡ ìš”ì²­í•˜ì‹­ì‹œì˜¤"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "%s 확장 ê¸°ëŠ¥ì€ ë³‘ë ¬ ì“°ê¸°ì— ì•ˆì „í•˜ì§€ 않습니다"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "병렬 %s 처리"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "설정 ë””ë ‰í† ë¦¬ì— conf.py 파ì¼ì´ 없습니다 (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "ìž˜ëª»ëœ êµ¬ì„± ê°’ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤: 'language = None'. 유효한 언어 코드로 êµ¬ì„±ì„ ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤. 대신 'en'(ì˜ì–´)ì„ ì‚¬ìš©í•©ë‹ˆë‹¤."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "Dictionary 구성 설정 %rì„(를) 재정ì˜í•  수 없으며, 무시합니다 (개별 요소를 설정하기 위해 %r 사용)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "ìˆ«ìž %rì´(ê°€) 설정값 %rì— ëŒ€í•´ 유효하지 않으며, 무시합니다"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "지ì›ë˜ì§€ 않는 ìœ í˜•ì˜ êµ¬ì„± 설정 %rì„(를) ìž¬ì •ì˜ í•  수 없으며, 무시합니다"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "ìž¬ì •ì˜ ì¤‘ ì•Œ 수 없는 설정값 %r, 무시합니다"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "해당 ì„¤ì •ê°’ì´ ì—†ìŠµë‹ˆë‹¤: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "설정값 %rì´(ê°€) ì´ë¯¸ 존재합니다"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "구성 파ì¼ì— 구문 오류가 있습니다: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "구성 파ì¼(ë˜ëŠ” 가져온 모듈 중 하나)ì—ì„œ sys.exit()ì„ í˜¸ì¶œí–ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "구성 파ì¼ì— 프로그램 오류가 있습니다:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "설정값 'source_suffix'는 문ìžì—´, 문ìžì—´ì˜ ëª©ë¡ ë˜ëŠ” dictionary를 예ìƒí•©ë‹ˆë‹¤. 그러나 `%r'ì´(ê°€) 지정ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "제 %s 절"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "그림 %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "표 %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "예시 %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "설정값 `{name}`ì€(는) {candidates} 중 하나여야 하지만, `{current}`ì´(ê°€) 지정ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "설정값 `{name}'ì€(는) `{current.__name__}' 유형ì´ì§€ë§Œ, {permitted} ìœ í˜•ì„ ê¸°ëŒ€í–ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "설정값 `{name}'ì€(는) `{current.__name__}' 유형ì´ì§€ë§Œ, ê¸°ë³¸ê°’ì€ `{default.__name__}'입니다."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r(ì´)ê°€ 없으므로, 무시합니다."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "2.0 버전부터 Sphinx는 기본ì ìœ¼ë¡œ \"index\"를 root_doc으로 사용합니다. conf.pyì— \"root_doc = 'contents'\"를 추가하십시오."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "ì´ë²¤íŠ¸ %rì´(ê°€) ì´ë¯¸ 존재합니다"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "ì•Œ 수 없는 ì´ë²¤íŠ¸ ì´ë¦„: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "처리기 %r (ì´ë²¤íŠ¸ %rì— ëŒ€í•œ) ì—ì„œ 예외를 ë°œìƒí–ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "%s 확장 ê¸°ëŠ¥ì€ needs_extensions ì„¤ì •ì— ë”°ë¼ í•„ìš”í•˜ì§€ë§Œ, 로드ë˜ì§€ 않았습니다."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "ì´ í”„ë¡œì íŠ¸ì—는 최소한 %s ë²„ì „ì˜ %s 확장 ê¸°ëŠ¥ì´ í•„ìš”í•˜ë¯€ë¡œ 로드 ëœ ë²„ì „(%s)으로 빌드 í•  수 없습니다."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Pygments 구문 분ì„기 ì´ë¦„ %rì„(를) 확ì¸í•  수 없습니다"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "문서 \"%s\"ì— ëŒ€í•´ 여러 파ì¼ì„ 발견했습니다: %r\në¹Œë“œì— %rì„(를) 사용합니다."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "ë¹Œë” í´ëž˜ìŠ¤ %sì— \"name\" ì†ì„±ì´ 없습니다"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "%r 빌ë”ê°€ ì´ë¯¸ 존재합니다 (%s ëª¨ë“ˆì— ìžˆìŒ)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "ë¹Œë” ì´ë¦„ %sì´(ê°€) 등ë¡ë˜ì§€ 않았거나 진입ì ì„ 통해서만 사용할 수 있습니다"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "ë¹Œë” ì´ë¦„ %sì´(ê°€) 등ë¡ë˜ì§€ 않았습니다"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "%s ì˜ì—­ì´ ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "%s ì˜ì—­ì´ ì•„ì§ ë“±ë¡ë˜ì§€ 않았습니다"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "%r ì§€ì‹œë¬¸ì´ %s ì˜ì—­ì— ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "%r ì—­í• ì´ %s ì˜ì—­ì— ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "%r 색ì¸ì´ %s ì˜ì—­ì— ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "%r object_typeì´ ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "%r crossref_typeì´ ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %rì´(ê°€) ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "%rì— ëŒ€í•œ source_parserê°€ ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "%sì— ëŒ€í•œ 소스 í•´ì„기가 등ë¡ë˜ì§€ 않았습니다"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "%rì— ëŒ€í•œ 변환기가 ì´ë¯¸ 존재합니다"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "add_node()ì— ëŒ€í•œ kwargs는 반드시 (visit, depart)ì˜ í•¨ìˆ˜ 튜플ì´ì–´ì•¼ 합니다: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %rì´(ê°€) ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "ìˆ˜ì‹ ë Œë”러 %sì´(ê°€) ì´ë¯¸ 등ë¡ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "%r 확장 ê¸°ëŠ¥ì€ Sphinxì— ë²„ì „ %s ì´í›„ë¡œ ì´ë¯¸ 병합ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ í™•ìž¥ ê¸°ëŠ¥ì€ ë¬´ì‹œë©ë‹ˆë‹¤."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "ì›ëž˜ 예외:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "확장 기능 %sì„(를) 가져올 수 없습니다"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "확장 기능 %rì— setup() 함수가 없습니다. Sphinx 확장 ëª¨ë“ˆì´ ë§žìŠµë‹ˆê¹Œ?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "ì´ í”„ë¡œì íŠ¸ì—ì„œ 사용하는 %s 확장 기능ì—는 최소한 Sphinx v%sì´(ê°€) 필요합니다. ë”°ë¼ì„œ ì´ ë²„ì „ìœ¼ë¡œ 빌드 í•  수 없습니다."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "확장 기능 %rì´(ê°€) setup() 함수ì—ì„œ 지ì›ë˜ì§€ 않는 개체를 반환했습니다. None ë˜ëŠ” 메타ë°ì´í„° dictionary를 반환해야 합니다"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python í–¥ìƒ ì œì•ˆ; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "ìž˜ëª»ëœ PEP 번호 %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "ìž˜ëª»ëœ RFC 번호 %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "테마 %rì— \"theme\" ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "테마 %rì— \"inherit\" ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "ì´ë¦„ì´ %rì¸ í…Œë§ˆê°€ 없으며, %rì—ì„œ ìƒì†í•©ë‹ˆë‹¤"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "ê²€ìƒ‰ëœ í…Œë§ˆ 구성ì—ì„œ %s.%s ì„¤ì •ì´ ì¡´ìž¬í•˜ì§€ 않습니다"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "지ì›í•˜ì§€ 않는 테마 옵션 %rì„(를) 설정했습니다"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "테마 ê²½ë¡œì˜ %r 파ì¼ì´ 유효한 ZIP 파ì¼ì´ 아니거나 테마를 í¬í•¨í•˜ì§€ 않습니다"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "ì´ë¦„ì´ %rì¸ í…Œë§ˆë¥¼ ì°¾ì„ ìˆ˜ 없습니다 (theme.conf íŒŒì¼ ëˆ„ë½?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "%s 빌ë”ì— ì í•©í•œ ì´ë¯¸ì§€ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "%s 빌ë”ì— ì í•©í•œ ì´ë¯¸ì§€ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "빌드 중 [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "ì¶œë ¥ì„ ì“°ëŠ” 중… "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "모든 %d ê°œì˜ po 파ì¼"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "ì§€ì •ëœ %d ê°œì˜ po íŒŒì¼ ëŒ€ìƒ"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "ì˜¤ëž˜ëœ %d ê°œì˜ po íŒŒì¼ ëŒ€ìƒ"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "모든 ì›ë³¸ 파ì¼"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "ëª…ë ¹ì¤„ì— ì§€ì •ëœ íŒŒì¼ %rì´(ê°€) ì›ë³¸ ë””ë ‰í† ë¦¬ì— ìžˆì§€ 않으므로, 무시합니다"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "ëª…ë ¹ì¤„ì— ì§€ì •ëœ %d ê°œì˜ ì›ë³¸ 파ì¼"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "ì˜¤ëž˜ëœ %d ê°œì˜ ì›ë³¸ íŒŒì¼ ëŒ€ìƒ"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "빌드 중 [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "ì˜¤ëž˜ëœ íŒŒì¼ì„ 찾는 중… "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d ê°œ ì°¾ìŒ"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "ì°¾ì€ ê²ƒì´ ì—†ìŒ"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "pickleë¡œ í™˜ê²½ì„ ì €ìž¥í•˜ëŠ” 중"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "ì¼ê´€ì„± í™•ì¸ ì¤‘"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "ì˜¤ëž˜ëœ ëŒ€ìƒì´ 없습니다."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "í™˜ê²½ì„ ê°±ì‹ í•˜ëŠ” 중: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s ê°œ 추가ë¨, %s ê°œ 변경ë¨, %s ê°œ 제거ë¨"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "ì›ë³¸ì„ ì½ëŠ” 중… "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "기ë¡í•  문서 ì´ë¦„: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "문서 준비 중"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "ì¤‘ë³µëœ ëª©ì°¨ 항목 발견: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "ì´ë¯¸ì§€ë¥¼ 복사하는 중… "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "ì´ë¯¸ì§€ íŒŒì¼ %rì„(를) ì½ì„ 수 없으며, 대신 복사합니다"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "ì´ë¯¸ì§€ íŒŒì¼ %rì„(를) 복사할 수 없습니다: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "ì´ë¯¸ì§€ íŒŒì¼ %rì„(를) 기ë¡í•  수 없습니다: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow를 ì°¾ì„ ìˆ˜ 없습니다 - ì´ë¯¸ì§€ 파ì¼ì„ 복사합니다"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "mimetype íŒŒì¼ ì“°ëŠ” 중…"
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "META-INF/container.xml íŒŒì¼ ì“°ëŠ” 중…"
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "content.opf íŒŒì¼ ì“°ëŠ” 중…"
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "%sì€(는) ì•Œ 수 없는 MIME 유형ì´ë©°, 무시합니다"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "toc.ncx íŒŒì¼ ì“°ëŠ” 중…"
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "%s 파ì¼ì„ 기ë¡í•˜ëŠ” 중…"
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "개요 파ì¼ì€ %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "버전 %sì—는 변경 ì‚¬í•­ì´ ì—†ìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "요약 íŒŒì¼ ìž‘ì„± 중…"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "내장"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "모듈 수준"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "ì›ë³¸ 파ì¼ì„ 복사하는 중…"
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "변경 로그 ìƒì„±ì„ 위해 %rì„(를) ì½ì„ 수 없습니다"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "ë”미 빌ë”는 파ì¼ì„ ìƒì„±í•˜ì§€ 않습니다."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "ePub 파ì¼ì€ %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "nav.xhtml íŒŒì¼ ì“°ëŠ” 중…"
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "설정값 \"epub_language\"(ë˜ëŠ” \"language\")는 EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "설정값 \"epub_uid\"는 EPUB3ì˜ ê²½ìš° XML ì´ë¦„ì´ì–´ì•¼ 합니다"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "설정값 \"epub_title\"ì€ EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "설정값 \"epub_author\"는 EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "설정값 \"epub_contributor\"는 EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "설정값 \"epub_description\"ì€ EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "설정값 \"epub_publisher\"는 EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "설정값 \"epub_copyright\"(ë˜ëŠ” \"copyright\")는 EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "설정값 \"epub_identifier\"는 EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "설정값 \"version\"ì€ EPUB3ì˜ ê²½ìš° 비워 둘 수 없습니다"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "ìž˜ëª»ëœ css_file: %r, 무시합니다"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "메시지 카탈로그는 %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "%d ê°œì˜ í…œí”Œë¦¿ íŒŒì¼ ëŒ€ìƒ"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "í…œí”Œë¦¿ì„ ì½ëŠ” 중… "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "메시지 카탈로그 작성 중… "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "ìœ„ì˜ ì¶œë ¥ ë˜ëŠ” %(outdir)s/output.txt 파ì¼ì—ì„œ 오류를 확ì¸í•˜ì‹­ì‹œì˜¤"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "ëŠì–´ì§„ ë§í¬: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "linkcheck_allowed_redirectsì—ì„œ ì •ê·œì‹ì„ 컴파ì¼í•˜ì§€ 못했습니다: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "매뉴얼 페ì´ì§€ëŠ” %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "\"man_pages\" ì„¤ì •ê°’ì´ ì—†ìœ¼ë¯€ë¡œ, 매뉴얼 페ì´ì§€ë¥¼ 작성하지 않습니다"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "작성 중"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "\"man_pages\" ì„¤ì •ê°’ì´ ì•Œ 수 없는 문서 %sì„(를) 참조합니다"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML 페ì´ì§€ëŠ” %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "ë‹¨ì¼ ë¬¸ì„œ ì¡°í•© 중"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "추가 íŒŒì¼ ìž‘ì„± 중"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Texinfo 파ì¼ì€ %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nmakeinfo를 통해 작업하려면 해당 디렉토리ì—ì„œ 'make'를 실행하십시오\n(ìžë™ìœ¼ë¡œ 수행하려면 여기ì—ì„œ 'make info'를 사용하십시오)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "\"texinfo_documents\" ì„¤ì •ê°’ì´ ì—†ìœ¼ë¯€ë¡œ, 문서를 작성하지 않습니다"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "\"texinfo_documents\" ì„¤ì •ê°’ì´ ì•Œ 수 없는 문서 %sì„(를) 참조합니다"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "%s 처리 중"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "참조 처리 중…"
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (문서 "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "Texinfo ì§€ì› íŒŒì¼ì„ 복사하는 중"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "Makefile 쓰기 오류: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "í…스트 파ì¼ì€ %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "%s íŒŒì¼ ì“°ê¸° 오류: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "XML 파ì¼ì€ %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "ì˜ì‚¬ XML 파ì¼ì€ %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "빌드 ì •ë³´ 파ì¼ì´ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTML 페ì´ì§€ëŠ” %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "빌드 ì •ë³´ 파ì¼ì„ ì½ì„ 수 없습니다: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Yë…„ %mì›” %dì¼"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "ì „ì²´ 색ì¸"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "색ì¸"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "다ìŒ"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "ì´ì „"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "ìƒ‰ì¸ ìƒì„± 중"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "추가 페ì´ì§€ 작성 중"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "다운로드 가능한 파ì¼ì„ 복사하는 중… "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "다운로드 가능한 íŒŒì¼ %rì„(를) 복사할 수 없습니다: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "html_static_fileì— ìžˆëŠ” 파ì¼ì„ 복사할 수 없습니다: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "ì •ì  íŒŒì¼ì„ 복사하는 중"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "ì •ì  íŒŒì¼ì„ 복사할 수 없습니다: %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "추가 파ì¼ì„ 복사하는 중"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "추가 파ì¼ì„ 복사할 수 없습니다: %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "빌드 ì •ë³´ íŒŒì¼ ì“°ê¸° 실패: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "검색 색ì¸ì„ 불러올 수 없지만 모든 문서가 작성ë˜ì§€ëŠ” ì•Šì€ ê²ƒì€ ì•„ë‹™ë‹ˆë‹¤. 색ì¸ì´ 불완전합니다."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "%s 페ì´ì§€ê°€ html_sidebarsì˜ ë‘ íŒ¨í„´(%r ë° %r)ê³¼ ì¼ì¹˜í•©ë‹ˆë‹¤"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "%s 페ì´ì§€ë¥¼ ë Œë”ë§ í•  ë•Œ 유니코드 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. ASCIIê°€ ì•„ë‹Œ ë‚´ìš©ì„ í¬í•¨í•˜ëŠ” 모든 ì„¤ì •ê°’ì´ ìœ ë‹ˆì½”ë“œ 문ìžì—´ì¸ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "%s 페ì´ì§€ë¥¼ ë Œë”ë§í•˜ëŠ” ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤.\nì›ì¸: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "ê°ì²´ ì¸ë²¤í† ë¦¬ ë¤í”„ 중"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "%sì—ì„œ 검색 ì¸ë±ìŠ¤ ë¤í”„ 중"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "ìž˜ëª»ëœ js_file: %r, 무시합니다"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "여러 math_renderersê°€ 등ë¡ë˜ì–´ 있습니다. 하지만 math_rendererê°€ ì„ íƒë˜ì§€ 않았습니다."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "ì•Œ 수 없는 math_renderer %rì´(ê°€) 지정ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path 항목 %rì´(ê°€) 없습니다"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path 항목 %rì´(ê°€) outdir ì•ˆì— ìžˆìŠµë‹ˆë‹¤"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path 항목 %rì´(ê°€) 없습니다"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path 항목 %rì´(ê°€) outdir ì•ˆì— ìžˆìŠµë‹ˆë‹¤"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "로고 íŒŒì¼ %rì´(ê°€) 존재하지 않습니다"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "Favicon íŒŒì¼ %rì´(ê°€) 존재하지 않습니다"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s 문서"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTeX 파ì¼ì€ %(outdir)sì— ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\n(pdf)latexì„ í†µí•´ 작업하려면 해당 디렉토리ì—ì„œ 'make'를 실행하십시오\n(ìžë™ìœ¼ë¡œ 수행하려면 여기ì—ì„œ 'make latexpdf'를 사용하십시오)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "\"latex_documents\" ì„¤ì •ê°’ì´ ì—†ìœ¼ë¯€ë¡œ, 문서를 작성하지 않습니다"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "\"latex_documents\" ì„¤ì •ê°’ì´ ì•Œ 수 없는 문서 %sì„(를) 참조합니다"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "색ì¸"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "릴리스"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "%r ì–¸ì–´ì— ëŒ€í•´ 알려진 Babel ì˜µì…˜ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "TeX ì§€ì› íŒŒì¼ì„ 복사하는 중"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "TeX ì§€ì› íŒŒì¼ì„ 복사하는 중…"
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "추가 파ì¼ì„ 복사하는 중"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "알 수 없는 설정 키: latex_elements[%r], 무시합니다."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "알 수 없는 테마 옵션: latex_theme_options[%r], 무시합니다."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%rì— \"theme\" ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%rì— \"%s\" ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "빌드하는 ë™ì•ˆ 예외 ë°œìƒ, 디버거 시작:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "중단ë˜ì—ˆìŠµë‹ˆë‹¤!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "reST 마í¬ì—… 오류:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "ì¸ì½”딩 오류:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "개발ìžì—게 문제를 ë³´ê³ í•  경우를 위해, ì „ì²´ ì—­ì¶”ì  ì •ë³´ê°€ %sì— ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "재귀 오류:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "ì´ ìƒí™©ì€ 매우 í¬ê±°ë‚˜ ë§Žì´ ì¤‘ì²©ëœ ì›ë³¸ 파ì¼ì—ì„œ ë°œìƒí•  수 있습니다. 다ìŒê³¼ ê°™ì´ conf.pyì—ì„œ Python 재귀 제한 기본값 1000ì„ ëŠ˜ë¦´ 수 있습니다 (주ì˜):"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "예외 ë°œìƒ:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "ì‚¬ìš©ìž ì˜¤ë¥˜ì¸ ê²½ìš°ì—ë„ ì´ë¥¼ 보고하여, 다ìŒì— ë” ë‚˜ì€ ì˜¤ë¥˜ 메시지를 제공할 수 있ë„ë¡ í•´ 주십시오."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "버그 보고서는 <https://github.com/sphinx-doc/sphinx/issues>ì˜ íŠ¸ëž˜ì»¤ì— ì œì¶œí•  수 있습니다. ê°ì‚¬í•©ë‹ˆë‹¤!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "ìž‘ì—… 숫ìžëŠ” 양수여야 합니다"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "ìžì„¸í•œ ë‚´ìš©ì€ <https://www.sphinx-doc.org/>를 참조하십시오."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\n소스 파ì¼ë¡œë¶€í„° 문서를 ìƒì„±í•©ë‹ˆë‹¤.\n\nsphinx-build는 SOURCEDIRì— ìžˆëŠ” 파ì¼ë¡œë¶€í„° 문서를 ìƒì„±í•˜ì—¬ OUTPUTDIRì— ì €ìž¥í•©ë‹ˆë‹¤.\n구성 ì„¤ì •ì„ ìœ„í•´ SOURCEDIRì—ì„œ 'conf.py' 파ì¼ì„ 찾습니다.\n'sphinx-quickstart' ë„구는 'conf.py'를 í¬í•¨í•˜ì—¬ 템플릿 파ì¼ì„ ìƒì„±í•˜ëŠ” ë° ì‚¬ìš©í•  수 있습니다.\n\nsphinx-build는 다양한 형ì‹ìœ¼ë¡œ 문서를 ìƒì„±í•  수 있습니다.\n형ì‹ì€ 명령줄ì—ì„œ ë¹Œë” ì´ë¦„ì„ ì§€ì •í•˜ì—¬ ì„ íƒí•˜ë©°, ê¸°ë³¸ê°’ì€ HTML입니다.\n빌ë”는 문서 처리와 관련한 다른 태스í¬ë¥¼ 수행할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.\n\n기본ì ìœ¼ë¡œ ì˜¤ëž˜ëœ ëª¨ë“  í•­ëª©ì„ ë¹Œë“œí•©ë‹ˆë‹¤.\n개별 파ì¼ëª…ì„ ì§€ì •í•˜ì—¬ ì„ íƒí•œ 파ì¼ì— 대한 출력만 빌드할 수 있습니다.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "문서 ì›ë³¸ 파ì¼ì˜ 경로"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "출력 디렉토리 경로"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "다시 빌드 í•  특정 파ì¼ì˜ 목ë¡. -aê°€ 지정ë˜ë©´ 무시합니다"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "ì¼ë°˜ 옵션"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "사용할 ë¹Œë” (기본값: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "모든 íŒŒì¼ ê¸°ë¡ (기본값: 새 파ì¼ê³¼ ë³€ê²½ëœ íŒŒì¼ë§Œ 기ë¡)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "ì €ìž¥ëœ í™˜ê²½ì„ ì‚¬ìš©í•˜ì§€ ì•Šê³ , í•­ìƒ ëª¨ë“  íŒŒì¼ ì½ê¸°"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "ìºì‹œëœ 환경 ë° doctree íŒŒì¼ ê²½ë¡œ (기본값: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "가능한 경우 N ê°œì˜ í”„ë¡œì„¸ìŠ¤ë¥¼ 사용하여 병렬로 빌드 (특수 ê°’ \"auto\"는 CPU 개수로 N ê°’ì„ ì„¤ì •í•©ë‹ˆë‹¤)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "구성 파ì¼(conf.py)ì´ ìžˆëŠ” 경로 (기본값: SOURCEDIRê³¼ ë™ì¼)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "설정 파ì¼ì„ 전혀 사용하지 ì•Šê³ , -D 옵션들만 사용"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "구성 파ì¼ì˜ 설정 무시"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "HTML í…œí”Œë¦¿ì— ê°’ 전달"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "태그를 ì •ì˜: 태그가 있는 \"only\" 블ë¡ì„ í¬í•¨"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "까다로움 모드, 모든 누ë½ëœ ì°¸ì¡°ì— ëŒ€í•´ 경고 ë°œìƒ"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "콘솔 출력 옵션"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "ìƒì„¸ë„ 높임 (반복 가능)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "stdoutì— ì¶œë ¥í•˜ì§€ ì•Šê³ , stderrì— ê²½ê³ ë§Œ 표시"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "경고를 í¬í•¨í•˜ì—¬ 아무 ì¶œë ¥ë„ í•˜ì§€ ì•ŠìŒ"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "컬러 출력 허용 (기본값: ìžë™ ê°ì§€)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "컬러 ì¶œë ¥ì„ í—ˆìš©í•˜ì§€ ì•ŠìŒ (기본값: ìžë™ ê°ì§€)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "주어진 파ì¼ì— 경고(ë° ì˜¤ë¥˜)를 기ë¡"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "경고를 오류로 바꿈"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "-W와 함께 지정하여, 경고가 ë°œìƒí–ˆì„ ë•Œ ê³„ì† ì§„í–‰"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "예외 ë°œìƒ ì‹œ ì „ì²´ ì¶”ì  í‘œì‹œ"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "예외 ë°œìƒ ì‹œ Pdb 실행"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "-a 옵션과 íŒŒì¼ ì´ë¦„ì„ í•¨ê»˜ 사용할 수 없습니다"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "경고 ê¸°ë¡ íŒŒì¼ %rì„(를) ì—´ 수 없습니다: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-D 옵션 ì¸ìˆ˜ëŠ” name=value 형ì‹ì´ì–´ì•¼ 합니다"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-A 옵션 ì¸ìˆ˜ëŠ” name=value 형ì‹ì´ì–´ì•¼ 합니다"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "모듈ì—ì„œ ìžë™ìœ¼ë¡œ docstring 삽입"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "doctest 블ë¡ì˜ 코드 ì¡°ê°ì„ ìžë™ìœ¼ë¡œ 테스트"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "다른 프로ì íŠ¸ì˜ Sphinx 문서 ê°„ ë§í¬"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "빌드 ì‹œ 표시하거나 숨길 수 있는 \"í•  ì¼\" 항목 작성"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "ë¬¸ì„œì˜ ì»¤ë²„ë¦¬ì§€ 확ì¸"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "PNG나 SVG ì´ë¯¸ì§€ë¡œ ë Œë”ë§ ëœ ìˆ˜ì‹ í¬í•¨"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "MathJaxë¡œ 브ë¼ìš°ì €ì—ì„œ ë Œë”ë§ í•˜ëŠ” ìˆ˜ì‹ í¬í•¨"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "ì„¤ì •ê°’ì„ ê¸°ë°˜ìœ¼ë¡œ 콘í…츠를 조건부 í¬í•¨"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "문서화 ëœ Python ê°ì²´ì˜ 소스 ì½”ë“œì— ëŒ€í•œ ë§í¬ í¬í•¨"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "GitHub 페ì´ì§€ì— 문서를 게시하기 위해 .nojekyll íŒŒì¼ ìƒì„±"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "유효한 경로 ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "í…스트를 입력하십시오."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "%s 중 하나를 입력하십시오."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "'y' ë˜ëŠ” 'n'ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "íŒŒì¼ ì ‘ë¯¸ì‚¬ë¥¼ 입력하십시오 (예: '.rst' ë˜ëŠ” '.txt')."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Sphinx %s 빠른 시작 ìœ í‹¸ë¦¬í‹°ì— ì˜¤ì‹  ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "ë‹¤ìŒ ì„¤ì •ì— ëŒ€í•œ ê°’ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤ (대괄호로 묶여 있는 ê¸°ë³¸ê°’ì´ ì¡´ìž¬í•˜ê³ \nì´ ê°’ì„ ì‚¬ìš©í•˜ë ¤ë©´ 바로 Enter를 누릅니다)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "ì„ íƒí•œ 루트 경로: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "ë¬¸ì„œì˜ ë£¨íŠ¸ 경로를 입력하십시오."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "ë¬¸ì„œì˜ ë£¨íŠ¸ 경로"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "오류: ì„ íƒí•œ 루트 경로ì—ì„œ 기존 conf.py 파ì¼ì´ 발견ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart는 기존 Sphinx 프로ì íŠ¸ë¥¼ ë®ì–´ 쓰지 않습니다."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "새 루트 경로를 입력하십시오 (ë˜ëŠ” Enter를 눌러 종료)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Sphinx ì¶œë ¥ì„ ìœ„í•œ 빌드 디렉토리를 배치하는 ë‘ ê°€ì§€ ì˜µì…˜ì´ ìžˆìŠµë‹ˆë‹¤.\n루트 경로 ë‚´ì—ì„œ \"_build\" 디렉토리를 사용하거나, 루트 경로 ë‚´ì—ì„œ\n\"source\"와 \"build\" 디렉토리로 분리합니다."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "ì›ë³¸ê³¼ 빌드 디렉토리 분리 (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "루트 디렉토리 ë‚´ì— ë‘ ê°œì˜ ì¶”ê°€ 디렉토리가 ìƒì„±ë©ë‹ˆë‹¤. ì‚¬ìš©ìž ì •ì˜ HTML 템플릿ì˜\n경우 \"_templates\", ì‚¬ìš©ìž ì •ì˜ ìŠ¤íƒ€ì¼ì‹œíŠ¸ ë° ê¸°íƒ€ ì •ì  íŒŒì¼ì˜ 경우 \"_static\"\n입니다. 다른 ì ‘ë‘사(\".\" ê³¼ ê°™ì€)를 입력하여 밑줄 문ìžë¥¼ 변경할 수 있습니다."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "템플릿 ë° ì •ì  ë””ë ‰í† ë¦¬ì˜ ì´ë¦„ ì ‘ë‘사"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "프로ì íŠ¸ ì´ë¦„ì€ ë¹Œë“œ ëœ ë¬¸ì„œì˜ ì—¬ëŸ¬ ìœ„ì¹˜ì— í‘œì‹œë©ë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "프로ì íŠ¸ ì´ë¦„"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "ìž‘ì„±ìž ì´ë¦„"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx는 ì†Œí”„íŠ¸ì›¨ì–´ì— ëŒ€í•œ \"버전\"ê³¼ \"릴리스\"ë¼ëŠ” ê°œë…ì„ ê°€ì§€ê³  있습니다.\nê° ë²„ì „ì—는 여러 릴리스가 ìžˆì„ ìˆ˜ 있습니다. 예를 들어 Pythonì˜ ê²½ìš° 버전ì€\n2.5나 3.0ê³¼ ê°™ì€ ë°˜ë©´ 릴리스는 2.5.1 ë˜ëŠ” 3.0a1ê³¼ 같습니다.\nì´ëŸ¬í•œ ì´ì¤‘ 구조가 필요하지 않으면 둘 다 ë™ì¼í•œ 값으로 설정하십시오."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "프로ì íŠ¸ 버전"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "프로ì íŠ¸ 릴리스"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "문서를 ì˜ì–´ ì´ì™¸ì˜ 언어로 작성하려는 경우, 여기ì—ì„œ 해당 언어 코드로 언어를\nì„ íƒí•  수 있습니다. 그러면 Sphinxê°€ ìƒì„±í•œ í…스트를 해당 언어로 번역합니다.\n\n지ì›ë˜ëŠ” 코드 목ë¡ì€\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language\n를 참조하십시오."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "프로ì íŠ¸ 언어"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "ì›ë³¸ 파ì¼ì˜ íŒŒì¼ ì´ë¦„ 접미사. ì¼ë°˜ì ìœ¼ë¡œ \".txt\" ë˜ëŠ” \".rst\" 입니다. ì´ ì ‘ë¯¸ì‚¬ê°€\n있는 파ì¼ë§Œ 문서로 간주ë©ë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "ì›ë³¸ íŒŒì¼ ì ‘ë¯¸ì‚¬"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "í•œ 문서는 \"컨í…츠 트리\"ì˜ ìµœìƒìœ„ 노드, 즉 문서 계층 êµ¬ì¡°ì˜ ë£¨íŠ¸ë¡œ 간주ëœë‹¤ëŠ”\nì ì—ì„œ 특별합니다. ì¼ë°˜ì ìœ¼ë¡œ ì´ ê°’ì€ \"index\" ì´ì§€ë§Œ, \"index\" 문서가\nì‚¬ìš©ìž ì •ì˜ í…œí”Œë¦¿ì¼ ê²½ìš° ì´ë¥¼ 다른 íŒŒì¼ ì´ë¦„으로 설정할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "마스터 ë¬¸ì„œì˜ ì´ë¦„ (접미사 ì—†ì´)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "오류: ì„ íƒí•œ 루트 ê²½ë¡œì— ë§ˆìŠ¤í„° íŒŒì¼ %sì´(ê°€) ì´ë¯¸ 있습니다."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart는 기존 파ì¼ì„ ë®ì–´ 쓰지 않습니다."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "새 íŒŒì¼ ì´ë¦„ì„ ìž…ë ¥í•˜ê±°ë‚˜ 기존 파ì¼ì˜ ì´ë¦„ì„ ë°”ê¾¸ê³ , Enter를 누르십시오"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "ë‹¤ìŒ Sphinx 확장 기능 중 사용 설정해야 하는 í•­ëª©ì„ ì§€ì •í•˜ì‹­ì‹œì˜¤:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "참고: imgmath와 mathjax는 ë™ì‹œì— 활성화 í•  수 없습니다. imgmathê°€ ì„ íƒ ì·¨ì†Œë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Makefile ë° Windows 명령 파ì¼ì„ ìƒì„±í•  수 있으므로, sphinx-build를 ì§ì ‘ 호출하는\n대신 (예를 들어) `make html'ì„ ì‹¤í–‰í•˜ê¸°ë§Œ 하면 ë©ë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Makefileì„ ë§Œë“œì‹œê² ìŠµë‹ˆê¹Œ? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Windows 명령 파ì¼ì„ 만드시겠습니까? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "%s 파ì¼ì„ 만드는 중입니다."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "%s 파ì¼ì´ ì´ë¯¸ 존재하여, 건너ëœë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "완료ë¨: 초기 디렉토리 구조가 ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "ì´ì œ 마스터 íŒŒì¼ %sì„(를) 채우고 다른 ì›ë³¸ 문서 파ì¼ì„ 만들어야 합니다. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Makefileì„ ì‚¬ìš©í•˜ì—¬ 다ìŒê³¼ ê°™ì´ ë¬¸ì„œë¥¼ 빌드하십시오:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "sphinx-build ëª…ë ¹ì„ ì‚¬ìš©í•˜ì—¬ 다ìŒê³¼ ê°™ì´ ë¬¸ì„œë¥¼ 빌드하십시오:\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "여기서 \"builder\"는 지ì›ë˜ëŠ” ë¹Œë” ì¤‘ 하나(예: html, latex, linkcheck)입니다."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nSphinx 프로ì íŠ¸ì— 필요한 파ì¼ì„ ìƒì„±í•©ë‹ˆë‹¤.\n\nsphinx-quickstart는 대화형 ë„구로서, 프로ì íŠ¸ì— 대한 몇 가지 ì§ˆë¬¸ì„ í•œ 다ìŒ\n완전한 문서 디렉토리와 (sphinx-build와 함께 사용할 수 있는) 견본 Makefileì„ ìƒì„±í•©ë‹ˆë‹¤.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "조용한 모드"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "프로ì íŠ¸ 루트 디렉토리"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "구조 옵션"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "ì§€ì •ëœ ê²½ìš°, ì›ë³¸ê³¼ 빌드 디렉토리를 구분합니다"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "ì§€ì •ëœ ê²½ìš°, ì›ë³¸ 디렉토리 ì•„ëž˜ì— ë¹Œë“œ 디렉토리를 만듭니다"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "_templates 등ì—ì„œ ë§ˆì¹¨í‘œì˜ ëŒ€ì²´ 문ìž"
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "프로ì íŠ¸ 기본 옵션"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "프로ì íŠ¸ ì´ë¦„"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "ìž‘ì„±ìž ì´ë¦„"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "프로ì íŠ¸ì˜ 버전"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "프로ì íŠ¸ì˜ 릴리스"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "문서 언어"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "ì›ë³¸ 파ì¼ì˜ 접미사"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "마스터 문서 ì´ë¦„"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "EPUB 사용"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "확장 기능 옵션"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "%s 확장 기능 사용"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "ìž„ì˜ì˜ 확장 기능 사용"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Makefileê³¼ 배치 íŒŒì¼ ìƒì„±"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "makefile ìƒì„±"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "makefileì„ ìƒì„±í•˜ì§€ ì•ŠìŒ"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "배치 íŒŒì¼ ìƒì„±"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "배치 파ì¼ì„ ìƒì„±í•˜ì§€ ì•ŠìŒ"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.batì—ì„œ make 모드 사용"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.batì—ì„œ make 모드 사용하지 ì•ŠìŒ"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "프로ì íŠ¸ 템플릿"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "템플릿 파ì¼ì— 대한 템플릿 디렉토리"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "템플릿 변수 ì •ì˜"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"quiet\"ì´ ì§€ì •ë˜ì—ˆì§€ë§Œ, \"project\" ë˜ëŠ” \"author\"ê°€ ì •ì˜ë˜ì§€ 않았습니다."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "오류: ì§€ì •ëœ ê²½ë¡œê°€ 디렉토리가 아니거나, Sphinx 파ì¼ì´ ì´ë¯¸ 있습니다."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart는 빈 디렉토리ì—만 ìƒì„±ë©ë‹ˆë‹¤. 새 루트 경로를 지정하십시오."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "ìž˜ëª»ëœ í…œí”Œë¦¿ 변수: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "ë‚´ì–´ì“°ê¸°ì— ì˜í•´ 비 공백 문ìžê°€ 제거ë¨"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "ìž˜ëª»ëœ ìº¡ì…˜: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "줄 번호 ì§€ì •ì´ ë²”ìœ„ë¥¼ 벗어남 (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "\"%s\"ê³¼(와) \"%s\" ì˜µì…˜ì„ ëª¨ë‘ ì‚¬ìš©í•  수 없습니다"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "í¬í•¨ íŒŒì¼ %rì„(를) ì°¾ì„ ìˆ˜ 없거나 ì½ì§€ 못했습니다"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "í¬í•¨ íŒŒì¼ %rì„ ì½ëŠ”ë° ì‚¬ìš©í•œ %r ì¸ì½”ë”©ì´ ìž˜ëª»ëœ ê²ƒ 같습니다. :encoding: ì˜µì…˜ì„ ì§€ì •í•´ 보십시오"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "í¬í•¨ íŒŒì¼ %rì—ì„œ ì´ë¦„ì´ %r ì¸ ê°ì²´ë¥¼ ì°¾ì„ ìˆ˜ 없습니다"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "ë¶„ë¦¬ëœ \"lines\" 집합과 함께 \"lineno-match\"를 사용할 수 없습니다"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "í–‰ 지정 %r: í¬í•¨ íŒŒì¼ %rì—ì„œ 가져온 ì¤„ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "toctree glob 패턴 %r ì´(ê°€) ì–´ëŠ ë¬¸ì„œì™€ë„ ì¼ì¹˜í•˜ì§€ 않습니다"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctreeì— ì œì™¸ëœ ë¬¸ì„œ %rì— ëŒ€í•œ 참조가 있ìŒ"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctreeì— ì¡´ìž¬í•˜ì§€ 않는 문서 %rì— ëŒ€í•œ 참조가 있ìŒ"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "toctreeì—ì„œ 중복 í•­ëª©ì´ ë°œê²¬ë¨: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "구역 작성ìž: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "모듈 작성ìž: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "코드 작성ìž: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "작성ìž: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ".. acks ë‚´ìš©ì´ ëª©ë¡ì´ 아닙니다"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ".. hlist ë‚´ìš©ì´ ëª©ë¡ì´ 아닙니다"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "csv-table ì§€ì‹œë¬¸ì˜ \":file:\" ì˜µì…˜ì€ ì´ì œ 절대 경로를 소스 ë””ë ‰í† ë¦¬ì˜ ìƒëŒ€ 경로로 ì¸ì‹í•©ë‹ˆë‹¤. 문서를 ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "중복 C ì„ ì–¸ì´ë©°, %s:%sì— ì •ì˜ë˜ì—ˆìŠµë‹ˆë‹¤.\nì„ ì–¸ì€ '.. c:%s:: %s' 입니다."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "매개변수"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "반환값"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "반환"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "반환 형ì‹"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "멤버 변수"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "변수"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "함수"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "매í¬ë¡œ"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "구조체"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "공용체"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "열거형"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "ì—´ê±°ìž"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "ìžë£Œí˜•"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "함수 매개변수"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "버전 %sì— ì¶”ê°€"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "버전 %sì—ì„œ 변경"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "버전 %s부터 í지ë¨"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "중복 ì¸ìš© %s, 다른 ì¸ìŠ¤í„´ìŠ¤ëŠ” %sì— ìžˆìŒ"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "ì¸ìš© [%s]ì´(ê°€) 참조ë˜ì§€ 않았습니다."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "중복 C++ ì„ ì–¸ì´ë©°, %s:%sì— ì •ì˜ë˜ì—ˆìŠµë‹ˆë‹¤.\nì„ ì–¸ì€ '.. cpp:%s:: %s' 입니다."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "템플릿 매개변수"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "예외"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "í´ëž˜ìŠ¤"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "콘셉트"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "템플릿 매개변수"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (내장 함수)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s 메서드)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (í´ëž˜ìŠ¤)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (ì „ì—­ 변수 ë˜ëŠ” ìƒìˆ˜)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%sì˜ ì†ì„±)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "ì¸ìˆ˜"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (모듈)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "메서드"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "ë°ì´í„°"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "ì†ì„±"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "모듈"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "ì¤‘ë³µëœ %s 설명 (%sì— ëŒ€í•œ), 다른 í•­ëª©ì€ %s (%s)ì— ìžˆìŒ"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "중복 ë ˆì´ë¸”ì˜ ìˆ˜ì‹ %s, 다른 ì¸ìŠ¤í„´ìŠ¤ëŠ” %sì— ìžˆìŒ"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "ìž˜ëª»ëœ math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "변수"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "예외 ë°œìƒ"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s 모듈)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s 모듈)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (내장 변수)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (내장 í´ëž˜ìŠ¤)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s í´ëž˜ìŠ¤)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%sì˜ í´ëž˜ìŠ¤ 메서드)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%sì˜ ì •ì  ë©”ì„œë“œ)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (%sì˜ íŠ¹ì„±)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python 모듈 목ë¡"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "모듈"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "í지ë¨"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "예외"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "í´ëž˜ìŠ¤ 메서드"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "ì •ì  ë©”ì„œë“œ"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "특성"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "ìƒí˜¸ 참조 %rì— ëŒ€í•´ 둘 ì´ìƒì˜ 대ìƒì„ 찾았습니다: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (í지ë¨)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (지시문)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (지시문 옵션)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (ì—­í• )"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "지시문"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "지시문 옵션"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "ì—­í• "
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "ì¤‘ë³µëœ %s %s 설명, 다른 ì¸ìŠ¤í„´ìŠ¤ëŠ” %sì— ìžˆìŒ"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "환경 변수; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "ìž˜ëª»ëœ ì˜µì…˜ 설명 %r, \"opt\", \"-opt args\", \"--opt args\", \"/opt args\", \"+opt args\"와 ê°™ì€ í˜•ì‹ì´ì–´ì•¼ 합니다"
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s 명령줄 옵션"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "명령줄 옵션"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "ìš©ì–´ ì•žì—는 빈 ì¤„ì´ ì™€ì•¼ 합니다"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "ìš©ì–´ ì •ì˜ëŠ” 빈 줄로 구분하면 안ë©ë‹ˆë‹¤."
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "ìš©ì–´ ì •ì˜ í˜•ì‹ì´ ìž˜ëª»ëœ ê²ƒ 같습니다. 들여쓰기를 확ì¸í•˜ì‹­ì‹œì˜¤"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "용어 항목"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "문법 토í°"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "참조 ë ˆì´ë¸”"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "환경 변수"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "프로그램 옵션"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "문서"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "모듈 목ë¡"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "검색 페ì´ì§€"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "중복 ë ˆì´ë¸” %s, 다른 ì¸ìŠ¤í„´ìŠ¤ëŠ” %sì— ìžˆìŒ"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "ì¤‘ë³µëœ %s 설명 (%sì— ëŒ€í•œ), 다른 ì¸ìŠ¤í„´ìŠ¤ëŠ” %sì— ìžˆìŒ"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfigê°€ 비활성화ë˜ì—ˆìŠµë‹ˆë‹¤. :numref:는 무시ë©ë‹ˆë‹¤."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "ìƒí˜¸ 참조를 ìƒì„±í•˜ì§€ 못했습니다. ì–´ë–¤ ë²ˆí˜¸ë„ í• ë‹¹ë˜ì§€ 않았습니다: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "ë§í¬ì— ìº¡ì…˜ì´ ì—†ìŠµë‹ˆë‹¤: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "ìž˜ëª»ëœ numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "ìž˜ëª»ëœ numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "ì •ì˜ë˜ì§€ ì•Šì€ ë ˆì´ë¸”: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "ìƒí˜¸ 참조를 ìƒì„±í•˜ì§€ 못했습니다. 제목 ë˜ëŠ” ìº¡ì…˜ì„ ì°¾ì„ ìˆ˜ 없습니다: %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "새로운 설정"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "ì„¤ì •ì´ ë³€ê²½ë¨"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "확장 ê¸°ëŠ¥ì´ ë³€ê²½ë¨"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "빌드 환경 ë²„ì „ì´ ìµœì‹ ì´ ì•„ë‹˜"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "ì›ë³¸ 디렉토리가 변경ë¨"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "ì´ í™˜ê²½ì€ ì„ íƒí•œ 빌ë”와 호환ë˜ì§€ 않습니다. 다른 doctree 디렉토리를 ì„ íƒí•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "%sì—ì„œ 문서를 íƒìƒ‰í•˜ì§€ 못했습니다: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "%r ì˜ì—­ì´ 등ë¡ë˜ì§€ 않았습니다"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "문서가 ì–´ëŠ toctreeì—ë„ í¬í•¨ë˜ì–´ 있지 ì•ŠìŒ"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "ìžì²´ ì°¸ì¡°ëœ toctreeê°€ 발견ë˜ì—ˆìŠµë‹ˆë‹¤. 무시합니다."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "%s 문서"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "%s 참조"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "ì•Œ 수 없는 ìƒ‰ì¸ í•­ëª© 유형 %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "기호"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "순환 toctree 참조가 ê°ì§€ë˜ì—ˆìœ¼ë©°, 무시합니다: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctreeì— ì œëª©ì´ ì—†ëŠ” 문서 %rì— ëŒ€í•œ 참조가 있습니다. ë§í¬ê°€ ìƒì„±ë˜ì§€ 않습니다"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "ì´ë¯¸ì§€ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "ì´ë¯¸ì§€ íŒŒì¼ %sì„(를) ì½ì„ 수 ì—†ìŒ: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "다운로드 가능 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%sì— ì´ë¯¸ 구역 번호가 할당ë˜ì—ˆìŠµë‹ˆë‹¤ (ì¤‘ì²©ëœ ë²ˆí˜¸ ë¶™ì¸ toctree?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "%s 파ì¼ì„ 작성합니다."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\n<MODULE_PATH>ì—ì„œ Python 모듈 ë° íŒ¨í‚¤ì§€ë¥¼ 재귀ì ìœ¼ë¡œ 찾고\nautomodule ì§€ì‹œë¬¸ì´ ìžˆëŠ” 패키지 당 í•˜ë‚˜ì˜ reST 파ì¼ì„ <OUTPUT_PATH>ì— ë§Œë“­ë‹ˆë‹¤.\n\n<EXCLUDE_PATTERN>ì€ ìƒì„±ì—ì„œ 제외할 íŒŒì¼ ë˜ëŠ” 디렉토리 íŒ¨í„´ì¼ ìˆ˜ 있습니다.\n\n참고: 기본ì ìœ¼ë¡œì´ 스í¬ë¦½íŠ¸ëŠ” ì´ë¯¸ ìƒì„±ëœ 파ì¼ì„ ë®ì–´ 쓰지 않습니다."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "ë¬¸ì„œì— ëŒ€í•œ 모듈 경로"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "ìƒì„±ì—ì„œ 제외할 fnmatch 형ì‹ì˜ íŒŒì¼ ë˜ëŠ” 디렉토리 패턴"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "모든 ì¶œë ¥ì„ ì €ìž¥í•  디렉토리"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "ëª©ì°¨ì— í‘œì‹œí•  하위 ëª¨ë“ˆì˜ ìµœëŒ€ ê¹Šì´ (기본값: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "기존 íŒŒì¼ ë®ì–´ì“°ê¸°"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "심볼릭 ë§í¬ë¥¼ ë”°ë¼ê°‘니다. collective.recipe.omeletteê³¼ 결합하면 강력합니다."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "파ì¼ì„ ìƒì„±í•˜ì§€ ì•Šê³  스í¬ë¦½íŠ¸ 실행"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "ê° ëª¨ë“ˆì— ëŒ€í•œ 문서를 개별 페ì´ì§€ì— 배치"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "\"_private\" 모듈 í¬í•¨"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "ëª©ì°¨ì˜ íŒŒì¼ ì´ë¦„ (기본값: modules)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "목차 파ì¼ì„ 만들지 ì•ŠìŒ"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "모듈/íŒ¨í‚¤ì§€ì— ëŒ€í•œ ì œëª©ì„ ë§Œë“¤ì§€ ì•ŠìŒ (예: docstringì— ì´ë¯¸ í¬í•¨ëœ 경우)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "서브 모듈 문서 ì•žì— ëª¨ë“ˆ 문서를 ë„£ìŒ"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "PEP-0420 ì•”ì‹œì  ë„¤ìž„ 스페ì´ìŠ¤ ì‚¬ì–‘ì— ë”°ë¼ ëª¨ë“ˆ 경로 í•´ì„"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "íŒŒì¼ í™•ìž¥ìž (기본값: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "sphinx-quickstartë¡œ ì „ì²´ 프로ì íŠ¸ ìƒì„±"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "--fullì´ ì£¼ì–´ì¡Œì„ ë•Œ, sys.pathì— module_path 추가"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "프로ì íŠ¸ ì´ë¦„ (기본값: 루트 모듈 ì´ë¦„)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "--fullì´ ì£¼ì–´ì¡Œì„ ë•Œ, 프로ì íŠ¸ 작성ìž"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "--fullì´ ì£¼ì–´ì¡Œì„ ë•Œ, 프로ì íŠ¸ 버전"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "--fullì´ ì£¼ì–´ì¡Œì„ ë•Œ, 프로ì íŠ¸ì˜ 릴리스ì´ë©° ê¸°ë³¸ê°’ì€ --doc-version ê°’ê³¼ ê°™ìŒ"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "확장 기능 옵션"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%sì€(는) 디렉토리가 아닙니다."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "ìž˜ëª»ëœ ì •ê·œì‹ %r (%sì—ì„œ)"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "소스ì—ì„œ 커버리지 테스트가 완료ë˜ì—ˆìœ¼ë©°, %(outdir)s/python.txt ì—ì„œ 결과를 확ì¸í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "coverage_c_regexesì˜ ìž˜ëª»ëœ ì •ê·œí‘œí˜„ì‹ %r"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "문서화ë˜ì§€ ì•Šì€ C API: %s [%s], íŒŒì¼ %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "%s ëª¨ë“ˆì„ ê°€ì ¸ì˜¬ 수 없습니다: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "문서화ë˜ì§€ ì•Šì€ Python 함수: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "문서화ë˜ì§€ ì•Šì€ Python í´ëž˜ìŠ¤: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "문서화ë˜ì§€ ì•Šì€ Python 메소드: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "'%s' ì˜µì…˜ì— '+'나 '-'ê°€ 없습니다."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s'ì€(는) 유효한 ì˜µì…˜ì´ ì•„ë‹™ë‹ˆë‹¤."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s'ì€(는) 유효한 pyversion ì˜µì…˜ì´ ì•„ë‹™ë‹ˆë‹¤"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "ìž˜ëª»ëœ TestCode 유형"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "소스ì—ì„œ doctest 테스트가 완료ë˜ì—ˆìœ¼ë©°, %(outdir)s/output.txt ì—ì„œ 결과를 확ì¸í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "%s 블ë¡(%s:%s)ì— ì½”ë“œ/출력 ì—†ìŒ"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "ìž˜ëª»ëœ doctest 코드 무시: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== 가장 ëŠë¦° ì½ê¸° 시간 ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "하드코딩 ëœ ë§í¬ %rì€(는) extlinkë¡œ 대체할 수 있습니다 (대신 %rì„(를) 사용해 보십시오)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Graphviz ì§€ì‹œë¬¸ì— ë‚´ìš©ê³¼ íŒŒì¼ ì´ë¦„ ì¸ìˆ˜ë¥¼ ëª¨ë‘ ì§€ì •í•  수 없습니다"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "외부 Graphviz íŒŒì¼ %rì„(를) ì°¾ì„ ìˆ˜ 없거나 ì½ì§€ 못했습니다"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "ë‚´ìš©ì´ ì—†ëŠ” \"graphviz\" ì§€ì‹œë¬¸ì„ ë¬´ì‹œí•©ë‹ˆë‹¤."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "dot 명령 %rì„(를) 실행할 수 없습니다 (graphviz ì¶œë ¥ì— í•„ìš”). graphviz_dot ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dotì´ ì˜¤ë¥˜ì™€ 함께 종료ë˜ì—ˆìŠµë‹ˆë‹¤:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dotì´ ì¶œë ¥ 파ì¼ì„ ìƒì„±í•˜ì§€ 않았습니다:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_formatì€ 'png', 'svg' 중 하나여야 하지만, ê°’ì´ %r 입니다"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "dot 코드 %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[그래프: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[그래프]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "ì´ë¯¸ì§€ 변환 명령 %rì„(를) 실행할 수 없습니다. 'sphinx.ext.imgconverter'ì—는 기본ì ìœ¼ë¡œ ImageMagickì´ í•„ìš”í•©ë‹ˆë‹¤. 해당 í”„ë¡œê·¸ëž¨ì´ ì„¤ì¹˜ë˜ì–´ 있는지 확ì¸í•˜ê±°ë‚˜, 'image_converter' ì˜µì…˜ì„ ì‚¬ìš©ìž ì •ì˜ ë³€í™˜ 명령으로 설정하십시오.\n\n역추ì : %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "convertê°€ 오류와 함께 종료ë˜ì—ˆìŠµë‹ˆë‹¤:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "변환 명령 %rì„(를) 실행할 수 없습니다. image_converter ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "LaTeX 명령 %rì„(를) 실행할 수 없습니다 (ìˆ˜ì‹ í‘œì‹œì— í•„ìš”). imgmath_latex ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s 명령 %rì„(를) 실행할 수 없습니다 (ìˆ˜ì‹ í‘œì‹œì— í•„ìš”). imgmath_%s ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "표시 LaTeX %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "ì¸ë¼ì¸ LaTeX %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "intersphinx ì¸ë²¤í† ë¦¬ê°€ ì´ë™í•¨: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "%s ì—ì„œ intersphinx ì¸ë²¤í† ë¦¬ 로드 중…"
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "ì¼ë¶€ ì¸ë²¤í† ë¦¬ì—ì„œ 몇 가지 문제가 ë°œìƒí–ˆì§€ë§Œ, ë™ìž‘하는 대체 ì¸ë²¤í† ë¦¬ë¡œ 처리했습니다:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "ë‹¤ìŒ ë¬¸ì œê°€ 있어 ì–´ëŠ ì¸ë²¤í† ë¦¬ë„ ë„달하지 못했습니다:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(%s v%sì—ì„œ)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(%sì—ì„œ)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "외부 ìƒí˜¸ ì°¸ì¡°ì— ëŒ€í•œ ì¸ë²¤í† ë¦¬ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "외부 ìƒí˜¸ ì°¸ì¡°ì— ëŒ€í•œ ì—­í• ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "외부 %s:%s 참조 대ìƒì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "intersphinx ì‹ë³„ìž %rì´(ê°€) 문ìžì—´ì´ 아닙니다. 무시합니다"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "intersphinx_mapping[%s]ì„(를) ì½ì§€ 못했으며, 무시합니다: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[소스]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "í•  ì¼"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "TODO 항목 발견: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<ì›ëž˜ 항목>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<ì›ëž˜ 항목>>ì€ %s 파ì¼, %d í–‰ì— ìžˆìŠµë‹ˆë‹¤.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "ì›ëž˜ 항목"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "모듈 코드 강조 중… "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[문서]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "모듈 코드"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%sì˜ ì†ŒìŠ¤ 코드</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "개요: 모듈 코드"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>코드를 확ì¸í•  수 있는 모든 모듈</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "member-order ì˜µì…˜ì— ëŒ€í•´ ìž˜ëª»ëœ ê°’: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "class-doc-from ì˜µì…˜ì— ëŒ€í•´ ìž˜ëª»ëœ ê°’: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "auto%s (%r)ì— ëŒ€í•œ ìž˜ëª»ëœ ì„œëª…"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "%sì— ëŒ€í•œ ì¸ìˆ˜ë¥¼ ì„œì‹í™”하는 ë™ì•ˆ 오류 ë°œìƒ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc: 문서화 í•  %s.%s (%r) ì„(를) 결정하지 못했으며, ë‹¤ìŒ ì˜ˆì™¸ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "%rì˜ ìžë™ 문서화를 위해 가져올 ëª¨ë“ˆì„ ì•Œ 수 없습니다 (ë¬¸ì„œì— \"module\" ë˜ëŠ” \"currentmodule\" ì§€ì‹œë¬¸ì„ ë°°ì¹˜í•˜ê±°ë‚˜, 명시ì ìœ¼ë¡œ 모듈 ì´ë¦„ì„ ì§€ì •í•´ 보십시오)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "ëª¨ì˜ ê°ì²´ê°€ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤: %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "%sì— ëŒ€í•œ ì„œëª…ì„ ì„œì‹í™”하는 ë™ì•ˆ 오류 ë°œìƒ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "automodule ì´ë¦„ì˜ \"::\"ì€ ì˜ë¯¸ê°€ ì—†ìŒ"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "automodule %sì— ëŒ€í•´ 서명 ì¸ìˆ˜ ë˜ëŠ” 반환 ê°’ 주ì„ì´ ì§€ì •ë¨"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ì€ %rì´(ê°€) ì•„ë‹Œ 문ìžì—´ì˜ 목ë¡ì´ì–´ì•¼ 합니다 (모듈 %s) -- __all__ì„ ë¬´ì‹œí•©ë‹ˆë‹¤"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ":members: ì˜µì…˜ì— ì–¸ê¸‰ëœ ì†ì„±ì´ 없습니다: 모듈 %s, ì†ì„± %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "%sì— ëŒ€í•œ 함수 ì„œëª…ì„ ê°€ì ¸ì˜¤ì§€ 못했습니다: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "%sì— ëŒ€í•œ ìƒì„±ìž ì„œëª…ì„ ê°€ì ¸ì˜¤ì§€ 못했습니다: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "기반 í´ëž˜ìŠ¤: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "%s ì†ì„±ì´ %s ê°ì²´ì— ì—†ìŒ"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "%sì˜ ë³„ì¹­"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "TypeVar(%s)ì˜ ë³„ì¹­"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "%sì— ëŒ€í•œ 메소드 ì„œëª…ì„ ê°€ì ¸ì˜¤ì§€ 못했습니다: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "%sì—ì„œ ìž˜ëª»ëœ __slots__ ê°€ 발견ë˜ì—ˆìŠµë‹ˆë‹¤. 무시합니다."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "%rì— ëŒ€í•œ 기본 ì¸ìˆ˜ ê°’ì„ í•´ì„하지 못했습니다: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "%rì— ëŒ€í•œ ì„œëª…ì„ ì—…ë°ì´íŠ¸í•˜ì§€ 못했습니다. 매개변수를 ì°¾ì„ ìˆ˜ 없습니다: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "%rì— ëŒ€í•œ type_comment를 í•´ì„하지 못했습니다: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "autosummaryê°€ ì œì™¸ëœ ë¬¸ì„œ %rì„(를) 참조합니다. 무시합니다."
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary: ìŠ¤í… íŒŒì¼ %rì„(를) ì°¾ì„ ìˆ˜ 없습니다. autosummary_generate ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "ìº¡ì…˜ì´ ìžˆëŠ” ìžë™ 요약ì—는 :toctree: ì˜µì…˜ì´ í•„ìš”í•©ë‹ˆë‹¤. 무시합니다."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "autosummary: %sì„(를) import 하지 못했습니다.\n가능한 힌트:\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "ì´ë¦„ %sì„(를) í•´ì„하지 못함"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "ê°ì²´ %sì„(를) import 하지 못함"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary는 내부ì ìœ¼ë¡œ .rst 파ì¼ì„ ìƒì„±í•©ë‹ˆë‹¤. 하지만 source_suffixì— .rstê°€ í¬í•¨ë˜ì–´ 있지 않습니다. 건너ëœë‹ˆë‹¤."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary: 문서화 í•  %rì„(를) 결정하지 못했으며, ë‹¤ìŒ ì˜ˆì™¸ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] ìžë™ 요약 ìƒì„±: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] %sì— ê¸°ë¡"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary] %sì„(를) import 하지 못했습니다.\n가능한 힌트:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nautosummary ì§€ì‹œë¬¸ì„ ì‚¬ìš©í•˜ì—¬ ReStructuredText를 ìƒì„±í•©ë‹ˆë‹¤.\n\nsphinx-autogenì€ sphinx.ext.autosummary.generateì˜ í”„ëŸ°íŠ¸ì—”ë“œìž…ë‹ˆë‹¤.\n주어진 ìž…ë ¥ 파ì¼ì— í¬í•¨ëœ autosummary 지시문ì—ì„œ reStructuredText 파ì¼ì„ ìƒì„±í•©ë‹ˆë‹¤.\n\nautosummary ì§€ì‹œë¬¸ì˜ í˜•ì‹ì€ ``sphinx.ext.autosummary`` Python ëª¨ë“ˆì— ë¬¸ì„œí™”ë˜ì–´ 있으며 ë‹¤ìŒ ëª…ë ¹ì„ ì‚¬ìš©í•˜ì—¬ ì½ì„ 수 있습니다.\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "rST 파ì¼ì„ ìƒì„±í•  ì›ë³¸ 파ì¼"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "모든 ì¶œë ¥ì„ ì €ìž¥í•  디렉토리"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "파ì¼ì˜ 기본 í™•ìž¥ìž (기본값: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "ì‚¬ìš©ìž ì •ì˜ í…œí”Œë¦¿ 디렉토리 (기본값: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "가져온 멤버 문서화 (기본값: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "모듈 __all__ ì†ì„±ì˜ 구성ì›ë§Œ 정확히 문서화합니다. (기본값: %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "키워드 매개변수"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "예제"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "예제"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "참고"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "기타 매개변수"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "수신"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "참조"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "경고"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "ìƒì„±"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "ìž˜ëª»ëœ ê°’ 세트 (닫는 중괄호 누ë½): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "ìž˜ëª»ëœ ê°’ 세트 (여는 중괄호 누ë½): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "ìž˜ëª»ëœ ë¬¸ìžì—´ 리터럴 (닫는 따옴표 누ë½): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "ìž˜ëª»ëœ ë¬¸ìžì—´ 리터럴 (여는 따옴표 누ë½): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "주ì˜"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "조심"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "위험"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "오류"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "힌트"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "중요"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "참고"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "ë” ë³´ê¸°"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "íŒ"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "경고"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "ì´ì „ 페ì´ì§€ì—ì„œ 계ì†"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "ë‹¤ìŒ íŽ˜ì´ì§€ì— 계ì†"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "알파벳 ì´ì™¸"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "숫ìž"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "페ì´ì§€"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "목차"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "검색"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "ì´ë™"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "소스 보기"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "개요"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "환ì˜í•©ë‹ˆë‹¤!"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "문서:"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "ìƒ‰ì¸ &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "íƒìƒ‰"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)sì—ì„œ 찾기"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "ì´ ë¬¸ì„œ ì •ë³´"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "저작권"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "최종 ì—…ë°ì´íŠ¸: %(last_updated)s"
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "<a href=\"https://www.sphinx-doc.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:12
+msgid "Previous topic"
+msgstr "ì´ì „ 항목"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "ì´ì „ 장"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "ë‹¤ìŒ í•­ëª©"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "ë‹¤ìŒ ìž¥"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "검색 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ JavaScript를 활성화하십시오."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "여러 단어를 검색하면 모든 단어가 í¬í•¨ëœ ì¼ì¹˜ 항목만 표시ë©ë‹ˆë‹¤."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "검색"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "검색 결과"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "빠른 검색"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "버전 %(version)sì˜ ë³€ê²½ 사항 &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "ê²€ìƒ‰ì´ ì™„ë£Œë˜ì—ˆìœ¼ë©°, 검색어와 ì¼ì¹˜í•˜ëŠ” ${resultCount} ê°œ 페ì´ì§€ë¥¼ 찾았습니다."
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "검색 중"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "검색 준비 중…"
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", 문서 - "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "검색 ì¼ì¹˜ 숨기기"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "사ì´ë“œë°” 닫기"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "사ì´ë“œë°” 열기"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "ë‚´ìš©"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "4 ê°œ ì—´ 기반 색ì¸ì„ 찾았습니다. 사용하고 있는 확장 ê¸°ëŠ¥ì˜ ë²„ê·¸ì¼ ìˆ˜ 있습니다: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "ê°ì£¼ [%s]ì´(ê°€) 참조ë˜ì§€ 않았습니다."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "ê°ì£¼ [#]ì´ ì°¸ì¡°ë˜ì§€ 않았습니다."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ë²ˆì—­ëœ ë©”ì‹œì§€ì˜ ê°ì£¼ 참조가 ì¼ì¹˜í•˜ì§€ 않습니다. ì›ë³¸: {0}, 번역: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "ë²ˆì—­ëœ ë©”ì‹œì§€ì˜ ì°¸ì¡°ê°€ ì¼ì¹˜í•˜ì§€ 않습니다. ì›ë³¸: {0}, 번역: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ë²ˆì—­ëœ ë©”ì‹œì§€ì˜ ì¸ìš© 참조가 ì¼ì¹˜í•˜ì§€ 않습니다. ì›ë³¸: {0}, 번역: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "ë²ˆì—­ëœ ë©”ì‹œì§€ì˜ ìš©ì–´ 참조가 ì¼ì¹˜í•˜ì§€ 않습니다. ì›ë³¸: {0}, 번역: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "ìƒí˜¸ ì°¸ì¡°ì— ëŒ€í•œ 대체 í…스트를 ê²°ì •í•  수 없습니다. ë²„ê·¸ì¼ ìˆ˜ 있습니다."
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "'any' ìƒí˜¸ 참조 %rì— ëŒ€í•´ 둘 ì´ìƒì˜ 대ìƒì´ 발견ë˜ì—ˆìŠµë‹ˆë‹¤: %s ì¼ ìˆ˜ 있습니다"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s 참조 대ìƒì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r 참조 대ìƒì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "ì›ê²© ì´ë¯¸ì§€ë¥¼ 가져올 수 없습니다: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "ì›ê²© ì´ë¯¸ì§€ë¥¼ 가져올 수 없습니다: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "ì•Œ 수 없는 ì´ë¯¸ì§€ 형ì‹: %s…"
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "디코드 í•  수 없는 ì›ë³¸ 문ìžì´ë©°, \"?\"ë¡œ 대체합니다: %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "건너뜀"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "실패"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "%s ì˜ì—­ì—ì„œ 문제 ë°œìƒ: 필드가 '%s' ì—­í• ì„ ì‚¬ìš©í•´ì•¼ 하지만, 해당 ì—­í• ì´ ë„ë©”ì¸ì— 없습니다."
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "ì•Œ 수 없는 지시문 ë˜ëŠ” ì—­í•  ì´ë¦„: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "알 수 없는 노드 유형: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "ì½ê¸° 오류: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "쓰기 오류: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "ìž˜ëª»ëœ ë‚ ì§œ 형ì‹ìž…니다. 바로 출력하려면 ìž‘ì€ ë”°ì˜´í‘œë¡œ 문ìžì—´ì„ ì¸ìš©í•˜ì‹­ì‹œì˜¤: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "toctreeì— ì¡´ìž¬í•˜ì§€ 않는 íŒŒì¼ %rì— ëŒ€í•œ 참조가 있ìŒ"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "only 지시문 ì‹ì„ í‰ê°€í•˜ëŠ” ë™ì•ˆ 예외 ë°œìƒ: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "기본 ì—­í•  %sì„(를) ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_formatì´ %sì— ëŒ€í•´ ì •ì˜ë˜ì§€ ì•ŠìŒ"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "%s ë…¸ë“œì— í• ë‹¹ë˜ì§€ ì•Šì€ ID"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "ì´ë¯¸ì§€ í¬ê¸°ë¥¼ 얻어올 수 없습니다. :scale: ì˜µì…˜ì„ ë¬´ì‹œí•©ë‹ˆë‹¤."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "ì•Œ 수 없는 %r toplevel_sectioning (í´ëž˜ìŠ¤ %r)"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth:ê°€ 너무 í¬ë©°, 무시합니다."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "문서 ì œëª©ì´ ë‹¨ì¼ í…스트 노드가 아님"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "구역, 주제, í‘œ, ì¡°ì–¸, 사ì´ë“œë°” ì•ˆì— ìžˆì§€ ì•Šì€ ì œëª© 노드가 발견ë¨"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "ê°ì£¼"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "tabularcolumns와 :widths: ì˜µì…˜ì´ ëª¨ë‘ ì„¤ì •ë˜ì—ˆìŠµë‹ˆë‹¤. :widths:는 무시ë©ë‹ˆë‹¤."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "치수 단위 %sì´(ê°€) 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. 무시합니다."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "ì•Œ 수 없는 ìƒ‰ì¸ í•­ëª© 유형 %sì´(ê°€) 발견ë¨"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[그림: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[그림]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "ìº¡ì…˜ì´ ê·¸ë¦¼ ì•ˆì— ìžˆì§€ 않습니다."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "구현ë˜ì§€ ì•Šì€ ë…¸ë“œ 유형: %r"
diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.js b/sphinx/locale/lt/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..149fbc2
--- /dev/null
+++ b/sphinx/locale/lt/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "lt",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "Apie \u0161iuos dokumentus",
+ "Automatically generated list of changes in version %(version)s": "Automati\u0161kai sugeneruotas pakeitim\u0173 %(version)s versijoje s\u0105ra\u0161as",
+ "C API changes": "C API pakeitimai",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Pasl\u0117pti \u0161onin\u0119 juost\u0105",
+ "Complete Table of Contents": "Pilnas Turinys",
+ "Contents": "Turinys",
+ "Copyright": "Autoriaus teis\u0117s",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "I\u0161pl\u0117sti \u0161onin\u0119 juost\u0105",
+ "Full index on one page": "Pilnas indeksas viename puslapyje",
+ "General Index": "Bendras indeksas",
+ "Global Module Index": "Globalus Modulio Indeksas",
+ "Go": "Pirmyn",
+ "Hide Search Matches": "Pasl\u0117pti paie\u0161kos rezultatus",
+ "Index": "Indeksas",
+ "Index &ndash; %(key)s": "Indeksas &ndash; %(key)s",
+ "Index pages by letter": "Indekso puslapiai pagal raid\u0119",
+ "Indices and tables:": "Indeksai ir lentel\u0117s:",
+ "Last updated on %(last_updated)s.": "Paskutinis atnaujinimas %(last_updated)s.",
+ "Library changes": "Bibliotekos pakeitimai",
+ "Navigation": "Navigacija",
+ "Next topic": "Kita tema",
+ "Other changes": "Kiti pakeitimai",
+ "Overview": "Ap\u017evalga",
+ "Please activate JavaScript to enable the search\n functionality.": "Pra\u0161ome aktyvuoti JavaScript, kad veikt\u0173 paie\u0161kos\n funkcionalumas.",
+ "Preparing search...": "",
+ "Previous topic": "Praeita tema",
+ "Quick search": "Greitoji paie\u0161ka",
+ "Search": "Paie\u0161ka",
+ "Search Page": "Paie\u0161kos puslapis",
+ "Search Results": "Paie\u0161kos rezultatai",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Ie\u0161koti tarp %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Rodyti pirmin\u012f kod\u0105",
+ "Table of Contents": "",
+ "This Page": "\u0160is puslapis",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "visos funkcijos, klas\u0117s ir terminai",
+ "can be huge": "gali b\u016bti didelis",
+ "last updated": "",
+ "lists all sections and subsections": "sura\u0161yti visus skyrius ir poskyrius",
+ "next chapter": "kita dalis",
+ "previous chapter": "praeita dalis",
+ "quick access to all modules": "greitas vis\u0173 moduli\u0173 pasiekimas",
+ "search": "ie\u0161koti",
+ "search this documentation": "ie\u0161koti \u0161iame dokumente",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/lt/LC_MESSAGES/sphinx.mo b/sphinx/locale/lt/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..74251dc
--- /dev/null
+++ 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
new file mode 100644
index 0000000..9921c15
--- /dev/null
+++ b/sphinx/locale/lt/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# DALIUS DOBRAVOLSKAS <DALIUS@SANDBOX.LT>, 2010
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: DALIUS DOBRAVOLSKAS <DALIUS@SANDBOX.LT>, 2010\n"
+"Language-Team: Lithuanian (http://app.transifex.com/sphinx-doc/sphinx-1/language/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: lt\n"
+"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Įtaisytieji"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modulio lygis"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (kuris yra "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y-%m-%d"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Bendras indeksas"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indeksas"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "kitas"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "praeitas"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indeksas"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Leidimas"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Skyriaus autorius: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Modulio autorius: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Kodo autorius: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autorius: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametrai"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Grąžinamos reikšmės"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Grąžinamos reikšmės tipas"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "narys"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "kintamasis"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkcija"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makrokomanda"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipas"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nauja %s versijoje"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Pakeista %s versijoje"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Nebepalaikoma nuo %s versijos"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "IÅ¡meta"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klasÄ—"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (itaisytoji funkcija)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metodas)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasÄ—)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globalus kintamasis arba konstanta)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atributas)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumentais"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modulis)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metodas"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "duomenys"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribudas"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modulis"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Kintamieji"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Sukelia"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (modulyje %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (modulje %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (įtaisytasis kintamasis)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (įtaisytoji klasė)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasė iš %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klasÄ—s metodas)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statinis metodas)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduliai"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Atmestas"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "išimtis"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klasÄ—s metodas"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statinis metodas"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (atmestas)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktyva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rolÄ—)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktyva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rolÄ—"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "aplinkos kintamasis; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "aiškinamasis terminas"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "gramatinÄ— leksema"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "nuorodos požymis"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "aplinkos kintamasis"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programos parinktis"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Modulio indeksas"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Paieškos puslapis"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[Å¡altinis]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Padaryti"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "originalus įrašas"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumentai]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modulio kodas"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Kodas %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Apžvalga: modulio kodas"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Visi moduliai turintys kodÄ…</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "DÄ—mesio"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Atsargiai"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Pavojinga"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Klaida"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Patarimas"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Svarbu"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Pastaba"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Taip pat žiūrėkite"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Patarimas"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Įspėjimas"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "tęsinys iš praeito puslapio"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Paieška"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Pirmyn"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Rodyti pirminį kodą"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Apžvalga"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indeksai ir lentelÄ—s:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Pilnas Turinys"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "surašyti visus skyrius ir poskyrius"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "ieškoti šiame dokumente"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Globalus Modulio Indeksas"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "greitas visų modulių pasiekimas"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "visos funkcijos, klasÄ—s ir terminai"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeksas &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Pilnas indeksas viename puslapyje"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indekso puslapiai pagal raidÄ™"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "gali būti didelis"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Ieškoti tarp %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Apie Å¡iuos dokumentus"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Autoriaus teisÄ—s"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Paskutinis atnaujinimas %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Ieškoti %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Praeita tema"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "praeita dalis"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Kita tema"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "kita dalis"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Prašome aktyvuoti JavaScript, kad veiktų paieškos\n funkcionalumas."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "ieškoti"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Paieškos rezultatai"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Greitoji paieška"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Å is puslapis"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatiškai sugeneruotas pakeitimų %(version)s versijoje sąrašas"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Bibliotekos pakeitimai"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API pakeitimai"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Kiti pakeitimai"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Paslėpti paieškos rezultatus"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "PaslÄ—pti Å¡oninÄ™ juostÄ…"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "IÅ¡plÄ—sti Å¡oninÄ™ juostÄ…"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Turinys"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Išnašos"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[paveiksliukas]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/lv/LC_MESSAGES/sphinx.js b/sphinx/locale/lv/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..5648f47
--- /dev/null
+++ b/sphinx/locale/lv/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "lv",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "Par \u0161iem dokumentiem",
+ "Automatically generated list of changes in version %(version)s": "Autom\u0101tiski sagatavots izmai\u0146u saraksts versijai %(version)s",
+ "C API changes": "Izmai\u0146as iek\u0161 C API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Sav\u0113rst s\u0101njoslu",
+ "Complete Table of Contents": "Pilns saturs",
+ "Contents": "Saturs",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Izplest s\u0101njoslu",
+ "Full index on one page": "Pilns indekss vien\u0101 lappus\u0113",
+ "General Index": "Visp\u0101r\u0113js indekss",
+ "Global Module Index": "Visp\u0101r\u0113js modu\u013cu indekss",
+ "Go": "Izpild\u012bt",
+ "Hide Search Matches": "Pasl\u0113pt atlases v\u0101rdus",
+ "Index": "Indekss",
+ "Index &ndash; %(key)s": "Indekss &ndash; %(key)s",
+ "Index pages by letter": "Lappu\u0161u indekss p\u0113c burtiem",
+ "Indices and tables:": "Indeksi un tabulas:",
+ "Last updated on %(last_updated)s.": "P\u0113d\u0113jas izmai\u0146as %(last_updated)s.",
+ "Library changes": "Bibliot\u0113kas izmai\u0146as",
+ "Navigation": "Navig\u0101cija",
+ "Next topic": "n\u0101ko\u0161a t\u0113ma",
+ "Other changes": "Citas izmai\u0146as",
+ "Overview": "Apskats",
+ "Please activate JavaScript to enable the search\n functionality.": "Lai iesp\u0113jotu mekl\u0113\u0161anu, l\u016bdzu aktiviz\u0113t JavaScript.",
+ "Preparing search...": "",
+ "Previous topic": "iepriek\u0161\u0113ja t\u0113ma",
+ "Quick search": "\u0100tra mekl\u0113\u0161ana",
+ "Search": "Mekl\u0113t",
+ "Search Page": "Atlases lapa",
+ "Search Results": "Atlases rezult\u0101ti",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Mekl\u0113t iek\u0161 %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "R\u0101d\u012bt izejas tekstu",
+ "Table of Contents": "",
+ "This Page": "\u0160\u012b lappuse",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "visas funkcijas, klases un termini",
+ "can be huge": "var b\u016bt milz\u012bgs",
+ "last updated": "",
+ "lists all sections and subsections": "r\u0101da visas sekcijas un apak\u0161sekcijas",
+ "next chapter": "n\u0101ko\u0161a sada\u013ca",
+ "previous chapter": "iepriek\u0161\u0113ja sada\u013ca",
+ "quick access to all modules": "\u0101tra piek\u013cuve visiem moduliem",
+ "search": "mekl\u0113t",
+ "search this documentation": "mekl\u0113t \u0161aj\u0101 dokument\u0101cij\u0101",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)"
+}); \ 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 0000000..0431f74
--- /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 0000000..57d93b5
--- /dev/null
+++ b/sphinx/locale/lv/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Latvian (http://app.transifex.com/sphinx-doc/sphinx-1/language/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+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/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (iekš "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d.%m.%Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "VispÄrÄ“js indekss"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indekss"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "nÄkoÅ¡ais"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "iepriekšējs"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indekss"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Izlaidums"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Sekcijas autors: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Moduļa autors: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Koda autors: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autors: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Atgriež"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Atgriežamais tips"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "loceklis"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "mainīgais"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkcija"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makross"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tips"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Jauns versijÄ %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "MainÄ«ts versijÄ %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Neieteicams no versijas %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Izmet"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klase"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (iebūvēta funkcija)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metods)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globÄlais mainÄ«gais vai konstanta)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atributs)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumenti"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modulis)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metods"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dati"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atributs"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modulis"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Mainīgie"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Ceļ"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (moduļī %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (moduļī %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (iebūvētais mainīgais)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (iebūvēta klase)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klase iekš %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klases metods)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statiskais metods)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduļi"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Nav ieteicams"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "izņēmums"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klases metods"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statiskais metods"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktīva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (role)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktīva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "role"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "apkÄrtnes mainÄ«gais; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "glosÄrija termins"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "gramatiskais marÄ·ieris"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "atsauces virsraksts"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "apkÄrtnes mainÄ«gais"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programmas opcija"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Moduļu indekss"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Atlases lapa"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[kods]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "JÄizdara"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "sÄkotnÄ“js ieraksts"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumenti]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Moduļa teksts"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s izejas teksts</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Apskats: moduļa teksts"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Visi moduļi, kuriem ir izejas teksti</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Uzmanību"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Uzmanies"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "BÄ«stami"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Kļūda"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "MÄjiens"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Svarīgi"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Piezīme"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Skat.arī"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Padoms"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "BrÄ«dinÄjums"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "turpinÄjums no iepriekÅ¡Ä“jÄs lappuses"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Meklēt"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Izpildīt"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "RÄdÄ«t izejas tekstu"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Apskats"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr ""
+
+#: 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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indekss &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "NavigÄcija"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Meklēt iekš %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Par Å¡iem dokumentiem"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Pēdējas izmaiņas %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s meklēšana"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "iepriekšēja tēma"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "iepriekšēja sadaļa"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "nÄkoÅ¡a tÄ“ma"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "nÄkoÅ¡a sadaļa"
+
+#: sphinx/themes/basic/search.html:27
+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:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "meklēt"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Atlases rezultÄti"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Ātra meklēšana"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: 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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "PaslÄ“pt atlases vÄrdus"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "SavÄ“rst sÄnjoslu"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Izplest sÄnjoslu"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Saturs"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "VÄ“res"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[attēls: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[attēls]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/mk/LC_MESSAGES/sphinx.js b/sphinx/locale/mk/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..6482f35
--- /dev/null
+++ b/sphinx/locale/mk/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "mk",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "\u0413\u043b\u0430\u0432\u043d\u0430 \u0441\u043e\u0434\u0440\u0436\u0438\u043d\u0430",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n % 10 == 1 && n % 100 != 11) ? 0 : 1"
+}); \ No newline at end of file
diff --git a/sphinx/locale/mk/LC_MESSAGES/sphinx.mo b/sphinx/locale/mk/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..9d00b90
--- /dev/null
+++ b/sphinx/locale/mk/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/mk/LC_MESSAGES/sphinx.po b/sphinx/locale/mk/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..b537f7b
--- /dev/null
+++ b/sphinx/locale/mk/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Vasil Vangelovski <vvangelovski@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Vasil Vangelovski <vvangelovski@gmail.com>, 2013\n"
+"Language-Team: Macedonian (http://app.transifex.com/sphinx-doc/sphinx-1/language/mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Предлог за подобрување на Python; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Вградени"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Ðиво на модул"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (во "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Главна Ñодржина"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "Ñодржина"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "Ñледна"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "претходна"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s документација"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Ðвтор на Ñекцијата:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Ðвтор на модул:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Ðвтор на код:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Ðвтор: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Параметри"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Враќа"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Повратен тип"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "член"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "променлива"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "функција"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "макро"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "тип"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Фрла"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "клаÑа"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (вградена функција)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s метод)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (клаÑа)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "погледни %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "погледни %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Симболи"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js b/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..894d35c
--- /dev/null
+++ b/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "nb_NO",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "Om disse dokumenter",
+ "Automatically generated list of changes in version %(version)s": "Automatisk generert liste over endringer i versjon %(version)s",
+ "C API changes": "Endringer i C API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Skjul sidepanelet",
+ "Complete Table of Contents": "Komplett Innholdsfortegnelse",
+ "Contents": "Innhold",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Utvid sidepanelet",
+ "Full index on one page": "Hele innholdsfortegnelsen p\u00e5 en side",
+ "General Index": "Hovedindex",
+ "Global Module Index": "Global Modulindex",
+ "Go": "G\u00e5",
+ "Hide Search Matches": "Skjul s\u00f8keresultat",
+ "Index": "Index",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Innholdsfortegnelse per bokstav",
+ "Indices and tables:": "Index og tabeller",
+ "Last updated on %(last_updated)s.": "Sist oppdatert %(last_updated)s.",
+ "Library changes": "Endringer i biblioteket",
+ "Navigation": "Navigering",
+ "Next topic": "Neste emne",
+ "Other changes": "Andre endringer",
+ "Overview": "Oversikt",
+ "Please activate JavaScript to enable the search\n functionality.": "Vennligst aktiver JavaScript for \u00e5 aktivere s\u00f8k.",
+ "Preparing search...": "",
+ "Previous topic": "Forrige tittel",
+ "Quick search": "Hurtigs\u00f8k",
+ "Search": "S\u00f8k",
+ "Search Page": "S\u00f8keside",
+ "Search Results": "S\u00f8keresultat",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "S\u00f8k blant %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Vis kildekode",
+ "Table of Contents": "",
+ "This Page": "Denne siden",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "alla funksjoner, klasser, vilk\u00e5r",
+ "can be huge": "kan bli stor",
+ "last updated": "",
+ "lists all sections and subsections": "liste over alle paragrafer og underparagrafer",
+ "next chapter": "neste kapittel",
+ "previous chapter": "Forrige kapittel",
+ "quick access to all modules": "snarvei til alle moduler",
+ "search": "s\u00f8k",
+ "search this documentation": "s\u00f8k i dette dokumentet",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo b/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..ce5c2e5
--- /dev/null
+++ b/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po b/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..412ce07
--- /dev/null
+++ b/sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Norwegian Bokmål (Norway) (http://app.transifex.com/sphinx-doc/sphinx-1/language/nb_NO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: nb_NO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Innebygde"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modulnivå"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(i "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Hovedindex"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "neste"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "forrige"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Utgivelse"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Seksjon forfatter: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Modul forfattar: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Kildekode forfatter: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Forfatter: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametere"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Returnere"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Retur type"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "medlem"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variabel"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funksjon"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "type"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nytt i version %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Endret i version %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Foreldet siden version %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Kaster"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klasse"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (innebygd funksjon)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metode)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasse)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variabel eller konstant)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribut)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argument"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metode"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attributt"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variabler"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Hever"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (i modul %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (i modul %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (innebygd variabel)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (innebygd klasse)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasse i %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klassemetode)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statisk metode)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python Modulindex"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduler"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Foreldet"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "untak"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klassemetode"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statisk metode"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (foreldet)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiv)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rolle)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktiv"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rolle"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "miljøvariabel; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "ordliste"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "grammatikk token"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "referanse-etikett"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "miljøvariabel"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programvalg"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Modulindex"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Søkeside"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "se %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "se også %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[kilde]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "opprinnelig oppføring"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumentasjon]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modul kildekode"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Kildekode for %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Oversikt: modulkildekode"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Alla moduler hvor kildekode finnes</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Obs"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Advarsel"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Fare"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Feil"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Hint"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Viktig"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Obs"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Se også"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tips"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Advarsel"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "fortsettelse fra forrige side"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Søk"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "GÃ¥"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Vis kildekode"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Oversikt"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Index og tabeller"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Komplett Innholdsfortegnelse"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "liste over alle paragrafer og underparagrafer"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "søk i dette 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 "snarvei til alle moduler"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "alla funksjoner, klasser, vilkår"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Hele innholdsfortegnelsen på en side"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Innholdsfortegnelse per bokstav"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "kan bli stor"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigering"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Søk blant %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Om disse dokumenter"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Sist oppdatert %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Søk %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Forrige tittel"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Forrige kapittel"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Neste emne"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "neste kapittel"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Vennligst aktiver JavaScript for å aktivere søk."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "søk"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Søkeresultat"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Hurtigsøk"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Denne siden"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisk generert liste over endringer i versjon %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Endringer i biblioteket"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Endringer i C API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andre endringer"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Skjul søkeresultat"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Skjul sidepanelet"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Utvid sidepanelet"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Innhold"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Fotnoter"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[bilde]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/ne/LC_MESSAGES/sphinx.js b/sphinx/locale/ne/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..ce802c9
--- /dev/null
+++ b/sphinx/locale/ne/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ne",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "\u092f\u0940 \u0921\u0915\u0941\u092e\u0947\u0928\u094d\u091f\u0939\u0930\u0941\u0915\u094b \u092c\u093e\u0930\u0947\u092e\u093e",
+ "Automatically generated list of changes in version %(version)s": "\u092d\u0930\u094d\u0938\u0928 %(version)s \u092e\u093e \u092d\u090f\u0915\u093e \u092b\u0930\u0915 \u0939\u0930\u0941 \u0906\u092b\u0948 \u091c\u0947\u0928\u0947\u0930\u0947\u091f \u092d\u090f ",
+ "C API changes": "C API \u0915\u093e \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928\u0939\u0930\u0941 ",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "\u0938\u093e\u0907\u0921\u092c\u0930 \u0938\u093e\u0928\u094b \u092c\u0928\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d",
+ "Complete Table of Contents": "\u092a\u0941\u0930\u093e \u0935\u093f\u0937\u092f\u0938\u0942\u091a\u0940",
+ "Contents": "\u0935\u093f\u0937\u092f\u0938\u0942\u091a\u0940",
+ "Copyright": "\u0915\u092a\u093f\u0930\u093e\u0907\u091f ",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "\u0938\u093e\u0907\u0921\u092c\u0930 \u0920\u0941\u0932\u094b \u092c\u0928\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d",
+ "Full index on one page": "\u092a\u0941\u0930\u093e \u0905\u0928\u0941\u0938\u0941\u091a\u0940 \u090f\u0915\u0948 \u092a\u093e\u0928\u093e\u092e\u093e",
+ "General Index": "\u0938\u093e\u092e\u093e\u0928\u094d\u092f \u0905\u0928\u0941\u0938\u0941\u091a\u0940",
+ "Global Module Index": "\u0917\u094d\u0932\u094b\u092c\u0932 \u092e\u0921\u0941\u0932 \u0905\u0928\u0941\u0938\u0941\u091a\u0940",
+ "Go": "\u091c\u093e\u0928\u0941\u0939\u094b\u0938\u094d",
+ "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",
+ "Index": "\u0905\u0928\u0941\u0938\u0941\u091a\u0940",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "\u0905\u0915\u094d\u0937\u0930 \u0905\u0928\u0941\u0938\u093e\u0930 \u0905\u0928\u0941\u0938\u0941\u091a\u0940\u0915\u093e \u092a\u093e\u0928\u093e",
+ "Indices and tables:": "\u0907\u0928\u094d\u0921\u0940\u0938\u0940\u0938\u094d\u0938 \u0930 \u0924\u0932\u093f\u0915\u093e",
+ "Last updated on %(last_updated)s.": "\u092f\u094b \u092d\u0928\u094d\u0926\u093e \u0905\u0917\u093e\u0921\u0940 %(last_updated)s \u092e\u093e \u0905\u092a\u0921\u0947\u091f \u092d\u090f\u0915\u094b",
+ "Library changes": "\u0932\u093e\u0908\u092c\u094d\u0930\u0947\u0930\u0940\u0915\u093e \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928\u0939\u0930\u0941",
+ "Navigation": "\u0928\u0947\u092d\u093f\u0917\u0947\u0938\u0928 ",
+ "Next topic": "\u092a\u091b\u093f\u0932\u094d\u0932\u094b \u0935\u093f\u0937\u092f",
+ "Other changes": "\u0905\u0930\u0941 \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928\u0939\u0930\u0941 ",
+ "Overview": "\u092a\u0941\u0928\u0930\u093e\u0935\u0932\u094b\u0915\u0928 ",
+ "Please activate JavaScript to enable the search\n functionality.": "\u0916\u094b\u091c\u094d\u0928\u0947 \u0915\u093e\u0930\u094d\u092f \u0906\u0917\u093e\u0921\u0940 \u092c\u0922\u093e\u0909\u0928\u0915\u094b \u0932\u093e\u0917\u093f \u091c\u093e\u092d\u093e\u0938\u094d\u0915\u0943\u092a\u094d\u091f \u091a\u0932\u093e\u0908\u0926\u093f\u0928\u0941\u0939\u094b\u0938 ",
+ "Preparing search...": "",
+ "Previous topic": "\u0905\u0918\u093f\u0932\u094d\u0932\u094b \u0935\u093f\u0937\u092f ",
+ "Quick search": "\u091b\u093f\u091f\u094d\u091f\u094b \u0916\u094b\u091c\u094d\u0928\u0941\u0939\u094b\u0938\u094d",
+ "Search": "\u0916\u094b\u091c\u094d\u0928\u0941\u0939\u094b\u0938\u094d ",
+ "Search Page": "\u092a\u093e\u0928\u093e\u092e\u093e \u0916\u094b\u091c\u094d\u0928\u0941\u0939\u094b\u0938\u094d",
+ "Search Results": "\u0916\u094b\u091c\u0947\u0915\u094b \u0928\u0924\u093f\u091c\u093e",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u0938\u094d\u0930\u094b\u0924 \u0926\u0947\u0916\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d ",
+ "Table of Contents": "",
+ "This Page": "\u092f\u094b \u092a\u093e\u0928\u093e",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "\u0938\u092c\u0948 \u092b\u0928\u094d\u0915\u094d\u0938\u0928\u0938\u094d, \u0915\u0915\u094d\u0937\u093e\u0939\u0930\u0942 \u0930 \u091f\u0930\u094d\u092e\u0938\u094d",
+ "can be huge": "\u0927\u0947\u0930\u0948 \u0920\u0941\u0932\u094b \u0939\u0941\u0928 \u0938\u0915\u094d\u091b",
+ "last updated": "",
+ "lists all sections and subsections": "\u0938\u092c\u0948 \u0938\u0947\u0915\u094d\u0938\u0928 \u0930 \u0938\u0935\u0938\u0947\u0915\u094d\u0938\u0928 \u0926\u0947\u0916\u093e\u0909\u0928\u0941\u0939\u094b\u0938\u094d",
+ "next chapter": "\u092a\u091b\u093f\u0932\u094d\u0932\u094b \u0916\u0928\u094d\u0921",
+ "previous chapter": "\u0905\u0918\u093f\u0932\u094d\u0932\u094b \u0916\u0928\u094d\u0921",
+ "quick access to all modules": "\u0938\u092c\u0948 \u092e\u094b\u0926\u0941\u0932\u0947\u0938\u092e\u093e \u091b\u093f\u091f\u0948 \u091c\u093e\u0928\u0941\u0939\u094b\u0938\u094d",
+ "search": "\u0916\u094b\u091c\u094d\u0928\u0941\u0939\u094b\u0938\u094d",
+ "search this documentation": "\u092f\u094b \u0921\u0915\u0941\u092e\u0947\u0928\u094d\u091f \u0916\u094b\u091c\u094d\u0928\u0941\u0939\u094b\u0938\u094d",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ 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 0000000..255c850
--- /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 0000000..0cc4133
--- /dev/null
+++ b/sphinx/locale/ne/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Komiya Takeshi <i.tkomiya@gmail.com>, 2016\n"
+"Language-Team: Nepali (http://app.transifex.com/sphinx-doc/sphinx-1/language/ne/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ne\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "बिइलà¥à¤Ÿà¤¿à¤¨à¥à¤¸"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "मडà¥à¤²à¤•à¥‹ तह"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(in"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "सामानà¥à¤¯ अनà¥à¤¸à¥à¤šà¥€"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "अनà¥à¤¸à¥à¤šà¥€"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "पछिलà¥à¤²à¥‹"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "अघिलà¥à¤²à¥‹"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "अनà¥à¤¸à¥à¤šà¥€"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "रीलीज"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "सेकà¥à¤¸à¤¨à¤•à¥‹ लेखक"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "मडà¥à¤²à¤•à¥‹ लेखक"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Codeको लेखक "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "लेखक"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parameters"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Returns"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "सदसà¥à¤¯"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "चल"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "फनà¥à¤•à¥à¤¸à¤¨"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "बृहत"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "किसिम"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "भरà¥à¤¸à¤¨ %s मा नयाà¤"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "भरà¥à¤¸à¤¨ %s मा बदलिà¤à¤•à¥‹"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Deprecated since version %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Throws"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "ककà¥à¤·à¤¾"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (built-in function)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s विधी)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (ककà¥à¤·à¤¾)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variable or constant)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribute)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Arguments"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (मडà¥à¤²)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "विधी"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attribute"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "मडà¥à¤²"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "चलहरू"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Raises"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in मडà¥à¤² %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in मडà¥à¤² %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (built-in चल)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (built-in ककà¥à¤·à¤¾)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (ककà¥à¤·à¤¾ in %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s ककà¥à¤·à¤¾ विधी)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s static विधी)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python Module Index"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Deprecated"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "अपबाद"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "ककà¥à¤·à¤¾ विधी"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "static विधी"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr "(deprecated)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (निरà¥à¤¦à¥‡à¤¶à¤¿à¤•)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (भूमिका)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "निरà¥à¤¦à¥‡à¤¶à¤¿à¤•"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "भूमिका"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "environment variable; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "शबà¥à¤¦-अरà¥à¤¥à¤®à¤¾ भà¤à¤•à¥‹"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "grammar token"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "सनà¥à¤¦à¤°à¥à¤µ सामगà¥à¤°à¥€"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "environment variable"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "कारà¥à¤¯à¤•à¥à¤°à¤®à¤•à¤¾ बिकलà¥à¤ª"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "मडà¥à¤² अनà¥à¤¸à¥à¤šà¥€"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "पानामा खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "%s हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "%s पनि हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ "
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[सà¥à¤°à¥‹à¤¤]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "मौलिक इनà¥à¤Ÿà¥à¤°à¥€"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Module code"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Source code for %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨: module code"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>All modules for which code is available</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "धà¥à¤¯à¤¾à¤¨à¤¾à¤•à¤°à¥à¤·à¤£"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "होसियार "
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "खतरा"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "गलत"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "सङà¥à¤•à¥‡à¤¤"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "जरà¥à¤°à¥€"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "टिपà¥à¤ªà¤£à¥€"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "पनि हेरà¥à¤¨à¥à¤¹à¥‹à¤¸"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "साबधान"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "अघिलà¥à¤²à¥‹ पानासà¤à¤— जोडीà¤à¤•à¥‹"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ "
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "जानà¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "सà¥à¤°à¥‹à¤¤ देखाउनà¥à¤¹à¥‹à¤¸à¥ "
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¨ "
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "नेभिगेसन "
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "यी डकà¥à¤®à¥‡à¤¨à¥à¤Ÿà¤¹à¤°à¥à¤•à¥‹ बारेमा"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "कपिराइट "
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "यो भनà¥à¤¦à¤¾ अगाडी %(last_updated)s मा अपडेट भà¤à¤•à¥‹"
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "अघिलà¥à¤²à¥‹ विषय "
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "अघिलà¥à¤²à¥‹ खनà¥à¤¡"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "पछिलà¥à¤²à¥‹ विषय"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "पछिलà¥à¤²à¥‹ खनà¥à¤¡"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "खोजà¥à¤¨à¥‡ कारà¥à¤¯ आगाडी बढाउनको लागि जाभासà¥à¤•à¥ƒà¤ªà¥à¤Ÿ चलाईदिनà¥à¤¹à¥‹à¤¸ "
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "खोजेको नतिजा"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "छिटà¥à¤Ÿà¥‹ खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "खोजेको नतिजाहरॠलà¥à¤•à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "साइडबर सानो बनाउनà¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "साइडबर ठà¥à¤²à¥‹ बनाउनà¥à¤¹à¥‹à¤¸à¥"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "विषयसूची"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "फूटà¥à¤¨à¥‹à¤Ÿà¥à¤¸"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[चितà¥à¤°]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.js b/sphinx/locale/nl/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..beb790c
--- /dev/null
+++ b/sphinx/locale/nl/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "nl",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", in",
+ "About these documents": "Over deze documenten",
+ "Automatically generated list of changes in version %(version)s": "Automatisch gegenereerde lijst van veranderingen in versie %(version)s",
+ "C API changes": "Veranderingen in de C-API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Wijzigingen in Versie %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Zijpaneel inklappen",
+ "Complete Table of Contents": "Volledige inhoudsopgave",
+ "Contents": "Inhoudsopgave",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Zijpaneel uitklappen",
+ "Full index on one page": "Volledige index op \u00e9\u00e9n pagina",
+ "General Index": "Algemene index",
+ "Global Module Index": "Globale Module-index",
+ "Go": "Zoek",
+ "Hide Search Matches": "Zoekresultaten verbergen",
+ "Index": "Index",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Index pagineerd per letter",
+ "Indices and tables:": "Indices en tabellen:",
+ "Last updated on %(last_updated)s.": "Laatste aanpassing op %(last_updated)s.",
+ "Library changes": "Veranderingen in de bibliotheek",
+ "Navigation": "Navigatie",
+ "Next topic": "Volgend onderwerp",
+ "Other changes": "Andere veranderingen",
+ "Overview": "Overzicht",
+ "Please activate JavaScript to enable the search\n functionality.": "Activeer JavaSscript om de zoekfunctionaliteit in te schakelen.",
+ "Preparing search...": "Zoeken aan het voorbereiden...",
+ "Previous topic": "Vorig onderwerp",
+ "Quick search": "Snel zoeken",
+ "Search": "Zoeken",
+ "Search Page": "Zoekpagina",
+ "Search Results": "Zoekresultaten",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Zoeken in %(docstitle)s",
+ "Searching": "Bezig met zoeken",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Broncode weergeven",
+ "Table of Contents": "",
+ "This Page": "Deze pagina",
+ "Welcome! This is": "Welkom! Dit is",
+ "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. Zorg ervoor dat alle woorden juist zijn gespeld en dat u voldoende categorie\u00ebn hebt geselecteerd.",
+ "all functions, classes, terms": "alle functies, klasses en begrippen",
+ "can be huge": "kan heel groot zijn",
+ "last updated": "laatst bijgewerkt",
+ "lists all sections and subsections": "geeft alle secties en subsecties weer",
+ "next chapter": "volgend hoofdstuk",
+ "previous chapter": "vorig hoofdstuk",
+ "quick access to all modules": "sneltoegang naar alle modules",
+ "search": "zoeken",
+ "search this documentation": "zoeken in deze documentatie",
+ "the documentation for": "de documentatie voor"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/nl/LC_MESSAGES/sphinx.mo b/sphinx/locale/nl/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..3bdef52
--- /dev/null
+++ 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
new file mode 100644
index 0000000..16062b8
--- /dev/null
+++ b/sphinx/locale/nl/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3701 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Bram Geron, 2017
+# brechtm, 2016
+# brechtm, 2018
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008
+# Gert van Dijk <gertvdijk@gmail.com>, 2019
+# Jesse Tan, 2017
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2021
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Komiya Takeshi <i.tkomiya@gmail.com>, 2021\n"
+"Language-Team: Dutch (http://app.transifex.com/sphinx-doc/sphinx-1/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Kan bronmap niet vinden (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Bron- en doelmap kunnen niet identiek zijn"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx v%s start op"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Dit project vereist tenminste Sphinx v%s, en kan daarom niet worden gebouwd met deze versie."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "aanmaken doelmap"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' gedefinieerd in conf.py is niet aanroepbaar (geen Python-callable). Pas a.u.b. de definitie aan zodat het een oproepbare functie wordt. Dit is nodig voor conf.py om zich als een Sphinx extensie te gedragen."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "laden van vertalingen [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "klaar"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "mislukt: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Geen bouwer geselecteerd, dus de standaardbouwer wordt gebruikt: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "gelukt"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "afgerond met problemen"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "bouwen %s, %s waarschuwing."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "bouwen %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "de %s extensie geeft niet aan of deze veilig is voor parallel lezen, er wordt aangenomen dat dit niet zo is - vraag de auteur van de extensie om dit te controleren en expliciet te maken"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "de %s extensie geeft niet aan of deze veilig is voor parallel schrijven, er wordt aangenomen dat dit niet zo is - vraag de auteur van de extensie om dit te controleren en expliciet te maken"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "seriële verwerking van %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "configuratiemap bevat geen conf.py bestand (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "kan dictionary-instelling %r niet overschrijven in configuratie, wordt genegeerd (gebruik %r om individuele elementen te overschrijven)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "ongeldig getal %r voor configuratiewaarde %r, wordt genegeerd"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "kan instelling %r niet overschrijven met zo'n waarde van een niet-ondersteund type; wordt genegeerd"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "onbekende configuratiewaarde %r tijdens overschrijven, wordt genegeerd"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Ongeldige configuratiewaarde: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Configuratiewaarde %r was reeds aangevoerd"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Een fout heeft zich voorgedaan in uw configuratiebestand:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Sectie %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Fig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabel %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Codefragment %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r onbekend, wordt genegeerd."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Gebeurtenis %r bestaat reeds"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Onbekende gebeurtenisnaam: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Dit project vereist extensie %s met versie %s of hoger, en kan daarom niet met de geladen versie (%s) worden gebouwd"
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Bouwerklasse %s heeft geen \"name\"-attribuut"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Bouwer %r bestaat reeds (in module %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Bouwernaam %s is niet geregistreerd of beschikbaar via entrypoint"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Bouwernaam %s is niet geregistreerd"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domein %s was reeds geregistreerd"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domein %s nog niet geregistreerd"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser voor %r is reeds geregistreerd"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Broncode-parser voor %s is niet geregistreerd"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "extensie %r is reeds in Sphinx ingevoegd sinds Sphinx-versie %s; deze extensie wordt genegeerd."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Oorspronkelijke exceptie:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Kon extensie %s niet importeren"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "extensie %r heeft geen setup() functie; weet u zeker dat het een Sphinx-extensiemodule is?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Dit project gebruikt extensie %s, maar die extensie heeft Sphinx-versie v%s of hoger nodig; het project kan daarom niet worden gebouwd met deze versie."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "de setup() functie van extensie %r retourneerde een niet-ondersteund object; dit moet None of een metadata dictionary zijn"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "thema %r heeft geen \"theme\" instelling"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "thema %r heeft geen \"inherit\" instelling"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "thema met naam %r niet gevonden, geërfd door %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "instelling %s.%s komt niet voor in de doorzochte thema configuraties"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "bestand %r in thema pad is geen geldige zipfile of bevat geen thema"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "thema met naam %r niet gevonden (ontbrekende theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "bestand %r zoals gegeven op de opdrachtregel is niet aanwezig in de bronmap, wordt genegeerd"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Builtins"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Moduleniveau"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (in "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Algemene index"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "volgende"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "vorige"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentatie"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "pad naar doelmap"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Naam van het project"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Auteur(s)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Versie van het project"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Release van het project"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Bestandsnaam van het hoofddocument (zonder bestandsextensie)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Fout: hoofddocumentbestandsnaam %s is reeds aanwezig op het aangewezen pad."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Afgerond: een beginstructuur van mappen is aangemaakt."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "release van project"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "documenttaal"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "bestandsextensie van bronbestanden"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "bestandsnaam van hoofddocument"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "sjabloonmap voor sjabloonbestanden"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Ongeldig onderschrift: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Gebruik van zowel \"%s\" als \"%s\" opties is niet toegestaan"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Include bestand %r is niet gevonden of het lezen is mislukt"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Encodering %r gebruikt voor het lezen van include-bestand %r lijkt verkeerd, probeer een :encoding: optie te specificeren"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Object met naam %r is niet gevonden in include bestand %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "\"lineno-match\" kan niet gebruikt worden met een disjuncte set \"lines\""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Regels %r: geen regels gebruikt uit include-bestand %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Auteur van deze sectie: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Auteur van deze module: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Auteur van deze broncode:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Auteur: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parameters"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Returns"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Return type"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "member"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variabele"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "functie"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "type"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nieuw in versie %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Veranderd in versie %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Verouderd sinds versie %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Sjabloonparameters"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Werpt"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klasse"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "concept"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (ingebouwde functie)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s methode)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasse)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globale variabele of constante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribuut)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumenten"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (module)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "methode"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attribuut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "module"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "duplicaatlabel van formule %s, andere in %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variabelen"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Veroorzaakt"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (in module %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (in module %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (geïntegreerde variabele)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (geïntegreerde klasse)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasse in %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klassemethode)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statische methode van %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python-moduleïndex"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "modules"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Verouderd"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "exceptie"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klassemethode"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statische methode"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (verouderd)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directive)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rol)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "directive"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rol"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "omgevingsvariabele; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "woordenlijstterm"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "grammaticatoken"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "verwijzingslabel"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "omgevingsvariabele"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programmaoptie"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "document"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Module-index"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Zoekpagina"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "onderschrift ontbreekt voor link: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "bronmap is gewijzigd"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "zie %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "zie %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symbolen"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "bestandsextensie (standaardwaarde: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s is geen map."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "ontbrekende '+' of '-' in optie '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' is geen geldige optie."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' is geen geldige pyversion optie"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Graphviz directive mag niet zowel inhoud als een bestandsnaam argument hebben"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Extern Graphviz bestand %r niet gevonden of het lezen is mislukt"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "\"graphviz\" directive zonder inhoud wordt genegeerd."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "dot commando %r kan niet worden uitgevoerd (vereist voor graphviz output), controleer de instelling graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format moet 'png' of 'svg' zijn, maar is %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graaf: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graaf]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(in %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(in %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[broncode]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Te doen"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<origineel item>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(Het <<originele item>> bevindt zich in %s, regel %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "originele item"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[documentatie]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modulebroncode"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Broncode voor %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Overzicht: module broncode"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Alle modules waarvoor de broncode beschikbaar is</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Basisklassen: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Sleutelwoordargumenten"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Verwijzingen"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Let op"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Pas op"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Gevaar"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Fout"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Hint"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Belangrijk"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Notitie"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Zie ook"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Waarschuwing"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "Vervolgd van vorige pagina"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "Vervolgt op volgende pagina"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "pagina"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Zoeken"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Zoek"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Broncode weergeven"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Overzicht"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Welkom! Dit is"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "de documentatie voor"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "laatst bijgewerkt"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indices en tabellen:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Volledige inhoudsopgave"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "geeft alle secties en subsecties weer"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "zoeken in deze documentatie"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Globale Module-index"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "sneltoegang naar alle modules"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "alle functies, klasses en begrippen"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Volledige index op één pagina"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Index pagineerd per letter"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "kan heel groot zijn"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigatie"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Zoeken in %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Over deze documenten"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Laatste aanpassing op %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Zoek in %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Vorig onderwerp"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "vorig hoofdstuk"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Volgend onderwerp"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "volgend hoofdstuk"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Activeer JavaSscript om de zoekfunctionaliteit in te schakelen."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "zoeken"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Zoekresultaten"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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. Zorg ervoor dat alle woorden juist zijn gespeld en dat u voldoende categorieën hebt geselecteerd."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Snel zoeken"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Deze pagina"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Wijzigingen in Versie %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatisch gegenereerde lijst van veranderingen in versie %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Veranderingen in de bibliotheek"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Veranderingen in de C-API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Andere veranderingen"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Bezig met zoeken"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Zoeken aan het voorbereiden..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", in"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Zoekresultaten verbergen"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Zijpaneel inklappen"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Zijpaneel uitklappen"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Inhoudsopgave"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "meer dan één doel gevonden voor 'any' kruisverwijzing %r: is mogelijk %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Voetnoten"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[afbeelding: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[afbeelding]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "onderschrift niet binnen figuur."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.js b/sphinx/locale/pl/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..9b08b8a
--- /dev/null
+++ b/sphinx/locale/pl/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "pl",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", w ",
+ "About these documents": "O tych dokumentach",
+ "Automatically generated list of changes in version %(version)s": "Automatycznie wygenerowana lista zmian w wersji %(version)s",
+ "C API changes": "Zmiany w C API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Zmiany w wersji %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Zwi\u0144 pasek boczny",
+ "Complete Table of Contents": "Kompletny spis tre\u015bci",
+ "Contents": "Tre\u015b\u0107",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Rozwi\u0144 pasek boczny",
+ "Full index on one page": "Ca\u0142y indeks na jednej stronie",
+ "General Index": "Indeks og\u00f3lny",
+ "Global Module Index": "Globalny indeks modu\u0142\u00f3w",
+ "Go": "Szukaj",
+ "Hide Search Matches": "Ukryj wyniki wyszukiwania",
+ "Index": "Indeks",
+ "Index &ndash; %(key)s": "Indeks &ndash; %(key)s",
+ "Index pages by letter": "Strony indeksu alfabetycznie",
+ "Indices and tables:": "Indeksy i tablice:",
+ "Last updated on %(last_updated)s.": "Ostatnia modyfikacja %(last_updated)s.",
+ "Library changes": "Zmiany w bibliotekach",
+ "Navigation": "Nawigacja",
+ "Next topic": "Nast\u0119pny temat",
+ "Other changes": "Inne zmiany",
+ "Overview": "Przegl\u0105d",
+ "Please activate JavaScript to enable the search\n functionality.": "Aby umo\u017cliwi\u0107 wyszukiwanie, prosz\u0119 w\u0142\u0105czy\u0107 JavaScript.",
+ "Preparing search...": "Inicjalizacja wyszukiwania...",
+ "Previous topic": "Poprzedni temat",
+ "Quick search": "Szybkie wyszukiwanie",
+ "Search": "Szukaj",
+ "Search Page": "Wyszukiwanie",
+ "Search Results": "Wyniki wyszukiwania",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Szukaj po\u015br\u00f3d %(docstitle)s",
+ "Searching": "Wyszukiwanie",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Poka\u017c \u017ar\u00f3d\u0142o",
+ "Table of Contents": "Spis tre\u015bci",
+ "This Page": "Ta strona",
+ "Welcome! This is": "Witaj! To jest",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Twoje wyszukiwanie nie da\u0142o \u017cadnych wynik\u00f3w. Upewnij si\u0119, \u017ce wszystkie s\u0142owa s\u0105 wpisane prawid\u0142owo i \u017ce wybra\u0142e\u015b dostateczn\u0105 ilo\u015b\u0107 kategorii.",
+ "all functions, classes, terms": "wszystkie funkcje, klasy, terminy",
+ "can be huge": "mo\u017ce by\u0107 ogromny",
+ "last updated": "ostatnio aktualizowana",
+ "lists all sections and subsections": "wszystkie rozdzia\u0142y i podrozdzia\u0142y",
+ "next chapter": "nast\u0119pny rozdzia\u0142",
+ "previous chapter": "poprzedni rozdzia\u0142",
+ "quick access to all modules": "szybki dost\u0119p do wszystkich modu\u0142\u00f3w",
+ "search": "szukaj",
+ "search this documentation": "przeszukaj t\u0119 dokumentacj\u0119",
+ "the documentation for": "dokumentacja do"
+ },
+ "plural_expr": "(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/pl/LC_MESSAGES/sphinx.mo b/sphinx/locale/pl/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..c7e0329
--- /dev/null
+++ 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
new file mode 100644
index 0000000..b76fd9b
--- /dev/null
+++ b/sphinx/locale/pl/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3700 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Adam C <adam.chyla@gmail.com>, 2023
+# Maciej Olko <maciej.olko@gmail.com>, 2017-2020
+# Maciej Olko <maciej.olko@gmail.com>, 2022
+# Michael Gielda <michal.gielda@gmail.com>, 2014
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2018
+# Tawez, 2013-2019
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Adam C <adam.chyla@gmail.com>, 2023\n"
+"Language-Team: Polish (http://app.transifex.com/sphinx-doc/sphinx-1/language/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Nie odnaleziono katalogu źródłowego (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Katalog wyjściowy (%s) nie jest katalogiem"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Katalog źródłowy i katalog docelowy nie mogą być identyczne"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Uruchamianie Sphinksa v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Ten projekt potrzebuje Sphinksa w wersji co najmniej %s, dlatego nie może zostać zbudowany z tą wersją."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "tworzenie katalogu wyjścia"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "podczas ustawiania rozszerzenia %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' podany w conf.py nie jest wywoływalny. Prosimy zmienić jego definicję tak, aby była wywoływalną funkcją. Jest to potrzebne w conf.py, aby zachowywało się jak rozszerzenie Sphinksa."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "ładowanie tłumaczeń [%s]..."
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "gotowe"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "niedostępne dla wbudowanych wiadomości"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "ładowanie zapakowanego środowiska"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "nie powiodło się: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Nie wybrano buildera, używamy domyślnego: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "zakończony sukcesem"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "zakończony z problemami"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "build %s, %s ostrzeżenie (z ostrzeżeniami traktowanymi jako błędy)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "build %s, %s ostrzeżenie."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "build %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "klasa %r jest już zarejestrowana, jej wizytorzy zostaną nadpisani"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "dyrektywa %r jest już zarejestrowana, jej wizytorzy zostaną nadpisani"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "rola %r jest już zarejestrowana, jej wizytorzy zostaną nadpisani"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "rozszerzenie %s nie deklaruje, czy jest bezpieczne do czytania współbieżnego, zakładamy że nie jest – prosimy zapytać autora rozszerzenie o sprawdzenie i zadeklarowania tego wprost"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "rozszerzenie %s nie deklaruje, czy jest bezpieczne do pisania współbieżnego, zakładamy że nie jest – prosimy zapytać autora rozszerzenia o sprawdzenie i zadeklarowanie tego wprost"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "tworzenie serii %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "folder konfiguracyjny nie zawiera pliku conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "nie można nadpisać słownikowego ustawienia konfiguracji %r, ignorowanie (użyj %r, by ustawić poszczególne elementy)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "niepoprawna liczba %r dla wartości konfiguracji %r, ignorowanie"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "nie można nadpisać ustawienia konfiguracji %r nie wspieranym typem, ignorowanie"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "nieznana wartość konfiguracji %r w nadpisaniu, ignorowanie"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Nie ma takiej wartości konfiguracyjnej: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Wartość konfiguracji %r już podana"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "W twoim piku konfiguracyjnym jest błąd składniowy: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Plik konfiguracyjny (albo jeden z modułów przez niego zaimportowanych) wywołał sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "W twoim piku konfiguracyjnym jest błąd programowalny: \n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Rozdział %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Rys. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabela %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Listing %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "Wartość konfiguracyjna `{name}` musi być jednym z {candidates}, a podany jest `{current}`."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "Nie odnaleziono primary_domain %r, zignorowano."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Zdarzenie %r już obecne"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Nieznana nazwa zdarzenia: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Ten projekt potrzebuje rozszerzenia %s co najmniej w wersji %s, dlatego nie może zostać zbudowany z załadowaną wersją (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Klasa buildera %s nie ma atrybutu \"name\""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Builder %r już istnieje (w module %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Builder o nazwie %s jest niezarejestrowany lub dostępny przez punkt wejścia"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Builder o nazwie %s jest niezarejestrowany"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domena %s jest już zarejestrowana"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domena %s nie została jeszcze zarejestrowana"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "%r object_type jest już zarejestrowany"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "%r crossref_type jest już zarejestrowany"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r jest już zarejestrowany"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser dla %r jest już zarejestrowany"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Parser źródeł dla %s jest nie zarejestrowany"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r już zarejestrowany"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "rozszerzenie %r zostało już włączone do Sphinx'a, począwszy od wersji %s; to rozszerzenie jest zignorowane."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Pierwotny wyjÄ…tek:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Nie można zaimportować rozszerzenia %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "rozszerzenie %r nie zawiera funkcji setup(); czy to na pewno moduł rozszerzenia Sphinx?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Rozszerzenie %s używane przez ten projekt potrzebuje Sphinksa w wersji co najmniej %s; dlatego nie może zostać zbudowane z tą wersją."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "rozszerzenie %r zwróciło nie wspierany obiekt ze swojej funkcji setup(); powinno zwrócić None lub słownik metadanych"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "motyw %r nie ma ustawienia \"theme\""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "motyw %r nie ma ustawienia \"inherit\""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "nie znaleziono motywu o nazwie %r, z którego dziedziczy %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "ustawienie %s.%s nie występuje w żadnej z przeszukiwanych konfiguracji motywów"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "plik %r na ścieżce motywu nie jest poprawnym plikiem zip lub nie zawiera motywu"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "nie znaleziono motywu o nazwie %r (brak theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "budowanie [mo]:"
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "pisanie wyjścia..."
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "wszystkie z %d plików po"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "wsztstkie pliki źródłowe"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "plik %r podany w wierszu poleceń nie znajduje się w katalogu źródłowym, ignoruję"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d plików źródłowych podano w wierszu poleceń"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "znaleziono %d"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "nic nie znaleziono"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "kopiowanie obrazków..."
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "nieznany mimetype dla %s, ignorujÄ™"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "pisanie pliku %s..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "brak zmian w wersji %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Wbudowane"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Poziom modułu"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "kopiowanie plików źródłowych..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "Plik ePub znajduje siÄ™ w %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "nieprawidłowy css_file: %r, zignorowano"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "wczytywanie szablonów... "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "zepsuty odnośnik: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "Strona HTML jest w %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Pliki Texinfo znajdujÄ… siÄ™ w %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "nie znaleziono wartości konfiguracyjnej \"texinfo_documents\"; żadne dokumenty nie zostaną zapisane"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "wartość konfiguracyjna \"texinfo_documents\" odwołuje się do nieznanego dokumentu %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (w "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Pliki tekstowe sÄ… w %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "błąd zapisu pliku %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Pliki XML znajdujÄ… siÄ™ w %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Pliki pseudo-XML sÄ… w %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Strony HTML sÄ… w %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Indeks ogólny"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "indeks"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "dalej"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "wstecz"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "kopiowanie plików do pobrania..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "nie można skopiować pliku statycznego %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "nie można skopiować dodatkowego pliku %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Wystąpił błąd podczas renderowania strony %s.\nPowód: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "nieprawidłowy js_file: %r, zignorowano"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "Podano nieznany math_renderer %r."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "plik favicon %r nie istnieje"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s - dokumentacja"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Pliki LaTeX znajdujÄ… siÄ™ w %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "nie znaleziono wartości konfiguracyjnej \"latex_documents\"; żadne dokumenty nie zostaną zapisane"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "wartość konfiguracyjna \"latex_documents\" odwołuje się do nieznanego dokumentu %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Indeks"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Wydanie"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "BÅ‚Ä…d kodowania:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "BÅ‚Ä…d rekursji:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Wystąpił wyjątek:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Raport o błędzie można zgłosić pod adresem <https://github.com/sphinx-doc/sphinx/issues>. Dzięki!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "ogólne opcje"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "zapisz wszystkie pliki (domyślnie: zapisz tylko nowe i zmienione pliki)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "zastÄ…p ustawienie w pliku konfiguracyjnym"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "przekaż wartość do szablonów HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "zwiększ szczegółowość (może być powtórzone)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "zapisz ostrzeżenia (i błędy) do podanego pliku"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "zamień ostrzeżenia na błędy"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "Argument opcji -D musi mieć postać nazwa=wartość"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "Argument opcji -A musi mieć postać nazwa=wartość"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "warunkowe włączenie treści na podstawie wartości konfiguracyjnych"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Wprowadź poprawną nazwę ścieżki."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Wprowadź \"y\" lub \"n\"."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Podaj rozszerzenie pliku, na przykład '.rst' lub '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Witamy w narzędziu quickstart Sphinksa %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Ścieżka root dla dokumentacji"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Błąd: znaleziono istniejący conf.py na wskazanej ścieżce root."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart nie nadpisze istniejących projektów Sphinx."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Wprowadź, prosimy, nową ścieżkę root (lub tylko Enter, aby wyjść)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Rozdziel katalogi source i build (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Prefiks nazw dla katalogów templates i static"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Nazwa projektu"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Nazwisko autora"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Wersja projektu"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Wydanie projektu"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Język projektu"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Sufiks pliku źródłowego"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart nie nadpisze istniejÄ…cego pliku."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Wskaż, które z następujących rozszerzeń Sphinx powinny być włączone:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Stworzyć Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Tworzenie pliku %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Plik %s już istnieje, pomijam."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Zakończono: Utworzono początkową strukturę katalogów."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "tryb cichy"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Podstawowe opcje projektu"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "nazwa projektu"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "nazwiska autorów"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "wersja projektu"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "język dokumentu"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "rozszerzenie pliku źródłowego"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "nazwa głównego dokumentu"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Opcje rozszerzeń"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "włącz rozszerzenie %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "utwórz plik makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "nie twórz pliku makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "twórz plik wsadowy"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "nie twórz pliku wsadowego"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Nieprawidłowy podpis: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Nie można użyć jednocześnie opcji \"%s\" i \"%s\""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Plik include %r nie znaleziony lub nie powiódł się jego odczyt"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Kodowanie %r użyte do odczytu pliku include %r wydaje się być złe, spróbuj dając opcję :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Nie znaleziono obiektu o nazwie %r w pliku include %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Nie można użyć „lineno-match†z rozÅ‚Ä…cznym zbiorem „linesâ€"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Specyfikacja linii %r: nie wyciągnięto żadnych linii z pliku include %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor rozdziału: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor modułu: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor kodu: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametry"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Zwraca"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Typ zwracany"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "pole"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "zmienna"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkcja"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "unia"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "typ"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nowe w wersji %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Zmienione w wersji %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Niezalecane od wersji %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Cytat [%s] nie ma odniesienia."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parametry szablonu"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Wyrzuca"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klasa"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "koncepcja"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funkcja wbudowana)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasa)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (zmienna globalna lub stała)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atrybut)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumenty"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (moduł)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metoda"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dane"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atrybut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "moduł"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "zduplikowana etykieta równania %s, inne wystąpienie w %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "Nieprawidłowy math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Zmienne"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Wyrzuca"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (w module %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (w module %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (zmienna wbudowana)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (klasa wbudowana)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasa w module %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s metoda klasy)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s metoda statyczna)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Indeks modułów Pythona"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduły"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Niezalecane"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "wyjÄ…tek"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "metoda klasy"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statyczna metoda"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (niezalecane)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (dyrektywa)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rola)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "dyrektywa"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rola"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "zmienna środowiskowa; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "termin glosariusza"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "symbol gramatyki"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "etykieta odsyłacza"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "zmienna środowiskowa"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opcja programu"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "dokument"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Indeks modułów"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Wyszukiwanie"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "nowa konfiguracja"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "konfiguracja zmieniona"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "rozszerzenie zmienione"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "katalog źródłowy został zmieniony"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Domena %r nie jest zarejestrowana"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "zobacz %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "zobacz także %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symbole"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "maksymalna głębokość submodułów wyświetlanych w spisie treści (domyślnie: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "nadpisz istniejÄ…ce pliki"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "wykonaj skrypt bez tworzenia plików"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "nie twórz pliku spisu treści"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "rozszerzenie pliku (domyślnie: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s nie jest katalogiem."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "nieprawidłowe wyrażenie regularne %r w %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "nieprawidłowe wyrażenie regularne %r w coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "moduł %s nie mógł zostać zaimportowany: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "brak '+' lub '-' w opcji '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' nie jest prawidłową opcją."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' nie jest prawidłową opcją pyversion."
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "dyrektywa Graphviz nie może mieć jednocześnie argumentów content i filename"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Nie znaleziono zewnętrznego pliku Graphviz %r lub jego odczyt się nie powiódł"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Ignorujemy dyrektywę „graphviz†bez treści."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "komenda dot %r nie może zostać uruchomiona (potrzebna do wyjścia graphviz), sprawdź ustawienia graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format musi mieć wartość „png†lub „svg†a ma %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[wykres: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[wykres]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(w %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr " (w %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[źródło]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<oryginalny wpis>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<Oryginalny wpis>> znajduje siÄ™ w pliku %s, w linii %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "oryginalny wpis"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumentacja]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Kod modułu"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Kod źródłowy modułu %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Przeglądanie: kod modułu"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Wszystkie moduły, dla których jest dostępny kod</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "błąd podczas formatowania argumentów dla %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Klasy bazowe: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "brakujÄ…cy atrybut %s w obiekcie %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "domyślny sufiks dla plików (domyślnie: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argumenty Nazwane"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Przykład"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Przykłady"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Uwagi"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Pozostałe parametry"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Uwaga"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Ostrzeżenie"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Niebezpieczeństwo"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "BÅ‚Ä…d"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Podpowiedź"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Ważne"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Informacja"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Zobacz także"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Wskazówka"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Ostrzeżenie"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "kontynuacja poprzedniej strony"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "ciąg dalszy na następnej stronie"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "Niealfabetyczny"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Liczby"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "strona"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Spis treści"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Szukaj"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Szukaj"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Pokaż źródło"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "PrzeglÄ…d"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Witaj! To jest"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentacja do"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "ostatnio aktualizowana"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indeksy i tablice:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Kompletny spis treści"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "wszystkie rozdziały i podrozdziały"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "przeszukaj tÄ™ dokumentacjÄ™"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Globalny indeks modułów"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "szybki dostęp do wszystkich modułów"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "wszystkie funkcje, klasy, terminy"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Indeks &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Cały indeks na jednej stronie"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Strony indeksu alfabetycznie"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "może być ogromny"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Nawigacja"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Szukaj pośród %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "O tych dokumentach"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ostatnia modyfikacja %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Przeszukaj %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Poprzedni temat"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "poprzedni rozdział"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Następny temat"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "następny rozdział"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Aby umożliwić wyszukiwanie, proszę włączyć JavaScript."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "szukaj"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Wyniki wyszukiwania"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Twoje wyszukiwanie nie dało żadnych wyników. Upewnij się, że wszystkie słowa są wpisane prawidłowo i że wybrałeś dostateczną ilość kategorii."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Szybkie wyszukiwanie"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Ta strona"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Zmiany w wersji %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automatycznie wygenerowana lista zmian w wersji %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Zmiany w bibliotekach"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Zmiany w C API"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Inne zmiany"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Wyszukiwanie"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Inicjalizacja wyszukiwania..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", w "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Ukryj wyniki wyszukiwania"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Zwiń pasek boczny"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Rozwiń pasek boczny"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Treść"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "znaleziono więcej niż jeden cel dla cross-referencji „any†%r: może być %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Nieznany format obrazka: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "błąd odczytu: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "błąd zapisu: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Przypisy"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "%s"
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[obraz: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[obraz]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/pt/LC_MESSAGES/sphinx.js b/sphinx/locale/pt/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..71c62bb
--- /dev/null
+++ b/sphinx/locale/pt/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "pt",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/pt/LC_MESSAGES/sphinx.mo b/sphinx/locale/pt/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..7d97b68
--- /dev/null
+++ b/sphinx/locale/pt/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/pt/LC_MESSAGES/sphinx.po b/sphinx/locale/pt/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..0bf07f0
--- /dev/null
+++ b/sphinx/locale/pt/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Portuguese (http://app.transifex.com/sphinx-doc/sphinx-1/language/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..149b8e6
--- /dev/null
+++ b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "pt_BR",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "&#169; %(copyright_prefix)s %(copyright)s.",
+ ", in ": ", em ",
+ "About these documents": "Sobre esses documentos",
+ "Automatically generated list of changes in version %(version)s": "Lista de altera\u00e7\u00f5es na vers\u00e3o %(version)s, gerada automaticamente",
+ "C API changes": "Altera\u00e7\u00f5es na API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Modifica\u00e7\u00f5es na vers\u00e3o %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Recolher painel lateral",
+ "Complete Table of Contents": "Tabela Completa dos Conte\u00fados",
+ "Contents": "Conte\u00fados",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Criada usando <a href=\"https://www.sphinx-doc.org/pt_BR/master\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "Expandir painel lateral",
+ "Full index on one page": "\u00cdndice completo em p\u00e1gina \u00fanica",
+ "General Index": "\u00cdndice Geral",
+ "Global Module Index": "\u00cdndice Global de M\u00f3dulos",
+ "Go": "Ir",
+ "Hide Search Matches": "Esconder Resultados da Busca",
+ "Index": "\u00cdndice",
+ "Index &ndash; %(key)s": "\u00cdndice &ndash; %(key)s",
+ "Index pages by letter": "P\u00e1ginas de \u00edndice por letra",
+ "Indices and tables:": "\u00cdndices e Tabelas:",
+ "Last updated on %(last_updated)s.": "\u00daltima atualiza\u00e7\u00e3o em %(last_updated)s.",
+ "Library changes": "Altera\u00e7\u00f5es na biblioteca",
+ "Navigation": "Navega\u00e7\u00e3o",
+ "Next topic": "Pr\u00f3ximo t\u00f3pico",
+ "Other changes": "Outras altera\u00e7\u00f5es",
+ "Overview": "Vis\u00e3o geral",
+ "Please activate JavaScript to enable the search\n functionality.": "Por favor, ativar JavaScript para habilitar a\nfuncionalidade de busca.",
+ "Preparing search...": "Preparando a busca...",
+ "Previous topic": "T\u00f3pico anterior",
+ "Quick search": "Busca r\u00e1pida",
+ "Search": "Buscar",
+ "Search Page": "P\u00e1gina de Busca",
+ "Search Results": "Resultados da Busca",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "Pesquisa finalizada, encontrada(s) ${resultCount} p\u00e1gina(s) correspondendo \u00e0 consulta da pesquisa.",
+ "Search within %(docstitle)s": "Pesquisar dentro de %(docstitle)s",
+ "Searching": "Buscando",
+ "Searching for multiple words only shows matches that contain\n all words.": "Pesquisando por v\u00e1rias palavras s\u00f3 mostra correspond\u00eancias\nque cont\u00eam todas as palavras.",
+ "Show Source": "Exibir Fonte",
+ "Table of Contents": "Tabela de Conte\u00fado",
+ "This Page": "Essa P\u00e1gina",
+ "Welcome! This is": "Bem Vindo! \u00c9 isso a\u00ed.",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Sua busca n\u00e3o encontrou nenhum documento. Por favor, confirme se todas as palavras est\u00e3o grafadas corretamente e se voc\u00ea selecionou categorias suficientes.",
+ "all functions, classes, terms": "todas fun\u00e7\u00f5es, classes, termos",
+ "can be huge": "pode ser enorme",
+ "last updated": "\u00faltima atualiza\u00e7\u00e3o",
+ "lists all sections and subsections": "Listar todas se\u00e7\u00f5es e subse\u00e7\u00f5es",
+ "next chapter": "pr\u00f3ximo cap\u00edtulo",
+ "previous chapter": "cap\u00edtulo anterior",
+ "quick access to all modules": "acesso r\u00e1pido para todos os m\u00f3dulos",
+ "search": "buscar",
+ "search this documentation": "Buscar nessa documenta\u00e7\u00e3o",
+ "the documentation for": "documenta\u00e7\u00e3o para"
+ },
+ "plural_expr": "(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ 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
new file mode 100644
index 0000000..c164f9a
--- /dev/null
+++ 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
new file mode 100644
index 0000000..b9b37f1
--- /dev/null
+++ b/sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3700 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Claudio Rogerio Carvalho Filho <excriptbrasil@gmail.com>, 2016
+# FIRST AUTHOR <roger.demetrescu@gmail.com>, 2008
+# gilberto dos santos alves <gsavix@gmail.com>, 2015-2016
+# Rafael Fontenelle <rafaelff@gnome.org>, 2019
+# Rafael Fontenelle <rffontenelle@gmail.com>, 2019-2023
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>, 2019-2023\n"
+"Language-Team: Portuguese (Brazil) (http://app.transifex.com/sphinx-doc/sphinx-1/language/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Não foi possível encontrar o diretório de origem (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "O diretório de saída (%s) não é um diretório"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Diretório de origem e o diretório de destino não podem ser idênticos"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Executando Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Este projeto precisa de pelo menos Sphinx v%s e, portanto, não pode ser compilado com esta versão."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "criando o diretório de saída"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "enquanto definia a extensão %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "“setupâ€, conforme definido atualmente em conf.py, não é um invocável do Python. Modifique sua definição para torná-la uma função que pode ser chamada. Isso é necessário para o conf.py se comportar como uma extensão do Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "carregando traduções [%s]… "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "feito"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "não disponível para mensagens internas"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "carregando ambiente com pickle"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "falha: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Nenhum compilador selecionado, usando padrão: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "bem-sucedida"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "finalizada com problemas"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "compilação %s, %s aviso. (com avisos tratados como erros)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "compilação %s, %s avisos (com avisos tratados como erros)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "compilação %s, %s aviso."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "compilação %s, %s avisos."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "compilação %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "classe de nodo %r já está registrada, seus visitantes serão sobrescritos"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "diretiva %r já está registrada, ela será sobrescrita"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "papel %r já está registrado, ele será sobrescrito"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "a extensão %s não declara se é segura para leitura em paralelo, supondo que não seja – peça ao autor da extensão para verificar e torná-la explícita"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "a extensão %s não é segura para leitura em paralelo"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "a extensão %s não declara se é segura para escrita em paralelo, supondo que não seja – peça ao autor da extensão para verificar e torná-la explícita"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "a extensão %s não é segura para escrita em paralelo"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "fazendo serial %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "o diretório de configuração não contém um arquivo conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "Valor de configuração inválido encontrado: 'language = None'. Atualize sua configuração para um código de idioma válido. Voltando para 'en' (inglês)."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "não foi possível sobrescrever a configuração do dicionário %r ignorando (use %r para definir elementos individuais)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "número inválido %r para valor de configuração %r, ignorando"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "não é possível sobrescrever a configuração %r com tipo sem suporte, ignorando"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "valor de configuração desconhecido %r na sobrescrita, ignorando"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Valor de configuração inexistente: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Valor da configuração %r já presente"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Há um erro de sintaxe em seu arquivo de configuração: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "O arquivo de configuração (ou um dos módulos que ele importa) chamou sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Há um erro de programável em seu arquivo de configuração:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "O valor da configuração “source_suffix†espera uma string, lista de strings ou dicionário. Mas “%r†é fornecido."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Seção %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Fig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabela %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Listagem %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "O valor da configuração “{name}†deve ser um entre {candidates}, mas “{current}†é fornecido."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "O valor da configuração “{name}†possui tipo “{current.__name__}â€; esperava {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "O valor da configuração “{name}†possui tipo “{current.__name__}â€; o padrão é “{default.__name__}â€."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r não encontrado, ignorado."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Desde v2.0, Sphinx usa \"index\" como root_doc por padrão. Adicione \"root_doc = 'contents'\" ao seu conf.py."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Evento %r já presente"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Nome de evento desconhecido: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "O manipulador %r para evento %r levantou uma exceção"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "A extensão %s é requerida pelas configurações needs_extensions, mas não está carregada."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Este projeto precisa da extensão %s pelo menos na versão %s e, portanto, não pode ser compilado com a versão carregada (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Nome de analisador léxico Pygments %r não é conhecido"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "vários arquivos encontrados para o documento \"%s\": %r\nUse %r para a construção."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Classe de compilador %s possui nenhum atributo “nameâ€"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Compilador %r já existe (no módulo %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Nome do compilador %s não registrado ou disponível através do ponto de entrada"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Nome do compilador %s não registrado"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domínio %s já registrado"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domínio %s ainda não registrado"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "A diretiva %r já está registrada para o domínio %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "O papel %r já está registrado para o domínio %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "O índice %r já está registrado para o domínio %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "O object_type %r já está registrado"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "O crossref_type %r já está registrado"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r já está registrado"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser para %r já está registrado"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Analisador de fonte para %s não registrado"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Tradutor para %r já existe"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "kwargs para add_node() deve ser uma tupla de função (visit, depart): %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r já registrado"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "renderizador matemático %s já está registrado"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "a extensão %r já foi mesclada com Sphinx desde a versão %s; esta extensão é ignorada."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Extensão original:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Não foi possível importar a extensão %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "a extensão %r possui nenhuma função setup(); é realmente um módulo de extensão do Sphinx?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "A extensão %s usada por este projeto precisa de pelo menos Sphinx v%s e, portanto, não pode ser compilada com esta versão."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "a extensão %r retornou um objeto não suportado de sua função setup(); deve retornar None ou um dicionário de metadados"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Propostas Estendidas Python; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "Número de PEP inválido %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "Número de RFC inválido %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "o tema %r não tem a configuração “themeâ€"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "o tema %r não tem a configuração “inheritâ€"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "nenhum tema chamado %r encontrado, herdado por %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "a configuração %s.%s ocorre em nenhuma das configurações de tema pesquisadas"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "sem suporte à opção de tema %r fornecida"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "o arquivo %r no caminho de tema não é um arquivo zip válido ou contém nenhum tema"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "nenhum tema chamado %r encontrado (faltando theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "uma imagem adequada para o compilador %s não encontrada: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "uma imagem adequada para o compilador %s não encontrada: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "compilando [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "escrevendo saída… "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "todos os %d arquivos po"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "alvos para %d arquivos po que estão especificados"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "alvos para %d arquivos po que estão desatualizados"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "todos os arquivos-fonte"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "arquivo %r fornecido na linha de comando não existe,"
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "o arquivo %r fornecido na linha de comando não está dentro do diretório fonte, ignorando"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "o arquivo %r fornecido na linha de comando não é um documento válido, ignorando"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d arquivos-fonte dados na linha de comando"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "alvos para %d arquivos fonte que estão desatualizados"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "compilando [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "procurando por arquivos agora desatualizados… "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d encontrado"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "nenhum encontrado"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "tornando um ambiente pickle"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "verificando consistência"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "nenhum alvo está desatualizado."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "atualizando ambiente: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s adicionado(s), %s alterado(s), %s removido(s)"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "lendo fontes… "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "docnames para escrever: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "preparando documentos"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr "copiando ativos"
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "entrada de tabela de conteúdos duplicada encontrada: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "copiando imagens… "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "não foi possível ler o arquivo de imagem %r: copiando-o"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "não foi possível copiar arquivo de imagem %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "não foi possível escrever arquivo de imagem %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow não encontrado – copiando arquivos de imagem"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "escrevendo o arquivo mimetype..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "escrevendo o arquivo META-INF/container.xml..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "escrevendo o arquivo content.opf..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "tipo mime desconhecido para %s, ignorando"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "escrevendo o arquivo toc.ncx..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "escrevendo arquivo %s…"
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "O arquivo de visão geral está em %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "nenhuma alteração na versão %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "escrevendo arquivo de resumo…"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Internos"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Nível do Módulo"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "copiando arquivos-fonte…"
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "não foi possível ler %r para criação do changelog"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "O compilador fictício não gera arquivos."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "O arquivo ePub está em %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "escrevendo o arquivo nav.xhtml..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_language†(ou “languageâ€) não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "o valor da configuração “epub_uid†deve ser XML NAME para EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_title†(ou “html_titleâ€) não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_author†não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_contributor†não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_description†não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_publisher†não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_copyright†(ou “copyrightâ€) não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "o valor da configuração “epub_identifier†não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "o valor da configuração “version†não deve estar vazio para EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "css_file inválido: %r, ignorado"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Os catálogos de mensagens estão em %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "alvos para os %d arquivos de modelo"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "lendo modelos… "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "escrevendo catálogos de mensagens… "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Procure por quaisquer erros na saída acima ou em %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "link quebrado: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "Falha ao compilar regex em linkcheck_allowed_redirects: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "As páginas de manual estão em %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "nenhum valor de configuração “man_pages†encontrado; nenhuma página de manual será escrita"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "escrevendo"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "o valor da configuração “man_pages†faz referência a um documento desconhecido %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "A página HTML está em %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "montando documento único"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "escrevendo arquivos adicionais"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Os arquivos Texinfo estão em %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nExecute \"make\" nesse diretório para executá-los com makeinfo\n(use \"make info\" aqui para fazer isso automaticamente)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "nenhuma valor de configuração “texinfo_documents†encontrado; nenhum documento será escrito"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "o valor da configuração “texinfo_documents†faz referência a documento desconhecido %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "processando %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "resolvendo referências…"
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (em "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "copiando arquivos de suporte Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "erro ao escrever o arquivo Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Os arquivos texto estão em %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "erro ao escrever o arquivo %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Os arquivos XML estão em %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Os arquivos pseudo-XML estão em %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "arquivo de informações da compilação está quebrado: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "As páginas HTML estão em %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Falha ao ler o arquivo de informações de compilação: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ãndice Geral"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "próximo"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "gerando índices"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "escrevendo páginas adicionais"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "copiando arquivos baixáveis… "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "não foi possível copiar o arquivo baixável %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "Falha ao copiar um arquivo em html_static_file: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "copiando arquivos estáticos"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "não foi possível copiar o arquivo estático %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "copiando arquivos extras"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "não foi possível copiar o arquivo extra %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Falha ao escrever o arquivo de informações de compilação: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "não foi possível carregar o índice de pesquisa, mas nem todos os documentos serão compilados: o índice ficará incompleto."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "a página %s corresponde a dois padrões em html_sidebars: %r e %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "ocorreu um erro Unicode ao renderizar a página %s. Verifique se todos os valores de configuração que contêm conteúdo não ASCII são strings Unicode."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Ocorreu um erro ao renderizar a página %s.\nMotivo: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "despejando inventário de objetos"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "despejando índice de pesquisa em %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "js_file inválido: %r, ignorado"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Muitos math_renders estão registrados, mas nenhum math_renderer está selecionado."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "math_renderer desconhecido %r é fornecido."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "a entrada de html_extra_path %r não existe"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "entrada de html_extra_path %r está posicionada dentro de outdir"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "a entrada de html_static_path %r não existe"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "entrada de html_static_path %r está posicionada dento de outdir"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "o arquivo logo %r não existe"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "o arquivo favicon %r não existe"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr "HTML 4 não encontra mais suporte no Sphinx. (\"html4_writer=True\" detectado nas opções de configuração)"
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "documentação %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Os arquivos LaTeX estão em %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nExecute \"make\" nesse diretório para executá-los com (pdf)latex\n(use \"make latexpdf\" aqui para fazer isso automaticamente)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "nenhuma valor da configuração “latex_documents†encontrado; nenhum documento será escrito"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "o valor da configuração “latex_documents†faz referência a um documento desconhecido %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Release"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "nenhuma opção Babel conhecida para o idioma %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "copiando arquivos de suporte TeX"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "copiando arquivos de suporte TeX…"
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "copiando arquivos adicionais"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Chave configuração desconhecida: latex_elements[%r], ignorado."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "Opção de tema desconhecida: latex_theme_options[%r], ignorada."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r não possui a configuração \"theme\""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r não possui a configuração \"%s\""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr "Falha ao obter um docname!"
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr "Falha ao obter o docname para a fonte {source!r}!"
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr "Nenhuma nota de rodapé foi encontrada para o nó de referência %r"
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "Ocorreu uma exceção enquanto compilava, iniciando depurador:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "Interrompido!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "Erro de marcação reST:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Erro de codificação:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "O rastro completo foi salvo em %s, caso você queira relatar o problema aos desenvolvedores."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Erro de recursão:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "Isso pode acontecer com arquivos fonte muito grande e profundamente aninhados. Você pode aumentar com cuidado o limite padrão de recursão do Python de 1000 no conf.py com, por exemplo:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Ocorreu uma exceção:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Por favor, relate isso também se houver um erro do usuário, para que uma mensagem de erro melhor possa ser fornecida na próxima vez."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Um relatório de erro pode ser preenchido no rastreador em <https://github.com/sphinx-doc/sphinx/issues>. Obrigado!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "número de tarefas deve ser um número positivo"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "Para mais informações, visite <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nGera documentação de arquivos fonte.\n\nsphinx-build gera documentação a partir dos arquivos em SOURCEDIR e os coloca\nem OUTPUTDIR. Ele procura por \"conf.py\" em SOURCEDIR para a configuração\ndefinições. A ferramenta \"sphinx-quickstart\" pode ser usada para gerar\narquivos de modelo, incluindo \"conf.py\"\n\nsphinx-build pode criar documentação em diferentes formatos. Um formato é\nselecionado especificando o nome do construtor na linha de comandos; o padrão\né HTML. Os construtores também podem realizar outras tarefas relacionadas à\ndocumentação em processamento.\n\nPor padrão, tudo o que está desatualizado é construído. Saída apenas para\nselecionado os arquivos podem ser construídas especificando nomes de arquivos\nindividuais.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "caminho para os arquivos-fonte da documentação"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "caminho para o diretório de saída"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "uma lista de arquivos específicos para recompilar. Ignorado se -a for especificado"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "opções gerais"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "compilador para usar (padrão: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "escrever todos os arquivos (padrão: escrever apenas arquivos novos e alterados)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "não usa um ambiente salvo, sempre lê todos os arquivos"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "caminho para o ambiente em cache e arquivos doctree (padrão: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "compila em paralelo com N processos onde possível (o valor especial “auto†será definido com N para número de CPUs)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "caminho no qual o arquivo de configuração (conf.py) está localizado (padrão: mesmo que SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "usa nenhum arquivo de configuração, apenas as opções -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "sobrescreve a configuração no arquivo de configuração"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "passa um valor para modelos em HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "define tag: inclui blocos “only†com TAG"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "modo exigente, avisa sobre todas as referências em falta"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "opções de saída do console"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "aumenta o nível de detalhamento (pode ser repetido)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "nenhuma saída para stdout, apenas avisos na stderr"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "nenhuma saída, nem mesmo avisos"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "emite saída colorida (padrão: detectar automaticamente)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "não emite saída colorida (padrão: detectar automaticamente)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "escreve avisos (e erros) para o arquivo fornecido"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "transforma avisos em erros"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "com -W, segue em frente ao receber avisos"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "mostra rastro completo em exceção"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "executa Pdb na exceção"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "não é possível combinar a opção -a e nomes de arquivos"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "não foi possível abrir o arquivo de aviso %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "o argumento da opção -D deve estar no formato nome=valor"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "o argumento da opção -A deve estar no formato nome=valor"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "insere docstrings automaticamente a partir de módulos"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "testa trechos de código automaticamente em blocos de doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "cria link entre documentação Sphinx de diferentes projetos"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "escreve entradas “todo†que podem ser mostradas ou ocultadas na compilação"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "verifica por cobertura da documentação"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "inclui matemática, renderizada como imagens PNG ou SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "inclui matemática, renderizada no navegador por MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "inclusão condicional de conteúdo com base nos valores de configuração"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "inclui links para o código-fonte dos objetos Python documentados"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "cria um arquivo .nojekyll para publicar o documento em páginas do GitHub"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Insira um nome de caminho válido."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Insira algum texto."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Insira um entre %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Insira “y†ou “nâ€."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Insira um sufixo de arquivo, p.ex., “.rst†ou “.txtâ€."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Bem-vindo ao utilitário de início rápido do Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Digite valores para as seguintes configurações (basta pressionar Enter\npara aceitar um valor padrão, se houver um entre colchetes)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Caminho raiz selecionado: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Insira o caminho raiz para a documentação."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Caminho raiz para a documentação"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Erro: um conf.py existente foi encontrado no caminho raiz selecionado."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart não vai sobrescrever projetos Sphinx existentes."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Insira um novo caminho raiz (ou pressione Enter para sair)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Você tem duas opções para definir o diretório de compilação para a saída\nSphinx. Você pode usar um diretório \"_build\" no caminho raiz ou separar\nos diretórios de \"origem\" e \"compilação\" no caminho raiz."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Separar os diretórios de origem e compilação (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "Dentro do diretório raiz, mais dois diretórios serão criados; \"_templates\"\npara modelos HTML personalizados e \"_static\" para folhas de estilo (CSS)\npersonalizadas e outros arquivos estáticos. Você pode inserir outro prefixo\n(como \".\") para substituir o sublinhado."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Prefixo do nome para o diretório de modelos e de arquivos estáticos"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "O nome do projeto vai aparecer em vários lugares na documentação compilada."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Nome do projeto"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Nome(s) de autor(es)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "O Sphinx tem a noção de uma \"versão\" e um \"lançamento\" para o software.\nCada versão pode ter vários lançamentos. Por exemplo, para Python a\nversão é algo como 2.5 ou 3.0, enquanto o lançamento é algo como 2.5.1\nou 3.0a1. Se você não precisa dessa estrutura dupla, apenas defina ambos\ncom o mesmo valor."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Versão do projeto"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Lançamento do projeto"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "Se os documentos forem escritos em um idioma diferente do inglês, você\npode selecionar um idioma aqui pelo seu código de idioma. O Sphinx,\nentão, traduzirá o texto gerado para esse idioma.\n\nPara obter uma lista dos códigos suportados, consulte\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Idioma do projeto"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "O sufixo do nome de arquivo para arquivos fonte. Normalmente, isso é\n\".txt\" ou \".rst\". Apenas arquivos com este sufixo são considerados\ndocumentos."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Sufixo de arquivos-fonte"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "Um documento é especial por ser considerado o nó superior da \"árvore de\nconteúdo\", ou seja, é a raiz da estrutura hierárquica dos documentos.\nNormalmente, isso é \"index\", mas se o documento \"index\" for um modelo\npersonalizado, você também poderá configurá-lo para outro nome de arquivo."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Nome do seu documento mestre (sem sufixo)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Erro: o arquivo mestre %s já foi encontrado no caminho raiz selecionado."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart não vai sobrescrever o arquivo existente."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Insira um novo nome de arquivo, ou renomeie o arquivo existente e pressione Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Indique qual das seguintes extensões do Sphinx devem ser habilitadas:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Nota: imgmath e mathjax não podem ser habilitados ao mesmo tempo. imgmath foi desmarcado."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Um Makefile e um arquivo de comando do Windows podem ser gerados para você,\npara que você só precise executar, p.ex., \"make html\" em vez de invocar o\nsphinx-build diretamente."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Criar um Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Criar um arquivo de comando do Windows? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Criando o arquivo %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "O arquivo %s já existe, ignorando."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Finalizado: uma estrutura de diretório inicial foi criada."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Agora você deve preencher seu arquivo mestre %s e criar outros arquivos-fonte\nda documentação. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Use o Makefile para compilar os documentos, assim:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Use o comando sphinx-build para compilar os documentos, assim:\n sphinx-build -b compilador %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "sendo “compilador†um dos compiladores com suporte, p.ex., html, latex ou linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nGera os arquivos necessários para um projeto Sphinx.\n\nO sphinx-quickstart é uma ferramenta interativa que faz algumas perguntas\nsobre o seu projeto e gera um diretório de documentação completo e um\nMakefile de amostra para ser usado com o sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "modo silencioso"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "raiz do projeto"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Opção Estrutura"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "se especificado, separa diretórios de fonte e de compilação"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "se especificado, cria o dir de construção sob o dir fonte"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "substituto para ponto em _templates etc."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Opções básicas do projeto"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "nome do projeto"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "nomes de autores"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "versão do projeto"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "lançamento do projeto"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "idioma dos documentos"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "sufixo de arquivos-fonte"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "nome do documento mestre"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "usa epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Opções extensão"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "habilita a extensão %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "habilita extensões arbitrárias"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Criação de Makefile e arquivo Batch"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "cria makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "não cria makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "cria arquivo batch"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "não cria arquivo batch"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "usa modo make para Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "não usa modo make para Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Modelo de projeto"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "diretório para arquivos de modelos"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "define uma variável modelo"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "“quiet†está especificada, mas “project†ou “author†não foi."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Erro: o caminho especificado não é um diretório, ou arquivos sphinx já existem."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart só gera em um diretório vazio. Especifique um novo caminho raiz."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Variável de modelo inválida: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "espaços não em branco eliminados por dedent"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Legenda inválida: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "especificação de número de linha está fora da faixa(1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Não é possível usar as opções “%s†e “%s†juntas"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Arquivo incluído %r não encontrado ou sua leitura falhou"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "A codificação %r usada para ler o arquivo incluído %r parece estar errada, tente passar uma opção :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "O objeto chamado %r não foi encontrado no arquivo incluído %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Não é possível usar “lineo-match†com um conjunto separado de “linesâ€"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Especificação de linha %r: nenhuma linha obtida do arquivo incluído %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "o padrão de glob do toctree %r não correspondeu a nenhum documento."
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree contém referência ao documento excluído %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree contém referência ao documento inexistente %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "entrada duplicada encontrada no toctree: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor da seção: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor do módulo: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor do código: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ".. conteúdo acks não está na lista"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ".. conteúdo hlist não está na lista"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "A opção \":file:\" para a diretiva csv-table agora reconhece um caminho absoluto como um caminho relativo do diretório de fontes. Por favor, atualize seu documento."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "Declaração C duplicada, também definida em %s:%s.\nA declaração é '.. c:%s:: %s'."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parâmetros"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "Valores de retorno"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Retorna"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Tipo de retorno"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "membro"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variável"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "função"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "struct"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "união"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerador"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipo"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "parâmetro de função"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Novo na versão %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Alterado na versão %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde a versão %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "citação duplicada %s, outra instância em %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "citação [%s] não é referenciada."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "Declaração C++ duplicada, também definida em %s:%s.\nA declaração é '.. cpp:%s:: %s'."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parâmetros do Modelo"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Lança"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "classe"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "conceito"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "parâmetro de modelo"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (função interna)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (método %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variável global ou constante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atributo %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumentos"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "método"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dado"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atributo"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "descrição duplicada de %s de %s, outro %s em %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "rótulo duplicado da equação %s, outra instância em %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "math_eqref_format inválido: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variáveis"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Levanta"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (no módulo %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (no módulo %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variável interna)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe interna)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe em %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (método de classe %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (método estático %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (propriedade %s )"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Ãndice de Módulos Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "exceção"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "método de classe"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "método estático"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "propriedade"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "mais de um alvo localizado para referência cruzada %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (obsoleto)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (diretiva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (opção diretiva)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (papel)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "diretiva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "opção diretiva"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "papel"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "descrição duplicada de %s %s, outra instância em %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "váriavel de ambiente; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Descrição de opção %r malformada, deve se parecer com “optâ€, “-opt argsâ€, “--opt argsâ€, “/opt args†ou “+opt argsâ€"
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s opção de linha de comando"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "opção de linha de comando"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "um termo de glossário deve ser precedido por uma linha vazia"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "termos de glossário não devem ser separados por linhas vazias"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "o glossário parece estar mal formatado, confira o recuo"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "Glossário de Termos"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "termo gramatical"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "marca referencial"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "váriavel de ambiente"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opção do programa"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "documento"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Ãndice do Módulo"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Página de Busca"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "rótulo duplicada %s, outra instância em %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "descrição duplicada de %s de %s, outra instância em %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig está desabilitado. :numref: é ignorado."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "Falha ao criar uma referência cruzada. Qualquer número não foi atribuído: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "o link não possui legenda: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "numfig_format inválido: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "numfig_format inválido: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "rótulo não definido: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "Falha ao criar uma referência cruzada. Título ou legenda não encontrado: %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "nova configuração"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "configuração alterada"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "extensões alteradas"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "a versão do ambiente de compilação não é a atual"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "diretório de fontes foi alterado"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Este ambiente é incompatível com o compilador selecionado, por favor escolha outro diretório de doctree."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Falha ao procurar documentos em %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "O domínio %r ainda não está registrado"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "o documento não está incluído em nenhum toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "toctree autorreferenciada encontrada. Ignorado."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "veja %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "veja também %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "tipo desconhecido de entrada de índice %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Símbolos"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "referências circulares à toctree detectadas, ignorando: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree contém referência ao documento %r que não possui título: nenhum link será gerado"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "toctree contém referência ao documento não incluído %r"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "arquivo de imagem não legível: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "arquivo de imagem %s não legível: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "arquivo de download não legível: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s já tem números de seção atribuídos (toctree numerada aninhada?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "Criaria o arquivo %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nProcura recursivamente em <MODULE_PATH> módulos e pacotes Python e cria um\narquivo reST com diretivas automodule por pacote no <OUTPUT_PATH>.\n\nOs <EXCLUDE_PATTERN>s podem ser padrões de arquivo e/ou diretório que serão\nexcluídos da geração.\n\nNota: Por padrão, este script não substituirá os arquivos já criados."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "caminho para o módulo a ser documentado"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "padrões de diretório e/ou arquivo no estilo fnmatch para excluir da geração"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "diretório para colocar toda a saída"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "profundidade máxima de submódulos para mostrar no TOC (padrão: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "sobrescreve arquivos existentes"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "segue links simbólicos. Poderoso quando combinado com collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "escreve o script sem criar arquivos"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "coloca a documentação para cada módulo em sua própria página"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "inclui módulos “_privateâ€"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "nome de arquivo da tabela de conteúdo (padrão: modules)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "não cria um arquivo de tabela de conteúdo"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "não cria títulos para os pacotes de módulo/pacote (p.ex., quando as docstrings já os contêm)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "coloca documentação de módulo antes da documentação do submódulo"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "interpreta caminhos de módulos de acordo com a especificação de espaços de nomes implícitos PEP-0420"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "sufixo dos arquivos (padrão: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "gera um projeto completo com sphinx-quickstart"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "acrescenta module_path a sys.path, usando quando --full é fornecido"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "nome do projeto (padrão nome do módulo raiz)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "autor(e)s do projeto, usado quando --full é fornecido"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "versão do projeto, usado quando --full é fornecido"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "lançamento do projeto, usado quando --full é fornecido, padrão é --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "opções de extensão"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s não é um diretório."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "a seção \"%s\" fica rotulada como \"%s\""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "regex inválida %r em %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Teste de cobertura nos fontes finalizada, confira os resultados em %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "regex inválida %r em coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "api c não documentada: %s [%s] no arquivo %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "o módulo %s não pôde ser importado: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "função python não documentada: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "classe python não documentada: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "método python não documentado: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "faltando “+†ou “-†na opção “%sâ€."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "“%s†não é uma opção válida."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "“%s†não é uma opção de pyversion válida"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "Tipo de TestCode inválido"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Teste de doctests nos fontes finalizada, confira os resultados em %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "nenhum código/saída no bloco %s em %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "ignorando código de doctest inválido: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "=================== durações de leitura mais lentas ===================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "O link codificado %r pode ser substituído por um extlink (tente usar %r)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "A diretiva de Graphviz não pode ter conteúdo e argumento de nome de arquivo"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Arquivo externo de Graphviz %r não encontrado ou sua leitura falhou"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Ignorando diretiva “graphviz†sem conteúdo."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "comando de DOT %r não pode ser executado (necessário para a saída do graphviz), verifique a configuração do graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "DOT encerrado com erro:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "DOT não produziu um arquivo de saída:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format deve ser um entre “png†e “svgâ€, mas é %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "código DOT %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[gráfico: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[gráfico]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "Não é possível executar o comando de conversão de imagem %r. 'sphinx.ext.imgconverter' requer ImageMagick por padrão. Verifique se ele está instalado ou defina a opção 'image_converter' para um comando de conversão personalizado.\n\nRastreamento: %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "convert encerrado com erro:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "comando de conversão %r não pode ser executado, verifique a configuração image_converter"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "o comando LaTeX %r não pode ser executado (necessário para exibir matemáticas), verifique a configuração imgmath_latex"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "o comando %s %r não pode ser executado (necessário para exibir matemáticas), verifique a configuração imgmath_%s"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "exibe latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "latex em linha %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "o inventário intersphinx foi movido: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "carregando inventário intersphinx de %s…"
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "encontrados alguns problemas com alguns dos inventários, mas eles tem alternativas em funcionamento:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "falha ao alcançar todos os inventários com os seguintes problemas:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(em %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(em %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "inventário para referência cruzada externa não encontrado: %s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "papel para referência cruzada externa não encontrado: %s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "alvo da referência externa %s:%s não encontrado: %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "identificador intersphinx %r não é uma string. Ignorado"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "Falha ao ler intersphinx_mapping[%s], ignorado: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[código fonte]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Por fazer"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "Entrada de “TODO†encontrada: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(A <<original entry>> está localizada na %s, linha %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "entrada original"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "realçando código de módulo… "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[documentos]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Código do módulo"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Código fonte para %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Visão geral: código do módulo"
+
+#: sphinx/ext/viewcode.py:336
+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/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "valor inválido para a opção member-order: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "valor inválido para a opção class-doc-from: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "assinatura inválida para auto%s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "erro ao formatar argumentos para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc: falhou em determinar %s.%s (%r) a ser documentado, a seguinte exceção foi levantada:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "não sei qual módulo importar para documentação automática %r (tente colocar uma diretiva “module†ou “currentmodule†no documento ou forneça um nome explícito para o módulo)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "Um objeto simulado foi detectado: %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "erro ao formatar assinatura para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "“::†no nome de automodule não faz sentido"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "argumentos de assinatura ou anotação de retorno fornecidos para automodule %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ deve ser uma lista de strings, não %r (no módulo %s) -- ignorando __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "faltando atributo mencionado na opção :members: : módulo %s, atributo %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "Falha ao obter uma assinatura de função para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "Falha ao obter uma assinatura de construtor para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Base: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "faltando atributo %s no objeto %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "apelido de %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "apelido de TypeVar(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "Falha ao obter uma assinatura de método para %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "__slots__ inválido encontrado em %s. Ignorado."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "Falha ao analisar um valor de argumento padrão para %r: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "Falha ao atualizar a assinatura para %r: parâmetro não encontrado: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "Falha ao analisar type_comment para %r: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "referências de autosummmary excluíram o documento %r. Ignorado."
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary: arquivo stub não encontrado %r. Verifique sua configuração autosummary_generate."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "Um autosummary com legenda requer a opção :toctree:. Ignorado."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "autosummary: falha ao importar %s\nPossíveis dicas:\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "falha ao analisar o nome %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "falha ao importar o objecto %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: arquivo não encontrado: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary gera arquivos .rst internamente. Mas seu source_suffix não contém .rst. Ignorado."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary: falhou em determinar %r a ser documentado, a seguinte exceção foi levantada:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] gerando autosummary para: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] escrevendo em %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary] falha ao importar %s\nPossíveis dicas:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nGera ReStructuredText usando diretivas de resumo automático.\n\nsphinx-autogen é um frontend para sphinx.ext.autosummary.generate.\nEle gera os arquivos reStructuredText a partir de diretivas autosummary\ncontidas nos arquivos de entrada fornecidos.\n\nO formato da diretiva autosummary está documentado no módulo Python\n``sphinx.ext.autosummary`` e pode ser lido usando:\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "arquivos-fonte para gerar arquivos rST"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "diretório para colocar toda a saída"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "sufixo padrão para arquivos (padrão: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "diretório de modelos personalizado (padrão: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "documenta membros importados (padrão: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "documenta exatamente os membros no módulo atributo __all__. (padrão: %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argumentos de Palavras-chave"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Exemplo"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Exemplos"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Notas"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Outros Parâmetros"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "Recebe"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Referências"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Avisos"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Yields"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "valor inválido definido (faltando chave de fechamento): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "valor inválido definido (faltando chave de abertura): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "string literal malformada (faltando aspas de fechamento): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "string literal malformada (faltando aspas de abertura): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Atenção"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Cuidado"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Perigo"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Erro"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Ver também"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Aviso"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "continuação da página anterior"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "continua na próxima página"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "Não alfabético"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Números"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "página"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Tabela de Conteúdo"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Buscar"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Ir"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Exibir Fonte"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Visão geral"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Bem Vindo! É isso aí."
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "documentação para"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "última atualização"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Ãndices e Tabelas:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Tabela Completa dos Conteúdos"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "Listar todas seções e subseções"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "Buscar nessa documentação"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "acesso rápido para todos os módulos"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "todas funções, classes, termos"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Ãndice completo em página única"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Páginas de índice por letra"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "pode ser enorme"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navegação"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Pesquisar dentro de %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Sobre esses documentos"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr "&#169; %(copyright_prefix)s %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Última atualização em %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "Criada usando <a href=\"https://www.sphinx-doc.org/pt_BR/master\">Sphinx</a> %(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Buscar em %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Tópico anterior"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "capítulo anterior"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Próximo tópico"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "próximo capítulo"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Por favor, ativar JavaScript para habilitar a\nfuncionalidade de busca."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Pesquisando por várias palavras só mostra correspondências\nque contêm todas as palavras."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "buscar"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Resultados da Busca"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 busca não encontrou nenhum documento. Por favor, confirme se todas as palavras estão grafadas corretamente e se você selecionou categorias suficientes."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Busca rápida"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Essa Página"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Modificações na versão %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de alterações na versão %(version)s, gerada automaticamente"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Alterações na biblioteca"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Alterações na API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Outras alterações"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "Pesquisa finalizada, encontrada(s) ${resultCount} página(s) correspondendo à consulta da pesquisa."
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Buscando"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Preparando a busca..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", em "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Esconder Resultados da Busca"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Recolher painel lateral"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Expandir painel lateral"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Conteúdos"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "Um índice de 4 colunas encontrado. Pode ser um erro de extensões que você usa: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Nota de rodapé [%s] não é referenciada."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Nota de rodapé [#] não é referenciada."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referências de nota de rodapé inconsistentes na mensagem traduzida. original: {0}, traduzida: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "referências inconsistentes na mensagem traduzida. original: {0}, traduzida: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referências de citação inconsistentes na mensagem traduzida. original: {0}, traduzida: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referências de termo inconsistentes na mensagem traduzida. original: {0}, traduzida: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "Não foi possível determinar o texto reserva para a referência cruzada. Pode ser um bug."
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "mais de um alvo localizado para “any†referência cruzada %r: poderia ser %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:alvo de referência %s não encontrado: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "alvo de referência %r não encontrado: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "Não foi possível obter imagem remota: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "Não foi possível obter imagem remota: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Formato de imagem desconhecido: %s…"
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "caracteres de origem não codificáveis, substituindo por “?â€: %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "ignorado"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "falhou"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "Problema no domínio %s: o campo deveria usar o papel \"%s\", mas esse papel não está no domínio."
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "diretiva ou nome de papel desconhecida(o): %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "tipo de nó desconhecido: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "erro de leitura: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "erro de escrita: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Formato de data inválido. Envolva a string com aspas simples se desejar emiti-la diretamente: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr "%r foi descontinuado para entradas de índice (da entrada %r). Use \"pair: %s\"."
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "toctree contém referência ao arquivo inexistente %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "exceção ao avaliar apenas a expressão da diretiva: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "papel padrão %s não encontrado"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format não está definido para %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Quaisquer IDs não atribuídos ao nó %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "Não foi possível obter o tamanho da imagem. A opção :scale: foi ignorada."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "toplevel_sectioning %r desconhecido para a classe %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: grande demais, ignorado."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "título do documento não é um nó único em Text"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "nó de título encontrado não na section, topic, table, admonition ou sidebar"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Notas de rodapé"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "tabularcolumns e opção :widths: foram fornecidas. :widths: foi ignorada."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "a unidade de dimensão %s é inválida. Ignorada."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "tipo desconhecido de entrada de índice %s encontrado"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[imagem: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[imagem]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "legenda não dentro de uma imagem."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "tipo de nó não implementado: %r"
diff --git a/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js b/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..c3a1ceb
--- /dev/null
+++ b/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "pt_PT",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", em",
+ "About these documents": "Sobre estes documentos",
+ "Automatically generated list of changes in version %(version)s": "Lista de altera\u00e7\u00f5es gerada automaticamente na vers\u00e3o %(version)s",
+ "C API changes": "Altera\u00e7\u00f5es na API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Recolher painel lateral",
+ "Complete Table of Contents": "Tabela de Conte\u00fados Completa",
+ "Contents": "Conte\u00fado",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Expandir painel lateral",
+ "Full index on one page": "\u00cdndice completo numa p\u00e1gina",
+ "General Index": "\u00cdndice Geral",
+ "Global Module Index": "\u00cdndice Global de M\u00f3dulos",
+ "Go": "Ir",
+ "Hide Search Matches": "Esconder Resultados da Pesquisa",
+ "Index": "\u00cdndice",
+ "Index &ndash; %(key)s": "\u00cdndice &ndash; %(key)s",
+ "Index pages by letter": "Paginas de \u00edndice por letra",
+ "Indices and tables:": "\u00cdndices e tabelas:",
+ "Last updated on %(last_updated)s.": "\u00daltima actualiza\u00e7\u00e3o em %(last_updated)s.",
+ "Library changes": "Altera\u00e7\u00f5es na biblioteca",
+ "Navigation": "Navega\u00e7\u00e3o",
+ "Next topic": "Pr\u00f3ximo t\u00f3pico",
+ "Other changes": "Outras altera\u00e7\u00f5es",
+ "Overview": "Vis\u00e3o geral",
+ "Please activate JavaScript to enable the search\n functionality.": "Por favor ligue o JavaScript para habilitar a\nfuncionalidade de pesquisa.",
+ "Preparing search...": "A preparar a pesquisa...",
+ "Previous topic": "T\u00f3pico anterior",
+ "Quick search": "Pesquisa r\u00e1pida",
+ "Search": "Pesquisar",
+ "Search Page": "P\u00e1gina de Pesquisa",
+ "Search Results": "Resultados da Pesquisa",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Pesquisar dentro de %(docstitle)s",
+ "Searching": "A Pesquisar",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Exibir Fonte",
+ "Table of Contents": "",
+ "This Page": "Esta P\u00e1gina",
+ "Welcome! This is": "Bem Vindo(a)! Esta \u00e9",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "A sua pesquisa n\u00e3o encontrou nenhum documento. Por favor, confirme que todas as palavras est\u00e3o escritas corretamente e que selecionou categorias suficientes.",
+ "all functions, classes, terms": "todas as fun\u00e7\u00f5es, classes, termos",
+ "can be huge": "pode ser enorme",
+ "last updated": "\u00faltima actualiza\u00e7\u00e3o",
+ "lists all sections and subsections": "Listar todas as sec\u00e7\u00f5es e subsec\u00e7\u00f5es",
+ "next chapter": "pr\u00f3ximo cap\u00edtulo",
+ "previous chapter": "cap\u00edtulo anterior",
+ "quick access to all modules": "acesso r\u00e1pido a todos os m\u00f3dulos",
+ "search": "pesquisar",
+ "search this documentation": "Pesquisar esta documenta\u00e7\u00e3o",
+ "the documentation for": "a documenta\u00e7\u00e3o de"
+ },
+ "plural_expr": "(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2"
+}); \ No newline at end of file
diff --git a/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo b/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..8470498
--- /dev/null
+++ b/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po b/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..246817d
--- /dev/null
+++ b/sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Pedro Algarvio <pedro@algarvio.me>, 2013
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Komiya Takeshi <i.tkomiya@gmail.com>, 2016\n"
+"Language-Team: Portuguese (Portugal) (http://app.transifex.com/sphinx-doc/sphinx-1/language/pt_PT/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: pt_PT\n"
+"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Internos"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Módulos"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (em "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ãndice Geral"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "índice"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "próximo"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "anterior"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Documentação %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Ãndice"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Versão"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor da secção: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor do módulo: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor do código: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parâmetros"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Retorno"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Tipo de retorno"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "membro"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variável"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "função"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tipo"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Novo na versão %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Alterado na versão %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Obsoleto desde a versão %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Gera"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "classe"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (função interna)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (método %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (classe)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variável global ou constante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atributo %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Parâmetros"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (módulo)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "método"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dados"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atributo"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "módulo"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variáveis"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Levanta"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (no módulo %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (no módulo %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variável interna)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (classe interna)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (classe em %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (método de classe %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (método estático %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Ãndice de Módulos do Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "módulos"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Obsoleto"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "excepção"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "método de classe"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "método estático"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (obsoleto)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directiva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (papel)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "directiva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "papel"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "variável de ambiente; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "Termo de glossário"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "token de gramática"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "rótulo de referência"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "variável de ambiente"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opção de programa"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Ãndice de Módulos"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Página de Pesquisa"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "ver %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "ver também %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Símbolos"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[gráfico: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[gráfico]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(em %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[código fonte]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Por fazer"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "entrada original"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[documentos]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Código do módulo"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Código fonte de %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Visão geral: código do módulo"
+
+#: sphinx/ext/viewcode.py:336
+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/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Atenção"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Cuidado"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Perigo"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Erro"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Importante"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Nota"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Veja também"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Dica"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Aviso"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "continuação da página anterior"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Pesquisar"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Ir"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Exibir Fonte"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Visão geral"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Bem Vindo(a)! Esta é"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "a documentação de"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "última actualização"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Ãndices e tabelas:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Tabela de Conteúdos Completa"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "Listar todas as secções e subsecções"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "Pesquisar esta documentação"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Ãndice Global de Módulos"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "acesso rápido a todos os módulos"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "todas as funções, classes, termos"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ãndice &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Ãndice completo numa página"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Paginas de índice por letra"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "pode ser enorme"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navegação"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Pesquisar dentro de %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Sobre estes documentos"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Última actualização em %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Pesquisar %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Tópico anterior"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "capítulo anterior"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Próximo tópico"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "próximo capítulo"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Por favor ligue o JavaScript para habilitar a\nfuncionalidade de pesquisa."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "pesquisar"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Resultados da Pesquisa"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "A sua pesquisa não encontrou nenhum documento. Por favor, confirme que todas as palavras estão escritas corretamente e que selecionou categorias suficientes."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Pesquisa rápida"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Esta Página"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de alterações gerada automaticamente na versão %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Alterações na biblioteca"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Alterações na API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Outras alterações"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "A Pesquisar"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "A preparar a pesquisa..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", em"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Esconder Resultados da Pesquisa"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Recolher painel lateral"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Expandir painel lateral"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Conteúdo"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Notas de rodapé"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[imagem: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[imagem]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/ro/LC_MESSAGES/sphinx.js b/sphinx/locale/ro/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..fc286c6
--- /dev/null
+++ b/sphinx/locale/ro/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ro",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", \u00een",
+ "About these documents": "Despre aceste documente",
+ "Automatically generated list of changes in version %(version)s": "Lista de schimb\u0103ri generat\u0103 automat pentru versiunea %(version)s",
+ "C API changes": "Schimb\u0103ri \u00een API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "Ascundere bar\u0103 lateral\u0103",
+ "Complete Table of Contents": "Cuprinsul Complet",
+ "Contents": "Cuprins",
+ "Copyright": "Drepturi de autor",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Expandare bar\u0103 lateral\u0103",
+ "Full index on one page": "Index complet",
+ "General Index": "Index General",
+ "Global Module Index": "Index Module Globale",
+ "Go": "Caut\u0103",
+ "Hide Search Matches": "Ascunde Rezultatele C\u0103ut\u0103rii",
+ "Index": "Index",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Indexeaz\u0103 paginile dupa liter\u0103",
+ "Indices and tables:": "Indici \u0219i tabele:",
+ "Last updated on %(last_updated)s.": "Ultima actualizare la %(last_updated)s.",
+ "Library changes": "Schimb\u0103ri \u00een bibliotec\u0103",
+ "Navigation": "Navigare",
+ "Next topic": "Subiectul urm\u0103tor",
+ "Other changes": "Alte schimb\u0103ri",
+ "Overview": "Prezentare general\u0103",
+ "Please activate JavaScript to enable the search\n functionality.": "Activeaz\u0103 JavaScript pentru a permite\nfunc\u021bia de c\u0103utare.",
+ "Preparing search...": "Se preg\u0103te\u0219te c\u0103utarea...",
+ "Previous topic": "Subiectul precedent",
+ "Quick search": "C\u0103utare rapid\u0103",
+ "Search": "C\u0103utare",
+ "Search Page": "Pagin\u0103 de C\u0103utare",
+ "Search Results": "Rezultatele C\u0103ut\u0103rii",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "Caut\u0103 \u00een %(docstitle)s",
+ "Searching": "C\u0103utare",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Vezi Sursa",
+ "Table of Contents": "",
+ "This Page": "Aceast\u0103 Pagin\u0103",
+ "Welcome! This is": "Bine ai venit! Acesta este",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "C\u0103utarea nu a identificat nici un document. Te rog s\u0103 te asiguri c\u0103 toate cuvintele sunt scrise corect \u0219i c\u0103 ai selectat suficiente categorii.",
+ "all functions, classes, terms": "toate func\u021biile, clasele, termenii",
+ "can be huge": "poate fi extrem de mare",
+ "last updated": "ultima actualizare",
+ "lists all sections and subsections": "lista tuturor sec\u021biunilor si a subsec\u021biunilor",
+ "next chapter": "capitolul urm\u0103tor",
+ "previous chapter": "capitolul precedent",
+ "quick access to all modules": "acces rapid la toate modulele",
+ "search": "c\u0103utare",
+ "search this documentation": "caut\u0103 \u00een aceast\u0103 documenta\u021bie",
+ "the documentation for": "documenta\u021bia pentru"
+ },
+ "plural_expr": "(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ro/LC_MESSAGES/sphinx.mo b/sphinx/locale/ro/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..c764f03
--- /dev/null
+++ b/sphinx/locale/ro/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ro/LC_MESSAGES/sphinx.po b/sphinx/locale/ro/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..e83cd95
--- /dev/null
+++ b/sphinx/locale/ro/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Razvan Stefanescu <razvan.stefanescu@gmail.com>, 2015-2017
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Razvan Stefanescu <razvan.stefanescu@gmail.com>, 2015-2017\n"
+"Language-Team: Romanian (http://app.transifex.com/sphinx-doc/sphinx-1/language/ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Proiectul necesită minim Sphinx v%s și de aceea nu poate fi construit cu această versiune."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "eșuat: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "a reușit"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "a fost finalizat cu probleme"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Fig. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabelul %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Cod %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Propuneri de Îmbunătățire Python; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Integrate"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Nivelul modul"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(în"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Index General"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "următor"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "precedent"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s documentație"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Versiune"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autorul secțiunii:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autorul modulului:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autorul codului:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametrii"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "ÃŽntoarce"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Tipul întors"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "membru"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variabilă"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funcție"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tip"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nou în versiunea %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Schimbat în versiunea %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Învechit începând cu versiunea %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Generează"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "clasă"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funcție integrată)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metoda %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (clasă)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (variabilă globală sau constantă)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atribut %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumente"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metodă"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variabile"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Generează"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (în modulul %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (în modulul %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (variabilă integrată)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (clasă integrată)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (clasa în %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (metoda clasei %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (metoda statică %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Indexul de Module Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "module"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "ÃŽnvechit"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "excepție"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "metoda clasei"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "metodă statică"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr "(învechit)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (directivă)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rol)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "directivă"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rol"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "variabilă de mediu; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "termen de glosar"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "element de gramatică"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "etichetă de referință"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "variabilă de mediu"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "opțiune a programului"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Index al modulelor"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Pagină de Căutare"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "vezi %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "vezi și %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Simboluri"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[grafic: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[grafic]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(în %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[sursă]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "De făcut"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "înregistrarea inițială"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[documentație]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Codul modulului"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Codul sursă pentru %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Prezentare generală: codul modulului"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Toate modulele pentru care este disponibil codul sursă</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Atenție"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Avertisment"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Pericol"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Eroare"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Sugestie"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Important"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Notă"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Vezi și"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Sfat"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Atenționare"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "continuare din pagina precedentă"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Căutare"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Caută"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Vezi Sursa"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Prezentare generală"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Bine ai venit! Acesta este"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "documentația pentru"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "ultima actualizare"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indici și tabele:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Cuprinsul Complet"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "lista tuturor secțiunilor si a subsecțiunilor"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "caută în această documentație"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Index Module Globale"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "acces rapid la toate modulele"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "toate funcțiile, clasele, termenii"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Index complet"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indexează paginile dupa literă"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "poate fi extrem de mare"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigare"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Caută în %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Despre aceste documente"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Drepturi de autor"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Ultima actualizare la %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Caută %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Subiectul precedent"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "capitolul precedent"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Subiectul următor"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "capitolul următor"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Activează JavaScript pentru a permite\nfuncția de căutare."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "căutare"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Rezultatele Căutării"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Căutarea nu a identificat nici un document. Te rog să te asiguri că toate cuvintele sunt scrise corect și că ai selectat suficiente categorii."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Căutare rapidă"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Această Pagină"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Lista de schimbări generată automat pentru versiunea %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Schimbări în bibliotecă"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Schimbări în API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Alte schimbări"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Căutare"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Se pregătește căutarea..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", în"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Ascunde Rezultatele Căutării"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Ascundere bară laterală"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Expandare bară laterală"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Cuprins"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Note de subsol"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[figura: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[figură]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.js b/sphinx/locale/ru/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..4bf2ff7
--- /dev/null
+++ b/sphinx/locale/ru/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ru",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", \u0432",
+ "About these documents": "\u041e\u0431 \u044d\u0442\u0438\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0445",
+ "Automatically generated list of changes in version %(version)s": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 %(version)s",
+ "C API changes": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0431\u043e\u043a\u043e\u0432\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c",
+ "Complete Table of Contents": "\u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
+ "Contents": "\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435",
+ "Copyright": "\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0430",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0431\u043e\u043a\u043e\u0432\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c",
+ "Full index on one page": "\u041f\u043e\u043b\u043d\u044b\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435",
+ "General Index": "\u0410\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c",
+ "Global Module Index": "\u0410\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0434\u0443\u043b\u0435\u0439",
+ "Go": "\u0418\u0441\u043a\u0430\u0442\u044c",
+ "Hide Search Matches": "\u0421\u043d\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435",
+ "Index": "\u0410\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c",
+ "Index &ndash; %(key)s": "\u0410\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c &ndash; %(key)s",
+ "Index pages by letter": "\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u043e \u0431\u0443\u043a\u0432\u0430\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430",
+ "Indices and tables:": "\u0422\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438:",
+ "Last updated on %(last_updated)s.": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e: %(last_updated)s.",
+ "Library changes": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435",
+ "Navigation": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f",
+ "Next topic": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b",
+ "Other changes": "\u0414\u0440\u0443\u0433\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f",
+ "Overview": "\u041e\u0431\u0437\u043e\u0440",
+ "Please activate JavaScript to enable the search\n functionality.": "\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 JavaScript \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.",
+ "Preparing search...": "\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430\u2026",
+ "Previous topic": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b",
+ "Quick search": "\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u043e\u0438\u0441\u043a",
+ "Search": "\u041f\u043e\u0438\u0441\u043a",
+ "Search Page": "\u041f\u043e\u0438\u0441\u043a",
+ "Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "\u041f\u043e\u0438\u0441\u043a \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u00ab%(docstitle)s\u00bb",
+ "Searching": "\u0418\u0434\u0451\u0442 \u043f\u043e\u0438\u0441\u043a",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442",
+ "Table of Contents": "\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
+ "This Page": "\u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",
+ "Welcome! This is": "\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \u042d\u0442\u043e",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u041f\u043e \u0432\u0430\u0448\u0435\u043c\u0443 \u043f\u043e\u0438\u0441\u043a\u0443 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u0438 \u0447\u0442\u043e \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439.",
+ "all functions, classes, terms": "\u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043b\u0430\u0441\u0441\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b",
+ "can be huge": "\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c",
+ "last updated": "\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435",
+ "lists all sections and subsections": "\u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432",
+ "next chapter": "\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0433\u043b\u0430\u0432\u0430",
+ "previous chapter": "\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0433\u043b\u0430\u0432\u0430",
+ "quick access to all modules": "\u0441\u0432\u043e\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439",
+ "search": "\u0438\u0441\u043a\u0430\u0442\u044c",
+ "search this documentation": "\u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438",
+ "the documentation for": "\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f"
+ },
+ "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ru/LC_MESSAGES/sphinx.mo b/sphinx/locale/ru/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..164e304
--- /dev/null
+++ 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
new file mode 100644
index 0000000..dfee9f8
--- /dev/null
+++ b/sphinx/locale/ru/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3701 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Alex Salikov <Salikvo57@gmail.com>, 2019
+# Dmitry Shachnev <mitya57@gmail.com>, 2013
+# ferm32 <ferm32@gmail.com>, 2014,2016,2019
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013
+# Il'ya <ilya@marshal.dev>, 2022
+# Konstantin Molchanov <moigagoo@live.com>, 2016
+# PyHedgehog <pywebmail@list.ru>, 2015,2017
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Il'ya <ilya@marshal.dev>, 2022\n"
+"Language-Team: Russian (http://app.transifex.com/sphinx-doc/sphinx-1/language/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Проект требует верÑию Sphinx не ниже v%s и не может быть поÑтроен текущей верÑией."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "готово"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "ошибка: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Сборщик не указан, по умолчанию иÑпользуетÑÑ html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "уÑпешно"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "Ñборка завершена %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "в конфигурационной папке нет файла conf.py file (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "ОтÑутÑтвует ключ конфигурации %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Ключ конфигурации %r уже ÑущеÑтвует"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Файл конфигурации (или один из импортированных модулей) вызвал sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Ð’ вашем файле конфигурации Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Раздел %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "РиÑ. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Таблица %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "СпиÑок %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Событие %r уже ÑущеÑтвует"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "ÐеизвеÑтное Ñобытие: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "ОтÑутÑтвует аттрибут \"name\" у клаÑÑа Ñборщика %s."
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Сборщик %r уже ÑущеÑтвует (в модуле %s)."
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Сборщик %s не зарегиÑтрирован Ñвно или через реÑурÑÑ‹ пакетов."
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Сборщик %s не зарегиÑтрирован."
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Изначальное иÑключение:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Ðе могу загрузить модуль раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "раÑширение %r не определÑет функцию setup(); Ñто дейÑтвительно модуль раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Sphinx?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "ÐŸÑ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð± улучшениÑÑ… Python; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "Ðе получаетÑÑ Ñчитать файл изображение %r: Ñкопируйте его"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "Ðе получаетÑÑ Ñкопировать файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "Ðе получаетÑÑ Ð·Ð°Ð¿Ð¸Ñать файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "запиÑываетÑÑ %s файл..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Ð’Ñтроенные функции"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Модуль"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (в "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Ðлфавитный указатель"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "указатель"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "вперёд"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "назад"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Ðлфавитный указатель"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "ВыпуÑк"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "Ðевозможно Ñовмещать ключ -a и Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "Ðе получаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми %r:%s "
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "ВерÑÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Релиз проекта"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Язык проекта"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Создание файла %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Файл %s уже ÑущеÑтвует, пропуÑкаем."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "Ð¸Ð¼Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "имена авторов"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "верÑÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "релиз проекта"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "Ñзык проекта"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "иÑпользовать epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Ðвтор раздела: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Ðвтор модулÑ: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Ðвтор кода:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Ðвтор: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Параметры"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Результат"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Тип результата"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "поле"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "переменнаÑ"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "функциÑ"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "макроÑ"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "перечиÑлÑемый тип"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "перечиÑлитель"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "тип"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Добавлено в верÑии %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Изменено в верÑии %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Ðе рекомендуетÑÑ, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð²ÐµÑ€Ñии %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Параметры шаблона"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "БроÑает иÑключение"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "клаÑÑ"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "концепт"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (вÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (метод %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (клаÑÑ)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð»Ð¸ конÑтанта)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (атрибут %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Ðргументы"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (модуль)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "метод"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "данные"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "атрибут"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "модуль"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "повторÑющаÑÑÑ Ð¼ÐµÑ‚ÐºÐ° ÑƒÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ %s, также иÑпользуетÑÑ Ð² %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Переменные"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "ИÑключение"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (в модуле %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (в модуле %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (вÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (вÑтроенный клаÑÑ)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (клаÑÑ Ð² %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (метод клаÑÑа %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (ÑтатичеÑкий метод %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Содержание модулей Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "модули"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Ðе рекомендуетÑÑ"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "иÑключение"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "метод клаÑÑа"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "ÑтатичеÑкий метод"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr "(иÑпользование не рекомендуетÑÑ)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (директива)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (роль)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "директива"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "роль"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "Ñлемент ÑловарÑ"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "токен грамматики"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "текÑÑ‚ ÑÑылки"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "документ"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "СоÑтав модулÑ"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "ПоиÑк"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "Ð½Ð¾Ð²Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð°"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "Ñм. %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "также Ñм. %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Символы"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[иллюÑтрациÑ: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[иллюÑтрациÑ]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(в %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[иÑходный код]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "План"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<иÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ>> находитÑÑ Ð² %s, Ñтрока %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "иÑходный Ñлемент"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[документациÑ]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Код модулÑ"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>ИÑходный код %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Обзор: иÑходный код модулÑ"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Ð’Ñе модули, в которых еÑÑ‚ÑŒ код</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Базовые клаÑÑÑ‹: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Именованные аргументы"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Пример"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Примеры"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Заметки"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Другие параметры"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "ПредупрждениÑ"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Внимание"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "ОÑторожно"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "ОпаÑно"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Ошибка"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "ПодÑказка"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Важно"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Примечание"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "См.также"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Совет"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "продолжение Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ Ñтраницы"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "ЧиÑла"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "Ñтраница"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Оглавление"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "ИÑкать"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "ИÑходный текÑÑ‚"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Обзор"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Добро пожаловать! Это"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "документациÑ"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ðлфавитный указатель &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ÐавигациÑ"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "ПоиÑк в документе «%(docstitle)s»"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Об Ñтих документах"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "ÐвторÑкие права"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Обновлено: %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "ПоиÑк в документе «%(docstitle)s»"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Предыдущий раздел"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð³Ð»Ð°Ð²Ð°"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Следующий раздел"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð³Ð»Ð°Ð²Ð°"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ поиÑка включите JavaScript в браузере."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "иÑкать"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Результаты поиÑка"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "БыÑтрый поиÑк"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² верÑии %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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 "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Другие изменениÑ"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Идёт поиÑк"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Подготовка поиÑка…"
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", в"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "СнÑÑ‚ÑŒ выделение"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Свернуть боковую панель"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Развернуть боковую панель"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Содержание"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "СноÑки"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[риÑунок: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[риÑунок]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/si/LC_MESSAGES/sphinx.js b/sphinx/locale/si/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..f8196d4
--- /dev/null
+++ b/sphinx/locale/si/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "si",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "\u0db8\u0dd9\u0db8 \u0dbd\u0dda\u0d9b\u0dab \u0d9c\u0dd0\u0db1",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "C API \u0dc0\u0dd9\u0db1\u0dc3\u0dca\u0d9a\u0db8\u0dca",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "\u0dc3\u0db8\u0dca\u0db4\u0dd6\u0dbb\u0dca\u0dab \u0db4\u0da7\u0dd4\u0db1",
+ "Contents": "\u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0d9c\u0dad\u0dba",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "\u0dba\u0db1\u0dca\u0db1",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "\u0db4\u0dd4\u0dc3\u0dca\u0dad\u0d9a\u0dcf\u0dbd \u0dc0\u0dd9\u0db1\u0dc3\u0dca\u0d9a\u0db8\u0dca",
+ "Navigation": "\u0d9c\u0db8\u0db1\u0dca \u0d9a\u0dd2\u0dbb\u0dd3\u0db8",
+ "Next topic": "\u0d8a\u0dc5\u0d9f \u0db8\u0dcf\u0dad\u0dd8\u0d9a\u0dcf\u0dc0",
+ "Other changes": "\u0dc0\u0dd9\u0db1\u0dad\u0dca \u0dc0\u0dd9\u0db1\u0dc3\u0dca\u0d9a\u0db8\u0dca",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "\u0dc3\u0dd9\u0dc0\u0dd4\u0db8 \u0dc3\u0dd6\u0daf\u0dcf\u0db1\u0db8\u0dca \u0d9a\u0dbb\u0db8\u0dd2\u0db1\u0dca....",
+ "Previous topic": "\u0db4\u0dd9\u0dbb \u0db8\u0dcf\u0dad\u0dd8\u0d9a\u0dcf\u0dc0",
+ "Quick search": "\u0d89\u0d9a\u0dca\u0db8\u0db1\u0dca \u0dc3\u0dd9\u0dc0\u0dd4\u0db8",
+ "Search": "\u0dc3\u0ddc\u0dba\u0db1\u0dca\u0db1",
+ "Search Page": "\u0dc3\u0dd9\u0dc0\u0dd4\u0db8\u0dca \u0db4\u0dd2\u0da7\u0dd4\u0dc0",
+ "Search Results": "\u0dc3\u0dd9\u0dc0\u0dd4\u0db8\u0dca \u0db4\u0dca\u200d\u0dbb\u0dad\u0dd2\u0db5\u0dbd",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "\u0dc3\u0ddc\u0dba\u0db8\u0dd2\u0db1\u0dca...",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u0db8\u0dd6\u0dbd\u0dba \u0db4\u0dd9\u0db1\u0dca\u0dc0\u0db1\u0dca\u0db1",
+ "Table of Contents": "",
+ "This Page": "\u0db8\u0dd9\u0db8 \u0db4\u0dd2\u0da7\u0dd4\u0dc0",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "\u0dc0\u0dd2\u0dc1\u0dcf\u0dbd \u0dc0\u0dd2\u0dba \u0dc4\u0dd0\u0d9a",
+ "last updated": "\u0d85\u0dc0\u0dc3\u0db1\u0dca\u0dc0\u0dbb\u0da7 \u0dba\u0dcf\u0dc0\u0dad\u0dca\u0d9a\u0dcf\u0dbd \u0d9a\u0dbd",
+ "lists all sections and subsections": "",
+ "next chapter": "\u0d8a\u0dc5\u0d9f \u0db4\u0dbb\u0dd2\u0da0\u0dca\u0da1\u0dda\u0daf\u0dba",
+ "previous chapter": "\u0db4\u0dd9\u0dbb \u0db4\u0dbb\u0dd2\u0da0\u0dca\u0da1\u0dda\u0daf\u0dba",
+ "quick access to all modules": "",
+ "search": "\u0dc3\u0ddc\u0dba\u0db1\u0dca\u0db1",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/si/LC_MESSAGES/sphinx.mo b/sphinx/locale/si/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..b47495f
--- /dev/null
+++ b/sphinx/locale/si/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/si/LC_MESSAGES/sphinx.po b/sphinx/locale/si/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..c55f834
--- /dev/null
+++ b/sphinx/locale/si/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# callkalpa <callkalpa@gmail.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: callkalpa <callkalpa@gmail.com>, 2013\n"
+"Language-Team: Sinhala (http://app.transifex.com/sphinx-doc/sphinx-1/language/si/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: si\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "ඊළඟ"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "පෙර"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s ලේඛණය"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "නිකුත් කිරීම"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "කේත ලේඛක:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "ලේඛක:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "පරà·à¶¸à·’තීන්"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "à·ƒà·à¶¸à·à¶¢à·’ක"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "විචල්â€à¶ºà¶º"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "ක්â€à¶»à·’යà·à·€"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "මà·à¶šà·Šâ€à¶»à·"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "වර්ගය"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "%s වෙළුමේ අලුත්"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "%s වෙළුමේ වෙනස් කල"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "දත්ත"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "විචල්â€à¶º"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "සෙවුම් පිටුව"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "%s බලන්න"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "%s ද බලන්න"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "සංකේත"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graph: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graph]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(%s à·„à·’%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[source]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "කිරීමට තිබෙන"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "දà·à·‚ය"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "à·„à·à¶Ÿà·€à·“ම"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "සටහන"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "මෙයද බලන්න"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "අනතුරු ඇඟවීම"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "සොයන්න"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "යන්න"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "මූලය පෙන්වන්න"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ගමන් කිරීම"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "මෙම ලේඛණ ගà·à¶±"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s සොයන්න"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "පෙර මà·à¶­à·˜à¶šà·à·€"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "පෙර පරිච්ඡේදය"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "ඊළඟ මà·à¶­à·˜à¶šà·à·€"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "ඊළඟ පරිච්ඡේදය"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "සොයන්න"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "සෙවුම් ප්â€à¶»à¶­à·’ඵල"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "ඉක්මන් සෙවුම"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: 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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "සොයමින්..."
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "සෙවුම සූදà·à¶±à¶¸à·Š කරමින්...."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "අන්තර්ගතය"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[image: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/sk/LC_MESSAGES/sphinx.js b/sphinx/locale/sk/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..90125dd
--- /dev/null
+++ b/sphinx/locale/sk/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "sk",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", v ",
+ "About these documents": "O dokument\u00e1cii",
+ "Automatically generated list of changes in version %(version)s": "Automaticky generovan\u00fd zoznam zmien vo verzii %(version)s",
+ "C API changes": "Zmeny API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Zmeny vo verzii %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Zbali\u0165 bo\u010dn\u00fd panel",
+ "Complete Table of Contents": "Celkov\u00fd obsah",
+ "Contents": "Obsah",
+ "Copyright": "Autorsk\u00e9 pr\u00e1vo",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Vytvoren\u00e9 pomocou <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "Rozbali\u0165 bo\u010dn\u00fd panel",
+ "Full index on one page": "Cel\u00fd index na jednej strane",
+ "General Index": "V\u0161eobecn\u00fd index",
+ "Global Module Index": "Celkov\u00fd index modulov",
+ "Go": "OK",
+ "Hide Search Matches": "Skry\u0165 v\u00fdsledky h\u013eadania",
+ "Index": "Index",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Indexov\u00e9 str\u00e1nky po p\u00edsmen\u00e1ch",
+ "Indices and tables:": "Indexy a tabu\u013eky",
+ "Last updated on %(last_updated)s.": "Naposledy aktualizovan\u00e9 %(last_updated)s.",
+ "Library changes": "Zmeny kni\u017enice",
+ "Navigation": "Navig\u00e1cia",
+ "Next topic": "\u010eal\u0161ia t\u00e9ma",
+ "Other changes": "Ostatn\u00e9 zmeny",
+ "Overview": "Preh\u013ead",
+ "Please activate JavaScript to enable the search\n functionality.": "Pros\u00edm, na zapnutie funkcie h\u013eadania,aktivujte\nJavaScript .",
+ "Preparing search...": "Pr\u00edprava h\u013eadania...",
+ "Previous topic": "Predo\u0161l\u00e1 t\u00e9ma",
+ "Quick search": "R\u00fdchle h\u013eadanie",
+ "Search": "H\u013eada\u0165",
+ "Search Page": "Str\u00e1nka h\u013eadania",
+ "Search Results": "V\u00fdsledky h\u013eadania",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "H\u013eada\u0165 v %(docstitle)s",
+ "Searching": "H\u013eadanie",
+ "Searching for multiple words only shows matches that contain\n all words.": "H\u013eadanie viacer\u00fdch slov vracia len zhody, ktor\u00e9 obsahuj\u00fa\n v\u0161etky slov\u00e1.",
+ "Show Source": "Zobrazi\u0165 zdroj",
+ "Table of Contents": "Obsah",
+ "This Page": "T\u00e1to str\u00e1nka",
+ "Welcome! This is": "Vitajte! Toto je",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "V\u00e1\u0161mu h\u013eadaniu nezodpoved\u00e1 \u017eiadny dokument. Pros\u00edm, skontrolujte, \u017ee v\u0161etky zadan\u00e9 slov\u00e1 s\u00fa spr\u00e1vne nap\u00edsan\u00e9 a \u017ee ste zvolili vhodn\u00e9 kateg\u00f3rie.",
+ "all functions, classes, terms": "v\u0161etky funkcie, triedy, term\u00edny",
+ "can be huge": "m\u00f4\u017ee by\u0165 rozsiahle",
+ "last updated": "posledn\u00e1 aktualiz\u00e1cia",
+ "lists all sections and subsections": "zoznam v\u0161etk\u00fdch sekci\u00ed a podsekci\u00ed",
+ "next chapter": "\u010fal\u0161ia kapitola",
+ "previous chapter": "predo\u0161l\u00e1 kapitola",
+ "quick access to all modules": "r\u00fdchly pr\u00edstup ku v\u0161etk\u00fdm modulom",
+ "search": "h\u013eada\u0165",
+ "search this documentation": "h\u013eada\u0165 v tejto dokument\u00e1cii",
+ "the documentation for": "dokument\u00e1cia"
+ },
+ "plural_expr": "(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/sk/LC_MESSAGES/sphinx.mo b/sphinx/locale/sk/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..92a9aca
--- /dev/null
+++ b/sphinx/locale/sk/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/sk/LC_MESSAGES/sphinx.po b/sphinx/locale/sk/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..7987c9a
--- /dev/null
+++ b/sphinx/locale/sk/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3697 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2008
+# Slavko <linux@slavino.sk>, 2013-2019,2021
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Slavko <linux@slavino.sk>, 2013-2019,2021\n"
+"Language-Team: Slovak (http://app.transifex.com/sphinx-doc/sphinx-1/language/sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: sk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Nemožno nájsÅ¥ zdrojový prieÄinok (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Výstupný adresár (%s) nie je adresár"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Zdrojový a cieľový prieÄinok nemôžu byÅ¥ rovnaké"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Spúšťanie Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Tento projekt vyžaduje aspoň Sphinx v%s a preto s touto verziou nemôže byť zostavený."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "vytváranie výstupnej zložky"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "pri nastavovaní rozšírenia %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' definovaný v conf.py nie je funkciou. Prosím, upravte jeho definíciu tak, aby to bola funkcia. Je to potrebné, aby sa conf.py mohol správať ako rozšírenie Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "naÄítanie prekladov [%s]…"
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "hotovo"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "nedostupné pre zabudované správy"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "naÄítanie uloženého prostredia "
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "zlyhalo: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Nebol zvolený builder, bude použitý predvolený: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "úspešné"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "dokonÄené sproblémami"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "zostavenie %s, %s upozornenia/a (upozornenia považované za chyby)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "zostavenie %s, %s upozornenia/a (upozornenia považované za chyby)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "zostavenie %s, %s upozornenie."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "zostavenie %s, %s upozornenie/a."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "zostavenie %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "trieda uzla %r už je registrovaná, jej metódy (visitors) budú prepísané"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "direktíva %r už je registrovaná, bude prepísaná"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "rola %r už je registrovaná, bude prepísaná"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "rozšírenie %s nedeklaruje, Äi je bezpeÄné pri paralelnom Äítaní, predpokladá sa, že nie - prosím, požiadajte autora aby to skontroloval a explicitne to nastavil"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "rozšírenie %s nie je bezpeÄné pre paralelné zostavenie"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "rozšírenie %s nedeklaruje, Äi je bezpeÄné pri paralelnom Äítaní, predpokladáme, že nie je – prosím, požiadajte autora aby to skontroloval a explicitne to nastavil"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "rozšírenie %s nie je bezpeÄné pre paralelné zostavenie"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "sériové spracovanie %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "konfiguraÄný prieÄinok neobsahuje súbor conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "nemožno prepísať slovník nastavenia %r, ignorované (použite %r na nastavenie jednotlivých prvkov)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "neplatný poÄet %r pre konfiguraÄnú hodnotu %r, ignorované"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "nemožno prepísaÅ¥ konfiguraÄné nastavenie %r s nepodporovaným typom, ignorované"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "neznáma konfiguraÄná hodnota %r v prepísaní, ignorované"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Neznáma konfiguraÄná hodnota: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "KonfiguraÄná hodnota %r už existuje"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Vo svojom konfiguraÄnom súbore máte chybu: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "KonfiguraÄný súbor (alebo jeden z modulov, ktoré importuje) volal sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "V konfiguraÄnom súbore je programová chyba:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "KonfiguraÄná hodnota „source_suffix†oÄakáva reÅ¥azec, zoznam reÅ¥azcov alebo slovník, ale zadali ste „%râ€."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Sekcia %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Obr. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabuľka %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Výpis %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "KonfiguraÄná hodnota `{name}` má byÅ¥ jedno z {candidates}, ale je zadané `{current}`."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "KonfiguraÄná hodnota `{name}' má typ `{current.__name__}'; oÄakávané {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "KonfiguraÄná hodnota `{name}' má typ `{current.__name__}', predvolene `{default.__name__}'."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r nenájdená, ignorované."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Od v2.0 Sphinx predvolene používa „index†ako root_doc. Prosím, pridajte „root_doc = 'contents'†do svojho conf.py."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Udalosť %r už existuje"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Neznáme meno udalosti %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "Obsluha %r udalosti %r vyvolala výnimku"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "Rozšírenie %s je vyžadované nastavením needs_extensions, ale nie je naÄítané."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Tento projekt vyžaduje rozšírenie %s s verziou minimálne %s, a teda ho nemožno zostaviÅ¥ s naÄítanou verziou (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Neznáme meno lexera Pygments %r"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "nájdených viacero súborov pre dokument \"%s\": %r\nNa zostavenie použite %r."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Trieda builder %s nemá atribút „nameâ€"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Builder %r už existuje (v module %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Builder s menom %s nie je registrovaný ani dostupný cez vstupný bod"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Builder s menom %s nie je registrovaný"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "doména %s už je zaregistrovaná"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "doména %s ešte nie je zaregistrovaná"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "Direktíva %r už je registrovaná v doméne %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "Rola %r už je registrovaná v doméne %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "Index %r už je registrovaný v doméne %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr " object_type %r už je registrovaný"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "crossref_type %r už je registrovaný"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r už je registrovaný"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser pre %r už je registrovaný"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Analyzátor pre %s nie je registrovaný"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Translator pre %r už existuje"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r už je registrovaný"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "rozšírenie %r bolo zlúÄené so Sphinx od verzie %s; toto rozšírenie je ignorované."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Pôvodná výnimka:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "Nemožno importovať rozšírenie %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "rozšírenie %r nemá funkciu setup(); je to naozaj modul rozšírenia Sphinx?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Rozšírenie %s použité týmto projektom vyžaduje aspoň Sphinx v%s; takže ho nemožno zostaviť s touto verziou."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "rozšírenie %r vrátilo so svojej funkcie setup() nepodporovaný objekt; musí vrátiť None alebo slovník metadát"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "téma %r nemá nastavenie „themeâ€"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "téma %r nemá nastavenie „inheritâ€"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "nebola nájdená téma s menom %r, dedená v %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "nastavenie %s.%s nenájdené v žiadnom z nastavení témy"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "zadaná nepodporovaná voľba témy %r"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "súbor %r v ceste témy nie je platný súbor ZIP alebo neobsahuje tému"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "nebola nájdená téma smenom %r (chýbajúci theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "vhodný obrázok pre zostavovaÄ %s nenájdený: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "vhodný obrázok pre zostavovaÄ %s nenájdený: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "zostavenie [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "zápis výstupu…"
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "všetky z %d súborov po"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "ciele pre %d po súborov, ktoré boli zadané"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "ciele pre %d po súborov, ktoré sú zastarané"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "všetky zdrojové súbory"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "súbor %r zadaný v príkazovom riadku nie je v zdrojovom adresári, ignorujem"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "%d zdrojové súbory zadané v príkazovom riadku"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "ciele pre %d zdrojových súborov, ktoré sú zastarané"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "zostavovanie [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "hľadanie zastaraných súborov…"
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d nájdené"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "nenájdené"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "ukladanie prostredia"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "kontrolovanie konzistencie"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "žiadne ciele nie sú zastarané."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "aktualizácia prostredia:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s pridané, %s zmenené, %s odstránené"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "Äítanie zdrojov…"
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "mená dokumentov na zapísanie: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "príprava dokumentov"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "nájdená duplicitná položka Obsahu: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "kopírovanie obrázkov…"
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "nemožno ÄítaÅ¥ súbor obrázku %r: jeho kopírovanie namiesto toho"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "nemožno kopírovať súbor obrázka %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "nemožno zapísať súbor obrázka %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Pillow nenájdené – kopírovanie súborov obrázkov"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "zapisovanie súboru mimetype…"
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "zapisovanie súboru META-INF/container.xml…"
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "zapisovanie súboru content.opf..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "neznámy typ MIME pre %s, ignorovaný"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "zapisovanie súboru toc.ncx..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "zapisovanie súboru %s…"
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "Súbor prehľadu je v %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "žiadne zmeny vo verzii %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "zapisovanie súboru prehľadu…"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Zabudované funkcie"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Úroveň modulu"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "kopírovanie zdrojových súborov…"
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "nemožno ÄítaÅ¥ %r na vytvorenie položky záznamu zmien"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "ZostavovaÄ dummy negeneruje žiadne súbory."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "Súbory ePub sú v %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "zapisovanie súboru nav.xhtml..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_language†(alebo „languageâ€) nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_uid†má byÅ¥ XML NAME pre EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_title†(alebo „html_titleâ€) nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_author†nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_contributor†nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_description†nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_publisher†nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_copyright†(alebo „copyrightâ€) nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „epub_identifier†nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "konfiguraÄná hodnota „version†nesmie byÅ¥ prázdna pri EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "neplatný css_file: %r, ignorovaný"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Katalógy správ sú v %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "Äítanie Å¡ablón… "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "zapisovanie katalógov správ…"
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Hľadajte akékoľvek chyby v predošlom výstupe alebo v %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "poškodený odkaz: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Manuálové stránky sú v %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "nebola nájdená konfiguraÄná voľba „man_pagesâ€; manuálové stránky nebudú zapísané"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "zapisovanie"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "konfiguraÄná voľba „man_pages†odkazuje na neznámy dokument %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "Stránky HTML sú v %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "zostavovanie spoloÄného dokumentu"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "zapisovanie dodatoÄných súborov"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Súbory Texinfo sú v %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nSpustite v tomto adresári 'make' na ich spustenie pomocou makeinfo\n(použite tu 'make info' aby to bolo spustené automaticky)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "nebola nájdená konfiguraÄná voľba „texinfo_documentsâ€; dokumenty nebudú zapísané"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "konfiguraÄná voľba „texinfo_documents†odkazuje na neznámy dokument %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "spracovanie %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "riešenie odkazov…"
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(v"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "kopírovanie podporných súborov Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "chyba zápisu súboru Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Textové súbory sú v %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "chyba zápisu súboru %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Súbory XML sú v %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Súbory pseudo-XML sú v %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "súbor info zostavenia je poškodený: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Stránky HTML sú v %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "Čítanie súboru zostavenia info zlyhalo: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d. %b %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Všeobecný index"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "Äalší"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "predošlý"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "generovanie indexov"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "zapisovanie dodatoÄných stránok"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "kopírovanie súborov na stiahnutie…"
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "nemožno kopírovať súbor na stiahnutie %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "Kopírovanie súboru v html_static_file zlyhalo: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "kopírovanie statických súborov"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "nemožno kopírovať statický súbor %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "kopírovanie extra súborov"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "nemožno kopírovať extra súbor %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "Zápis súboru zostavenia info zlyhal: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "index hľadania nemožno naÄítaÅ¥, ale nebudú zostavované vÅ¡etky dokumenty, takže index nebude kompletný."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "stránka %s vyhovuje dvom vzorom v html_sidebars: %r a %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "pri spracovaní stránky %s nastala chyba Unicode. Prosím, zaistite, že vÅ¡etky konfiguraÄné hodnoty, ktoré obsahujú nieASCII hodnotu sú reÅ¥azce Unicode."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Nastala chyba pri spracovaní stránky %s.\nPríÄina: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "generovanie inventára objektov…"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "generovanie indexu hľadania v %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "neplatné js_file: %r, ignorované"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Zaregistrovaných je viac math_renderer, ale žiadny nie je zvolený."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "Zdaný neznámy math_renderer %r."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "položka „html_extra_path entry†%r neexistuje"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "položka html_extra_path %r je umiestnené vo vnútri výstupného adresára"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "položka „html_static_path†%r neexistuje"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "položka html_static_path %r je umiestnené vo vnútri výstupného adresára"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "súbor loga %r neexistuje"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "súbor favicon %r neexistuje"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Dokumentácia %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Súbory LaTeX sú v %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nSpustite v tomto adresári 'make' na ich spustenie pomocou (pdf)latex\n(použite tu 'make latexpdf' aby to bolo spustené automaticky)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "nebola nájdená konfiguraÄná voľba „latex_documentsâ€; dokmenty nebudú zapísané"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "konfiguraÄná voľba „latex_documents†odkazuje na neznámy dokument %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Vydanie"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "žiadna známa voľba Babel pre jazyk %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "kopírovanie podporných súborov Tex"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "kopírovanie podporných súborov Tex…"
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "kopírovanie dodatoÄných súborov"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Neznámy konfiguraÄný kľúÄ: latex_elements[%r], ignorovaný."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "Neznáma voľba témy: latex_theme_options[%r], ignorovaná."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r nemá nastavenia „themeâ€"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "téma %r nemá nastavenie „1%sâ€"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "PoÄas zostavenia sa vyskytla výnimka, spúšťam ladenie:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "Prerušené!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "Chyba znaÄky reST:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Chyba kódovania:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "Úplný záznam chýb bol zapísaný v %s, ak chcete nahlásiť problém vývojárom."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Chyba rekurzie:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "Toto môže nastať s veľmi veľkými alebo príliš hlboko vnáranými zdrojovými súbormi. môžete opatrne zvýšiť predvolenú hodnotu limitu rekurzie Python z 1000 v conf.py, napr.:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Nastala výnimka:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Prosím, nahláste to, i keÄ to bola chyba používateľa, aby mohla byÅ¥ nabudúce poskytnutá lepÅ¡ia chybová správa."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Hlásenie o chybe možno vyplniť na <https://github.com/sphinx-doc/sphinx/issues>. Ďakujeme!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "poÄet úloh musí byÅ¥ kladné Äíslo"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nGeneruje dokumentáciu zo zdrojových súborov.\n\nsphinx-build generuje dokumentáciu zo súborov v SOURCEDIR a umiestni ju\nv OUTPUTDIR. KonfiguraÄné voľby hľadá v 'conf.py' v SOURCEDIR.\nNa generovanie súborov Å¡ablón, vrátane 'conf.py' možno použiÅ¥ nástroj\n'sphinx-quickstart'\n\nsphinx-build dokáže vytvoriÅ¥ dokumentáciu v rôznych formátoch. Formát je\nzvolený zadaním mena zostavovaÄa v príkazovom riadku; predvolene\nHTML. ZostavovaÄe môžu vykonávaÅ¥ aj iné úlohy, ktoré súvisia so spracovaním\ndokuemntácie.\n\nPredvolene je zostavené vÅ¡etko, Äo bolo zmenené. Výstup len zvolených súborov\nmôže byÅ¥ zostavený zadaním jednotlivých mien súborov.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "cesta k zdrojovým súborom dokumentácie"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "cesta k výstupnej zložke"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "zoznam špecifických súborov na zostavenie, ignorovaný ak je použité -a"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "všeobecné voľby"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "použitý zostavovaÄ (predvolený: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "zapísať všetky súbory (predvolene: zapísať len nové a zmenené súbory)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "nepoužívaÅ¥ uložené prostredie, vždy ÄítaÅ¥ vÅ¡etky súbory"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "cesta uloženého prostredia a súbory doctree (predvolene: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "zostaviÅ¥ paralelne s N procesmi možné (Å¡peciálna hodnota „auto†nastaví N na poÄet CPU)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "cesta k adresáru s konfiguraÄným súborom (conf.py) (predvolene: rovnaké ako SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "vôbec nepoužiÅ¥ konfiguraÄný súbor, len voľby -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "prepíše nastavenie konfiguraÄného súboru"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "pošle hodnotu do šablón HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "hnidopichný režim, upozorniť na všetky chýbajúce prepojenia"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "voľby výstupu konzoly"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "zvýšiÅ¥ rozvláÄnosÅ¥ (možno opakovaÅ¥)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "žiadny výstup, len upozornenia na stderr"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "vôbec žiadny výstup, ani upozornenia"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "generovať farebný výstup (predvolene: automaticky detegovať)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "negenerovať farebný výstup (predvolene: automaticky detegovať)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "zapísať varovania (a chyby) do zadaného súboru"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "prepnúť upozornenia na chyby"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "s -W, pokraÄovaÅ¥ po upozornení"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "pri výnimke zobraziť úplné chybové hlásenie"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "pri výnimke spustiť Pdb"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "nemožno kombinovať voľbu -a a mená súborov"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "nemožno otvoriť súbor varovaní %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "argument voľby -D musí byť v tvare meno=hodnota"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "argument voľby -A musí byť v tvare meno=hodnota"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "automaticky vložiÅ¥ dokumentaÄné reÅ¥azce z modulov"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "automaticky testovaÅ¥ kúsky kódu v blokoch dokumentaÄných reÅ¥azcov"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "prepojenie medzi dokumentáciou Sphinx rôznych modulov"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "písaÅ¥ položky „todoâ€, ktoré môžu byÅ¥ zobrazené alebo skryté pri zostavení"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "zahrnúť math, spracované ako obrázky PNG alebo SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "zahrnúť math, spracované prehliadaÄom pomocou MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "podmieneÄné zahrnutie obsahu na základe konfiguraÄných volieb"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "zahrnúť odkazy na zdrojový kód dokumentovaných objektov Python"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "vytvoriť súbor .nojekyll na publikovanie dokumentu na GitHub"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Prosím, zadajte platnú cestu."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Prosím, zadajte nejaký text."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Prosím, zadajte jedno z 1%s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Prosím, zadajte buÄ 'y' alebo 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Prosím, zadajte príponu súboru, napr. '.rst' alebo '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Vitajte v nástroji Sphinx %s quickstart."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Zvolená cesta koreňa: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Zadajte cestu koreňa tejto dokumentácie."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Cesta koreňa dokumentácie"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Chyba: nájdený existujúci conf.py v zadanej ceste koreňa."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart neprepíše existujúce projekty Sphinx."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Prosím, zadajte novú cestu koreňa (alebo len Enter na skonÄenie)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Sú dve možnosti umiestnenia adresára zostavenia s výstupom Sphinx.\nMôžete použiÅ¥ buÄ adresár „_build†v koreni alebo môžete maÅ¥ oddelené\nadresáre „source†a „build†v ceste koreňa."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Oddeliť zdrojový a výstupný adresár (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "V koreňovom adresári budú vytvorená dva ÄalÅ¡ie adresáre; \"_templates\"\npre vlastné Å¡ablóny HTML a \"_static\" pre vlastné CSS a iné statické súbory\nMôžete zadaÅ¥ inú predponu (napr. „.â€), ktorá nahradí podÄiarkovník."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Predpona mena adresárov templates a static"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "Meno projektu bude na viacerých miestach zostavenej dokumentácie."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Názov projektu"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Meno(á) autora(ov)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx má predstavu o \"version\" a \"release\" softvéru. Každá\nverzia môže maÅ¥ viacero vydaní. Napríklad, pre Python je verzia\nnieÄo ako 2.5 alebo 3.0, zatiaľÄo vydanie je nieÄo ako 2.5.1\nalebo 3.0a1. Ak nepotrebuje dvojitú Å¡truktúru, jednoducho nastavte\noboje na rovnakú hodnotu."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Verzia projektu"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Vydanie projektu"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "Ak má byť dokumentácia písaná v inom ako Anglickom jazyku,\nmôžete tu zvoliť jazyk pomocou jeho kódu. Sphinx bude potom\nprekladať text, ktorý generuje, do tohoto jazyka.\n\nZoznam podporovaných jazykov nájdete na\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Jazyk projektu"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "Prípona mena zdrojových súborov. ZvyÄajne to je buÄ â€ž.txtâ€\nalebo „.rstâ€. Len súbory s touto príponou sú považované za dokumenty."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Prípona zdrojových súborov"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "Jeden dokument je Å¡peciálny v tom, že je považovaný za vrcholový uzol\n„stromu obsahuâ€, Äiže je to koreň hierarchickej Å¡truktúry dokumentov.\nBežne to je „indexâ€, ale ak je Váš „index†vlastnou Å¡ablónou, môžete\npoužiÅ¥ aj iné meno súboru."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Meno hlavného dokumentu (bez prípony)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Chyba: nájdený existujúci hlavný súbor %s v zadanej ceste koreňa."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart neprepíše existujúci súbor."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Prosím, zadajte nové meno súboru alebo premenujte existujúci súbor a stlaÄte Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Informuje, ktoré z nasledujúcich rozšírení Sphinx majú byť zapnuté:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Pozor: imgmath a mathjax nemožno zapnúť naraz. výber imgmath bol zrušený."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Súbory Makefile a príkazový súbor Windows môže byÅ¥ pre Vás vygenerovaný\ntakže staÄí spustiÅ¥ napr. len `make html' namiesto priameho spúšťania sphinx-build."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Vytvoriť Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Vytvoriť príkazový súbor Windows? (y/n) "
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Vytváranie súboru %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Súbor %s už existuje, preskoÄené."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "DokonÄené: PoÄiatoÄná Å¡truktúra adresára bola vytvorená."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Teraz môže vyplniť svoj hlavný súbor %s a vytvoriť ostatné zdrojové súbory\ndokumentácie. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Na zostavenie dokumentácie použite Makefile, napr.:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Na zostavenie dokumentácie použite príkaz sphinx-build, napr.:\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "kde „builder†je jeden z podporovaných formátov, napr. html, latex alebo linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nGenereuje požadované súbory projektu Sphinx.\n\nsphinx-quickstart je interaktívny nástroj, ktorý kladie niekoľko otázok o Vašom\nprojekte a potom generuje kompletný adresár dokumentácie a vzorový\nMakefile, na použitie so sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "tichý režim"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "koreň projektu"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Voľby štruktúry"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "ak je zadané, oddeliť zdrojový a výstupný adresár"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "ak je zadané, vytvoriť výstupný adresár v zdrojovom"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "náhrada za bodku v _templates apod."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Základné voľby projektu"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "názov projektu"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "mená autorov"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "verzia projektu"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "vydanie projektu"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "jazyk dokumentácie"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "prípona zdrojových súborov"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "meno hlavného dokumentu"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "použiť epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Voľby rozšírenia"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "zapnúť rozšírenie %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "zapnúť konkrétne rozšírenia"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Vytvorenie Makefile a Batchfile"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "vytvoriť makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "nevytvoriť makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "vytvoriť batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "nevytvoriť batchfile"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "použiť režim make pre Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "nepoužiť režim make pre Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Šablóny projektu"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "adresár šablóny pre súbory šablóny"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "definovať premennú šablóny"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "bolo zadané „quietâ€, ale nebol zadaný „project†alebo „authorâ€."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Chyba: zadaná cesta nie je adresár alebo súbory sphinx už existujú."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart generuje len do prázdneho adresára. Prosím, zadajte novú cestu koreňa."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Neplatná premenná šablóny: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Neplatný popis: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "Å¡pecifikácia Äísla riadku je mimo rozsahu (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Nemožno použiÅ¥ obe voľby „%s†a „%sâ€"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Súbor na vloženie %r nebol nájdený alebo zlyhalo jeho Äítanie"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Kódovanie %r použité pri Äítaní vloženého súboru %r vyzerá ako zlé, skúste zadaÅ¥ voľbu :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Objekt s menom %r nebol nájdený vo vloženom súbore %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Nemožno použiÅ¥ „lineno-match†s rozdelenou množinou „linesâ€"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Riadok %r: žiadne riadky z vloženého súboru %r"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "strom obsahu obsahuje odkaz na vylúÄený dokument %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "strom obsahu obsahuje odkaz na neexistujúci dokument %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor sekcie:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor modulu:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor kódu:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "voľba \":file:\" direktívy csv-table teraz rozpoznáva absolútnu cestu ako relatívnu k zdrojovému adresáru. Prosím, aktualizujte svoj dokument."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "Duplicitná deklarácia C, definovaná aj v %s:%s.\nDeklarácia je '.. c:%s:: %s'."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametre"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Vracia"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Návratový typ"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "Älen"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "premenná"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkcia"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerátor"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "typ"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "parameter funkcie"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nové vo verzii %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Zmenené vo verzii %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastarané od verzie %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "duplicitná citácia %s, Äalší výskyt v %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Citácia [%s] nie je odkazovaná."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "Duplicitná deklarácia C++, definovaná aj v %s:%s.\nDeklarácia je '.. cpp:%s:: %s'."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parametre šablóny"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Vyvoláva"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "trieda"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "koncept"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "parameter šablóny"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (zabudovaná funkcia)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metóda %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (trieda)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (globálna premenná alebo konštanta)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atribút %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumenty"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metóda"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dáta"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribút"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "duplicitný %s popis %s, Äalší výskyt%s v %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "duplicitná menovka vzorca %s, Äalší výskyt v %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "neplatný math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Premenné"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Vyzdvihuje"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v module %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (v module %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (zabudovaná premenná)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (zabudovaná trieda)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (trieda v %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (metóda triedy %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (statická metóda %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (vlastnosť %s)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Index modulov Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduly"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Zastarané"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "výnimka"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "metóda triedy"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statická metóda"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "vlastnosť"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "nájdený viac ako jeden cieľ krížového odkazu %r: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (zastarané)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktíva)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr "%s (voľba direktívy)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rola)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktíva"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rola"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "duplicitný popis %s %s, Äalší výskyt v %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "premenná prostredia; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Nesprávny popis voľby %r, má vyzeraÅ¥ ako „optâ€, „-opt argumentyâ€, „--opt argumentyâ€, „/opt argumenty†alebo „+opt argumentyâ€"
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s voľba príkazového riadka"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "voľba príkazového riadka"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "položke glosára musí predchádzať prázdny riadok"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "položky glosára nesmú byť oddelené prázdnymi riadkami"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "glosár vyzerá byť zle naformátovaný, skontrolujte odsadenie"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "termín glosára"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "jazykový token"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "menovka odkazu"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "premenná prostredia"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "voľba programu"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "dokument"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Index modulov"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Stránka hľadania"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "duplicitná menovka %s, Äalší výskyt v %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "duplicitný %s popis %s, Äalší výskyt v %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig je vypnutý, :numref: je ignorované."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "Zlyhalo vytvorenie krížového odkazu. Nie je priradené žiadne Äíslo: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "odkaz nemá popisok: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "neplatný numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "neplatný numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "nová konfigurácia"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "zmenená konfigurácia"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "zmenené rozšírenie"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "prostredie zostavenia nie je aktuálne"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "zdrojový adresár zmenený"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Toto prostredie nie je kompatibilné zo zvoleným zostavovaÄom, prosím, zvoľte iný adresár doctree."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "Zlyhalo skenovanie dokumentov v %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Doména %r nie je zaregistrovaná"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "dokument nie je zahrnutý v žiadnom strome obsahu"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "nájdený na seba odkazujúci strom obsahu. Ignorované."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "viÄ %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "viÄ aj %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "neznámy typ položky indexu %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Symboly"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "zistený cirkulárny odkaz stromu obsahu, ignorované: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "strom obsahu obsahuje odkaz na dokument %r, ktorý nemá názov, odkaz nebude generovaný"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "súbor obrázku nemožno ÄítaÅ¥: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr " Súbor obrázku %s nemožno ÄítaÅ¥: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "súbor na stiahnutie nemožno ÄítaÅ¥: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s už je priradené Äíslo sekcie (vnorený Äíslovaný strom obsahu?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "cesta k dokumentovanému modulu"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "adresár umiestnenia výstupu"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "maximálna hĺbka submodulov, ktorá má byť zobrazená v obsahu (predvolene: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "prepísať existujúce súbory"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "nasledovať symbolické odkazy. Vhodné v kombinácii s collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "spustí skript bez vytvorenia súborov"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "umiestniť dokumentáciu každého modulu vo vlastnej stránke"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "zahrnúť â€_súkromné†moduly"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "meno súboru obsahu (predvolene: modules)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "nevytvárať súbor obsahu"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "vložiť dokumentáciu modulu pred dokumentáciou submodulu"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "interpretovať cesty modulov v zmysle implicitnej špecifikácie menných priestorov PEP-0420"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "prípona súboru (predvolene: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "generovať úplný projekt pomocou sphinx-quickstart"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "pripojiť module_path do sys.path, použité pri --full"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "meno projektu (predvolene: meno koreňového modulu)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "autor(i) projektu, použité pri --full"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "verzia projektu, použité pri --full"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "vydanie projektu, použité pri --full, predvolene --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "voľby rozšírenia"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s nie je adresár."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "neplatný regulárny výraz %r v %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "neplatný regulárny výraz %r v coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "nedokumentované API C: %s [%s] v súbore %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "modul %s nemožno importovať: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "nedokumentovaná funkcia Python: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "nedokumentovaná trieda Python: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "nedokumentovaná metóda Python: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "chýbajúce „+†alebo „-†vo voľbe „%sâ€."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' nie je platná voľba."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "„%s†nie je platná voľba pyversion"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "neplatný typ TestCode"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Direktíva graphviz nemôže mať naraz argumenty content a filename"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "Externý súbor Graphviz %r nebol nájdený alebo zlyhalo jeho Äítanie"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Ignorovaná direktíva „graphviz†bez obsahu."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "príkaz dot %r nemožno spustiť (nutný kvôli výstupu graphviz), skontrolujte nastavenie graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot skonÄil chybou:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot nevytvoril výstupný súbor:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format musí byÅ¥ „png†alebo „svgâ€, ale je %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "kód dot %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[graf: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[graf]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "convert skonÄil chybou:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "príkaz convert %r nemožno spustiť, skontrolujte nastavenie image_converter"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "Nemožno spustiť príkaz LaTeX %r (potrebný na zobrazenie math), skontrolujte nastavenia imgmath_latex"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "zobrazený latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "vnorený latex %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "inventár intersphinx bol presunutý: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "naÄítanie inventára intersphinx z %s..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "nastali problémy s niektorými inventármi, ale boli nájdené funkÄné alternatívy:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "nemožno získať žiadne inventáre kvôli týmto problémom:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(v %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(v %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "identifikátor intersphinx %rnie je raťzec, ignorované"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "Zlyhalo Äítanie intersphinx_mapping[%s], ignorované: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[zdroj]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "ToDo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "Nájdená položka TODO: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<pôvodná položka>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> je umiestnená v %s, riadok %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "pôvodná položka"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "zvýrazňovanie syntaxe kódu modulu... "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumenty]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Kód modulu"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Zdrojový kód %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Prehľad: kód modulu"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Všetky moduly, pre ktoré je dostupný kód</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "chyba formátovania argumentov %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "„::†v automodule nedáva zmysel"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ má byť zoznam reťazcov, nie %r (v module %s) -- ignorované __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "chýbajúci atribút spomenutý vo voľbe :members: : modul %s, atribút %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Základ: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "chýba atribút %s objektu %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "alias pre %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "alias pre TypeVar(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "Neplatné __slots__ nájdené v %s. Ignorované."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "Zlyhalo spracovanie predvolenej hodnoty argumentu %r: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "Autosummary s popiskom vyžaduje voľbu :toctree: , ignorované."
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "zlyhalo spracovanie mena %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "zlyhal import objektu %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: súbor nenájdený: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary interne generuje súbory .rst. Ale Váš source_suffix neobsahuje .rst. PreskoÄené."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "adresár umiestnenia výstupu"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "predvolená prípona súboru (predvolene: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "vlastný adresár šablón (predvolene: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "dokumentovaÅ¥ importovaných Älenov (predvolene: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argumenty kľúÄových slov"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Príklad"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Príklady"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Poznámky"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Ostatné parametre"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Varovania"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "neplatná hodnota množiny (chýba koncová zátvorka): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "neplatná hodnota množiny (chýba zaÄiatoÄná zátvorka): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "neplatná textová konštanta (chýba koncová úvodzovka): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "neplatná textová konÅ¡tanta (chýba zaÄiatoÄná úvodzovka): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Výstraha"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Upozornenie"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "NebezpeÄné"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Chyba"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Rada"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Dôležité"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Poznámka"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "ViÄ aj"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tip"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Varovanie"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "pokraÄovanie z predoÅ¡lej strany"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "pokraÄuje na ÄalÅ¡ej strane"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Čísla"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "strana"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Obsah"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Hľadať"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "OK"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Zobraziť zdroj"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Prehľad"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Vitajte! Toto je"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentácia"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "posledná aktualizácia"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Indexy a tabuľky"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Celkový obsah"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "zoznam všetkých sekcií a podsekcií"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "hľadať v tejto dokumentácii"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Celkový index modulov"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "rýchly prístup ku všetkým modulom"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "všetky funkcie, triedy, termíny"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Celý index na jednej strane"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indexové stránky po písmenách"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "môže byť rozsiahle"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigácia"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Hľadať v %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "O dokumentácii"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Autorské právo"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Naposledy aktualizované %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "Vytvorené pomocou <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Hľadať v %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Predošlá téma"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "predošlá kapitola"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Ďalšia téma"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "ÄalÅ¡ia kapitola"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Prosím, na zapnutie funkcie hľadania,aktivujte\nJavaScript ."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Hľadanie viacerých slov vracia len zhody, ktoré obsahujú\n všetky slová."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "hľadať"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Výsledky hľadania"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Vášmu hľadaniu nezodpovedá žiadny dokument. Prosím, skontrolujte, že všetky zadané slová sú správne napísané a že ste zvolili vhodné kategórie."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Rýchle hľadanie"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Táto stránka"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Zmeny vo verzii %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Automaticky generovaný zoznam zmien vo verzii %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Zmeny knižnice"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Zmeny API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostatné zmeny"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Hľadanie"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Príprava hľadania..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", v "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Skryť výsledky hľadania"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "ZbaliÅ¥ boÄný panel"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "RozbaliÅ¥ boÄný panel"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Obsah"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Poznámka pod Äiarou [%s] nie je odkazovaná."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Poznámka pod Äiarou [#] nie je odkazovaná."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "viac ako jeden cieľ krížového odkazu %r: môže byť %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r cieľ odkazu nenájdený: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "Nemožno získať vzdialený obrázok: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "Nemožno získať vzdialený obrázok: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Neznámy formát obrázku: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "nedekódovateľné zdrojové znaky, nahradené „?â€: %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "preskoÄené"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "zlyhalo"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "neznáma direktíva alebo meno role: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "neznámy typ uzla: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "chyba Äítania: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "chyba zápisu: %s: %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Neplatný formát dátumu. Použije jednoduché úvodzovky, ak ho chcete priamo vo výstupe: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "strom obsahu obsahuje neexistujúci súbor %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "predvolená rola %s nenájdená"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "nie je definovaný numfig_format pre %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Žiadne ID nie je priradené uzlu %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "Nemožno získať veľkosť obrázku. voľba :scale: je ignorovaná."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr "príliš veľké :maxdepth:, ignorované."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "názov dokumentu nie je jeden uzol Text"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Poznámky pod Äiarou"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "sú zadané obe, tabularcolumns aj voľba :widths:. :widths: je ignorované."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[obrázok: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[obrázok]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "titulok nie je vo vnútri figure."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "neimplementovaný typ uzla: %r"
diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.js b/sphinx/locale/sl/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..b342c07
--- /dev/null
+++ b/sphinx/locale/sl/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "sl",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "O dokumentih",
+ "Automatically generated list of changes in version %(version)s": "Avtomatsko generiran seznam sprememb v verziji %(version)s",
+ "C API changes": "C API spremembe",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "Popoln Seznam Vsebine",
+ "Contents": "",
+ "Copyright": "Vse pravice pridr\u017eane",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "Poln indeks na eni strani",
+ "General Index": "Splo\u0161ni abecedni seznam",
+ "Global Module Index": "Splo\u0161en seznam modulov",
+ "Go": "Potrdi",
+ "Hide Search Matches": "Skrij resultate iskanja",
+ "Index": "Abecedni seznam",
+ "Index &ndash; %(key)s": "Seznam &ndash; %(key)s",
+ "Index pages by letter": "Indeksiraj strani po \u010drki",
+ "Indices and tables:": "Kazalo in seznami:",
+ "Last updated on %(last_updated)s.": "Zadnji\u010d posodobljeno %(last_updated)s.",
+ "Library changes": "Spremembe knji\u017enice",
+ "Navigation": "Navigacija",
+ "Next topic": "Naslednja tema",
+ "Other changes": "Ostale spremembe",
+ "Overview": "Pregled",
+ "Please activate JavaScript to enable the search\n functionality.": "Za pravilno delovanje Iskanja morete vklopiti\n JavaScript.",
+ "Preparing search...": "",
+ "Previous topic": "Prej\u0161nja tema",
+ "Quick search": "Hitro iskanje",
+ "Search": "I\u0161\u010di",
+ "Search Page": "Iskalnik",
+ "Search Results": "Rezultati Iskanja",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "I\u0161\u010di med %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Prika\u017ei izvorno kodo",
+ "Table of Contents": "",
+ "This Page": "Trenutna stran",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "vse funkcije, razredi, izrazi",
+ "can be huge": "lahko je veliko",
+ "last updated": "",
+ "lists all sections and subsections": "prikazi vse sekcije in podsekcije",
+ "next chapter": "naslednje poglavje",
+ "previous chapter": "prej\u0161nje poglavje",
+ "quick access to all modules": "hiter dostop do vseh modulov",
+ "search": "i\u0161\u010di",
+ "search this documentation": "i\u0161\u010di po dokumentaciji",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/sl/LC_MESSAGES/sphinx.mo b/sphinx/locale/sl/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..99459e2
--- /dev/null
+++ 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
new file mode 100644
index 0000000..f4f51da
--- /dev/null
+++ b/sphinx/locale/sl/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Slovenian (http://app.transifex.com/sphinx-doc/sphinx-1/language/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Vgrajeni deli"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Nivo modula"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (v "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Splošni abecedni seznam"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "abecedni seznam"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "naprej"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "nazaj"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Abecedni seznam"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Izdaja"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Avtor sekcije: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Avtor modula: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Avtor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametri"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Vrne"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Vrne tip"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "Älan"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funkcija"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "tip"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Novo v verziji %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Spremenjeno v verziji %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Zastarelo od verzije %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "razred"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (vgrajene funkcije)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metoda)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (razred)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s atribut)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Sproži izjemo"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (v modulu %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (v modulu %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (vgrajene spremenljivke)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (vgrajen razred)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (razred v %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statiÄna metoda)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "Moduli"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Zastarelo"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "izjema"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statiÄna metoda"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (zastarelo)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "okoljska spremenljivka; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "okoljska spremenljivka"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Seznam modulov"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Iskalnik"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Pozor"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Previdno"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Nevarno"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Napaka"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Pomembno"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Opomba"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Poglej Tudi"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Nasvet"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Opozorilo"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "nadaljevanje iz prejšnje strani"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "IÅ¡Äi"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Potrdi"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Prikaži izvorno kodo"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Pregled"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Kazalo in seznami:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Popoln Seznam Vsebine"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "prikazi vse sekcije in podsekcije"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "iÅ¡Äi po dokumentaciji"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Splošen seznam modulov"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "hiter dostop do vseh modulov"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "vse funkcije, razredi, izrazi"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Seznam &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Poln indeks na eni strani"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Indeksiraj strani po Ärki"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "lahko je veliko"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "IÅ¡Äi med %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "O dokumentih"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Vse pravice pridržane"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "ZadnjiÄ posodobljeno %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "IÅ¡Äi %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Prejšnja tema"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "prejšnje poglavje"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Naslednja tema"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "naslednje poglavje"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Za pravilno delovanje Iskanja morete vklopiti\n JavaScript."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "iÅ¡Äi"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Rezultati Iskanja"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Hitro iskanje"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Trenutna stran"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Avtomatsko generiran seznam sprememb v verziji %(version)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Spremembe knjižnice"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API spremembe"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ostale spremembe"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Skrij resultate iskanja"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Opombe"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[slika]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/sphinx.pot b/sphinx/locale/sphinx.pot
new file mode 100644
index 0000000..1e02038
--- /dev/null
+++ b/sphinx/locale/sphinx.pot
@@ -0,0 +1,3714 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx 7.2.2\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\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 2.12.1\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with"
+" this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called "
+"sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but "
+"`{current}` is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it"
+" should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid "file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid ""
+"conf value \"epub_language\" (or \"language\") should not be empty for "
+"EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid ""
+"conf value \"epub_title\" (or \"html_title\") should not be empty for "
+"EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid ""
+"conf value \"epub_copyright\" (or \"copyright\")should not be empty for "
+"EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the"
+" index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all"
+" config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected "
+"in configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue "
+"to the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and "
+"places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template "
+"files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults "
+"to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for "
+"selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\""
+" will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you "
+"separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; "
+"\"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and "
+"other static\n"
+"files. You can enter another prefix (such as \".\") to replace the "
+"underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid "The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-"
+"language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root "
+"path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid "Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has"
+" been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that "
+"you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other "
+"documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about "
+"your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid ""
+"\"quiet\" is specified, but any of \"project\" or \"author\" is not "
+"specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid "Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a "
+"new root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try "
+"giving an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path"
+" as a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: "
+"for one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\","
+" \"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose"
+" another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no "
+"link will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and "
+"create\n"
+"one reST file with automodule directives per package in the "
+"<OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be"
+"\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid "fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid "====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid "hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' "
+"requires ImageMagick by default. Ensure it is installed, or set the "
+"'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the "
+"imgmath_%s setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had "
+"working alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following "
+"exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid "missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does "
+"not contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following "
+"exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It "
+"generates\n"
+"the reStructuredText files from the autosummary directives contained in "
+"the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid "Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid "4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated:"
+" {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a"
+" bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role "
+"is not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to "
+"output it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' "
+"instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid "encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid "both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
+
diff --git a/sphinx/locale/sq/LC_MESSAGES/sphinx.js b/sphinx/locale/sq/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..4fb03bc
--- /dev/null
+++ b/sphinx/locale/sq/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "sq",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", n\u00eb ",
+ "About these documents": "Mbi k\u00ebto dokumente",
+ "Automatically generated list of changes in version %(version)s": "List\u00eb ndryshime n\u00eb versionin %(version)s e prodhuar automatikisht",
+ "C API changes": "Ndryshime API C",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "Ndryshe n\u00eb Versionin %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "Tkurre an\u00ebshtyll\u00ebn",
+ "Complete Table of Contents": "Tryez\u00eb e Plot\u00eb e L\u00ebnd\u00ebs",
+ "Contents": "L\u00ebnd\u00eb",
+ "Copyright": "T\u00eb drejta kopjimi",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "Krijuar duke p\u00ebrdorur <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.",
+ "Expand sidebar": "Zgjeroje an\u00ebshtyll\u00ebn",
+ "Full index on one page": "Tregues i plot\u00eb n\u00eb nj\u00eb faqe",
+ "General Index": "Tregues i P\u00ebrgjithsh\u00ebm",
+ "Global Module Index": "Tregues Global Modulesh",
+ "Go": "Shko",
+ "Hide Search Matches": "Fshih P\u00ebrputhje K\u00ebrkimi",
+ "Index": "Tregues",
+ "Index &ndash; %(key)s": "Tregues &ndash; %(key)s",
+ "Index pages by letter": "Faqe treguesi sipas shkronjash",
+ "Indices and tables:": "Tregues dhe tabela:",
+ "Last updated on %(last_updated)s.": "P\u00ebrdit\u00ebsuar s\u00eb fundi m\u00eb %(last_updated)s.",
+ "Library changes": "Ndryshime librarie",
+ "Navigation": "L\u00ebvizje",
+ "Next topic": "Subjekti pasues",
+ "Other changes": "Ndryshime t\u00eb tjera",
+ "Overview": "P\u00ebrmbledhje",
+ "Please activate JavaScript to enable the search\n functionality.": "Q\u00eb t\u00eb aktivizohet funksioni i k\u00ebrkimit, ju lutemi, aktivizoni\n JavaScript-in.",
+ "Preparing search...": "Po p\u00ebrgatitet k\u00ebrkim...",
+ "Previous topic": "Subjekti i m\u00ebparsh\u00ebm",
+ "Quick search": "K\u00ebrkim i shpejt\u00eb",
+ "Search": "K\u0113rko",
+ "Search Page": "Faqe K\u00ebrkimesh",
+ "Search Results": "P\u00ebrfundime K\u00ebrkimi",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "K\u00ebrkimi p\u00ebrfundoi, u gjet\u00ebn ${resultCount} faqe me p\u00ebrputhje me vargun e k\u00ebrkimit.",
+ "Search within %(docstitle)s": "K\u00ebrkoni brenda %(docstitle)s",
+ "Searching": "K\u00ebrkim",
+ "Searching for multiple words only shows matches that contain\n all words.": "K\u00ebrkimi p\u00ebr disa fjal\u00eb nj\u00ebher\u00ebsh shfaq vet\u00ebm p\u00ebrputhje q\u00eb\n p\u00ebrmbajn\u00eb krejt fjal\u00ebt.",
+ "Show Source": "Shfaq Burimin",
+ "Table of Contents": "Tryeza e L\u00ebnd\u00ebs",
+ "This Page": "Kjo Faqe",
+ "Welcome! This is": "Mir\u00eb se vini! Ky \u00ebsht\u00eb",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "K\u00ebrkimi juaj s\u2019gjeti p\u00ebrputhje me ndonj\u00eb dokument. Ju lutemi, sigurohuni se jan\u00eb shkruar sakt\u00eb krejt fjal\u00ebt dhe se keni p\u00ebrzgjedhur aq kategori sa duhen.",
+ "all functions, classes, terms": "krejt funksionet, klasat, termat",
+ "can be huge": "mund t\u00eb jet\u00eb i st\u00ebrmadh",
+ "last updated": "p\u00ebrdit\u00ebsuar s\u00eb fundi m\u00eb",
+ "lists all sections and subsections": "paraqet krejt ndarjet dhe n\u00ebnndarjet",
+ "next chapter": "kapitulli pasues",
+ "previous chapter": "kapitulli i m\u00ebparsh\u00ebm",
+ "quick access to all modules": "hyrje e shpejt\u00eb te krejt modulet",
+ "search": "k\u00ebrko",
+ "search this documentation": "k\u00ebrkoni te ky dokumentim",
+ "the documentation for": "dokumentimi p\u00ebr"
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/sq/LC_MESSAGES/sphinx.mo b/sphinx/locale/sq/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..d211329
--- /dev/null
+++ b/sphinx/locale/sq/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/sq/LC_MESSAGES/sphinx.po b/sphinx/locale/sq/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..318011a
--- /dev/null
+++ b/sphinx/locale/sq/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Besnik Bleta <besnik@programeshqip.org>, 2021-2023
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Besnik Bleta <besnik@programeshqip.org>, 2021-2023\n"
+"Language-Team: Albanian (http://app.transifex.com/sphinx-doc/sphinx-1/language/sq/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: sq\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "S’gjendet dot drejtori burim (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "Drejtoria e përfundimeve (%s) s’është drejtori"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Drejtoria burim dhe drejtoria vendmbërritje s’mund të jenë identike"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Po xhirohet Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Ky projekt lyp të paktën Sphinx v%s, ndaj s’mund të montohet me këtë version."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "po krijohet drejtori përfundimesh"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "teksa ujdiset zgjerimi %s:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "'setup' siç është përcaktuar aktualisht te conf.py s’është funksion Python që mund të thirret. Ju lutemi, ndryshojeni përcaktimin e tij që ta bëni një funksion që mund të thirret. Kjo është e nevojshme që conf.py të sillet si një zgjerim Sphinx."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "po ngarkohen përkthime [%s]… "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "u bë"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "s’është i passhëm për mesazhe të brendshëm"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "dështoi: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "S’u përzgjodh montues, po përdoret parazgjedhja: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "doli me sukses"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "u përfundua me probleme"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "montimi %s, % sinjalizim (me sinjalizime të trajtuara si gabime)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "montimi %s, %s sinjalizime (me sinjalizime të trajtuara si gabime)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "build %s, %s warning."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "montimi %s, %s sinjalizime."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "montimi %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "klasa %r e nyjeve është e regjistruar tashmë, vizitorët e saj do të anashkalohen"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "direktiva %r është e regjistruar tashmë, do të anashkalohet"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "roli %r është e regjistruar tashmë, do të anashkalohet"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "zgjerimi %s nuk deklaron nëse është i parrezik për lexim paralel, po merret se s’është - ju lutemi, kërkojini autorin të zgjerimit ta kontrollojë dhe ta bëjë këtë shprehimisht"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "zgjerimi %s s’është i sigurt për lexim paralel"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "zgjerimi %s nuk deklaron nëse është i parrezik për shkrim paralel, po merret se s’është - ju lutemi, kërkojini autorin të zgjerimit ta kontrollojë dhe ta bëjë këtë shprehimisht"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "zgjerimi %s s’është i sigurt për shkrim paralel"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "drejtoria e formësimeve nuk përmban një kartelë conf.py (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "U gjet vlerë e pavlefshme formësimi: 'language = Asnjë'. Përditësojeni formësimin tuaj me një kod të vlefshëm gjuhe. Përkohësisht po përdoret 'en' (anglisht)."
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "s’mund të anashkalohet rregullim formësimi fjalorthi %r, po shpërfillet (për të ujdisur elemente individuale, përdorni %r)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "numër %r i pavlefshëm për vlerë formësimi %r, po shpërfillet"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "s’mund të anashkalohet rregullim formësimi %r me një lloj të pambuluar, po shpërfillet"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "vlerë e panjohur formësimi %r te anashkalimi, po shpërfillet"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "S’ka vlerë të tillë formësimi: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Vlerë formësimi %r e pranishme tashmë"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Ka një gabim sintakse te kartela juaj e formësimit: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Kartela e formësimit (ose një nga modulet që ajo importon) thirri sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Ka një gabim të programueshëm te kartela juaj e formësimit:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "Vlera e formësimit `source_suffix' pret një varg, një listë vargjesh, ose një fjalor. Por është dhënë `%r'."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Ndarja %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Figura %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tabela %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "Vlera e formësimit `{name}` duhet të jetë një nga {candidates}, por është dhënë `{current}`."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "Vlera e formësimit `{name}' është e llojit `{current.__name__}'; pritej {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "Vlera e formësimit `{name}' është e llojit `{current.__name__}', si parazgjedhje merr `{default.__name__}'."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "s’u gjet primary_domain %r, po shpërfillet."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "Që prej v2.0, Sphinx përdor \"index\" për root_doc, si parazgjedhje. Ju lutemi, shtoni \"root_doc = 'contents'\" te conf.py juaj."
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Vlerë formësimi %r e pranishme tashmë"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Emër i panjohur akti: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "Trajtuesi %r për aktin %r u përgjigj me një përjashtim"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "Zgjerimi %s është i domosdoshëm për needs_extensions settings, por s’është ngarkuar."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Ky projekt lyp zgjerimin %s të paktën nën versionin %s dhe prandaj s’mund të montohet me versionin e ngarkuar (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "u gjetën shumë kartela për dokumentin \"%s\": %r\nPërdorni %r për montimin."
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr "U shpërfill dokument i palexueshëm %r."
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Klasa %s e montuesit nuk ka atribut \"name\""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Montuesi %r ekziston tashmë (te moduli %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Emër %s montuesi jo i regjistruar ose i passhëm përmes pike hyrjeje"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Emër montuesi %s jo i regjistruar"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "përkatësi %s e regjistruar tashmë"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "përkatësi %s ende e paregjistruar"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "Direktiva %r është e regjistruar tashmë te përkatësia %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "Roli %r është i regjistruar tashmë te përkatësia %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "Treguesi %r është i regjistruar tashmë te përkatësia %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "object_type %r është i regjistruar tashmë"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "crossref_type %r është i regjistruar tashmë"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r është i regjistruar tashmë"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "source_parser për %r është i regjistruar tashmë"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "Përtypës burimesh për %s jo i regjistruar"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Përkthyesi për %r ekziston tashmë"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "kwargs për add_node() duhet të jetë një çift funksioni (visit, depart): %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r tashmë i regjistruar"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "vizatuesi i formulave matematikore %s është i regjistruar tashmë"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "zgjerimi %r qe shkrirë me Sphinx-in që me versionin %s; ky zgjerim është shpërfillur."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Përjashtimi origjinal:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "S’u importua dot zgjerimi %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "zgjerimi %r s’ka funksion setup(); a është vërtet një modul zgjerimi Sphinx-i?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Zgjerimi %s i përdorur nga ky projekt lyp të paktën Sphinx v%s; prandaj s’mund të montohet me këtë version."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "zgjerimi %r u përgjigj me një objekt të pambuluar prej funksionit të vet setup(); duhet të përgjigjet me Asnjë ose një fjalorth tejtëdhënash"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "numër PEP i pavlefshëm %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "numër RFC i pavlefshëm %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "tema %r s’ka rregullimin \"theme\""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "tema %r s’ka rregullimin \"inherit\""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "s’u gjet temë e emërtuar %r, u trashëgua nga %r"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "rregullimi %s.%s nuk haset në asnjë prej formësimeve temash ku u kërkua"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "është dhënë mundësi teme %r e pambuluar"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "kartela %r te shteg teme s’është kartelë zip e vlefshme ose nuk përmban temë"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "s’u gjet temë e emërtuar %r (mos mungon theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "s’u gjet figurë e përshtatshme për montuesin %s: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "s’u gjet figurë e përshtatshme për montuesin %s: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "po montohet [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "po shkruhet përfundim… "
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "krejt kartelat po %d"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "objektiva për kartela po %d që janë specifikuar"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "objektiva për kartela po %d që janë të papërditësuara"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "krejt kartelat burim"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "kartela %r, dhënë te rreshti i urdhrave, nuk ekziston, "
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "kartela %r e dhënë te rresht urdhrash s’gjendet te drejtori burim, po shpërfillet"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "kartela %r, dhënë te rreshti i urdhrave, s’është dokument i vlefshëm, po shpërfillet"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "kartela burim %d dhënë te rresht urdhrash"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "objektiva për kartela burim %d që janë të papërditësuara"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "po montohet [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "po shihet për kartela të sapovjetruara… "
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "U gjet %d"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "s’u gjet gjë"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "po kontrollohet njëtrajtshmëria"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "s’ka objektiva të vjetruar."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "po përditësohet mjedisi: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s të shtuar, %s të ndryshuar, %s të hequr"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "po lexohen burime… "
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "emra dokumentesh për shkrim: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "po përgatiten dokumente"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "u gjet zë TeL i përsëdytur: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "po kopjohen figura… "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "s’lexohet dot kartelë figure %r: në vend të tij, po kopjohet"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "s’kopjohet dot kartelë figure %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "s’shkruhet dot kartelë figure %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "S’u gjet Pillow - po kopjohen kartela figurë"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "po shkruhet kartelë llojesh MIME…"
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "po shkruhet kartelë META-INF/container.xml…"
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "po shkruhet kartelë content.opf…"
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "lloj MIME i panjohur për %s, po shpërfillet"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "po shkruhet kartelë toc.ncx…"
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "po shkruhet kartelë %s…"
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "Kartela përmbledhje gjendet te %(outdir)s."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "s’ka ndryshime në version %s."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "po shkruhet kartelë përmbledhje…"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Të brendshme"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Shkallë moduli"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "po kopjohen kartela burim…"
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "s’u lexua dot %r për krijim regjistrimi ndryshimesh"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "Montuesi provë nuk prodhon kartela."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "Kartela ePub gjendet te %(outdir)s."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "po shkruhet kartelë nav.xhtml…"
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_language\" (ose \"language\") s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "vlera e formësimit \"epub_uid\" duhet të jetë XML NAME për EPUB3"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_title\" (ose \"html_title\") s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_author\" s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_contributor\" s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_description\" s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_publisher\" s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_copyright\" (ose \"copyright\") s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "vlera e formësimit \"epub_identifier\" s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "vlera e formësimit \"version\" s’duhet të jetë e zbrazët për EPUB3"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "css_file e pavlefshme: %r, u shpërfill"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "Katalogët e mesazheve gjenden te %(outdir)s."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "objektiva për kartela gjedhe %d"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "po lexohen gjedhe… "
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "po shkruhen katalogë mesazhesh… "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Shihni për çfarëdo gabimesh te përfundimi më sipër ose te %(outdir)s/output.txt"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "lidhje e dëmtuar: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "S’u arrit të përpilohet shprehje e rregullt te linkcheck_allowed_redirects: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Faqet e doracakut gjenden në %(outdir)s."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "s’u gjet vlerë formësimi \"man_pages\"; s’do të shkruhet ndonjë faqe doracaku"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "po shkruhet"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "vlera e formësimit \"man_pages\" i referohet një dokumenti të panjohur %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "Faqja HTML gjenden në %(outdir)s."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "po montohet dokument njësh"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "po shkruhen kartela shtesë"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Kartelat Texinfo gjenden në %(outdir)s."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nXhironi 'make' te ajo drejtori, që të xhirohen këto përmes makeinfo-s\n(përdorni këtu 'make info' që kjo të kryhet automatikisht)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "s’u gjet vlerë formësimi \"texinfo_documents\"; s’do të shkruhet ndonjë dokument"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "vlera e formësimit \"texinfo_documents\" i referohet një dokumenti të panjohur %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "po përpunohet %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "po shquhen referencat…"
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (në "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "po kopjohen kartela mbulimi Texinfo"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "gabim në shkrim kartele Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Kartelat tekst gjenden në %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "gabim në shkrim kartele %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "Kartelat XML gjenden në %(outdir)s."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Kartelat pseudo-XML gjenden në %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "kartela e të dhënave të montimit është e dëmtuar: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "Faqet HTML gjenden në %(outdir)s."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "S’u arrit të lexohet kartelë të dhënash montimi: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Tregues i Përgjithshëm"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "tregues"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "pasuesi"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "i mëparshmi"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "po prodhohen tregues"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "po shkruhen faqe shtesë"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "po kopjohen kartela të shkarkueshme… "
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "s’kopjohet dot kartelë e shkarkueshme %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "S’u arrit të kopjohet një kartelë te html_static_file: %s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "po kopjohen kartela statike"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "s’kopjohet dot kartelë statike %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "po kopjohen kartela ekstra"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "s’kopjohet dot kartelë ekstra %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "S’u arrit të shkruhet kartelë të dhënash montimi: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "treguesi i kërkimi s’u ngarkua dot, por jo krejt dokumentet do të montohen: treguesi do të jetë i paplotë."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "faqja %s ka përputhje me dy rregullsi te html_sidebars: %r dhe %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "ndodhi një gabim Unikod, kur vizatohej faqja %s. Ju lutemi, siguroni që krejt vlerat e formësimit që përmbajnë lëndë jo-ASCII të jenë vargje Unikod."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "Ndodhi një gabim gjatë vizatimit të faqes %s.\nArsye: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "po shkruhet lënda e treguesit të kërkimeve në %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "js_file e pavlefshme: %r, u shpërfill"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Janë të regjistruar plot math_renderers. Por s’u përzgjodh math_renderer."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "U dha math_renderer %r i panjohur."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "zëri html_extra_path %r s’ekziston"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "zëri %r i html_extra_path entry është vendosur jashtë outdir-it"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "zëri html_static_path %r s’ekziston"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "zëri %r i html_extra_path entry është vendosur brenda outdir-it"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "kartela stemë %r s’ekziston"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "kartela favikonë %r s’ekziston"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr "HTML 4 s’mbulohet më nga Sphinx-i. (U pikas “html4_writer=True†te mundësi formësimi)"
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Dokumentim i %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "Kartelat LaTeX gjenden në %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nXhironi 'make' te ajo drejtori që të xhirohen këto përmes (pdf)latex\n(që të bëhet kjo automatikisht, përdorni `make latexpdf' këtu)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "s’u gjet vlerë formësimi \"texinfo_documents\"; s’do të shkruhet ndonjë dokument"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "vlera e formësimit \"texinfo_documents\" i referohet një dokumenti të panjohur %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Tregues"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Hedhje Në Qarkullim"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "s’ka mundësi Babel të njohur për gjuhën %r"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "po kopjohen kartela mbulimi TeX"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "po kopjohen kartela mbulimi TeX…"
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "po kopjohen kartela shtesë"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Kyç i panjohur formësimi: latex_elements[%r], u shpërfill."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "Mundësi e panjohur teme: latex_theme_options[%r], u shpërfill."
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r s’ka rregullimin \"theme\""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r s’ka rregullimin \"%s\""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr "S’u arrit të merrej një “docnameâ€!"
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr "S’u arrit të merrej një “docname†për burimin {source!r}!"
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr "S’u gjet poshtëshënim për nyjë reference të dhënë %r"
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "Ndodhi një përjashtim gjatë montimit, po niset diagnostikuesi:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "U ndërpre!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "Gabim markup-i reST:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Gabim kodimi:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "Traceback-u i plotë është ruajtur te %s, nëse doni t’ua raportoni problemin zhvilluesve."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Gabim përsëritje:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "Kjo mund të ndodhë me kartela burim shumë të mëdha ose të futura thellë brenda njëra-tjetrës. Mund të rrisni me kujdes kufirin parazgjedhje për ripërsëritje Python prej 1000, te conf.py, me p.sh.:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Ndodhi një përjashtim:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Ju lutemi, njoftojeni nëse qe një gabim përdoruesi, që kështu herës tjetër të mund të furnizohet një mesazh më i mirë gabimi."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Një njoftim të mete mund të depozitohet te gjurmuesi në <https://github.com/sphinx-doc/sphinx/issues>. Faleminderit!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "numri i aktit duhet të jetë një numër pozitiv"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "Për më tepër hollësi, vizitoni <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\nProdhoni dokumentim nga kartela burim.\n\nsphinx-build prodhon dokumentim prej kartelash te SOURCEDIR dhe e vendos\nte OUTPUTDIR. Kërkon për 'conf.py' te SOURCEDIR për rregullime formësimi.\nMjeti 'sphinx-quickstart' mund të përdoret për të prodhuar kartela gjedhe,\npërfshi 'conf.py'\n\nsphinx-build mund të krijojë dokumentim në formate të ndryshëm. Një format\npërzgjidhet duke specifikuar te rreshti i urdhrave emrin e montuesit; HTML-ja,\nsi parazgjedhje. Montuesit mund të kryejnë gjithashtu veprime të tjera të lidhura\nme përpunim dokumentimi.\n\nSi parazgjedhje, gjithçka që është e papërditësuar, montohet. Nëse doni\nmontim vetëm për kartela të përzgjedhura, kjo mund të bëhet duke\nspecifikuar emra kartelash individuale.\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "shteg për te kartela burimi dokumentimi"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "shteg për te drejtori përfundimesh"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "një listë kartelash specifike për rimontim. E shpërfillur, nëse jepet -a"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "mundësi të përgjithshme"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "montues për t’u përdorur (parazgjedhje: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "shkruaj krejt kartelat (parazgjedhje: shkruaj vetëm kartela të reja dhe ato të ndryshuara)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "mos përdor një mjedis të ruajtur, lexo përherë krejt kartelat"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "shteg për mjedis të ruajtur në fshehtinë dhe kartela doctree (parazgjedhje: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "montoje në paralel me N procese, kur është e mundur (vlera speciale “autoâ€\" do ta vërë N-në sa cpu-count)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "shteg ku gjendet kartelë formësimi (conf.py) (parazgjedhje: i njëjtë me SOURCEDIR)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "mos përdor fare kartelë formësimesh, vetëm mundësitë -D"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "anashkalo një rregullim te kartelë formësimi"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "jep një vlerë te gjedhe HTML"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "përcaktoni etiketë: përfshi blloqe “only†me TAG"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "mënyrë gërricëse, sinjalizo mbi krejt referencat që mungojnë"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "mundësi për ç’prodhon konsola"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "pa output në stdout, thjesht sinjalizime në stderr"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "pa output fare, madje as sinjalizime"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "shkruaj sinjalizime (dhe gabime) te kartela e dhënë"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "shndërroji sinjalizimet në gabime"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "me -W, vazhdo punën, kur merren sinjalizime"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "xhiro Pdb, në rast përjashtimesh"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "s’mund të ndërthuret një mundësi -a dhe emra kartelash"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "s’hapet dot kartelë sinjalizimesh %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "argumenti i mundësisë -D duhet të jetë në formën emër=vlerë"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "argumenti i mundësisë -A duhet të jetë në formën emër=vlerë"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "fut automatikisht docstrings prej modulesh"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "testo automatikisht copëza kodi te blloqe doctest"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "lidhje mes dokumentimi Sphinx projektesh të ndryshëm"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "shkruaj zëra \"todo\" që mund të shfaqen ose fshihen te montimi"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "kontrolle për mbulim dokumentimi"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "përfshi formula matematikore, të vizatuara si figura PNG ose SVG"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "përfshi formula matematikore, të vizatuara te shfletuesi nga MathJax"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "përfshirje e kushtëzuar lënde, bazuar në vlera formësimi"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "përfshi lidhje te kodi burim i objekteve Python të dokumentuara"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "krijo kartelë .nojekyll për të botuar dokumentin në faqe GitHub"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Ju lutemi, jepni një emër shtegu të vlefshëm."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Ju lutemi, jepni ca tekst."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Ju lutemi, jepni një nga %s."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Ju lutemi, jepni 'y' ose 'n'."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Ju lutemi, jepni një prapashtesë kartele, për shembull, '.rst' ose '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Mirë se vini te mjeti për fillim të shpejtë me Sphinx %s."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Ju lutemi, jepni vlera për rregullimet vijuese (thjesht shtypni tastin\nEnter që të pranohet një vlerë parazgjedhje, nëse është një e tillë\nbrenda kllapave)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Shteg rrënjë i përzgjedhur: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Jepni shtegun rrënjë për te dokumenti."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Shteg rrënje për te dokumenti"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Gabim: te shtegu rrënjë i përzgjedhur u gjet një conf.py ekzistues."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart s’do të mbishkruajë projekte ekzistuese Sphinx."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Ju lutemi, jepni një shteg të ri rrënjë (ose thjesht shtypni tastin Enter, që të dilet)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Keni dy mundësi për vendosjen e drejtorisë së montimeve për çka prodhon Sphinx-i.\nPërdorni një drejtori \"_build\" brenda shtegut rrënjë, ose i ndani\ndrejtoritë \"burim\" dhe \"montim\" brenda shtegut rrënjë."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Nda veçmas drejtoritë burim dhe montim (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "Brenda drejtorisë rrënjë do të krijohen dy drejtori të tjera; \"_templates\" për\ngjedhe vetjake HTML, dhe \"_static\" për fletëstile vetjakë dhe kartela të tjera statike.\nMund të krijoni një tjetër parashtesë (bie fjala, \".\") në vend të nënvijës."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Parashtesë emrash për drejtori gjedhesh dhe statikesh"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "Emri i projektit do të shfaqet në disa vende te dokumentimi i montuar."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Emër projekti"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Emër(a) autori(ësh)"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "Sphinx-i përdor nocionet e “versionit†dhe “hedhjes në qarkullim†për\nsoftware-in. Çdo version mund të ketë hedhje të shumta në qarkullim.\nBie fjala, për Python-in versionet ngjajnë me 2.5 ose 3.0, teksa hedhja\nnë qarkullim ngjan me 2.5.1 ose 3.0a1. Nëse kjo strukturë duale s’ju\nhyn në punë, thjesht vëruni të dyjave të njëjtën vlerë."
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Version projekti"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Hedhje në qarkullim e projektit"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "Nëse dokumentet janë shkruan në gjuhë tjetër nga anglishtja,\nmund të përzgjidhni një gjuhë këtu, përmes kodit të asaj gjuhe. Sphinx-i mandej\ndo të përkthejë në atë gjuhë tekstin që prodhon.\n\nPër një listë kodesh të mbuluar, shihni\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Gjuhë projekti"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "Prapashtesa e emrave të kartelave për kartela burim. Zakonisht, kjo\nështë ose \".txt\", ose \".rst\". Vetëm kartelat me këtë prapashtesë\nmerren si dokumente."
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Prapashtesë kartele burim"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "Një dokument është i veçantë, për faktin se konsiderohet si nyja e epërme\ne \"pemës së lëndës\", domethënë, është rrënja e strukturës hierarkike\ntë dokumenteve. Zakonisht, ky është \"index\", por nëse dokumenti juaj \"index\"\nështë një gjedhe vetjake, si të tillë mund të caktoni një tjetër emër kartele."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Emër i dokumentit tuaj kryesor (pa prapashtesë)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Gabim: kartela master %s është gjetur tashmë një herë në shtegun rrënjë të përzgjedhur."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart s’do të mbishkruajë kartelën ekzistuese."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Ju lutemi, jepni një emër të ri kartele, ose riemërtojeni kartelën ekzistuese dhe shtypni tastin Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Përcaktoni se cilët nga zgjerimet vijuese Sphinx duhen aktivizuar:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Shënim: imgmath dhe mathjax s’mund të aktivizohen në të njëjtën kohë. U hoqë përzgjedhja e imgmath-it."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Për ju mund të prodhohen një kartelë makefile dhe një urdhrash Windows, që\nkështu t’ju duhet vetëm të xhironi, për shembull, `make html', në vend se\ntë thirret drejtpërsëdrejti sphinx-build."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Të krijohet Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Të krijohet kartelë urdhrash Windows? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "Po krijohet kartela %s."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "Ka tashmë një kartelë %s, po anashkalohet."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Përfundoi: U krijua një strukturë fillestare drejtorish."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Tani duhet të populloni kartelën tuaj master file %s dhe të krijoni kartela të tjera\nburim të dokumentimit. "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Përdorni Makefile-in që të montohen dokumentet, kështu:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Përodrni urdhrin sphinx-build që të montohen dokumentet, kështu:\n sphinx-build -b montues %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "ku montues është një nga montuesin e mbuluar, p.sh., html, latex ose linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nProdho kartelat e domosdoshme për një projekt Sphinx.\n\nsphinx-quickstart është një mjet ndërveprues që bën disa pyetje rreth projektit\ntuaj dhe mandej prodhon një drejtori të plotë dokumentimi dhe një shembull\nMakefile për t’u përdorur me sphinx-build.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "mënyra pa zhurmë"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "rrënjë e projektit"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Mundësi strukture"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "nëse është kërkuar, nda veçmas drejtoritë burim dhe montim"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "në u përcaktoftë, krijo drejtori montimi nën drejtorinë burim"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "zëvendësim për pikën te _templates, etj."
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Mundësi bazë të projektit"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "emër projekti"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "emra autorësh"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "version i projektit"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "hedhje në qarkullim e projektit"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "gjuhë dokumenti"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "prapashtesë kartele burim"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "emër dokumenti bazë"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "përdor epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Mundësi zgjerimi"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "aktivizo zgjerimin %s"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "aktivizo zgjerime arbitrare"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Krijim makefile-i dhe batchfile-i"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "krijo makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "mos krijo makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "krijo batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "mos krijo batchfile"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "përdor make-mode për Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "mos përdor make-mode për Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Gjedhe projekti"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "drejtori gjedhesh për kartela gjedhe"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "përkufizoni një ndryshore gjedheje"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"quiet\" është specifikuar, por s’është specifikuar ndonjë \"projekt\" ose \"autor\"."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Gabim:shtegu i dhënë s’është drejtori, ose kartelat sphinx ekzistojnë tashmë."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart prodhon vetëm te një drejtori e zbrazët. Ju lutemi, specifikoni një shteg rrënjë të ri."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Ndryshore e pavlefshme gjedheje: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Titull i pavlefshëm: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "numri i specifikuar për rreshtin është jashtë intervali (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "S’mund të përdoren në të njëjtën kohë të dyja mundësitë \"%s\" \"%s\""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "S’u gjet kartelë “include†%r, ose leximi i saj dështoi"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "Kodimi %r i përdorur për lexim të kartelës “include†%r duket të jetë i gabuar, provoni të jepni një mundësi :encoding:"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "Objekti i emërtuar %r s’u gjet te kartelë include %r"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree përmban referencë ndaj dokumenti %r të përjashtuar"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree përmban referencë ndaj dokumenti %r që s’ekziston"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "zë i përsëdytur, gjetur te toctree: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Autor ndarjeje: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Autor moduli: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Autor kodi: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Autor: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "Mundësia \":file:\" për direktivë csv-table tani njeh një shteg absolut si shteg relativ prej drejtorisë burim. Ju lutemi, përditësoni dokumentin tuaj."
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "Deklarim C i përsëdytur, përkufizuar edhe te %s:%s.\nDeklarimi është '.. c:%s:: %s'."
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametra"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Kthime"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Lloj kthimi"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "anëtar"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "ndryshore"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funksion"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "bashkim"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "lloj"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "parametër funksioni"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Të reja në versionin %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Ndryshuar në versionin %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Nxjerrë nga përdorimi që me versionin %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "citim i përsëdytur %s, tjetër instancë te %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Përmendja [%s] s’është në referencë."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "Deklarim C++ i përsëdytur, përkufizuar edhe te %s:%s.\nDeklarimi është '.. cpp:%s:: %s'."
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Parametra Gjedhesh"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klasë"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "koncept"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "parametër gjedheje"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (funksion i brendshëm)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (metodë %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klasë)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s ( ndryshore globale ose konstante)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (atribut %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argumente"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metodë"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "të dhëna"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "atribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "përshkrim %s i përsëdytur i %s, tjetër %s në %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "etiketë e përsëdytur ekuacioni %s, instancë tjetër te %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "math_eqref_format i pavlefshëm: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Ndryshore"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (te moduli %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (te moduli %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (ndryshore e brendshme)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (klasë e brendshme)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klasë te %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (metodë klase %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (metodë statike %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (veti %s)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Tregues Modulesh Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "module"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Nxjerrë nga përdorimi"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "përjashtim"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "metodë klase"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "metodë statike"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "veti"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr "përshkrim i përsëdytur objekti %s, hasje tjetër te %s, për njërin prej tyre përdorni :no-index:"
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "për ndërreferencën %r u gjet më shumë se një objektiv: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (nxjerrë nga përdorimi)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktivë)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (mundësi direktive)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rol)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktivë"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rol"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "përshkrim i përsëdytur %s %s, instancë tjetër te %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "ndryshore mjedisi; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Përshkrim i keqformuar mundësie %r, duhet të duket si \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" ose \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "Mundësi për rresht urdhrash %s"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "mundësi për rresht urdhrash"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "termi i fjalorthit duhet të paraprihet nga një rresht i zbrazët"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "termat e fjalorthit s’duhet të paraprihet nga rreshta të zbrazët"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "fjalorthi duket të jetë i keformatuar, kontrolloni shmangie kryeradhe"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "term fjalorthi"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "etiketë reference"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "ndryshore mjedisi"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "mundësi programi"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "dokument"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Tregues Modulesh"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Faqe Kërkimesh"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "etiketë %s e përsëdytur, tjetër instancë te %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "përshkrim %s i përsëdytur për %s, tjetër instancë te %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig është i çaktivizuar. :numref: është shpërfillur."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "S’u arrit të krijohej një ndërreferencë. S’u caktua ndonjë numër: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "lidhja s’ka titull: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "numfig_format i pavlefshëm: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "numfig_format i pavlefshëm: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "etiketë e papërkufizuar: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "S’u arrit të krijohet ndërreferencë. S’u gjet një titull, ose një përshkrim: %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "formësim i ri"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "formësimi ndryshoi"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "zgjerimet u ndryshuan"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "version jo i tanishëm i mjedisit të montimit"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "drejtoria burim ka ndryshuar"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Ky mjedis është i papërputhshëm me montuesin e përzgjedhur, ju lutemi, zgjidhni një tjetër drejtori doctree."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "S’u arrit të skanohen dokumente te %s: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Përkatësia %r s’është e regjistruar"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "dokumenti s’është i përfshirë në ndonjë toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "U gjet “toctree†që i referohet vetes. U shpërfill."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "shihni %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "shihni edhe %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "lloj i panjohur zëri treguesi: %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Simbole"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "u pikasën referenca rrethore toctree-je, po shpërfllen: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree përmban referencë ndaj dokumenti %r që s’ka titull: s’do të prodhohet ndonjë lidhje"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "toctree përmban referencë dokumenti të papërfshirë %r"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "kartelë figure jo e lexueshme: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "kartelë figure %s jo e lexueshme: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "kartelë shkarkimi jo e lexueshme: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "Do të krijonte kartelë %s."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nShih në mënyrë rekursive te <MODULE_PATH> për module dhe\npaketa Python dhe krijo një kartelë reST me direktiva\nautomodulesh për paketë te <OUTPUT_PATH>.\n\n<EXCLUDE_PATTERN>s mund të jetë shprehje kartelash dhe/ose\ndrejtorish që mund të përjashtohen nga prodhimi.\n\nShënim: Si parazgjedhje, ky programth s’do të anashkalojë\nkartela të krijuara tashmë."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "shteg për te modul për te dokumenti"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "kartelë fnmatch-style dhe/ose rregullsi drejtorish për t’u përjashtuar prej prodhimit"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "drejtori ku të vendosen krejt përfundimet"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "thellësi maksimum nënmodulesh për shfaqje te TEL (parazgjedhje: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "mbishkruaj kartela ekzistuese"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "ndiq lidhje simbolike. E fuqishme, kur ndërthuret me collective.recipe.omelette."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "xhiroje programthin pa krijuar kartela"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "vendose dokumentim për çdo modul në faqe më vete"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "përfshi modulet \"_private\""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "emër kartele për tryezën e lëndës (parazgjedhje: modules)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "mos krijo një kartelë tryeze lënde"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "mos krijo krye për paketat modul/paketë (për shembull, kur ato i përmban tashmë docstrings)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "vendose dokumentimin e modulit përpara dokumentimit të nënmodulit"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "interpreto shtigje modulesh sipas specifikimeve impicite PEP-0420 për emërhapësira"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "prapashtesë kartele (parazgjedhje: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "prodho me sphinx-quickstart një projekt të plotë"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "shto module_path pas sys.path, e përdorur kur është dhënë --full"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "emër projekti (parazgjedhje: emër moduli rrënjë)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "autor(ë) projekti, e përdorur kur është dhënë --full"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "version projekti, e përdorur kur është dhënë --full"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "hedhje në qarkullim e projektit, e përdorur kur është dhënë --full, si parazgjedhje merr --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "mundësi zgjatimi"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s s’është drejtori."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "pjesa “%s†etiketohet si “%sâ€"
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "shprehje e rregullt e pavlefshme %r te %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "Testimi i mbulimit te burimet përfundoi, shihni te përfundimet në %(outdir)spython.txt."
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "shprehje e rregullt %r e pavlefshme te coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "API C e padokumentuar: %s [%s] te kartela %s"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "moduli %s s’u importua dot: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "funksion python i padokumentuar: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "klasë python e padokumentuar: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "metodë python e padokumentuar: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "mungon '+' ose '-' te mundësia '%s'."
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' s’është mundësi e vlefshme."
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' s’është mundësi pyversion e vlefshme"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "lloj TestCode i pavlefshëm"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "Testimi i doctests-eve te burimet përfundoi, shihni te përfundimet në %(outdir)s/output.txt."
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "s’ka kod/dhënie te blloku %s në %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "po shpërfillet kod “doctest†i pavlefshëm: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "=================== kohëzgjatjet më të ngadalta të leximit ==================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Një direktivë Graphviz s’mund të ketë edhe lëndë, edhe argument emri kartelash"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "S’u gjet kartelë e jashtme Graphviz %r, ose dështoi leximi i saj"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "Po shpërfillet direktivë “graphviz†pa lëndë."
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr "Duhet ujdisur shteg të ekzekutueshmi graphviz_dot! %r"
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "urdhri dot %r s’mund të xhirohet (i nevojshëm për çka prodhon graphviz), kontrolloni rregullimin graphviz_dot"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot përfundoi me gabim:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot s’prodhoi kartelë përfundim:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format duhet të jetë një nga 'png', 'svg', por është %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "kod dot %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[grafik: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[grafik]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "S’arrihet të xhirohet urdhri %r. për shndërrim figure. Si parazgjedhje, 'sphinx.ext.imgconverter' lyp ImageMagick. Sigurohuni se është i instaluar, ose për mundësinë 'image_converter' caktoni një urdhër vetjak shndërrimi .\n\nTraceback: %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "shndërrimi përfundoi me gabimin:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "s’mund të xhirohet urdhër shndërrimi %r, kontrolloni rregullimin image_converter"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "Urdhri LaTeX %r s’mund të xhirohet (i nevojshëm për shfaqje formulash matematikore), kontrolloni rregullimin imgmath_late"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "Urdhri %s %r s’mund të xhirohet (i nevojshëm për shfaqje formulash matematikore), kontrolloni rregullimin imgmath_%s"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "shfaq latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "latex brendazi %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr "Lidhje për te ky ekuacion"
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "inventari intersphinx është lëvizur: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "po ngarkohet inventari intersphinx prej %s…"
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "u hasën disa probleme me disa nga inventare, por kishin alternativa funksionale:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "s’u arrit të kapej ndonjë inventar me problemet vijuese:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(te %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(te %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "s’u gjet objektiv reference të jashtme %s:%s: %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "identifikuesi intersphinx %r s’është varg. U shpërfill"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "S’u arrit të lexohej intersphinx_mapping[%s], u shpërfill: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[burim]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Për T’u Bërë"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "U gjet zë Për T’u Bërë: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<zëri origjinal>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> gjendet te %s, rreshti %d.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "zëri origjinal"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "po theksohet kod moduli… "
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[dokumente]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Kod moduli"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Kod burim për %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Përmbledhje: kod moduli"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Krejt modulet për të cilët ka kod të gatshëm</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "vlerë e pavlefshme mundësie për member-order: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "vlerë e pavlefshme për mundësinë class-doc-from: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "nënshkrim i pavlefshëm për auto%s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "gabim gjatë formatimi argumentesh për %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc: s’u arrit të përcaktohet %s.%s (%r) për t’u dokumentuar, u shfaq përjashtimi vijues:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "s’dihet cili modul të importohet për vetëdokumentim të %r (provoni të vendosni te dokumenti një direktivë \"module\" ose \"currentmodule\", ose të jepni shprehimisht një emër moduli)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "gabim gjatë formatimi nënshkrimesh për %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" në emër automoduli nuk ka kuptim"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ should duhet të jetë një listë vargjesh, jo %r (në module %s) -- ignoring __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "u përmend atribut që mungon në :members: mundësi: modul %s, atributi %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "S’u arrit të merret një nënshkrim funksioni për %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "S’u arrit të merrej nënshkrim konstruktori për %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "Baza: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "atribut %s që mungon te objekt %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "alias për %s"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "alias për TypeVar(%s)"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "S’u arrit të merre një nënshkrim metode për %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "U gjet __slots__ i pavlefshëm në %s. U shpërfill."
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "S’u arrit të përtypej një vlerë parazgjedhje argumenti për %r: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "S’u arrit të përditësohet nënshkrim për %r: s’u gjet parametër: %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "S’u arrit të përtypet type_comment për %r: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "referenca vetëpërmbledhjeje përjashtuan dokumentin %r. U shpërfill."
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "vetëpërmbledhje: s’u gjet kartelë stub %r. Kontrolloni rregullimin tuaj autosummary_generate."
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "përmbledhje e automatizuar: s’u arrit të importohej %s.\nNdihmëza të mundshme:\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "s’u arrit të përtypej emri %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "s’u arrit të importohej objekti %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: s’u gjet kartelë: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "vetëpërmbledhja prodhon së brendshmi kartela .rst. Por source_suffix juaj s’përmban .rst. U anashkalua."
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "vetëpërmbledhje: s’u arrit të përcaktohet %r për t’u dokumentuar, u shfaq përjashtimi vijues:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[vetëpërmbledhje] prodhim vetëpërmbledhje për: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[vetëpërmbledhje] po shkruhet te %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary] s’u arrit të importohej %s.\nNdihmëza të mundshme:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\nProdhoni ReStructuredText duke përdorur direktiva vetëpërmbledhje.\n\nsphinx-autogen është një ndërfaqe pamore për sphinx.ext.autosummary.generate. Prodhon\nkartela reStructuredText nga direktiva vetëpërmbledhjeje që përmbahen te\nkartelat e dhëna.\n\nFormati i direktivës vetëpërmbledhje dokumentohet te\nmoduli Python ``sphinx.ext.autosummary`` dhe mund të lexohet duke përdorur::\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "kartela burim për të cilat të krijohen kartela rST"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "drejtori ku të vendosen krejt përfundimet"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "prapashtesë parazgjedhje për kartela (parazgjedhje: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "drejtori gjedhesh vetjake (parazgjedhje: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "pjesë të importuara të dokumentit (parazgjedhje: %(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "dokumentoni saktësisht pjesët te moduli __all__ attribute. (parazgjedhje: %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "Argumente Fjalëkyçi"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Shembull"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Shembuj"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Shënime"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "Parametra të Tjerë"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Referenca"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Sinjalizime"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "u caktua vlerë e pavlefshme (mungon kllapë mbyllëse): %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "u caktua vlerë e pavlefshme (mungon kllapë hapëse): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "shprehje vargu e keqformuar (mungon thonjëz mbyllëse): %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "shprehje vargu e keqformuar (mungon thonjëz hapëse): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Vëmendje"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Kujdes"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Rrezik"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Gabim"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Ndihmëz"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "E rëndësishme"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Shënim"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Shihni edhe"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Ndihmëz"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Sinjalizim"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "vazhduar nga faqja e mëparshme"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "vazhdon në faqen pasuese"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "Joalfabetike"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Numra"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "faqe"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Tryeza e Lëndës"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "KÄ“rko"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Shko"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Shfaq Burimin"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Përmbledhje"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Mirë se vini! Ky është"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "dokumentimi për"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "përditësuar së fundi më"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Tregues dhe tabela:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Tryezë e Plotë e Lëndës"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "paraqet krejt ndarjet dhe nënndarjet"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "kërkoni te ky dokumentim"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Tregues Global Modulesh"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "hyrje e shpejtë te krejt modulet"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "krejt funksionet, klasat, termat"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Tregues &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Tregues i plotë në një faqe"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Faqe treguesi sipas shkronjash"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "mund të jetë i stërmadh"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Lëvizje"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Kërkoni brenda %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Mbi këto dokumente"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Të drejta kopjimi"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Përditësuar së fundi më %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "Krijuar duke përdorur <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s."
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Kërkoni te %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Subjekti i mëparshëm"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "kapitulli i mëparshëm"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Subjekti pasues"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "kapitulli pasues"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Që të aktivizohet funksioni i kërkimit, ju lutemi, aktivizoni\n JavaScript-in."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "Kërkimi për disa fjalë njëherësh shfaq vetëm përputhje që\n përmbajnë krejt fjalët."
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "kërko"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Përfundime Kërkimi"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 "Kërkimi juaj s’gjeti përputhje me ndonjë dokument. Ju lutemi, sigurohuni se janë shkruar saktë krejt fjalët dhe se keni përzgjedhur aq kategori sa duhen."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Kërkim i shpejtë"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Kjo Faqe"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Ndryshe në Versionin %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "Listë ndryshime në versionin %(version)s e prodhuar automatikisht"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Ndryshime librarie"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "Ndryshime API C"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Ndryshime të tjera"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "Kërkimi përfundoi, u gjetën ${resultCount} faqe me përputhje me vargun e kërkimit."
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Kërkim"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Po përgatitet kërkim..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", në "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Fshih Përputhje Kërkimi"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Tkurre anështyllën"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Zgjeroje anështyllën"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Lëndë"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "U gjet tregues me bazë 4 shtylla. Mund të jetë një e metë e zgjerimeve që përdorni: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "Poshtëshënimi [%s] s’është në referencë."
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "Poshtëshënimi [#] s’është në referencë."
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referenca pa njëtrajtësi, te fundfaqe në mesazhin e përkthyer. origjinali: {0}, përkthimi: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "referenca pa njëtrajtësi, te mesazhi i përkthyer. origjinali: {0}, përkthimi: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referenca citimi pa njëtrajtësi, te fundfaqe në mesazhin e përkthyer. origjinali: {0}, përkthimi: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "referenca citimi pa njëtrajtësi, te mesazhi i përkthyer. origjinali: {0}, përkthimi: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "u gjet më shumë se një objektiv për ndërreferencën 'any' %r: mund të ishte %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "s’u gjet objektiv reference %s:%s: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "s’u gjet objektiv reference %r: %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "S’u pru dot figurë e largët: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "S’u soll dot figurë e largët: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Format i panjohur figure: %s…"
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "shenja burimi të padeshifrueshme, po zëvendësohen me \"?\": %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "e anashkaluar"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "e dështuar"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "Problem në përkatësinë %s: fusha supozohet të përdorë rol '%s', por ai rol s’gjendet te përkatësia."
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "emër direktive ose roli të panjohur: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "lloj i panjohur nyjeje: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "gabim leximi: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "gabim shkrimi: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "Format i pavlefshëm datash. Quote the string by single quote Nëse doni të jepet drejtpërsëdrejti, përdorni për vargun thonjëza njëshe: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr "%r është nxjerrë nga funksionimi për zëra treguesi (nga zëri %r). Në vend të tij përdorni “pair: %sâ€."
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "“toctree†përmban referencë për te një kartelë joekzistuese %r"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "përjashtim teksa vlerësohej vetëm shprehje direktive: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "s’u gjet rol parazgjedhje %s"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format s’është i përcaktuar për %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "Çfarëdo ID-sh jo të përshoqëruara për nyjën %s"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "S’u mor dot madhësi figure. Mundësia :scale: u shpërfill."
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "toplevel_sectioning %r i panjohur për klasën %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: shumë i madh, u shpërfill."
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "titulli i dokumentit s’është nyje njëshe Teksti"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "u has nyje titulli jo në ndarje, temë, tabelë, paralajmërim ose anështyllë"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Poshtëshënime"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "janë dhënë që të dyja mundësitë, “tabularcolumns†dhe “:widths:â€. shpërfillet :widths:."
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "njësia e përmasave %s është e pavlefshme. U shpërfill."
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "u gjet lloj i panjohur %s zërash treguesi"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[figurë: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[figurë]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "titull jo brenda një figure."
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "lloj nyjeje i pasendërtuar: %r"
diff --git a/sphinx/locale/sr/LC_MESSAGES/sphinx.js b/sphinx/locale/sr/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..5abbab8
--- /dev/null
+++ b/sphinx/locale/sr/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "sr",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", \u0443 ",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u0418\u0437\u043c\u0435\u043d\u0435 \u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0438 %(version)s &#8212; %(docstitle)s",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "\u0421\u0430\u0434\u0440\u0436\u0430\u0458",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "\u0422\u0440\u0430\u0436\u0438",
+ "Hide Search Matches": "",
+ "Index": "\u0418\u043d\u0434\u0435\u043a\u0441",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "\u0418\u0437\u043c\u0435\u043d\u0435 \u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0446\u0438",
+ "Navigation": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0458\u0430",
+ "Next topic": "\u0421\u043b\u0435\u0434\u0435\u045b\u0438 \u043e\u0434\u0435\u0459\u0430\u043a",
+ "Other changes": "\u0414\u0440\u0443\u0433\u0435 \u0438\u0437\u043c\u0435\u043d\u0435",
+ "Overview": "\u041f\u0440\u0435\u0433\u043b\u0435\u0434",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "\u041f\u0440\u0438\u043f\u0440\u0435\u043c\u0430 \u043f\u0440\u0435\u0442\u0440\u0430\u0433\u0435...",
+ "Previous topic": "\u041f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0438 \u043e\u0434\u0435\u0459\u0430\u043a",
+ "Quick search": "\u0411\u0440\u0437\u0430 \u043f\u0440\u0435\u0442\u0440\u0430\u0433\u0430",
+ "Search": "\u041f\u0440\u0435\u0442\u0440\u0430\u0433\u0430",
+ "Search Page": "",
+ "Search Results": "\u0420\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0438 \u043f\u0440\u0435\u0442\u0440\u0430\u0433\u0435",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "\u041f\u0440\u0435\u0442\u0440\u0430\u0436\u0443\u0458\u0435 \u0441\u0435",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u0418\u0437\u0432\u043e\u0440\u043d\u0438 \u043a\u043e\u0434",
+ "Table of Contents": "\u0421\u0430\u0434\u0440\u0436\u0430\u0458",
+ "This Page": "\u041e\u0432\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430",
+ "Welcome! This is": "\u0414\u043e\u0431\u0440\u043e \u0434\u043e\u0448\u043b\u0438! \u041e\u0432\u043e \u0458\u0435",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "\u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0430 \u0438\u0437\u043c\u0435\u043d\u0430",
+ "lists all sections and subsections": "",
+ "next chapter": "\u043d\u0430\u0440\u0435\u0434\u043d\u0430 \u0433\u043b\u0430\u0432\u0430",
+ "previous chapter": "\u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0430 \u0433\u043b\u0430\u0432\u0430",
+ "quick access to all modules": "",
+ "search": "\u0442\u0440\u0430\u0436\u0438",
+ "search this documentation": "",
+ "the documentation for": "\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0430"
+ },
+ "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/sr/LC_MESSAGES/sphinx.mo b/sphinx/locale/sr/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..2309a0d
--- /dev/null
+++ b/sphinx/locale/sr/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/sr/LC_MESSAGES/sphinx.po b/sphinx/locale/sr/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..52a57ae
--- /dev/null
+++ b/sphinx/locale/sr/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3696 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Risto Pejasinovic <risto.pejasinovic@gmail.com>, 2019
+# Vladimir Milovanović <vmilovanovic@gmail.com>, 2020
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Vladimir Milovanović <vmilovanovic@gmail.com>, 2020\n"
+"Language-Team: Serbian (http://app.transifex.com/sphinx-doc/sphinx-1/language/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Ðема изворног директоријума (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Изворни и одредишни директоријум не могу бити једнаки"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Покрећем Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Овај пројекат захтева верзију Sphinx v%s или већу, не може Ñе изградити инÑталираном верзијом."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "учитавање превода [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "готово"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "ÐеуÑпешно: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "уÑпешно"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "Ñа грешкама"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "Конфигурациони директоријум не Ñадржи conf.py датотеку (%s)."
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Одељак %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Сл. %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Табела %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "СпиÑак %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Догађај %r већ поÑтоји"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Ðепознат догађај: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "Преводилац за %r већ поÑтоји"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "Ñве изворне датотеке"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "ажурирање окружења: "
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "припремање докумената"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "пребацивање Ñлика... "
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "пребацивање изворних датотека..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (у "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "индекÑ"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "напред"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "назад"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "документација %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTeX датотеке Ñу у %(outdir)s."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\nПокрените 'make' у том директоријуму да биÑте их пропуÑтили кроз (pdf)latex\n(или употребите `make latexpdf' овде да Ñе то одради аутоматÑки)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "ИндекÑ"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Издање"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Име пројекта"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Име(на) аутора"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Верзија пројекта"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Издање пројекта"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Језик пројекта"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Ð¡ÑƒÑ„Ð¸ÐºÑ Ð¸Ð·Ð²Ð¾Ñ€Ð½Ðµ датотеке"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "име пројекта"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "имена аутора"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "верзија пројекта"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "издање пројекта"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "језик пројекта"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "ÑÑƒÑ„Ð¸ÐºÑ Ð¸Ð·Ð²Ð¾Ñ€Ð½Ðµ датотеке"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "кориÑти epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Ðутор одељка: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Ðутор модула: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Ðутор кода: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Ðутор: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Параметри"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Резултат"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Тип резултата"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "променљива"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "функција"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "тип"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Додато у верзији %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Измењено у верзији %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "ЗаÑтарело почевши од верзије %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "клаÑа"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (уграђена функција)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s метода)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (клаÑа)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (глобална променљива или конÑтанта)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (атрибут %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Ðргументи"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (модул)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "метода"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "атрибут"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "модул"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Променљиве"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (у модулу %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (у модулу %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (уграђена променљива)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (уграђена клаÑа)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (клаÑа у %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (метода клаÑе %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (Ñтатичка метода %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "модули"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "ЗаÑтарело"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "изузетак"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "метода клаÑе"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "Ñтатичка метода"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "директива"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "променљива окружења; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "документ"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "погледајте %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "такође погледајте %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Симболи"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "ÑÑƒÑ„Ð¸ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐµ (подразумевани: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(у %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(у %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[изворни код]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "План"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[документација]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Код модула"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Изворни код %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Преглед: код модула"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Пример"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Примери"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Белешке"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Упозорења"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Пажња"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Грешка"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Путоказ"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Важно"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Белешка"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Савет"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Упозорење"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "наÑтављено Ñа претходне Ñтране"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "наÑтавак на Ñледећој Ñтрани"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Бројеви"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "Ñтрана"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "Садржај"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Претрага"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Тражи"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Изворни код"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Преглед"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Добро дошли! Ово је"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "документација"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "Ðавигација"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Претходни одељак"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "претходна глава"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Следећи одељак"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "наредна глава"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "тражи"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Резултати претраге"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Брза претрага"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "Измене у верзији %(version)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Измене у библиотеци"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "Друге измене"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Претражује Ñе"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Припрема претраге..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", у "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Садржај"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[Ñлика: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[Ñлика]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.js b/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..ccbc459
--- /dev/null
+++ b/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "sr@latin",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo b/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..39eef88
--- /dev/null
+++ b/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.po b/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..c7b7d48
--- /dev/null
+++ b/sphinx/locale/sr@latin/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Serbian (Latin) (http://app.transifex.com/sphinx-doc/sphinx-1/language/sr@latin/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: sr@latin\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.js b/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..39801e5
--- /dev/null
+++ b/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "sr_Cyrl_RS",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo b/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..9df27e9
--- /dev/null
+++ b/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.po b/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..494e7e9
--- /dev/null
+++ b/sphinx/locale/sr_RS/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Serbian (Serbia) (http://app.transifex.com/sphinx-doc/sphinx-1/language/sr_RS/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: sr_RS\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/sv/LC_MESSAGES/sphinx.js b/sphinx/locale/sv/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..35eccb5
--- /dev/null
+++ b/sphinx/locale/sv/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "sv",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "Om dessa dokument",
+ "Automatically generated list of changes in version %(version)s": "Automatiskt genererad lista \u00f6ver f\u00f6r\u00e4ndringar i version %(version)s",
+ "C API changes": "F\u00f6r\u00e4ndringar i C-API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "D\u00f6lj sidolist",
+ "Complete Table of Contents": "Komplett Inneh\u00e5llsf\u00f6rteckning",
+ "Contents": "Inneh\u00e5ll",
+ "Copyright": "Copyright",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Expandera sidolist",
+ "Full index on one page": "Hela inneh\u00e5llsf\u00f6rteckningen p\u00e5 en sida",
+ "General Index": "Huvudindex",
+ "Global Module Index": "Global Modulindex",
+ "Go": "G\u00e5",
+ "Hide Search Matches": "D\u00f6lj S\u00f6kresultat",
+ "Index": "Index",
+ "Index &ndash; %(key)s": "Index &ndash; %(key)s",
+ "Index pages by letter": "Inneh\u00e5llsf\u00f6rteckning per inledande bokstav",
+ "Indices and tables:": "Index och tabeller",
+ "Last updated on %(last_updated)s.": "Senast uppdaterad %(last_updated)s.",
+ "Library changes": "F\u00f6r\u00e4ndringar i bibliotek",
+ "Navigation": "Navigation",
+ "Next topic": "N\u00e4sta titel",
+ "Other changes": "\u00d6vriga f\u00f6r\u00e4ndringar",
+ "Overview": "\u00d6versikt",
+ "Please activate JavaScript to enable the search\n functionality.": "Var god aktivera JavaScript f\u00f6r s\u00f6kfunktionalitet.",
+ "Preparing search...": "",
+ "Previous topic": "F\u00f6reg\u00e5ende titel",
+ "Quick search": "Snabbs\u00f6k",
+ "Search": "S\u00f6k",
+ "Search Page": "S\u00f6ksida",
+ "Search Results": "S\u00f6kresultat",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "S\u00f6k bland %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Visa k\u00e4llfil",
+ "Table of Contents": "",
+ "This Page": "Denna Sida",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "alla funktioner, klasser, villkor",
+ "can be huge": "kan bli stort",
+ "last updated": "",
+ "lists all sections and subsections": "lista \u00f6ver alla paragrafer och underparagrafer",
+ "next chapter": "N\u00e4sta kapitel",
+ "previous chapter": "F\u00f6reg\u00e5ende kapitel",
+ "quick access to all modules": "genv\u00e4g till alla moduler",
+ "search": "s\u00f6k",
+ "search this documentation": "s\u00f6k i det h\u00e4r dokumentet",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ 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 0000000..c9f280d
--- /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 0000000..135fa9d
--- /dev/null
+++ b/sphinx/locale/sv/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Swedish (http://app.transifex.com/sphinx-doc/sphinx-1/language/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Inbyggda"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modulnivå"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(i "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Huvudindex"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "index"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "nästa"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "föregående"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Index"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Utgåva"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Sektionsförfattare"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Modulförfattare"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Källkodsförfattare"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Upphovsman:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametrar"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Returnerar"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Returtyp"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "medlem"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "variabel"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "funktion"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "typ"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Nyheter i version %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Förändrat i version %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Ersatt sedan version %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Kastar"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "klass"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (inbyggd funktion)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s metod)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (klass)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (global variabel eller konstant)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s attribut)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Argument"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modul)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "metod"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "data"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "attribut"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modul"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Variabler"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Väcker"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (i modul %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (i modul %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (inbyggd variabel)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (inbyggd klass)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (klass i %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s klassmetod)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s statisk metod)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python Modulindex"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "moduler"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Ersatt"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "undantag"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "klassmetod"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "statisk metod"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (direktiv)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (roll)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "direktiv"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "roll"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "miljövariabel; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "ordlista"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "grammatisk token"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "referensetikett"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "miljövariabel"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "programväxel"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Modulindex"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Söksida"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "se %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "se även %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[source]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Att göra"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "ursprungsvärde"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[docs]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modulkällkod"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>Källkod för %s</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Översikt: modulkällkod"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Alla moduler där källkod finns</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Uppmärksamma"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Varning"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Risk"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Fel"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "RÃ¥d"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Viktigt"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Observera"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Se även"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tips"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Varning"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "fortsättning från föregående sida"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Sök"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "GÃ¥"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Visa källfil"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Översikt"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr ""
+
+#: 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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Index &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "Navigation"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Sök bland %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Om dessa dokument"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Copyright"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Senast uppdaterad %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Sök %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Föregående titel"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Föregående kapitel"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Nästa titel"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "Nästa kapitel"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Var god aktivera JavaScript för sökfunktionalitet."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "sök"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Sökresultat"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Snabbsök"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: 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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Dölj Sökresultat"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Dölj sidolist"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Expandera sidolist"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Innehåll"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Fotnoter"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[image]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/ta/LC_MESSAGES/sphinx.js b/sphinx/locale/ta/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..9e9ca89
--- /dev/null
+++ b/sphinx/locale/ta/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ta",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ta/LC_MESSAGES/sphinx.mo b/sphinx/locale/ta/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..f9c85a7
--- /dev/null
+++ b/sphinx/locale/ta/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ta/LC_MESSAGES/sphinx.po b/sphinx/locale/ta/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..bcb65e2
--- /dev/null
+++ b/sphinx/locale/ta/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Julien Malard <julien.malard@mail.mcgill.ca>, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Julien Malard <julien.malard@mail.mcgill.ca>, 2019\n"
+"Language-Team: Tamil (http://app.transifex.com/sphinx-doc/sphinx-1/language/ta/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ta\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d கணà¯à®Ÿà¯ பà¯à®ªà®¿à®Ÿà®¿à®¤à¯à®¤ விடà¯à®Ÿà®¤à¯"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "அடà¯à®¤à¯à®¤"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/te/LC_MESSAGES/sphinx.js b/sphinx/locale/te/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..add62e0
--- /dev/null
+++ b/sphinx/locale/te/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "te",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/te/LC_MESSAGES/sphinx.mo b/sphinx/locale/te/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..add2495
--- /dev/null
+++ b/sphinx/locale/te/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/te/LC_MESSAGES/sphinx.po b/sphinx/locale/te/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..11bee36
--- /dev/null
+++ b/sphinx/locale/te/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Telugu (http://app.transifex.com/sphinx-doc/sphinx-1/language/te/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: te\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.js b/sphinx/locale/tr/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..f7bcee8
--- /dev/null
+++ b/sphinx/locale/tr/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "tr",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": ", \u015funun i\u00e7inde:",
+ "About these documents": "Bu belgeler hakk\u0131nda",
+ "Automatically generated list of changes in version %(version)s": "%(version)s s\u00fcr\u00fcm\u00fcndeki de\u011fi\u015fikliklerin otomatik olarak \u00fcretilmi\u015f listesi",
+ "C API changes": "C API'sindeki de\u011fi\u015fiklikler",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "S\u00fcr\u00fcm %(version)s &#8212; %(docstitle)s i\u00e7indeki De\u011fi\u015fiklikler",
+ "Collapse sidebar": "Yan \u00e7ubu\u011fu daralt",
+ "Complete Table of Contents": "Tam \u0130\u00e7indekiler",
+ "Contents": "\u0130\u00e7indekiler",
+ "Copyright": "Telif hakk\u0131",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "Yan \u00e7ubu\u011fu geni\u015flet",
+ "Full index on one page": "Tek sayfada tam dizin",
+ "General Index": "Genel Dizin",
+ "Global Module Index": "Genel Mod\u00fcl Dizini",
+ "Go": "Git",
+ "Hide Search Matches": "Arama E\u015fle\u015fmelerini Gizle",
+ "Index": "Dizin",
+ "Index &ndash; %(key)s": "Dizin &ndash; %(key)s",
+ "Index pages by letter": "Harfe g\u00f6re dizin sayfalar\u0131",
+ "Indices and tables:": "Dizinler ve tablolar:",
+ "Last updated on %(last_updated)s.": "Son g\u00fcncelleme: %(last_updated)s.",
+ "Library changes": "K\u00fct\u00fcphane de\u011fi\u015fiklikleri",
+ "Navigation": "Gezinti",
+ "Next topic": "Sonraki konu",
+ "Other changes": "Di\u011fer de\u011fi\u015fiklikler",
+ "Overview": "Genel Bak\u0131\u015f",
+ "Please activate JavaScript to enable the search\n functionality.": "Arama i\u015flevini kullanabilmek i\u00e7in l\u00fctfen JavaScript'i\n etkinle\u015ftirin.",
+ "Preparing search...": "Aramaya haz\u0131rlan\u0131yor...",
+ "Previous topic": "\u00d6nceki konu",
+ "Quick search": "H\u0131zl\u0131 Arama",
+ "Search": "Ara",
+ "Search Page": "Arama Sayfas\u0131",
+ "Search Results": "Arama Sonu\u00e7lar\u0131",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "%(docstitle)s i\u00e7inde ara",
+ "Searching": "Aran\u0131yor",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Kayna\u011f\u0131 G\u00f6ster",
+ "Table of Contents": "\u0130\u00e7indekiler",
+ "This Page": "Bu Sayfa",
+ "Welcome! This is": "Ho\u015f Geldiniz! Kar\u015f\u0131n\u0131zda",
+ "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 herhangi bir belge bulunamad\u0131. B\u00fct\u00fcn kelimeleri do\u011fru yazd\u0131\u011f\u0131n\u0131zdan ve gerekli b\u00fct\u00fcn kategorileri se\u00e7ti\u011finizden emin olun.",
+ "all functions, classes, terms": "t\u00fcm i\u015flevler, s\u0131n\u0131flar, terimler",
+ "can be huge": "\u00e7ok b\u00fcy\u00fck olabilir",
+ "last updated": "son g\u00fcncelleme",
+ "lists all sections and subsections": "t\u00fcm b\u00f6l\u00fcmleri ve alt b\u00f6l\u00fcmleri listeler",
+ "next chapter": "sonraki b\u00f6l\u00fcm",
+ "previous chapter": "\u00f6nceki b\u00f6l\u00fcm",
+ "quick access to all modules": "t\u00fcm mod\u00fcllere h\u0131zl\u0131 eri\u015fim",
+ "search": "ara",
+ "search this documentation": "bu belgelendirmeyi ara",
+ "the documentation for": "belgelendirme konusu: "
+ },
+ "plural_expr": "(n > 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/tr/LC_MESSAGES/sphinx.mo b/sphinx/locale/tr/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..34dfe7f
--- /dev/null
+++ 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
new file mode 100644
index 0000000..712a9bc
--- /dev/null
+++ b/sphinx/locale/tr/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3698 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# BouRock, 2020
+# Fırat Özgül <ozgulfirat@gmail.com>, 2013-2016
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011
+# tamerb2050 <tamerb2050@gmail.com>, 2020
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: BouRock, 2020\n"
+"Language-Team: Turkish (http://app.transifex.com/sphinx-doc/sphinx-1/language/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "Kaynak dizin bulunamıyor (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "Kaynak dizin ve hedef dizin aynı olamaz"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "Sphinx s%s çalışıyor"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "Bu proje en az Sphinx s%s gerektirir ve bu nedenle bu sürüm ile oluşturulamaz."
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "çıktı dizini yapılıyor"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "%s uzantısı ayarlanırken:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "Şu anda conf.py dosyasında tanımlanan 'kurulum' çağrılabilir bir Python değil. Lütfen tanımını çağrılabilir bir işlev yapmak için değiştirin. Bunun, Sphinx uzantısı gibi davranması için conf.py dosyasına ihtiyacı vardır."
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "çeviriler yükleniyor [%s]... "
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "bitti"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "yerleşik iletiler için kullanılamaz"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "derin temizlenen ortam yükleniyor"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "başarısız olan: %s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "Seçilen oluşturucu yok, varsayılan kullanılıyor: html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "başarılı oldu"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "sorunlarla tamamlandı"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "yapım %s, %s uyarı (hata olarak kabul edilen uyarılarla)."
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "yapım %s, %s uyarı (hatalar olarak kabul edilen uyarılarla)."
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "yapım %s, %s uyarı."
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "yapım %s, %s uyarı."
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "yapım %s."
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "düğüm sınıfı %r zaten kayıtlı, ziyaretçileri geçersiz kılınacaktır"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "yönerge %r zaten kayıtlı, geçersiz kılınacaktır"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "rol %r zaten kayıtlı, geçersiz kılınacaktır"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s uzantısı paralel okuma için güvenli olup olmadığını bildirmez, olmadığını varsayarak - lütfen uzantıyı hazırlayandan gözden geçirmesini ve açık hale getirmesini isteyin"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "%s uzantısı paralel okuma için güvenli değil"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s uzantısı paralel yazma için güvenli olup olmadığını bildirmez, olmadığını varsayarak - lütfen uzantıyı hazırlayandan gözden geçirmesini ve açık hale getirmesini isteyin"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "%s uzantısı paralel yazma için güvenli değil"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "%s seri nosu yapılıyor"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "config dizini bir conf.py dosyası içermiyor (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "sözlük yapılandırma ayarı %r geçersiz kılınamaz, yoksayılıyor (tek tek öğeleri ayarlamak için %r kullanın)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "geçersiz sayı %r; yapılandırma değeri %r için; yoksayılıyor"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "desteklenmeyen tür ile yapılandırma ayarı %r geçersiz kılınamaz, yoksayılıyor"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "geçersiz kılmada bilinmeyen yapılandırma değeri %r, yoksayılıyor"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "Böyle bir yapılandırma değeri yok: %s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "Yapılandırma değeri %r zaten mevcut"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "Yapılandırma dosyanızda bir sözdizimi hatası var: %s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "Yapılandırma dosyası (veya içe aktarılan modüllerden biri) sys.exit() olarak adlandırılır"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "Yapılandırma dosyanızda programlanabilir bir hata var:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "'source_suffix' yapılandırma değeri bir dizgi, dizgiler listesi ya da sözlük bekler. Ama '%r' verilir."
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "Bölüm %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "Åžekil %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "Tablo %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "Listeleme %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "`{name}` yapılandırma değeri, {candidates} geğerlrinden biri olmak zorundadır, ancak `{current}` değeridir."
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "`{name}' yapılandırma değeri `{current.__name__}' türüne sahip; beklenen {permitted}."
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "`{name}' yapılandırma değeri `{current.__name__}' türüne sahip, vassayılanları `{default.__name__}'."
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r bulunamadı, yoksayıldı."
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "Olay %r zaten mevcut"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "Bilinmeyen olay adı: %s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "%s uzantısı needs_extensions ayarları tarafından gereklidir, ancak yüklü değildir."
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "Bu projenin %s uzantısına ve en az %s sürümüne ihtiyacı vardır ve bu nedenle yüklenen sürümle oluşturulamaz (%s)."
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Pygments lexer adı %r bilinmiyor"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Oluşturucu sınıfı %s \"ad\" özniteliğine sahip değil"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Oluşturucu %r zaten mevcut (%s modülünde)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Oluşturucu adı %s kayıtlı veya giriş noktası aracılığıyla kullanılabilir değil"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Oluşturucu adı %s kayıtlı değil"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "etki alanı %s zaten kayıtlı"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "etki alanı %s henüz kayıtlı değil"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "%r yönergesi zaten %s etki alanına kayıtlı"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "%r rolü zaten %s etki alanına kayıtlı"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "%r dizini zaten %s etki alanına kayıtlı"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "%r object_type zaten kayıtlı"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "%r crossref_type zaten kayıtlı"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r zaten kayıtlı"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "%r için source_parser zaten kayıtlı"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "%s için kaynak ayrıştırıcı kayıtlı değil"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "%r için çevirmen zaten mevcut"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "add_node() için kwargs bir (visit, depart) tanımlama grubu işlevi olmak zorundadır: %r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r zaten kayıtlı"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "%r uzantısı zaten %s sürümünden bu yana Sphinx ile birleştirildi; bu uzantı yoksayıldı."
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "Özgün özel durumu:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr " %s uzantısı içe aktarılamadı"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "%r uzantısı setup() işlevine sahip değil; bu gerçekten bir Sphinx uzantısı modülü mü?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "Bu proje tarafından kullanılan %s uzantısının en az Sphinx s%s sürümüne ihtiyacı var; bu nedenle bu sürümle oluşturulamaz."
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "%r uzantısı, setup() işlevinden desteklenmeyen bir nesne döndürdü; Hiçbir şey veya üstveri sözlüğü döndürmeli"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Geliştirme Önerileri; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "%r temasının \"theme\" ayarı yok"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "%r temasının \"inherit\" ayarı yok"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "%r adında bulunan tema yok, %r tarafından devralındı"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "%s.%s ayarı, aranan tema yapılandırmalarının hiçbirinde meydana gelmiyor"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "desteklenmeyen tema seçeneği %r verildi"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "tema yolundaki %r dosyası geçerli bir zip dosyası değil ya da hiç tema içermiyor"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "%r adında bulunan tema yok (eksik theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "%s oluşturucu için uygun bir resim bulunamadı: %s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "%s oluşturucu için uygun bir resim bulunamadı: %s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "[mo] oluÅŸturuluyor: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "çıktı yazılıyor..."
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "%d po dosyasının tümü"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "belirtilen %d po dosyası için hedefler"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "güncel olmayan %d po dosyası için hedefler"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "tüm kaynak dosyaları"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "komut satırında verilen %r dosyası kaynak dizinin altında değil, yoksayılıyor"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "komut satırında verilen %d kaynak dosyası"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "güncel olmayan %d kaynak dosyası için hedefler"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "[%s] oluÅŸturuluyor:"
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "şimdi güncel olmayan dosyalar aranıyor..."
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "%d tane bulundu"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "hiç bulunamadı"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "ortam derin temizleniyor"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "tutarlılık denetleniyor"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "hiçbir hedef güncel değil."
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "güncellenen ortam:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s eklendi, %s değiştirildi, %s kaldırıldı"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "kaynaklar okunuyor..."
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "yazmak için belge adları: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr "belgeler hazırlanıyor"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "kopyalanmış ToC girişi bulundu: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "resimler kopyalanıyor..."
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "resim dosyası %r okunamıyor: bunun yerine kopyalanıyor"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "resim dosyası %r kopyalanamıyor: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "resim dosyası %r yazılamıyor: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "Yastık bulunamadı - resim dosyaları kopyalanıyor"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "%s için bilinmeyen mime türü, yoksayılıyor"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "%s dosyası yazılıyor..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "Genel bakış dosyası %(outdir)s içinde."
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "%s sürümünde değişiklik yok."
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "özet dosyası yazılıyor..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "YerleÅŸikler"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Modül seviyesi"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "kaynak dosyalar kopyalanıyor..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "değişiklikler günlüğü oluşturma için %r okunamadı"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "Taklit oluşturucu hiçbir dosya oluşturmaz."
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "ePub dosyası %(outdir)s içinde."
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_language\" (veya \"language\"), EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "yapılandırma değeri \"epub_uid\", EPUB3 için XML NAME olmalıdır"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_title\" (veya \"html_title\"), EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_author\", EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_contributor\", EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_description\", EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_publisher\", EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_copyright\" (veya \"copyright\"), EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"epub_identifier\", EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "yapılandırma değeri \"version\", EPUB3 için boş olmamalıdır"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "geçersiz css_file: %r, yoksayıldı"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "İleti katalogları %(outdir)s içinde."
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "%d şablon dosyası için hedefler"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "ÅŸablonlar okunuyor..."
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "ileti katalogları yazılıyor..."
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "Yukarıdaki çıktıda veya %(outdir)s/output.txt içinde herhangi bir hata arayın"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "bozuk bağlantı: %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "Rehber sayfaları %(outdir)s içinde."
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "hiçbir \"man_pages\" yapılandırma değeri bulunamadı; hiçbir rehber sayfası yazılmayacaktır"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "yazılıyor"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "\"man_pages\" yapılandırma değeri bilinmeyen %s belgesine başvurur"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML sayfası %(outdir)s içinde."
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr "tek bir belgede toplanıyor"
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr "ilave dosyalar yazılıyor"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Texinfo dosyaları %(outdir)s içinde."
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\nMakeinfo aracılığıyla bunları çalıştırmak için bu dizinde 'make' komutunu çalıştırın\n(bunu otomatik olarak yapmak için burada 'make info' komutunu kullanın)."
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "hiçbir \"texinfo_documents\" yapılandırma değeri bulunamadı; hiçbir belge yazılmayacaktır"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "\"texinfo_documents\" yapılandırma değeri bilinmeyen %s belgesine başvurur"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "%s iÅŸleniyor"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "başvurular çözümleniyor..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (ÅŸurada: "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "Texinfo destek dosyaları kopyalanıyor..."
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "Makefile dosyası yazılırken hata oldu: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "Metin dosyaları %(outdir)s içinde."
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "%s dosyası yazılırken hata oldu: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "XML dosyaları %(outdir)s içinde."
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "Pseudo-XML dosyaları %(outdir)s içinde."
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "oluşturma bilgisi dosyası bozuldu: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTML sayfaları %(outdir)s içinde."
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "oluşturma bilgisi dosyasını okuma başarısız: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d %b %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Genel Dizin"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "dizin"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "sonraki"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "önceki"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "dizinler oluÅŸturuluyor"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "ilave sayfalar yazılıyor"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "indirilebilir dosyalar kopyalanıyor..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "indirilebilir dosya %r kopyalanamıyor: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "sabit dosya %r kopyalanamıyor"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "fazladan dosyalar kopyalanıyor"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "fazladan dosya %r kopyalanamıyor..."
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "oluşturma bilgisi dosyasını yazma başarısız: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "arama dizini yüklenemedi, ancak tüm belgeler oluşturulmayacaktır: dizin tamamlanmamış olacaktır."
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "sayfa %s html_sidebars içinde iki şekille eşleşiyor: %r ve %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "%s sayfasını işlerken bir Evrensel kod hatası meydana geldi. Lütfen ASCII olmayan içerik içeren tüm yapılandırma değerlerinin Evrensel kod dizgiler olduğundan emin olun."
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "%s sayfasını işlerken bir hata oldu.\nSebep: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "nesne envanteri dökümleniyor"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "%s içinde arama dizini dökümleniyor"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "geçersiz js_file: %r, yoksayıldı"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "Birçok math_renderers kayıtlı. Ama hiç math_renderer seçilmedi."
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "Bilinmeyen math_renderer %r verildi."
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path giriÅŸi %r mevcut deÄŸil"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path girişi %r, çıktı dizini içine yerleştirildi"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path giriÅŸi %r mevcut deÄŸil"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path girişi %r, çıktı dizini içine yerleştirildi"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "logo dosyası %r mevcut değil"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon dosyası %r mevcut değil"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s belgelendirmesi"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTeX dosyaları %(outdir)s içinde."
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\n(pdf)latex aracılığıyla bunları çalıştırmak için bu dizinde 'make' komutunu çalıştırın\n(bunu otomatik olarak yapmak için burada 'make latexpdf' komutunu kullanın)."
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "hiçbir \"latex_documents\" yapılandırma değeri bulunamadı; hiçbir belge yazılmayacaktır"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "\"latex_documents\" yapılandırma değeri bilinmeyen %s belgesine başvurur"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "Dizin"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Yayım"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "%r dili için bilinen hiç Babel seçeneği yok"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "TeX destek dosyaları kopyalanıyor"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "TeX destek dosyaları kopyalanıyor..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "ilave dosyalar kopyalanıyor"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "Bilinmeyen yapılandırma anahtarı: latex_elements[%r], yoksayıldı."
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r, \"theme\" ayarına sahip değil"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r, \"%s\" ayarına sahip değil"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "Oluşturulurken meydana gelen özel durum, hata ayıklayıcı başlatılıyor:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "Yarıda kesildi!"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "reST biçimlendirme hatası:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "Kodlama hatası:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "Sorunu geliştiricilere bildirmek istiyorsanız, tam geri izleme %s içine kaydedildi."
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "Tekrarlama hatası:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "Özel durum meydana geldi:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "Bir dahaki sefere daha iyi bir hata iletisi sağlanabilmesi için lütfen bunu bir kullanıcı hatasıysa da bildirin."
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Bir hata raporu <https://github.com/sphinx-doc/sphinx/issues> adresindeki izleyicide dosyalanabilir. Teşekkürler!"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "iş numarası pozitif bir sayı olmalıdır"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "belgelendirme kaynak dosyaları için yol"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "çıktı dizini için yol"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "yeniden oluşturmak için belirli dosyaların listesi. Belirtildiyse yoksayıldı"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "genel seçenekler"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "kullanmak için oluşturucu (varsayılan: html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "tüm dosyaları yaz (varsayılan: sadece yeni ve değiştirilmiş dosyaları yaz)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "kaydedilmiş bir ortam kullanma, her zaman tüm dosyaları oku"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "önbelleklenen ortam ve doctree dosyaları için yol (varsayılan: OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "mümkünse N işlem ile paralel olarak oluştur (özel değer \"auto\" N miktarını cpu-count değerine ayarlayacak)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "yapılandırma dosyasının (conf.py) bulunduğu yol (varsayılan: SOURCEDIR ile aynı)"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "hiç yapılandırma dosyası kullanmadan, sadece -D seçenekleri"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "yapılandırma dosyasındaki bir ayarı geçersiz kıl"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "HTML şablonlarına bir değer geçir"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "etiketi tanımla: \"sadece\" TAG'li blokları dahil et"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "nit-picky kipi, tüm eksik kaynaklar hakkında uyar"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "konsol çıktısı seçenekleri"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "ayrıntı seviyesini artır (tekrarlanabilir)"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "stdout üzerinde çıktı yok, stderr üzerinde sadece uyarılar"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "hiç çıktı yok, hatta uyarılarda bile"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "renkli çıktı yayımı yap (varsayılan: otomatik algıla)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "renkli çıktı yayımı yapma (varsayılan: otomatik algıla)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "verilen dosyaya uyarıları (ve hataları) yaz"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "uyarıları hatalara dönüştür"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "-W ile, uyarıları alırken devam et"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "özel durumda tam geri izleme göster"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "özel durumda Pdb çalıştır"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "-a seçeneği ve dosya adları birleştirilemiyor"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "uyarı dosyası %r açılamıyor: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-D seçeneği bağımsız değişkeni ad=değer biçiminde olmak zorundadır"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-A seçeneği bağımsız değişkeni ad=değer biçiminde olmak zorundadır"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "modüllerden otomatik olarak docstrings ekle"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "doctest bloklarında kod parçacıklarını otomatik olarak dene"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "farklı projelerin Sphinx begelendirmeleri arasında bağlantıla"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "oluşturmada gösterilebilen veya gizlenebilen \"yapılacaklar\" girişlerini yaz"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "belgelendirme kapsamı için denetlemeler"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "PNG veya SVG resimleri olarak iÅŸleneni, matematiÄŸi dahil et"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "MathJax ile tarayıcıda işleneni, matematiği dahil et"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "yapılandırma değerlerine dayalı içeriğin koşullu olarak eklenmesi"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "belgelenmiş Python nesnelerinin kaynak koduna bağlantıları dahil et"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "belgeyi GitHub sayfalarında yayımlamak için .nojekyll dosyası oluştur"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "Lütfen geçerli bir yol adı girin."
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "Lütfen biraz metin girin."
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "Lütfen %s seçeneklerinden birini girin."
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "Lütfen ya 'y' ya da 'n' girin."
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "Lütfen bir dosya soneki girin, örn. '.rst' veya '.txt'."
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "Sphinx %s hızlı başlangıç yardımcı uygulamasına hoş geldiniz."
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "Lütfen aşağıdaki ayarlar için değerleri girin (parantez içinde verilirse\nvarsayılan değeri kabul etmek için yalnızca Enter tuşuna basın)."
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "Seçilen kök dizin yolu: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "Belgelendirme için kök dizin yolunu girin."
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "Belgelendirme için kök dizin yolu"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "Hata: seçilen kök dizin yolunda varolan bir conf.py bulundu."
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sfenks-quickstart varolan Sphinx projelerinin üzerine yazmayacak."
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "Lütfen yeni bir kök dizin yolu girin (ya da çıkmak için yalnızca Enter'a basın)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "Sphinx çıktısının oluşturma dizinini yerleştirmek için iki seçeneğiniz var.\nYa, kök dizin yolu içinde bir \"_build\" dizini kullanın, ya da kök dizin yolu\niçinde \"source\" ve \"build\" dizinlerini ayırın."
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "Source ve build dizinlerini ayır (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "Kök dizinin içinde, iki dizin daha oluşturulacaktır; özel HTML şablonları için \"_templates\"\nve özel stil sayfaları ve diğer sabit dosyalar için \"_static\".\nAlt çizgi yerine başka bir önek (\".\" gibi) girebilirsiniz."
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "Templates ve static dizinleri için ad öneki"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "Proje adı, oluşturulan belgelendirmedeki çeşitli yerlerde oluşacak."
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "Proje adı"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "Hazırlayan ad(ları)ı"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "Proje sürümü"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "Proje yayımı"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "Eğer belgeler İngilizce dışında bir dilde yazıldıysa, bunun dil koduna\ngöre burada bir dil seçebilirsiniz. Sphinx daha sonra, ürettiği metni o\ndile çevirecektir.\n\nDesteklenen kodların listesi için\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language adresine bakın."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "Proje dili"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "Kaynak dosya soneki"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "Bir belge, \"içindekiler ağacı\"nın üst düğümü olarak kabul edilmesi, yani\nbelgelerin hiyerarşik yapısının kökü olması açısından özeldir.\nNormalde bu \"dizin\"dir, ancak \"dizin\" belgeniz özel bir şablonsa,\nbunu başka bir dosya adına da ayarlayabilirsiniz."
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "Asıl belgenizin adı (sonek olmadan)"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "Hata: %s asıl dosyası zaten seçilen kök dizin yolunda bulundu."
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sfenks-quickstart varolan dosyanın üzerine yazmayacak."
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "Lütfen yeni bir dosya adı girin ya da varolan dosyayı yeniden adlandırın ve Enter tuşuna basın"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "Aşağıdaki Sphinx uzantılarından hangisinin etkinleştirilmesi gerektiğini gösterir:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "Not: imgmath ve mathjax aynı anda etkinleştirilemez. imgmath seçimi kaldırıldı."
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "Makefile ve Windows komut dosyası sizin için oluşturulabilir,\nböylece doğrudan örn. sphinx-build çağırmak yerine sadece\n`make html' komutu çalıştırılmak zorundadır."
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "Makefile oluÅŸturulsun mu? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "Windows komut satırı oluşturulsun mu? (y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "%s dosyası oluşturuluyor."
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "%s dosyası zaten var, atlanıyor."
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "Tamamlandı: İlk dizin yapısı oluşturuldu."
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "Artık %s asıl dosyanızı doldurmalı ve diğer belgelendirme kaynak dosyalarını\noluşturmalısınız."
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "Belgeleri oluşturmak için Makefile'ı kullanın, aşağıdaki gibi:\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "Belgeleri oluşturmak için sphinx-build komutunu kullanın, aşağıdaki gibi:\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "\"builder\" burada desteklenen oluşturuculardan biridir, örn. html, latex veya linkcheck."
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nBir Sphinx projesi için gerekli dosyaları oluşturun.\n\nsphinx-quickstart, projeniz hakkında bazı sorular soran ve ardından tam bir\nbelgelendirme dizini ve örnek oluşturan etkileşimli bir araçtır\nMakefile, sphinx-build ile kullanılır.\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "sessiz kipi"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "proje kök dizini"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "Yapı seçenekleri"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "eğer belirtildiyse, kaynak ve oluşturma dizinlerini ayırın"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "_templates vb. içinde nokta için değiştirme"
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "Proje temel seçenekleri"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "proje adı"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "hazırlayan adları"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "projenin sürümü"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "projenin yayımı"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "belge dili"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "kaynak dosya soneki"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "asıl belge adı"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "epub kullan"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "Uzantı seçenekleri"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "%s uzantısını etkinleştir"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "rasgele uzantıları etkinleştir"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Makefile ve Batchfile oluÅŸturma"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "makefile oluÅŸtur"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "makefile oluÅŸturma"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "batchfile oluÅŸtur"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "batchfile oluÅŸturma"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.bat için make-mode kullan"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.bat için make-mode kullanma"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "Proje ÅŸablonlama"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "şablon dosyaları için şablon dizini"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "bir şablon değişkeni tanımla"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"sessiz\" belirtilmiş, ancak herhangi bir \"proje\" veya \"hazırlayan\" belirtilmemiş."
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "Hata: belirtilen yol bir dizin değil ya da sphinx dosyaları zaten var."
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sfenks-quickstart sadece boş bir dizin içine oluşturur. Lütfen yeni bir kök dizin yolu belirtin."
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "Geçersiz şablon değişkeni: %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "Geçersiz resim yazısı: %s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "satır numarası özellikleri aralık dışında (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "Hem \"%s\" hem de \"%s\" seçeneği kullanılamıyor"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Dahil edilen %r dosyası bulunamadı ya da dosyayı okuma başarısız oldu"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "%r kodlamasının kullanıldığı, dahil edilen %r dosyasını okuma yanlış gibi görünüyor, bir :encoding: seçeneği vermeyi deneyin"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "%r adlı nesne, dahil edilen %r dosyasında bulunamadı"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "Ayrık bir \"satır\" kümesiyle \"lineno-match\" kullanılamıyor"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Satır özelliği %r: dahil edilen %r dosyasından çekilen hiç satır yok"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree, hariç tutulan %r belgesine başvuru içeriyor"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree, varolmayan %r belgesine başvuru içeriyor"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Bölümü hazırlayan: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Modülü hazırlayan: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Kodu hazırlayan: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Hazırlayan: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Parametreler"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Dönüşler"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Dönüş türü"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "üyesi"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "deÄŸiÅŸkeni"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "iÅŸlevi"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "makrosu"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "birliÄŸi"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "numaralandırıcı"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "türü"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "%s sürümünde geldi"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "%s sürümünde değişti"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "%s sürümünden beri kullanım dışı"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "%s kopya alıntısı, %s içindeki diğer örnek"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "Alıntı [%s] kaynak gösterilmedi."
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "Åžablon Parametreleri"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Åžunu verir: "
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "sınıfı"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "kavramı"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (yerleÅŸik iÅŸlev)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s yöntemi)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (sınıf)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (genel deÄŸiÅŸken veya sabit)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s özniteliği)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Bağımsız Değişkenler"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (modül)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "yöntemi"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "verisi"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "özniteliği"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "modülü"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "kopya %s açıklamasına ait %s, diğer %s, %s içinde"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "%s denkleminin kopya etiketi, %s içindeki diğer örnek"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "Geçersiz math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "DeÄŸiÅŸkenler"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Harekete geçirir"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (%s modülü içinde)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (%s modülü içinde)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (yerleÅŸik deÄŸiÅŸken)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (yerleşik sınıf)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s içindeki sınıf)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s sınıf yöntemi)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s sabit yöntemi)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python Modül Dizini"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "modülleri"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Kullanım dışı"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "özel durum"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "sınıf yöntemi"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "sabit yöntemi"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "çapraz referans %r için birden fazla hedef bulundu: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (kullanım dışı)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (yönerge)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (yönerge seçeneği)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (rol)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "yönergesi"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "yönerge seçeneği"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "rolü"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "%s %s kopya açıklaması, %s içindeki diğer örnek"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "ortam deÄŸiÅŸkeni; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "Hatalı biçimlendirilmiş seçenek açıklaması %r, \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" veya \"+opt args\" şeklinde görünmelidir"
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s komut satırı seçeneği"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "komut satırı seçeneği"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "sözlük teriminden önce boş satır gelmek zorundadır"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "sözlük terimleri boş satırlarla ayrılmamak zorundadır"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "sözlük yanlış biçimlendirilmiş gibi görünüyor, girintiyi gözden geçirin"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "sözlük terimi"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "dilbilgisi belirteci"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "baÅŸvuru etiketi"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "ortam deÄŸiÅŸkeni"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "program seçeneği"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "belge"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Modül Dizini"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Arama Sayfası"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "%s kopya etiketi, %s içindeki diğer örnek"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "kopya %s açıklamasına ait %s, %s içindeki diğer örnek "
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig etkisizleştirildi. :numref: yoksayıldı."
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "bağlantının resim yazısı yok: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "geçersiz numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "geçersiz numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "yeni yapılandırma"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "yapılandırma değişti"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "uzantılar değişti"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "yapım ortamı sürümü şu anki değil"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "kaynak dizin deÄŸiÅŸti"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "Bu ortam seçilen oluşturucuyla uyumsuzdur, lütfen başka bir belge ağacı dizini seçin."
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "%s içinde belgeleri tarama başarısız oldu: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Etki alanı %r kayıtlı değil"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "belge herhangi bir toctree içine dahil değil"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "kendinden kaynaklı toctree bulundu. Yoksayıldı."
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "bakınız %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "ayrıca bakınız %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "bilinmeyen dizin girişi türü %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Semboller"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "dairesel toctree kaynakları algılandı, yoksayılan: %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree, başlığı olmayan %r belgesine başvuru içeriyor: hiç bağlantı oluşturulmayacaktır"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "resim dosyası okunabilir değil: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "%s resim dosyası okunabilir değil: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "indirme dosyası okunabilir değil: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s zaten atanmış bölüm numaralarıdır (iç içe numaralı toctree mi?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "%s dosyası oluşturur."
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\nPython modülleri ve paketleri için <MODULE_PATH> içine art arda bakın ve <OUTPUT_PATH> içindeki\npaket başına otomodül talimatlarını içeren bir reST dosyası oluşturun.\n\n<EXCLUDE_PATTERN>'ler, nesilden hariç tutulacak olan dosya ve/veya dizin şekilleri olabilir.\n\nNot: Varsayılan olarak bu betik zaten oluşturulmuş dosyaların üzerine yazmayacak."
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "belge için modüle giden yol"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "nesilden hariç tutmak için fnmatch-style dosyası ve/veya dizin şekilleri"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "tüm çıktıların yerleştirileceği dizin"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "TOC'da gösterilecek alt modüllerin en fazla derinliği (varsayılan: 4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "varolan dosyaların üzerine yaz"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "sembolik bağlantıları takip edin. Collective.recipe.omelette ile birleştirildiğinde güçlü."
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "dosyaları oluşturmadan betiği çalıştır"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "her modül için belgelendirmeyi kendi sayfasına koy"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "\"_private\" modülleri dahil"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "içindekiler dosyası adı (varsayılan: modüller)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "içindekiler tablosu oluşturma"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "modül/paket paketleri için başlıklar oluşturma (örn. docstrings zaten bunları içerdiğinde)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "modül belgelerini alt modül belgelerinin önüne koyun"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "modül yollarını PEP-0420 kapalı ad alanları özelliklerine göre yorumla"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "dosya soneki (varsayılan: rst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "sphinx-quickstart ile tam bir proje oluÅŸtur"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "--full yazıldığında, append module_path to sys.path, kullanılır"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "proje adı (varsayılan: kök modül adı)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "--full yazıldığında, proje hazırlayan(lar)ı kullanılır"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "--full yazıldığında, proje sürümü kullanılır"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "--full yazıldığında, varsayılanı to --doc-version, proje yayımı kullanılır"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "uzantı seçenekleri"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s bir dizin deÄŸil."
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "nokta kodu %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[grafik: %s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[grafik]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dönüştürmeden hata ile çıkıldı:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "dönüştürme komutu %r çalıştırılamaz, image_converter ayarını gözden geçirin"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "LaTeX komutu %r çalıştırılamaz (matematik görüntüleme için gerekli), imgmath_latex ayarını gözden geçirin"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s komutu %r çalıştırılamaz (matematik görüntüleme için gerekli), imgmath_%s ayarını gözden geçirin"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "görüntü latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "satır içi latex %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "intersphinx envanteri taşındı: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "%s konumundan intersphinx envanteri yükleniyor..."
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "aşağıdaki sorunlardan dolayı envanterlerden herhangi birine ulaşılamadı:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(%s v%s içinde)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(%s içinde)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[kaynak]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Yapılacaklar"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>>, %s içinde, %d. satırda bulunur.)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "özgün giriş"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[belgeler]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "Modül kodu"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s öğesinin kaynak kodu</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "Genel bakış: modül kodu"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>Kodları mevcut bütün modüller</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "Örnek"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Örnekler"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "Notlar"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "DiÄŸer Parametreler"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "Kaynaklar"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "Uyarılar"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "Getiriler"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Dikkat"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Uyarı"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Tehlike"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Hata"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Ä°pucu"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Önemli"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Not"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Ayrıca bakınız"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Tüyo"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Uyarı"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "önceki sayfadan devam"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "sonraki sayfaya devam"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "Alfabetik olmayan"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "Numaralar"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "sayfa"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "İçindekiler"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Ara"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Git"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Kaynağı Göster"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Genel Bakış"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Hoş Geldiniz! Karşınızda"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "belgelendirme konusu: "
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "son güncelleme"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Dizinler ve tablolar:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Tam İçindekiler"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "tüm bölümleri ve alt bölümleri listeler"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "bu belgelendirmeyi ara"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Genel Modül Dizini"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "tüm modüllere hızlı erişim"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "tüm işlevler, sınıflar, terimler"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Dizin &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Tek sayfada tam dizin"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Harfe göre dizin sayfaları"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "çok büyük olabilir"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Gezinti"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "%(docstitle)s içinde ara"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Bu belgeler hakkında"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Telif hakkı"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Son güncelleme: %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "%(docstitle)s ara"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Önceki konu"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "önceki bölüm"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Sonraki konu"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "sonraki bölüm"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Arama işlevini kullanabilmek için lütfen JavaScript'i\n etkinleştirin."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "ara"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Arama Sonuçları"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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 herhangi bir belge bulunamadı. Bütün kelimeleri doğru yazdığınızdan ve gerekli bütün kategorileri seçtiğinizden emin olun."
+
+#: sphinx/themes/basic/searchbox.html:12
+msgid "Quick search"
+msgstr "Hızlı Arama"
+
+#: sphinx/themes/basic/sourcelink.html:12
+msgid "This Page"
+msgstr "Bu Sayfa"
+
+#: sphinx/themes/basic/changes/frameset.html:5
+#: sphinx/themes/basic/changes/versionchanges.html:12
+#, python-format
+msgid "Changes in Version %(version)s &#8212; %(docstitle)s"
+msgstr "Sürüm %(version)s &#8212; %(docstitle)s içindeki Değişiklikler"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr "%(version)s sürümündeki değişikliklerin otomatik olarak üretilmiş listesi"
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr "Kütüphane değişiklikleri"
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr "C API'sindeki deÄŸiÅŸiklikler"
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr "DiÄŸer deÄŸiÅŸiklikler"
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "Aranıyor"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "Aramaya hazırlanıyor..."
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ", şunun içinde:"
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Arama EÅŸleÅŸmelerini Gizle"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "Yan çubuğu daralt"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "Yan çubuğu genişlet"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "İçindekiler"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "Bilinmeyen resim biçimi: %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "atlandı"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "başarısız oldu"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "okuma hatası: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "yazma hatası: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "varsayılan rol %s bulunamadı"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "Dipnotlar"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[resim: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[resim]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..bc4a88e
--- /dev/null
+++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "uk_UA",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "\u041f\u0440\u043e \u0446\u0456 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438",
+ "Automatically generated list of changes in version %(version)s": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0437\u0433\u0435\u043d\u0435\u0440\u043e\u0432\u0430\u043d\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u043c\u0456\u043d \u0432 \u0432\u0435\u0440\u0441\u0456\u0457 %(version)s",
+ "C API changes": "\u0437\u043c\u0456\u043d\u0438 C API",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "\u041f\u043e\u0432\u043d\u0438\u0439 \u0417\u043c\u0456\u0441\u0442",
+ "Contents": "",
+ "Copyright": "\u0410\u0432\u0442\u043e\u0440\u0441\u044c\u043a\u0456 \u043f\u0440\u0430\u0432\u0430",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "\u041f\u043e\u0432\u043d\u0438\u0439 \u0456\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u043e\u0434\u043d\u0456\u0439 \u0441\u0442\u043e\u0440\u0456\u043d\u0446\u0456",
+ "General Index": "\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0456\u043d\u0434\u0435\u043a\u0441",
+ "Global Module Index": "\u0417\u0430\u0433\u0430\u043b\u044c\u043d\u0438\u0439 \u0456\u043d\u0434\u0435\u043a\u0441 \u043c\u043e\u0434\u0443\u043b\u0456\u0432",
+ "Go": "\u0412\u043f\u0435\u0440\u0435\u0434",
+ "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",
+ "Index": "\u0406\u043d\u0434\u0435\u043a\u0441",
+ "Index &ndash; %(key)s": "\u0406\u043d\u0434\u0435\u043a\u0441 &ndash; %(key)s",
+ "Index pages by letter": "\u0406\u043d\u0434\u0435\u043a\u0441\u043d\u0456 \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0438 \u043f\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c",
+ "Indices and tables:": "\u0406\u043d\u0434\u0435\u043a\u0441\u0438 \u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0456:",
+ "Last updated on %(last_updated)s.": "\u0412\u043e\u0441\u0442\u0430\u043d\u043d\u0454 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u043e %(last_updated)s.",
+ "Library changes": "\u0417\u043c\u0456\u043d\u0438 \u0432 \u0431\u0456\u0431\u043b\u0456\u043e\u0442\u0435\u0446\u0456",
+ "Navigation": "\u041d\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u044f",
+ "Next topic": "\u041d\u0430\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u0435\u043c\u0430",
+ "Other changes": "\u0406\u043d\u0448\u0456 \u0437\u043c\u0456\u043d\u0438",
+ "Overview": "\u041e\u0433\u043b\u044f\u0434",
+ "Please activate JavaScript to enable the search\n functionality.": "\u0411\u0443\u0434\u044c-\u043b\u0430\u0441\u043a\u0430 \u0432\u0456\u043c\u043a\u043d\u0456\u0442\u044c \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0443 JavaScript, \u0449\u043e\u0431 \u0432\u0432\u0456\u043a\u043d\u0443\u0442\u0438\n\"\n\" \u043f\u043e\u0448\u0443\u043a.",
+ "Preparing search...": "",
+ "Previous topic": "\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u0440\u043e\u0437\u0434\u0456\u043b",
+ "Quick search": "\u0428\u0432\u0438\u0434\u043a\u0438\u0439 \u043f\u043e\u0448\u0443\u043a",
+ "Search": "\u041f\u043e\u0448\u0443\u043a",
+ "Search Page": "\u0421\u0442\u043e\u0440\u0456\u043d\u043a\u0430 \u043f\u043e\u0448\u0443\u043a\u0443",
+ "Search Results": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438 \u043f\u043e\u0448\u0443\u043a\u0443",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "\u0428\u0443\u043a\u0430\u0442\u0438 \u0432 %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "\u0412\u0456\u0434\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0438 \u0432\u0438\u0445\u0456\u0434\u043d\u0438\u0439 \u0442\u0435\u043a\u0441\u0442",
+ "Table of Contents": "",
+ "This Page": "\u0426\u044f \u0441\u0442\u043e\u0440\u0456\u043d\u043a\u0430",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "\u0432\u0441\u0456 \u0444\u0443\u043d\u043a\u0446\u0456\u0457, \u043a\u043b\u0430\u0441\u0438, \u0442\u0435\u0440\u043c\u0456\u043d\u0438",
+ "can be huge": "\u043c\u043e\u0436\u0435 \u0431\u0443\u0442\u0438 \u0432\u0435\u043b\u0438\u0447\u0435\u0437\u043d\u0438\u043c",
+ "last updated": "",
+ "lists all sections and subsections": "\u043f\u0435\u0440\u0435\u043b\u0456\u0447\u0438\u0442\u0438 \u0432\u0441\u0456 \u0441\u0435\u043a\u0446\u0456\u0457 \u0442\u0430 \u043f\u0456\u0434\u0441\u0435\u043a\u0446\u0456\u0457",
+ "next chapter": "\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0438\u0439 \u0440\u043e\u0437\u0434\u0456\u043b",
+ "previous chapter": "\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u0440\u043e\u0437\u0434\u0456\u043b",
+ "quick access to all modules": "\u0448\u0432\u0438\u0434\u043a\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e \u0432\u0441\u0456\u0445 \u043c\u043e\u0434\u0443\u043b\u0456\u0432",
+ "search": "\u043f\u043e\u0448\u0443\u043a",
+ "search this documentation": "\u0448\u0443\u043a\u0430\u0442\u0438 \u0446\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0456\u044e",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..25db69e
--- /dev/null
+++ 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
new file mode 100644
index 0000000..4da497a
--- /dev/null
+++ b/sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Petro Sasnyk <petro@sasnyk.name>, 2009
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 14:58+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Petro Sasnyk <petro@sasnyk.name>, 2009\n"
+"Language-Team: Ukrainian (Ukraine) (http://app.transifex.com/sphinx-doc/sphinx-1/language/uk_UA/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: uk_UA\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:155
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Вбудовані елементи"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Рівень модулÑ"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:163 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:158
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:176
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (в "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%b %d, %Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Загальний індекÑ"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "індекÑ"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "наÑтупний"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "попередній"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "ІндекÑ"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "Реліз"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Ðвтор Ñекції: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Ðвтор модулÑ: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Ðвтор: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Параметри"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Повертає"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Тип поверненнÑ"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "член"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "функціÑ"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "макроÑ"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "тип"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Ðове в верÑÑ–Ñ— %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Змінено в верÑÑ–Ñ— %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "ЗаÑтаріло починаючи з верÑÑ–Ñ— %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "клаÑ"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (вбудована функціÑ)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s метод)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (клаÑ)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s атрибут)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (модуль)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "атрибут"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "модуль"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "Викликає"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (в модулі %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (в модулі %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (вбудована змінна)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (вбудований клаÑ)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (ÐºÐ»Ð°Ñ Ð² %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s Ñтатичний метод)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "модулі"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "ЗаÑтарілий"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "винÑткова ÑитуаціÑ"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "Ñтатичний метод"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr " (заÑтарілий)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "змінна оточеннÑ; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "змінна оточеннÑ"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "Ð†Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð´ÑƒÐ»Ñ–Ð²"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "Сторінка пошуку"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Доробити"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Увага"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "ЗаÑтереженнÑ"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Ðебезпека"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Помилка"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Підказка"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Важливо"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Примітка"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "ДивиÑÑŒ також"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Порада"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "ПопередженнÑ"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Пошук"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Вперед"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Відобразити вихідний текÑÑ‚"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "ОглÑд"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Ð†Ð½Ð´ÐµÐºÑ &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ÐавігаціÑ"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Шукати в %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "Про ці документи"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "ÐвторÑькі права"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "ВоÑтаннє оновлено %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Пошук %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Попередній розділ"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "Попередній розділ"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "ÐаÑтупна тема"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "наÑтупний розділ"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Будь-лаÑка вімкніть підтримку JavaScript, щоб ввікнути\n\"\n\" пошук."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "пошук"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "Результати пошуку"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "Швидкий пошук"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "Приховати ÑÐ¿Ñ–Ð²Ð¿Ð°Ð´Ñ–Ð½Ð½Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/ur/LC_MESSAGES/sphinx.js b/sphinx/locale/ur/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..6154577
--- /dev/null
+++ b/sphinx/locale/ur/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "ur",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "(n != 1)"
+}); \ No newline at end of file
diff --git a/sphinx/locale/ur/LC_MESSAGES/sphinx.mo b/sphinx/locale/ur/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..d4cca4b
--- /dev/null
+++ b/sphinx/locale/ur/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/ur/LC_MESSAGES/sphinx.po b/sphinx/locale/ur/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..1703493
--- /dev/null
+++ b/sphinx/locale/ur/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Urdu (http://app.transifex.com/sphinx-doc/sphinx-1/language/ur/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: ur\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/vi/LC_MESSAGES/sphinx.js b/sphinx/locale/vi/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..c66cf85
--- /dev/null
+++ b/sphinx/locale/vi/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "vi",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "V\u1ec1 c\u00e1c t\u00e0i li\u1ec7u n\u00e0y",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "M\u1ee5c L\u1ee5c \u0110\u1ea7y \u0110\u1ee7",
+ "Contents": "N\u1ed9i dung",
+ "Copyright": "B\u1ea3n quy\u1ec1n",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "To\u00e0n b\u1ed9 ch\u1ec9 m\u1ee5c tr\u00ean m\u1ed9t trang",
+ "General Index": "Ch\u1ec9 m\u1ee5c chung",
+ "Global Module Index": "Ch\u1ec9 M\u1ee5c M\u00f4-\u0111un To\u00e0n C\u1ee5c",
+ "Go": "Th\u1ef1c hi\u1ec7n",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "Ch\u1ec9 m\u1ee5c &ndash; %(key)s",
+ "Index pages by letter": "C\u00e1c trang ch\u1ec9 m\u1ee5c theo ch\u1eef c\u00e1i",
+ "Indices and tables:": "C\u00e1c ch\u1ec9 m\u1ee5c v\u00e0 b\u1ea3ng bi\u1ec3u:",
+ "Last updated on %(last_updated)s.": "C\u1eadp nh\u1eadt m\u1edbi nh\u1ea5t v\u00e0o %(last_updated)s.",
+ "Library changes": "",
+ "Navigation": "\u0110i\u1ec1u h\u01b0\u1edbng",
+ "Next topic": "Ch\u1ee7 \u0111\u1ec1 ti\u1ebfp",
+ "Other changes": "",
+ "Overview": "T\u1ed5ng quan",
+ "Please activate JavaScript to enable the search\n functionality.": "H\u00e3y b\u1eadt JavaScript \u0111\u1ec3 d\u00f9ng t\u00ednh n\u0103ng\nt\u00ecm ki\u1ebfm.",
+ "Preparing search...": "",
+ "Previous topic": "Ch\u1ee7 \u0111\u1ec1 tr\u01b0\u1edbc",
+ "Quick search": "",
+ "Search": "T\u00ecm Ki\u1ebfm",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "T\u00ecm ki\u1ebfm trong %(docstitle)s",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "Hi\u1ec3n th\u1ecb m\u00e3 ngu\u1ed3n",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "Ch\u00e0o m\u1eebng! \u0110\u00e2y l\u00e0",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "t\u1ea5t c\u1ea3 c\u00e1c h\u00e0m, l\u1edbp, thu\u1eadt ng\u1eef",
+ "can be huge": "c\u00f3 th\u1ec3 r\u1ea5t nhi\u1ec1u",
+ "last updated": "c\u1eadp nh\u1eadt m\u1edbi nh\u1ea5t",
+ "lists all sections and subsections": "li\u1ec7t k\u00ea t\u1ea5t c\u1ea3 c\u00e1c m\u1ee5c v\u00e0 m\u1ee5c con",
+ "next chapter": "ch\u01b0\u01a1ng ti\u1ebfp",
+ "previous chapter": "ch\u01b0\u01a1ng tr\u01b0\u1edbc ",
+ "quick access to all modules": "truy c\u1eadp nhanh t\u1ea5t c\u1ea3 c\u00e1c m\u00f4-\u0111un",
+ "search": "",
+ "search this documentation": "t\u00ecm ki\u1ebfm trong t\u00e0i li\u1ec7u n\u00e0y",
+ "the documentation for": "t\u00e0i li\u1ec7u cho"
+ },
+ "plural_expr": "0"
+}); \ No newline at end of file
diff --git a/sphinx/locale/vi/LC_MESSAGES/sphinx.mo b/sphinx/locale/vi/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..d61d81f
--- /dev/null
+++ b/sphinx/locale/vi/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/vi/LC_MESSAGES/sphinx.po b/sphinx/locale/vi/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..b93c565
--- /dev/null
+++ b/sphinx/locale/vi/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3695 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Hoat Le Van <hoatlevan@gmail.com>, 2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Hoat Le Van <hoatlevan@gmail.com>, 2014\n"
+"Language-Team: Vietnamese (http://app.transifex.com/sphinx-doc/sphinx-1/language/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Các đỠnghị nâng cao Python; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "Dựng sẵn"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "Mức mô-đun"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr "(trong"
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%d/%m/%Y"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "Chỉ mục chung"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "chỉ mục"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "xem tiếp"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "xem lại"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "Tài liệu %s %s"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "Tác giả mục:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "Tác giả mô-đun:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "Tác giả mã lệnh:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "Tác giả:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "Tham số"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "Trả vá»"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "Kiểu trả vá»"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "thuộc tính"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "biến"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "hàm"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "macro"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "kiểu"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "Mới từ phiên bản %s"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "Thay đổi trong phiên bản %s"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "Sắp loại bỠtừ phiên bản %s"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "Ném"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "lá»›p"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (hàm dựng sẵn)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (phương thức %s)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (lá»›p)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (biến toàn cục hoặc hằng số)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (thuộc tính %s)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "Äối số"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (mô-đun)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "phương thức"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "dữ liệu"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "thuộc tính"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "mô-đun"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "Các biến"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "ÄÆ°a ra"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (trong mô-đun %s)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (trong mô-đun %s)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (biến dựng sẵn)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (lớp dựng sẵn)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (lá»›p trong %s)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (phương thức lớp %s)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (phương thức tĩnh %s)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Chỉ Mục Mô-đun Python"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "các mô-đun"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "Sắp loại bá»"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "ngoại lệ"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "phương thức lớp"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "phương thức tĩnh"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr "(sắp loại bá»)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (chỉ thị)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (vai trò)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "chỉ thị"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "vai trò"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "các biến môi trÆ°á»ng; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "chú giải thuật ngữ"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "xem %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "nên xem %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "Biểu tượng"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "Các ví dụ"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "Chú ý"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "Cảnh báo"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "Nguy hiểm"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "Lá»—i"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "Gợi ý"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "Quan trá»ng"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "Ghi chú"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "Xem thêm"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "Mẹo"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "Cảnh báo"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "Tìm Kiếm"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "Thực hiện"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "Hiển thị mã nguồn"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "Tổng quan"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "Chào mừng! Äây là"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "tài liệu cho"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+msgstr "cập nhật mới nhất"
+
+#: sphinx/themes/basic/defindex.html:20
+msgid "Indices and tables:"
+msgstr "Các chỉ mục và bảng biểu:"
+
+#: sphinx/themes/basic/defindex.html:23
+msgid "Complete Table of Contents"
+msgstr "Mục Lục Äầy Äủ"
+
+#: sphinx/themes/basic/defindex.html:24
+msgid "lists all sections and subsections"
+msgstr "liệt kê tất cả các mục và mục con"
+
+#: sphinx/themes/basic/defindex.html:26
+msgid "search this documentation"
+msgstr "tìm kiếm trong tài liệu này"
+
+#: sphinx/themes/basic/defindex.html:28
+msgid "Global Module Index"
+msgstr "Chỉ Mục Mô-đun Toàn Cục"
+
+#: sphinx/themes/basic/defindex.html:29
+msgid "quick access to all modules"
+msgstr "truy cập nhanh tất cả các mô-đun"
+
+#: sphinx/themes/basic/defindex.html:31
+msgid "all functions, classes, terms"
+msgstr "tất cả các hàm, lớp, thuật ngữ"
+
+#: sphinx/themes/basic/genindex-single.html:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "Chỉ mục &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+msgid "Full index on one page"
+msgstr "Toàn bộ chỉ mục trên một trang"
+
+#: sphinx/themes/basic/genindex-split.html:16
+msgid "Index pages by letter"
+msgstr "Các trang chỉ mục theo chữ cái"
+
+#: sphinx/themes/basic/genindex-split.html:25
+msgid "can be huge"
+msgstr "có thể rất nhiá»u"
+
+#: sphinx/themes/basic/layout.html:26
+msgid "Navigation"
+msgstr "Äiá»u hÆ°á»›ng"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "Tìm kiếm trong %(docstitle)s"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "VỠcác tài liệu này"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "Bản quyá»n"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "Cập nhật mới nhất vào %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr "Tìm %(docstitle)s"
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr "Chủ đỠtrước"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "chÆ°Æ¡ng trÆ°á»›c "
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "Chủ đỠtiếp"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "chương tiếp"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "Hãy bật JavaScript để dùng tính năng\ntìm kiếm."
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "Ná»™i dung"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/yue/LC_MESSAGES/sphinx.js b/sphinx/locale/yue/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..4ca1190
--- /dev/null
+++ b/sphinx/locale/yue/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "yue",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "0"
+}); \ No newline at end of file
diff --git a/sphinx/locale/yue/LC_MESSAGES/sphinx.mo b/sphinx/locale/yue/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..f3be5d8
--- /dev/null
+++ b/sphinx/locale/yue/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/yue/LC_MESSAGES/sphinx.po b/sphinx/locale/yue/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..41004d1
--- /dev/null
+++ b/sphinx/locale/yue/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Cantonese (http://app.transifex.com/sphinx-doc/sphinx-1/language/yue/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: yue\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..59f9b0f
--- /dev/null
+++ b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "zh_Hans_CN",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "&#169; %(copyright_prefix)s %(copyright)s.",
+ ", in ": "\uff0c\u5728 ",
+ "About these documents": "\u5173\u4e8e\u6b64\u6587\u6863",
+ "Automatically generated list of changes in version %(version)s": "\u81ea\u52a8\u751f\u6210\u7684 %(version)s \u7248\u672c\u53d8\u66f4\u5217\u8868",
+ "C API changes": "C API \u7684\u53d8\u66f4",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u4e8e\u7248\u672c %(version)s&#8212; %(docstitle)s \u53d8\u66f4",
+ "Collapse sidebar": "\u6298\u53e0\u8fb9\u680f",
+ "Complete Table of Contents": "\u5b8c\u6574\u76ee\u5f55",
+ "Contents": "\u76ee\u5f55",
+ "Copyright": "\u7248\u6743\u6240\u6709",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "\u7531 <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s\u521b\u5efa\u3002",
+ "Expand sidebar": "\u5c55\u5f00\u8fb9\u680f",
+ "Full index on one page": "\u5355\u9875\u5168\u7d22\u5f15",
+ "General Index": "\u603b\u7d22\u5f15",
+ "Global Module Index": "\u5168\u5c40\u6a21\u5757\u7d22\u5f15",
+ "Go": "\u63d0\u4ea4",
+ "Hide Search Matches": "\u9690\u85cf\u641c\u7d22\u7ed3\u679c",
+ "Index": "\u7d22\u5f15",
+ "Index &ndash; %(key)s": "\u7d22\u5f15 &ndash; %(key)s",
+ "Index pages by letter": "\u5b57\u6bcd\u7d22\u5f15",
+ "Indices and tables:": "\u7d22\u5f15\u548c\u8868\u683c\uff1a",
+ "Last updated on %(last_updated)s.": "\u6700\u540e\u66f4\u65b0\u4e8e %(last_updated)s.",
+ "Library changes": "\u5e93\u7684\u53d8\u66f4",
+ "Navigation": "\u5bfc\u822a",
+ "Next topic": "\u4e0b\u4e00\u4e3b\u9898",
+ "Other changes": "\u5176\u4ed6\u53d8\u66f4",
+ "Overview": "\u6982\u8ff0",
+ "Please activate JavaScript to enable the search\n functionality.": "\u8bf7\u6fc0\u6d3b JavaScript \u4ee5\u5f00\u542f\u641c\u7d22\u529f\u80fd\u3002",
+ "Preparing search...": "\u6b63\u5728\u51c6\u5907\u641c\u7d22\u2026\u2026",
+ "Previous topic": "\u4e0a\u4e00\u4e3b\u9898",
+ "Quick search": "\u5feb\u901f\u641c\u7d22",
+ "Search": "\u641c\u7d22",
+ "Search Page": "\u641c\u7d22\u9875\u9762",
+ "Search Results": "\u641c\u7d22\u7ed3\u679c",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "\u641c\u7d22\u5b8c\u6210\uff0c\u5339\u914d\u5230 ${resultCount} \u9875\u3002",
+ "Search within %(docstitle)s": "\u5728 %(docstitle)s \u4e2d\u641c\u7d22",
+ "Searching": "\u6b63\u5728\u641c\u7d22\u4e2d",
+ "Searching for multiple words only shows matches that contain\n all words.": "\u5f53\u641c\u7d22\u591a\u4e2a\u5173\u952e\u8bcd\u65f6\uff0c\u53ea\u4f1a\u663e\u793a\u540c\u65f6\u5305\u542b\u6240\u6709\u5173\u952e\u8bcd\u7684\u5185\u5bb9\u3002",
+ "Show Source": "\u663e\u793a\u6e90\u4ee3\u7801",
+ "Table of Contents": "\u76ee\u5f55",
+ "This Page": "\u672c\u9875",
+ "Welcome! This is": "\u6b22\u8fce\uff01",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u60a8\u7684\u641c\u7d22\u6ca1\u6709\u5339\u914d\u5230\u6587\u6863\u3002\u8bf7\u786e\u4fdd\u5173\u952e\u8bcd\u62fc\u5199\u6b63\u786e\uff0c\u5e76\u4e14\u9009\u62e9\u4e86\u5408\u9002\u7684\u5206\u7c7b\u3002",
+ "all functions, classes, terms": "\u6240\u6709\u51fd\u6570\u3001\u7c7b\u3001\u672f\u8bed\u8bcd\u6c47",
+ "can be huge": "\u53ef\u80fd\u4f1a\u5927",
+ "last updated": "\u6700\u540e\u66f4\u65b0\u4e8e",
+ "lists all sections and subsections": "\u5217\u51fa\u6240\u6709\u7684\u7ae0\u8282\u548c\u90e8\u5206",
+ "next chapter": "\u4e0b\u4e00\u7ae0",
+ "previous chapter": "\u4e0a\u4e00\u7ae0",
+ "quick access to all modules": "\u5feb\u901f\u67e5\u770b\u6240\u6709\u7684\u6a21\u5757",
+ "search": "\u641c\u7d22",
+ "search this documentation": "\u641c\u7d22\u6587\u6863",
+ "the documentation for": "\u672c\u6587\u6863\u5c5e\u4e8e"
+ },
+ "plural_expr": "0"
+}); \ 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
new file mode 100644
index 0000000..59cc9ef
--- /dev/null
+++ 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
new file mode 100644
index 0000000..6f45eca
--- /dev/null
+++ b/sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3712 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Adam Turner, 2023
+# Yinian Chin <yinian1992@live.com>, 2015,2017-2018
+# Hsiaoming Yang <me@lepture.com>, 2018
+# Izabel Wang <izabelwang@pku.edu.cn>, 2020
+# Izabel Wang <izabelwang@pku.edu.cn>, 2020
+# Jian Dai <daijian1@qq.com>, 2020
+# JY3, 2022
+# Nomaka <nomakacyx@gmail.com>, 2018
+# Lenville Leo <lenville@gmail.com>, 2013
+# Lenville Leo <lenville@gmail.com>, 2013
+# Lu <lu2github@gmail.com>, 2022-2023
+# Nomaka <nomakacyx@gmail.com>, 2018,2022
+# Ryekee Zhong <ryekee@gmail.com>, 2013
+# Komiya Takeshi <i.tkomiya@gmail.com>, 2019,2021-2022
+# Tower Joo<zhutao.iscas@gmail.com>, 2009
+# wendi cao <651645601@qq.com>, 2020
+# Yinian Chin <yinian1992@live.com>, 2013,2018,2020,2022-2023
+# Yinian Chin <yinian1992@live.com>, 2013
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Adam Turner, 2023\n"
+"Language-Team: Chinese (China) (http://app.transifex.com/sphinx-doc/sphinx-1/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "无法找到æºæ–‡ä»¶ç›®å½•ï¼ˆ%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "输出目录(%s)ä¸æ˜¯ä¸€ä¸ªç›®å½•"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "æºæ–‡ä»¶ç›®å½•å’Œç›®æ ‡ç›®å½•ä¸èƒ½æ˜¯åŒä¸€ç›®å½•"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "正在è¿è¡Œ Sphinx v%s"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "è¯¥é¡¹ç›®éœ€è¦ Sphinx v%s åŠä»¥ä¸Šç‰ˆæœ¬ï¼Œå½“å‰ä½¿ç”¨ç‰ˆæœ¬ä¸èƒ½æž„建此文档。"
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "正在创建输出目录"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "在设置扩展å %s 时:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "å½“å‰ conf.py 中定义的 'setup' ä¸æ˜¯ä¸€ä¸ª Python çš„å¯è°ƒç”¨å¯¹è±¡ã€‚请修改其定义为一个å¯è°ƒç”¨çš„函数。当 conf.py 作为 Sphinx 扩展时,必须ä¾æ­¤é…置。"
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "正在加载翻译 [%s]…"
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "完æˆ"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "没有找到内置信æ¯çš„译文"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "正在加载 Pickle åºåˆ—化的环境"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "失败:%s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "未选择构建器,默认使用:html"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "æˆåŠŸ"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "完æˆä½†å­˜åœ¨é—®é¢˜"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "构建%s,%s æ¡è­¦å‘Šï¼ˆå°†è­¦å‘Šè§†ä¸ºé”™è¯¯ï¼‰ã€‚"
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "构建%s,%s æ¡è­¦å‘Šï¼ˆå°†è­¦å‘Šè§†ä¸ºé”™è¯¯ï¼‰ã€‚"
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "构建%s, %s æ¡è­¦å‘Šã€‚"
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "构建%s,%s æ¡è­¦å‘Šã€‚"
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "构建%s。"
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "节点类 %r å·²ç»æ³¨å†Œè¿‡äº†ï¼Œå…¶è®¿é—®è€…将被覆盖"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "指令 %r å·²ç»æ³¨å†Œè¿‡äº†ï¼Œå°†è¢«è¦†ç›–"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "角色 %r å·²ç»æ³¨å†Œè¿‡äº†ï¼Œå°†è¢«è¦†ç›–"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "扩展 %s 没有声明是å¦å¹¶è¡Œè¯»å–安全,默认å‡å®šä¸ºå¦â€”请è”系扩展作者检查是å¦æ”¯æŒè¯¥ç‰¹æ€§å¹¶æ˜¾å¼å£°æ˜Ž"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "扩展 %s ä¸æ˜¯å¹¶è¡Œè¯»å–安全的"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s 扩展没有声明是å¦å¹¶è¡Œå†™å…¥å®‰å…¨ï¼Œé»˜è®¤å‡å®šä¸ºå¦â€”请è”系扩展作者检查是å¦æ”¯æŒè¯¥ç‰¹æ€§å¹¶æ˜¾å¼å£°æ˜Ž"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "扩展 %s ä¸æ˜¯å¹¶è¡Œå†™å…¥å®‰å…¨çš„"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "执行串行 %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "é…置目录中缺少 conf.py 文件(%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "å‘现无效的é…置值:“language = Noneâ€ã€‚请修改为有效的语言代ç ã€‚回退至“enâ€ï¼ˆè‹±è¯­ï¼‰ã€‚"
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "ä¸èƒ½è¦†ç›–å­—å…¸é…置项 %r,已忽略 (请用 %r æ–¹å¼é€ä¸€ä¿®æ”¹å­—å…¸æˆå‘˜ï¼‰"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "%r ä¸æ˜¯æœ‰æ•ˆæ•´æ•°ï¼Œé…置项 %r 的值åªèƒ½æ˜¯æ•´æ•°ï¼Œå·²å¿½ç•¥"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "无法用ä¸æ”¯æŒçš„类型覆盖é…置项 %r,已忽略"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "é…置覆盖中包å«æœªçŸ¥çš„é…置项 %r,已忽略"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "ä¸å­˜åœ¨æ­¤é…置项:%s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "é…置项 %r 已存在"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "é…置文件中存在语法错误:%s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "é…置文件(或é…置文件导入的模å—)调用了 sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "é…置文件中有程åºä¸Šçš„错误:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "é…置项“source_suffixâ€çš„值应为字符串ã€å­—符串列表或字典。但给定的值是“%râ€ã€‚"
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "节 %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "图 %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "表 %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "列表 %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "é…置项“{name}â€çš„值åªèƒ½åœ¨â€œ{candidates}â€ä¸­é€‰å–,而当å‰ç»™å®šçš„值是“{current}â€ã€‚"
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "é…置项“{name}â€çš„值被é…ç½®æˆâ€œ{current.__name__}â€ç±»åž‹ï¼Œåº”为{permitted}。"
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "é…置项“{name}â€çš„值被é…ç½®æˆâ€œ{current.__name__}â€ç±»åž‹ï¼Œé»˜è®¤ä¸ºâ€œ{default.__name__}â€ã€‚"
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "primary_domain %r ä¸å­˜åœ¨ï¼Œå·²å¿½ç•¥ã€‚"
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "自 v2.0 起,Sphinx 采用“indexâ€ä½œä¸º root_doc 的默认值。请在你的 conf.py 中添加“root_doc = 'contents'â€ã€‚"
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "事件 %r 已存在"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "未知的事件å称:%s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "事件处ç†å‡½æ•° %r 在处ç†äº‹ä»¶ %r 时抛出了异常"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "未能加载 needs_extensions é…置项指定的 %s 扩展。"
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "该项目è¦æ±‚扩展 %s 至少是 %s 版本,当å‰åŠ è½½ç‰ˆæœ¬ï¼ˆ%s)无法构建文档。"
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "未知的 Pygments è¯æ³•åˆ†æžå™¨ %r"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "å‘现多个文件对应文档“%sâ€ï¼š%r\n将采用 %r 用于构建。"
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "构建器 %s 未包å«â€œnameâ€å±žæ€§"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "构建器 %r 已存在(è§æ¨¡å— %s)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "构建器 %s 未注册或在入å£ç‚¹ä¸å¯ç”¨"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "构建器 %s 未注册"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "域 %s å·²ç»æ³¨å†Œè¿‡äº†"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "域 %s 未注册"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "指令 %r å·²ç»åœ¨åŸŸ %s 上注册过了"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "角色 %r å·²ç»åœ¨åŸŸ %s 上注册过了"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "索引 %r å·²ç»åœ¨åŸŸ %s 上注册过了"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "对象类型 %r å·²ç»æ³¨å†Œè¿‡äº†"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "交å‰å¼•ç”¨ç±»åž‹ %r å·²ç»æ³¨å†Œè¿‡äº†"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "æºæ–‡ä»¶æ‰©å±•å %r å·²ç»æ³¨å†Œè¿‡äº†"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "%r çš„æºæ–‡ä»¶è§£æžå™¨å·²ç»æ³¨å†Œè¿‡äº†"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "未注册 %s çš„æºä»£ç è¯­æ³•åˆ†æžå™¨"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "翻译器已存在 %r"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "add_node() 的关键字å‚数必须是 (visit, depart) å½¢å¼çš„函数元组:%r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "å¯æžšä¸¾èŠ‚点 %r å·²ç»æ³¨å†Œè¿‡äº†"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "å…¬å¼æ¸²æŸ“器 %s å·²ç»æ³¨å†Œè¿‡äº†"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "扩展 %r 自 Sphinx %s 版本起åˆå¹¶è‡³ Sphinx;因此,该扩展被忽略。"
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "原始异常:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "无法导入扩展 %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "扩展 %r 缺少 setup() 函数;它确实是一个 Sphinx 扩展模å—å—?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "该项目所用扩展 %s éœ€è¦ Sphinx %s 或以上版本;当å‰ç‰ˆæœ¬æ— æ³•æž„建文档。"
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "扩展 %r 在其 setup() 函数中返回了一个ä¸æ”¯æŒçš„对象;该函数应返回 None 或一个元数æ®å­—å…¸"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python 增强建议;PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "无效的 PEP ç¼–å·%s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "无效的 RFC ç¼–å· %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "主题 %r 未包å«â€œthemeâ€é…置项"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "主题 %r 未包å«â€œinheritâ€é…置项"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "未找到主题 %r;由于 %r 继承了它,无法继续。"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "所有已找到的主题é…ç½®å‡æœªåŒ…å«é…置项 %s.%s"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "ä¸æ”¯æŒçš„主题选项 %r"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "主题路径对应的文件 %r 是一个无效的或ä¸åŒ…å«ä¸»é¢˜çš„ zip 文件"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "未找到主题 %r(å¯èƒ½æ˜¯å› ä¸ºç¼ºå°‘ theme.conf)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "æ²¡æœ‰æ‰¾åˆ°é€‚åˆ %s 构建器的图åƒï¼š%s(%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "æ²¡æœ‰æ‰¾åˆ°é€‚åˆ %s 构建器的图åƒï¼š%s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "正在构建 [mo]: "
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "正在写入输出……"
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "所有的 %d po 文件"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "指定了 %d 个 po 文件的目标文件"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "%d 个 po 文件的目标文件已过期"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "所有æºæ–‡ä»¶"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "命令行给定的文件 %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "æºæ–‡ä»¶ç›®å½•ä¸­ä¸å­˜åœ¨å‘½ä»¤è¡Œç»™å®šçš„文件 %r,将被忽略"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "命令行给定的文件 %r ä¸æ˜¯æœ‰æ•ˆæ–‡æ¡£ï¼Œå°†è¢«å¿½ç•¥"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "命令行给定了 %d 个æºæ–‡ä»¶"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "%d 个æºæ–‡ä»¶çš„目标文件已过期"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "正在构建 [%s]: "
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "正在查找当å‰å·²è¿‡æœŸçš„文件……"
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "找到 %d 个已过期文件"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "没有找到已过期文件"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "正在 Pickle åºåˆ—化环境"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "正在校验一致性"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "没有过期的目标文件。"
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "正在更新环境:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "有 %s 个新增文件,有 %s 个文件已被修改,有 %s 个文件已被移除"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "正在读å–æºæ–‡ä»¶â€¦â€¦"
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "待写入文档å称:%s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr "正在准备写入文档"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr "正在å¤åˆ¶èµ„产文件"
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "å‘现é‡å¤çš„目录æ¡ç›®ï¼š%s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "正在å¤åˆ¶å›¾åƒæ–‡ä»¶â€¦â€¦"
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "无法读å–图åƒæ–‡ä»¶ %r:改为直接å¤åˆ¶"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "无法å¤åˆ¶å›¾åƒæ–‡ä»¶ %r:%s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "无法写入图åƒæ–‡ä»¶ %r:%s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "未找到 Pillow - 正在å¤åˆ¶å›¾åƒæ–‡ä»¶"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "正在写入 mimetype 文件……"
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "正在写入 META-INF/container.xml 文件……"
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "正在写入 content.opf 文件……"
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "%s 的 MIME 类型未知,已忽略"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "正在写入 toc.ncx 文件……"
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "正在写入 %s 文件……"
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "概览文件ä¿å­˜åœ¨ %(outdir)s 目录 。"
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "%s 版本中没有åšå‡ºä¿®æ”¹ã€‚"
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "正在写入摘è¦æ–‡ä»¶â€¦â€¦"
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "内置模å—"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "模å—级"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "正在å¤åˆ¶æºæ–‡ä»¶â€¦â€¦"
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "无法读å–用于创建å˜æ›´è®°å½•çš„ %r"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "伪构建器ä¸ç”Ÿæˆæ–‡ä»¶ã€‚"
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "ePub 文件ä¿å­˜åœ¨ %(outdir)s。"
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "正在写入 nav.xhtml 文件……"
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_languageâ€ï¼ˆæˆ–“languageâ€ï¼‰çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_uidâ€çš„值应为 XML å称格å¼çš„字符串"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_titleâ€ï¼ˆæˆ–“html_titleâ€ï¼‰çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_authorâ€çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_contributorâ€çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_descriptionâ€çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_publisherâ€çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_copyrightâ€ï¼ˆæˆ–“copyrightâ€ï¼‰ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“epub_identifierâ€çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "对于 EPUB3 æ ¼å¼ï¼Œé…置项“versionâ€çš„值ä¸èƒ½ä¸ºç©º"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "无效的 css_file:%r,已忽略"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "消æ¯ç›®å½•ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "%d 个模æ¿æ–‡ä»¶çš„目标文件"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "正在读å–模æ¿â€¦â€¦"
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "正在写入消æ¯ç›®å½•... "
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "请在上述输出或 %(outdir)s/output.txt 中查找错误"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "æŸå的链接:%s(%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "无法编译 linkcheck_allowed_redirects é…置项中的正则表达å¼ï¼š%r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "手册页ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "未找到“man_pagesâ€é…置项,ä¸ä¼šå†™å…¥æ‰‹å†Œé¡µ"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "正在写入"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "é…置项“man_pagesâ€å¼•ç”¨çš„文档 %s ä¸å­˜åœ¨"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML 页é¢ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr "正在装é…æˆå•é¡µé¢æ–‡æ¡£"
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr "正在写入附加文件"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Texinfo 文件ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\n在该目录下è¿è¡Œâ€œmakeâ€å‘½ä»¤ä»¥é€šè¿‡ makeinfo 处ç†è¿™äº› Texinfo 文件\n(在此处用“make infoâ€å³å¯è‡ªåŠ¨æ‰§è¡Œä¸Šè¿°æ“作)。"
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "未找到“texinfo_documentsâ€é…置项,ä¸ä¼šå†™å…¥æ–‡æ¡£"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "é…置项“texinfo_documentsâ€å¼•ç”¨äº†æ–‡æ¡£ %s ä¸å­˜åœ¨"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "æ­£åœ¨å¤„ç† %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "正在解æžå¼•ç”¨â€¦â€¦"
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (在 "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "正在å¤åˆ¶ Texinfo 支æŒæ–‡ä»¶"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "写入 Makefile 文件时出错:%s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "文本文件ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "写入文件 %s æ—¶å‘生错误:%s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "XML 文件ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "伪 XML 文件ä¿å­˜åœ¨ %(outdir)s。"
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "构建信æ¯æ–‡ä»¶æŸå:%r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTML 页é¢ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "读å–构建信æ¯æ–‡ä»¶å¤±è´¥ï¼š%r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "总索引"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "下一页"
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "上一页"
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "正在生æˆç´¢å¼•"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "正在写入附加页é¢"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "正在å¤åˆ¶å¯ä¸‹è½½æ–‡ä»¶â€¦â€¦"
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "无法å¤åˆ¶å¯ä¸‹è½½æ–‡ä»¶ %r:%s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "无法å¤åˆ¶ html_static_file 中的文件:%s: %r"
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "正在å¤åˆ¶é™æ€æ–‡ä»¶"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "无法å¤åˆ¶é™æ€æ–‡ä»¶ %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "正在å¤åˆ¶é¢å¤–文件"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "无法å¤åˆ¶é¢å¤–文件 %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "写入构建信æ¯æ–‡ä»¶å¤±è´¥ï¼š%r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "无法加载æœç´¢ç´¢å¼•ï¼Œä¸ä¼šæž„建所有文档:索引将ä¸å®Œæ•´ã€‚"
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "é¡µé¢ %s åŒæ—¶ç¬¦åˆä¸¤æ¡ html_sidebars 规则:%r å’Œ %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "åœ¨æ¸²æŸ“é¡µé¢ %s æ—¶å‘生了 Unicode 错误。请确ä¿æ‰€æœ‰åŒ…å«éž ASCII 字符的é…置项å‡ä¸º Unicode 字符串。"
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "æ¸²æŸ“é¡µé¢ %s æ—¶å‘生了错误。\n原因:%r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "正在导出对象清å•"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "正在导出 %s çš„æœç´¢ç´¢å¼•"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "无效的 js_file:%r,已忽略"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "注册了多个 math_renderer,但没有选择 math_renderer。"
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "给定的 math_renderer %r ä¸å­˜åœ¨ã€‚"
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path å…¥å£ %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path å…¥å£ %r 被置于输出目录内"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path å…¥å£ %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path å…¥å£ %r 置于输出目录内"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "logo 文件 %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon 文件 %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr "Sphinx ä¸å†æ”¯æŒ HTML 4。(在é…置项中检测到了“html4_writer=Trueâ€ï¼‰"
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s 文档"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTex 文件ä¿å­˜åœ¨ %(outdir)s 目录。"
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\n在该目录下è¿è¡Œâ€œmakeâ€ä»¥é€šè¿‡ (pdf)latex 处ç†è¿™äº› LaTex 文件\n(在此处用“make latexpdfâ€å³å¯è‡ªåŠ¨æ‰§è¡Œä¸Šè¿°æ“作)。"
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "未找到“latex_documentsâ€é…置项,ä¸ä¼šå†™å…¥æ–‡æ¡£"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "é…置项“latex_documentsâ€å¼•ç”¨çš„文档 %s ä¸å­˜åœ¨"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "å‘行版本"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "æ²¡æœ‰è¯­ç§ %r çš„ Babel 选项"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "正在å¤åˆ¶ TeX 支æŒæ–‡ä»¶"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "正在å¤åˆ¶ TeX 支æŒæ–‡ä»¶â€¦â€¦"
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "正在å¤åˆ¶é™„加文件"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "未知é…置项:latex_elements[%r],已忽略。"
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "未知主题选项:latex_theme_options[%r],已忽略。"
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r 中缺少“themeâ€é…置项"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r 中缺少“%sâ€é…置项"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr "无法获å–文档å称ï¼"
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr "无法获å–文档æºç  {source!r} 的文档å称ï¼"
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr "给定的引用节点 %r 没有对应的脚注"
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "构建时抛出异常,正在å¯åŠ¨è°ƒè¯•å™¨ï¼š"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "已中断ï¼"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "reST 标记错误:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "ç¼–ç é”™è¯¯ï¼š"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "如果你想å‘å¼€å‘者报告问题,å¯ä»¥æŸ¥é˜…å·²ç»ä¿å­˜åœ¨ %s 的完整 Traceback ä¿¡æ¯ ã€‚"
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "递归错误:"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "Python 中默认递归层数上é™ä¸º 1000,å¯ä»¥åƒè¿™æ ·åœ¨ conf.py 中增大这一上é™ï¼Œè¯·è°¨æ…Žä¿®æ”¹:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "抛出异常:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "å³ä¾¿æŠ›å‡ºçš„错误时是用户导致的,也请å‘我们投递报告,以便将æ¥å¯ä»¥æ示更å‹å¥½ã€æ›´è¯¦ç»†çš„错误信æ¯ã€‚"
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "Bug 报告å¯ä»¥åœ¨ Bug 追踪系统 <https://github.com/sphinx-doc/sphinx/issues> 处投递。谢谢ï¼"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "并å‘任务数应为正值"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "想è¦äº†è§£æ›´å¤šä¿¡æ¯ï¼Œè¯·è®¿é—® <https://www.sphinx-doc.org/>。"
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\n从æºæ–‡ä»¶ç”Ÿæˆæ–‡æ¡£ã€‚\n\nsphinx-build 从 SOURCEDIR 中的文件生æˆæ–‡æ¡£ï¼Œå¹¶ä¿å­˜åœ¨ OUTPUTDIR。\n它从 SOURCEDIR 的“conf.pyâ€ä¸­è¯»å–é…置。“sphinx-quickstartâ€å·¥å…·å¯ä»¥ç”Ÿ\næˆåŒ…括“conf.pyâ€åœ¨å†…的模æ¿æ–‡ä»¶ã€‚\n\nsphinx-build å¯ä»¥ç”Ÿæˆå¤šç§æ ¼å¼çš„文档。在命令行中指定构建器å称å³å¯\n选择文档格å¼ï¼Œé»˜è®¤æ˜¯ HTML。构建器也å¯ä»¥æ‰§è¡Œæ–‡æ¡£å¤„ç†ç›¸å…³çš„其他\n任务。\n\n默认åªä¼šé‡æ–°æž„建过期内容。如果指定了文件å,那么åªä¼šäº§ç”Ÿè¿™äº›æ–‡ä»¶\n的输出。\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "文档æºæ–‡ä»¶çš„路径"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "输出目录的路径"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "指定é‡æ–°æž„建的文件列表。如果指定了 -a å‚数,则忽略此项"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "通用选项"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "构建器(默认:html)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "写入所有文件(默认:åªå†™å…¥æ–°æ–‡ä»¶å’Œä¿®æ”¹è¿‡çš„文件)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "ä¸ä½¿ç”¨å·²ä¿å­˜çš„环境,始终读å–全部文件"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "已缓存的环境和 doctree 文件路径(默认:OUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "如果å¯èƒ½ï¼Œç”¨ N 个进程并行构建文档(如果指定为“autoâ€ï¼Œåˆ™ N 为 CPU æ•°é‡ï¼‰"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "é…置文件(conf.py)所在目录路径(默认:与 SOURCEDIR 相åŒï¼‰"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "ä¸åº”用é…置文件中的é…置,åªè®© -D 选项中的é…置项生效。"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "覆盖é…置文件中的é…置项"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "å‘ HTML 模æ¿ä¼ å€¼"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "定义标签,把涉åŠæ ‡ç­¾ TAG 的“onlyâ€å—纳入到构建中"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "挑刺模å¼ï¼Œåœ¨å¼•ç”¨äº†ä¸å­˜åœ¨çš„内容时å‘出警告"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "控制å°è¾“出选项"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "输出更详细的日志(甚至å¯èƒ½é‡å¤ï¼‰"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "ä¸è¾“出到 stdout,åªåœ¨ stderr 上输出警告"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "无任何输出,甚至ä¸ä¼šè¾“出警告"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "ç€è‰²è¾“出(默认:自动检测)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "ä¸ç€è‰²è¾“出(默认:自动检测)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "把警告(以åŠé”™è¯¯ï¼‰ä¿¡æ¯å†™å…¥ç»™å®šçš„文件"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "把警告视为错误"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "与 -W é…åˆä½¿ç”¨ï¼Œåœ¨å‘出警告时继续è¿è¡Œ"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "å‘生异常时显示完整回溯信æ¯"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "å‘生异常时è¿è¡Œ Pdb"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "-a 选项和文件åä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "无法打开用于ä¿å­˜è­¦å‘Šä¿¡æ¯çš„文件 %r:%s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-D 选项的å‚数必须是 name=value å½¢å¼"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-A 选项的å‚数必须是 name=value å½¢å¼"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "自动æ’入模å—中的文档字符串"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "自动è¿è¡Œ doctest å—中的测试代ç ç‰‡æ®µ"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "链接ä¸åŒé¡¹ç›®çš„ Sphinx 文档"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "编写在构建时å¯ä»¥é€‰æ‹©æ˜¾ç¤ºã€éšè—的“todoâ€æ¡ç›®"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "检查文档覆盖率"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "支æŒæ•°å­¦å…¬å¼ï¼Œæ¸²æŸ“æˆ PNG 或 SVG 图åƒ"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "支æŒæ•°å­¦å…¬å¼ï¼Œç”¨ MathJax 在æµè§ˆå™¨ä¸­æ¸²æŸ“"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "基于é…置值控制构建中包å«å“ªäº›æ–‡æ¡£å†…容"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "支æŒé“¾æŽ¥åˆ°æ–‡æ¡£æ¶‰åŠçš„ Python 对象æºç "
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "创建 .nojekyll 文件,用于在 GitHub Pages æœåŠ¡å‘布文档"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "请输入有效的路径å。"
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "请输入文本。"
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "请输入 %s 之一。"
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "请输入“yâ€æˆ–“nâ€ã€‚"
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "请输入文件åŽç¼€ï¼Œä¾‹å¦‚:“.rstâ€æˆ–者“.txtâ€ã€‚"
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "欢迎使用 Sphinx %s 快速é…置工具。"
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "请输入接下æ¥å„项设定的值(如果方括å·ä¸­æŒ‡å®šäº†é»˜è®¤å€¼ï¼Œç›´æŽ¥\n按回车å³å¯ä½¿ç”¨é»˜è®¤å€¼ï¼‰ã€‚"
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "已选择根路径:%s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "输入文档的根路径。"
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "文档的根路径"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "错误:选择的根路径中已存在 conf.py 文件。"
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart ä¸ä¼šè¦†ç›–已有的 Sphinx 项目。"
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "请输入新的根路径(或按回车退出)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "有两ç§æ–¹å¼æ¥è®¾ç½®ç”¨äºŽæ”¾ç½® Sphinx 输出的构建目录:\n一是在根路径下创建“_buildâ€ç›®å½•ï¼ŒäºŒæ˜¯åœ¨æ ¹è·¯å¾„下创建“sourceâ€\n和“buildâ€ä¸¤ä¸ªç‹¬ç«‹çš„目录。"
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "独立的æºæ–‡ä»¶å’Œæž„建目录(y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "这个选项将在根目录中创建两个新目录:\n“_templatesâ€ç”¨äºŽæ”¾ç½®è‡ªå®šä¹‰ HTML 模æ¿æ–‡ä»¶ï¼Œâ€œ_staticâ€ç”¨äºŽè‡ªå®šä¹‰æ ·\nå¼è¡¨åŠå…¶ä»–é™æ€æ–‡ä»¶ã€‚您å¯ä»¥è¾“入其他的å‰ç¼€ï¼ˆæ¯”如“.â€ï¼‰ä»£æ›¿ä¸‹åˆ’线。"
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "模æ¿ç›®å½•å’Œé™æ€ç›®å½•çš„å称å‰ç¼€"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "项目å称将会出现在文档的许多地方。"
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "项目å称"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "作者å称"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "在 Sphinx 中,会区分“版本â€å’Œâ€œå‘行版本â€ä¸¤ä¸ªæ¦‚念。åŒä¸€ç‰ˆæœ¬å¯ä»¥\n有多个å‘行版本。例如,Python 版本å¯ä»¥æ˜¯ 2.5 或 3.0,而å‘行版\n本则是 2.5.1 或 3.0a1。如果你ä¸éœ€è¦è¿™æ ·çš„åŒé‡ç‰ˆæœ¬ç»“构,请把这\n两个选项设置为相åŒå€¼ã€‚"
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "项目版本"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "项目å‘行版本"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "如果用英语以外的语言编写文档,\nä½ å¯ä»¥åœ¨æ­¤æŒ‰è¯­è¨€ä»£ç é€‰æ‹©è¯­ç§ã€‚\nSphinx 会把内置文本翻译æˆç›¸åº”语言的版本。\n\n支æŒçš„语言代ç åˆ—表è§ï¼š\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language。"
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "项目语ç§"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "æºæ–‡ä»¶çš„文件ååŽç¼€ã€‚一般是“.txtâ€æˆ–“.rstâ€ã€‚åªæœ‰æ­¤åŽç¼€çš„文件æ‰ä¼š\n被视为文档的æºæ–‡ä»¶ã€‚"
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "æºæ–‡ä»¶åŽç¼€"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "有一ç§ç‰¹æ®Šçš„文档被视作“目录树â€çš„树顶节点,å³æ–‡æ¡£å±‚级结构的\n根。通常情况下,这个文档是“indexâ€ï¼Œä½†æ˜¯å¦‚果你的“indexâ€æ–‡æ¡£\n使用了自定义模æ¿ï¼Œä½ ä¹Ÿå¯ä»¥ä½¿ç”¨å…¶å®ƒæ–‡ä»¶å。"
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "主文档文件å(ä¸å«åŽç¼€ï¼‰"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "错误:选择的根目录下已存在主文档文件 %s。"
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart ä¸ä¼šè¦†ç›–已有的文件。"
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "请输入新文件å,若è¦é‡å‘½å现有文件请按回车"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "指出下列 Sphinx 扩展中,需è¦å¯ç”¨çš„有哪些:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "注æ„:imgmath å’Œ mathjax ä¸èƒ½åŒæ—¶å¯ç”¨ã€‚å·²å–消选择 imgmath。"
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "ç”Ÿæˆ Makefile å’Œ Windows 批处ç†æ–‡ä»¶ï¼Œå¯ä»¥ç›´æŽ¥åƒâ€œmake htmlâ€è¿™æ ·\nè¿è¡Œï¼Œè€Œä¸éœ€è¦ç›´æŽ¥è°ƒç”¨ sphinx-build。"
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "是å¦åˆ›å»º Makefile?(y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "是å¦åˆ›å»º Windows 批处ç†æ–‡ä»¶ï¼Ÿï¼ˆy/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "正在创建文件 %s。"
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "文件 %s 已存在,已跳过。"
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "完æˆï¼šå·²åˆ›å»ºåˆå§‹ç›®å½•ç»“构。"
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "你现在å¯ä»¥å¡«å†™ä¸»æ–‡æ¡£æ–‡ä»¶ %s 然åŽåˆ›å»ºå…¶ä»–文档æºæ–‡ä»¶äº†ã€‚ "
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "åƒè¿™æ ·ç”¨ Makefile 构建文档:\n  make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "åƒè¿™æ ·ç”¨ sphinx-build 命令构建文档:\n  sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "此处的“builderâ€ä»£æŒ‡æ”¯æŒçš„构建器å称,比如 htmlã€latex 或 linkcheck。"
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\nç”Ÿæˆ Sphinx 项目的必需文件。\n\nsphinx-quickstart 是一个交互å¼å·¥å…·ï¼Œè¯¢é—®ä¸€äº›å…³äºŽé¡¹ç›®çš„问题,生æˆ\n完整的文档目录和用于 sphinx-build 的示例 Makefile。\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "é™é»˜æ¨¡å¼"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "项目根目录"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "目录结构选项"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "如果指定了此选项,将分别建立æºæ–‡ä»¶ç›®å½•å’Œæž„建目录"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "如果指定了此选项,在æºæ–‡ä»¶ç›®å½•ä¸‹åˆ›å»ºæž„建目录"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "用å¥ç‚¹æ›¿ä»£â€œ _templatesâ€ç­‰æ–‡ä»¶å¤¹å称中的下划线。"
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "项目基本å‚æ•°"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "项目å称"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "作者å称"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "项目版本"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "项目å‘行版本"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "项目语ç§"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "æºæ–‡ä»¶åŽç¼€"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "主文档å"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "å¯ç”¨ ePub 支æŒ"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "扩展程åºé€‰é¡¹"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "å¯ç”¨ %s 扩展"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "å¯ç”¨å¤šä¸ªæ‰©å±•"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "创建 Makefile 和批处ç†æ–‡ä»¶"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "创建 Makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "ä¸åˆ›å»º Makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "创建批处ç†æ–‡ä»¶"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "ä¸åˆ›å»ºæ‰¹å¤„ç†æ–‡ä»¶"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.bat 采用 Sphinx çš„ make 模å¼"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "Makefile/make.bat ä¸é‡‡ç”¨ Sphinx çš„ make 模å¼"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "项目模æ¿"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "放置模æ¿æ–‡ä»¶çš„模æ¿ç›®å½•"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "定义一个模æ¿å˜é‡"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "指定了“quietâ€ï¼Œä½†æ˜¯æ²¡æœ‰æŒ‡å®šâ€œprojectâ€å’Œâ€œauthorâ€ã€‚"
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "错误:指定的路径ä¸æ˜¯ä¸€ä¸ªç›®å½•ï¼Œæˆ–是 Sphinx 文件已存在。"
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart åªä¼šåœ¨ç©ºç›®å½•ä¸­ç”Ÿæˆæ–‡ä»¶ã€‚请指定一个新的根路径。"
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "无效模æ¿å˜é‡ï¼š%s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "å–消缩进æ“作清除了空白字符"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "无效的标题:%s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "指定的行å·è¶…出范围(1-%d):%r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "“%sâ€å’Œâ€œ%sâ€é€‰é¡¹ä¸å¯è”用"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "è¦åŒ…å«çš„文件 %r ä¸å­˜åœ¨æˆ–读å–失败"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "用于读å–包å«æ–‡ä»¶ %r çš„ç¼–ç  %r ä¸æ­£ç¡®ï¼Œè¯·é‡æ–°ç»™å®š encoding: 选项"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "对象 %r 未出现在包å«æ–‡ä»¶ %r 中"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "ä¸èƒ½åœ¨ä¸è¿žç»­çš„“linesâ€ä¸Šä½¿ç”¨â€œlineno-matchâ€é€‰é¡¹"
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "指定的行 %r:未能从包å«æ–‡ä»¶ %r 中拉å–指定的行"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "目录树 glob 规则 %r 未能匹é…到文档"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "目录树中引用了已排除的文档 %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "目录树中引用的文档 %r ä¸å­˜åœ¨"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "目录树中存在é‡å¤çš„æ¡ç›®ï¼š%s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "节作者: "
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "模å—作者: "
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "代ç ä½œè€…: "
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "作者: "
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ".. acks 的内容ä¸æ˜¯åˆ—表"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ".. hlist 的内容ä¸æ˜¯åˆ—表"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "csv-table 指令的“:fileâ€é€‰é¡¹çŽ°åœ¨ä¼šå°†ç»å¯¹è·¯å¾„视为æºæ–‡ä»¶ç›®å½•çš„相对路径。请更新你的文档内容。"
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "é‡å¤çš„ C 声明,已ç»åœ¨ %s:%s 处声明。\n声明为“.. c:%s:: %sâ€ã€‚"
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s(C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "å‚æ•°"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "返回值"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "返回"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "返回类型"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "æˆå‘˜"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "å˜é‡"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "函数"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "å®"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "结构体"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "è”åˆä½“"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "枚举"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "枚举æˆå‘˜"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "类型"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "函数å‚æ•°"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "在 %s 版本加入"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "在 %s 版本å‘生å˜æ›´"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "自 %s 版本弃用"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "é‡å¤çš„引文 %s,å¦ä¸€å¼•æ–‡å‡ºçŽ°åœ¨ %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "引文 [%s] 没有被引用过。"
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "é‡å¤çš„ C++ 声明,已ç»åœ¨ %s:%s 处声明。\n声明为“.. cpp:%s:: %sâ€ã€‚"
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "模æ¿å‚æ•°"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s(C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "抛出"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "ç±»"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "概念"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "模æ¿å‚æ•°"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (内置函数)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s 方法)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s()(类)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s(全局å˜é‡æˆ–常é‡ï¼‰"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s(%s 属性)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "å‚æ•°"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s(模å—)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "方法"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "æ•°æ®"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "属性"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "模å—"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "é‡å¤çš„ %sæè¿° %s,其他的 %s æ述出现在 %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "é‡å¤çš„å…¬å¼æ ‡ç­¾ %s,å¦ä¸€å…¬å¼å‡ºçŽ°åœ¨ %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "无效的 math_eqref_format:%r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "å˜é‡"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "抛出"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s()(在 %s 模å—中)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s()(在 %s 模å—中)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s(内置å˜é‡ï¼‰"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s(内置类)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s(%s 中的类)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s()(%s 类方法)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s()(%s é™æ€æ–¹æ³•ï¼‰"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s(%s 属性)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python 模å—索引"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "模å—"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "已弃用"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "异常"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "类方法"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "é™æ€æ–¹æ³•"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "托管属性"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "交å‰å¼•ç”¨ %r 找到了多个目标:%s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr "(已弃用)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s(指令)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s:(指令选项)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s(角色)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "指令"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "指令-选项"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "角色"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "é‡å¤çš„ %s %s æ述,å¦ä¸€æ述出现在 %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "环境å˜é‡; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "畸形的选项æè¿° %r,应是“optâ€ã€â€œ-opt argsâ€ã€â€œ--opt argsâ€ã€â€œ/opt argsâ€æˆ–“+opt argsâ€å½¢å¼"
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s命令行选项"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "命令行选项"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "术语è¯æ±‡å‰å¿…须有空行"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "术语è¯æ±‡ä¸èƒ½ç”¨ç©ºè¡Œåˆ†éš”"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "术语è¯æ±‡æ ¼å¼ä¸æ­£ç¡®ï¼Œè¯·æ£€æŸ¥ç¼©è¿›"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "术语è¯æ±‡"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "语法记å·"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "引用标签"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "环境å˜é‡"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "程åºé€‰é¡¹"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "文档"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "模å—索引"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "æœç´¢é¡µé¢"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "é‡å¤çš„标签 %s,å¦ä¸€æ ‡ç­¾å‡ºçŽ°åœ¨ %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "é‡å¤çš„ %s æè¿° %s,å¦ä¸€æ述出现在 %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig å·²ç¦ç”¨ï¼Œå¿½ç•¥ :numref:。"
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "无法创建交å‰å¼•ç”¨ã€‚未指定题图数字:%s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "链接没有标题:%s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "无效的 numfig_format:%s(%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "无效的 numfig_format:%s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "标签未定义:%r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "无法创建交å‰å¼•ç”¨ï¼Œç¼ºå°‘标题或图题:%r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "æ–°é…ç½®"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "é…ç½®å‘生了å˜åŒ–"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "扩展å‘生了å˜åŒ–"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "构建环境版本与当å‰çŽ¯å¢ƒä¸ç¬¦"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "æºæ–‡ä»¶ç›®å½•å‘生了å˜åŒ–"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "本环境与选择的构建器ä¸å…¼å®¹ï¼Œè¯·é€‰æ‹©å…¶ä»–的文档树目录。"
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "无法在 %s 中扫æ文档:%r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "未注册的域 %r"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "文档没有加入到任何目录树中"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "目录树存在自引用,已忽略。"
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "è§ %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "å¦è¯·å‚è§ %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "未知的索引æ¡ç›®ç±»åž‹ %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "符å·"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "在文档树中检测到循环引用,已忽略:%s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "目录树引用的文档 %r 缺少标题:ä¸ä¼šç”Ÿæˆé“¾æŽ¥"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "目录树引用了未包å«çš„文档 %r"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "无法读å–图åƒæ–‡ä»¶ï¼š%s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "无法读å–图åƒæ–‡ä»¶ %s:%s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "无法读å–下载文件:%s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "å·²ç»ç»™ %s 分é…了章节编å·ï¼ˆåµŒå¥—的带编å·æ–‡æ¡£æ ‘?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "将会创建文件 %s。"
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\n在 <MODULE_PATH> 中递归查找 Python 模å—和包,然åŽåœ¨ <OUTPUT_PATH> 中为æ¯ä¸ªä½¿ç”¨äº†\nautomodule 指令的包创建一个 reST 文件。\n\n<EXCLUDE_PATTERN> å¯ä»¥æŽ’除生æˆç¬¦åˆè§„则的文件/目录的文档。\n\næ示:本脚本默认ä¸ä¼šè¦†ç›–已有文件。"
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "指定模å—的路径,用于生æˆè¯¥æ¨¡å—的文档"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "以 fnmatch 风格的文件/目录规则,ä¸ç”Ÿæˆä¸Žè¯¥è§„则匹é…的文档"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "存放输出内容的目录"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "在目录树中展示å­æ¨¡å—的最大深度(默认:4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "覆盖已有文件"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "éµå¾ªç¬¦å·é“¾æŽ¥ã€‚é…åˆ collective.recipe.omelette 使用尤其å¥æ•ˆã€‚"
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "è¿è¡Œè„šæœ¬ï¼Œä½†ä¸åˆ›å»ºæ–‡ä»¶"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "给模å—创建å„自的文档页"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "包å«â€œ_privateâ€æ¨¡å—"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "目录的文件å(默认:modules)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "ä¸åˆ›å»ºç›®å½•æ–‡ä»¶"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "ä¸åˆ›å»ºæ¨¡å—/包的标题(比如当 docstring 中已ç»æœ‰æ ‡é¢˜æ—¶ï¼Œå¯ä»¥ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ï¼‰"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "把模å—文档放置在å­æ¨¡å—文档之å‰"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "æ ¹æ® PEP-0420 éšå¼å‘½å空间规范解释模å—路径"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "文件åŽç¼€ï¼ˆé»˜è®¤ï¼šrst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "用 sphinx-quickstart 生æˆå®Œæ•´é¡¹ç›®"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "当指定了 --full 选项,把 module_path 附加到 sys.path"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "项目å称(默认:根模å—å)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "项目作者,指定了 --full 选项时使用"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "项目版本,指定了 --full 选项时使用"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "项目å‘行版本,指定了 --full 选项时使用,默认为 --doc-version 的值"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "扩展选项"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s ä¸æ˜¯ä¸€ä¸ªç›®å½•ã€‚"
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "为“%sâ€ä¸€èŠ‚增加标签“%sâ€"
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "æ— æ•ˆçš„æ­£åˆ™è¡¨è¾¾å¼ %r 出现在 %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "已完æˆæºæ–‡ä»¶çš„覆盖率测试,结果ä¿å­˜åœ¨ %(outdir)s/python.txt 中,请查阅。"
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "coverage_c_regexes ä¸­æœ‰æ— æ•ˆçš„æ­£åˆ™è¡¨è¾¾å¼ %r"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "缺少文档的 C API:%s [%s] 在 %s 文件中"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "æ— æ³•å¯¼å…¥æ¨¡å— %s:%s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "缺少文档的 Python 函数: %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "缺少文档的 Python 类:%s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "缺少文档的 Python 方法:%s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "“%sâ€é€‰é¡¹ä¸­ç¼ºå°‘“+â€æˆ–“-â€ã€‚"
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "无效的选项“%sâ€ã€‚"
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "无效的 pyversion 选项“%sâ€"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "无效的 TestCode 类型"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "已完æˆæºæ–‡ä»¶çš„文档测试,结果ä¿å­˜åœ¨ %(outdir)s/output.txt 中,请查阅。"
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "å— %s 没有代ç æˆ–没有输出,该å—出现在 %s:%s"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "已忽略无效的文档代ç ï¼š%r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== 最长读å–耗时 ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "å¯ä»¥ç”¨ extlink 替æ¢ç¡¬ç¼–ç é“¾æŽ¥ %r(请å°è¯•æ”¹ç”¨ %r)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "ä¸èƒ½åŒæ—¶æŒ‡å®š Graphviz 指令的内容和文件åå‚æ•°"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "外部 Graphviz 文件 %r ä¸å­˜åœ¨æˆ–读å–失败"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "已忽略无内容的“graphvizâ€æŒ‡ä»¤ã€‚"
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "无法è¿è¡Œ dot 命令 %r(为输出 graphviz 所必需),请检查 graphviz_dot 的设置"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot å‘生错误并退出:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot 未生æˆè¾“出文件:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format 的值åªèƒ½æ˜¯â€œpngâ€æˆ–“svgâ€ï¼Œä½†çŽ°åœ¨ç»™å®šçš„是 %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "dot ä»£ç  %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[图表:%s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[图表]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "无法è¿è¡Œå›¾åƒè½¬æ¢å‘½ä»¤ %r。“sphinx.ext.imgconverterâ€é»˜è®¤ä¾èµ–于 ImageMagick。请确ä¿å·²å®‰è£…了它,或者å¯ä»¥è‡ªå®šä¹‰â€œimage_converterâ€é€‰é¡¹ï¼Œè®¾ç½®ä¸€ä¸ªå…¶ä»–的转æ¢å‘½ä»¤ã€‚\n\n回溯信æ¯ï¼š%s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "æ ¼å¼è½¬æ¢å‘生错误并退出:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "无法è¿è¡Œæ ¼å¼è½¬æ¢å‘½ä»¤ %r,请检查 image_converter 的设置"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "无法è¿è¡Œ LaTeX 命令 %r (显示数学公å¼æ‰€å¿…需),请检查 imgmath_latex 的设置"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "无法è¿è¡Œ %s 命令 %r (显示数学公å¼æ‰€å¿…需),请检查 imgmath_%s 的设置"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "显示 LaTeX %r:%s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "å†…è” LaTeX %r:%s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "intersphinx 清å•è¢«ç§»åŠ¨è¿‡ï¼š%s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "正在从 %s 加载 intersphinx 清å•â€¦â€¦"
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "在读å–这些清å•æ—¶é‡åˆ°äº†ä¸€äº›é—®é¢˜ï¼Œä½†å·²æ‰¾åˆ°å¯ç”¨æ›¿ä»£ï¼š"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "无法访问任何清å•ï¼Œé—®é¢˜å¦‚下:"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(在 %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(在 %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "未找到用于外部交å‰å¼•ç”¨çš„清å•ï¼š%s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "未找到用于外部交å‰å¼•ç”¨çš„角色:%s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "未找到外部 %s:%s 引用目标:%s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "intersphinx 标识符 %r ä¸æ˜¯å­—符串,已忽略"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "æ— æ³•è¯»å– intersphinx_mapping[%s],已忽略:%r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[æºä»£ç ]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "待处ç†"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "å‘现待处ç†æ¡ç›®ï¼š%s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> è§ %s,第 %d 行。)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "原始æ¡ç›®"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "正在高亮模å—代ç â€¦â€¦"
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[文档]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "模å—代ç "
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s æºä»£ç </h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "概览:模å—代ç "
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>代ç å¯ç”¨çš„所有模å—</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "无效的 member-order 选项值:%s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "无效的 class-doc-from 选项值:%s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "无效的 auto%s ç­¾å(%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "在格å¼åŒ– %s çš„å‚数时报错:%s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc:无法确定是å¦ç”Ÿæˆ %s.%s (%r) 的文档,抛出了下列异常:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "无法判断导入哪个模å—以自动生æˆæ–‡æ¡£ %r(å°è¯•åœ¨æ–‡æ¡£ä¸­ä½¿ç”¨â€œmoduleâ€æˆ–“currentmoduleâ€æŒ‡ä»¤ï¼Œæˆ–者显å¼ç»™å®šæ¨¡å—å)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "检测到仿制的对象:%r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "在格å¼åŒ– %s çš„ç­¾åæ—¶å‘生错误:%s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "automodule å中的“::â€æ— æ„义"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "automodule %s 给定了函数签åå‚数或返回类型标注"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ 应是一个字符串列表,而ä¸æ˜¯ %r ï¼ˆå‡ºçŽ°åœ¨æ¨¡å— %s 中) -- 已忽略__all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ":members: 选项中涉åŠçš„属性ä¸å­˜åœ¨ï¼šæ¨¡å— %s,属性%s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "无法获å–函数 %s çš„ç­¾å:%s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "无法获å–构造函数 %s çš„ç­¾å:%s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "基类:%s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "指定了 %s 属性,但对象 %s 缺少该属性"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "%s 的别å"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "TypeVar(%s) 的别å"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "无法获å–方法 %s çš„ç­¾å:%s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "%s 上有无效的 __slots__,已忽略。"
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "æ— æ³•è§£æž %r 的默认å‚数值:%s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "无法更新 %r çš„ç­¾å:未找到å‚数:%s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "æ— æ³•è§£æž %r 的类型注释:%s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "自动摘è¦å¼•ç”¨äº†æŽ’除的文档 %r,已忽略。"
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "自动摘è¦ï¼šæ— æ³•æ‰¾åˆ°å­˜æ ¹æ–‡ä»¶ %r。请检查你的 autosummary_generate 设置。"
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "在自动摘è¦ä¸­æŒ‡å®šæ ‡é¢˜æ—¶ä¹Ÿéœ€è¦æŒ‡å®š :toctree: 选项,已忽略。"
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "自动摘è¦ï¼šæ— æ³•å¯¼å…¥ %s。\nå¯èƒ½åŽŸå› ï¼š\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "无法解æžå称 %s"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "无法导入对象 %s"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate é…置项:文件 %s ä¸å­˜åœ¨"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "自动摘è¦å†…éƒ¨ä¼šç”Ÿæˆ .rst 文件,但是 source_suffix ä¸­æœªåŒ…å« .rst,已跳过。"
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "自动摘è¦ï¼šæ— æ³•åˆ¤æ–­æ˜¯å¦ç”Ÿæˆ %r 的文档。抛出了下列异常:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[自动摘è¦] 正在生æˆè‡ªåŠ¨æ‘˜è¦ï¼š%s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[自动摘è¦] 正在写入 %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[自动摘è¦]无法导入 %s。\nå¯èƒ½åŽŸå› ï¼š\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\n用 autosummary æŒ‡ä»¤ç”Ÿæˆ ReStructuredText\n\nsphinx-autogen 是 sphinx.ext.autosummary.generate çš„å‰ç«¯ï¼Œå®ƒæ ¹æ®\n给定输入文件中的 autosummary æŒ‡ä»¤ç”Ÿæˆ reStructuredText 文件。\n\nautosummary 指令的格å¼è§ Python æ¨¡å— ``sphinx.ext.autosummary`` çš„\n文档。å¯ä»¥è¿™æ ·è°ƒå‡ºæ–‡æ¡£ä»¥ä¾›é˜…读::\n\n pydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "ç”¨äºŽç”Ÿæˆ rst 文件的æºæ–‡ä»¶"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "存放输出内容的目录"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "默认的文件ååŽç¼€ï¼ˆé»˜è®¤ï¼š%(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "自定义模æ¿ç›®å½•ï¼ˆé»˜è®¤ï¼š%(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "文档导入的æˆå‘˜ï¼ˆé»˜è®¤ï¼š%(default)s)"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "仅生æˆæ¨¡å—中 __all__ 属性æˆå‘˜çš„文档。(默认值:%(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "关键字å‚æ•°"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "示例"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "示例"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "备注"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "其他å‚æ•°"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "接å—"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "引用"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "警告"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "生æˆå™¨"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "无效的值集åˆï¼ˆç¼ºå°‘å³æ‹¬å·ï¼‰ï¼š%s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "无效的值集åˆï¼ˆç¼ºå°‘左括å·ï¼‰ï¼š%s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "异常的字符串字é¢é‡ï¼ˆç¼ºå°‘å³å¼•å·ï¼‰ï¼š%s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "异常的字符串字é¢é‡ï¼ˆç¼ºå°‘左引å·ï¼‰ï¼š%s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "å°å¿ƒ"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "å±é™©"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "错误"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "æ示"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "备注"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "å‚è§"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "å°æŠ€å·§"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "接上页"
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "续下页"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "éžå­—æ¯"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "æ•°å­—"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "页"
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "目录"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "æœç´¢"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "æ交"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "显示æºä»£ç "
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "概述"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "欢迎ï¼"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "本文档属于"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "索引 &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "导航"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "在 %(docstitle)s 中æœç´¢"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "关于此文档"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "版æƒæ‰€æœ‰"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr "&#169; %(copyright_prefix)s %(copyright)s."
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最åŽæ›´æ–°äºŽ %(last_updated)s."
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "由 <a href=\"https://www.sphinx-doc.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:12
+msgid "Previous topic"
+msgstr "上一主题"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "上一章"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "下一主题"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "下一章"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "请激活 JavaScript 以开å¯æœç´¢åŠŸèƒ½ã€‚"
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "当æœç´¢å¤šä¸ªå…³é”®è¯æ—¶ï¼Œåªä¼šæ˜¾ç¤ºåŒæ—¶åŒ…å«æ‰€æœ‰å…³é”®è¯çš„内容。"
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "æœç´¢"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "æœç´¢ç»“æžœ"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "快速æœç´¢"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "于版本 %(version)s&#8212; %(docstitle)s å˜æ›´"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "æœç´¢å®Œæˆï¼ŒåŒ¹é…到 ${resultCount} 页。"
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "正在æœç´¢ä¸­"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "正在准备æœç´¢â€¦â€¦"
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ",在 "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "éšè—æœç´¢ç»“æžœ"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "折å è¾¹æ "
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "展开边æ "
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "目录"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "索引页使用了 4 列布局,å¯èƒ½æ˜¯ä½ æ‰€ç”¨çš„扩展出现了 Bug:%r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "脚注 [%s] 没有被引用过。"
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "脚注 [#] 没有被引用过。"
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "译文中的脚注引用与原文ä¸ä¸€è‡´ã€‚原文中为:{0},翻文中为:{1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "译文中的引用与原文ä¸ä¸€è‡´ã€‚原文中为:{0},译文中为:{1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "译文中的引文引用与原文ä¸ä¸€è‡´ã€‚原文中为:{0},译文中为:{1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "译文中的术语引用与原文ä¸ä¸€è‡´ã€‚原文中为:{0},译文中为:{1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "无法确定交å‰å¼•ç”¨çš„回退文本。å¯èƒ½æ˜¯ Bug。"
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "“anyâ€äº¤å‰å¼•ç”¨ %r 的目标ä¸å”¯ä¸€ï¼šå¯èƒ½æ˜¯ %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "未找到 %s:%s 的引用目标: %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "未找到 %r 的引用目标:%s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "无法拉å–远程图åƒï¼š%s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "无法拉å–远程图åƒï¼š%s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "未知的图åƒæ ¼å¼ï¼š%s……"
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "æºç ä¸­å­˜åœ¨ç¼–ç æ— æ³•è¯†åˆ«çš„字符,已ç»æ›¿æ¢ä¸ºâ€œ?â€ï¼š%r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "已跳过"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "失败"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "%s 域中的问题:字段应采用“%sâ€è§’色,但域中并ä¸åŒ…å«è¯¥è§’色。"
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "未知的指令或角色å称:%s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "未知节点类型:%r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "读å–æ—¶å‘生错误:%s,%s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "写入时å‘生错误:%s,%s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "无效的日期格å¼ã€‚如果你想直接输出日期字符串,请用å•å¼•å·åŒ…裹该字符串:%s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr "%r ä¸å†é€‚用于索引款目(æºè‡ª %r 款目)。请使用“pair: %sâ€ä½œä¸ºæ›¿ä»£ã€‚"
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "目录树引用的文件 %r ä¸å­˜åœ¨"
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "only 指令的表达å¼æ±‚值时抛出异常:%s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "未找到默认角色 %s"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "未定义 %s 的 numfig_format"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "没有给 %s èŠ‚ç‚¹åˆ†é… ID"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "无法获å–图åƒå°ºå¯¸ï¼Œå·²å¿½ç•¥ :scale: 选项。"
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "未知的 %r toplevel_sectioning 被用于 %r 类"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":mathdepth: 值过大,已忽略。"
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "文档标题ä¸æ˜¯ä¸€ä¸ªå•çº¯æ–‡æœ¬èŠ‚点"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "在节ã€è¯é¢˜ã€è¡¨æ ¼ã€è­¦ç¤ºæˆ–è¾¹æ ä»¥å¤–çš„ä½ç½®å‘现标题节点"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "脚注"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "åŒæ—¶æŒ‡å®šäº† tabularcolumns å’Œ :widths: 选项,已忽略 :widths:。"
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "无效的é‡çº²å•ä½ %s,已忽略。"
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "å‘现未知的索引æ¡ç›®ç±»åž‹ %s"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[图片: %s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[图片]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "在图示之外å‘现了图题。"
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "未实现的节点类型:%r"
diff --git a/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..4e316f2
--- /dev/null
+++ b/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "zh_Hant_HK",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "0"
+}); \ No newline at end of file
diff --git a/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo b/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..12e66b2
--- /dev/null
+++ b/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po b/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..9a7b9f4
--- /dev/null
+++ b/sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Chinese (Hong Kong) (http://app.transifex.com/sphinx-doc/sphinx-1/language/zh_HK/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: zh_HK\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..ef157aa
--- /dev/null
+++ b/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "zh_Hant_TW",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "",
+ "About these documents": "",
+ "Automatically generated list of changes in version %(version)s": "",
+ "C API changes": "",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "",
+ "Collapse sidebar": "",
+ "Complete Table of Contents": "",
+ "Contents": "",
+ "Copyright": "",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "",
+ "Expand sidebar": "",
+ "Full index on one page": "",
+ "General Index": "",
+ "Global Module Index": "",
+ "Go": "",
+ "Hide Search Matches": "",
+ "Index": "",
+ "Index &ndash; %(key)s": "",
+ "Index pages by letter": "",
+ "Indices and tables:": "",
+ "Last updated on %(last_updated)s.": "",
+ "Library changes": "",
+ "Navigation": "",
+ "Next topic": "",
+ "Other changes": "",
+ "Overview": "",
+ "Please activate JavaScript to enable the search\n functionality.": "",
+ "Preparing search...": "",
+ "Previous topic": "",
+ "Quick search": "",
+ "Search": "",
+ "Search Page": "",
+ "Search Results": "",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "",
+ "Search within %(docstitle)s": "",
+ "Searching": "",
+ "Searching for multiple words only shows matches that contain\n all words.": "",
+ "Show Source": "",
+ "Table of Contents": "",
+ "This Page": "",
+ "Welcome! This is": "",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "",
+ "all functions, classes, terms": "",
+ "can be huge": "",
+ "last updated": "",
+ "lists all sections and subsections": "",
+ "next chapter": "",
+ "previous chapter": "",
+ "quick access to all modules": "",
+ "search": "",
+ "search this documentation": "",
+ "the documentation for": ""
+ },
+ "plural_expr": "0"
+}); \ No newline at end of file
diff --git a/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo b/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo
new file mode 100644
index 0000000..3ac67e1
--- /dev/null
+++ b/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo
Binary files differ
diff --git a/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po b/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..e949589
--- /dev/null
+++ b/sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3694 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Chinese (Taiwan) (Big5) (http://app.transifex.com/sphinx-doc/sphinx-1/language/zh_TW.Big5/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: zh_TW.Big5\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr ""
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr ""
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr ""
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr ""
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr ""
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr ""
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr ""
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr ""
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr ""
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr ""
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr ""
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr ""
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr ""
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr ""
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr ""
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr ""
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr ""
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr ""
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr ""
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr ""
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr ""
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr ""
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr ""
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr ""
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr ""
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr ""
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr ""
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr ""
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr ""
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr ""
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr ""
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr ""
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr ""
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr ""
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr ""
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr ""
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr ""
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr ""
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr ""
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr ""
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr ""
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr ""
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr ""
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr ""
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr ""
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr ""
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr ""
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr ""
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr ""
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr ""
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr ""
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr ""
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr ""
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr ""
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr ""
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr ""
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr ""
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr ""
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr ""
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr ""
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr ""
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr ""
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr ""
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr ""
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr ""
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr ""
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr ""
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr ""
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr ""
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr ""
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr ""
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr ""
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr ""
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr ""
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr ""
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr ""
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr ""
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr ""
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr ""
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr ""
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr ""
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr ""
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr ""
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr ""
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr ""
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr ""
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr ""
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr ""
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr ""
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr ""
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr ""
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr ""
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr ""
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr ""
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr ""
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr ""
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr ""
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr ""
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr ""
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr ""
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr ""
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr ""
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr ""
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr ""
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr ""
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr ""
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr ""
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr ""
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr ""
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr ""
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr ""
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr ""
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr ""
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr ""
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr ""
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr ""
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr ""
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr ""
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr ""
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr ""
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr ""
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr ""
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr ""
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr ""
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr ""
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr ""
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr ""
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr ""
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr ""
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr ""
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr ""
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr ""
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr ""
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr ""
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr ""
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr ""
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr ""
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr ""
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr ""
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr ""
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr ""
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr ""
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr ""
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr ""
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr ""
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr ""
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr ""
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr ""
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr ""
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr ""
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr ""
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr ""
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr ""
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr ""
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr ""
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr ""
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr ""
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr ""
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr ""
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr ""
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr ""
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr ""
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr ""
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr ""
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr ""
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr ""
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ""
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ""
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr ""
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr ""
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr ""
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr ""
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr ""
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr ""
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr ""
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr ""
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr ""
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr ""
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr ""
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr ""
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr ""
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr ""
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr ""
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr ""
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr ""
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr ""
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr ""
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr ""
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr ""
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr ""
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr ""
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr ""
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr ""
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr ""
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr ""
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr ""
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr ""
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr ""
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr ""
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr ""
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr ""
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr ""
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr ""
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr ""
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr ""
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr ""
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr ""
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr ""
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr ""
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr ""
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr ""
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr ""
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr ""
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr ""
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ""
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr ""
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr ""
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr ""
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr ""
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr ""
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr ""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr ""
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr ""
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr ""
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr ""
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr ""
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr ""
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr ""
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr ""
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr ""
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr ""
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr ""
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr ""
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr ""
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr ""
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr ""
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr ""
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr ""
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr ""
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr ""
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr ""
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr ""
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr ""
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr ""
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr ""
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr ""
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr ""
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr ""
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr ""
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr ""
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr ""
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr ""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr ""
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr ""
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr ""
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr ""
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr ""
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr ""
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr ""
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr ""
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr ""
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr ""
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr ""
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr ""
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr ""
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr ""
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr ""
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr ""
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr ""
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr ""
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr ""
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr ""
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr ""
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr ""
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr ""
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr ""
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr ""
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr ""
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr ""
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr ""
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr ""
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr ""
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr ""
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr ""
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr ""
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr ""
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr ""
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr ""
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr ""
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr ""
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr ""
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr ""
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr ""
+
+#: sphinx/themes/basic/opensearch.xml:4
+#, python-format
+msgid "Search %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:12
+msgid "Previous topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr ""
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr ""
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr ""
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr ""
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:17
+#, python-format
+msgid "Automatically generated list of changes in version %(version)s"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:18
+msgid "Library changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:23
+msgid "C API changes"
+msgstr ""
+
+#: sphinx/themes/basic/changes/versionchanges.html:25
+msgid "Other changes"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr ""
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ""
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr ""
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr ""
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr ""
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr ""
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr ""
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr ""
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr ""
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr ""
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr ""
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr ""
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr ""
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr ""
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr ""
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr ""
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr ""
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr ""
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr ""
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr ""
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr ""
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr ""
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr ""
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr ""
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr ""
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr ""
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr ""
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr ""
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr ""
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr ""
diff --git a/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
new file mode 100644
index 0000000..cebee7d
--- /dev/null
+++ b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js
@@ -0,0 +1,60 @@
+Documentation.addTranslations({
+ "locale": "zh_Hant_TW",
+ "messages": {
+ "%(filename)s &#8212; %(docstitle)s": "%(filename)s &#8212; %(docstitle)s",
+ "&#169; %(copyright_prefix)s %(copyright)s.": "",
+ ", in ": "\uff0c\u65bc ",
+ "About these documents": "\u95dc\u65bc\u9019\u4e9b\u6587\u4ef6",
+ "Automatically generated list of changes in version %(version)s": "\u81ea\u52d5\u7522\u751f\u7684 %(version)s \u7248\u8b8a\u66f4\u5217\u8868",
+ "C API changes": "C API \u7684\u8b8a\u66f4",
+ "Changes in Version %(version)s &#8212; %(docstitle)s": "\u65bc %(version)s \u7248\u4e2d\u7684\u6240\u6709\u8b8a\u66f4 &#8212; %(docstitle)s",
+ "Collapse sidebar": "\u6536\u5408\u5074\u908a\u6b04",
+ "Complete Table of Contents": "\u5b8c\u6574\u76ee\u9304",
+ "Contents": "\u5167\u5bb9",
+ "Copyright": "\u7248\u6b0a\u6240\u6709",
+ "Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s.": "\u4f7f\u7528 <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> %(sphinx_version)s \u5efa\u7acb\u3002",
+ "Expand sidebar": "\u5c55\u958b\u5074\u908a\u6b04",
+ "Full index on one page": "\u55ae\u9801\u5b8c\u6574\u7d22\u5f15",
+ "General Index": "\u7e3d\u7d22\u5f15",
+ "Global Module Index": "\u5168\u57df\u6a21\u7d44\u7d22\u5f15",
+ "Go": "\u524d\u5f80",
+ "Hide Search Matches": "\u96b1\u85cf\u7b26\u5408\u641c\u5c0b",
+ "Index": "\u7d22\u5f15",
+ "Index &ndash; %(key)s": "\u7d22\u5f15 &ndash; %(key)s",
+ "Index pages by letter": "\u6309\u5b57\u6bcd\u7d22\u5f15\u9801\u9762",
+ "Indices and tables:": "\u7d22\u5f15\u8207\u8868\u683c\uff1a",
+ "Last updated on %(last_updated)s.": "\u6700\u5f8c\u66f4\u65b0\u65bc %(last_updated)s\u3002",
+ "Library changes": "\u7a0b\u5f0f\u5eab\u7684\u8b8a\u66f4",
+ "Navigation": "\u700f\u89bd",
+ "Next topic": "\u4e0b\u500b\u4e3b\u984c",
+ "Other changes": "\u5176\u4ed6\u8b8a\u66f4",
+ "Overview": "\u6982\u8981",
+ "Please activate JavaScript to enable the search\n functionality.": "\u8acb\u555f\u7528 Javascript \u4ee5\u958b\u555f\u641c\u5c0b\u529f\u80fd\u3002",
+ "Preparing search...": "\u6e96\u5099\u641c\u5c0b\u4e2d\u2026",
+ "Previous topic": "\u4e0a\u500b\u4e3b\u984c",
+ "Quick search": "\u5feb\u901f\u641c\u5c0b",
+ "Search": "\u641c\u5c0b",
+ "Search Page": "\u641c\u5c0b\u9801\u9762",
+ "Search Results": "\u641c\u5c0b\u7d50\u679c",
+ "Search finished, found ${resultCount} page(s) matching the search query.": "\u641c\u5c0b\u7d50\u675f\uff0c\u5171\u627e\u5230 ${resultCount} \u500b\u9801\u9762\u7b26\u5408\u641c\u5c0b\u689d\u4ef6\u3002",
+ "Search within %(docstitle)s": "\u5728 %(docstitle)s \u4e2d\u641c\u5c0b",
+ "Searching": "\u641c\u5c0b\u4e2d",
+ "Searching for multiple words only shows matches that contain\n all words.": "\u641c\u5c0b\u591a\u500b\u95dc\u9375\u5b57\u6642\uff0c\u53ea\u6703\u986f\u793a\u5305\u542b\u6240\u6709\u95dc\u9375\u5b57\u7684\u7d50\u679c\u3002",
+ "Show Source": "\u986f\u793a\u539f\u59cb\u78bc",
+ "Table of Contents": "\u76ee\u9304",
+ "This Page": "\u672c\u9801",
+ "Welcome! This is": "\u6b61\u8fce\uff01\u672c",
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "\u60a8\u7684\u641c\u5c0b\u627e\u4e0d\u5230\u4efb\u4f55\u6eff\u8db3\u689d\u4ef6\u7684\u6587\u4ef6\u3002\u8acb\u78ba\u5b9a\u662f\u5426\u6240\u6709\u7684\u641c\u5c0b\u8a5e\u90fd\u6b63\u78ba\u5730\u62fc\u5beb\u4e14\u60a8\u5df2\u9078\u64c7\u8db3\u5920\u7684\u5206\u985e\u3002",
+ "all functions, classes, terms": "\u6240\u6709\u51fd\u5f0f\u3001\u985e\u5225\u3001\u8853\u8a9e",
+ "can be huge": "\u53ef\u80fd\u6703\u5f88\u5927",
+ "last updated": "\u6700\u5f8c\u66f4\u65b0\u65bc",
+ "lists all sections and subsections": "\u5217\u51fa\u6240\u6709\u7ae0\u7bc0\u8207\u5c0f\u7bc0",
+ "next chapter": "\u4e0b\u4e00\u7ae0",
+ "previous chapter": "\u4e0a\u4e00\u7ae0",
+ "quick access to all modules": "\u8fc5\u901f\u627e\u5230\u6240\u6709\u6a21\u7d44",
+ "search": "\u641c\u5c0b",
+ "search this documentation": "\u641c\u5c0b\u9019\u4efd\u8aaa\u660e\u6587\u4ef6",
+ "the documentation for": "\u8aaa\u660e\u6587\u4ef6\u4ecb\u7d39"
+ },
+ "plural_expr": "0"
+}); \ 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
new file mode 100644
index 0000000..7dadab4
--- /dev/null
+++ 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
new file mode 100644
index 0000000..eafe14b
--- /dev/null
+++ b/sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po
@@ -0,0 +1,3702 @@
+# Translations template for Sphinx.
+# Copyright (C) 2023 ORGANIZATION
+# This file is distributed under the same license as the Sphinx project.
+#
+# Translators:
+# Wey-Han Liaw <adrianliaw2000@gmail.com>, 2018
+# alvinhochun <alvin@alvinhc.com>, 2021
+# Fred Lin <gasolin@gmail.com>, 2008
+# Game Arming <fleasw@yahoo.com.tw>, 2017
+# Hsiaoming Yang <me@lepture.com>, 2018
+# Liang-Bo Wang <me@liang2.tw>, 2016
+# Liang-Bo Wang <me@liang2.tw>, 2016-2017
+# Steven Hsu <hsuhaochun@gmail.com>, 2021-2022
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2023-08-17 16:40+0000\n"
+"PO-Revision-Date: 2013-04-02 08:44+0000\n"
+"Last-Translator: Steven Hsu <hsuhaochun@gmail.com>, 2021-2022\n"
+"Language-Team: Chinese (Taiwan) (http://app.transifex.com/sphinx-doc/sphinx-1/language/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.12.1\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinx/application.py:157
+#, python-format
+msgid "Cannot find source directory (%s)"
+msgstr "找ä¸åˆ°ä¾†æºè³‡æ–™å¤¾ (%s)"
+
+#: sphinx/application.py:161
+#, python-format
+msgid "Output directory (%s) is not a directory"
+msgstr "輸出資料夾 (%s) ä¸æ˜¯ä¸€å€‹è³‡æ–™å¤¾"
+
+#: sphinx/application.py:165
+msgid "Source directory and destination directory cannot be identical"
+msgstr "來æºè³‡æ–™å¤¾èˆ‡ç›®çš„資料夾ä¸èƒ½ç‚ºç›¸åŒ"
+
+#: sphinx/application.py:197
+#, python-format
+msgid "Running Sphinx v%s"
+msgstr "正在執行 Sphinx v%s 版本"
+
+#: sphinx/application.py:223
+#, python-format
+msgid ""
+"This project needs at least Sphinx v%s and therefore cannot be built with "
+"this version."
+msgstr "æœ¬å°ˆæ¡ˆéœ€è¦ Sphinx v%s 版或以上,故無法以ç¾ç‰ˆæœ¬ç·¨è­¯ã€‚"
+
+#: sphinx/application.py:239
+msgid "making output directory"
+msgstr "正在建立輸出目錄"
+
+#: sphinx/application.py:244 sphinx/registry.py:444
+#, python-format
+msgid "while setting up extension %s:"
+msgstr "正在設置擴充套件 %s 時:"
+
+#: sphinx/application.py:250
+msgid ""
+"'setup' as currently defined in conf.py isn't a Python callable. Please "
+"modify its definition to make it a callable function. This is needed for "
+"conf.py to behave as a Sphinx extension."
+msgstr "ç›®å‰åœ¨ conf.py 裡定義的 'setup' 並éžä¸€å€‹ Python çš„å¯å‘¼å«ç‰©ä»¶ã€‚請將其定義修改為一個å¯å‘¼å«çš„函å¼ã€‚è‹¥è¦ä½¿ conf.py 以 Sphinx 擴充套件的方å¼é‹ä½œï¼Œé€™å€‹ä¿®æ”¹æ˜¯å¿…須的。"
+
+#: sphinx/application.py:281
+#, python-format
+msgid "loading translations [%s]... "
+msgstr "正在載入翻譯 [%s]..."
+
+#: sphinx/application.py:298 sphinx/util/display.py:84
+msgid "done"
+msgstr "完æˆ"
+
+#: sphinx/application.py:300
+msgid "not available for built-in messages"
+msgstr "ä¸æ˜¯æœ‰æ•ˆçš„內建訊æ¯"
+
+#: sphinx/application.py:314
+msgid "loading pickled environment"
+msgstr "正在載入已 pickle 的環境"
+
+#: sphinx/application.py:322
+#, python-format
+msgid "failed: %s"
+msgstr "失敗:%s"
+
+#: sphinx/application.py:336
+msgid "No builder selected, using default: html"
+msgstr "沒有指定 builder,使用é è¨­ï¼šhtml"
+
+#: sphinx/application.py:369
+msgid "succeeded"
+msgstr "æˆåŠŸ"
+
+#: sphinx/application.py:370
+msgid "finished with problems"
+msgstr "完æˆä½†æœ‰å•é¡Œ"
+
+#: sphinx/application.py:374
+#, python-format
+msgid "build %s, %s warning (with warnings treated as errors)."
+msgstr "建立 %s,%s 警告(警告被視為錯誤)。"
+
+#: sphinx/application.py:376
+#, python-format
+msgid "build %s, %s warnings (with warnings treated as errors)."
+msgstr "建立 %s,%s 警告(警告被視為錯誤)。"
+
+#: sphinx/application.py:379
+#, python-format
+msgid "build %s, %s warning."
+msgstr "建立 %s,%s 警告。"
+
+#: sphinx/application.py:381
+#, python-format
+msgid "build %s, %s warnings."
+msgstr "建立 %s,%s 警告。"
+
+#: sphinx/application.py:385
+#, python-format
+msgid "build %s."
+msgstr "建立 %s。"
+
+#: sphinx/application.py:616
+#, python-format
+msgid "node class %r is already registered, its visitors will be overridden"
+msgstr "node class %r 已經被註冊,它的訪客將會被覆寫"
+
+#: sphinx/application.py:695
+#, python-format
+msgid "directive %r is already registered, it will be overridden"
+msgstr "指令 %r 已經被註冊,它將會被覆寫"
+
+#: sphinx/application.py:717 sphinx/application.py:739
+#, python-format
+msgid "role %r is already registered, it will be overridden"
+msgstr "role %r 已經被註冊,它將會被覆寫"
+
+#: sphinx/application.py:1288
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel reading, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s 擴充套件並未宣告平行讀å–是å¦å®‰å…¨ï¼Œå‡è¨­ç‚ºå¦ - 請尋求擴充套件作者以檢查並明確表示"
+
+#: sphinx/application.py:1292
+#, python-format
+msgid "the %s extension is not safe for parallel reading"
+msgstr "%s 擴充套件å°æ–¼å¹³è¡Œè®€å–是ä¸å®‰å…¨çš„"
+
+#: sphinx/application.py:1295
+#, python-format
+msgid ""
+"the %s extension does not declare if it is safe for parallel writing, "
+"assuming it isn't - please ask the extension author to check and make it "
+"explicit"
+msgstr "%s 擴充套件並未宣告平行寫入是å¦å®‰å…¨ï¼Œå‡è¨­ç‚ºå¦ - 請尋求擴充套件作者以檢查並明確表示"
+
+#: sphinx/application.py:1299
+#, python-format
+msgid "the %s extension is not safe for parallel writing"
+msgstr "%s 擴充套件å°æ–¼å¹³è¡Œå¯«å…¥æ˜¯ä¸å®‰å…¨çš„"
+
+#: sphinx/application.py:1307 sphinx/application.py:1311
+#, python-format
+msgid "doing serial %s"
+msgstr "執行串列 %s"
+
+#: sphinx/config.py:179
+#, python-format
+msgid "config directory doesn't contain a conf.py file (%s)"
+msgstr "config è³‡æ–™å¤¾æ²’æœ‰åŒ…å« conf.py 檔案 (%s)"
+
+#: sphinx/config.py:188
+msgid ""
+"Invalid configuration value found: 'language = None'. Update your "
+"configuration to a valid language code. Falling back to 'en' (English)."
+msgstr "找到無效的組態值: 'language = None' 。請以一個有效的語言碼更新您的é…置。跳回 'en' (英語)。"
+
+#: sphinx/config.py:217
+#, python-format
+msgid ""
+"cannot override dictionary config setting %r, ignoring (use %r to set "
+"individual elements)"
+msgstr "無法覆寫資料夾組態設定 %r,忽略中(使用 %r 來設定個別元素)"
+
+#: sphinx/config.py:226
+#, python-format
+msgid "invalid number %r for config value %r, ignoring"
+msgstr "無效的數字 %r 於組態值 %r,忽略中"
+
+#: sphinx/config.py:231
+#, python-format
+msgid "cannot override config setting %r with unsupported type, ignoring"
+msgstr "無法以未支æ´çš„型別覆寫組態設定 %r,忽略中"
+
+#: sphinx/config.py:260
+#, python-format
+msgid "unknown config value %r in override, ignoring"
+msgstr "覆寫未知的組態值 %r,忽略中"
+
+#: sphinx/config.py:288
+#, python-format
+msgid "No such config value: %s"
+msgstr "無此類組態值:%s"
+
+#: sphinx/config.py:312
+#, python-format
+msgid "Config value %r already present"
+msgstr "組態值 %r 已經存在"
+
+#: sphinx/config.py:360
+#, python-format
+msgid "There is a syntax error in your configuration file: %s\n"
+msgstr "在您的組態檔中有一個語法錯誤:%s\n"
+
+#: sphinx/config.py:363
+msgid ""
+"The configuration file (or one of the modules it imports) called sys.exit()"
+msgstr "組態檔(或它 import 的其中一個模組)呼å«äº† sys.exit()"
+
+#: sphinx/config.py:370
+#, python-format
+msgid ""
+"There is a programmable error in your configuration file:\n"
+"\n"
+"%s"
+msgstr "在您的組態檔中有一個程å¼åŒ–錯誤:\n\n%s"
+
+#: sphinx/config.py:393
+#, python-format
+msgid ""
+"The config value `source_suffix' expects a string, list of strings, or "
+"dictionary. But `%r' is given."
+msgstr "組態值 `source_suffix' é æœŸæ˜¯ä¸€å€‹å­—串ã€ä¸€çµ„字串,或字典。但是 `%r' 被給予。"
+
+#: sphinx/config.py:413
+#, python-format
+msgid "Section %s"
+msgstr "章節 %s"
+
+#: sphinx/config.py:414
+#, python-format
+msgid "Fig. %s"
+msgstr "圖 %s"
+
+#: sphinx/config.py:415
+#, python-format
+msgid "Table %s"
+msgstr "表格 %s"
+
+#: sphinx/config.py:416
+#, python-format
+msgid "Listing %s"
+msgstr "列表 %s"
+
+#: sphinx/config.py:488
+msgid ""
+"The config value `{name}` has to be a one of {candidates}, but `{current}` "
+"is given."
+msgstr "組態值 `{name}` 必須是 {candidates} 的其中之一,但 `{current}` 被給予。"
+
+#: sphinx/config.py:506
+msgid ""
+"The config value `{name}' has type `{current.__name__}'; expected "
+"{permitted}."
+msgstr "組態值 `{name}' 有 `{current.__name__}' 型別;é æœŸ {permitted} 。"
+
+#: sphinx/config.py:518
+msgid ""
+"The config value `{name}' has type `{current.__name__}', defaults to "
+"`{default.__name__}'."
+msgstr "組態值 `{name}' 有 `{current.__name__}' 型別;é è¨­ç‚º `{default.__name__}' 。"
+
+#: sphinx/config.py:528
+#, python-format
+msgid "primary_domain %r not found, ignored."
+msgstr "找ä¸åˆ° primary_domain %r,已略éŽã€‚"
+
+#: sphinx/config.py:540
+msgid ""
+"Since v2.0, Sphinx uses \"index\" as root_doc by default. Please add "
+"\"root_doc = 'contents'\" to your conf.py."
+msgstr "從 v2.0 開始,Sphinx é è¨­ä½¿ç”¨ \"index\" 作為 root_doc。請在您的 conf.py 加上 \"root_doc = 'contents'\"。"
+
+#: sphinx/events.py:63
+#, python-format
+msgid "Event %r already present"
+msgstr "事件 %r 已經存在"
+
+#: sphinx/events.py:69
+#, python-format
+msgid "Unknown event name: %s"
+msgstr "未知的事件å稱:%s"
+
+#: sphinx/events.py:107
+#, python-format
+msgid "Handler %r for event %r threw an exception"
+msgstr "å°æ–¼äº‹ä»¶ %r çš„ handler %r 拋出了一個例外"
+
+#: sphinx/extension.py:53
+#, python-format
+msgid ""
+"The %s extension is required by needs_extensions settings, but it is not "
+"loaded."
+msgstr "擴充套件 %s 被 needs_extensions 的設定所è¦æ±‚,但它沒有被載入。"
+
+#: sphinx/extension.py:69
+#, python-format
+msgid ""
+"This project needs the extension %s at least in version %s and therefore "
+"cannot be built with the loaded version (%s)."
+msgstr "這個專案需è¦æ“´å……套件 %s 的最低版本是 %s,所以無法以載入的版本 (%s) 被建立。"
+
+#: sphinx/highlighting.py:149
+#, python-format
+msgid "Pygments lexer name %r is not known"
+msgstr "Pygments lexer å稱 %r ä¸æ˜¯å·²çŸ¥çš„"
+
+#: sphinx/highlighting.py:176
+#, python-format
+msgid ""
+"Lexing literal_block %r as \"%s\" resulted in an error at token: %r. "
+"Retrying in relaxed mode."
+msgstr ""
+
+#: sphinx/project.py:65
+#, python-format
+msgid ""
+"multiple files found for the document \"%s\": %r\n"
+"Use %r for the build."
+msgstr "為文件 \"%s\" 找到多個檔案: %r\n使用 %r 來建立。"
+
+#: sphinx/project.py:74
+#, python-format
+msgid "Ignored unreadable document %r."
+msgstr ""
+
+#: sphinx/registry.py:136
+#, python-format
+msgid "Builder class %s has no \"name\" attribute"
+msgstr "Builder class %s 沒有 \"name\" 屬性"
+
+#: sphinx/registry.py:138
+#, python-format
+msgid "Builder %r already exists (in module %s)"
+msgstr "Builder %r 已存在(於 %s 模組)"
+
+#: sphinx/registry.py:151
+#, python-format
+msgid "Builder name %s not registered or available through entry point"
+msgstr "Builder å稱 %s 未註冊或無法從 entry point å–å¾—"
+
+#: sphinx/registry.py:158
+#, python-format
+msgid "Builder name %s not registered"
+msgstr "Builder å稱 %s 未註冊"
+
+#: sphinx/registry.py:165
+#, python-format
+msgid "domain %s already registered"
+msgstr "domain %s 已註冊"
+
+#: sphinx/registry.py:188 sphinx/registry.py:201 sphinx/registry.py:212
+#, python-format
+msgid "domain %s not yet registered"
+msgstr "domain %s 尚未被註冊"
+
+#: sphinx/registry.py:192
+#, python-format
+msgid "The %r directive is already registered to domain %s"
+msgstr "%r 指令已註冊給 domain %s"
+
+#: sphinx/registry.py:204
+#, python-format
+msgid "The %r role is already registered to domain %s"
+msgstr "%r 角色已註冊給 domain %s"
+
+#: sphinx/registry.py:215
+#, python-format
+msgid "The %r index is already registered to domain %s"
+msgstr "%r 索引已註冊給 domain %s"
+
+#: sphinx/registry.py:246
+#, python-format
+msgid "The %r object_type is already registered"
+msgstr "%r object_type 已註冊"
+
+#: sphinx/registry.py:272
+#, python-format
+msgid "The %r crossref_type is already registered"
+msgstr "%r crossref_type 已註冊"
+
+#: sphinx/registry.py:279
+#, python-format
+msgid "source_suffix %r is already registered"
+msgstr "source_suffix %r 已註冊"
+
+#: sphinx/registry.py:288
+#, python-format
+msgid "source_parser for %r is already registered"
+msgstr "å°æ–¼ %r çš„ source_parser 已註冊"
+
+#: sphinx/registry.py:296
+#, python-format
+msgid "Source parser for %s not registered"
+msgstr "å°æ–¼ %s çš„æºç¢¼å‰–æžå™¨æœªè¨»å†Š"
+
+#: sphinx/registry.py:312
+#, python-format
+msgid "Translator for %r already exists"
+msgstr "å°æ–¼ %r 的翻譯器已經存在"
+
+#: sphinx/registry.py:328
+#, python-format
+msgid "kwargs for add_node() must be a (visit, depart) function tuple: %r=%r"
+msgstr "å°æ–¼ add_node() çš„ kwargs 必須是一個 (visit, depart) 函å¼å€¼çµ„:%r=%r"
+
+#: sphinx/registry.py:411
+#, python-format
+msgid "enumerable_node %r already registered"
+msgstr "enumerable_node %r 已註冊"
+
+#: sphinx/registry.py:423
+#, python-format
+msgid "math renderer %s is already registered"
+msgstr "數學æ繪器 %s 已註冊"
+
+#: sphinx/registry.py:438
+#, python-format
+msgid ""
+"the extension %r was already merged with Sphinx since version %s; this "
+"extension is ignored."
+msgstr "擴充套件 %r 已被併入 %s 版以上的 Sphinx:此擴充套件已略éŽã€‚"
+
+#: sphinx/registry.py:449
+msgid "Original exception:\n"
+msgstr "原始的例外:\n"
+
+#: sphinx/registry.py:450
+#, python-format
+msgid "Could not import extension %s"
+msgstr "無法引入擴充套件 %s"
+
+#: sphinx/registry.py:455
+#, python-format
+msgid ""
+"extension %r has no setup() function; is it really a Sphinx extension "
+"module?"
+msgstr "擴充套件 %r 沒有 setup() 函å¼ï¼›å®ƒçœŸçš„是 Sphinx 擴充套件模組嗎?"
+
+#: sphinx/registry.py:464
+#, python-format
+msgid ""
+"The %s extension used by this project needs at least Sphinx v%s; it "
+"therefore cannot be built with this version."
+msgstr "此專案使用的 %s æ“´å……å¥—ä»¶éœ€è¦ Sphinx v%s 以上的版本;所以它無法以此版本被建立。"
+
+#: sphinx/registry.py:472
+#, python-format
+msgid ""
+"extension %r returned an unsupported object from its setup() function; it "
+"should return None or a metadata dictionary"
+msgstr "擴充套件 %r 從它的 setup() 函å¼å›žå‚³ä¸€å€‹æœªæ”¯æ´ç‰©ä»¶ï¼›å®ƒæ‡‰è©²å›žå‚³ None 或一個元數據資料夾"
+
+#: sphinx/roles.py:178
+#, python-format
+msgid "Python Enhancement Proposals; PEP %s"
+msgstr "Python Enhancement Proposals; PEP %s"
+
+#: sphinx/roles.py:194
+#, python-format
+msgid "invalid PEP number %s"
+msgstr "無效的 PEP 號碼 %s"
+
+#: sphinx/roles.py:228
+#, python-format
+msgid "invalid RFC number %s"
+msgstr "無效的 RFC 號碼 %s"
+
+#: sphinx/theming.py:77
+#, python-format
+msgid "theme %r doesn't have \"theme\" setting"
+msgstr "主題 %r 沒有 \"theme\" 設定"
+
+#: sphinx/theming.py:79
+#, python-format
+msgid "theme %r doesn't have \"inherit\" setting"
+msgstr "主題 %r 沒有 \"inherit\" 設定"
+
+#: sphinx/theming.py:85
+#, python-format
+msgid "no theme named %r found, inherited by %r"
+msgstr "未找到å為 %r 的主題,被 %r 繼承"
+
+#: sphinx/theming.py:108
+#, python-format
+msgid "setting %s.%s occurs in none of the searched theme configs"
+msgstr "設定 %s。%s ä¸åœ¨å·²è¢«æœå°‹çš„主題組態中出ç¾"
+
+#: sphinx/theming.py:127
+#, python-format
+msgid "unsupported theme option %r given"
+msgstr "未支æ´çš„主題é¸é … %r 被給予"
+
+#: sphinx/theming.py:216
+#, python-format
+msgid "file %r on theme path is not a valid zipfile or contains no theme"
+msgstr "主題路徑中的檔案 %r ä¸æ˜¯æœ‰æ•ˆçš„ zipfile 或未包å«ä¸»é¡Œ"
+
+#: sphinx/theming.py:230
+#, python-format
+msgid "no theme named %r found (missing theme.conf?)"
+msgstr "未找到å為 %r 的主題(缺少 theme.conf?)"
+
+#: sphinx/builders/__init__.py:183
+#, python-format
+msgid "a suitable image for %s builder not found: %s (%s)"
+msgstr "未找到å°æ–¼ %s builder é©ç”¨çš„圖片:%s (%s)"
+
+#: sphinx/builders/__init__.py:187
+#, python-format
+msgid "a suitable image for %s builder not found: %s"
+msgstr "未找到å°æ–¼ %s builder é©ç”¨çš„圖片:%s"
+
+#: sphinx/builders/__init__.py:207
+msgid "building [mo]: "
+msgstr "建立 [mo]:"
+
+#: sphinx/builders/__init__.py:208 sphinx/builders/__init__.py:575
+#: sphinx/builders/__init__.py:602
+msgid "writing output... "
+msgstr "編寫輸出..."
+
+#: sphinx/builders/__init__.py:217
+#, python-format
+msgid "all of %d po files"
+msgstr "所有的 %d po 檔"
+
+#: sphinx/builders/__init__.py:235
+#, python-format
+msgid "targets for %d po files that are specified"
+msgstr "å°æ–¼æŒ‡å®šçš„ po 檔 %d 的目標"
+
+#: sphinx/builders/__init__.py:243
+#, python-format
+msgid "targets for %d po files that are out of date"
+msgstr "å°æ–¼å·²éŽæœŸ po 檔 %d 的目標"
+
+#: sphinx/builders/__init__.py:252
+msgid "all source files"
+msgstr "所有原始檔案"
+
+#: sphinx/builders/__init__.py:262
+#, python-format
+msgid "file %r given on command line does not exist, "
+msgstr "在命令列給的檔案 %r ä¸å­˜åœ¨ï¼Œ"
+
+#: sphinx/builders/__init__.py:267
+#, python-format
+msgid ""
+"file %r given on command line is not under the source directory, ignoring"
+msgstr "在命令列給的檔案 %r ä¸åœ¨ä¾†æºè³‡æ–™å¤¾ä¸‹ï¼Œå¿½ç•¥ä¸­"
+
+#: sphinx/builders/__init__.py:273
+#, python-format
+msgid "file %r given on command line is not a valid document, ignoring"
+msgstr "在命令列給的檔案 %r ä¸æ˜¯æœ‰æ•ˆçš„文件,忽略中"
+
+#: sphinx/builders/__init__.py:282
+#, python-format
+msgid "%d source files given on command line"
+msgstr "在命令列給了 %d 個原始檔案"
+
+#: sphinx/builders/__init__.py:294
+#, python-format
+msgid "targets for %d source files that are out of date"
+msgstr "%d 個éŽæ™‚原始檔案的目標"
+
+#: sphinx/builders/__init__.py:309 sphinx/builders/gettext.py:236
+#, python-format
+msgid "building [%s]: "
+msgstr "正在建立 [%s]:"
+
+#: sphinx/builders/__init__.py:316
+msgid "looking for now-outdated files... "
+msgstr "正在尋找目å‰å·²éŽæœŸçš„檔案..."
+
+#: sphinx/builders/__init__.py:321
+#, python-format
+msgid "%d found"
+msgstr "已找到 %d"
+
+#: sphinx/builders/__init__.py:323
+msgid "none found"
+msgstr "找ä¸åˆ°ä»»ä½•çµæžœ"
+
+#: sphinx/builders/__init__.py:328
+msgid "pickling environment"
+msgstr "正在 pickle 環境"
+
+#: sphinx/builders/__init__.py:334
+msgid "checking consistency"
+msgstr "正在檢查一致性"
+
+#: sphinx/builders/__init__.py:338
+msgid "no targets are out of date."
+msgstr "沒有éŽæ™‚的目標。"
+
+#: sphinx/builders/__init__.py:377
+msgid "updating environment: "
+msgstr "正在更新環境:"
+
+#: sphinx/builders/__init__.py:398
+#, python-format
+msgid "%s added, %s changed, %s removed"
+msgstr "%s 已新增, %s 已變更, %s 已移除"
+
+#: sphinx/builders/__init__.py:436 sphinx/builders/__init__.py:448
+msgid "reading sources... "
+msgstr "正在讀å–來æº..."
+
+#: sphinx/builders/__init__.py:550
+#, python-format
+msgid "docnames to write: %s"
+msgstr "待寫入的 docname: %s"
+
+#: sphinx/builders/__init__.py:559 sphinx/builders/singlehtml.py:156
+msgid "preparing documents"
+msgstr "正在準備文件"
+
+#: sphinx/builders/__init__.py:562
+msgid "copying assets"
+msgstr ""
+
+#: sphinx/builders/_epub_base.py:215
+#, python-format
+msgid "duplicated ToC entry found: %s"
+msgstr "找到了é‡è¤‡çš„ ToC 項目: %s"
+
+#: sphinx/builders/_epub_base.py:403 sphinx/builders/html/__init__.py:750
+#: sphinx/builders/latex/__init__.py:425 sphinx/builders/texinfo.py:183
+msgid "copying images... "
+msgstr "正在複製圖片..."
+
+#: sphinx/builders/_epub_base.py:410
+#, python-format
+msgid "cannot read image file %r: copying it instead"
+msgstr "無法讀å–圖片檔 %r: 正在複製它åšç‚ºæ›¿ä»£"
+
+#: sphinx/builders/_epub_base.py:416 sphinx/builders/html/__init__.py:758
+#: sphinx/builders/latex/__init__.py:433 sphinx/builders/texinfo.py:193
+#, python-format
+msgid "cannot copy image file %r: %s"
+msgstr "無法複製圖片檔 %r: %s"
+
+#: sphinx/builders/_epub_base.py:433
+#, python-format
+msgid "cannot write image file %r: %s"
+msgstr "無法寫入圖片檔 %r: %s"
+
+#: sphinx/builders/_epub_base.py:443
+msgid "Pillow not found - copying image files"
+msgstr "未找到 Pillow - 正在複製圖片檔"
+
+#: sphinx/builders/_epub_base.py:469
+msgid "writing mimetype file..."
+msgstr "正在寫入 mimetype 檔案..."
+
+#: sphinx/builders/_epub_base.py:474
+msgid "writing META-INF/container.xml file..."
+msgstr "正在寫入 META-INF/container.xml 檔案..."
+
+#: sphinx/builders/_epub_base.py:508
+msgid "writing content.opf file..."
+msgstr "正在寫入 content.opf 檔案..."
+
+#: sphinx/builders/_epub_base.py:531
+#, python-format
+msgid "unknown mimetype for %s, ignoring"
+msgstr "å°æ–¼ %s 未知的 mimetype,忽略中"
+
+#: sphinx/builders/_epub_base.py:678
+msgid "writing toc.ncx file..."
+msgstr "正在寫入 toc.ncx 檔案..."
+
+#: sphinx/builders/_epub_base.py:703
+#, python-format
+msgid "writing %s file..."
+msgstr "正在寫入 %s 檔案..."
+
+#: sphinx/builders/changes.py:30
+#, python-format
+msgid "The overview file is in %(outdir)s."
+msgstr "概觀檔案是在 %(outdir)s 。"
+
+#: sphinx/builders/changes.py:56
+#, python-format
+msgid "no changes in version %s."
+msgstr "在 %s 版中無變更"
+
+#: sphinx/builders/changes.py:58
+msgid "writing summary file..."
+msgstr "正在寫入摘è¦æª”案..."
+
+#: sphinx/builders/changes.py:73
+msgid "Builtins"
+msgstr "內建"
+
+#: sphinx/builders/changes.py:75
+msgid "Module level"
+msgstr "模組層次"
+
+#: sphinx/builders/changes.py:118
+msgid "copying source files..."
+msgstr "正在複製原始檔案..."
+
+#: sphinx/builders/changes.py:125
+#, python-format
+msgid "could not read %r for changelog creation"
+msgstr "åœ¨è®Šæ›´æ—¥èªŒå»ºç«‹æ™‚ç„¡æ³•è®€å– %r"
+
+#: sphinx/builders/dummy.py:18
+msgid "The dummy builder generates no files."
+msgstr "虛擬建立器未產生任何檔案。"
+
+#: sphinx/builders/epub3.py:79
+#, python-format
+msgid "The ePub file is in %(outdir)s."
+msgstr "ePub 檔案是在 %(outdir)s 。"
+
+#: sphinx/builders/epub3.py:183
+msgid "writing nav.xhtml file..."
+msgstr "正在寫入 nav.xhtml 檔案..."
+
+#: sphinx/builders/epub3.py:209
+msgid "conf value \"epub_language\" (or \"language\") should not be empty for EPUB3"
+msgstr "conf 值 \"epub_language\" (或 \"language\") 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:213
+msgid "conf value \"epub_uid\" should be XML NAME for EPUB3"
+msgstr "conf 值 \"epub_uid\" 在 EPUB3 應該是 XML NAME"
+
+#: sphinx/builders/epub3.py:216
+msgid "conf value \"epub_title\" (or \"html_title\") should not be empty for EPUB3"
+msgstr "conf 值 \"epub_title\" (或 \"html_title\") 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:220
+msgid "conf value \"epub_author\" should not be empty for EPUB3"
+msgstr "conf 值 \"epub_author\" 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:223
+msgid "conf value \"epub_contributor\" should not be empty for EPUB3"
+msgstr "conf 值 \"epub_contributor\" 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:226
+msgid "conf value \"epub_description\" should not be empty for EPUB3"
+msgstr "conf 值 \"epub_description\" 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:229
+msgid "conf value \"epub_publisher\" should not be empty for EPUB3"
+msgstr "conf 值 \"epub_publisher\" 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:232
+msgid "conf value \"epub_copyright\" (or \"copyright\")should not be empty for EPUB3"
+msgstr "conf 值 \"epub_copyright\" (或 \"copyright\") 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:236
+msgid "conf value \"epub_identifier\" should not be empty for EPUB3"
+msgstr "conf 值 \"epub_identifier\" 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:239
+msgid "conf value \"version\" should not be empty for EPUB3"
+msgstr "conf 值 \"version\" 在 EPUB3 ä¸æ‡‰è©²ç‚ºç©º"
+
+#: sphinx/builders/epub3.py:253 sphinx/builders/html/__init__.py:1189
+#, python-format
+msgid "invalid css_file: %r, ignored"
+msgstr "無效的 css_file: %r, 已略éŽ"
+
+#: sphinx/builders/gettext.py:215
+#, python-format
+msgid "The message catalogs are in %(outdir)s."
+msgstr "訊æ¯ç›®éŒ„是在 %(outdir)s"
+
+#: sphinx/builders/gettext.py:237
+#, python-format
+msgid "targets for %d template files"
+msgstr "模æ¿æª” %d 的目標"
+
+#: sphinx/builders/gettext.py:241
+msgid "reading templates... "
+msgstr "正在讀å–模æ¿..."
+
+#: sphinx/builders/gettext.py:275
+msgid "writing message catalogs... "
+msgstr "正在寫入訊æ¯ç›®éŒ„..."
+
+#: sphinx/builders/linkcheck.py:60
+#, python-format
+msgid "Look for any errors in the above output or in %(outdir)s/output.txt"
+msgstr "尋找以上輸出或 %(outdir)s/output.txt 中的任何錯誤"
+
+#: sphinx/builders/linkcheck.py:109
+#, python-format
+msgid "broken link: %s (%s)"
+msgstr "錯誤連çµï¼š %s (%s)"
+
+#: sphinx/builders/linkcheck.py:606
+#, python-format
+msgid "Failed to compile regex in linkcheck_allowed_redirects: %r %s"
+msgstr "在 linkcheck_allowed_redirects 編譯 regex 失敗: %r %s"
+
+#: sphinx/builders/manpage.py:35
+#, python-format
+msgid "The manual pages are in %(outdir)s."
+msgstr "手冊é é¢åœ¨ %(outdir)s"
+
+#: sphinx/builders/manpage.py:42
+msgid "no \"man_pages\" config value found; no manual pages will be written"
+msgstr "未找到 \"man_pages\" 組態值:ä¸æœƒç·¨å¯«ä»»ä½•æ‰‹å†Šé é¢"
+
+#: sphinx/builders/latex/__init__.py:309 sphinx/builders/manpage.py:51
+#: sphinx/builders/singlehtml.py:164 sphinx/builders/texinfo.py:110
+msgid "writing"
+msgstr "編寫中"
+
+#: sphinx/builders/manpage.py:66
+#, python-format
+msgid "\"man_pages\" config value references unknown document %s"
+msgstr "\"man_pages\" 組態值引用未知的文件 %s"
+
+#: sphinx/builders/singlehtml.py:32
+#, python-format
+msgid "The HTML page is in %(outdir)s."
+msgstr "HTML é é¢åœ¨ %(outdir)s 。"
+
+#: sphinx/builders/singlehtml.py:159
+msgid "assembling single document"
+msgstr "正在組åˆå–®ä¸€æ–‡ä»¶"
+
+#: sphinx/builders/singlehtml.py:177
+msgid "writing additional files"
+msgstr "正在寫入附加檔案"
+
+#: sphinx/builders/texinfo.py:46
+#, python-format
+msgid "The Texinfo files are in %(outdir)s."
+msgstr "Texinfo 檔案在 %(outdir)s 。"
+
+#: sphinx/builders/texinfo.py:48
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through makeinfo\n"
+"(use 'make info' here to do that automatically)."
+msgstr "\n在該目錄中執行 'make' 以é€éŽ makeinfo 執行這些\n(在此使用 'make info' 以自動執行)"
+
+#: sphinx/builders/texinfo.py:75
+msgid "no \"texinfo_documents\" config value found; no documents will be written"
+msgstr "未找到 \"texinfo_documents\" 組態值;ä¸æœƒç·¨å¯«ä»»ä½•æ–‡ä»¶"
+
+#: sphinx/builders/texinfo.py:83
+#, python-format
+msgid "\"texinfo_documents\" config value references unknown document %s"
+msgstr "\"texinfo_documents\" 組態值引用未知的文件 %s"
+
+#: sphinx/builders/latex/__init__.py:291 sphinx/builders/texinfo.py:106
+#, python-format
+msgid "processing %s"
+msgstr "æ­£åœ¨è™•ç† %s"
+
+#: sphinx/builders/latex/__init__.py:364 sphinx/builders/texinfo.py:159
+msgid "resolving references..."
+msgstr "正在解æžåƒç…§..."
+
+#: sphinx/builders/latex/__init__.py:374 sphinx/builders/texinfo.py:168
+msgid " (in "
+msgstr " (æ–¼ "
+
+#: sphinx/builders/texinfo.py:198
+msgid "copying Texinfo support files"
+msgstr "正在複製 Texinfo 支æ´æª”案"
+
+#: sphinx/builders/texinfo.py:202
+#, python-format
+msgid "error writing file Makefile: %s"
+msgstr "錯誤寫入檔案 Makefile: %s"
+
+#: sphinx/builders/text.py:29
+#, python-format
+msgid "The text files are in %(outdir)s."
+msgstr "文字檔案在 %(outdir)s 。"
+
+#: sphinx/builders/html/__init__.py:1140 sphinx/builders/text.py:76
+#: sphinx/builders/xml.py:94
+#, python-format
+msgid "error writing file %s: %s"
+msgstr "錯誤寫入檔案 %s: %s"
+
+#: sphinx/builders/xml.py:34
+#, python-format
+msgid "The XML files are in %(outdir)s."
+msgstr "XML 檔案在 %(outdir)s 。"
+
+#: sphinx/builders/xml.py:106
+#, python-format
+msgid "The pseudo-XML files are in %(outdir)s."
+msgstr "pseudo-XML 檔案在 %(outdir)s 。"
+
+#: sphinx/builders/html/__init__.py:122
+#, python-format
+msgid "build info file is broken: %r"
+msgstr "build info 檔案已失效: %r"
+
+#: sphinx/builders/html/__init__.py:159
+#, python-format
+msgid "The HTML pages are in %(outdir)s."
+msgstr "HTML é é¢åœ¨ %(outdir)s 。"
+
+#: sphinx/builders/html/__init__.py:385
+#, python-format
+msgid "Failed to read build info file: %r"
+msgstr "è®€å– build info 檔失敗: %r"
+
+#: sphinx/builders/html/__init__.py:478 sphinx/builders/latex/__init__.py:187
+#: sphinx/transforms/__init__.py:117 sphinx/writers/manpage.py:100
+#: sphinx/writers/texinfo.py:225
+#, python-format
+msgid "%b %d, %Y"
+msgstr "%Y 年 %m 月 %d 日"
+
+#: sphinx/builders/html/__init__.py:497 sphinx/themes/basic/defindex.html:30
+msgid "General Index"
+msgstr "總索引"
+
+#: sphinx/builders/html/__init__.py:497
+msgid "index"
+msgstr "索引"
+
+#: sphinx/builders/html/__init__.py:569
+msgid "next"
+msgstr "下一é "
+
+#: sphinx/builders/html/__init__.py:578
+msgid "previous"
+msgstr "上一é "
+
+#: sphinx/builders/html/__init__.py:674
+msgid "generating indices"
+msgstr "正在產生索引"
+
+#: sphinx/builders/html/__init__.py:689
+msgid "writing additional pages"
+msgstr "正在編寫附加é é¢"
+
+#: sphinx/builders/html/__init__.py:768
+msgid "copying downloadable files... "
+msgstr "正在複製å¯ä¸‹è¼‰çš„檔案..."
+
+#: sphinx/builders/html/__init__.py:776
+#, python-format
+msgid "cannot copy downloadable file %r: %s"
+msgstr "無法複製å¯ä¸‹è¼‰çš„檔案 %r: %s"
+
+#: sphinx/builders/html/__init__.py:809 sphinx/builders/html/__init__.py:821
+#, python-format
+msgid "Failed to copy a file in html_static_file: %s: %r"
+msgstr "在 html_static_file 中複製一個檔案失敗: %s: %r "
+
+#: sphinx/builders/html/__init__.py:842
+msgid "copying static files"
+msgstr "正在複製éœæ…‹æª”案"
+
+#: sphinx/builders/html/__init__.py:858
+#, python-format
+msgid "cannot copy static file %r"
+msgstr "無法複製éœæ…‹æª”案 %r"
+
+#: sphinx/builders/html/__init__.py:863
+msgid "copying extra files"
+msgstr "正在複製é¡å¤–檔案"
+
+#: sphinx/builders/html/__init__.py:869
+#, python-format
+msgid "cannot copy extra file %r"
+msgstr "無法複製é¡å¤–檔案 %r"
+
+#: sphinx/builders/html/__init__.py:876
+#, python-format
+msgid "Failed to write build info file: %r"
+msgstr "寫入 build info 檔失敗: %r"
+
+#: sphinx/builders/html/__init__.py:925
+msgid ""
+"search index couldn't be loaded, but not all documents will be built: the "
+"index will be incomplete."
+msgstr "æœå°‹ç´¢å¼•ç„¡æ³•è¢«è¼‰å…¥ï¼Œä½†ä¸æ˜¯æ‰€æœ‰çš„文件都會被建置:索引將會是ä¸å®Œå…¨çš„。"
+
+#: sphinx/builders/html/__init__.py:986
+#, python-format
+msgid "page %s matches two patterns in html_sidebars: %r and %r"
+msgstr "é é¢ %s 在 html_sidebars 中符åˆå…©å€‹åž‹æ¨£ï¼š %r å’Œ %r"
+
+#: sphinx/builders/html/__init__.py:1123
+#, python-format
+msgid ""
+"a Unicode error occurred when rendering the page %s. Please make sure all "
+"config values that contain non-ASCII content are Unicode strings."
+msgstr "在呈ç¾é é¢ %s 時發生了一個 Unicode 錯誤。請確èªæ‰€æœ‰åŒ…å« non-ASCII 內容的組態值都是 Unicode 字串。"
+
+#: sphinx/builders/html/__init__.py:1128
+#, python-format
+msgid ""
+"An error happened in rendering the page %s.\n"
+"Reason: %r"
+msgstr "在呈ç¾é é¢ %s 時發生了一個錯誤。\n原因: %r"
+
+#: sphinx/builders/html/__init__.py:1156
+msgid "dumping object inventory"
+msgstr "正在傾å°ç‰©ä»¶åº«å­˜"
+
+#: sphinx/builders/html/__init__.py:1164
+#, python-format
+msgid "dumping search index in %s"
+msgstr "正在傾å°æœå°‹ç´¢å¼•æ–¼ %s"
+
+#: sphinx/builders/html/__init__.py:1212
+#, python-format
+msgid "invalid js_file: %r, ignored"
+msgstr "無效的 js_file: %r, 已略éŽ"
+
+#: sphinx/builders/html/__init__.py:1240
+msgid "Many math_renderers are registered. But no math_renderer is selected."
+msgstr "多個 math_renderer 已被註冊。但是沒有 math_renderer 被é¸æ“‡ã€‚"
+
+#: sphinx/builders/html/__init__.py:1243
+#, python-format
+msgid "Unknown math_renderer %r is given."
+msgstr "未知的 math_renderer %r 被給予。"
+
+#: sphinx/builders/html/__init__.py:1251
+#, python-format
+msgid "html_extra_path entry %r does not exist"
+msgstr "html_extra_path é …ç›® %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1255
+#, python-format
+msgid "html_extra_path entry %r is placed inside outdir"
+msgstr "html_extra_path 項目 %r 被放入 outdir"
+
+#: sphinx/builders/html/__init__.py:1264
+#, python-format
+msgid "html_static_path entry %r does not exist"
+msgstr "html_static_path é …ç›® %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1268
+#, python-format
+msgid "html_static_path entry %r is placed inside outdir"
+msgstr "html_static_path 項目 %r 被放入 outdir"
+
+#: sphinx/builders/html/__init__.py:1277 sphinx/builders/latex/__init__.py:437
+#, python-format
+msgid "logo file %r does not exist"
+msgstr "標誌檔案 %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1286
+#, python-format
+msgid "favicon file %r does not exist"
+msgstr "favicon 檔案 %r ä¸å­˜åœ¨"
+
+#: sphinx/builders/html/__init__.py:1293
+msgid ""
+"HTML 4 is no longer supported by Sphinx. (\"html4_writer=True\" detected in "
+"configuration options)"
+msgstr ""
+
+#: sphinx/builders/html/__init__.py:1308
+#, python-format
+msgid "%s %s documentation"
+msgstr "%s %s 說明文件"
+
+#: sphinx/builders/latex/__init__.py:113
+#, python-format
+msgid "The LaTeX files are in %(outdir)s."
+msgstr "LaTeX 檔案在 %(outdir)s 。"
+
+#: sphinx/builders/latex/__init__.py:115
+msgid ""
+"\n"
+"Run 'make' in that directory to run these through (pdf)latex\n"
+"(use `make latexpdf' here to do that automatically)."
+msgstr "\n在該目錄中執行 'make' 以é€éŽ (pdf)latex 執行這些\n(在此使用 'make latexpdf' 以自動執行)"
+
+#: sphinx/builders/latex/__init__.py:150
+msgid "no \"latex_documents\" config value found; no documents will be written"
+msgstr "未找到 \"latex_documents\" 組態值;ä¸æœƒç·¨å¯«ä»»ä½•æ–‡ä»¶"
+
+#: sphinx/builders/latex/__init__.py:158
+#, python-format
+msgid "\"latex_documents\" config value references unknown document %s"
+msgstr "\"latex_documents\" 組態值引用未知的文件 %s"
+
+#: sphinx/builders/latex/__init__.py:194 sphinx/domains/std.py:557
+#: sphinx/domains/std.py:569 sphinx/templates/latex/latex.tex_t:106
+#: sphinx/themes/basic/genindex-single.html:30
+#: sphinx/themes/basic/genindex-single.html:55
+#: 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:34
+#: sphinx/themes/basic/genindex.html:67 sphinx/themes/basic/layout.html:138
+#: sphinx/writers/texinfo.py:493
+msgid "Index"
+msgstr "索引"
+
+#: sphinx/builders/latex/__init__.py:197 sphinx/templates/latex/latex.tex_t:91
+msgid "Release"
+msgstr "發佈"
+
+#: sphinx/builders/latex/__init__.py:211 sphinx/writers/latex.py:370
+#, python-format
+msgid "no Babel option known for language %r"
+msgstr "沒有語言 %r 已知的 Babel é¸é …"
+
+#: sphinx/builders/latex/__init__.py:387
+msgid "copying TeX support files"
+msgstr "正在複製 TeX 支æ´æª”案"
+
+#: sphinx/builders/latex/__init__.py:403
+msgid "copying TeX support files..."
+msgstr "正在複製 TeX 支æ´æª”案..."
+
+#: sphinx/builders/latex/__init__.py:416
+msgid "copying additional files"
+msgstr "正在複製附加檔案"
+
+#: sphinx/builders/latex/__init__.py:459
+#, python-format
+msgid "Unknown configure key: latex_elements[%r], ignored."
+msgstr "未知的é…ç½®éµï¼š latex_elements[%r],已略éŽã€‚"
+
+#: sphinx/builders/latex/__init__.py:467
+#, python-format
+msgid "Unknown theme option: latex_theme_options[%r], ignored."
+msgstr "未知的主題é¸é …: latex_theme_options[%r],,已略éŽã€‚"
+
+#: sphinx/builders/latex/theming.py:87
+#, python-format
+msgid "%r doesn't have \"theme\" setting"
+msgstr "%r 沒有「主題ã€è¨­å®š"
+
+#: sphinx/builders/latex/theming.py:90
+#, python-format
+msgid "%r doesn't have \"%s\" setting"
+msgstr "%r 沒有 \"%s\" 設定"
+
+#: sphinx/builders/latex/transforms.py:117
+msgid "Failed to get a docname!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:118
+msgid "Failed to get a docname for source {source!r}!"
+msgstr ""
+
+#: sphinx/builders/latex/transforms.py:479
+#, python-format
+msgid "No footnote was found for given reference node %r"
+msgstr ""
+
+#: sphinx/cmd/build.py:46
+msgid "Exception occurred while building, starting debugger:"
+msgstr "在建立時發生例外,正在啟動除錯器:"
+
+#: sphinx/cmd/build.py:61
+msgid "Interrupted!"
+msgstr "已中斷ï¼"
+
+#: sphinx/cmd/build.py:63
+msgid "reST markup error:"
+msgstr "reST 標示錯誤:"
+
+#: sphinx/cmd/build.py:69
+msgid "Encoding error:"
+msgstr "編碼錯誤:"
+
+#: sphinx/cmd/build.py:72 sphinx/cmd/build.py:87
+#, python-format
+msgid ""
+"The full traceback has been saved in %s, if you want to report the issue to "
+"the developers."
+msgstr "若您想è¦å›žå ±å•é¡Œçµ¦é–‹ç™¼è€…,完整的回溯已被儲存在 %s 中。"
+
+#: sphinx/cmd/build.py:76
+msgid "Recursion error:"
+msgstr "éžè¿´éŒ¯èª¤ï¼š"
+
+#: sphinx/cmd/build.py:79
+msgid ""
+"This can happen with very large or deeply nested source files. You can "
+"carefully increase the default Python recursion limit of 1000 in conf.py "
+"with e.g.:"
+msgstr "這會發生在éžå¸¸å¤§æˆ–是巢套較深的原始檔案。您å¯ä»¥åœ¨ conf.py 中謹慎地增加 Python çš„é è¨­ 1000 次éžè¿´ä¸Šé™ï¼Œä¾‹å¦‚:"
+
+#: sphinx/cmd/build.py:84
+msgid "Exception occurred:"
+msgstr "發生例外:"
+
+#: sphinx/cmd/build.py:90
+msgid ""
+"Please also report this if it was a user error, so that a better error "
+"message can be provided next time."
+msgstr "如果這是一個使用者錯誤,請一併回報,如此下次æ‰èƒ½æ供較佳的錯誤訊æ¯ã€‚"
+
+#: sphinx/cmd/build.py:93
+msgid ""
+"A bug report can be filed in the tracker at <https://github.com/sphinx-"
+"doc/sphinx/issues>. Thanks!"
+msgstr "錯誤回報å¯è¢«æ­¸æª”於追蹤系統中,它是在 <https://github.com/sphinx-doc/sphinx/issues>. è¬è¬ï¼"
+
+#: sphinx/cmd/build.py:109
+msgid "job number should be a positive number"
+msgstr "工件編號應該是一個正數"
+
+#: sphinx/cmd/build.py:117 sphinx/cmd/quickstart.py:477
+#: sphinx/ext/apidoc.py:319 sphinx/ext/autosummary/generate.py:689
+msgid "For more information, visit <https://www.sphinx-doc.org/>."
+msgstr "需è¦æ›´å¤šè³‡è¨Šï¼Œè«‹æ‹œè¨ª <https://www.sphinx-doc.org/>."
+
+#: sphinx/cmd/build.py:118
+msgid ""
+"\n"
+"Generate documentation from source files.\n"
+"\n"
+"sphinx-build generates documentation from the files in SOURCEDIR and places it\n"
+"in OUTPUTDIR. It looks for 'conf.py' in SOURCEDIR for the configuration\n"
+"settings. The 'sphinx-quickstart' tool may be used to generate template files,\n"
+"including 'conf.py'\n"
+"\n"
+"sphinx-build can create documentation in different formats. A format is\n"
+"selected by specifying the builder name on the command line; it defaults to\n"
+"HTML. Builders can also perform other tasks related to documentation\n"
+"processing.\n"
+"\n"
+"By default, everything that is outdated is built. Output only for selected\n"
+"files can be built by specifying individual filenames.\n"
+msgstr "\n從原始檔案產生說明文件。\n\nsphinx-build 會從 SOURCEDIR 中的檔案來產生說明文件,並\n將它置放於 OUTPUTDIR。它會在 SOURCEDIR 中尋找 'conf.py' \n內的組態設定。'sphinx-quickstart' 工具å¯ä»¥ç”¨ä¾†ç”¢ç”Ÿæ¨¡æ¿æª”案,\n包括 'conf.py'\n\nsphinx-build 能以ä¸åŒçš„æ ¼å¼å»ºç«‹èªªæ˜Žæ–‡ä»¶ã€‚在命令列指定建立\n器的å稱來é¸æ“‡ä¸€ç¨®æ ¼å¼ï¼›å…¶é è¨­å€¼ç‚º HTML。建立器也能執行\n與處ç†èªªæ˜Žæ–‡ä»¶æœ‰é—œçš„其他任務。\n\n在é è¨­æƒ…æ³ï¼Œæ‰€æœ‰èˆŠçš„文件都已經被建立。指定個別的檔å,\nå¯ä»¥åœ¨å»ºç«‹æ™‚僅é™æ–¼è¼¸å‡ºæ‰€é¸çš„檔案。\n"
+
+#: sphinx/cmd/build.py:139
+msgid "path to documentation source files"
+msgstr "到說明文件原始檔案的路徑"
+
+#: sphinx/cmd/build.py:141
+msgid "path to output directory"
+msgstr "到輸出資料夾的路徑"
+
+#: sphinx/cmd/build.py:143
+msgid "a list of specific files to rebuild. Ignored if -a is specified"
+msgstr "一份è¦é‡å»ºçš„特定檔案列表。如果 -a 被指定則會被略éŽã€‚"
+
+#: sphinx/cmd/build.py:146
+msgid "general options"
+msgstr "一般é¸é …"
+
+#: sphinx/cmd/build.py:149
+msgid "builder to use (default: html)"
+msgstr "è¦ä½¿ç”¨çš„建立器(é è¨­å€¼ï¼šhtml)"
+
+#: sphinx/cmd/build.py:151
+msgid "write all files (default: only write new and changed files)"
+msgstr "寫入所有檔案(é è¨­ï¼šåªå¯«å…¥æ–°å¢žåŠå·²è®Šæ›´æª”案)"
+
+#: sphinx/cmd/build.py:154
+msgid "don't use a saved environment, always read all files"
+msgstr "ä¸è¦ä½¿ç”¨å·²å„²å­˜çš„環境,永é è¦è®€å–全部的檔案"
+
+#: sphinx/cmd/build.py:157
+msgid ""
+"path for the cached environment and doctree files (default: "
+"OUTPUTDIR/.doctrees)"
+msgstr "已存快å–ç’°å¢ƒåŠ doctree 檔案的路徑(é è¨­å€¼ï¼šOUTPUTDIR/.doctrees)"
+
+#: sphinx/cmd/build.py:161
+msgid ""
+"build in parallel with N processes where possible (special value \"auto\" "
+"will set N to cpu-count)"
+msgstr "盡å¯èƒ½ä»¥ N 個程åºå¹³è¡Œå»ºç«‹ï¼ˆç‰¹æ®Šå€¼ \"auto\" 會設定 N 為 cpu-count)"
+
+#: sphinx/cmd/build.py:165
+msgid ""
+"path where configuration file (conf.py) is located (default: same as "
+"SOURCEDIR)"
+msgstr "組態檔案 (conf.py) 所在的路徑(é è¨­å€¼ï¼šèˆ‡ SOURCEDIR 相åŒï¼‰"
+
+#: sphinx/cmd/build.py:168
+msgid "use no config file at all, only -D options"
+msgstr "完全ä¸ä½¿ç”¨çµ„態檔案,åªç”¨ -D é¸é …"
+
+#: sphinx/cmd/build.py:171
+msgid "override a setting in configuration file"
+msgstr "在組態檔案中置æ›ä¸€é …設定"
+
+#: sphinx/cmd/build.py:174
+msgid "pass a value into HTML templates"
+msgstr "傳éžä¸€å€‹å€¼é€²å…¥ HTML 模æ¿"
+
+#: sphinx/cmd/build.py:177
+msgid "define tag: include \"only\" blocks with TAG"
+msgstr "定義 tag:「åªã€åŒ…å«æœ‰ TAG çš„å€å¡Š"
+
+#: sphinx/cmd/build.py:179
+msgid "nit-picky mode, warn about all missing references"
+msgstr "nit-picky 模å¼ï¼Œå°æ‰€æœ‰éºæ¼çš„åƒç…§ç™¼å‡ºè­¦å‘Š"
+
+#: sphinx/cmd/build.py:182
+msgid "console output options"
+msgstr "控制å°è¼¸å‡ºé¸é …"
+
+#: sphinx/cmd/build.py:184
+msgid "increase verbosity (can be repeated)"
+msgstr "增加贅言(å¯ä»¥è¢«é‡è¤‡ï¼‰"
+
+#: sphinx/cmd/build.py:186 sphinx/ext/apidoc.py:342
+msgid "no output on stdout, just warnings on stderr"
+msgstr "在 stdout 無輸出,åªæœ‰åœ¨ stderr 的警告"
+
+#: sphinx/cmd/build.py:188
+msgid "no output at all, not even warnings"
+msgstr "完全沒有輸出,也沒有警告"
+
+#: sphinx/cmd/build.py:191
+msgid "do emit colored output (default: auto-detect)"
+msgstr "執行 emit 彩色輸出(é è¨­å€¼ï¼šauto-detect)"
+
+#: sphinx/cmd/build.py:194
+msgid "do not emit colored output (default: auto-detect)"
+msgstr "ä¸åŸ·è¡Œ emit 彩色輸出(é è¨­å€¼ï¼šauto-detect)"
+
+#: sphinx/cmd/build.py:197
+msgid "write warnings (and errors) to given file"
+msgstr "寫入警告(åŠéŒ¯èª¤ï¼‰è‡³çµ¦å®šçš„檔案"
+
+#: sphinx/cmd/build.py:199
+msgid "turn warnings into errors"
+msgstr "將警告轉為錯誤"
+
+#: sphinx/cmd/build.py:201
+msgid "with -W, keep going when getting warnings"
+msgstr "帶有 -W,在得到警告時會繼續å‰é€²"
+
+#: sphinx/cmd/build.py:203
+msgid "show full traceback on exception"
+msgstr "在例外中顯示完整的回溯"
+
+#: sphinx/cmd/build.py:205
+msgid "run Pdb on exception"
+msgstr "在例外中執行 Pdb"
+
+#: sphinx/cmd/build.py:229
+msgid "cannot combine -a option and filenames"
+msgstr "無法åˆä½µ -a é¸é …åŠæª”å"
+
+#: sphinx/cmd/build.py:250
+#, python-format
+msgid "cannot open warning file %r: %s"
+msgstr "無法開啟警告檔案 %r: %s"
+
+#: sphinx/cmd/build.py:264
+msgid "-D option argument must be in the form name=value"
+msgstr "-D é¸é …引數必須是 name=value çš„å½¢å¼"
+
+#: sphinx/cmd/build.py:271
+msgid "-A option argument must be in the form name=value"
+msgstr "-A é¸é …引數必須是 name=value çš„å½¢å¼"
+
+#: sphinx/cmd/quickstart.py:48
+msgid "automatically insert docstrings from modules"
+msgstr "從模組自動æ’入說明字串"
+
+#: sphinx/cmd/quickstart.py:49
+msgid "automatically test code snippets in doctest blocks"
+msgstr "在 doctest å€å¡Šè‡ªå‹•æ¸¬è©¦ç¨‹å¼ç¢¼ç‰‡æ®µ"
+
+#: sphinx/cmd/quickstart.py:50
+msgid "link between Sphinx documentation of different projects"
+msgstr "在ä¸åŒå°ˆæ¡ˆçš„ Sphinx 說明文件中éˆæŽ¥"
+
+#: sphinx/cmd/quickstart.py:51
+msgid "write \"todo\" entries that can be shown or hidden on build"
+msgstr "寫入 \"todo\" 項目,它們å¯ä»¥åœ¨çµ„建時被顯示或隱è—"
+
+#: sphinx/cmd/quickstart.py:52
+msgid "checks for documentation coverage"
+msgstr "æ ¸å°èªªæ˜Žæ–‡ä»¶çš„涵蓋範åœ"
+
+#: sphinx/cmd/quickstart.py:53
+msgid "include math, rendered as PNG or SVG images"
+msgstr "åŒ…å« math,以 PNG 或 SVG å½±åƒè¢«å‘ˆç¾"
+
+#: sphinx/cmd/quickstart.py:54
+msgid "include math, rendered in the browser by MathJax"
+msgstr "åŒ…å« math,被 MathJax 在ç€è¦½å™¨ä¸­å‘ˆç¾"
+
+#: sphinx/cmd/quickstart.py:55
+msgid "conditional inclusion of content based on config values"
+msgstr "根據組態值有æ¢ä»¶åœ°åŒ…å«å…§å®¹"
+
+#: sphinx/cmd/quickstart.py:56
+msgid "include links to the source code of documented Python objects"
+msgstr "包å«éˆæŽ¥è‡³å·²æœ‰èªªæ˜Žæ–‡ä»¶çš„ Python 物件原始碼"
+
+#: sphinx/cmd/quickstart.py:57
+msgid "create .nojekyll file to publish the document on GitHub pages"
+msgstr "建立 .nojekyll 檔案以在 GitHub é é¢ç™¼å¸ƒæ–‡ä»¶"
+
+#: sphinx/cmd/quickstart.py:99
+msgid "Please enter a valid path name."
+msgstr "請輸入有效的路徑å稱。"
+
+#: sphinx/cmd/quickstart.py:115
+msgid "Please enter some text."
+msgstr "請輸入一些文字。"
+
+#: sphinx/cmd/quickstart.py:122
+#, python-format
+msgid "Please enter one of %s."
+msgstr "請輸入一種 %s 。"
+
+#: sphinx/cmd/quickstart.py:129
+msgid "Please enter either 'y' or 'n'."
+msgstr "請輸入 'y' 或 'n'。"
+
+#: sphinx/cmd/quickstart.py:135
+msgid "Please enter a file suffix, e.g. '.rst' or '.txt'."
+msgstr "請輸入檔案後綴,例如 '.rst' 或 '.txt'。"
+
+#: sphinx/cmd/quickstart.py:215
+#, python-format
+msgid "Welcome to the Sphinx %s quickstart utility."
+msgstr "歡迎進入 Sphinx %s 快速入門公用程å¼ã€‚"
+
+#: sphinx/cmd/quickstart.py:217
+msgid ""
+"Please enter values for the following settings (just press Enter to\n"
+"accept a default value, if one is given in brackets)."
+msgstr "請輸入以下設定值(如果括號中有給定é è¨­å€¼ï¼Œè«‹ç›´æŽ¥\n按下 Enter 以接å—它)。"
+
+#: sphinx/cmd/quickstart.py:222
+#, python-format
+msgid "Selected root path: %s"
+msgstr "被é¸çš„根路徑: %s"
+
+#: sphinx/cmd/quickstart.py:225
+msgid "Enter the root path for documentation."
+msgstr "輸入說明文件的根路徑。"
+
+#: sphinx/cmd/quickstart.py:226
+msgid "Root path for the documentation"
+msgstr "說明文件的根路徑"
+
+#: sphinx/cmd/quickstart.py:231
+msgid "Error: an existing conf.py has been found in the selected root path."
+msgstr "錯誤:在被é¸çš„根路徑找到一個已存在的 conf.py。"
+
+#: sphinx/cmd/quickstart.py:233
+msgid "sphinx-quickstart will not overwrite existing Sphinx projects."
+msgstr "sphinx-quickstart ä¸æœƒé‡å¯«å·²å­˜åœ¨çš„ Sphinx 專案。"
+
+#: sphinx/cmd/quickstart.py:235
+msgid "Please enter a new root path (or just Enter to exit)"
+msgstr "請輸入一個新的根路徑(或直接按 Enter 離開)"
+
+#: sphinx/cmd/quickstart.py:242
+msgid ""
+"You have two options for placing the build directory for Sphinx output.\n"
+"Either, you use a directory \"_build\" within the root path, or you separate\n"
+"\"source\" and \"build\" directories within the root path."
+msgstr "您有兩個é¸æ“‡ä¾†ç‚º Sphinx 的輸出放置建立資料夾。\n其一,您å¯ä»¥åœ¨æ ¹è·¯å¾‘中使用資料夾 \"_build\",或者,\n您å¯ä»¥åœ¨æ ¹è·¯å¾‘中分離 \"source\" å’Œ \"build\" 資料夾。"
+
+#: sphinx/cmd/quickstart.py:245
+msgid "Separate source and build directories (y/n)"
+msgstr "分離來æºä¸¦å»ºç«‹è³‡æ–™å¤¾ (y/n)"
+
+#: sphinx/cmd/quickstart.py:249
+msgid ""
+"Inside the root directory, two more directories will be created; \"_templates\"\n"
+"for custom HTML templates and \"_static\" for custom stylesheets and other static\n"
+"files. You can enter another prefix (such as \".\") to replace the underscore."
+msgstr "在根資料夾內部,å¦å¤–兩個資料夾會被建立;\"_templates\" \n放置自訂的 HTML 模æ¿ï¼Œè€Œ \"_static\" 放置自訂的表單åŠå…¶ä»–\néœæ…‹æª”案。您å¯ä»¥è¼¸å…¥å¦ä¸€å€‹å‰ç¶´ï¼ˆåƒæ˜¯ \".\")來å–代底線。"
+
+#: sphinx/cmd/quickstart.py:252
+msgid "Name prefix for templates and static dir"
+msgstr "用於模æ¿åŠéœæ…‹è³‡æ–™å¤¾çš„å稱å‰ç¶´"
+
+#: sphinx/cmd/quickstart.py:256
+msgid ""
+"The project name will occur in several places in the built documentation."
+msgstr "專案å稱會在已建立的說明文件中的多個ä½ç½®å‡ºç¾ã€‚"
+
+#: sphinx/cmd/quickstart.py:257
+msgid "Project name"
+msgstr "專案å稱"
+
+#: sphinx/cmd/quickstart.py:259
+msgid "Author name(s)"
+msgstr "作者姓å"
+
+#: sphinx/cmd/quickstart.py:263
+msgid ""
+"Sphinx has the notion of a \"version\" and a \"release\" for the\n"
+"software. Each version can have multiple releases. For example, for\n"
+"Python the version is something like 2.5 or 3.0, while the release is\n"
+"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
+"just set both to the same value."
+msgstr "在 Sphinx 中,軟體具有「版本ã€å’Œã€Œç™¼å¸ƒç‰ˆæœ¬ã€çš„概念。æ¯å€‹\n版本å¯ä»¥æœ‰å¤šå€‹ç™¼å¸ƒç‰ˆæœ¬ã€‚舉例來說,Python 的版本會åƒæ˜¯ 2.5 \n或 3.0,而發布版本則åƒæ˜¯ 2.5.1 或 3.0a1。如果您ä¸éœ€è¦é€™å€‹é›™\né‡çš„çµæ§‹ï¼Œè«‹ç›´æŽ¥å°‡å…©è€…設為相åŒçš„值。"
+
+#: sphinx/cmd/quickstart.py:268
+msgid "Project version"
+msgstr "專案版本"
+
+#: sphinx/cmd/quickstart.py:270
+msgid "Project release"
+msgstr "專案發布版本"
+
+#: sphinx/cmd/quickstart.py:274
+msgid ""
+"If the documents are to be written in a language other than English,\n"
+"you can select a language here by its language code. Sphinx will then\n"
+"translate text that it generates into that language.\n"
+"\n"
+"For a list of supported codes, see\n"
+"https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+msgstr "如果文件是被英語以外的語言被編寫,您å¯ä»¥æ ¹æ“šå®ƒçš„語言碼\n在此é¸æ“‡ä¸€å€‹èªžè¨€ã€‚Sphinx 會將它產生的文本翻譯為該語言。\n\nè¦äº†è§£å¯æ”¯æ´çš„語言碼列表,請åƒé–±\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language."
+
+#: sphinx/cmd/quickstart.py:282
+msgid "Project language"
+msgstr "專案語言"
+
+#: sphinx/cmd/quickstart.py:288
+msgid ""
+"The file name suffix for source files. Commonly, this is either \".txt\"\n"
+"or \".rst\". Only files with this suffix are considered documents."
+msgstr "用於原始檔的檔案å稱後綴。通常,這會是 \".txt\" 或 \".rst\"。\nåªæœ‰å…·æœ‰æ­¤å¾Œç¶´çš„檔案æ‰æœƒè¢«èªç‚ºæ˜¯æ–‡ä»¶ã€‚"
+
+#: sphinx/cmd/quickstart.py:290
+msgid "Source file suffix"
+msgstr "原始檔案後綴"
+
+#: sphinx/cmd/quickstart.py:294
+msgid ""
+"One document is special in that it is considered the top node of the\n"
+"\"contents tree\", that is, it is the root of the hierarchical structure\n"
+"of the documents. Normally, this is \"index\", but if your \"index\"\n"
+"document is a custom template, you can also set this to another filename."
+msgstr "一份文件的特別之處在於它會被視為 \"contents tree\" 中的頂端\n節點,也就是說,它是文件階層çµæ§‹ä¸­çš„根。通常,這會是 \n\"index\",但如果您的 \"index\" 文件是一個自訂的模æ¿ï¼Œæ‚¨ä¹Ÿå¯ä»¥\n將它設定為å¦ä¸€å€‹æª”å。"
+
+#: sphinx/cmd/quickstart.py:298
+msgid "Name of your master document (without suffix)"
+msgstr "您的主è¦æ–‡ä»¶å稱(ä¸å«å¾Œç¶´ï¼‰"
+
+#: sphinx/cmd/quickstart.py:303
+#, python-format
+msgid ""
+"Error: the master file %s has already been found in the selected root path."
+msgstr "錯誤:在被é¸çš„根路徑中已經找到主檔 %s 。"
+
+#: sphinx/cmd/quickstart.py:305
+msgid "sphinx-quickstart will not overwrite the existing file."
+msgstr "sphinx-quickstart ä¸æœƒé‡å¯«å·²å­˜åœ¨çš„檔案。"
+
+#: sphinx/cmd/quickstart.py:307
+msgid ""
+"Please enter a new file name, or rename the existing file and press Enter"
+msgstr "請輸入一個新的檔案å稱,或將已存在的檔案é‡æ–°å‘½å並按下 Enter"
+
+#: sphinx/cmd/quickstart.py:311
+msgid "Indicate which of the following Sphinx extensions should be enabled:"
+msgstr "指示以下哪一個 Sphinx 擴充應該被啟用:"
+
+#: sphinx/cmd/quickstart.py:319
+msgid ""
+"Note: imgmath and mathjax cannot be enabled at the same time. imgmath has "
+"been deselected."
+msgstr "註解:imgmath å’Œ mathjax 無法åŒæ™‚被啟用。imgmath 已被å–消é¸æ“‡ã€‚"
+
+#: sphinx/cmd/quickstart.py:325
+msgid ""
+"A Makefile and a Windows command file can be generated for you so that you\n"
+"only have to run e.g. `make html' instead of invoking sphinx-build\n"
+"directly."
+msgstr "會為您產生一個 Makefile 和一個 Windows 命令檔,所以\n您åªéœ€è¦åŸ·è¡Œåƒæ˜¯ `make html' 而ä¸å¿…直接調用 \nsphinx-build。"
+
+#: sphinx/cmd/quickstart.py:328
+msgid "Create Makefile? (y/n)"
+msgstr "是å¦å»ºç«‹ Makefile? (y/n)"
+
+#: sphinx/cmd/quickstart.py:331
+msgid "Create Windows command file? (y/n)"
+msgstr "是å¦å»ºç«‹ Windows 命令檔?(y/n)"
+
+#: sphinx/cmd/quickstart.py:375 sphinx/ext/apidoc.py:93
+#, python-format
+msgid "Creating file %s."
+msgstr "正在建立檔案 %s 。"
+
+#: sphinx/cmd/quickstart.py:380 sphinx/ext/apidoc.py:90
+#, python-format
+msgid "File %s already exists, skipping."
+msgstr "檔案 %s 已存在,正在跳éŽã€‚"
+
+#: sphinx/cmd/quickstart.py:422
+msgid "Finished: An initial directory structure has been created."
+msgstr "å·²çµæŸï¼šä¸€å€‹åˆå§‹è³‡æ–™å¤¾çµæ§‹å·²è¢«å»ºç«‹ã€‚"
+
+#: sphinx/cmd/quickstart.py:424
+#, python-format
+msgid ""
+"You should now populate your master file %s and create other documentation\n"
+"source files. "
+msgstr "您ç¾åœ¨æ‡‰è©²åœ¨æ‚¨çš„主檔 %s 輸入資料並建立其他說明文件\n原始檔。"
+
+#: sphinx/cmd/quickstart.py:427
+msgid ""
+"Use the Makefile to build the docs, like so:\n"
+" make builder"
+msgstr "使用 Makefile 來建立文件,åƒé€™æ¨£ï¼š\n make builder"
+
+#: sphinx/cmd/quickstart.py:430
+#, python-format
+msgid ""
+"Use the sphinx-build command to build the docs, like so:\n"
+" sphinx-build -b builder %s %s"
+msgstr "使用 sphinx-build 命令來建立文件,åƒé€™æ¨£ï¼š\n sphinx-build -b builder %s %s"
+
+#: sphinx/cmd/quickstart.py:432
+msgid ""
+"where \"builder\" is one of the supported builders, e.g. html, latex or "
+"linkcheck."
+msgstr "在這裡 \"builder\" 是一種被支æ´çš„建立器,例如 html,latex 或 linkcheck。"
+
+#: sphinx/cmd/quickstart.py:467
+msgid ""
+"\n"
+"Generate required files for a Sphinx project.\n"
+"\n"
+"sphinx-quickstart is an interactive tool that asks some questions about your\n"
+"project and then generates a complete documentation directory and sample\n"
+"Makefile to be used with sphinx-build.\n"
+msgstr "\n為 Sphinx 專案產生需è¦çš„檔案。\n\nsphinx-quickstart 是一個互動å¼å·¥å…·ï¼Œå®ƒæœƒå•ä¸€äº›é—œæ–¼æ‚¨å°ˆæ¡ˆ\nçš„å•é¡Œï¼Œç„¶å¾Œç”¢ç”Ÿå®Œæ•´çš„說明文件資料夾以åŠç”¨æ–¼ sphinx-build \nçš„ Makefile 樣本。\n"
+
+#: sphinx/cmd/quickstart.py:482
+msgid "quiet mode"
+msgstr "安éœæ¨¡å¼"
+
+#: sphinx/cmd/quickstart.py:487
+msgid "project root"
+msgstr "專案根"
+
+#: sphinx/cmd/quickstart.py:489
+msgid "Structure options"
+msgstr "çµæ§‹é¸é …"
+
+#: sphinx/cmd/quickstart.py:491
+msgid "if specified, separate source and build dirs"
+msgstr "如果有指定,會分離來æºè³‡æ–™å¤¾å’Œ build 資料夾"
+
+#: sphinx/cmd/quickstart.py:493
+msgid "if specified, create build dir under source dir"
+msgstr "如果有指定,會在來æºè³‡æ–™å¤¾ä¸‹å»ºç«‹ build 資料夾"
+
+#: sphinx/cmd/quickstart.py:495
+msgid "replacement for dot in _templates etc."
+msgstr "在 _templates 等處進行å¥è™Ÿçš„å–代"
+
+#: sphinx/cmd/quickstart.py:497
+msgid "Project basic options"
+msgstr "專案基本é¸é …"
+
+#: sphinx/cmd/quickstart.py:499
+msgid "project name"
+msgstr "專案å稱"
+
+#: sphinx/cmd/quickstart.py:501
+msgid "author names"
+msgstr "作者å"
+
+#: sphinx/cmd/quickstart.py:503
+msgid "version of project"
+msgstr "專案版本"
+
+#: sphinx/cmd/quickstart.py:505
+msgid "release of project"
+msgstr "專案發布"
+
+#: sphinx/cmd/quickstart.py:507
+msgid "document language"
+msgstr "文件語言"
+
+#: sphinx/cmd/quickstart.py:509
+msgid "source file suffix"
+msgstr "æºå§‹æª”後綴"
+
+#: sphinx/cmd/quickstart.py:511
+msgid "master document name"
+msgstr "主文件å稱"
+
+#: sphinx/cmd/quickstart.py:513
+msgid "use epub"
+msgstr "使用 epub"
+
+#: sphinx/cmd/quickstart.py:515
+msgid "Extension options"
+msgstr "擴充套件é¸é …"
+
+#: sphinx/cmd/quickstart.py:519 sphinx/ext/apidoc.py:402
+#, python-format
+msgid "enable %s extension"
+msgstr "啟用 %s 擴充套件"
+
+#: sphinx/cmd/quickstart.py:521 sphinx/ext/apidoc.py:398
+msgid "enable arbitrary extensions"
+msgstr "啟用任æ„的擴充套件"
+
+#: sphinx/cmd/quickstart.py:523
+msgid "Makefile and Batchfile creation"
+msgstr "Makefile åŠ Batchfile 的建立"
+
+#: sphinx/cmd/quickstart.py:525
+msgid "create makefile"
+msgstr "建立 makefile"
+
+#: sphinx/cmd/quickstart.py:527
+msgid "do not create makefile"
+msgstr "ä¸è¦å»ºç«‹ makefile"
+
+#: sphinx/cmd/quickstart.py:529
+msgid "create batchfile"
+msgstr "建立 batchfile"
+
+#: sphinx/cmd/quickstart.py:532
+msgid "do not create batchfile"
+msgstr "ä¸è¦å»ºç«‹ batchfile"
+
+#: sphinx/cmd/quickstart.py:535
+msgid "use make-mode for Makefile/make.bat"
+msgstr "使用 make 模å¼æ–¼ Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:538
+msgid "do not use make-mode for Makefile/make.bat"
+msgstr "ä¸è¦ä½¿ç”¨ make 模å¼æ–¼ Makefile/make.bat"
+
+#: sphinx/cmd/quickstart.py:540 sphinx/ext/apidoc.py:404
+msgid "Project templating"
+msgstr "專案模æ¿åŒ–中"
+
+#: sphinx/cmd/quickstart.py:543 sphinx/ext/apidoc.py:407
+msgid "template directory for template files"
+msgstr "用於模æ¿æª”案的模æ¿è³‡æ–™å¤¾"
+
+#: sphinx/cmd/quickstart.py:546
+msgid "define a template variable"
+msgstr "定義一個模æ¿è®Šæ•¸"
+
+#: sphinx/cmd/quickstart.py:579
+msgid "\"quiet\" is specified, but any of \"project\" or \"author\" is not specified."
+msgstr "\"quiet\" 被指定,但 \"project\" 或 \"author\" 的任一項未被指定。"
+
+#: sphinx/cmd/quickstart.py:593
+msgid ""
+"Error: specified path is not a directory, or sphinx files already exist."
+msgstr "錯誤:指定的路徑ä¸æ˜¯è³‡æ–™å¤¾ï¼Œæˆ–是 sphinx 檔案已經存在。"
+
+#: sphinx/cmd/quickstart.py:595
+msgid ""
+"sphinx-quickstart only generate into a empty directory. Please specify a new"
+" root path."
+msgstr "sphinx-quickstart åªèƒ½ç”¢ç”Ÿæ–¼ç©ºç™½è³‡æ–™å¤¾ä¸­ã€‚請指定一個新的根路徑。"
+
+#: sphinx/cmd/quickstart.py:610
+#, python-format
+msgid "Invalid template variable: %s"
+msgstr "無效的模æ¿è®Šæ•¸ï¼š %s"
+
+#: sphinx/directives/code.py:61
+msgid "non-whitespace stripped by dedent"
+msgstr "éžç©ºç™½å­—元被凸排去除"
+
+#: sphinx/directives/code.py:82
+#, python-format
+msgid "Invalid caption: %s"
+msgstr "無效標題:%s"
+
+#: sphinx/directives/code.py:127 sphinx/directives/code.py:277
+#: sphinx/directives/code.py:453
+#, python-format
+msgid "line number spec is out of range(1-%d): %r"
+msgstr "列號è¦æ ¼è¶…å‡ºç¯„åœ (1-%d): %r"
+
+#: sphinx/directives/code.py:206
+#, python-format
+msgid "Cannot use both \"%s\" and \"%s\" options"
+msgstr "ä¸èƒ½ä½¿ç”¨ \"%s\" åŠ \"%s\" 兩個é¸é …"
+
+#: sphinx/directives/code.py:220
+#, python-format
+msgid "Include file %r not found or reading it failed"
+msgstr "Include 檔案 %r 未找到或是讀å–失敗"
+
+#: sphinx/directives/code.py:223
+#, python-format
+msgid ""
+"Encoding %r used for reading included file %r seems to be wrong, try giving "
+"an :encoding: option"
+msgstr "編碼 %r 用以讀å–被 include 的檔案 %r 似乎有錯,嘗試給定一個 :encoding: é¸é …"
+
+#: sphinx/directives/code.py:260
+#, python-format
+msgid "Object named %r not found in include file %r"
+msgstr "å為 %r 的物件在 include 檔案 %r 中未找到"
+
+#: sphinx/directives/code.py:286
+msgid "Cannot use \"lineno-match\" with a disjoint set of \"lines\""
+msgstr "無法以一個 \"lines\" 的互斥集使用 \"lineno-match\" "
+
+#: sphinx/directives/code.py:291
+#, python-format
+msgid "Line spec %r: no lines pulled from include file %r"
+msgstr "Line spec %r: 從 include 檔案 %r 沒有æå–任何一行"
+
+#: sphinx/directives/other.py:116
+#, python-format
+msgid "toctree glob pattern %r didn't match any documents"
+msgstr "toctree glob 型樣 %r 未匹é…任何文件"
+
+#: sphinx/directives/other.py:142 sphinx/environment/adapters/toctree.py:323
+#, python-format
+msgid "toctree contains reference to excluded document %r"
+msgstr "toctree 包å«äº†æŒ‡å‘已排除文件的åƒç…§ %r"
+
+#: sphinx/directives/other.py:145 sphinx/environment/adapters/toctree.py:327
+#, python-format
+msgid "toctree contains reference to nonexisting document %r"
+msgstr "toctree 包å«äº†æŒ‡å‘ä¸å­˜åœ¨æ–‡ä»¶çš„åƒç…§ %r"
+
+#: sphinx/directives/other.py:156
+#, python-format
+msgid "duplicated entry found in toctree: %s"
+msgstr "在 toctree 中找到é‡è¤‡çš„項目: %s"
+
+#: sphinx/directives/other.py:188
+msgid "Section author: "
+msgstr "章節作者:"
+
+#: sphinx/directives/other.py:190
+msgid "Module author: "
+msgstr "模組作者:"
+
+#: sphinx/directives/other.py:192
+msgid "Code author: "
+msgstr "程å¼ä½œè€…:"
+
+#: sphinx/directives/other.py:194
+msgid "Author: "
+msgstr "作者:"
+
+#: sphinx/directives/other.py:266
+msgid ".. acks content is not a list"
+msgstr ".. acks 的內容ä¸æ˜¯ä¸€å€‹åˆ—表"
+
+#: sphinx/directives/other.py:291
+msgid ".. hlist content is not a list"
+msgstr ".. hlist 的內容ä¸æ˜¯ä¸€å€‹åˆ—表"
+
+#: sphinx/directives/patches.py:66
+msgid ""
+"\":file:\" option for csv-table directive now recognizes an absolute path as"
+" a relative path from source directory. Please update your document."
+msgstr "å° csv-table 指令的 \":file:\" é¸é …ç¾åœ¨æœƒå°‡çµ•å°è·¯å¾‘辨識為基於來æºè³‡æ–™å¤¾çš„相å°è·¯å¾‘。請更新您的文件。"
+
+#: sphinx/domains/__init__.py:397
+#, python-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: sphinx/domains/c.py:2043 sphinx/domains/c.py:3318
+#, python-format
+msgid ""
+"Duplicate C declaration, also defined at %s:%s.\n"
+"Declaration is '.. c:%s:: %s'."
+msgstr "é‡è¤‡çš„ C 宣告,亦被定義於 %s:%s。\n宣告是 '.. c:%s:: %s'。"
+
+#: sphinx/domains/c.py:3257
+#, python-format
+msgid "%s (C %s)"
+msgstr "%s (C %s)"
+
+#: sphinx/domains/c.py:3356 sphinx/domains/cpp.py:7496
+#: sphinx/domains/python.py:682 sphinx/ext/napoleon/docstring.py:760
+msgid "Parameters"
+msgstr "åƒæ•¸"
+
+#: sphinx/domains/c.py:3359 sphinx/domains/cpp.py:7502
+msgid "Return values"
+msgstr "回傳值"
+
+#: sphinx/domains/c.py:3362 sphinx/domains/cpp.py:7505
+#: sphinx/domains/javascript.py:259 sphinx/domains/python.py:694
+msgid "Returns"
+msgstr "回傳"
+
+#: sphinx/domains/c.py:3364 sphinx/domains/javascript.py:261
+#: sphinx/domains/python.py:696
+msgid "Return type"
+msgstr "回傳型別"
+
+#: sphinx/domains/c.py:3730 sphinx/domains/cpp.py:7909
+msgid "member"
+msgstr "æˆå“¡å‡½æ•¸"
+
+#: sphinx/domains/c.py:3731
+msgid "variable"
+msgstr "變數"
+
+#: sphinx/domains/c.py:3732 sphinx/domains/cpp.py:7908
+#: sphinx/domains/javascript.py:365 sphinx/domains/python.py:1454
+msgid "function"
+msgstr "函å¼"
+
+#: sphinx/domains/c.py:3733
+msgid "macro"
+msgstr "巨集"
+
+#: sphinx/domains/c.py:3734
+msgid "struct"
+msgstr "çµæ§‹"
+
+#: sphinx/domains/c.py:3735 sphinx/domains/cpp.py:7907
+msgid "union"
+msgstr "union"
+
+#: sphinx/domains/c.py:3736 sphinx/domains/cpp.py:7912
+msgid "enum"
+msgstr "enum"
+
+#: sphinx/domains/c.py:3737 sphinx/domains/cpp.py:7913
+msgid "enumerator"
+msgstr "enumerator"
+
+#: sphinx/domains/c.py:3738 sphinx/domains/cpp.py:7910
+msgid "type"
+msgstr "型別"
+
+#: sphinx/domains/c.py:3740 sphinx/domains/cpp.py:7915
+msgid "function parameter"
+msgstr "函å¼åƒæ•¸"
+
+#: sphinx/domains/changeset.py:23
+#, python-format
+msgid "New in version %s"
+msgstr "在 %s 版新加入"
+
+#: sphinx/domains/changeset.py:24
+#, python-format
+msgid "Changed in version %s"
+msgstr "在 %s 版的變更"
+
+#: sphinx/domains/changeset.py:25
+#, python-format
+msgid "Deprecated since version %s"
+msgstr "在 %s 版之後被棄用"
+
+#: sphinx/domains/citation.py:70
+#, python-format
+msgid "duplicate citation %s, other instance in %s"
+msgstr "é‡è¤‡çš„引用 %s,亦出ç¾æ–¼ %s"
+
+#: sphinx/domains/citation.py:81
+#, python-format
+msgid "Citation [%s] is not referenced."
+msgstr "引用 [%s] 未被åƒç…§ã€‚"
+
+#: sphinx/domains/cpp.py:4929 sphinx/domains/cpp.py:7423
+#, python-format
+msgid ""
+"Duplicate C++ declaration, also defined at %s:%s.\n"
+"Declaration is '.. cpp:%s:: %s'."
+msgstr "é‡è¤‡çš„ C++ 宣告,亦被定義於 %s:%s。\n宣告是 '.. cpp:%s:: %s'。"
+
+#: sphinx/domains/cpp.py:7218
+msgid "Template Parameters"
+msgstr "模æ¿åƒæ•¸"
+
+#: sphinx/domains/cpp.py:7340
+#, python-format
+msgid "%s (C++ %s)"
+msgstr "%s (C++ %s)"
+
+#: sphinx/domains/cpp.py:7499 sphinx/domains/javascript.py:256
+msgid "Throws"
+msgstr "拋出"
+
+#: sphinx/domains/cpp.py:7906 sphinx/domains/javascript.py:367
+#: sphinx/domains/python.py:1456
+msgid "class"
+msgstr "類別"
+
+#: sphinx/domains/cpp.py:7911
+msgid "concept"
+msgstr "概念"
+
+#: sphinx/domains/cpp.py:7916
+msgid "template parameter"
+msgstr "模æ¿åƒæ•¸"
+
+#: sphinx/domains/javascript.py:164
+#, python-format
+msgid "%s() (built-in function)"
+msgstr "%s() (內建函å¼)"
+
+#: sphinx/domains/javascript.py:165 sphinx/domains/python.py:1121
+#, python-format
+msgid "%s() (%s method)"
+msgstr "%s() (%s 的方法)"
+
+#: sphinx/domains/javascript.py:167
+#, python-format
+msgid "%s() (class)"
+msgstr "%s() (類別)"
+
+#: sphinx/domains/javascript.py:169
+#, python-format
+msgid "%s (global variable or constant)"
+msgstr "%s (全域變數或常數)"
+
+#: sphinx/domains/javascript.py:171 sphinx/domains/python.py:1206
+#, python-format
+msgid "%s (%s attribute)"
+msgstr "%s (%s 的屬性)"
+
+#: sphinx/domains/javascript.py:253
+msgid "Arguments"
+msgstr "引數"
+
+#: sphinx/domains/javascript.py:329
+#, python-format
+msgid "%s (module)"
+msgstr "%s (模組)"
+
+#: sphinx/domains/javascript.py:366 sphinx/domains/python.py:1458
+msgid "method"
+msgstr "方法"
+
+#: sphinx/domains/javascript.py:368 sphinx/domains/python.py:1455
+msgid "data"
+msgstr "資料"
+
+#: sphinx/domains/javascript.py:369 sphinx/domains/python.py:1461
+msgid "attribute"
+msgstr "屬性"
+
+#: sphinx/domains/javascript.py:370 sphinx/domains/python.py:1463
+msgid "module"
+msgstr "模組"
+
+#: sphinx/domains/javascript.py:401
+#, python-format
+msgid "duplicate %s description of %s, other %s in %s"
+msgstr "%s çš„é‡è¤‡ %s 敘述,其他的 %s 在 %s"
+
+#: sphinx/domains/math.py:61
+#, python-format
+msgid "duplicate label of equation %s, other instance in %s"
+msgstr "é‡è¤‡å…¬å¼æ¨™ç±¤ %s,亦出ç¾æ–¼ %s"
+
+#: sphinx/domains/math.py:116 sphinx/writers/latex.py:2252
+#, python-format
+msgid "Invalid math_eqref_format: %r"
+msgstr "無效的 math_eqref_format: %r"
+
+#: sphinx/domains/python.py:687
+msgid "Variables"
+msgstr "變數"
+
+#: sphinx/domains/python.py:691
+msgid "Raises"
+msgstr "引發"
+
+#: sphinx/domains/python.py:975 sphinx/domains/python.py:1112
+#, python-format
+msgid "%s() (in module %s)"
+msgstr "%s() (於 %s 模組中)"
+
+#: sphinx/domains/python.py:1035 sphinx/domains/python.py:1202
+#: sphinx/domains/python.py:1253
+#, python-format
+msgid "%s (in module %s)"
+msgstr "%s (於 %s 模組中)"
+
+#: sphinx/domains/python.py:1037
+#, python-format
+msgid "%s (built-in variable)"
+msgstr "%s (內建變數)"
+
+#: sphinx/domains/python.py:1062
+#, python-format
+msgid "%s (built-in class)"
+msgstr "%s (內建類別)"
+
+#: sphinx/domains/python.py:1063
+#, python-format
+msgid "%s (class in %s)"
+msgstr "%s (%s 中的類別)"
+
+#: sphinx/domains/python.py:1117
+#, python-format
+msgid "%s() (%s class method)"
+msgstr "%s() (%s 的類別方法)"
+
+#: sphinx/domains/python.py:1119
+#, python-format
+msgid "%s() (%s static method)"
+msgstr "%s() (%s çš„éœæ…‹æ–¹æ³•)"
+
+#: sphinx/domains/python.py:1257
+#, python-format
+msgid "%s (%s property)"
+msgstr "%s (%s 的特性)"
+
+#: sphinx/domains/python.py:1383
+msgid "Python Module Index"
+msgstr "Python 模組索引"
+
+#: sphinx/domains/python.py:1384
+msgid "modules"
+msgstr "模組"
+
+#: sphinx/domains/python.py:1433
+msgid "Deprecated"
+msgstr "已棄用"
+
+#: sphinx/domains/python.py:1457
+msgid "exception"
+msgstr "例外"
+
+#: sphinx/domains/python.py:1459
+msgid "class method"
+msgstr "類別方法"
+
+#: sphinx/domains/python.py:1460
+msgid "static method"
+msgstr "éœæ…‹æ–¹æ³•"
+
+#: sphinx/domains/python.py:1462
+msgid "property"
+msgstr "特性"
+
+#: sphinx/domains/python.py:1520
+#, python-format
+msgid ""
+"duplicate object description of %s, other instance in %s, use :no-index: for"
+" one of them"
+msgstr ""
+
+#: sphinx/domains/python.py:1640
+#, python-format
+msgid "more than one target found for cross-reference %r: %s"
+msgstr "為交互åƒç…§ %r 找到多於一個目標: %s"
+
+#: sphinx/domains/python.py:1701
+msgid " (deprecated)"
+msgstr "(已棄用)"
+
+#: sphinx/domains/rst.py:125 sphinx/domains/rst.py:181
+#, python-format
+msgid "%s (directive)"
+msgstr "%s (指令)"
+
+#: sphinx/domains/rst.py:182 sphinx/domains/rst.py:186
+#, python-format
+msgid ":%s: (directive option)"
+msgstr ":%s: (指令é¸é …)"
+
+#: sphinx/domains/rst.py:209
+#, python-format
+msgid "%s (role)"
+msgstr "%s (角色)"
+
+#: sphinx/domains/rst.py:218
+msgid "directive"
+msgstr "指令"
+
+#: sphinx/domains/rst.py:219
+msgid "directive-option"
+msgstr "指令é¸é …"
+
+#: sphinx/domains/rst.py:220
+msgid "role"
+msgstr "角色"
+
+#: sphinx/domains/rst.py:242
+#, python-format
+msgid "duplicate description of %s %s, other instance in %s"
+msgstr "%s %s çš„é‡è¤‡æ•˜è¿°ï¼Œå…¶ä»–的實例在 %s"
+
+#: sphinx/domains/std.py:79 sphinx/domains/std.py:96
+#, python-format
+msgid "environment variable; %s"
+msgstr "環境變數; %s"
+
+#: sphinx/domains/std.py:155
+#, python-format
+msgid ""
+"Malformed option description %r, should look like \"opt\", \"-opt args\", \""
+"--opt args\", \"/opt args\" or \"+opt args\""
+msgstr "異常的é¸é …敘述 %r ,應該è¦çœ‹èµ·ä¾†åƒ \"opt\", \"-opt args\", \"--opt args\", \"/opt args\" 或 \"+opt args\""
+
+#: sphinx/domains/std.py:226
+#, python-format
+msgid "%s command line option"
+msgstr "%s 命令列é¸é …"
+
+#: sphinx/domains/std.py:228
+msgid "command line option"
+msgstr "命令列é¸é …"
+
+#: sphinx/domains/std.py:346
+msgid "glossary term must be preceded by empty line"
+msgstr "術語表項目必須有空白行在å‰"
+
+#: sphinx/domains/std.py:354
+msgid "glossary terms must not be separated by empty lines"
+msgstr "術語表項目ä¸å¯ä»¥è¢«ç©ºç™½è¡Œåˆ†éš”"
+
+#: sphinx/domains/std.py:360 sphinx/domains/std.py:373
+msgid "glossary seems to be misformatted, check indentation"
+msgstr "術語表似乎有格å¼éŒ¯èª¤ï¼Œè«‹æª¢æŸ¥ç¸®æŽ’"
+
+#: sphinx/domains/std.py:516
+msgid "glossary term"
+msgstr "雜項術語"
+
+#: sphinx/domains/std.py:517
+msgid "grammar token"
+msgstr "語法單詞"
+
+#: sphinx/domains/std.py:518
+msgid "reference label"
+msgstr "åƒç…§æ¨™ç±¤"
+
+#: sphinx/domains/std.py:520
+msgid "environment variable"
+msgstr "環境變數"
+
+#: sphinx/domains/std.py:521
+msgid "program option"
+msgstr "程å¼é¸é …"
+
+#: sphinx/domains/std.py:522
+msgid "document"
+msgstr "文件"
+
+#: sphinx/domains/std.py:558 sphinx/domains/std.py:570
+msgid "Module Index"
+msgstr "模組索引"
+
+#: sphinx/domains/std.py:559 sphinx/domains/std.py:571
+#: sphinx/themes/basic/defindex.html:25
+msgid "Search Page"
+msgstr "æœå°‹é é¢"
+
+#: sphinx/domains/std.py:614 sphinx/domains/std.py:720
+#: sphinx/ext/autosectionlabel.py:52
+#, python-format
+msgid "duplicate label %s, other instance in %s"
+msgstr "é‡è¤‡çš„標籤 %s,亦出ç¾æ–¼ %s"
+
+#: sphinx/domains/std.py:633
+#, python-format
+msgid "duplicate %s description of %s, other instance in %s"
+msgstr "é‡è¤‡ %s çš„æè¿° %s,亦出ç¾æ–¼ %s"
+
+#: sphinx/domains/std.py:839
+msgid "numfig is disabled. :numref: is ignored."
+msgstr "numfig å·²åœç”¨ã€‚ :numref: 已略éŽã€‚"
+
+#: sphinx/domains/std.py:847
+#, python-format
+msgid "Failed to create a cross reference. Any number is not assigned: %s"
+msgstr "無法建立一個交互åƒç…§ã€‚任一數字未被指定: %s"
+
+#: sphinx/domains/std.py:859
+#, python-format
+msgid "the link has no caption: %s"
+msgstr "這個連çµæ²’有標題: %s"
+
+#: sphinx/domains/std.py:873
+#, python-format
+msgid "invalid numfig_format: %s (%r)"
+msgstr "無效的 numfig_format: %s (%r)"
+
+#: sphinx/domains/std.py:876
+#, python-format
+msgid "invalid numfig_format: %s"
+msgstr "無效的 numfig_format: %s"
+
+#: sphinx/domains/std.py:1106
+#, python-format
+msgid "undefined label: %r"
+msgstr "未定義的標籤: %r"
+
+#: sphinx/domains/std.py:1108
+#, python-format
+msgid "Failed to create a cross reference. A title or caption not found: %r"
+msgstr "無法建立一個交互åƒç…§ã€‚未找到標題或說明: %r"
+
+#: sphinx/environment/__init__.py:71
+msgid "new config"
+msgstr "新的組態"
+
+#: sphinx/environment/__init__.py:72
+msgid "config changed"
+msgstr "組態已變更"
+
+#: sphinx/environment/__init__.py:73
+msgid "extensions changed"
+msgstr "擴充套件已變更"
+
+#: sphinx/environment/__init__.py:276
+msgid "build environment version not current"
+msgstr "建立環境的版本ä¸æ˜¯ç›®å‰çš„"
+
+#: sphinx/environment/__init__.py:278
+msgid "source directory has changed"
+msgstr "來æºè³‡æ–™å¤¾å·²è®Šæ›´"
+
+#: sphinx/environment/__init__.py:357
+msgid ""
+"This environment is incompatible with the selected builder, please choose "
+"another doctree directory."
+msgstr "這個環境與所é¸çš„ builder ä¸ç›¸å®¹ï¼Œè«‹é¸æ“‡å¦ä¸€å€‹ doctree 資料夾。"
+
+#: sphinx/environment/__init__.py:456
+#, python-format
+msgid "Failed to scan documents in %s: %r"
+msgstr "無法掃æ %s 中的文件: %r"
+
+#: sphinx/environment/__init__.py:593
+#, python-format
+msgid "Domain %r is not registered"
+msgstr "Domain %r 未被註冊"
+
+#: sphinx/environment/__init__.py:727
+msgid "document isn't included in any toctree"
+msgstr "文件未被包å«æ–¼ä»»ä½• toctree"
+
+#: sphinx/environment/__init__.py:764
+msgid "self referenced toctree found. Ignored."
+msgstr "找到自我åƒç…§çš„ toctree。已略éŽã€‚"
+
+#: sphinx/environment/adapters/indexentries.py:69
+#, python-format
+msgid "see %s"
+msgstr "åƒè€ƒ %s"
+
+#: sphinx/environment/adapters/indexentries.py:73
+#, python-format
+msgid "see also %s"
+msgstr "也åƒè€ƒ %s"
+
+#: sphinx/environment/adapters/indexentries.py:76
+#, python-format
+msgid "unknown index entry type %r"
+msgstr "未知的索引項目型別 %r"
+
+#: sphinx/environment/adapters/indexentries.py:187
+#: sphinx/templates/latex/sphinxmessages.sty_t:11
+msgid "Symbols"
+msgstr "符號"
+
+#: sphinx/environment/adapters/toctree.py:296
+#, python-format
+msgid "circular toctree references detected, ignoring: %s <- %s"
+msgstr "åµæ¸¬åˆ°å¾ªç’°çš„ toctree åƒç…§ï¼Œå¿½ç•¥ä¸­ï¼š %s <- %s"
+
+#: sphinx/environment/adapters/toctree.py:316
+#, python-format
+msgid ""
+"toctree contains reference to document %r that doesn't have a title: no link"
+" will be generated"
+msgstr "toctree 包å«äº†åˆ°æ–‡ä»¶ %r çš„åƒç…§ï¼Œè©²æ–‡ä»¶æ²’有標題:ä¸æœƒç”¢ç”Ÿä»»ä½•éˆæŽ¥"
+
+#: sphinx/environment/adapters/toctree.py:325
+#, python-format
+msgid "toctree contains reference to non-included document %r"
+msgstr "toctree 包å«äº† non-included 文件 %r çš„åƒç…§"
+
+#: sphinx/environment/collectors/asset.py:88
+#, python-format
+msgid "image file not readable: %s"
+msgstr "å½±åƒæª”案無法讀å–: %s"
+
+#: sphinx/environment/collectors/asset.py:107
+#, python-format
+msgid "image file %s not readable: %s"
+msgstr "å½±åƒæª”案 %s 無法讀å–: %s"
+
+#: sphinx/environment/collectors/asset.py:133
+#, python-format
+msgid "download file not readable: %s"
+msgstr "下載檔案無法讀å–: %s"
+
+#: sphinx/environment/collectors/toctree.py:224
+#, python-format
+msgid "%s is already assigned section numbers (nested numbered toctree?)"
+msgstr "%s 已經被指定段è½ç·¨è™Ÿï¼ˆå·¢ç‹€ç·¨è™Ÿçš„ toctree?)"
+
+#: sphinx/ext/apidoc.py:86
+#, python-format
+msgid "Would create file %s."
+msgstr "將會建立檔案 %s 。"
+
+#: sphinx/ext/apidoc.py:320
+msgid ""
+"\n"
+"Look recursively in <MODULE_PATH> for Python modules and packages and create\n"
+"one reST file with automodule directives per package in the <OUTPUT_PATH>.\n"
+"\n"
+"The <EXCLUDE_PATTERN>s can be file and/or directory patterns that will be\n"
+"excluded from generation.\n"
+"\n"
+"Note: By default this script will not overwrite already created files."
+msgstr "\n在 <MODULE_PATH> 中éžè¿´æŸ¥æ‰¾ Python 模組åŠå¥—件,並在 <OUTPUT_PATH> 中\n為æ¯å€‹å¥—件建立一個帶有 automodule 指令的 reST 檔。\n\n<EXCLUDE_PATTERN> å¯ä»¥æ˜¯æª”案åŠ/或資料夾型樣,它們將在生æˆæ™‚被\n移除。\n\n備註:在é è¨­æƒ…æ³ï¼Œæ­¤è…³æœ¬ä¸æœƒé‡å¯«å·²ç¶“被建立的檔案。"
+
+#: sphinx/ext/apidoc.py:333
+msgid "path to module to document"
+msgstr "è¦ç”Ÿæˆæ–‡ä»¶çš„模組路徑"
+
+#: sphinx/ext/apidoc.py:335
+msgid ""
+"fnmatch-style file and/or directory patterns to exclude from generation"
+msgstr "fnmatch 風格的檔案åŠ/或資料夾模å¼ï¼Œå°‡åœ¨ç”Ÿæˆæ™‚移除。"
+
+#: sphinx/ext/apidoc.py:340
+msgid "directory to place all output"
+msgstr "è¦æ”¾ç½®æ‰€æœ‰è¼¸å‡ºçš„資料夾"
+
+#: sphinx/ext/apidoc.py:345
+msgid "maximum depth of submodules to show in the TOC (default: 4)"
+msgstr "能顯示 TOC çš„å­æ¨¡çµ„最大深度(é è¨­å€¼ï¼š4)"
+
+#: sphinx/ext/apidoc.py:348
+msgid "overwrite existing files"
+msgstr "é‡å¯«å·²å­˜åœ¨çš„檔案"
+
+#: sphinx/ext/apidoc.py:351
+msgid ""
+"follow symbolic links. Powerful when combined with "
+"collective.recipe.omelette."
+msgstr "跟隨符號éˆæŽ¥ã€‚與 collective.recipe.omelette çµåˆæ™‚很有用。"
+
+#: sphinx/ext/apidoc.py:354
+msgid "run the script without creating files"
+msgstr "執行腳本而ä¸å»ºç«‹æª”案"
+
+#: sphinx/ext/apidoc.py:357
+msgid "put documentation for each module on its own page"
+msgstr "為æ¯å€‹æ¨¡çµ„在它自己的é é¢ç½®æ”¾èªªæ˜Žæ–‡ä»¶"
+
+#: sphinx/ext/apidoc.py:360
+msgid "include \"_private\" modules"
+msgstr "åŒ…å« \"_private\" 模組"
+
+#: sphinx/ext/apidoc.py:362
+msgid "filename of table of contents (default: modules)"
+msgstr "目錄的檔å(é è¨­å€¼ï¼šæ¨¡çµ„)"
+
+#: sphinx/ext/apidoc.py:364
+msgid "don't create a table of contents file"
+msgstr "ä¸è¦å»ºç«‹ç›®éŒ„檔案"
+
+#: sphinx/ext/apidoc.py:367
+msgid ""
+"don't create headings for the module/package packages (e.g. when the "
+"docstrings already contain them)"
+msgstr "ä¸è¦ç‚ºæ¨¡çµ„/套件建立標頭(例如:當說明字串已經包å«å®ƒå€‘時)"
+
+#: sphinx/ext/apidoc.py:372
+msgid "put module documentation before submodule documentation"
+msgstr "在å­æ¨¡çµ„說明文件之å‰ç½®æ”¾æ¨¡çµ„說明文件"
+
+#: sphinx/ext/apidoc.py:376
+msgid ""
+"interpret module paths according to PEP-0420 implicit namespaces "
+"specification"
+msgstr "根據 PEP-0420 éš±å¼å‘½å空間è¦ç¯„來解譯模組路徑"
+
+#: sphinx/ext/apidoc.py:380
+msgid "file suffix (default: rst)"
+msgstr "檔案後綴(é è¨­å€¼ï¼šrst)"
+
+#: sphinx/ext/apidoc.py:382
+msgid "generate a full project with sphinx-quickstart"
+msgstr "以 sphinx-quickstart 生æˆä¸€å€‹å®Œå…¨çš„專案"
+
+#: sphinx/ext/apidoc.py:385
+msgid "append module_path to sys.path, used when --full is given"
+msgstr "附加 module_path 到 sys.path,在給予 --full 時使用"
+
+#: sphinx/ext/apidoc.py:387
+msgid "project name (default: root module name)"
+msgstr "專案å稱(é è¨­å€¼ï¼šæ ¹æ¨¡çµ„å稱)"
+
+#: sphinx/ext/apidoc.py:389
+msgid "project author(s), used when --full is given"
+msgstr "專案作者(們),在給予 --full 時使用"
+
+#: sphinx/ext/apidoc.py:391
+msgid "project version, used when --full is given"
+msgstr "專案版本,在給予 --full 時使用"
+
+#: sphinx/ext/apidoc.py:393
+msgid "project release, used when --full is given, defaults to --doc-version"
+msgstr "專案發布,在給予 --full 時使用,é è¨­ç‚º --doc-version"
+
+#: sphinx/ext/apidoc.py:396
+msgid "extension options"
+msgstr "擴充套件é¸é …"
+
+#: sphinx/ext/apidoc.py:429
+#, python-format
+msgid "%s is not a directory."
+msgstr "%s ä¸æ˜¯è³‡æ–™å¤¾"
+
+#: sphinx/ext/autosectionlabel.py:48
+#, python-format
+msgid "section \"%s\" gets labeled as \"%s\""
+msgstr "æ®µè½ \"%s\" å–得標籤 \"%s\""
+
+#: sphinx/ext/coverage.py:45
+#, python-format
+msgid "invalid regex %r in %s"
+msgstr "無效的 regex %r 在 %s"
+
+#: sphinx/ext/coverage.py:73
+#, python-format
+msgid ""
+"Testing of coverage in the sources finished, look at the results in "
+"%(outdir)spython.txt."
+msgstr "來æºçš„涵蓋測試已çµæŸï¼Œåœ¨ %(outdir)spython.txt 中查看çµæžœã€‚"
+
+#: sphinx/ext/coverage.py:87
+#, python-format
+msgid "invalid regex %r in coverage_c_regexes"
+msgstr "無效的 regex %r 在 coverage_c_regexes"
+
+#: sphinx/ext/coverage.py:155
+#, python-format
+msgid "undocumented c api: %s [%s] in file %s"
+msgstr "未文件化的 c api: %s [%s] 在檔案 %s 中"
+
+#: sphinx/ext/coverage.py:187
+#, python-format
+msgid "module %s could not be imported: %s"
+msgstr "模組 %s 無法被 import: %s"
+
+#: sphinx/ext/coverage.py:334
+#, python-format
+msgid "undocumented python function: %s :: %s"
+msgstr "未文件化的 python 函å¼ï¼š %s :: %s"
+
+#: sphinx/ext/coverage.py:350
+#, python-format
+msgid "undocumented python class: %s :: %s"
+msgstr "未文件化的 python class: %s :: %s"
+
+#: sphinx/ext/coverage.py:363
+#, python-format
+msgid "undocumented python method: %s :: %s :: %s"
+msgstr "未文件化的 python method: %s :: %s :: %s"
+
+#: sphinx/ext/doctest.py:115
+#, python-format
+msgid "missing '+' or '-' in '%s' option."
+msgstr "在 '%s' é¸é …中éºæ¼ '+' 或 '-'。"
+
+#: sphinx/ext/doctest.py:120
+#, python-format
+msgid "'%s' is not a valid option."
+msgstr "'%s' ä¸æ˜¯æœ‰æ•ˆçš„é¸é …"
+
+#: sphinx/ext/doctest.py:134
+#, python-format
+msgid "'%s' is not a valid pyversion option"
+msgstr "'%s' ä¸æ˜¯æœ‰æ•ˆçš„ pyversion é¸é …"
+
+#: sphinx/ext/doctest.py:220
+msgid "invalid TestCode type"
+msgstr "無效的 TestCode 型別"
+
+#: sphinx/ext/doctest.py:280
+#, python-format
+msgid ""
+"Testing of doctests in the sources finished, look at the results in "
+"%(outdir)s/output.txt."
+msgstr "來æºçš„ doctests 測試已çµæŸï¼Œåœ¨ %(outdir)s/output.txt 中查看çµæžœã€‚"
+
+#: sphinx/ext/doctest.py:431
+#, python-format
+msgid "no code/output in %s block at %s:%s"
+msgstr "在 %s å€å¡Šä¸­çš„ %s:%s 沒有程å¼ç¢¼/輸出"
+
+#: sphinx/ext/doctest.py:521
+#, python-format
+msgid "ignoring invalid doctest code: %r"
+msgstr "正在忽略無效的 doctest 碼: %r"
+
+#: sphinx/ext/duration.py:76
+msgid ""
+"====================== slowest reading durations ======================="
+msgstr "====================== 最慢的讀å–歷時 ======================="
+
+#: sphinx/ext/extlinks.py:82
+#, python-format
+msgid ""
+"hardcoded link %r could be replaced by an extlink (try using %r instead)"
+msgstr "hardcoded link %r å¯ä»¥è¢«ä¸€å€‹ extlink 所å–代(試試改用 %r)"
+
+#: sphinx/ext/graphviz.py:133
+msgid "Graphviz directive cannot have both content and a filename argument"
+msgstr "Graphviz 指令ä¸èƒ½åŒæ™‚有內容åŠæª”å引數"
+
+#: sphinx/ext/graphviz.py:143
+#, python-format
+msgid "External Graphviz file %r not found or reading it failed"
+msgstr "外部的 Graphviz 檔案 %r 未找到或是讀å–失敗"
+
+#: sphinx/ext/graphviz.py:150
+msgid "Ignoring \"graphviz\" directive without content."
+msgstr "正在略éŽæ²’有內容的 \"graphviz\" 指令"
+
+#: sphinx/ext/graphviz.py:259
+#, python-format
+msgid "graphviz_dot executable path must be set! %r"
+msgstr ""
+
+#: sphinx/ext/graphviz.py:294
+#, python-format
+msgid ""
+"dot command %r cannot be run (needed for graphviz output), check the "
+"graphviz_dot setting"
+msgstr "dot 命令 %r 無法被執行(graphviz 輸出所需è¦ï¼‰ï¼Œè«‹æª¢æŸ¥ graphviz_dot 設定"
+
+#: sphinx/ext/graphviz.py:301
+#, python-format
+msgid ""
+"dot exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "退出 dot,發生錯誤:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:304
+#, python-format
+msgid ""
+"dot did not produce an output file:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "dot 並未製作一個輸出檔案:\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/graphviz.py:320
+#, python-format
+msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
+msgstr "graphviz_output_format 必須是 'png' å’Œ 'svg' 之一,但å»æ˜¯ %r"
+
+#: sphinx/ext/graphviz.py:324 sphinx/ext/graphviz.py:377
+#: sphinx/ext/graphviz.py:414
+#, python-format
+msgid "dot code %r: %s"
+msgstr "點碼 %r: %s"
+
+#: sphinx/ext/graphviz.py:427 sphinx/ext/graphviz.py:435
+#, python-format
+msgid "[graph: %s]"
+msgstr "[圖:%s]"
+
+#: sphinx/ext/graphviz.py:429 sphinx/ext/graphviz.py:437
+msgid "[graph]"
+msgstr "[圖]"
+
+#: sphinx/ext/imgconverter.py:38
+#, python-format
+msgid ""
+"Unable to run the image conversion command %r. 'sphinx.ext.imgconverter' requires ImageMagick by default. Ensure it is installed, or set the 'image_converter' option to a custom conversion command.\n"
+"\n"
+"Traceback: %s"
+msgstr "無法執行影åƒè½‰æ›å‘½ä»¤ %r。 'sphinx.ext.imgconverter' é è¨­ç‚ºéœ€è¦ ImageMagick。請確èªå®ƒå·²è¢«å®‰è£ï¼Œæˆ–是設定 'image_converter' é¸é …為一個自訂轉æ›å‘½ä»¤ã€‚\n\n回溯: %s"
+
+#: sphinx/ext/imgconverter.py:47 sphinx/ext/imgconverter.py:71
+#, python-format
+msgid ""
+"convert exited with error:\n"
+"[stderr]\n"
+"%r\n"
+"[stdout]\n"
+"%r"
+msgstr "退出轉æ›ï¼Œç™¼ç”ŸéŒ¯èª¤ï¼š\n[stderr]\n%r\n[stdout]\n%r"
+
+#: sphinx/ext/imgconverter.py:66
+#, python-format
+msgid "convert command %r cannot be run, check the image_converter setting"
+msgstr "轉æ›å‘½ä»¤ %r 無法被執行,請檢查 image_converter 設定"
+
+#: sphinx/ext/imgmath.py:157
+#, python-format
+msgid ""
+"LaTeX command %r cannot be run (needed for math display), check the "
+"imgmath_latex setting"
+msgstr "LaTeX 命令 %r 無法被執行(數學顯示所需è¦ï¼‰ï¼Œè«‹æª¢æŸ¥ imgmath_latex 設定"
+
+#: sphinx/ext/imgmath.py:172
+#, python-format
+msgid ""
+"%s command %r cannot be run (needed for math display), check the imgmath_%s "
+"setting"
+msgstr "%s 命令 %r 無法被執行(數學顯示所需è¦ï¼‰ï¼Œè«‹æª¢æŸ¥ imgmath_%s 設定"
+
+#: sphinx/ext/imgmath.py:326
+#, python-format
+msgid "display latex %r: %s"
+msgstr "顯示 latex %r: %s"
+
+#: sphinx/ext/imgmath.py:360
+#, python-format
+msgid "inline latex %r: %s"
+msgstr "行內 latex %r: %s"
+
+#: sphinx/ext/imgmath.py:367 sphinx/ext/mathjax.py:52
+msgid "Link to this equation"
+msgstr ""
+
+#: sphinx/ext/intersphinx.py:194
+#, python-format
+msgid "intersphinx inventory has moved: %s -> %s"
+msgstr "intersphinx 庫存已移動: %s -> %s"
+
+#: sphinx/ext/intersphinx.py:229
+#, python-format
+msgid "loading intersphinx inventory from %s..."
+msgstr "正在從 %s 載入 intersphinx 庫存... "
+
+#: sphinx/ext/intersphinx.py:243
+msgid ""
+"encountered some issues with some of the inventories, but they had working "
+"alternatives:"
+msgstr "從一些庫存中é‡åˆ°ä¸€äº›å•é¡Œï¼Œä½†ä»–們已在進行替代方案:"
+
+#: sphinx/ext/intersphinx.py:249
+msgid "failed to reach any of the inventories with the following issues:"
+msgstr "無法到é”任何的庫存,é‡åˆ°ä»¥ä¸‹å•é¡Œï¼š"
+
+#: sphinx/ext/intersphinx.py:302
+#, python-format
+msgid "(in %s v%s)"
+msgstr "(æ–¼ %s v%s)"
+
+#: sphinx/ext/intersphinx.py:304
+#, python-format
+msgid "(in %s)"
+msgstr "(æ–¼ %s)"
+
+#: sphinx/ext/intersphinx.py:536
+#, python-format
+msgid "inventory for external cross-reference not found: %s"
+msgstr "未找到外部交å‰åƒç…§çš„清單: %s"
+
+#: sphinx/ext/intersphinx.py:542
+#, python-format
+msgid "role for external cross-reference not found: %s"
+msgstr "未找到外部交å‰åƒç…§çš„角色: %s"
+
+#: sphinx/ext/intersphinx.py:633
+#, python-format
+msgid "external %s:%s reference target not found: %s"
+msgstr "未找到外部的 %s:%s åƒç…§ç›®æ¨™ï¼š %s"
+
+#: sphinx/ext/intersphinx.py:658
+#, python-format
+msgid "intersphinx identifier %r is not string. Ignored"
+msgstr "intersphinx identifier %r ä¸æ˜¯å­—串。已略éŽ"
+
+#: sphinx/ext/intersphinx.py:680
+#, python-format
+msgid "Failed to read intersphinx_mapping[%s], ignored: %r"
+msgstr "ç„¡æ³•è®€å– intersphinx_mapping[%s], 已略éŽ: %r"
+
+#: sphinx/ext/linkcode.py:68 sphinx/ext/viewcode.py:198
+msgid "[source]"
+msgstr "[原始碼]"
+
+#: sphinx/ext/todo.py:67
+msgid "Todo"
+msgstr "Todo"
+
+#: sphinx/ext/todo.py:100
+#, python-format
+msgid "TODO entry found: %s"
+msgstr "找到 TODO 項目: %s"
+
+#: sphinx/ext/todo.py:158
+msgid "<<original entry>>"
+msgstr "<<original entry>>"
+
+#: sphinx/ext/todo.py:160
+#, python-format
+msgid "(The <<original entry>> is located in %s, line %d.)"
+msgstr "(<<original entry>> 見 %s ,第 %d 行)"
+
+#: sphinx/ext/todo.py:170
+msgid "original entry"
+msgstr "原始記錄"
+
+#: sphinx/ext/viewcode.py:255
+msgid "highlighting module code... "
+msgstr "正在 highlight 模組程å¼ç¢¼..."
+
+#: sphinx/ext/viewcode.py:283
+msgid "[docs]"
+msgstr "[文件]"
+
+#: sphinx/ext/viewcode.py:303
+msgid "Module code"
+msgstr "模組原始碼"
+
+#: sphinx/ext/viewcode.py:309
+#, python-format
+msgid "<h1>Source code for %s</h1>"
+msgstr "<h1>%s 的原始碼</h1>"
+
+#: sphinx/ext/viewcode.py:335
+msgid "Overview: module code"
+msgstr "概è¦ï¼šæ¨¡çµ„原始碼"
+
+#: sphinx/ext/viewcode.py:336
+msgid "<h1>All modules for which code is available</h1>"
+msgstr "<h1>所有å¯å¾—程å¼ç¢¼çš„模組</h1>"
+
+#: sphinx/ext/autodoc/__init__.py:127
+#, python-format
+msgid "invalid value for member-order option: %s"
+msgstr "å°æ–¼ member-order é¸é …無效的值: %s"
+
+#: sphinx/ext/autodoc/__init__.py:135
+#, python-format
+msgid "invalid value for class-doc-from option: %s"
+msgstr "å°æ–¼ class-doc-from é¸é …無效的值: %s"
+
+#: sphinx/ext/autodoc/__init__.py:391
+#, python-format
+msgid "invalid signature for auto%s (%r)"
+msgstr "無效的簽章給 auto%s (%r)"
+
+#: sphinx/ext/autodoc/__init__.py:508
+#, python-format
+msgid "error while formatting arguments for %s: %s"
+msgstr "在為 %s æ ¼å¼åŒ–引數時有錯誤: %s"
+
+#: sphinx/ext/autodoc/__init__.py:777
+#, python-format
+msgid ""
+"autodoc: failed to determine %s.%s (%r) to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autodoc: 決定 %s.%s (%r) 被文件化失敗,引發以下的例外:\n%s"
+
+#: sphinx/ext/autodoc/__init__.py:872
+#, python-format
+msgid ""
+"don't know which module to import for autodocumenting %r (try placing a "
+"\"module\" or \"currentmodule\" directive in the document, or giving an "
+"explicit module name)"
+msgstr "ä¸æ¸…æ¥šè¦ import 哪個模組來 autodocument %r (試試看在文件中加入 \"module\" 或 \"currentmodule\" 指令,或是給予一個明確的模組å稱)"
+
+#: sphinx/ext/autodoc/__init__.py:916
+#, python-format
+msgid "A mocked object is detected: %r"
+msgstr "一個 mocked 物件被åµæ¸¬åˆ°ï¼š %r"
+
+#: sphinx/ext/autodoc/__init__.py:935
+#, python-format
+msgid "error while formatting signature for %s: %s"
+msgstr "正在為 %s æ ¼å¼åŒ–ç°½å時發生錯誤: %s"
+
+#: sphinx/ext/autodoc/__init__.py:996
+msgid "\"::\" in automodule name doesn't make sense"
+msgstr "\"::\" 在 automodule çš„å稱中並ä¸åˆç†"
+
+#: sphinx/ext/autodoc/__init__.py:1003
+#, python-format
+msgid "signature arguments or return annotation given for automodule %s"
+msgstr "ç°½å引數或回傳註釋給予 automodule %s"
+
+#: sphinx/ext/autodoc/__init__.py:1016
+#, python-format
+msgid ""
+"__all__ should be a list of strings, not %r (in module %s) -- ignoring "
+"__all__"
+msgstr "__all__ 應該是一個字串的列表,ä¸æ˜¯ %r (在 %s 模組中)-- 正在忽略 __all__"
+
+#: sphinx/ext/autodoc/__init__.py:1082
+#, python-format
+msgid ""
+"missing attribute mentioned in :members: option: module %s, attribute %s"
+msgstr "缺少 :members: é¸é …中所述的屬性:模組 %s ,屬性 %s"
+
+#: sphinx/ext/autodoc/__init__.py:1298 sphinx/ext/autodoc/__init__.py:1375
+#: sphinx/ext/autodoc/__init__.py:2768
+#, python-format
+msgid "Failed to get a function signature for %s: %s"
+msgstr "無法å–得一個函å¼ç°½å給 %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1586
+#, python-format
+msgid "Failed to get a constructor signature for %s: %s"
+msgstr "無法å–得一個 constructor ç°½å給 %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:1713
+#, python-format
+msgid "Bases: %s"
+msgstr "基礎類別:%s"
+
+#: sphinx/ext/autodoc/__init__.py:1727
+#, python-format
+msgid "missing attribute %s in object %s"
+msgstr "éºæ¼å±¬æ€§ %s 在物件 %s"
+
+#: sphinx/ext/autodoc/__init__.py:1826 sphinx/ext/autodoc/__init__.py:1863
+#: sphinx/ext/autodoc/__init__.py:1946
+#, python-format
+msgid "alias of %s"
+msgstr "%s 的別å"
+
+#: sphinx/ext/autodoc/__init__.py:1846
+#, python-format
+msgid "alias of TypeVar(%s)"
+msgstr "TypeVar(%s) 的別å"
+
+#: sphinx/ext/autodoc/__init__.py:2167 sphinx/ext/autodoc/__init__.py:2264
+#, python-format
+msgid "Failed to get a method signature for %s: %s"
+msgstr "無法å–得一個 method ç°½å給 %s: %s"
+
+#: sphinx/ext/autodoc/__init__.py:2395
+#, python-format
+msgid "Invalid __slots__ found on %s. Ignored."
+msgstr "在 %s 找到無效的 __slots__。已略éŽã€‚"
+
+#: sphinx/ext/autodoc/preserve_defaults.py:183
+#, python-format
+msgid "Failed to parse a default argument value for %r: %s"
+msgstr "無法為 %r 剖æžä¸€å€‹é è¨­å¼•æ•¸ï¼š %s"
+
+#: sphinx/ext/autodoc/type_comment.py:131
+#, python-format
+msgid "Failed to update signature for %r: parameter not found: %s"
+msgstr "無法為 %r æ›´æ–°ç°½å:未找到åƒæ•¸ï¼š %s"
+
+#: sphinx/ext/autodoc/type_comment.py:134
+#, python-format
+msgid "Failed to parse type_comment for %r: %s"
+msgstr "無法為 %r å‰–æž type_comment: %s"
+
+#: sphinx/ext/autosummary/__init__.py:249
+#, python-format
+msgid "autosummary references excluded document %r. Ignored."
+msgstr "autosummary åƒç…§å·²æŽ’除文件 %r 。已略éŽã€‚"
+
+#: sphinx/ext/autosummary/__init__.py:251
+#, python-format
+msgid ""
+"autosummary: stub file not found %r. Check your autosummary_generate "
+"setting."
+msgstr "autosummary: 未找到 stub 檔 %r 。請檢查您的 autosummary_generate 設定。"
+
+#: sphinx/ext/autosummary/__init__.py:270
+msgid "A captioned autosummary requires :toctree: option. ignored."
+msgstr "一個有標題的 autosummary éœ€è¦ :toctree: é¸é …。已略éŽã€‚ "
+
+#: sphinx/ext/autosummary/__init__.py:323
+#, python-format
+msgid ""
+"autosummary: failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "autosummary: import %s 失敗。\nå¯èƒ½çš„æ示:\n%s"
+
+#: sphinx/ext/autosummary/__init__.py:337
+#, python-format
+msgid "failed to parse name %s"
+msgstr "剖æžå稱 %s 失敗"
+
+#: sphinx/ext/autosummary/__init__.py:342
+#, python-format
+msgid "failed to import object %s"
+msgstr "import 物件 %s 失敗"
+
+#: sphinx/ext/autosummary/__init__.py:798
+#, python-format
+msgid "autosummary_generate: file not found: %s"
+msgstr "autosummary_generate: 檔案未找到: %s"
+
+#: sphinx/ext/autosummary/__init__.py:806
+msgid ""
+"autosummary generats .rst files internally. But your source_suffix does not "
+"contain .rst. Skipped."
+msgstr "autosummary 會在內部產生 .rst 檔案。但是您的 source_suffix ä¸¦æœªåŒ…å« .rst。已çœç•¥ã€‚"
+
+#: sphinx/ext/autosummary/generate.py:200
+#: sphinx/ext/autosummary/generate.py:358
+#, python-format
+msgid ""
+"autosummary: failed to determine %r to be documented, the following exception was raised:\n"
+"%s"
+msgstr "autosummary: 無法決定 %r 被記錄,以下例外被引發:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:470
+#, python-format
+msgid "[autosummary] generating autosummary for: %s"
+msgstr "[autosummary] 正在產生 autosummary 給: %s"
+
+#: sphinx/ext/autosummary/generate.py:474
+#, python-format
+msgid "[autosummary] writing to %s"
+msgstr "[autosummary] 正在寫入 %s"
+
+#: sphinx/ext/autosummary/generate.py:517
+#, python-format
+msgid ""
+"[autosummary] failed to import %s.\n"
+"Possible hints:\n"
+"%s"
+msgstr "[autosummary] import %s 失敗。\nå¯èƒ½çš„æ示:\n%s"
+
+#: sphinx/ext/autosummary/generate.py:690
+msgid ""
+"\n"
+"Generate ReStructuredText using autosummary directives.\n"
+"\n"
+"sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates\n"
+"the reStructuredText files from the autosummary directives contained in the\n"
+"given input files.\n"
+"\n"
+"The format of the autosummary directive is documented in the\n"
+"``sphinx.ext.autosummary`` Python module and can be read using::\n"
+"\n"
+" pydoc sphinx.ext.autosummary\n"
+msgstr "\n使用 autosummary 指令產生 ReStructuredText。\n\nsphinx-autogen 是 sphinx.ext.autosummary.generate 的一個å‰ç«¯ã€‚它會從給定的\n輸入檔案中所包å«çš„ autosummary 指令,產生 reStructuredText 檔案。\n\nautosummary 指令的格å¼è¢«è¨˜éŒ„在 ``sphinx.ext.autosummary`` Python 模組中,\n它å¯ä»¥ä½¿ç”¨æ­¤æ–¹æ³•ä¾†è®€å–::\n\npydoc sphinx.ext.autosummary\n"
+
+#: sphinx/ext/autosummary/generate.py:707
+msgid "source files to generate rST files for"
+msgstr "原始檔案以產生 rST 檔案給"
+
+#: sphinx/ext/autosummary/generate.py:711
+msgid "directory to place all output in"
+msgstr "資料夾來放置所有輸出在"
+
+#: sphinx/ext/autosummary/generate.py:714
+#, python-format
+msgid "default suffix for files (default: %(default)s)"
+msgstr "檔案的é è¨­å¾Œç¶´ï¼ˆé è¨­ï¼š %(default)s )"
+
+#: sphinx/ext/autosummary/generate.py:718
+#, python-format
+msgid "custom template directory (default: %(default)s)"
+msgstr "自訂模æ¿è³‡æ–™å¤¾ï¼ˆé è¨­ï¼š %(default)s )"
+
+#: sphinx/ext/autosummary/generate.py:722
+#, python-format
+msgid "document imported members (default: %(default)s)"
+msgstr "文件引入æˆå“¡ï¼ˆé è¨­ï¼š %(default)s )"
+
+#: sphinx/ext/autosummary/generate.py:726
+#, python-format
+msgid ""
+"document exactly the members in module __all__ attribute. (default: "
+"%(default)s)"
+msgstr "文件確實是在模組 __all__ 屬性中的æˆå“¡ã€‚(é è¨­å€¼ï¼š %(default)s)"
+
+#: sphinx/ext/napoleon/__init__.py:336 sphinx/ext/napoleon/docstring.py:726
+msgid "Keyword Arguments"
+msgstr "é—œéµå­—引數"
+
+#: sphinx/ext/napoleon/docstring.py:680
+msgid "Example"
+msgstr "範例"
+
+#: sphinx/ext/napoleon/docstring.py:681
+msgid "Examples"
+msgstr "範例"
+
+#: sphinx/ext/napoleon/docstring.py:742
+msgid "Notes"
+msgstr "備註"
+
+#: sphinx/ext/napoleon/docstring.py:751
+msgid "Other Parameters"
+msgstr "其他åƒæ•¸"
+
+#: sphinx/ext/napoleon/docstring.py:787
+msgid "Receives"
+msgstr "接收"
+
+#: sphinx/ext/napoleon/docstring.py:791
+msgid "References"
+msgstr "åƒç…§"
+
+#: sphinx/ext/napoleon/docstring.py:823
+msgid "Warns"
+msgstr "警告"
+
+#: sphinx/ext/napoleon/docstring.py:827
+msgid "Yields"
+msgstr "產出"
+
+#: sphinx/ext/napoleon/docstring.py:985
+#, python-format
+msgid "invalid value set (missing closing brace): %s"
+msgstr "無效的值集åˆï¼ˆç¼ºå°‘å³æ‹¬è™Ÿï¼‰ï¼š %s"
+
+#: sphinx/ext/napoleon/docstring.py:992
+#, python-format
+msgid "invalid value set (missing opening brace): %s"
+msgstr "無效的值集åˆï¼ˆç¼ºå°‘左括號): %s"
+
+#: sphinx/ext/napoleon/docstring.py:999
+#, python-format
+msgid "malformed string literal (missing closing quote): %s"
+msgstr "異常的字串文本(缺少å³æ‹¬è™Ÿï¼‰ï¼š %s"
+
+#: sphinx/ext/napoleon/docstring.py:1006
+#, python-format
+msgid "malformed string literal (missing opening quote): %s"
+msgstr "異常的字串文本(缺少左括號): %s"
+
+#: sphinx/locale/__init__.py:221
+msgid "Attention"
+msgstr "注æ„"
+
+#: sphinx/locale/__init__.py:222
+msgid "Caution"
+msgstr "警示"
+
+#: sphinx/locale/__init__.py:223
+msgid "Danger"
+msgstr "å±éšª"
+
+#: sphinx/locale/__init__.py:224
+msgid "Error"
+msgstr "錯誤"
+
+#: sphinx/locale/__init__.py:225
+msgid "Hint"
+msgstr "æ示"
+
+#: sphinx/locale/__init__.py:226
+msgid "Important"
+msgstr "é‡è¦"
+
+#: sphinx/locale/__init__.py:227
+msgid "Note"
+msgstr "備註"
+
+#: sphinx/locale/__init__.py:228
+msgid "See also"
+msgstr "也åƒè€ƒ"
+
+#: sphinx/locale/__init__.py:229
+msgid "Tip"
+msgstr "å°è¨£ç«…"
+
+#: sphinx/locale/__init__.py:230
+msgid "Warning"
+msgstr "警告"
+
+#: sphinx/templates/latex/longtable.tex_t:52
+#: sphinx/templates/latex/sphinxmessages.sty_t:8
+msgid "continued from previous page"
+msgstr "繼續上一é "
+
+#: sphinx/templates/latex/longtable.tex_t:63
+#: sphinx/templates/latex/sphinxmessages.sty_t:9
+msgid "continues on next page"
+msgstr "繼續下一é "
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:10
+msgid "Non-alphabetical"
+msgstr "éžä¾å­—æ¯é †åº"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:12
+msgid "Numbers"
+msgstr "數字"
+
+#: sphinx/templates/latex/sphinxmessages.sty_t:13
+msgid "page"
+msgstr "é "
+
+#: sphinx/themes/agogo/layout.html:38 sphinx/themes/basic/globaltoc.html:10
+#: sphinx/themes/basic/localtoc.html:12 sphinx/themes/scrolls/layout.html:41
+msgid "Table of Contents"
+msgstr "目錄"
+
+#: sphinx/themes/agogo/layout.html:43 sphinx/themes/basic/layout.html:141
+#: sphinx/themes/basic/search.html:11 sphinx/themes/basic/search.html:22
+msgid "Search"
+msgstr "æœå°‹"
+
+#: sphinx/themes/agogo/layout.html:46 sphinx/themes/basic/searchbox.html:16
+#: sphinx/themes/basic/searchfield.html:18
+msgid "Go"
+msgstr "å‰å¾€"
+
+#: sphinx/themes/agogo/layout.html:90 sphinx/themes/basic/sourcelink.html:15
+msgid "Show Source"
+msgstr "顯示原始碼"
+
+#: sphinx/themes/basic/defindex.html:11
+msgid "Overview"
+msgstr "概è¦"
+
+#: sphinx/themes/basic/defindex.html:15
+msgid "Welcome! This is"
+msgstr "æ­¡è¿Žï¼æœ¬"
+
+#: sphinx/themes/basic/defindex.html:16
+msgid "the documentation for"
+msgstr "說明文件介紹"
+
+#: sphinx/themes/basic/defindex.html:17
+msgid "last updated"
+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:33
+#, python-format
+msgid "Index &ndash; %(key)s"
+msgstr "索引 &ndash; %(key)s"
+
+#: sphinx/themes/basic/genindex-single.html:61
+#: sphinx/themes/basic/genindex-split.html:24
+#: sphinx/themes/basic/genindex-split.html:38
+#: sphinx/themes/basic/genindex.html:73
+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:26
+msgid "Navigation"
+msgstr "ç€è¦½"
+
+#: sphinx/themes/basic/layout.html:126
+#, python-format
+msgid "Search within %(docstitle)s"
+msgstr "在 %(docstitle)s 中æœå°‹"
+
+#: sphinx/themes/basic/layout.html:135
+msgid "About these documents"
+msgstr "關於這些文件"
+
+#: sphinx/themes/basic/layout.html:144 sphinx/themes/basic/layout.html:188
+#: sphinx/themes/basic/layout.html:190
+msgid "Copyright"
+msgstr "版權所有"
+
+#: sphinx/themes/basic/layout.html:194 sphinx/themes/basic/layout.html:200
+#, python-format
+msgid "&#169; %(copyright_prefix)s %(copyright)s."
+msgstr ""
+
+#: sphinx/themes/basic/layout.html:212
+#, python-format
+msgid "Last updated on %(last_updated)s."
+msgstr "最後更新於 %(last_updated)s。"
+
+#: sphinx/themes/basic/layout.html:215
+#, python-format
+msgid ""
+"Created using <a href=\"https://www.sphinx-doc.org/\">Sphinx</a> "
+"%(sphinx_version)s."
+msgstr "使用 <a href=\"https://www.sphinx-doc.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:12
+msgid "Previous topic"
+msgstr "上個主題"
+
+#: sphinx/themes/basic/relations.html:14
+msgid "previous chapter"
+msgstr "上一章"
+
+#: sphinx/themes/basic/relations.html:19
+msgid "Next topic"
+msgstr "下個主題"
+
+#: sphinx/themes/basic/relations.html:21
+msgid "next chapter"
+msgstr "下一章"
+
+#: sphinx/themes/basic/search.html:27
+msgid ""
+"Please activate JavaScript to enable the search\n"
+" functionality."
+msgstr "請啟用 Javascript 以開啟æœå°‹åŠŸèƒ½ã€‚"
+
+#: sphinx/themes/basic/search.html:35
+msgid ""
+"Searching for multiple words only shows matches that contain\n"
+" all words."
+msgstr "æœå°‹å¤šå€‹é—œéµå­—時,åªæœƒé¡¯ç¤ºåŒ…å«æ‰€æœ‰é—œéµå­—çš„çµæžœã€‚"
+
+#: sphinx/themes/basic/search.html:42
+msgid "search"
+msgstr "æœå°‹"
+
+#: sphinx/themes/basic/search.html:48
+#: sphinx/themes/basic/static/searchtools.js:112
+msgid "Search Results"
+msgstr "æœå°‹çµæžœ"
+
+#: sphinx/themes/basic/search.html:50
+#: sphinx/themes/basic/static/searchtools.js:114
+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/searchbox.html:12
+msgid "Quick search"
+msgstr "快速æœå°‹"
+
+#: sphinx/themes/basic/sourcelink.html:12
+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 &#8212; %(docstitle)s"
+msgstr "於 %(version)s 版中的所有變更 &#8212; %(docstitle)s"
+
+#: sphinx/themes/basic/changes/rstsource.html:5
+#, python-format
+msgid "%(filename)s &#8212; %(docstitle)s"
+msgstr "%(filename)s &#8212; %(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/searchtools.js:118
+msgid ""
+"Search finished, found ${resultCount} page(s) matching the search query."
+msgstr "æœå°‹çµæŸï¼Œå…±æ‰¾åˆ° ${resultCount} 個é é¢ç¬¦åˆæœå°‹æ¢ä»¶ã€‚"
+
+#: sphinx/themes/basic/static/searchtools.js:217
+msgid "Searching"
+msgstr "æœå°‹ä¸­"
+
+#: sphinx/themes/basic/static/searchtools.js:233
+msgid "Preparing search..."
+msgstr "準備æœå°‹ä¸­â€¦"
+
+#: sphinx/themes/basic/static/searchtools.js:421
+msgid ", in "
+msgstr ",於 "
+
+#: sphinx/themes/basic/static/sphinx_highlight.js:112
+msgid "Hide Search Matches"
+msgstr "éš±è—符åˆæœå°‹"
+
+#: sphinx/themes/classic/layout.html:20
+#: sphinx/themes/classic/static/sidebar.js_t:57
+msgid "Collapse sidebar"
+msgstr "收åˆå´é‚Šæ¬„"
+
+#: sphinx/themes/classic/static/sidebar.js_t:48
+msgid "Expand sidebar"
+msgstr "展開å´é‚Šæ¬„"
+
+#: sphinx/themes/haiku/layout.html:24
+msgid "Contents"
+msgstr "內容"
+
+#: sphinx/transforms/__init__.py:126
+msgid "could not calculate translation progress!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:131
+msgid "no translated elements!"
+msgstr ""
+
+#: sphinx/transforms/__init__.py:238
+#, python-format
+msgid ""
+"4 column based index found. It might be a bug of extensions you use: %r"
+msgstr "找到基於 4 欄ä½çš„索引。它å¯èƒ½æ˜¯æ‚¨ä½¿ç”¨çš„擴充套件的一個錯誤: %r"
+
+#: sphinx/transforms/__init__.py:277
+#, python-format
+msgid "Footnote [%s] is not referenced."
+msgstr "註腳 [%s] 未被åƒç…§ã€‚"
+
+#: sphinx/transforms/__init__.py:283
+msgid "Footnote [#] is not referenced."
+msgstr "註腳 [#] 未被åƒç…§ã€‚"
+
+#: sphinx/transforms/i18n.py:205 sphinx/transforms/i18n.py:272
+msgid ""
+"inconsistent footnote references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "被翻譯訊æ¯ä¸­æœ‰ä¸ä¸€è‡´çš„註腳åƒç…§ã€‚原文: {0},譯文: {1}"
+
+#: sphinx/transforms/i18n.py:245
+msgid ""
+"inconsistent references in translated message. original: {0}, translated: "
+"{1}"
+msgstr "被翻譯訊æ¯ä¸­æœ‰ä¸ä¸€è‡´çš„åƒç…§ã€‚原文: {0},譯文: {1}"
+
+#: sphinx/transforms/i18n.py:287
+msgid ""
+"inconsistent citation references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "被翻譯訊æ¯ä¸­æœ‰ä¸ä¸€è‡´çš„引用。原文: {0},譯文: {1}"
+
+#: sphinx/transforms/i18n.py:304
+msgid ""
+"inconsistent term references in translated message. original: {0}, "
+"translated: {1}"
+msgstr "被翻譯訊æ¯ä¸­æœ‰ä¸ä¸€è‡´çš„術語åƒç…§ã€‚原文: {0},譯文: {1}"
+
+#: sphinx/transforms/post_transforms/__init__.py:116
+msgid ""
+"Could not determine the fallback text for the cross-reference. Might be a "
+"bug."
+msgstr "無法為交互åƒç…§æ±ºå®šå‚™ç”¨æ–‡å­—。å¯èƒ½æ˜¯å€‹éŒ¯èª¤ã€‚"
+
+#: sphinx/transforms/post_transforms/__init__.py:158
+#, python-format
+msgid "more than one target found for 'any' cross-reference %r: could be %s"
+msgstr "為「任一個ã€äº¤äº’åƒç…§ %r 找到多於一個目標:å¯èƒ½æ˜¯ %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:209
+#, python-format
+msgid "%s:%s reference target not found: %s"
+msgstr "%s:%s åƒç…§ç›®æ¨™æœªæ‰¾åˆ°ï¼š %s"
+
+#: sphinx/transforms/post_transforms/__init__.py:212
+#, python-format
+msgid "%r reference target not found: %s"
+msgstr "%r åƒç…§ç›®æ¨™æœªæ‰¾åˆ°ï¼š %s"
+
+#: sphinx/transforms/post_transforms/images.py:80
+#, python-format
+msgid "Could not fetch remote image: %s [%d]"
+msgstr "無法æå–é ç«¯åœ–片: %s [%d]"
+
+#: sphinx/transforms/post_transforms/images.py:108
+#, python-format
+msgid "Could not fetch remote image: %s [%s]"
+msgstr "無法æå–é ç«¯åœ–片: %s [%s]"
+
+#: sphinx/transforms/post_transforms/images.py:126
+#, python-format
+msgid "Unknown image format: %s..."
+msgstr "未知的圖片格å¼ï¼š %s..."
+
+#: sphinx/util/__init__.py:167
+#, python-format
+msgid "undecodable source characters, replacing with \"?\": %r"
+msgstr "無法解碼的原始字元,以 \"?\" å–代: %r"
+
+#: sphinx/util/display.py:77
+msgid "skipped"
+msgstr "å·²çœç•¥"
+
+#: sphinx/util/display.py:82
+msgid "failed"
+msgstr "失敗"
+
+#: sphinx/util/docfields.py:88
+#, python-format
+msgid ""
+"Problem in %s domain: field is supposed to use role '%s', but that role is "
+"not in the domain."
+msgstr "在 %s domain 中的å•é¡Œï¼šæ¬„ä½æ‡‰è©²è¦ç”¨è§’色 '%s' ,但是那個角色並ä¸åœ¨è©² domain。"
+
+#: sphinx/util/docutils.py:311
+#, python-format
+msgid "unknown directive or role name: %s:%s"
+msgstr "未知的指令或角色å稱: %s:%s"
+
+#: sphinx/util/docutils.py:605
+#, python-format
+msgid "unknown node type: %r"
+msgstr "未知的節點型別: %r"
+
+#: sphinx/util/i18n.py:63
+#, python-format
+msgid "reading error: %s, %s"
+msgstr "讀å–錯誤: %s, %s"
+
+#: sphinx/util/i18n.py:70
+#, python-format
+msgid "writing error: %s, %s"
+msgstr "寫入錯誤: %s, %s"
+
+#: sphinx/util/i18n.py:94
+#, python-format
+msgid "locale_dir %s does not exist"
+msgstr ""
+
+#: sphinx/util/i18n.py:185
+#, python-format
+msgid ""
+"Invalid date format. Quote the string by single quote if you want to output "
+"it directly: %s"
+msgstr "無效的日期格å¼ã€‚如果您è¦ç›´æŽ¥å°‡å®ƒè¼¸å‡ºï¼Œå‰‡ä»¥å–®å¼•è™Ÿå¼•ç”¨è©²å­—串: %s"
+
+#: sphinx/util/nodes.py:378
+#, python-format
+msgid ""
+"%r is deprecated for index entries (from entry %r). Use 'pair: %s' instead."
+msgstr ""
+
+#: sphinx/util/nodes.py:426
+#, python-format
+msgid "toctree contains ref to nonexisting file %r"
+msgstr "toctree 包å«äº†ä¸å­˜åœ¨çš„檔案 %r çš„åƒç…§ "
+
+#: sphinx/util/nodes.py:627
+#, python-format
+msgid "exception while evaluating only directive expression: %s"
+msgstr "在評估åªæœ‰æŒ‡ä»¤çš„é‹ç®—å¼æ™‚發生例外: %s"
+
+#: sphinx/util/rst.py:70
+#, python-format
+msgid "default role %s not found"
+msgstr "é è¨­è§’色 %s 未找到"
+
+#: sphinx/writers/html5.py:100 sphinx/writers/html5.py:109
+msgid "Link to this definition"
+msgstr ""
+
+#: sphinx/writers/html5.py:397
+#, python-format
+msgid "numfig_format is not defined for %s"
+msgstr "numfig_format 未被定義給 %s"
+
+#: sphinx/writers/html5.py:407
+#, python-format
+msgid "Any IDs not assigned for %s node"
+msgstr "任一個 ID 未被指定給 %s 節點"
+
+#: sphinx/writers/html5.py:462
+msgid "Link to this term"
+msgstr ""
+
+#: sphinx/writers/html5.py:485 sphinx/writers/html5.py:490
+msgid "Link to this heading"
+msgstr ""
+
+#: sphinx/writers/html5.py:494
+msgid "Link to this table"
+msgstr ""
+
+#: sphinx/writers/html5.py:537
+msgid "Link to this code"
+msgstr ""
+
+#: sphinx/writers/html5.py:539
+msgid "Link to this image"
+msgstr ""
+
+#: sphinx/writers/html5.py:541
+msgid "Link to this toctree"
+msgstr ""
+
+#: sphinx/writers/html5.py:679
+msgid "Could not obtain image size. :scale: option is ignored."
+msgstr "無法å–得圖片大å°ã€‚ :scale: é¸é …已略éŽã€‚"
+
+#: sphinx/writers/latex.py:335
+#, python-format
+msgid "unknown %r toplevel_sectioning for class %r"
+msgstr "未知的 %r toplevel_sectioning å°æ–¼ class %r"
+
+#: sphinx/writers/latex.py:386
+msgid "too large :maxdepth:, ignored."
+msgstr ":maxdepth: 太大,已略éŽã€‚"
+
+#: sphinx/writers/latex.py:625
+msgid "document title is not a single Text node"
+msgstr "文件標題ä¸æ˜¯å–®ä¸€çš„ Text 節點"
+
+#: sphinx/writers/latex.py:656 sphinx/writers/texinfo.py:622
+msgid ""
+"encountered title node not in section, topic, table, admonition or sidebar"
+msgstr "é‡åˆ°çš„標題節點ä¸æ˜¯åœ¨æ®µè½ã€ä¸»é¡Œã€è¡¨æ ¼ã€è­¦å‘Šæˆ–å´é‚Šæ¬„"
+
+#: sphinx/writers/latex.py:959 sphinx/writers/manpage.py:258
+#: sphinx/writers/texinfo.py:637
+msgid "Footnotes"
+msgstr "註腳"
+
+#: sphinx/writers/latex.py:1028
+msgid ""
+"both tabularcolumns and :widths: option are given. :widths: is ignored."
+msgstr "åŒæ™‚被給予 tabularcolumns åŠ :widths: é¸é …。 :widths: 已略éŽã€‚"
+
+#: sphinx/writers/latex.py:1388
+#, python-format
+msgid "dimension unit %s is invalid. Ignored."
+msgstr "ç¶­åº¦å–®ä½ %s 是無效的。已略éŽã€‚"
+
+#: sphinx/writers/latex.py:1722
+#, python-format
+msgid "unknown index entry type %s found"
+msgstr "找到了未知的索引æ¢ç›®åž‹åˆ¥ %s"
+
+#: sphinx/writers/manpage.py:306 sphinx/writers/text.py:917
+#, python-format
+msgid "[image: %s]"
+msgstr "[圖片:%s]"
+
+#: sphinx/writers/manpage.py:307 sphinx/writers/text.py:918
+msgid "[image]"
+msgstr "[圖片]"
+
+#: sphinx/writers/texinfo.py:1193
+msgid "caption not inside a figure."
+msgstr "標題ä¸åœ¨åœ–之內。"
+
+#: sphinx/writers/texinfo.py:1280
+#, python-format
+msgid "unimplemented node type: %r"
+msgstr "未實作的節點型別: %r"
diff --git a/sphinx/parsers.py b/sphinx/parsers.py
new file mode 100644
index 0000000..1269884
--- /dev/null
+++ b/sphinx/parsers.py
@@ -0,0 +1,97 @@
+"""A Base class for additional parsers."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+import docutils.parsers
+import docutils.parsers.rst
+from docutils import nodes
+from docutils.parsers.rst import states
+from docutils.statemachine import StringList
+from docutils.transforms.universal import SmartQuotes
+
+from sphinx.util.rst import append_epilog, prepend_prolog
+
+if TYPE_CHECKING:
+ from docutils.transforms import Transform
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+ from sphinx.environment import BuildEnvironment
+
+
+class Parser(docutils.parsers.Parser):
+ """
+ A base class of source parsers. The additional parsers should inherit this class instead
+ of ``docutils.parsers.Parser``. Compared with ``docutils.parsers.Parser``, this class
+ improves accessibility to Sphinx APIs.
+
+ The subclasses can access sphinx core runtime objects (app, config and env).
+ """
+
+ #: The config object
+ config: Config
+
+ #: The environment object
+ env: BuildEnvironment
+
+ def set_application(self, app: Sphinx) -> None:
+ """set_application will be called from Sphinx to set app and other instance variables
+
+ :param sphinx.application.Sphinx app: Sphinx application object
+ """
+ self._app = app
+ self.config = app.config
+ self.env = app.env
+
+
+class RSTParser(docutils.parsers.rst.Parser, Parser):
+ """A reST parser for Sphinx."""
+
+ def get_transforms(self) -> list[type[Transform]]:
+ """
+ Sphinx's reST parser replaces a transform class for smart-quotes by its own
+
+ refs: sphinx.io.SphinxStandaloneReader
+ """
+ transforms = super().get_transforms()
+ transforms.remove(SmartQuotes)
+ return transforms
+
+ def parse(self, inputstring: str | StringList, document: nodes.document) -> None:
+ """Parse text and generate a document tree."""
+ self.setup_parse(inputstring, document) # type: ignore[arg-type]
+ self.statemachine = states.RSTStateMachine(
+ state_classes=self.state_classes,
+ initial_state=self.initial_state,
+ debug=document.reporter.debug_flag)
+
+ # preprocess inputstring
+ if isinstance(inputstring, str):
+ lines = docutils.statemachine.string2lines(
+ inputstring, tab_width=document.settings.tab_width,
+ convert_whitespace=True)
+
+ inputlines = StringList(lines, document.current_source)
+ else:
+ inputlines = inputstring
+
+ self.decorate(inputlines)
+ self.statemachine.run(inputlines, document, inliner=self.inliner)
+ self.finish_parse()
+
+ def decorate(self, content: StringList) -> None:
+ """Preprocess reST content before parsing."""
+ prepend_prolog(content, self.config.rst_prolog)
+ append_epilog(content, self.config.rst_epilog)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_source_parser(RSTParser)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/project.py b/sphinx/project.py
new file mode 100644
index 0000000..57813fa
--- /dev/null
+++ b/sphinx/project.py
@@ -0,0 +1,112 @@
+"""Utility function and classes for Sphinx projects."""
+
+from __future__ import annotations
+
+import contextlib
+import os
+from glob import glob
+from typing import TYPE_CHECKING
+
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.matching import get_matching_files
+from sphinx.util.osutil import path_stabilize, relpath
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+
+logger = logging.getLogger(__name__)
+EXCLUDE_PATHS = ['**/_sources', '.#*', '**/.#*', '*.lproj/**']
+
+
+class Project:
+ """A project is the source code set of the Sphinx document(s)."""
+
+ def __init__(self, srcdir: str | os.PathLike[str], source_suffix: Iterable[str]) -> None:
+ #: Source directory.
+ self.srcdir = srcdir
+
+ #: source_suffix. Same as :confval:`source_suffix`.
+ self.source_suffix = tuple(source_suffix)
+ self._first_source_suffix = next(iter(self.source_suffix), "")
+
+ #: The name of documents belonging to this project.
+ self.docnames: set[str] = set()
+
+ # Bijective mapping between docnames and (srcdir relative) paths.
+ self._path_to_docname: dict[str, str] = {}
+ self._docname_to_path: dict[str, str] = {}
+
+ def restore(self, other: Project) -> None:
+ """Take over a result of last build."""
+ self.docnames = other.docnames
+ self._path_to_docname = other._path_to_docname
+ self._docname_to_path = other._docname_to_path
+
+ def discover(self, exclude_paths: Iterable[str] = (),
+ include_paths: Iterable[str] = ("**",)) -> set[str]:
+ """Find all document files in the source directory and put them in
+ :attr:`docnames`.
+ """
+
+ self.docnames.clear()
+ self._path_to_docname.clear()
+ self._docname_to_path.clear()
+
+ for filename in get_matching_files(
+ self.srcdir,
+ include_paths,
+ [*exclude_paths] + EXCLUDE_PATHS,
+ ):
+ if docname := self.path2doc(filename):
+ if docname in self.docnames:
+ pattern = os.path.join(self.srcdir, docname) + '.*'
+ files = [relpath(f, self.srcdir) for f in glob(pattern)]
+ logger.warning(__('multiple files found for the document "%s": %r\n'
+ 'Use %r for the build.'),
+ docname, files, self.doc2path(docname, absolute=True),
+ once=True)
+ elif os.access(os.path.join(self.srcdir, filename), os.R_OK):
+ self.docnames.add(docname)
+ self._path_to_docname[filename] = docname
+ self._docname_to_path[docname] = filename
+ else:
+ logger.warning(__("Ignored unreadable document %r."),
+ filename, location=docname)
+
+ return self.docnames
+
+ def path2doc(self, filename: str | os.PathLike[str]) -> str | None:
+ """Return the docname for the filename if the file is a document.
+
+ *filename* should be absolute or relative to the source directory.
+ """
+ try:
+ return self._path_to_docname[filename] # type: ignore[index]
+ except KeyError:
+ if os.path.isabs(filename):
+ with contextlib.suppress(ValueError):
+ filename = os.path.relpath(filename, self.srcdir)
+
+ for suffix in self.source_suffix:
+ if os.path.basename(filename).endswith(suffix):
+ return path_stabilize(filename).removesuffix(suffix)
+
+ # the file does not have a docname
+ return None
+
+ def doc2path(self, docname: str, absolute: bool) -> str:
+ """Return the filename for the document name.
+
+ If *absolute* is True, return as an absolute path.
+ Else, return as a relative path to the source directory.
+ """
+ try:
+ filename = self._docname_to_path[docname]
+ except KeyError:
+ # Backwards compatibility: the document does not exist
+ filename = docname + self._first_source_suffix
+
+ if absolute:
+ return os.path.join(self.srcdir, filename)
+ return filename
diff --git a/sphinx/py.typed b/sphinx/py.typed
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sphinx/py.typed
diff --git a/sphinx/pycode/__init__.py b/sphinx/pycode/__init__.py
new file mode 100644
index 0000000..55835ec
--- /dev/null
+++ b/sphinx/pycode/__init__.py
@@ -0,0 +1,152 @@
+"""Utilities parsing and analyzing Python code."""
+
+from __future__ import annotations
+
+import tokenize
+from importlib import import_module
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from sphinx.errors import PycodeError
+from sphinx.pycode.parser import Parser
+
+if TYPE_CHECKING:
+ from inspect import Signature
+
+
+class ModuleAnalyzer:
+ annotations: dict[tuple[str, str], str]
+ attr_docs: dict[tuple[str, str], list[str]]
+ finals: list[str]
+ overloads: dict[str, list[Signature]]
+ tagorder: dict[str, int]
+ tags: dict[str, tuple[str, int, int]]
+
+ # cache for analyzer objects -- caches both by module and file name
+ cache: dict[tuple[str, str], Any] = {}
+
+ @staticmethod
+ def get_module_source(modname: str) -> tuple[str | None, str | None]:
+ """Try to find the source code for a module.
+
+ Returns ('filename', 'source'). One of it can be None if
+ no filename or source found
+ """
+ try:
+ mod = import_module(modname)
+ except Exception as err:
+ raise PycodeError('error importing %r' % modname, err) from err
+ loader = getattr(mod, '__loader__', None)
+ filename = getattr(mod, '__file__', None)
+ if loader and getattr(loader, 'get_source', None):
+ # prefer Native loader, as it respects #coding directive
+ try:
+ source = loader.get_source(modname)
+ if source:
+ # no exception and not None - it must be module source
+ return filename, source
+ except ImportError:
+ pass # Try other "source-mining" methods
+ if filename is None and loader and getattr(loader, 'get_filename', None):
+ # have loader, but no filename
+ try:
+ filename = loader.get_filename(modname)
+ except ImportError as err:
+ raise PycodeError('error getting filename for %r' % modname, err) from err
+ if filename is None:
+ # all methods for getting filename failed, so raise...
+ raise PycodeError('no source found for module %r' % modname)
+ filename = path.normpath(path.abspath(filename))
+ if filename.lower().endswith(('.pyo', '.pyc')):
+ filename = filename[:-1]
+ if not path.isfile(filename) and path.isfile(filename + 'w'):
+ filename += 'w'
+ elif not filename.lower().endswith(('.py', '.pyw')):
+ raise PycodeError('source is not a .py file: %r' % filename)
+
+ if not path.isfile(filename):
+ raise PycodeError('source file is not present: %r' % filename)
+ return filename, None
+
+ @classmethod
+ def for_string(cls, string: str, modname: str, srcname: str = '<string>',
+ ) -> ModuleAnalyzer:
+ return cls(string, modname, srcname)
+
+ @classmethod
+ def for_file(cls, filename: str, modname: str) -> ModuleAnalyzer:
+ if ('file', filename) in cls.cache:
+ return cls.cache['file', filename]
+ try:
+ with tokenize.open(filename) as f:
+ string = f.read()
+ obj = cls(string, modname, filename)
+ cls.cache['file', filename] = obj
+ except Exception as err:
+ raise PycodeError('error opening %r' % filename, err) from err
+ return obj
+
+ @classmethod
+ def for_module(cls, modname: str) -> ModuleAnalyzer:
+ if ('module', modname) in cls.cache:
+ entry = cls.cache['module', modname]
+ if isinstance(entry, PycodeError):
+ raise entry
+ return entry
+
+ try:
+ filename, source = cls.get_module_source(modname)
+ if source is not None:
+ obj = cls.for_string(source, modname, filename or '<string>')
+ elif filename is not None:
+ obj = cls.for_file(filename, modname)
+ except PycodeError as err:
+ cls.cache['module', modname] = err
+ raise
+ cls.cache['module', modname] = obj
+ return obj
+
+ def __init__(self, source: str, modname: str, srcname: str) -> None:
+ self.modname = modname # name of the module
+ self.srcname = srcname # name of the source file
+
+ # cache the source code as well
+ self.code = source
+
+ self._analyzed = False
+
+ def analyze(self) -> None:
+ """Analyze the source code."""
+ if self._analyzed:
+ return
+
+ try:
+ parser = Parser(self.code)
+ parser.parse()
+
+ self.attr_docs = {}
+ for (scope, comment) in parser.comments.items():
+ if comment:
+ self.attr_docs[scope] = comment.splitlines() + ['']
+ else:
+ self.attr_docs[scope] = ['']
+
+ self.annotations = parser.annotations
+ self.finals = parser.finals
+ self.overloads = parser.overloads
+ self.tags = parser.definitions
+ self.tagorder = parser.deforders
+ self._analyzed = True
+ except Exception as exc:
+ msg = f'parsing {self.srcname!r} failed: {exc!r}'
+ raise PycodeError(msg) from exc
+
+ def find_attr_docs(self) -> dict[tuple[str, str], list[str]]:
+ """Find class and module-level attributes and their documentation."""
+ self.analyze()
+ return self.attr_docs
+
+ def find_tags(self) -> dict[str, tuple[str, int, int]]:
+ """Find class, function and method definitions and their location."""
+ self.analyze()
+ return self.tags
diff --git a/sphinx/pycode/ast.py b/sphinx/pycode/ast.py
new file mode 100644
index 0000000..e5914cc
--- /dev/null
+++ b/sphinx/pycode/ast.py
@@ -0,0 +1,188 @@
+"""Helpers for AST (Abstract Syntax Tree)."""
+
+from __future__ import annotations
+
+import ast
+from typing import overload
+
+OPERATORS: dict[type[ast.AST], str] = {
+ ast.Add: "+",
+ ast.And: "and",
+ ast.BitAnd: "&",
+ ast.BitOr: "|",
+ ast.BitXor: "^",
+ ast.Div: "/",
+ ast.FloorDiv: "//",
+ ast.Invert: "~",
+ ast.LShift: "<<",
+ ast.MatMult: "@",
+ ast.Mult: "*",
+ ast.Mod: "%",
+ ast.Not: "not",
+ ast.Pow: "**",
+ ast.Or: "or",
+ ast.RShift: ">>",
+ ast.Sub: "-",
+ ast.UAdd: "+",
+ ast.USub: "-",
+}
+
+
+@overload
+def unparse(node: None, code: str = '') -> None:
+ ...
+
+
+@overload
+def unparse(node: ast.AST, code: str = '') -> str:
+ ...
+
+
+def unparse(node: ast.AST | None, code: str = '') -> str | None:
+ """Unparse an AST to string."""
+ if node is None:
+ return None
+ elif isinstance(node, str):
+ return node
+ return _UnparseVisitor(code).visit(node)
+
+
+# a greatly cut-down version of `ast._Unparser`
+class _UnparseVisitor(ast.NodeVisitor):
+ def __init__(self, code: str = '') -> None:
+ self.code = code
+
+ def _visit_op(self, node: ast.AST) -> str:
+ return OPERATORS[node.__class__]
+ for _op in OPERATORS:
+ locals()[f'visit_{_op.__name__}'] = _visit_op
+
+ def visit_arg(self, node: ast.arg) -> str:
+ if node.annotation:
+ return f"{node.arg}: {self.visit(node.annotation)}"
+ else:
+ return node.arg
+
+ def _visit_arg_with_default(self, arg: ast.arg, default: ast.AST | None) -> str:
+ """Unparse a single argument to a string."""
+ name = self.visit(arg)
+ if default:
+ if arg.annotation:
+ name += " = %s" % self.visit(default)
+ else:
+ name += "=%s" % self.visit(default)
+ return name
+
+ def visit_arguments(self, node: ast.arguments) -> str:
+ defaults: list[ast.expr | None] = list(node.defaults)
+ positionals = len(node.args)
+ posonlyargs = len(node.posonlyargs)
+ positionals += posonlyargs
+ for _ in range(len(defaults), positionals):
+ defaults.insert(0, None)
+
+ kw_defaults: list[ast.expr | None] = list(node.kw_defaults)
+ for _ in range(len(kw_defaults), len(node.kwonlyargs)):
+ kw_defaults.insert(0, None)
+
+ args: list[str] = []
+ for i, arg in enumerate(node.posonlyargs):
+ args.append(self._visit_arg_with_default(arg, defaults[i]))
+
+ if node.posonlyargs:
+ args.append('/')
+
+ for i, arg in enumerate(node.args):
+ args.append(self._visit_arg_with_default(arg, defaults[i + posonlyargs]))
+
+ if node.vararg:
+ args.append("*" + self.visit(node.vararg))
+
+ if node.kwonlyargs and not node.vararg:
+ args.append('*')
+ for i, arg in enumerate(node.kwonlyargs):
+ args.append(self._visit_arg_with_default(arg, kw_defaults[i]))
+
+ if node.kwarg:
+ args.append("**" + self.visit(node.kwarg))
+
+ return ", ".join(args)
+
+ def visit_Attribute(self, node: ast.Attribute) -> str:
+ return f"{self.visit(node.value)}.{node.attr}"
+
+ def visit_BinOp(self, node: ast.BinOp) -> str:
+ # Special case ``**`` to not have surrounding spaces.
+ if isinstance(node.op, ast.Pow):
+ return "".join(map(self.visit, (node.left, node.op, node.right)))
+ return " ".join(self.visit(e) for e in [node.left, node.op, node.right])
+
+ def visit_BoolOp(self, node: ast.BoolOp) -> str:
+ op = " %s " % self.visit(node.op)
+ return op.join(self.visit(e) for e in node.values)
+
+ def visit_Call(self, node: ast.Call) -> str:
+ args = ', '.join([self.visit(e) for e in node.args]
+ + [f"{k.arg}={self.visit(k.value)}" for k in node.keywords])
+ return f"{self.visit(node.func)}({args})"
+
+ def visit_Constant(self, node: ast.Constant) -> str:
+ if node.value is Ellipsis:
+ return "..."
+ elif isinstance(node.value, (int, float, complex)):
+ if self.code:
+ return ast.get_source_segment(self.code, node) or repr(node.value)
+ else:
+ return repr(node.value)
+ else:
+ return repr(node.value)
+
+ def visit_Dict(self, node: ast.Dict) -> str:
+ keys = (self.visit(k) for k in node.keys if k is not None)
+ values = (self.visit(v) for v in node.values)
+ items = (k + ": " + v for k, v in zip(keys, values))
+ return "{" + ", ".join(items) + "}"
+
+ def visit_Lambda(self, node: ast.Lambda) -> str:
+ return "lambda %s: ..." % self.visit(node.args)
+
+ def visit_List(self, node: ast.List) -> str:
+ return "[" + ", ".join(self.visit(e) for e in node.elts) + "]"
+
+ def visit_Name(self, node: ast.Name) -> str:
+ return node.id
+
+ def visit_Set(self, node: ast.Set) -> str:
+ return "{" + ", ".join(self.visit(e) for e in node.elts) + "}"
+
+ def visit_Subscript(self, node: ast.Subscript) -> str:
+ def is_simple_tuple(value: ast.expr) -> bool:
+ return (
+ isinstance(value, ast.Tuple)
+ and bool(value.elts)
+ and not any(isinstance(elt, ast.Starred) for elt in value.elts)
+ )
+
+ if is_simple_tuple(node.slice):
+ elts = ", ".join(self.visit(e)
+ for e in node.slice.elts) # type: ignore[attr-defined]
+ return f"{self.visit(node.value)}[{elts}]"
+ return f"{self.visit(node.value)}[{self.visit(node.slice)}]"
+
+ def visit_UnaryOp(self, node: ast.UnaryOp) -> str:
+ # UnaryOp is one of {UAdd, USub, Invert, Not}, which refer to ``+x``,
+ # ``-x``, ``~x``, and ``not x``. Only Not needs a space.
+ if isinstance(node.op, ast.Not):
+ return f"{self.visit(node.op)} {self.visit(node.operand)}"
+ return f"{self.visit(node.op)}{self.visit(node.operand)}"
+
+ def visit_Tuple(self, node: ast.Tuple) -> str:
+ if len(node.elts) == 0:
+ return "()"
+ elif len(node.elts) == 1:
+ return "(%s,)" % self.visit(node.elts[0])
+ else:
+ return "(" + ", ".join(self.visit(e) for e in node.elts) + ")"
+
+ def generic_visit(self, node):
+ raise NotImplementedError('Unable to parse %s object' % type(node).__name__)
diff --git a/sphinx/pycode/parser.py b/sphinx/pycode/parser.py
new file mode 100644
index 0000000..a0f855d
--- /dev/null
+++ b/sphinx/pycode/parser.py
@@ -0,0 +1,577 @@
+"""Utilities parsing and analyzing Python code."""
+
+from __future__ import annotations
+
+import ast
+import contextlib
+import inspect
+import itertools
+import re
+import tokenize
+from inspect import Signature
+from token import DEDENT, INDENT, NAME, NEWLINE, NUMBER, OP, STRING
+from tokenize import COMMENT, NL
+from typing import Any
+
+from sphinx.pycode.ast import unparse as ast_unparse
+
+comment_re = re.compile('^\\s*#: ?(.*)\r?\n?$')
+indent_re = re.compile('^\\s*$')
+emptyline_re = re.compile('^\\s*(#.*)?$')
+
+
+def filter_whitespace(code: str) -> str:
+ return code.replace('\f', ' ') # replace FF (form feed) with whitespace
+
+
+def get_assign_targets(node: ast.AST) -> list[ast.expr]:
+ """Get list of targets from Assign and AnnAssign node."""
+ if isinstance(node, ast.Assign):
+ return node.targets
+ else:
+ return [node.target] # type: ignore[attr-defined]
+
+
+def get_lvar_names(node: ast.AST, self: ast.arg | None = None) -> list[str]:
+ """Convert assignment-AST to variable names.
+
+ This raises `TypeError` if the assignment does not create new variable::
+
+ ary[0] = 'foo'
+ dic["bar"] = 'baz'
+ # => TypeError
+ """
+ if self:
+ self_id = self.arg
+
+ node_name = node.__class__.__name__
+ if node_name in ('Constant', 'Index', 'Slice', 'Subscript'):
+ raise TypeError('%r does not create new variable' % node)
+ if node_name == 'Name':
+ if self is None or node.id == self_id: # type: ignore[attr-defined]
+ return [node.id] # type: ignore[attr-defined]
+ else:
+ raise TypeError('The assignment %r is not instance variable' % node)
+ elif node_name in ('Tuple', 'List'):
+ members = []
+ for elt in node.elts: # type: ignore[attr-defined]
+ with contextlib.suppress(TypeError):
+ members.extend(get_lvar_names(elt, self))
+
+ return members
+ elif node_name == 'Attribute':
+ if (
+ node.value.__class__.__name__ == 'Name' and # type: ignore[attr-defined]
+ self and node.value.id == self_id # type: ignore[attr-defined]
+ ):
+ # instance variable
+ return ["%s" % get_lvar_names(node.attr, self)[0]] # type: ignore[attr-defined]
+ else:
+ raise TypeError('The assignment %r is not instance variable' % node)
+ elif node_name == 'str':
+ return [node] # type: ignore[list-item]
+ elif node_name == 'Starred':
+ return get_lvar_names(node.value, self) # type: ignore[attr-defined]
+ else:
+ raise NotImplementedError('Unexpected node name %r' % node_name)
+
+
+def dedent_docstring(s: str) -> str:
+ """Remove common leading indentation from docstring."""
+ def dummy() -> None:
+ # dummy function to mock `inspect.getdoc`.
+ pass
+
+ dummy.__doc__ = s
+ docstring = inspect.getdoc(dummy)
+ if docstring:
+ return docstring.lstrip("\r\n").rstrip("\r\n")
+ else:
+ return ""
+
+
+class Token:
+ """Better token wrapper for tokenize module."""
+
+ def __init__(self, kind: int, value: Any, start: tuple[int, int], end: tuple[int, int],
+ source: str) -> None:
+ self.kind = kind
+ self.value = value
+ self.start = start
+ self.end = end
+ self.source = source
+
+ def __eq__(self, other: Any) -> bool:
+ if isinstance(other, int):
+ return self.kind == other
+ elif isinstance(other, str):
+ return self.value == other
+ elif isinstance(other, (list, tuple)):
+ return [self.kind, self.value] == list(other)
+ elif other is None:
+ return False
+ else:
+ raise ValueError('Unknown value: %r' % other)
+
+ def match(self, *conditions: Any) -> bool:
+ return any(self == candidate for candidate in conditions)
+
+ def __repr__(self) -> str:
+ return f'<Token kind={tokenize.tok_name[self.kind]!r} value={self.value.strip()!r}>'
+
+
+class TokenProcessor:
+ def __init__(self, buffers: list[str]) -> None:
+ lines = iter(buffers)
+ self.buffers = buffers
+ self.tokens = tokenize.generate_tokens(lambda: next(lines))
+ self.current: Token | None = None
+ self.previous: Token | None = None
+
+ def get_line(self, lineno: int) -> str:
+ """Returns specified line."""
+ return self.buffers[lineno - 1]
+
+ def fetch_token(self) -> Token | None:
+ """Fetch the next token from source code.
+
+ Returns ``None`` if sequence finished.
+ """
+ try:
+ self.previous = self.current
+ self.current = Token(*next(self.tokens))
+ except StopIteration:
+ self.current = None
+
+ return self.current
+
+ def fetch_until(self, condition: Any) -> list[Token]:
+ """Fetch tokens until specified token appeared.
+
+ .. note:: This also handles parenthesis well.
+ """
+ tokens = []
+ while current := self.fetch_token():
+ tokens.append(current)
+ if current == condition:
+ break
+ if current == [OP, '(']:
+ tokens += self.fetch_until([OP, ')'])
+ elif current == [OP, '{']:
+ tokens += self.fetch_until([OP, '}'])
+ elif current == [OP, '[']:
+ tokens += self.fetch_until([OP, ']'])
+
+ return tokens
+
+
+class AfterCommentParser(TokenProcessor):
+ """Python source code parser to pick up comments after assignments.
+
+ This parser takes code which starts with an assignment statement,
+ and returns the comment for the variable if one exists.
+ """
+
+ def __init__(self, lines: list[str]) -> None:
+ super().__init__(lines)
+ self.comment: str | None = None
+
+ def fetch_rvalue(self) -> list[Token]:
+ """Fetch right-hand value of assignment."""
+ tokens = []
+ while current := self.fetch_token():
+ tokens.append(current)
+ if current == [OP, '(']:
+ tokens += self.fetch_until([OP, ')'])
+ elif current == [OP, '{']:
+ tokens += self.fetch_until([OP, '}'])
+ elif current == [OP, '[']:
+ tokens += self.fetch_until([OP, ']'])
+ elif current == INDENT:
+ tokens += self.fetch_until(DEDENT)
+ elif current == [OP, ';']: # NoQA: SIM114
+ break
+ elif current and current.kind not in {OP, NAME, NUMBER, STRING}:
+ break
+
+ return tokens
+
+ def parse(self) -> None:
+ """Parse the code and obtain comment after assignment."""
+ # skip lvalue (or whole of AnnAssign)
+ while (tok := self.fetch_token()) and not tok.match([OP, '='], NEWLINE, COMMENT):
+ assert tok
+ assert tok is not None
+
+ # skip rvalue (if exists)
+ if tok == [OP, '=']:
+ self.fetch_rvalue()
+ tok = self.current
+ assert tok is not None
+
+ if tok == COMMENT:
+ self.comment = tok.value
+
+
+class VariableCommentPicker(ast.NodeVisitor):
+ """Python source code parser to pick up variable comments."""
+
+ def __init__(self, buffers: list[str], encoding: str) -> None:
+ self.counter = itertools.count()
+ self.buffers = buffers
+ self.encoding = encoding
+ self.context: list[str] = []
+ self.current_classes: list[str] = []
+ self.current_function: ast.FunctionDef | None = None
+ self.comments: dict[tuple[str, str], str] = {}
+ self.annotations: dict[tuple[str, str], str] = {}
+ self.previous: ast.AST | None = None
+ self.deforders: dict[str, int] = {}
+ self.finals: list[str] = []
+ self.overloads: dict[str, list[Signature]] = {}
+ self.typing: str | None = None
+ self.typing_final: str | None = None
+ self.typing_overload: str | None = None
+ super().__init__()
+
+ def get_qualname_for(self, name: str) -> list[str] | None:
+ """Get qualified name for given object as a list of string(s)."""
+ if self.current_function:
+ if self.current_classes and self.context[-1] == "__init__":
+ # store variable comments inside __init__ method of classes
+ return self.context[:-1] + [name]
+ else:
+ return None
+ else:
+ return self.context + [name]
+
+ def add_entry(self, name: str) -> None:
+ qualname = self.get_qualname_for(name)
+ if qualname:
+ self.deforders[".".join(qualname)] = next(self.counter)
+
+ def add_final_entry(self, name: str) -> None:
+ qualname = self.get_qualname_for(name)
+ if qualname:
+ self.finals.append(".".join(qualname))
+
+ def add_overload_entry(self, func: ast.FunctionDef) -> None:
+ # avoid circular import problem
+ from sphinx.util.inspect import signature_from_ast
+ qualname = self.get_qualname_for(func.name)
+ if qualname:
+ overloads = self.overloads.setdefault(".".join(qualname), [])
+ overloads.append(signature_from_ast(func))
+
+ def add_variable_comment(self, name: str, comment: str) -> None:
+ qualname = self.get_qualname_for(name)
+ if qualname:
+ basename = ".".join(qualname[:-1])
+ self.comments[(basename, name)] = comment
+
+ def add_variable_annotation(self, name: str, annotation: ast.AST) -> None:
+ qualname = self.get_qualname_for(name)
+ if qualname:
+ basename = ".".join(qualname[:-1])
+ self.annotations[(basename, name)] = ast_unparse(annotation)
+
+ def is_final(self, decorators: list[ast.expr]) -> bool:
+ final = []
+ if self.typing:
+ final.append('%s.final' % self.typing)
+ if self.typing_final:
+ final.append(self.typing_final)
+
+ for decorator in decorators:
+ try:
+ if ast_unparse(decorator) in final:
+ return True
+ except NotImplementedError:
+ pass
+
+ return False
+
+ def is_overload(self, decorators: list[ast.expr]) -> bool:
+ overload = []
+ if self.typing:
+ overload.append('%s.overload' % self.typing)
+ if self.typing_overload:
+ overload.append(self.typing_overload)
+
+ for decorator in decorators:
+ try:
+ if ast_unparse(decorator) in overload:
+ return True
+ except NotImplementedError:
+ pass
+
+ return False
+
+ def get_self(self) -> ast.arg | None:
+ """Returns the name of the first argument if in a function."""
+ if self.current_function and self.current_function.args.args:
+ return self.current_function.args.args[0]
+ if self.current_function and self.current_function.args.posonlyargs:
+ return self.current_function.args.posonlyargs[0]
+ return None
+
+ def get_line(self, lineno: int) -> str:
+ """Returns specified line."""
+ return self.buffers[lineno - 1]
+
+ def visit(self, node: ast.AST) -> None:
+ """Updates self.previous to the given node."""
+ super().visit(node)
+ self.previous = node
+
+ def visit_Import(self, node: ast.Import) -> None:
+ """Handles Import node and record the order of definitions."""
+ for name in node.names:
+ self.add_entry(name.asname or name.name)
+
+ if name.name == 'typing':
+ self.typing = name.asname or name.name
+ elif name.name == 'typing.final':
+ self.typing_final = name.asname or name.name
+ elif name.name == 'typing.overload':
+ self.typing_overload = name.asname or name.name
+
+ def visit_ImportFrom(self, node: ast.ImportFrom) -> None:
+ """Handles Import node and record the order of definitions."""
+ for name in node.names:
+ self.add_entry(name.asname or name.name)
+
+ if node.module == 'typing' and name.name == 'final':
+ self.typing_final = name.asname or name.name
+ elif node.module == 'typing' and name.name == 'overload':
+ self.typing_overload = name.asname or name.name
+
+ def visit_Assign(self, node: ast.Assign) -> None:
+ """Handles Assign node and pick up a variable comment."""
+ try:
+ targets = get_assign_targets(node)
+ varnames: list[str] = sum(
+ [get_lvar_names(t, self=self.get_self()) for t in targets], [],
+ )
+ current_line = self.get_line(node.lineno)
+ except TypeError:
+ return # this assignment is not new definition!
+
+ # record annotation
+ if hasattr(node, 'annotation') and node.annotation:
+ for varname in varnames:
+ self.add_variable_annotation(varname, node.annotation)
+ elif hasattr(node, 'type_comment') and node.type_comment:
+ for varname in varnames:
+ self.add_variable_annotation(
+ varname, node.type_comment) # type: ignore[arg-type]
+
+ # check comments after assignment
+ parser = AfterCommentParser([current_line[node.col_offset:]] +
+ self.buffers[node.lineno:])
+ parser.parse()
+ if parser.comment and comment_re.match(parser.comment):
+ for varname in varnames:
+ self.add_variable_comment(varname, comment_re.sub('\\1', parser.comment))
+ self.add_entry(varname)
+ return
+
+ # check comments before assignment
+ if indent_re.match(current_line[:node.col_offset]):
+ comment_lines = []
+ for i in range(node.lineno - 1):
+ before_line = self.get_line(node.lineno - 1 - i)
+ if comment_re.match(before_line):
+ comment_lines.append(comment_re.sub('\\1', before_line))
+ else:
+ break
+
+ if comment_lines:
+ comment = dedent_docstring('\n'.join(reversed(comment_lines)))
+ for varname in varnames:
+ self.add_variable_comment(varname, comment)
+ self.add_entry(varname)
+ return
+
+ # not commented (record deforders only)
+ for varname in varnames:
+ self.add_entry(varname)
+
+ def visit_AnnAssign(self, node: ast.AnnAssign) -> None:
+ """Handles AnnAssign node and pick up a variable comment."""
+ self.visit_Assign(node) # type: ignore[arg-type]
+
+ def visit_Expr(self, node: ast.Expr) -> None:
+ """Handles Expr node and pick up a comment if string."""
+ if (isinstance(self.previous, (ast.Assign, ast.AnnAssign)) and
+ isinstance(node.value, ast.Constant) and isinstance(node.value.value, str)):
+ try:
+ targets = get_assign_targets(self.previous)
+ varnames = get_lvar_names(targets[0], self.get_self())
+ for varname in varnames:
+ if isinstance(node.value.value, str):
+ docstring = node.value.value
+ else:
+ docstring = node.value.value.decode(self.encoding or 'utf-8')
+
+ self.add_variable_comment(varname, dedent_docstring(docstring))
+ self.add_entry(varname)
+ except TypeError:
+ pass # this assignment is not new definition!
+
+ def visit_Try(self, node: ast.Try) -> None:
+ """Handles Try node and processes body and else-clause.
+
+ .. note:: pycode parser ignores objects definition in except-clause.
+ """
+ for subnode in node.body:
+ self.visit(subnode)
+ for subnode in node.orelse:
+ self.visit(subnode)
+
+ def visit_ClassDef(self, node: ast.ClassDef) -> None:
+ """Handles ClassDef node and set context."""
+ self.current_classes.append(node.name)
+ self.add_entry(node.name)
+ if self.is_final(node.decorator_list):
+ self.add_final_entry(node.name)
+ self.context.append(node.name)
+ self.previous = node
+ for child in node.body:
+ self.visit(child)
+ self.context.pop()
+ self.current_classes.pop()
+
+ def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
+ """Handles FunctionDef node and set context."""
+ if self.current_function is None:
+ self.add_entry(node.name) # should be called before setting self.current_function
+ if self.is_final(node.decorator_list):
+ self.add_final_entry(node.name)
+ if self.is_overload(node.decorator_list):
+ self.add_overload_entry(node)
+ self.context.append(node.name)
+ self.current_function = node
+ for child in node.body:
+ self.visit(child)
+ self.context.pop()
+ self.current_function = None
+
+ def visit_AsyncFunctionDef(self, node: ast.AsyncFunctionDef) -> None:
+ """Handles AsyncFunctionDef node and set context."""
+ self.visit_FunctionDef(node) # type: ignore[arg-type]
+
+
+class DefinitionFinder(TokenProcessor):
+ """Python source code parser to detect location of functions,
+ classes and methods.
+ """
+
+ def __init__(self, lines: list[str]) -> None:
+ super().__init__(lines)
+ self.decorator: Token | None = None
+ self.context: list[str] = []
+ self.indents: list[tuple[str, str | None, int | None]] = []
+ self.definitions: dict[str, tuple[str, int, int]] = {}
+
+ def add_definition(self, name: str, entry: tuple[str, int, int]) -> None:
+ """Add a location of definition."""
+ if self.indents and self.indents[-1][0] == 'def' and entry[0] == 'def':
+ # ignore definition of inner function
+ pass
+ else:
+ self.definitions[name] = entry
+
+ def parse(self) -> None:
+ """Parse the code to obtain location of definitions."""
+ while True:
+ token = self.fetch_token()
+ if token is None:
+ break
+ if token == COMMENT:
+ pass
+ elif token == [OP, '@'] and (self.previous is None or
+ self.previous.match(NEWLINE, NL, INDENT, DEDENT)):
+ if self.decorator is None:
+ self.decorator = token
+ elif token.match([NAME, 'class']):
+ self.parse_definition('class')
+ elif token.match([NAME, 'def']):
+ self.parse_definition('def')
+ elif token == INDENT:
+ self.indents.append(('other', None, None))
+ elif token == DEDENT:
+ self.finalize_block()
+
+ def parse_definition(self, typ: str) -> None:
+ """Parse AST of definition."""
+ name = self.fetch_token()
+ self.context.append(name.value) # type: ignore[union-attr]
+ funcname = '.'.join(self.context)
+
+ if self.decorator:
+ start_pos = self.decorator.start[0]
+ self.decorator = None
+ else:
+ start_pos = name.start[0] # type: ignore[union-attr]
+
+ self.fetch_until([OP, ':'])
+ if self.fetch_token().match(COMMENT, NEWLINE): # type: ignore[union-attr]
+ self.fetch_until(INDENT)
+ self.indents.append((typ, funcname, start_pos))
+ else:
+ # one-liner
+ self.add_definition(funcname,
+ (typ, start_pos, name.end[0])) # type: ignore[union-attr]
+ self.context.pop()
+
+ def finalize_block(self) -> None:
+ """Finalize definition block."""
+ definition = self.indents.pop()
+ if definition[0] != 'other':
+ typ, funcname, start_pos = definition
+ end_pos = self.current.end[0] - 1 # type: ignore[union-attr]
+ while emptyline_re.match(self.get_line(end_pos)):
+ end_pos -= 1
+
+ self.add_definition(funcname, (typ, start_pos, end_pos)) # type: ignore[arg-type]
+ self.context.pop()
+
+
+class Parser:
+ """Python source code parser to pick up variable comments.
+
+ This is a better wrapper for ``VariableCommentPicker``.
+ """
+
+ def __init__(self, code: str, encoding: str = 'utf-8') -> None:
+ self.code = filter_whitespace(code)
+ self.encoding = encoding
+ self.annotations: dict[tuple[str, str], str] = {}
+ self.comments: dict[tuple[str, str], str] = {}
+ self.deforders: dict[str, int] = {}
+ self.definitions: dict[str, tuple[str, int, int]] = {}
+ self.finals: list[str] = []
+ self.overloads: dict[str, list[Signature]] = {}
+
+ def parse(self) -> None:
+ """Parse the source code."""
+ self.parse_comments()
+ self.parse_definition()
+
+ def parse_comments(self) -> None:
+ """Parse the code and pick up comments."""
+ tree = ast.parse(self.code, type_comments=True)
+ picker = VariableCommentPicker(self.code.splitlines(True), self.encoding)
+ picker.visit(tree)
+ self.annotations = picker.annotations
+ self.comments = picker.comments
+ self.deforders = picker.deforders
+ self.finals = picker.finals
+ self.overloads = picker.overloads
+
+ def parse_definition(self) -> None:
+ """Parse the location of definitions from the code."""
+ parser = DefinitionFinder(self.code.splitlines(True))
+ parser.parse()
+ self.definitions = parser.definitions
diff --git a/sphinx/pygments_styles.py b/sphinx/pygments_styles.py
new file mode 100644
index 0000000..f0bc605
--- /dev/null
+++ b/sphinx/pygments_styles.py
@@ -0,0 +1,96 @@
+"""Sphinx theme specific highlighting styles."""
+
+from pygments.style import Style
+from pygments.styles.friendly import FriendlyStyle
+from pygments.token import (
+ Comment,
+ Error,
+ Generic,
+ Keyword,
+ Name,
+ Number,
+ Operator,
+ String,
+ Whitespace,
+)
+
+
+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/registry.py b/sphinx/registry.py
new file mode 100644
index 0000000..501661d
--- /dev/null
+++ b/sphinx/registry.py
@@ -0,0 +1,517 @@
+"""Sphinx component registry."""
+
+from __future__ import annotations
+
+import sys
+import traceback
+from importlib import import_module
+from types import MethodType
+from typing import TYPE_CHECKING, Any, Callable
+
+if sys.version_info >= (3, 10):
+ from importlib.metadata import entry_points
+else:
+ from importlib_metadata import entry_points
+
+from sphinx.domains import Domain, Index, ObjType
+from sphinx.domains.std import GenericObject, Target
+from sphinx.errors import ExtensionError, SphinxError, VersionRequirementError
+from sphinx.extension import Extension
+from sphinx.io import create_publisher
+from sphinx.locale import __
+from sphinx.parsers import Parser as SphinxParser
+from sphinx.roles import XRefRole
+from sphinx.util import logging
+from sphinx.util.logging import prefixed_warnings
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator, Sequence
+
+ from docutils import nodes
+ from docutils.core import Publisher
+ from docutils.nodes import Element, Node, TextElement
+ from docutils.parsers import Parser
+ from docutils.parsers.rst import Directive
+ from docutils.transforms import Transform
+
+ from sphinx.application import Sphinx
+ from sphinx.builders import Builder
+ from sphinx.config import Config
+ from sphinx.environment import BuildEnvironment
+ from sphinx.ext.autodoc import Documenter
+ from sphinx.util.typing import RoleFunction, TitleGetter
+
+logger = logging.getLogger(__name__)
+
+# list of deprecated extensions. Keys are extension name.
+# Values are Sphinx version that merge the extension.
+EXTENSION_BLACKLIST = {
+ "sphinxjp.themecore": "1.2",
+}
+
+
+class SphinxComponentRegistry:
+ def __init__(self) -> None:
+ #: special attrgetter for autodoc; class object -> attrgetter
+ self.autodoc_attrgettrs: dict[type, Callable[[Any, str, Any], Any]] = {}
+
+ #: builders; a dict of builder name -> bulider class
+ self.builders: dict[str, type[Builder]] = {}
+
+ #: autodoc documenters; a dict of documenter name -> documenter class
+ self.documenters: dict[str, type[Documenter]] = {}
+
+ #: css_files; a list of tuple of filename and attributes
+ self.css_files: list[tuple[str, dict[str, Any]]] = []
+
+ #: domains; a dict of domain name -> domain class
+ self.domains: dict[str, type[Domain]] = {}
+
+ #: additional directives for domains
+ #: a dict of domain name -> dict of directive name -> directive
+ self.domain_directives: dict[str, dict[str, type[Directive]]] = {}
+
+ #: additional indices for domains
+ #: a dict of domain name -> list of index class
+ self.domain_indices: dict[str, list[type[Index]]] = {}
+
+ #: additional object types for domains
+ #: a dict of domain name -> dict of objtype name -> objtype
+ self.domain_object_types: dict[str, dict[str, ObjType]] = {}
+
+ #: additional roles for domains
+ #: a dict of domain name -> dict of role name -> role impl.
+ self.domain_roles: dict[str, dict[str, RoleFunction | XRefRole]] = {}
+
+ #: additional enumerable nodes
+ #: a dict of node class -> tuple of figtype and title_getter function
+ self.enumerable_nodes: dict[type[Node], tuple[str, TitleGetter | None]] = {}
+
+ #: HTML inline and block math renderers
+ #: a dict of name -> tuple of visit function and depart function
+ self.html_inline_math_renderers: dict[str,
+ tuple[Callable, Callable | None]] = {}
+ self.html_block_math_renderers: dict[str,
+ tuple[Callable, Callable | None]] = {}
+
+ #: HTML assets
+ self.html_assets_policy: str = 'per_page'
+
+ #: HTML themes
+ self.html_themes: dict[str, str] = {}
+
+ #: js_files; list of JS paths or URLs
+ self.js_files: list[tuple[str | None, dict[str, Any]]] = []
+
+ #: LaTeX packages; list of package names and its options
+ self.latex_packages: list[tuple[str, str | None]] = []
+
+ self.latex_packages_after_hyperref: list[tuple[str, str | None]] = []
+
+ #: post transforms; list of transforms
+ self.post_transforms: list[type[Transform]] = []
+
+ #: source paresrs; file type -> parser class
+ self.source_parsers: dict[str, type[Parser]] = {}
+
+ #: source suffix: suffix -> file type
+ self.source_suffix: dict[str, str] = {}
+
+ #: custom translators; builder name -> translator class
+ self.translators: dict[str, type[nodes.NodeVisitor]] = {}
+
+ #: custom handlers for translators
+ #: a dict of builder name -> dict of node name -> visitor and departure functions
+ self.translation_handlers: dict[str, dict[str, tuple[Callable, Callable | None]]] = {}
+
+ #: additional transforms; list of transforms
+ self.transforms: list[type[Transform]] = []
+
+ # private cache of Docutils Publishers (file type -> publisher object)
+ self.publishers: dict[str, Publisher] = {}
+
+ def add_builder(self, builder: type[Builder], override: bool = False) -> None:
+ logger.debug('[app] adding builder: %r', builder)
+ if not hasattr(builder, 'name'):
+ raise ExtensionError(__('Builder class %s has no "name" attribute') % builder)
+ if builder.name in self.builders and not override:
+ raise ExtensionError(__('Builder %r already exists (in module %s)') %
+ (builder.name, self.builders[builder.name].__module__))
+ self.builders[builder.name] = builder
+
+ def preload_builder(self, app: Sphinx, name: str) -> None:
+ if name is None:
+ return
+
+ if name not in self.builders:
+ builder_entry_points = entry_points(group='sphinx.builders')
+ try:
+ entry_point = builder_entry_points[name]
+ except KeyError as exc:
+ raise SphinxError(__('Builder name %s not registered or available'
+ ' through entry point') % name) from exc
+
+ self.load_extension(app, entry_point.module)
+
+ def create_builder(self, app: Sphinx, name: str, env: BuildEnvironment) -> Builder:
+ if name not in self.builders:
+ raise SphinxError(__('Builder name %s not registered') % name)
+
+ return self.builders[name](app, env)
+
+ def add_domain(self, domain: type[Domain], override: bool = False) -> None:
+ logger.debug('[app] adding domain: %r', domain)
+ if domain.name in self.domains and not override:
+ raise ExtensionError(__('domain %s already registered') % domain.name)
+ self.domains[domain.name] = domain
+
+ def has_domain(self, domain: str) -> bool:
+ return domain in self.domains
+
+ def create_domains(self, env: BuildEnvironment) -> Iterator[Domain]:
+ for DomainClass in self.domains.values():
+ domain = DomainClass(env)
+
+ # transplant components added by extensions
+ domain.directives.update(self.domain_directives.get(domain.name, {}))
+ domain.roles.update(self.domain_roles.get(domain.name, {}))
+ domain.indices.extend(self.domain_indices.get(domain.name, []))
+ for name, objtype in self.domain_object_types.get(domain.name, {}).items():
+ domain.add_object_type(name, objtype)
+
+ yield domain
+
+ def add_directive_to_domain(self, domain: str, name: str,
+ cls: type[Directive], override: bool = False) -> None:
+ logger.debug('[app] adding directive to domain: %r', (domain, name, cls))
+ if domain not in self.domains:
+ raise ExtensionError(__('domain %s not yet registered') % domain)
+
+ directives: dict[str, type[Directive]] = self.domain_directives.setdefault(domain, {})
+ if name in directives and not override:
+ raise ExtensionError(__('The %r directive is already registered to domain %s') %
+ (name, domain))
+ directives[name] = cls
+
+ def add_role_to_domain(self, domain: str, name: str,
+ role: RoleFunction | XRefRole, override: bool = False,
+ ) -> None:
+ logger.debug('[app] adding role to domain: %r', (domain, name, role))
+ if domain not in self.domains:
+ raise ExtensionError(__('domain %s not yet registered') % domain)
+ roles = self.domain_roles.setdefault(domain, {})
+ if name in roles and not override:
+ raise ExtensionError(__('The %r role is already registered to domain %s') %
+ (name, domain))
+ roles[name] = role
+
+ def add_index_to_domain(self, domain: str, index: type[Index],
+ override: bool = False) -> None:
+ logger.debug('[app] adding index to domain: %r', (domain, index))
+ if domain not in self.domains:
+ raise ExtensionError(__('domain %s not yet registered') % domain)
+ indices = self.domain_indices.setdefault(domain, [])
+ if index in indices and not override:
+ raise ExtensionError(__('The %r index is already registered to domain %s') %
+ (index.name, domain))
+ indices.append(index)
+
+ def add_object_type(
+ self,
+ directivename: str,
+ rolename: str,
+ indextemplate: str = '',
+ parse_node: Callable | None = None,
+ ref_nodeclass: type[TextElement] | None = None,
+ objname: str = '',
+ doc_field_types: Sequence = (),
+ override: bool = False,
+ ) -> None:
+ logger.debug('[app] adding object type: %r',
+ (directivename, rolename, indextemplate, parse_node,
+ ref_nodeclass, objname, doc_field_types))
+
+ # create a subclass of GenericObject as the new directive
+ directive = type(directivename,
+ (GenericObject, object),
+ {'indextemplate': indextemplate,
+ 'parse_node': parse_node and staticmethod(parse_node),
+ 'doc_field_types': doc_field_types})
+
+ self.add_directive_to_domain('std', directivename, directive)
+ self.add_role_to_domain('std', rolename, XRefRole(innernodeclass=ref_nodeclass))
+
+ object_types = self.domain_object_types.setdefault('std', {})
+ if directivename in object_types and not override:
+ raise ExtensionError(__('The %r object_type is already registered') %
+ directivename)
+ object_types[directivename] = ObjType(objname or directivename, rolename)
+
+ def add_crossref_type(
+ self,
+ directivename: str,
+ rolename: str,
+ indextemplate: str = '',
+ ref_nodeclass: type[TextElement] | None = None,
+ objname: str = '',
+ override: bool = False,
+ ) -> None:
+ logger.debug('[app] adding crossref type: %r',
+ (directivename, rolename, indextemplate, ref_nodeclass, objname))
+
+ # create a subclass of Target as the new directive
+ directive = type(directivename,
+ (Target, object),
+ {'indextemplate': indextemplate})
+
+ self.add_directive_to_domain('std', directivename, directive)
+ self.add_role_to_domain('std', rolename, XRefRole(innernodeclass=ref_nodeclass))
+
+ object_types = self.domain_object_types.setdefault('std', {})
+ if directivename in object_types and not override:
+ raise ExtensionError(__('The %r crossref_type is already registered') %
+ directivename)
+ object_types[directivename] = ObjType(objname or directivename, rolename)
+
+ def add_source_suffix(self, suffix: str, filetype: str, override: bool = False) -> None:
+ logger.debug('[app] adding source_suffix: %r, %r', suffix, filetype)
+ if suffix in self.source_suffix and not override:
+ raise ExtensionError(__('source_suffix %r is already registered') % suffix)
+ self.source_suffix[suffix] = filetype
+
+ def add_source_parser(self, parser: type[Parser], override: bool = False) -> None:
+ logger.debug('[app] adding search source_parser: %r', parser)
+
+ # create a map from filetype to parser
+ for filetype in parser.supported:
+ if filetype in self.source_parsers and not override:
+ raise ExtensionError(__('source_parser for %r is already registered') %
+ filetype)
+ self.source_parsers[filetype] = parser
+
+ def get_source_parser(self, filetype: str) -> type[Parser]:
+ try:
+ return self.source_parsers[filetype]
+ except KeyError as exc:
+ raise SphinxError(__('Source parser for %s not registered') % filetype) from exc
+
+ def get_source_parsers(self) -> dict[str, type[Parser]]:
+ return self.source_parsers
+
+ def create_source_parser(self, app: Sphinx, filename: str) -> Parser:
+ parser_class = self.get_source_parser(filename)
+ parser = parser_class()
+ if isinstance(parser, SphinxParser):
+ parser.set_application(app)
+ return parser
+
+ def add_translator(self, name: str, translator: type[nodes.NodeVisitor],
+ override: bool = False) -> None:
+ logger.debug('[app] Change of translator for the %s builder.', name)
+ if name in self.translators and not override:
+ raise ExtensionError(__('Translator for %r already exists') % name)
+ self.translators[name] = translator
+
+ def add_translation_handlers(
+ self,
+ node: type[Element],
+ **kwargs: tuple[Callable, Callable | None],
+ ) -> None:
+ logger.debug('[app] adding translation_handlers: %r, %r', node, kwargs)
+ for builder_name, handlers in kwargs.items():
+ translation_handlers = self.translation_handlers.setdefault(builder_name, {})
+ try:
+ visit, depart = handlers # unpack once for assertion
+ translation_handlers[node.__name__] = (visit, depart)
+ except ValueError as exc:
+ raise ExtensionError(
+ __('kwargs for add_node() must be a (visit, depart) '
+ 'function tuple: %r=%r') % (builder_name, handlers),
+ ) from exc
+
+ def get_translator_class(self, builder: Builder) -> type[nodes.NodeVisitor]:
+ try:
+ return self.translators[builder.name]
+ except KeyError:
+ try:
+ return builder.default_translator_class
+ except AttributeError as err:
+ msg = f'translator not found for {builder.name}'
+ raise AttributeError(msg) from err
+
+ def create_translator(self, builder: Builder, *args: Any) -> nodes.NodeVisitor:
+ translator_class = self.get_translator_class(builder)
+ translator = translator_class(*args)
+
+ # transplant handlers for custom nodes to translator instance
+ handlers = self.translation_handlers.get(builder.name, None)
+ if handlers is None:
+ # retry with builder.format
+ handlers = self.translation_handlers.get(builder.format, {})
+
+ for name, (visit, depart) in handlers.items():
+ setattr(translator, 'visit_' + name, MethodType(visit, translator))
+ if depart:
+ setattr(translator, 'depart_' + name, MethodType(depart, translator))
+
+ return translator
+
+ def add_transform(self, transform: type[Transform]) -> None:
+ logger.debug('[app] adding transform: %r', transform)
+ self.transforms.append(transform)
+
+ def get_transforms(self) -> list[type[Transform]]:
+ return self.transforms
+
+ def add_post_transform(self, transform: type[Transform]) -> None:
+ logger.debug('[app] adding post transform: %r', transform)
+ self.post_transforms.append(transform)
+
+ def get_post_transforms(self) -> list[type[Transform]]:
+ return self.post_transforms
+
+ def add_documenter(self, objtype: str, documenter: type[Documenter]) -> None:
+ self.documenters[objtype] = documenter
+
+ def add_autodoc_attrgetter(self, typ: type,
+ attrgetter: Callable[[Any, str, Any], Any]) -> None:
+ self.autodoc_attrgettrs[typ] = attrgetter
+
+ def add_css_files(self, filename: str, **attributes: Any) -> None:
+ self.css_files.append((filename, attributes))
+
+ def add_js_file(self, filename: str | None, **attributes: Any) -> None:
+ logger.debug('[app] adding js_file: %r, %r', filename, attributes)
+ self.js_files.append((filename, attributes))
+
+ def has_latex_package(self, name: str) -> bool:
+ packages = self.latex_packages + self.latex_packages_after_hyperref
+ return bool([x for x in packages if x[0] == name])
+
+ def add_latex_package(
+ self, name: str, options: str | None, after_hyperref: bool = False,
+ ) -> None:
+ if self.has_latex_package(name):
+ logger.warning("latex package '%s' already included", name)
+
+ logger.debug('[app] adding latex package: %r', name)
+ if after_hyperref:
+ self.latex_packages_after_hyperref.append((name, options))
+ else:
+ self.latex_packages.append((name, options))
+
+ def add_enumerable_node(
+ self,
+ node: type[Node],
+ figtype: str,
+ title_getter: TitleGetter | None = None, override: bool = False,
+ ) -> None:
+ logger.debug('[app] adding enumerable node: (%r, %r, %r)', node, figtype, title_getter)
+ if node in self.enumerable_nodes and not override:
+ raise ExtensionError(__('enumerable_node %r already registered') % node)
+ self.enumerable_nodes[node] = (figtype, title_getter)
+
+ def add_html_math_renderer(
+ self,
+ name: str,
+ inline_renderers: tuple[Callable, Callable | None] | None,
+ block_renderers: tuple[Callable, Callable | None] | None,
+ ) -> None:
+ logger.debug('[app] adding html_math_renderer: %s, %r, %r',
+ name, inline_renderers, block_renderers)
+ if name in self.html_inline_math_renderers:
+ raise ExtensionError(__('math renderer %s is already registered') % name)
+
+ if inline_renderers is not None:
+ self.html_inline_math_renderers[name] = inline_renderers
+ if block_renderers is not None:
+ self.html_block_math_renderers[name] = block_renderers
+
+ def add_html_theme(self, name: str, theme_path: str) -> None:
+ self.html_themes[name] = theme_path
+
+ def load_extension(self, app: Sphinx, extname: str) -> None:
+ """Load a Sphinx extension."""
+ if extname in app.extensions: # already loaded
+ return
+ if extname in EXTENSION_BLACKLIST:
+ logger.warning(__('the extension %r was already merged with Sphinx since '
+ 'version %s; this extension is ignored.'),
+ extname, EXTENSION_BLACKLIST[extname])
+ return
+
+ # update loading context
+ prefix = __('while setting up extension %s:') % extname
+ with prefixed_warnings(prefix):
+ try:
+ mod = import_module(extname)
+ except ImportError as err:
+ logger.verbose(__('Original exception:\n') + traceback.format_exc())
+ raise ExtensionError(__('Could not import extension %s') % extname,
+ err) from err
+
+ setup = getattr(mod, 'setup', None)
+ if setup is None:
+ logger.warning(__('extension %r has no setup() function; is it really '
+ 'a Sphinx extension module?'), extname)
+ metadata: dict[str, Any] = {}
+ else:
+ try:
+ metadata = setup(app)
+ except VersionRequirementError as err:
+ # add the extension name to the version required
+ raise VersionRequirementError(
+ __('The %s extension used by this project needs at least '
+ 'Sphinx v%s; it therefore cannot be built with this '
+ 'version.') % (extname, err),
+ ) from err
+
+ if metadata is None:
+ metadata = {}
+ elif not isinstance(metadata, dict):
+ logger.warning(__('extension %r returned an unsupported object from '
+ 'its setup() function; it should return None or a '
+ 'metadata dictionary'), extname)
+ metadata = {}
+
+ app.extensions[extname] = Extension(extname, mod, **metadata)
+
+ def get_envversion(self, app: Sphinx) -> dict[str, str]:
+ from sphinx.environment import ENV_VERSION
+ envversion = {ext.name: ext.metadata['env_version'] for ext in app.extensions.values()
+ if ext.metadata.get('env_version')}
+ envversion['sphinx'] = ENV_VERSION
+ return envversion
+
+ def get_publisher(self, app: Sphinx, filetype: str) -> Publisher:
+ try:
+ return self.publishers[filetype]
+ except KeyError:
+ pass
+ publisher = create_publisher(app, filetype)
+ self.publishers[filetype] = publisher
+ return publisher
+
+
+def merge_source_suffix(app: Sphinx, config: Config) -> None:
+ """Merge any user-specified source_suffix with any added by extensions."""
+ for suffix, filetype in app.registry.source_suffix.items():
+ if suffix not in app.config.source_suffix: # NoQA: SIM114
+ app.config.source_suffix[suffix] = filetype
+ elif app.config.source_suffix[suffix] is None:
+ # filetype is not specified (default filetype).
+ # So it overrides default filetype by extensions setting.
+ app.config.source_suffix[suffix] = filetype
+
+ # copy config.source_suffix to registry
+ app.registry.source_suffix = app.config.source_suffix
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.connect('config-inited', merge_source_suffix, priority=800)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/roles.py b/sphinx/roles.py
new file mode 100644
index 0000000..d734429
--- /dev/null
+++ b/sphinx/roles.py
@@ -0,0 +1,433 @@
+"""Handlers for additional ReST roles."""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any
+
+import docutils.parsers.rst.directives
+import docutils.parsers.rst.roles
+import docutils.parsers.rst.states
+from docutils import nodes, utils
+
+from sphinx import addnodes
+from sphinx.locale import _, __
+from sphinx.util import ws_re
+from sphinx.util.docutils import ReferenceRole, SphinxRole
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from docutils.nodes import Element, Node, TextElement, system_message
+
+ from sphinx.application import Sphinx
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import RoleFunction
+
+
+generic_docroles = {
+ 'command': addnodes.literal_strong,
+ 'dfn': nodes.emphasis,
+ 'kbd': nodes.literal,
+ 'mailheader': addnodes.literal_emphasis,
+ 'makevar': addnodes.literal_strong,
+ 'manpage': addnodes.manpage,
+ 'mimetype': addnodes.literal_emphasis,
+ 'newsgroup': addnodes.literal_emphasis,
+ 'program': addnodes.literal_strong, # XXX should be an x-ref
+ 'regexp': nodes.literal,
+}
+
+
+# -- generic cross-reference role ----------------------------------------------
+
+class XRefRole(ReferenceRole):
+ """
+ A generic cross-referencing role. To create a callable that can be used as
+ a role function, create an instance of this class.
+
+ The general features of this role are:
+
+ * Automatic creation of a reference and a content node.
+ * Optional separation of title and target with `title <target>`.
+ * The implementation is a class rather than a function to make
+ customization easier.
+
+ Customization can be done in two ways:
+
+ * Supplying constructor parameters:
+ * `fix_parens` to normalize parentheses (strip from target, and add to
+ title if configured)
+ * `lowercase` to lowercase the target
+ * `nodeclass` and `innernodeclass` select the node classes for
+ the reference and the content node
+
+ * Subclassing and overwriting `process_link()` and/or `result_nodes()`.
+ """
+
+ nodeclass: type[Element] = addnodes.pending_xref
+ innernodeclass: type[TextElement] = nodes.literal
+
+ def __init__(self, fix_parens: bool = False, lowercase: bool = False,
+ nodeclass: type[Element] | None = None,
+ innernodeclass: type[TextElement] | None = None,
+ warn_dangling: bool = False) -> None:
+ self.fix_parens = fix_parens
+ self.lowercase = lowercase
+ self.warn_dangling = warn_dangling
+ if nodeclass is not None:
+ self.nodeclass = nodeclass
+ if innernodeclass is not None:
+ self.innernodeclass = innernodeclass
+
+ super().__init__()
+
+ def update_title_and_target(self, title: str, target: str) -> tuple[str, str]:
+ if not self.has_explicit_title:
+ if title.endswith('()'):
+ # remove parentheses
+ title = title[:-2]
+ if self.config.add_function_parentheses:
+ # add them back to all occurrences if configured
+ title += '()'
+ # remove parentheses from the target too
+ if target.endswith('()'):
+ target = target[:-2]
+ return title, target
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ if ':' not in self.name:
+ self.refdomain, self.reftype = '', self.name
+ self.classes = ['xref', self.reftype]
+ else:
+ self.refdomain, self.reftype = self.name.split(':', 1)
+ self.classes = ['xref', self.refdomain, f'{self.refdomain}-{self.reftype}']
+
+ if self.disabled:
+ return self.create_non_xref_node()
+ else:
+ return self.create_xref_node()
+
+ def create_non_xref_node(self) -> tuple[list[Node], list[system_message]]:
+ text = utils.unescape(self.text[1:])
+ if self.fix_parens:
+ self.has_explicit_title = False # treat as implicit
+ text, target = self.update_title_and_target(text, "")
+
+ node = self.innernodeclass(self.rawtext, text, classes=self.classes)
+ return self.result_nodes(self.inliner.document, self.env, node, is_ref=False)
+
+ def create_xref_node(self) -> tuple[list[Node], list[system_message]]:
+ target = self.target
+ title = self.title
+ if self.lowercase:
+ target = target.lower()
+ if self.fix_parens:
+ title, target = self.update_title_and_target(title, target)
+
+ # create the reference node
+ options = {'refdoc': self.env.docname,
+ 'refdomain': self.refdomain,
+ 'reftype': self.reftype,
+ 'refexplicit': self.has_explicit_title,
+ 'refwarn': self.warn_dangling}
+ refnode = self.nodeclass(self.rawtext, **options)
+ self.set_source_info(refnode)
+
+ # determine the target and title for the class
+ title, target = self.process_link(self.env, refnode, self.has_explicit_title,
+ title, target)
+ refnode['reftarget'] = target
+ refnode += self.innernodeclass(self.rawtext, title, classes=self.classes)
+
+ return self.result_nodes(self.inliner.document, self.env, refnode, is_ref=True)
+
+ # methods that can be overwritten
+
+ def process_link(self, env: BuildEnvironment, refnode: Element, has_explicit_title: bool,
+ title: str, target: str) -> tuple[str, str]:
+ """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: nodes.document, env: BuildEnvironment, node: Element,
+ is_ref: bool) -> tuple[list[Node], list[system_message]]:
+ """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).
+ """
+ return [node], []
+
+
+class AnyXRefRole(XRefRole):
+ def process_link(self, env: BuildEnvironment, refnode: Element, has_explicit_title: bool,
+ title: str, target: str) -> tuple[str, str]:
+ result = super().process_link(env, refnode, has_explicit_title, title, target)
+ # add all possible context info (i.e. std:program, py:module etc.)
+ refnode.attributes.update(env.ref_context)
+ return result
+
+
+class PEP(ReferenceRole):
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ target_id = 'index-%s' % self.env.new_serialno('index')
+ entries = [('single', _('Python Enhancement Proposals; PEP %s') % self.target,
+ target_id, '', None)]
+
+ index = addnodes.index(entries=entries)
+ target = nodes.target('', '', ids=[target_id])
+ self.inliner.document.note_explicit_target(target)
+
+ try:
+ refuri = self.build_uri()
+ reference = nodes.reference('', '', internal=False, refuri=refuri, classes=['pep'])
+ if self.has_explicit_title:
+ reference += nodes.strong(self.title, self.title)
+ else:
+ title = "PEP " + self.title
+ reference += nodes.strong(title, title)
+ except ValueError:
+ msg = self.inliner.reporter.error(__('invalid PEP number %s') % self.target,
+ line=self.lineno)
+ prb = self.inliner.problematic(self.rawtext, self.rawtext, msg)
+ return [prb], [msg]
+
+ return [index, target, reference], []
+
+ def build_uri(self) -> str:
+ base_url = self.inliner.document.settings.pep_base_url
+ ret = self.target.split('#', 1)
+ if len(ret) == 2:
+ return base_url + 'pep-%04d/#%s' % (int(ret[0]), ret[1])
+ else:
+ return base_url + 'pep-%04d/' % int(ret[0])
+
+
+class RFC(ReferenceRole):
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ target_id = 'index-%s' % self.env.new_serialno('index')
+ entries = [('single', 'RFC; RFC %s' % self.target, target_id, '', None)]
+
+ index = addnodes.index(entries=entries)
+ target = nodes.target('', '', ids=[target_id])
+ self.inliner.document.note_explicit_target(target)
+
+ try:
+ refuri = self.build_uri()
+ reference = nodes.reference('', '', internal=False, refuri=refuri, classes=['rfc'])
+ if self.has_explicit_title:
+ reference += nodes.strong(self.title, self.title)
+ else:
+ title = "RFC " + self.title
+ reference += nodes.strong(title, title)
+ except ValueError:
+ msg = self.inliner.reporter.error(__('invalid RFC number %s') % self.target,
+ line=self.lineno)
+ prb = self.inliner.problematic(self.rawtext, self.rawtext, msg)
+ return [prb], [msg]
+
+ return [index, target, reference], []
+
+ def build_uri(self) -> str:
+ base_url = self.inliner.document.settings.rfc_base_url
+ ret = self.target.split('#', 1)
+ if len(ret) == 2:
+ return base_url + self.inliner.rfc_url % int(ret[0]) + '#' + ret[1]
+ else:
+ return base_url + self.inliner.rfc_url % int(ret[0])
+
+
+_amp_re = re.compile(r'(?<!&)&(?![&\s])')
+
+
+class GUILabel(SphinxRole):
+ amp_re = re.compile(r'(?<!&)&(?![&\s])')
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ node = nodes.inline(rawtext=self.rawtext, classes=[self.name])
+ spans = self.amp_re.split(self.text)
+ node += nodes.Text(spans.pop(0))
+ for span in spans:
+ span = span.replace('&&', '&')
+
+ letter = nodes.Text(span[0])
+ accelerator = nodes.inline('', '', letter, classes=['accelerator'])
+ node += accelerator
+ node += nodes.Text(span[1:])
+
+ return [node], []
+
+
+class MenuSelection(GUILabel):
+ BULLET_CHARACTER = '\N{TRIANGULAR BULLET}'
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ self.text = self.text.replace('-->', self.BULLET_CHARACTER)
+ return super().run()
+
+
+_litvar_re = re.compile('{([^}]+)}')
+parens_re = re.compile(r'(\\*{|\\*})')
+
+
+class EmphasizedLiteral(SphinxRole):
+ parens_re = re.compile(r'(\\\\|\\{|\\}|{|})')
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ children = self.parse(self.text)
+ node = nodes.literal(self.rawtext, '', *children,
+ role=self.name.lower(), classes=[self.name])
+
+ return [node], []
+
+ def parse(self, text: str) -> list[Node]:
+ result: list[Node] = []
+
+ stack = ['']
+ for part in self.parens_re.split(text):
+ if part == '\\\\': # escaped backslash
+ stack[-1] += '\\'
+ elif part == '{':
+ if len(stack) >= 2 and stack[-2] == "{": # nested
+ stack[-1] += "{"
+ else:
+ # start emphasis
+ stack.append('{')
+ stack.append('')
+ elif part == '}':
+ if len(stack) == 3 and stack[1] == "{" and len(stack[2]) > 0:
+ # emphasized word found
+ if stack[0]:
+ result.append(nodes.Text(stack[0]))
+ result.append(nodes.emphasis(stack[2], stack[2]))
+ stack = ['']
+ else:
+ # emphasized word not found; the rparen is not a special symbol
+ stack.append('}')
+ stack = [''.join(stack)]
+ elif part == '\\{': # escaped left-brace
+ stack[-1] += '{'
+ elif part == '\\}': # escaped right-brace
+ stack[-1] += '}'
+ else: # others (containing escaped braces)
+ stack[-1] += part
+
+ if ''.join(stack):
+ # remaining is treated as Text
+ text = ''.join(stack)
+ result.append(nodes.Text(text))
+
+ return result
+
+
+_abbr_re = re.compile(r'\((.*)\)$', re.S)
+
+
+class Abbreviation(SphinxRole):
+ abbr_re = re.compile(r'\((.*)\)$', re.S)
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ options = self.options.copy()
+ matched = self.abbr_re.search(self.text)
+ if matched:
+ text = self.text[:matched.start()].strip()
+ options['explanation'] = matched.group(1)
+ else:
+ text = self.text
+
+ return [nodes.abbreviation(self.rawtext, text, **options)], []
+
+
+# Sphinx provides the `code-block` directive for highlighting code blocks.
+# Docutils provides the `code` role which in theory can be used similarly by
+# defining a custom role for a given programming language:
+#
+# .. .. role:: python(code)
+# :language: python
+# :class: highlight
+#
+# In practice this does not produce correct highlighting because it uses a
+# separate highlighting mechanism that results in the "long" pygments class
+# names rather than "short" pygments class names produced by the Sphinx
+# `code-block` directive and for which this extension contains CSS rules.
+#
+# In addition, even if that issue is fixed, because the highlighting
+# implementation in docutils, despite being based on pygments, differs from that
+# used by Sphinx, the output does not exactly match that produced by the Sphinx
+# `code-block` directive.
+#
+# This issue is noted here: //github.com/sphinx-doc/sphinx/issues/5157
+#
+# This overrides the docutils `code` role to perform highlighting in the same
+# way as the Sphinx `code-block` directive.
+#
+# TODO: Change to use `SphinxRole` once SphinxRole is fixed to support options.
+def code_role(name: str, rawtext: str, text: str, lineno: int,
+ inliner: docutils.parsers.rst.states.Inliner,
+ options: dict | None = None, content: Sequence[str] = (),
+ ) -> tuple[list[Node], list[system_message]]:
+ if options is None:
+ options = {}
+ options = options.copy()
+ docutils.parsers.rst.roles.set_classes(options)
+ language = options.get('language', '')
+ classes = ['code']
+ if language:
+ classes.append('highlight')
+ if 'classes' in options:
+ classes.extend(options['classes'])
+
+ if language and language not in classes:
+ classes.append(language)
+
+ node = nodes.literal(rawtext, text, classes=classes, language=language)
+
+ return [node], []
+
+
+code_role.options = { # type: ignore[attr-defined]
+ 'class': docutils.parsers.rst.directives.class_option,
+ 'language': docutils.parsers.rst.directives.unchanged,
+}
+
+
+specific_docroles: dict[str, RoleFunction] = {
+ # links to download references
+ 'download': XRefRole(nodeclass=addnodes.download_reference),
+ # links to anything
+ 'any': AnyXRefRole(warn_dangling=True),
+
+ 'pep': PEP(),
+ 'rfc': RFC(),
+ 'guilabel': GUILabel(),
+ 'menuselection': MenuSelection(),
+ 'file': EmphasizedLiteral(),
+ 'samp': EmphasizedLiteral(),
+ 'abbr': Abbreviation(),
+}
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ from docutils.parsers.rst import roles
+
+ for rolename, nodeclass in generic_docroles.items():
+ generic = roles.GenericRole(rolename, nodeclass)
+ role = roles.CustomRole(rolename, generic, {'classes': [rolename]})
+ roles.register_local_role(rolename, role)
+
+ for rolename, func in specific_docroles.items():
+ roles.register_local_role(rolename, func)
+
+ # Since docutils registers it as a canonical role, override it as a
+ # canonical role as well.
+ roles.register_canonical_role('code', code_role)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/search/__init__.py b/sphinx/search/__init__.py
new file mode 100644
index 0000000..21758d3
--- /dev/null
+++ b/sphinx/search/__init__.py
@@ -0,0 +1,556 @@
+"""Create a full-text search index for offline search."""
+from __future__ import annotations
+
+import dataclasses
+import functools
+import html
+import json
+import pickle
+import re
+from importlib import import_module
+from os import path
+from typing import IO, TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.nodes import Element, Node
+
+from sphinx import addnodes, package_dir
+from sphinx.environment import BuildEnvironment
+from sphinx.util.index_entries import split_index_msg
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+
+
+class SearchLanguage:
+ """
+ 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_splitter_code
+
+ Return splitter function of JavaScript version. The function should be
+ named as ``splitQuery``. And it should take a string and return list of
+ strings.
+
+ .. versionadded:: 3.0
+
+ .. 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: str | None = None
+ language_name: str | None = None
+ stopwords: set[str] = set()
+ js_splitter_code: str = ""
+ js_stemmer_rawcode: str | None = None
+ 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+')
+
+ def __init__(self, options: dict) -> None:
+ self.options = options
+ self.init(options)
+
+ def init(self, options: dict) -> None:
+ """
+ Initialize the class with the options the user has given.
+ """
+
+ def split(self, input: str) -> list[str]:
+ """
+ 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: str) -> str:
+ """
+ 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: str) -> bool:
+ """
+ Return true if the target word should be registered in the search index.
+ This method is called after stemming.
+ """
+ return (
+ len(word) == 0 or not (
+ ((len(word) < 3) and (12353 < ord(word[0]) < 12436)) or
+ (ord(word[0]) < 256 and (
+ word in self.stopwords
+ ))))
+
+
+# SearchEnglish imported after SearchLanguage is defined due to circular import
+from sphinx.search.en import SearchEnglish
+
+
+def parse_stop_word(source: str) -> set[str]:
+ """
+ Parse snowball style word list like this:
+
+ * http://snowball.tartarus.org/algorithms/finnish/stop.txt
+ """
+ result: set[str] = set()
+ for line in source.splitlines():
+ line = line.split('|')[0] # remove comment
+ result.update(line.split())
+ return result
+
+
+# maps language name to module.class or directly a class
+languages: dict[str, str | type[SearchLanguage]] = {
+ 'da': 'sphinx.search.da.SearchDanish',
+ 'de': 'sphinx.search.de.SearchGerman',
+ 'en': SearchEnglish,
+ 'es': 'sphinx.search.es.SearchSpanish',
+ 'fi': 'sphinx.search.fi.SearchFinnish',
+ 'fr': 'sphinx.search.fr.SearchFrench',
+ 'hu': 'sphinx.search.hu.SearchHungarian',
+ 'it': 'sphinx.search.it.SearchItalian',
+ 'ja': 'sphinx.search.ja.SearchJapanese',
+ 'nl': 'sphinx.search.nl.SearchDutch',
+ 'no': 'sphinx.search.no.SearchNorwegian',
+ 'pt': 'sphinx.search.pt.SearchPortuguese',
+ 'ro': 'sphinx.search.ro.SearchRomanian',
+ 'ru': 'sphinx.search.ru.SearchRussian',
+ 'sv': 'sphinx.search.sv.SearchSwedish',
+ 'tr': 'sphinx.search.tr.SearchTurkish',
+ 'zh': 'sphinx.search.zh.SearchChinese',
+}
+
+
+class _JavaScriptIndex:
+ """
+ The search index as JavaScript file that calls a function
+ on the documentation search object to register the index.
+ """
+
+ PREFIX = 'Search.setIndex('
+ SUFFIX = ')'
+
+ def dumps(self, data: Any) -> str:
+ return self.PREFIX + json.dumps(data) + self.SUFFIX
+
+ def loads(self, s: str) -> Any:
+ data = s[len(self.PREFIX):-len(self.SUFFIX)]
+ if not data or not s.startswith(self.PREFIX) or not \
+ s.endswith(self.SUFFIX):
+ raise ValueError('invalid data')
+ return json.loads(data)
+
+ def dump(self, data: Any, f: IO) -> None:
+ f.write(self.dumps(data))
+
+ def load(self, f: IO) -> Any:
+ return self.loads(f.read())
+
+
+js_index = _JavaScriptIndex()
+
+
+def _is_meta_keywords(
+ node: nodes.meta, # type: ignore[name-defined]
+ lang: str | None,
+) -> bool:
+ if node.get('name') == 'keywords':
+ meta_lang = node.get('lang')
+ if meta_lang is None: # lang not specified
+ return True
+ elif meta_lang == lang: # matched to html_search_language
+ return True
+
+ return False
+
+
+@dataclasses.dataclass
+class WordStore:
+ words: list[str] = dataclasses.field(default_factory=list)
+ titles: list[tuple[str, str]] = dataclasses.field(default_factory=list)
+ title_words: list[str] = dataclasses.field(default_factory=list)
+
+
+class WordCollector(nodes.NodeVisitor):
+ """
+ A special visitor that collects words for the `IndexBuilder`.
+ """
+
+ def __init__(self, document: nodes.document, lang: SearchLanguage) -> None:
+ super().__init__(document)
+ self.found_words: list[str] = []
+ self.found_titles: list[tuple[str, str]] = []
+ self.found_title_words: list[str] = []
+ self.lang = lang
+
+ def dispatch_visit(self, node: Node) -> None:
+ if isinstance(node, nodes.comment):
+ raise nodes.SkipNode
+ elif isinstance(node, nodes.raw):
+ if 'html' in node.get('format', '').split():
+ # Some people might put content in raw HTML that should be searched,
+ # so we just amateurishly strip HTML tags and index the remaining
+ # content
+ nodetext = re.sub(r'<style.*?</style>', '', node.astext(), flags=re.IGNORECASE|re.DOTALL)
+ nodetext = re.sub(r'<script.*?</script>', '', nodetext, flags=re.IGNORECASE|re.DOTALL)
+ nodetext = re.sub(r'<[^<]+?>', '', nodetext)
+ self.found_words.extend(self.lang.split(nodetext))
+ raise nodes.SkipNode
+ elif isinstance(node, nodes.Text):
+ self.found_words.extend(self.lang.split(node.astext()))
+ elif isinstance(node, nodes.title):
+ title = node.astext()
+ ids = node.parent['ids']
+ self.found_titles.append((title, ids[0] if ids else None))
+ self.found_title_words.extend(self.lang.split(title))
+ elif isinstance(node, Element) and _is_meta_keywords(node, self.lang.lang):
+ keywords = node['content']
+ keywords = [keyword.strip() for keyword in keywords.split(',')]
+ self.found_words.extend(keywords)
+
+
+class IndexBuilder:
+ """
+ Helper class that creates a search index based on the doctrees
+ passed to the `feed` method.
+ """
+ formats = {
+ 'json': json,
+ 'pickle': pickle
+ }
+
+ def __init__(self, env: BuildEnvironment, lang: str, options: dict, scoring: str) -> None:
+ self.env = env
+ # docname -> title
+ self._titles: dict[str, str] = env._search_index_titles
+ # docname -> filename
+ self._filenames: dict[str, str] = env._search_index_filenames
+ # stemmed words -> set(docname)
+ self._mapping: dict[str, set[str]] = env._search_index_mapping
+ # stemmed words in titles -> set(docname)
+ self._title_mapping: dict[str, set[str]] = env._search_index_title_mapping
+ # docname -> all titles in document
+ self._all_titles: dict[str, list[tuple[str, str]]] = env._search_index_all_titles
+ # docname -> list(index entry)
+ self._index_entries: dict[str, list[tuple[str, str, str]]] = env._search_index_index_entries
+ # objtype -> index
+ self._objtypes: dict[tuple[str, str], int] = env._search_index_objtypes
+ # objtype index -> (domain, type, objname (localized))
+ self._objnames: dict[int, tuple[str, str, str]] = env._search_index_objnames
+ # add language-specific SearchLanguage instance
+ lang_class = languages.get(lang)
+
+ # fallback; try again with language-code
+ if lang_class is None and '_' in lang:
+ lang_class = languages.get(lang.split('_')[0])
+
+ if lang_class is None:
+ self.lang: SearchLanguage = SearchEnglish(options)
+ elif isinstance(lang_class, str):
+ module, classname = lang_class.rsplit('.', 1)
+ lang_class: type[SearchLanguage] = getattr(import_module(module), classname) # type: ignore[no-redef]
+ self.lang = lang_class(options) # type: ignore[operator]
+ else:
+ # it's directly a class (e.g. added by app.add_search_language)
+ self.lang = lang_class(options)
+
+ if scoring:
+ with open(scoring, 'rb') as fp:
+ self.js_scorer_code = fp.read().decode()
+ else:
+ self.js_scorer_code = ''
+ self.js_splitter_code = ""
+
+ def load(self, stream: IO, format: Any) -> None:
+ """Reconstruct from frozen data."""
+ if isinstance(format, str):
+ format = self.formats[format]
+ frozen = format.load(stream)
+ # if an old index is present, we treat it as not existing.
+ if not isinstance(frozen, dict) or \
+ frozen.get('envversion') != self.env.version:
+ raise ValueError('old format')
+ index2fn = frozen['docnames']
+ self._filenames = dict(zip(index2fn, frozen['filenames']))
+ self._titles = dict(zip(index2fn, frozen['titles']))
+ self._all_titles = {}
+
+ for docname in self._titles.keys():
+ self._all_titles[docname] = []
+ for title, doc_tuples in frozen['alltitles'].items():
+ for doc, titleid in doc_tuples:
+ self._all_titles[index2fn[doc]].append((title, titleid))
+
+ def load_terms(mapping: dict[str, Any]) -> dict[str, set[str]]:
+ rv = {}
+ for k, v in mapping.items():
+ if isinstance(v, int):
+ rv[k] = {index2fn[v]}
+ else:
+ rv[k] = {index2fn[i] for i in v}
+ return rv
+
+ self._mapping = load_terms(frozen['terms'])
+ self._title_mapping = load_terms(frozen['titleterms'])
+ # no need to load keywords/objtypes
+
+ def dump(self, stream: IO, format: Any) -> None:
+ """Dump the frozen index to a stream."""
+ if isinstance(format, str):
+ format = self.formats[format]
+ format.dump(self.freeze(), stream)
+
+ def get_objects(self, fn2index: dict[str, int]
+ ) -> dict[str, list[tuple[int, int, int, str, str]]]:
+ rv: dict[str, list[tuple[int, int, int, str, str]]] = {}
+ otypes = self._objtypes
+ onames = self._objnames
+ for domainname, domain in sorted(self.env.domains.items()):
+ for fullname, dispname, type, docname, anchor, prio in \
+ sorted(domain.get_objects()):
+ if docname not in fn2index:
+ continue
+ if prio < 0:
+ continue
+ fullname = html.escape(fullname)
+ dispname = html.escape(dispname)
+ prefix, _, name = dispname.rpartition('.')
+ plist = rv.setdefault(prefix, [])
+ try:
+ typeindex = otypes[domainname, type]
+ except KeyError:
+ typeindex = len(otypes)
+ otypes[domainname, type] = typeindex
+ otype = domain.object_types.get(type)
+ if otype:
+ # use str() to fire translation proxies
+ onames[typeindex] = (domainname, type,
+ str(domain.get_type_name(otype)))
+ else:
+ onames[typeindex] = (domainname, type, type)
+ if anchor == fullname:
+ shortanchor = ''
+ elif anchor == type + '-' + fullname:
+ shortanchor = '-'
+ else:
+ shortanchor = anchor
+ plist.append((fn2index[docname], typeindex, prio, shortanchor, name))
+ return rv
+
+ def get_terms(self, fn2index: dict) -> tuple[dict[str, list[str]], dict[str, list[str]]]:
+ rvs: tuple[dict[str, list[str]], dict[str, list[str]]] = ({}, {})
+ for rv, mapping in zip(rvs, (self._mapping, self._title_mapping)):
+ for k, v in mapping.items():
+ if len(v) == 1:
+ fn, = v
+ if fn in fn2index:
+ rv[k] = fn2index[fn]
+ else:
+ rv[k] = sorted([fn2index[fn] for fn in v if fn in fn2index])
+ return rvs
+
+ def freeze(self) -> dict[str, Any]:
+ """Create a usable data structure for serializing."""
+ docnames, titles = zip(*sorted(self._titles.items()))
+ filenames = [self._filenames.get(docname) for docname in docnames]
+ fn2index = {f: i for (i, f) in enumerate(docnames)}
+ terms, title_terms = self.get_terms(fn2index)
+
+ objects = self.get_objects(fn2index) # populates _objtypes
+ objtypes = {v: k[0] + ':' + k[1] for (k, v) in self._objtypes.items()}
+ objnames = self._objnames
+
+ alltitles: dict[str, list[tuple[int, str]]] = {}
+ for docname, titlelist in self._all_titles.items():
+ for title, titleid in titlelist:
+ alltitles.setdefault(title, []).append((fn2index[docname], titleid))
+
+ index_entries: dict[str, list[tuple[int, str]]] = {}
+ for docname, entries in self._index_entries.items():
+ for entry, entry_id, main_entry in entries:
+ index_entries.setdefault(entry.lower(), []).append((fn2index[docname], entry_id))
+
+ return dict(docnames=docnames, filenames=filenames, titles=titles, terms=terms,
+ objects=objects, objtypes=objtypes, objnames=objnames,
+ titleterms=title_terms, envversion=self.env.version,
+ alltitles=alltitles, indexentries=index_entries)
+
+ def label(self) -> str:
+ return f"{self.lang.language_name} (code: {self.lang.lang})"
+
+ def prune(self, docnames: Iterable[str]) -> None:
+ """Remove data for all docnames not in the list."""
+ new_titles = {}
+ new_alltitles = {}
+ new_filenames = {}
+ for docname in docnames:
+ if docname in self._titles:
+ new_titles[docname] = self._titles[docname]
+ new_alltitles[docname] = self._all_titles[docname]
+ new_filenames[docname] = self._filenames[docname]
+ self._titles = new_titles
+ self._filenames = new_filenames
+ self._all_titles = new_alltitles
+ for wordnames in self._mapping.values():
+ wordnames.intersection_update(docnames)
+ for wordnames in self._title_mapping.values():
+ wordnames.intersection_update(docnames)
+
+ def feed(self, docname: str, filename: str, title: str, doctree: nodes.document) -> None:
+ """Feed a doctree to the index."""
+ self._titles[docname] = title
+ self._filenames[docname] = filename
+
+ word_store = self._word_collector(doctree)
+
+ _filter = self.lang.word_filter
+ _stem = self.lang.stem
+
+ # memoise self.lang.stem
+ @functools.lru_cache(maxsize=None)
+ def stem(word_to_stem: str) -> str:
+ return _stem(word_to_stem).lower()
+
+ self._all_titles[docname] = word_store.titles
+
+ for word in word_store.title_words:
+ # add stemmed and unstemmed as the stemmer must not remove words
+ # from search index.
+ stemmed_word = stem(word)
+ if _filter(stemmed_word):
+ self._title_mapping.setdefault(stemmed_word, set()).add(docname)
+ elif _filter(word):
+ self._title_mapping.setdefault(word, set()).add(docname)
+
+ for word in word_store.words:
+ # add stemmed and unstemmed as the stemmer must not remove words
+ # from search index.
+ stemmed_word = stem(word)
+ if not _filter(stemmed_word) and _filter(word):
+ stemmed_word = word
+ already_indexed = docname in self._title_mapping.get(stemmed_word, ())
+ if _filter(stemmed_word) and not already_indexed:
+ self._mapping.setdefault(stemmed_word, set()).add(docname)
+
+ # find explicit entries within index directives
+ _index_entries: set[tuple[str, str, str]] = set()
+ for node in doctree.findall(addnodes.index):
+ for entry_type, value, target_id, main, _category_key in node['entries']:
+ try:
+ result = split_index_msg(entry_type, value)
+ except ValueError:
+ pass
+ else:
+ target_id = target_id or ''
+ if entry_type in {'see', 'seealso'}:
+ _index_entries.add((result[0], target_id, main))
+ _index_entries |= {(x, target_id, main) for x in result}
+
+ self._index_entries[docname] = sorted(_index_entries)
+
+ def _word_collector(self, doctree: nodes.document) -> WordStore:
+ def _visit_nodes(node):
+ if isinstance(node, nodes.comment):
+ return
+ elif isinstance(node, nodes.raw):
+ if 'html' in node.get('format', '').split():
+ # Some people might put content in raw HTML that should be searched,
+ # so we just amateurishly strip HTML tags and index the remaining
+ # content
+ nodetext = re.sub(r'<style.*?</style>', '', node.astext(),
+ flags=re.IGNORECASE | re.DOTALL)
+ nodetext = re.sub(r'<script.*?</script>', '', nodetext,
+ flags=re.IGNORECASE | re.DOTALL)
+ nodetext = re.sub(r'<[^<]+?>', '', nodetext)
+ word_store.words.extend(split(nodetext))
+ return
+ elif (isinstance(node, nodes.meta) # type: ignore[attr-defined]
+ and _is_meta_keywords(node, language)):
+ keywords = [keyword.strip() for keyword in node['content'].split(',')]
+ word_store.words.extend(keywords)
+ elif isinstance(node, nodes.Text):
+ word_store.words.extend(split(node.astext()))
+ elif isinstance(node, nodes.title):
+ title = node.astext()
+ ids = node.parent['ids']
+ word_store.titles.append((title, ids[0] if ids else None))
+ word_store.title_words.extend(split(title))
+ for child in node.children:
+ _visit_nodes(child)
+ return
+
+ word_store = WordStore()
+ split = self.lang.split
+ language = self.lang.lang
+ _visit_nodes(doctree)
+ return word_store
+
+ def context_for_searchtool(self) -> dict[str, Any]:
+ if self.lang.js_splitter_code:
+ js_splitter_code = self.lang.js_splitter_code
+ else:
+ js_splitter_code = self.js_splitter_code
+
+ return {
+ 'search_language_stemming_code': self.get_js_stemmer_code(),
+ 'search_language_stop_words': json.dumps(sorted(self.lang.stopwords)),
+ 'search_scorer_tool': self.js_scorer_code,
+ 'search_word_splitter_code': js_splitter_code,
+ }
+
+ def get_js_stemmer_rawcodes(self) -> list[str]:
+ """Returns a list of non-minified stemmer JS files to copy."""
+ if self.lang.js_stemmer_rawcode:
+ return [
+ path.join(package_dir, 'search', 'non-minified-js', fname)
+ for fname in ('base-stemmer.js', self.lang.js_stemmer_rawcode)
+ ]
+ else:
+ return []
+
+ def get_js_stemmer_rawcode(self) -> str | None:
+ return None
+
+ def get_js_stemmer_code(self) -> str:
+ """Returns JS code that will be inserted into language_data.js."""
+ if self.lang.js_stemmer_rawcode:
+ js_dir = path.join(package_dir, 'search', 'minified-js')
+ with open(path.join(js_dir, 'base-stemmer.js'), encoding='utf-8') as js_file:
+ base_js = js_file.read()
+ with open(path.join(js_dir, self.lang.js_stemmer_rawcode), encoding='utf-8') as js_file:
+ language_js = js_file.read()
+ return ('%s\n%s\nStemmer = %sStemmer;' %
+ (base_js, language_js, self.lang.language_name))
+ else:
+ return self.lang.js_stemmer_code
diff --git a/sphinx/search/da.py b/sphinx/search/da.py
new file mode 100644
index 0000000..9b5b9f5
--- /dev/null
+++ b/sphinx/search/da.py
@@ -0,0 +1,120 @@
+"""Danish search language: includes the JS Danish stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+danish_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/danish/stop.txt
+og | and
+i | in
+jeg | I
+det | that (dem. pronoun)/it (pers. pronoun)
+at | that (in front of a sentence)/to (with infinitive)
+en | a/an
+den | it (pers. pronoun)/that (dem. pronoun)
+til | to/at/for/until/against/by/of/into, more
+er | present tense of "to be"
+som | who, as
+på | on/upon/in/on/at/to/after/of/with/for, on
+de | they
+med | with/by/in, along
+han | he
+af | of/by/from/off/for/in/with/on, off
+for | at/for/to/from/by/of/ago, in front/before, because
+ikke | not
+der | who/which, there/those
+var | past tense of "to be"
+mig | me/myself
+sig | oneself/himself/herself/itself/themselves
+men | but
+et | a/an/one, one (number), someone/somebody/one
+har | present tense of "to have"
+om | round/about/for/in/a, about/around/down, if
+vi | we
+min | my
+havde | past tense of "to have"
+ham | him
+hun | she
+nu | now
+over | over/above/across/by/beyond/past/on/about, over/past
+da | then, when/as/since
+fra | from/off/since, off, since
+du | you
+ud | out
+sin | his/her/its/one's
+dem | them
+os | us/ourselves
+op | up
+man | you/one
+hans | his
+hvor | where
+eller | or
+hvad | what
+skal | must/shall etc.
+selv | myself/yourself/herself/ourselves etc., even
+her | here
+alle | all/everyone/everybody etc.
+vil | will (verb)
+blev | past tense of "to stay/to remain/to get/to become"
+kunne | could
+ind | in
+når | when
+være | present tense of "to be"
+dog | however/yet/after all
+noget | something
+ville | would
+jo | you know/you see (adv), yes
+deres | their/theirs
+efter | after/behind/according to/for/by/from, later/afterwards
+ned | down
+skulle | should
+denne | this
+end | than
+dette | this
+mit | my/mine
+også | also
+under | under/beneath/below/during, below/underneath
+have | have
+dig | you
+anden | other
+hende | her
+mine | my
+alt | everything
+meget | much/very, plenty of
+sit | his, her, its, one's
+sine | his, her, its, one's
+vor | our
+mod | against
+disse | these
+hvis | if
+din | your/yours
+nogle | some
+hos | by/at
+blive | be/become
+mange | many
+ad | by/through
+bliver | present tense of "to be/to become"
+hendes | her/hers
+været | be
+thi | for (conj)
+jer | you
+sådan | such, like this/like that
+''')
+
+
+class SearchDanish(SearchLanguage):
+ lang = 'da'
+ language_name = 'Danish'
+ js_stemmer_rawcode = 'danish-stemmer.js'
+ stopwords = danish_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('danish')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/de.py b/sphinx/search/de.py
new file mode 100644
index 0000000..1c253fd
--- /dev/null
+++ b/sphinx/search/de.py
@@ -0,0 +1,303 @@
+"""German search language: includes the JS German stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+german_stopwords = parse_stop_word('''
+|source: http://snowball.tartarus.org/algorithms/german/stop.txt
+aber | but
+
+alle | all
+allem
+allen
+aller
+alles
+
+als | than, as
+also | so
+am | an + dem
+an | at
+
+ander | other
+andere
+anderem
+anderen
+anderer
+anderes
+anderm
+andern
+anderr
+anders
+
+auch | also
+auf | on
+aus | out of
+bei | by
+bin | am
+bis | until
+bist | art
+da | there
+damit | with it
+dann | then
+
+der | the
+den
+des
+dem
+die
+das
+
+daß | that
+
+derselbe | the same
+derselben
+denselben
+desselben
+demselben
+dieselbe
+dieselben
+dasselbe
+
+dazu | to that
+
+dein | thy
+deine
+deinem
+deinen
+deiner
+deines
+
+denn | because
+
+derer | of those
+dessen | of him
+
+dich | thee
+dir | to thee
+du | thou
+
+dies | this
+diese
+diesem
+diesen
+dieser
+dieses
+
+
+doch | (several meanings)
+dort | (over) there
+
+
+durch | through
+
+ein | a
+eine
+einem
+einen
+einer
+eines
+
+einig | some
+einige
+einigem
+einigen
+einiger
+einiges
+
+einmal | once
+
+er | he
+ihn | him
+ihm | to him
+
+es | it
+etwas | something
+
+euer | your
+eure
+eurem
+euren
+eurer
+eures
+
+für | for
+gegen | towards
+gewesen | p.p. of sein
+hab | have
+habe | have
+haben | have
+hat | has
+hatte | had
+hatten | had
+hier | here
+hin | there
+hinter | behind
+
+ich | I
+mich | me
+mir | to me
+
+
+ihr | you, to her
+ihre
+ihrem
+ihren
+ihrer
+ihres
+euch | to you
+
+im | in + dem
+in | in
+indem | while
+ins | in + das
+ist | is
+
+jede | each, every
+jedem
+jeden
+jeder
+jedes
+
+jene | that
+jenem
+jenen
+jener
+jenes
+
+jetzt | now
+kann | can
+
+kein | no
+keine
+keinem
+keinen
+keiner
+keines
+
+können | can
+könnte | could
+machen | do
+man | one
+
+manche | some, many a
+manchem
+manchen
+mancher
+manches
+
+mein | my
+meine
+meinem
+meinen
+meiner
+meines
+
+mit | with
+muss | must
+musste | had to
+nach | to(wards)
+nicht | not
+nichts | nothing
+noch | still, yet
+nun | now
+nur | only
+ob | whether
+oder | or
+ohne | without
+sehr | very
+
+sein | his
+seine
+seinem
+seinen
+seiner
+seines
+
+selbst | self
+sich | herself
+
+sie | they, she
+ihnen | to them
+
+sind | are
+so | so
+
+solche | such
+solchem
+solchen
+solcher
+solches
+
+soll | shall
+sollte | should
+sondern | but
+sonst | else
+über | over
+um | about, around
+und | and
+
+uns | us
+unse
+unsem
+unsen
+unser
+unses
+
+unter | under
+viel | much
+vom | von + dem
+von | from
+vor | before
+während | while
+war | was
+waren | were
+warst | wast
+was | what
+weg | away, off
+weil | because
+weiter | further
+
+welche | which
+welchem
+welchen
+welcher
+welches
+
+wenn | when
+werde | will
+werden | will
+wie | how
+wieder | again
+will | want
+wir | we
+wird | will
+wirst | willst
+wo | where
+wollen | want
+wollte | wanted
+würde | would
+würden | would
+zu | to
+zum | zu + dem
+zur | zu + der
+zwar | indeed
+zwischen | between
+''')
+
+
+class SearchGerman(SearchLanguage):
+ lang = 'de'
+ language_name = 'German'
+ js_stemmer_rawcode = 'german-stemmer.js'
+ stopwords = german_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('german')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/en.py b/sphinx/search/en.py
new file mode 100644
index 0000000..caa6f66
--- /dev/null
+++ b/sphinx/search/en.py
@@ -0,0 +1,220 @@
+"""English search language: includes the JS porter stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage
+
+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'
+ language_name = 'English'
+ js_stemmer_code = js_porter_stemmer
+ stopwords = english_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('porter')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/es.py b/sphinx/search/es.py
new file mode 100644
index 0000000..c5d9a5c
--- /dev/null
+++ b/sphinx/search/es.py
@@ -0,0 +1,363 @@
+"""Spanish search language: includes the JS Spanish stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+spanish_stopwords = parse_stop_word('''
+|source: http://snowball.tartarus.org/algorithms/spanish/stop.txt
+de | from, of
+la | the, her
+que | who, that
+el | the
+en | in
+y | and
+a | to
+los | the, them
+del | de + el
+se | himself, from him etc
+las | the, them
+por | for, by, etc
+un | a
+para | for
+con | with
+no | no
+una | a
+su | his, her
+al | a + el
+ | es from SER
+lo | him
+como | how
+más | more
+pero | pero
+sus | su plural
+le | to him, her
+ya | already
+o | or
+ | fue from SER
+este | this
+ | ha from HABER
+sí | himself etc
+porque | because
+esta | this
+ | son from SER
+entre | between
+ | está from ESTAR
+cuando | when
+muy | very
+sin | without
+sobre | on
+ | ser from SER
+ | tiene from TENER
+también | also
+me | me
+hasta | until
+hay | there is/are
+donde | where
+ | han from HABER
+quien | whom, that
+ | están from ESTAR
+ | estado from ESTAR
+desde | from
+todo | all
+nos | us
+durante | during
+ | estados from ESTAR
+todos | all
+uno | a
+les | to them
+ni | nor
+contra | against
+otros | other
+ | fueron from SER
+ese | that
+eso | that
+ | había from HABER
+ante | before
+ellos | they
+e | and (variant of y)
+esto | this
+mí | me
+antes | before
+algunos | some
+qué | what?
+unos | a
+yo | I
+otro | other
+otras | other
+otra | other
+él | he
+tanto | so much, many
+esa | that
+estos | these
+mucho | much, many
+quienes | who
+nada | nothing
+muchos | many
+cual | who
+ | sea from SER
+poco | few
+ella | she
+estar | to be
+ | haber from HABER
+estas | these
+ | estaba from ESTAR
+ | estamos from ESTAR
+algunas | some
+algo | something
+nosotros | we
+
+ | other forms
+
+mi | me
+mis | mi plural
+tú | thou
+te | thee
+ti | thee
+tu | thy
+tus | tu plural
+ellas | they
+nosotras | we
+vosotros | you
+vosotras | you
+os | you
+mío | mine
+mía |
+míos |
+mías |
+tuyo | thine
+tuya |
+tuyos |
+tuyas |
+suyo | his, hers, theirs
+suya |
+suyos |
+suyas |
+nuestro | ours
+nuestra |
+nuestros |
+nuestras |
+vuestro | yours
+vuestra |
+vuestros |
+vuestras |
+esos | those
+esas | those
+
+ | forms of estar, to be (not including the infinitive):
+estoy
+estás
+está
+estamos
+estáis
+están
+esté
+estés
+estemos
+estéis
+estén
+estaré
+estarás
+estará
+estaremos
+estaréis
+estarán
+estaría
+estarías
+estaríamos
+estaríais
+estarían
+estaba
+estabas
+estábamos
+estabais
+estaban
+estuve
+estuviste
+estuvo
+estuvimos
+estuvisteis
+estuvieron
+estuviera
+estuvieras
+estuviéramos
+estuvierais
+estuvieran
+estuviese
+estuvieses
+estuviésemos
+estuvieseis
+estuviesen
+estando
+estado
+estada
+estados
+estadas
+estad
+
+ | forms of haber, to have (not including the infinitive):
+he
+has
+ha
+hemos
+habéis
+han
+haya
+hayas
+hayamos
+hayáis
+hayan
+habré
+habrás
+habrá
+habremos
+habréis
+habrán
+habría
+habrías
+habríamos
+habríais
+habrían
+había
+habías
+habíamos
+habíais
+habían
+hube
+hubiste
+hubo
+hubimos
+hubisteis
+hubieron
+hubiera
+hubieras
+hubiéramos
+hubierais
+hubieran
+hubiese
+hubieses
+hubiésemos
+hubieseis
+hubiesen
+habiendo
+habido
+habida
+habidos
+habidas
+
+ | forms of ser, to be (not including the infinitive):
+soy
+eres
+es
+somos
+sois
+son
+sea
+seas
+seamos
+seáis
+sean
+seré
+serás
+será
+seremos
+seréis
+serán
+sería
+serías
+seríamos
+seríais
+serían
+era
+eras
+éramos
+erais
+eran
+fui
+fuiste
+fue
+fuimos
+fuisteis
+fueron
+fuera
+fueras
+fuéramos
+fuerais
+fueran
+fuese
+fueses
+fuésemos
+fueseis
+fuesen
+siendo
+sido
+ | sed also means 'thirst'
+
+ | forms of tener, to have (not including the infinitive):
+tengo
+tienes
+tiene
+tenemos
+tenéis
+tienen
+tenga
+tengas
+tengamos
+tengáis
+tengan
+tendré
+tendrás
+tendrá
+tendremos
+tendréis
+tendrán
+tendría
+tendrías
+tendríamos
+tendríais
+tendrían
+tenía
+tenías
+teníamos
+teníais
+tenían
+tuve
+tuviste
+tuvo
+tuvimos
+tuvisteis
+tuvieron
+tuviera
+tuvieras
+tuviéramos
+tuvierais
+tuvieran
+tuviese
+tuvieses
+tuviésemos
+tuvieseis
+tuviesen
+teniendo
+tenido
+tenida
+tenidos
+tenidas
+tened
+''')
+
+
+class SearchSpanish(SearchLanguage):
+ lang = 'es'
+ language_name = 'Spanish'
+ js_stemmer_rawcode = 'spanish-stemmer.js'
+ stopwords = spanish_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('spanish')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/fi.py b/sphinx/search/fi.py
new file mode 100644
index 0000000..70114f8
--- /dev/null
+++ b/sphinx/search/fi.py
@@ -0,0 +1,113 @@
+"""Finnish search language: includes the JS Finnish stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+finnish_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/finnish/stop.txt
+| forms of BE
+
+olla
+olen
+olet
+on
+olemme
+olette
+ovat
+ole | negative form
+
+oli
+olisi
+olisit
+olisin
+olisimme
+olisitte
+olisivat
+olit
+olin
+olimme
+olitte
+olivat
+ollut
+olleet
+
+en | negation
+et
+ei
+emme
+ette
+eivät
+
+|Nom Gen Acc Part Iness Elat Illat Adess Ablat Allat Ess Trans
+minä minun minut minua minussa minusta minuun minulla minulta minulle | I
+sinä sinun sinut sinua sinussa sinusta sinuun sinulla sinulta sinulle | you
+hän hänen hänet häntä hänessä hänestä häneen hänellä häneltä hänelle | he she
+me meidän meidät meitä meissä meistä meihin meillä meiltä meille | we
+te teidän teidät teitä teissä teistä teihin teillä teiltä teille | you
+he heidän heidät heitä heissä heistä heihin heillä heiltä heille | they
+
+tämä tämän tätä tässä tästä tähän tällä tältä tälle tänä täksi | this
+tuo tuon tuota tuossa tuosta tuohon tuolla tuolta tuolle tuona tuoksi | that
+se sen sitä siinä siitä siihen sillä siltä sille sinä siksi | it
+nämä näiden näitä näissä näistä näihin näillä näiltä näille näinä näiksi | these
+nuo noiden noita noissa noista noihin noilla noilta noille noina noiksi | those
+ne niiden niitä niissä niistä niihin niillä niiltä niille niinä niiksi | they
+
+kuka kenen kenet ketä kenessä kenestä keneen kenellä keneltä kenelle kenenä keneksi| who
+ketkä keiden ketkä keitä keissä keistä keihin keillä keiltä keille keinä keiksi | (pl)
+mikä minkä minkä mitä missä mistä mihin millä miltä mille minä miksi | which what
+mitkä | (pl)
+
+joka jonka jota jossa josta johon jolla jolta jolle jona joksi | who which
+jotka joiden joita joissa joista joihin joilla joilta joille joina joiksi | (pl)
+
+| conjunctions
+
+että | that
+ja | and
+jos | if
+koska | because
+kuin | than
+mutta | but
+niin | so
+sekä | and
+sillä | for
+tai | or
+vaan | but
+vai | or
+vaikka | although
+
+
+| prepositions
+
+kanssa | with
+mukaan | according to
+noin | about
+poikki | across
+yli | over, across
+
+| other
+
+kun | when
+niin | so
+nyt | now
+itse | self
+''')
+
+
+class SearchFinnish(SearchLanguage):
+ lang = 'fi'
+ language_name = 'Finnish'
+ js_stemmer_rawcode = 'finnish-stemmer.js'
+ stopwords = finnish_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('finnish')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/fr.py b/sphinx/search/fr.py
new file mode 100644
index 0000000..01319dd
--- /dev/null
+++ b/sphinx/search/fr.py
@@ -0,0 +1,199 @@
+"""French search language: includes the JS French stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+french_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/french/stop.txt
+au | a + le
+aux | a + les
+avec | with
+ce | this
+ces | these
+dans | with
+de | of
+des | de + les
+du | de + le
+elle | she
+en | `of them' etc
+et | and
+eux | them
+il | he
+je | I
+la | the
+le | the
+leur | their
+lui | him
+ma | my (fem)
+mais | but
+me | me
+même | same; as in moi-même (myself) etc
+mes | me (pl)
+moi | me
+mon | my (masc)
+ne | not
+nos | our (pl)
+notre | our
+nous | we
+on | one
+ou | where
+par | by
+pas | not
+pour | for
+qu | que before vowel
+que | that
+qui | who
+sa | his, her (fem)
+se | oneself
+ses | his (pl)
+son | his, her (masc)
+sur | on
+ta | thy (fem)
+te | thee
+tes | thy (pl)
+toi | thee
+ton | thy (masc)
+tu | thou
+un | a
+une | a
+vos | your (pl)
+votre | your
+vous | you
+
+ | single letter forms
+
+c | c'
+d | d'
+j | j'
+l | l'
+à | to, at
+m | m'
+n | n'
+s | s'
+t | t'
+y | there
+
+ | forms of être (not including the infinitive):
+été
+étée
+étées
+étés
+étant
+suis
+es
+est
+sommes
+êtes
+sont
+serai
+seras
+sera
+serons
+serez
+seront
+serais
+serait
+serions
+seriez
+seraient
+étais
+était
+étions
+étiez
+étaient
+fus
+fut
+fûmes
+fûtes
+furent
+sois
+soit
+soyons
+soyez
+soient
+fusse
+fusses
+fût
+fussions
+fussiez
+fussent
+
+ | forms of avoir (not including the infinitive):
+ayant
+eu
+eue
+eues
+eus
+ai
+as
+avons
+avez
+ont
+aurai
+auras
+aura
+aurons
+aurez
+auront
+aurais
+aurait
+aurions
+auriez
+auraient
+avais
+avait
+avions
+aviez
+avaient
+eut
+eûmes
+eûtes
+eurent
+aie
+aies
+ait
+ayons
+ayez
+aient
+eusse
+eusses
+eût
+eussions
+eussiez
+eussent
+
+ | Later additions (from Jean-Christophe Deschamps)
+ceci | this
+cela | that (added 11 Apr 2012. Omission reported by Adrien Grand)
+celà | that (incorrect, though common)
+cet | this
+cette | this
+ici | here
+ils | they
+les | the (pl)
+leurs | their (pl)
+quel | which
+quels | which
+quelle | which
+quelles | which
+sans | without
+soi | oneself
+''')
+
+
+class SearchFrench(SearchLanguage):
+ lang = 'fr'
+ language_name = 'French'
+ js_stemmer_rawcode = 'french-stemmer.js'
+ stopwords = french_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('french')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/hu.py b/sphinx/search/hu.py
new file mode 100644
index 0000000..eed08db
--- /dev/null
+++ b/sphinx/search/hu.py
@@ -0,0 +1,226 @@
+"""Hungarian search language: includes the JS Hungarian stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+hungarian_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/hungarian/stop.txt
+| prepared by Anna Tordai
+a
+ahogy
+ahol
+aki
+akik
+akkor
+alatt
+által
+általában
+amely
+amelyek
+amelyekben
+amelyeket
+amelyet
+amelynek
+ami
+amit
+amolyan
+amíg
+amikor
+át
+abban
+ahhoz
+annak
+arra
+arról
+az
+azok
+azon
+azt
+azzal
+azért
+aztán
+azután
+azonban
+bár
+be
+belül
+benne
+cikk
+cikkek
+cikkeket
+csak
+de
+e
+eddig
+egész
+egy
+egyes
+egyetlen
+egyéb
+egyik
+egyre
+ekkor
+el
+elég
+ellen
+elő
+először
+előtt
+első
+én
+éppen
+ebben
+ehhez
+emilyen
+ennek
+erre
+ez
+ezt
+ezek
+ezen
+ezzel
+ezért
+és
+fel
+felé
+hanem
+hiszen
+hogy
+hogyan
+igen
+így
+illetve
+ill.
+ill
+ilyen
+ilyenkor
+ison
+ismét
+itt
+jó
+jól
+jobban
+kell
+kellett
+keresztül
+keressünk
+ki
+kívül
+között
+közül
+legalább
+lehet
+lehetett
+legyen
+lenne
+lenni
+lesz
+lett
+maga
+magát
+majd
+majd
+már
+más
+másik
+meg
+még
+mellett
+mert
+mely
+melyek
+mi
+mit
+míg
+miért
+milyen
+mikor
+minden
+mindent
+mindenki
+mindig
+mint
+mintha
+mivel
+most
+nagy
+nagyobb
+nagyon
+ne
+néha
+nekem
+neki
+nem
+néhány
+nélkül
+nincs
+olyan
+ott
+össze
+Å‘
+Å‘k
+Å‘ket
+pedig
+persze
+rá
+s
+saját
+sem
+semmi
+sok
+sokat
+sokkal
+számára
+szemben
+szerint
+szinte
+talán
+tehát
+teljes
+tovább
+továbbá
+több
+úgy
+ugyanis
+új
+újabb
+újra
+után
+utána
+utolsó
+vagy
+vagyis
+valaki
+valami
+valamint
+való
+vagyok
+van
+vannak
+volt
+voltam
+voltak
+voltunk
+vissza
+vele
+viszont
+volna
+''')
+
+
+class SearchHungarian(SearchLanguage):
+ lang = 'hu'
+ language_name = 'Hungarian'
+ js_stemmer_rawcode = 'hungarian-stemmer.js'
+ stopwords = hungarian_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('hungarian')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/it.py b/sphinx/search/it.py
new file mode 100644
index 0000000..7bf712b
--- /dev/null
+++ b/sphinx/search/it.py
@@ -0,0 +1,316 @@
+"""Italian search language: includes the JS Italian stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+italian_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/italian/stop.txt
+ad | a (to) before vowel
+al | a + il
+allo | a + lo
+ai | a + i
+agli | a + gli
+all | a + l'
+agl | a + gl'
+alla | a + la
+alle | a + le
+con | with
+col | con + il
+coi | con + i (forms collo, cogli etc are now very rare)
+da | from
+dal | da + il
+dallo | da + lo
+dai | da + i
+dagli | da + gli
+dall | da + l'
+dagl | da + gll'
+dalla | da + la
+dalle | da + le
+di | of
+del | di + il
+dello | di + lo
+dei | di + i
+degli | di + gli
+dell | di + l'
+degl | di + gl'
+della | di + la
+delle | di + le
+in | in
+nel | in + el
+nello | in + lo
+nei | in + i
+negli | in + gli
+nell | in + l'
+negl | in + gl'
+nella | in + la
+nelle | in + le
+su | on
+sul | su + il
+sullo | su + lo
+sui | su + i
+sugli | su + gli
+sull | su + l'
+sugl | su + gl'
+sulla | su + la
+sulle | su + le
+per | through, by
+tra | among
+contro | against
+io | I
+tu | thou
+lui | he
+lei | she
+noi | we
+voi | you
+loro | they
+mio | my
+mia |
+miei |
+mie |
+tuo |
+tua |
+tuoi | thy
+tue |
+suo |
+sua |
+suoi | his, her
+sue |
+nostro | our
+nostra |
+nostri |
+nostre |
+vostro | your
+vostra |
+vostri |
+vostre |
+mi | me
+ti | thee
+ci | us, there
+vi | you, there
+lo | him, the
+la | her, the
+li | them
+le | them, the
+gli | to him, the
+ne | from there etc
+il | the
+un | a
+uno | a
+una | a
+ma | but
+ed | and
+se | if
+perché | why, because
+anche | also
+come | how
+dov | where (as dov')
+dove | where
+che | who, that
+chi | who
+cui | whom
+non | not
+più | more
+quale | who, that
+quanto | how much
+quanti |
+quanta |
+quante |
+quello | that
+quelli |
+quella |
+quelle |
+questo | this
+questi |
+questa |
+queste |
+si | yes
+tutto | all
+tutti | all
+
+ | single letter forms:
+
+a | at
+c | as c' for ce or ci
+e | and
+i | the
+l | as l'
+o | or
+
+ | forms of avere, to have (not including the infinitive):
+
+ho
+hai
+ha
+abbiamo
+avete
+hanno
+abbia
+abbiate
+abbiano
+avrò
+avrai
+avrà
+avremo
+avrete
+avranno
+avrei
+avresti
+avrebbe
+avremmo
+avreste
+avrebbero
+avevo
+avevi
+aveva
+avevamo
+avevate
+avevano
+ebbi
+avesti
+ebbe
+avemmo
+aveste
+ebbero
+avessi
+avesse
+avessimo
+avessero
+avendo
+avuto
+avuta
+avuti
+avute
+
+ | forms of essere, to be (not including the infinitive):
+sono
+sei
+è
+siamo
+siete
+sia
+siate
+siano
+sarò
+sarai
+sarà
+saremo
+sarete
+saranno
+sarei
+saresti
+sarebbe
+saremmo
+sareste
+sarebbero
+ero
+eri
+era
+eravamo
+eravate
+erano
+fui
+fosti
+fu
+fummo
+foste
+furono
+fossi
+fosse
+fossimo
+fossero
+essendo
+
+ | forms of fare, to do (not including the infinitive, fa, fat-):
+faccio
+fai
+facciamo
+fanno
+faccia
+facciate
+facciano
+farò
+farai
+farà
+faremo
+farete
+faranno
+farei
+faresti
+farebbe
+faremmo
+fareste
+farebbero
+facevo
+facevi
+faceva
+facevamo
+facevate
+facevano
+feci
+facesti
+fece
+facemmo
+faceste
+fecero
+facessi
+facesse
+facessimo
+facessero
+facendo
+
+ | forms of stare, to be (not including the infinitive):
+sto
+stai
+sta
+stiamo
+stanno
+stia
+stiate
+stiano
+starò
+starai
+starà
+staremo
+starete
+staranno
+starei
+staresti
+starebbe
+staremmo
+stareste
+starebbero
+stavo
+stavi
+stava
+stavamo
+stavate
+stavano
+stetti
+stesti
+stette
+stemmo
+steste
+stettero
+stessi
+stesse
+stessimo
+stessero
+''')
+
+
+class SearchItalian(SearchLanguage):
+ lang = 'it'
+ language_name = 'Italian'
+ js_stemmer_rawcode = 'italian-stemmer.js'
+ stopwords = italian_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('italian')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/ja.py b/sphinx/search/ja.py
new file mode 100644
index 0000000..de221ce
--- /dev/null
+++ b/sphinx/search/ja.py
@@ -0,0 +1,531 @@
+"""Japanese search language: includes routine to split words."""
+
+# 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
+
+from __future__ import annotations
+
+import os
+import re
+import sys
+from typing import TYPE_CHECKING, Any, Dict, List
+
+try:
+ import MeCab
+ native_module = True
+except ImportError:
+ native_module = False
+
+try:
+ import janome.tokenizer
+ janome_module = True
+except ImportError:
+ janome_module = False
+
+from sphinx.errors import ExtensionError, SphinxError
+from sphinx.search import SearchLanguage
+from sphinx.util import import_object
+
+
+class BaseSplitter:
+ def __init__(self, options: dict) -> None:
+ self.options = options
+
+ def split(self, input: str) -> list[str]:
+ """
+ :param str input:
+ :return:
+ :rtype: list[str]
+ """
+ raise NotImplementedError
+
+
+class MecabSplitter(BaseSplitter):
+ def __init__(self, options: dict) -> None:
+ super().__init__(options)
+ self.ctypes_libmecab: Any = None
+ self.ctypes_mecab: Any = 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: str) -> list[str]:
+ if native_module:
+ result = self.native.parse(input)
+ else:
+ result = self.ctypes_libmecab.mecab_sparse_tostr(
+ self.ctypes_mecab, input.encode(self.dict_encode))
+ return result.split(' ')
+
+ def init_native(self, options: dict) -> None:
+ param = '-Owakati'
+ dict = options.get('dict')
+ if dict:
+ param += ' -d %s' % dict
+ self.native = MeCab.Tagger(param)
+
+ def init_ctypes(self, options: dict) -> None:
+ 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
+
+ fs_enc = sys.getfilesystemencoding() or sys.getdefaultencoding()
+
+ self.ctypes_libmecab = ctypes.CDLL(libpath)
+ self.ctypes_libmecab.mecab_new2.argtypes = (ctypes.c_char_p,)
+ self.ctypes_libmecab.mecab_new2.restype = ctypes.c_void_p
+ self.ctypes_libmecab.mecab_sparse_tostr.argtypes = (ctypes.c_void_p, ctypes.c_char_p)
+ self.ctypes_libmecab.mecab_sparse_tostr.restype = ctypes.c_char_p
+ self.ctypes_mecab = self.ctypes_libmecab.mecab_new2(param.encode(fs_enc))
+ if self.ctypes_mecab is None:
+ raise SphinxError('mecab initialization failed')
+
+ def __del__(self) -> None:
+ if self.ctypes_libmecab:
+ self.ctypes_libmecab.mecab_destroy(self.ctypes_mecab)
+
+
+class JanomeSplitter(BaseSplitter):
+ def __init__(self, options: dict) -> None:
+ super().__init__(options)
+ self.user_dict = options.get('user_dic')
+ self.user_dict_enc = options.get('user_dic_enc', 'utf8')
+ self.init_tokenizer()
+
+ def init_tokenizer(self) -> None:
+ if not janome_module:
+ raise RuntimeError('Janome is not available')
+ self.tokenizer = janome.tokenizer.Tokenizer(udic=self.user_dict, udic_enc=self.user_dict_enc)
+
+ def split(self, input: str) -> list[str]:
+ result = ' '.join(token.surface for token in self.tokenizer.tokenize(input))
+ return result.split(' ')
+
+
+class DefaultSplitter(BaseSplitter):
+ patterns_ = {re.compile(pattern): value for pattern, value in {
+ '[一二三四五六七八ä¹å百åƒä¸‡å„„å…†]': 'M',
+ '[一-龠々〆ヵヶ]': 'H',
+ '[ã-ã‚“]': 'I',
+ '[ã‚¡-ヴーア-ï¾ï¾žï½°]': 'K',
+ '[a-zA-Zï½-zA-Z]': 'A',
+ '[0-9ï¼-ï¼™]': 'N',
+ }.items()}
+ BIAS__ = -332
+ BC1__ = {'HH': 6, 'II': 2461, 'KH': 406, 'OH': -1378}
+ BC2__ = {'AA': -3267, 'AI': 2744, 'AN': -878, 'HH': -4070, 'HM': -1711,
+ 'HN': 4012, 'HO': 3761, 'IA': 1327, 'IH': -1184, 'II': -1332,
+ 'IK': 1721, 'IO': 5492, 'KI': 3831, 'KK': -8741, 'MH': -3132,
+ 'MK': 3334, 'OO': -2920}
+ BC3__ = {'HH': 996, 'HI': 626, 'HK': -721, 'HN': -1307, 'HO': -836, 'IH': -301,
+ 'KK': 2762, 'MK': 1079, 'MM': 4034, 'OA': -1652, 'OH': 266}
+ BP1__ = {'BB': 295, 'OB': 304, 'OO': -125, 'UB': 352}
+ BP2__ = {'BO': 60, 'OO': -1762}
+ BQ1__ = {'BHH': 1150, 'BHM': 1521, 'BII': -1158, 'BIM': 886, 'BMH': 1208,
+ 'BNH': 449, 'BOH': -91, 'BOO': -2597, 'OHI': 451, 'OIH': -296,
+ 'OKA': 1851, 'OKH': -1020, 'OKK': 904, 'OOO': 2965}
+ BQ2__ = {'BHH': 118, 'BHI': -1159, 'BHM': 466, 'BIH': -919, 'BKK': -1720,
+ 'BKO': 864, 'OHH': -1139, 'OHM': -181, 'OIH': 153, 'UHI': -1146}
+ BQ3__ = {'BHH': -792, 'BHI': 2664, 'BII': -299, 'BKI': 419, 'BMH': 937,
+ 'BMM': 8335, 'BNN': 998, 'BOH': 775, 'OHH': 2174, 'OHM': 439, 'OII': 280,
+ 'OKH': 1798, 'OKI': -793, 'OKO': -2242, 'OMH': -2402, 'OOO': 11699}
+ BQ4__ = {'BHH': -3895, 'BIH': 3761, 'BII': -4654, 'BIK': 1348, 'BKK': -1806,
+ 'BMI': -3385, 'BOO': -12396, 'OAH': 926, 'OHH': 266, 'OHK': -2036,
+ 'ONN': -973}
+ BW1__ = {',ã¨': 660, ',åŒ': 727, 'B1ã‚': 1404, 'B1åŒ': 542, 'ã€ã¨': 660,
+ 'ã€åŒ': 727, 'ã€ã¨': 1682, 'ã‚ã£': 1505, 'ã„ã†': 1743, 'ã„ã£': -2055,
+ 'ã„ã‚‹': 672, 'ã†ã—': -4817, 'ã†ã‚“': 665, 'ã‹ã‚‰': 3472, 'ãŒã‚‰': 600,
+ 'ã“ã†': -790, 'ã“ã¨': 2083, 'ã“ã‚“': -1262, 'ã•ã‚‰': -4143, 'ã•ã‚“': 4573,
+ 'ã—ãŸ': 2641, 'ã—ã¦': 1104, 'ã™ã§': -3399, 'ãã“': 1977, 'ãã‚Œ': -871,
+ 'ãŸã¡': 1122, 'ãŸã‚': 601, 'ã£ãŸ': 3463, 'ã¤ã„': -802, 'ã¦ã„': 805,
+ 'ã¦ã': 1249, 'ã§ã': 1127, 'ã§ã™': 3445, 'ã§ã¯': 844, 'ã¨ã„': -4915,
+ 'ã¨ã¿': 1922, 'ã©ã“': 3887, 'ãªã„': 5713, 'ãªã£': 3015, 'ãªã©': 7379,
+ 'ãªã‚“': -1113, 'ã«ã—': 2468, 'ã«ã¯': 1498, 'ã«ã‚‚': 1671, 'ã«å¯¾': -912,
+ 'ã®ä¸€': -501, 'ã®ä¸­': 741, 'ã¾ã›': 2448, 'ã¾ã§': 1711, 'ã¾ã¾': 2600,
+ 'ã¾ã‚‹': -2155, 'ã‚„ã‚€': -1947, 'よã£': -2565, 'ã‚ŒãŸ': 2369, 'ã‚Œã§': -913,
+ 'ã‚’ã—': 1860, 'を見': 731, '亡ã': -1886, '京都': 2558, 'å–ã‚Š': -2784,
+ '大ã': -2604, '大阪': 1497, '平方': -2314, '引ã': -1336, '日本': -195,
+ '本当': -2423, '毎日': -2113, '目指': -724, 'B1ã‚': 1404, 'B1åŒ': 542,
+ 'ï½£ã¨': 1682}
+ BW2__ = {'..': -11822, '11': -669, '――': -5730, '−−': -13175, 'ã„ã†': -1609,
+ 'ã†ã‹': 2490, 'ã‹ã—': -1350, 'ã‹ã‚‚': -602, 'ã‹ã‚‰': -7194, 'ã‹ã‚Œ': 4612,
+ 'ãŒã„': 853, 'ãŒã‚‰': -3198, 'ããŸ': 1941, 'ããª': -1597, 'ã“ã¨': -8392,
+ 'ã“ã®': -4193, 'ã•ã›': 4533, 'ã•ã‚Œ': 13168, 'ã•ã‚“': -3977, 'ã—ã„': -1819,
+ 'ã—ã‹': -545, 'ã—ãŸ': 5078, 'ã—ã¦': 972, 'ã—ãª': 939, 'ãã®': -3744,
+ 'ãŸã„': -1253, 'ãŸãŸ': -662, 'ãŸã ': -3857, 'ãŸã¡': -786, 'ãŸã¨': 1224,
+ 'ãŸã¯': -939, 'ã£ãŸ': 4589, 'ã£ã¦': 1647, 'ã£ã¨': -2094, 'ã¦ã„': 6144,
+ 'ã¦ã': 3640, 'ã¦ã': 2551, 'ã¦ã¯': -3110, 'ã¦ã‚‚': -3065, 'ã§ã„': 2666,
+ 'ã§ã': -1528, 'ã§ã—': -3828, 'ã§ã™': -4761, 'ã§ã‚‚': -4203, 'ã¨ã„': 1890,
+ 'ã¨ã“': -1746, 'ã¨ã¨': -2279, 'ã¨ã®': 720, 'ã¨ã¿': 5168, 'ã¨ã‚‚': -3941,
+ 'ãªã„': -2488, 'ãªãŒ': -1313, 'ãªã©': -6509, 'ãªã®': 2614, 'ãªã‚“': 3099,
+ 'ã«ãŠ': -1615, 'ã«ã—': 2748, 'ã«ãª': 2454, 'ã«ã‚ˆ': -7236, 'ã«å¯¾': -14943,
+ 'ã«å¾“': -4688, 'ã«é–¢': -11388, 'ã®ã‹': 2093, 'ã®ã§': -7059, 'ã®ã«': -6041,
+ 'ã®ã®': -6125, 'ã¯ã„': 1073, 'ã¯ãŒ': -1033, 'ã¯ãš': -2532, 'ã°ã‚Œ': 1813,
+ 'ã¾ã—': -1316, 'ã¾ã§': -6621, 'ã¾ã‚Œ': 5409, 'ã‚ã¦': -3153, 'ã‚‚ã„': 2230,
+ 'ã‚‚ã®': -10713, 'らã‹': -944, 'らã—': -1611, 'らã«': -1897, 'ã‚Šã—': 651,
+ 'ã‚Šã¾': 1620, 'ã‚ŒãŸ': 4270, 'ã‚Œã¦': 849, 'ã‚Œã°': 4114, 'ã‚ã†': 6067,
+ 'ã‚ã‚Œ': 7901, 'を通': -11877, 'ã‚“ã ': 728, 'ã‚“ãª': -4115, '一人': 602,
+ '一方': -1375, '一日': 970, '一部': -1051, '上ãŒ': -4479, '会社': -1116,
+ '出ã¦': 2163, '分ã®': -7758, 'åŒå…š': 970, 'åŒæ—¥': -913, '大阪': -2471,
+ '委員': -1250, 'å°‘ãª': -1050, '年度': -8669, 'å¹´é–“': -1626, '府県': -2363,
+ '手権': -1982, 'æ–°èž': -4066, '日新': -722, '日本': -7068, '日米': 3372,
+ '曜日': -601, 'æœé®®': -2355, '本人': -2697, 'æ±äº¬': -1543, '然ã¨': -1384,
+ '社会': -1276, 'ç«‹ã¦': -990, '第ã«': -1612, '米国': -4268, '11': -669}
+ BW3__ = {'ã‚ãŸ': -2194, 'ã‚ã‚Š': 719, 'ã‚ã‚‹': 3846, 'ã„.': -1185, 'ã„。': -1185,
+ 'ã„ã„': 5308, 'ã„ãˆ': 2079, 'ã„ã': 3029, 'ã„ãŸ': 2056, 'ã„ã£': 1883,
+ 'ã„ã‚‹': 5600, 'ã„ã‚': 1527, 'ã†ã¡': 1117, 'ã†ã¨': 4798, 'ãˆã¨': 1454,
+ 'ã‹.': 2857, 'ã‹ã€‚': 2857, 'ã‹ã‘': -743, 'ã‹ã£': -4098, 'ã‹ã«': -669,
+ 'ã‹ã‚‰': 6520, 'ã‹ã‚Š': -2670, 'ãŒ,': 1816, 'ãŒã€': 1816, 'ãŒã': -4855,
+ 'ãŒã‘': -1127, 'ãŒã£': -913, 'ãŒã‚‰': -4977, 'ãŒã‚Š': -2064, 'ããŸ': 1645,
+ 'ã‘ã©': 1374, 'ã“ã¨': 7397, 'ã“ã®': 1542, 'ã“ã‚': -2757, 'ã•ã„': -714,
+ 'ã•ã‚’': 976, 'ã—,': 1557, 'ã—ã€': 1557, 'ã—ã„': -3714, 'ã—ãŸ': 3562,
+ 'ã—ã¦': 1449, 'ã—ãª': 2608, 'ã—ã¾': 1200, 'ã™.': -1310, 'ã™ã€‚': -1310,
+ 'ã™ã‚‹': 6521, 'ãš,': 3426, 'ãšã€': 3426, 'ãšã«': 841, 'ãã†': 428,
+ 'ãŸ.': 8875, 'ãŸã€‚': 8875, 'ãŸã„': -594, 'ãŸã®': 812, 'ãŸã‚Š': -1183,
+ 'ãŸã‚‹': -853, 'ã .': 4098, 'ã ã€‚': 4098, 'ã ã£': 1004, 'ã£ãŸ': -4748,
+ 'ã£ã¦': 300, 'ã¦ã„': 6240, 'ã¦ãŠ': 855, 'ã¦ã‚‚': 302, 'ã§ã™': 1437,
+ 'ã§ã«': -1482, 'ã§ã¯': 2295, 'ã¨ã†': -1387, 'ã¨ã—': 2266, 'ã¨ã®': 541,
+ 'ã¨ã‚‚': -3543, 'ã©ã†': 4664, 'ãªã„': 1796, 'ãªã': -903, 'ãªã©': 2135,
+ 'ã«,': -1021, 'ã«ã€': -1021, 'ã«ã—': 1771, 'ã«ãª': 1906, 'ã«ã¯': 2644,
+ 'ã®,': -724, 'ã®ã€': -724, 'ã®å­': -1000, 'ã¯,': 1337, 'ã¯ã€': 1337,
+ 'ã¹ã': 2181, 'ã¾ã—': 1113, 'ã¾ã™': 6943, 'ã¾ã£': -1549, 'ã¾ã§': 6154,
+ 'ã¾ã‚Œ': -793, 'らã—': 1479, 'られ': 6820, 'ã‚‹ã‚‹': 3818, 'ã‚Œ,': 854,
+ 'ã‚Œã€': 854, 'ã‚ŒãŸ': 1850, 'ã‚Œã¦': 1375, 'ã‚Œã°': -3246, 'れる': 1091,
+ 'ã‚ã‚Œ': -605, 'ã‚“ã ': 606, 'ã‚“ã§': 798, 'カ月': 990, '会議': 860,
+ '入り': 1232, '大会': 2217, '始ã‚': 1681, '市': 965, 'æ–°èž': -5055,
+ 'æ—¥,': 974, 'æ—¥ã€': 974, '社会': 2024, 'カ月': 990}
+ TC1__ = {'AAA': 1093, 'HHH': 1029, 'HHM': 580, 'HII': 998, 'HOH': -390,
+ 'HOM': -331, 'IHI': 1169, 'IOH': -142, 'IOI': -1015, 'IOM': 467,
+ 'MMH': 187, 'OOI': -1832}
+ TC2__ = {'HHO': 2088, 'HII': -1023, 'HMM': -1154, 'IHI': -1965,
+ 'KKH': 703, 'OII': -2649}
+ TC3__ = {'AAA': -294, 'HHH': 346, 'HHI': -341, 'HII': -1088, 'HIK': 731,
+ 'HOH': -1486, 'IHH': 128, 'IHI': -3041, 'IHO': -1935, 'IIH': -825,
+ 'IIM': -1035, 'IOI': -542, 'KHH': -1216, 'KKA': 491, 'KKH': -1217,
+ 'KOK': -1009, 'MHH': -2694, 'MHM': -457, 'MHO': 123, 'MMH': -471,
+ 'NNH': -1689, 'NNO': 662, 'OHO': -3393}
+ TC4__ = {'HHH': -203, 'HHI': 1344, 'HHK': 365, 'HHM': -122, 'HHN': 182,
+ 'HHO': 669, 'HIH': 804, 'HII': 679, 'HOH': 446, 'IHH': 695,
+ 'IHO': -2324, 'IIH': 321, 'III': 1497, 'IIO': 656, 'IOO': 54,
+ 'KAK': 4845, 'KKA': 3386, 'KKK': 3065, 'MHH': -405, 'MHI': 201,
+ 'MMH': -241, 'MMM': 661, 'MOM': 841}
+ TQ1__ = {'BHHH': -227, 'BHHI': 316, 'BHIH': -132, 'BIHH': 60, 'BIII': 1595,
+ 'BNHH': -744, 'BOHH': 225, 'BOOO': -908, 'OAKK': 482, 'OHHH': 281,
+ 'OHIH': 249, 'OIHI': 200, 'OIIH': -68}
+ TQ2__ = {'BIHH': -1401, 'BIII': -1033, 'BKAK': -543, 'BOOO': -5591}
+ TQ3__ = {'BHHH': 478, 'BHHM': -1073, 'BHIH': 222, 'BHII': -504, 'BIIH': -116,
+ 'BIII': -105, 'BMHI': -863, 'BMHM': -464, 'BOMH': 620, 'OHHH': 346,
+ 'OHHI': 1729, 'OHII': 997, 'OHMH': 481, 'OIHH': 623, 'OIIH': 1344,
+ 'OKAK': 2792, 'OKHH': 587, 'OKKA': 679, 'OOHH': 110, 'OOII': -685}
+ TQ4__ = {'BHHH': -721, 'BHHM': -3604, 'BHII': -966, 'BIIH': -607, 'BIII': -2181,
+ 'OAAA': -2763, 'OAKK': 180, 'OHHH': -294, 'OHHI': 2446, 'OHHO': 480,
+ 'OHIH': -1573, 'OIHH': 1935, 'OIHI': -493, 'OIIH': 626, 'OIII': -4007,
+ 'OKAK': -8156}
+ TW1__ = {'ã«ã¤ã„': -4681, 'æ±äº¬éƒ½': 2026}
+ TW2__ = {'ã‚る程': -2049, 'ã„ã£ãŸ': -1256, 'ã“ã‚ãŒ': -2434, 'ã—ょã†': 3873,
+ 'ãã®å¾Œ': -4430, 'ã ã£ã¦': -1049, 'ã¦ã„ãŸ': 1833, 'ã¨ã—ã¦': -4657,
+ 'ã¨ã‚‚ã«': -4517, 'ã‚‚ã®ã§': 1882, '一気ã«': -792, 'åˆã‚ã¦': -1512,
+ 'åŒæ™‚ã«': -8097, '大ããª': -1255, '対ã—ã¦': -2721, '社会党': -3216}
+ TW3__ = {'ã„ãŸã ': -1734, 'ã—ã¦ã„': 1314, 'ã¨ã—ã¦': -4314, 'ã«ã¤ã„': -5483,
+ 'ã«ã¨ã£': -5989, 'ã«å½“ãŸ': -6247, 'ã®ã§,': -727, 'ã®ã§ã€': -727,
+ 'ã®ã‚‚ã®': -600, 'ã‚Œã‹ã‚‰': -3752, 'å二月': -2287}
+ TW4__ = {'ã„ã†.': 8576, 'ã„ã†ã€‚': 8576, 'ã‹ã‚‰ãª': -2348, 'ã—ã¦ã„': 2958,
+ 'ãŸãŒ,': 1516, 'ãŸãŒã€': 1516, 'ã¦ã„ã‚‹': 1538, 'ã¨ã„ã†': 1349,
+ 'ã¾ã—ãŸ': 5543, 'ã¾ã›ã‚“': 1097, 'よã†ã¨': -4258, 'よるã¨': 5865}
+ UC1__ = {'A': 484, 'K': 93, 'M': 645, 'O': -505}
+ UC2__ = {'A': 819, 'H': 1059, 'I': 409, 'M': 3987, 'N': 5775, 'O': 646}
+ UC3__ = {'A': -1370, 'I': 2311}
+ UC4__ = {'A': -2643, 'H': 1809, 'I': -1032, 'K': -3450, 'M': 3565,
+ 'N': 3876, 'O': 6646}
+ UC5__ = {'H': 313, 'I': -1238, 'K': -799, 'M': 539, 'O': -831}
+ UC6__ = {'H': -506, 'I': -253, 'K': 87, 'M': 247, 'O': -387}
+ UP1__ = {'O': -214}
+ UP2__ = {'B': 69, 'O': 935}
+ UP3__ = {'B': 189}
+ UQ1__ = {'BH': 21, 'BI': -12, 'BK': -99, 'BN': 142, 'BO': -56, 'OH': -95,
+ 'OI': 477, 'OK': 410, 'OO': -2422}
+ UQ2__ = {'BH': 216, 'BI': 113, 'OK': 1759}
+ UQ3__ = {'BA': -479, 'BH': 42, 'BI': 1913, 'BK': -7198, 'BM': 3160,
+ 'BN': 6427, 'BO': 14761, 'OI': -827, 'ON': -3212}
+ UW1__ = {',': 156, 'ã€': 156, '「': -463, 'ã‚': -941, 'ã†': -127, 'ãŒ': -553,
+ 'ã': 121, 'ã“': 505, 'ã§': -201, 'ã¨': -547, 'ã©': -123, 'ã«': -789,
+ 'ã®': -185, 'ã¯': -847, 'ã‚‚': -466, 'ã‚„': -470, 'よ': 182, 'ら': -292,
+ 'り': 208, 'れ': 169, 'を': -446, 'ん': -137, '・': -135, '主': -402,
+ '京': -268, '区': -912, 'åˆ': 871, '国': -460, '大': 561, '委': 729,
+ '市': -411, 'æ—¥': -141, 'ç†': 361, '生': -408, '県': -386, '都': -718,
+ 'ï½¢': -463, 'ï½¥': -135}
+ UW2__ = {',': -829, 'ã€': -829, '〇': 892, '「': -645, 'ã€': 3145, 'ã‚': -538,
+ 'ã„': 505, 'ã†': 134, 'ãŠ': -502, 'ã‹': 1454, 'ãŒ': -856, 'ã': -412,
+ 'ã“': 1141, 'ã•': 878, 'ã–': 540, 'ã—': 1529, 'ã™': -675, 'ã›': 300,
+ 'ã': -1011, 'ãŸ': 188, 'ã ': 1837, 'ã¤': -949, 'ã¦': -291, 'ã§': -268,
+ 'ã¨': -981, 'ã©': 1273, 'ãª': 1063, 'ã«': -1764, 'ã®': 130, 'ã¯': -409,
+ 'ã²': -1273, 'ã¹': 1261, 'ã¾': 600, 'ã‚‚': -1263, 'ã‚„': -402, 'よ': 1639,
+ 'り': -579, 'る': -694, 'れ': 571, 'を': -2516, 'ん': 2095, 'ア': -587,
+ 'ã‚«': 306, 'ã‚­': 568, 'ッ': 831, '三': -758, 'ä¸': -2150, '世': -302,
+ '中': -968, '主': -861, '事': 492, '人': -123, '会': 978, 'ä¿': 362,
+ 'å…¥': 548, 'åˆ': -3025, '副': -1566, '北': -3414, '区': -422, '大': -1769,
+ '天': -865, '太': -483, 'å­': -1519, 'å­¦': 760, '実': 1023, 'å°': -2009,
+ '市': -813, 'å¹´': -1060, 'å¼·': 1067, '手': -1519, 'æº': -1033, '政': 1522,
+ 'æ–‡': -1355, 'æ–°': -1682, 'æ—¥': -1815, '明': -1462, '最': -630, 'æœ': -1843,
+ '本': -1650, 'æ±': -931, 'æžœ': -665, '次': -2378, 'æ°‘': -180, 'æ°—': -1740,
+ 'ç†': 752, '発': 529, 'ç›®': -1584, '相': -242, '県': -1165, 'ç«‹': -763,
+ '第': 810, '米': 509, '自': -1353, '行': 838, '西': -744, '見': -3874,
+ '調': 1010, '議': 1198, '込': 3041, '開': 1758, '間': -1257, '「': -645,
+ '」': 3145, 'ッ': 831, 'ア': -587, 'カ': 306, 'キ': 568}
+ UW3__ = {',': 4889, '1': -800, '−': -1723, 'ã€': 4889, '々': -2311, '〇': 5827,
+ 'ã€': 2670, '〓': -3573, 'ã‚': -2696, 'ã„': 1006, 'ã†': 2342, 'ãˆ': 1983,
+ 'ãŠ': -4864, 'ã‹': -1163, 'ãŒ': 3271, 'ã': 1004, 'ã‘': 388, 'ã’': 401,
+ 'ã“': -3552, 'ã”': -3116, 'ã•': -1058, 'ã—': -395, 'ã™': 584, 'ã›': 3685,
+ 'ã': -5228, 'ãŸ': 842, 'ã¡': -521, 'ã£': -1444, 'ã¤': -1081, 'ã¦': 6167,
+ 'ã§': 2318, 'ã¨': 1691, 'ã©': -899, 'ãª': -2788, 'ã«': 2745, 'ã®': 4056,
+ 'ã¯': 4555, 'ã²': -2171, 'ãµ': -1798, 'ã¸': 1199, 'ã»': -5516, 'ã¾': -4384,
+ 'ã¿': -120, 'ã‚': 1205, 'ã‚‚': 2323, 'ã‚„': -788, 'よ': -202, 'ら': 727,
+ 'ã‚Š': 649, 'ã‚‹': 5905, 'ã‚Œ': 2773, 'ã‚': -1207, 'ã‚’': 6620, 'ã‚“': -518,
+ 'ア': 551, 'グ': 1319, 'ス': 874, 'ッ': -1350, 'ト': 521, 'ム': 1109,
+ 'ル': 1591, 'ロ': 2201, 'ン': 278, '・': -3794, '一': -1619, '下': -1759,
+ '世': -2087, '両': 3815, '中': 653, '主': -758, '予': -1193, '二': 974,
+ '人': 2742, '今': 792, '他': 1889, '以': -1368, '低': 811, '何': 4265,
+ '作': -361, 'ä¿': -2439, 'å…ƒ': 4858, 'å…š': 3593, 'å…¨': 1574, 'å…¬': -3030,
+ 'å…­': 755, 'å…±': -1880, '円': 5807, 'å†': 3095, '分': 457, 'åˆ': 2475,
+ '別': 1129, 'å‰': 2286, '副': 4437, '力': 365, 'å‹•': -949, 'å‹™': -1872,
+ '化': 1327, '北': -1038, '区': 4646, 'åƒ': -2309, 'åˆ': -783, 'å”': -1006,
+ 'å£': 483, 'å³': 1233, 'å„': 3588, 'åˆ': -241, 'åŒ': 3906, 'å’Œ': -837,
+ '員': 4513, '国': 642, '型': 1389, '場': 1219, '外': -241, '妻': 2016,
+ 'å­¦': -1356, '安': -423, '実': -1008, '家': 1078, 'å°': -513, 'å°‘': -3102,
+ '州': 1155, '市': 3197, '平': -1804, '年': 2416, '広': -1030, '府': 1605,
+ '度': 1452, '建': -2352, '当': -3885, 'å¾—': 1905, 'æ€': -1291, '性': 1822,
+ '戸': -488, '指': -3973, '政': -2013, '教': -1479, '数': 3222, '文': -1489,
+ '新': 1764, '日': 2099, '旧': 5792, '昨': -661, '時': -1248, '曜': -951,
+ '最': -937, '月': 4125, '期': 360, 'æŽ': 3094, 'æ‘': 364, 'æ±': -805,
+ 'æ ¸': 5156, '森': 2438, '業': 484, 'æ°': 2613, 'æ°‘': -1694, '決': -1073,
+ '法': 1868, '海': -495, '無': 979, '物': 461, '特': -3850, '生': -273,
+ '用': 914, '町': 1215, 'çš„': 7313, 'ç›´': -1835, 'çœ': 792, '県': 6293,
+ '知': -1528, 'ç§': 4231, '税': 401, 'ç«‹': -960, '第': 1201, 'ç±³': 7767,
+ 'ç³»': 3066, 'ç´„': 3663, 'ç´š': 1384, 'çµ±': -4229, 'ç·': 1163, 'ç·š': 1255,
+ '者': 6457, '能': 725, '自': -2869, '英': 785, '見': 1044, '調': -562,
+ '財': -733, 'è²»': 1777, '車': 1835, 'è»': 1375, 'è¾¼': -1504, '通': -1136,
+ 'é¸': -681, '郎': 1026, '郡': 4404, '部': 1200, '金': 2163, 'é•·': 421,
+ 'é–‹': -1432, 'é–“': 1302, 'é–¢': -1282, '雨': 2009, 'é›»': -1045, 'éž': 2066,
+ '駅': 1620, '1': -800, '」': 2670, '・': -3794, 'ッ': -1350, 'ア': 551,
+ 'グ': 1319, 'ï½½': 874, 'ト': 521, 'ム': 1109, 'ï¾™': 1591, 'ï¾›': 2201, 'ï¾': 278}
+ UW4__ = {',': 3930, '.': 3508, '―': -4841, 'ã€': 3930, '。': 3508, '〇': 4999,
+ '「': 1895, 'ã€': 3798, '〓': -5156, 'ã‚': 4752, 'ã„': -3435, 'ã†': -640,
+ 'ãˆ': -2514, 'ãŠ': 2405, 'ã‹': 530, 'ãŒ': 6006, 'ã': -4482, 'ãŽ': -3821,
+ 'ã': -3788, 'ã‘': -4376, 'ã’': -4734, 'ã“': 2255, 'ã”': 1979, 'ã•': 2864,
+ 'ã—': -843, 'ã˜': -2506, 'ã™': -731, 'ãš': 1251, 'ã›': 181, 'ã': 4091,
+ 'ãŸ': 5034, 'ã ': 5408, 'ã¡': -3654, 'ã£': -5882, 'ã¤': -1659, 'ã¦': 3994,
+ 'ã§': 7410, 'ã¨': 4547, 'ãª': 5433, 'ã«': 6499, 'ã¬': 1853, 'ã­': 1413,
+ 'ã®': 7396, 'ã¯': 8578, 'ã°': 1940, 'ã²': 4249, 'ã³': -4134, 'ãµ': 1345,
+ 'ã¸': 6665, 'ã¹': -744, 'ã»': 1464, 'ã¾': 1051, 'ã¿': -2082, 'ã‚€': -882,
+ 'ã‚': -5046, 'ã‚‚': 4169, 'ゃ': -2666, 'ã‚„': 2795, 'ょ': -1544, 'よ': 3351,
+ 'ら': -2922, 'ã‚Š': -9726, 'ã‚‹': -14896, 'ã‚Œ': -2613, 'ã‚': -4570,
+ 'ã‚': -1783, 'ã‚’': 13150, 'ã‚“': -2352, 'ã‚«': 2145, 'コ': 1789, 'ã‚»': 1287,
+ 'ッ': -724, 'ト': -403, 'メ': -1635, 'ラ': -881, 'リ': -541, 'ル': -856,
+ 'ン': -3637, '・': -4371, 'ー': -11870, '一': -2069, '中': 2210, '予': 782,
+ '事': -190, '井': -1768, '人': 1036, '以': 544, '会': 950, '体': -1286,
+ '作': 530, 'å´': 4292, 'å…ˆ': 601, 'å…š': -2006, 'å…±': -1212, '内': 584,
+ '円': 788, 'åˆ': 1347, 'å‰': 1623, '副': 3879, '力': -302, 'å‹•': -740,
+ 'å‹™': -2715, '化': 776, '区': 4517, 'å”': 1013, 'å‚': 1555, 'åˆ': -1834,
+ '和': -681, '員': -910, '器': -851, '回': 1500, '国': -619, '園': -1200,
+ '地': 866, 'å ´': -1410, 'å¡': -2094, '士': -1413, '多': 1067, '大': 571,
+ 'å­': -4802, 'å­¦': -1397, '定': -1057, '寺': -809, 'å°': 1910, '屋': -1328,
+ 'å±±': -1500, '島': -2056, 'å·': -2667, '市': 2771, 'å¹´': 374, 'åº': -4556,
+ '後': 456, '性': 553, '感': 916, '所': -1566, '支': 856, '改': 787,
+ '政': 2182, '教': 704, '文': 522, '方': -856, '日': 1798, '時': 1829,
+ '最': 845, '月': -9066, '木': -485, 'æ¥': -442, 'æ ¡': -360, '業': -1043,
+ 'æ°': 5388, 'æ°‘': -2716, 'æ°—': -910, 'æ²¢': -939, '済': -543, '物': -735,
+ '率': 672, 'çƒ': -1267, '生': -1286, '産': -1101, 'ç”°': -2900, '町': 1826,
+ 'çš„': 2586, 'ç›®': 922, 'çœ': -3485, '県': 2997, '空': -867, 'ç«‹': -2112,
+ '第': 788, '米': 2937, '系': 786, '約': 2171, '経': 1146, '統': -1169,
+ 'ç·': 940, 'ç·š': -994, 'ç½²': 749, '者': 2145, '能': -730, '般': -852,
+ 'è¡Œ': -792, 'è¦': 792, 'è­¦': -1184, 'è­°': -244, 'è°·': -1000, '賞': 730,
+ '車': -1481, 'è»': 1158, '輪': -1433, 'è¾¼': -3370, 'è¿‘': 929, 'é“': -1291,
+ 'é¸': 2596, '郎': -4866, '都': 1192, '野': -1100, '銀': -2213, 'é•·': 357,
+ '間': -2344, '院': -2297, '際': -2604, '電': -878, '領': -1659, '題': -792,
+ '館': -1984, '首': 1749, '高': 2120, '「': 1895, '」': 3798, '・': -4371,
+ 'ッ': -724, 'ー': -11870, 'カ': 2145, 'コ': 1789, 'セ': 1287, 'ト': -403,
+ 'ï¾’': -1635, 'ï¾—': -881, 'リ': -541, 'ï¾™': -856, 'ï¾': -3637}
+ UW5__ = {',': 465, '.': -299, '1': -514, 'E2': -32768, ']': -2762, 'ã€': 465,
+ '。': -299, '「': 363, 'ã‚': 1655, 'ã„': 331, 'ã†': -503, 'ãˆ': 1199,
+ 'ãŠ': 527, 'ã‹': 647, 'ãŒ': -421, 'ã': 1624, 'ãŽ': 1971, 'ã': 312,
+ 'ã’': -983, 'ã•': -1537, 'ã—': -1371, 'ã™': -852, 'ã ': -1186, 'ã¡': 1093,
+ 'ã£': 52, 'ã¤': 921, 'ã¦': -18, 'ã§': -850, 'ã¨': -127, 'ã©': 1682,
+ 'ãª': -787, 'ã«': -1224, 'ã®': -635, 'ã¯': -578, 'ã¹': 1001, 'ã¿': 502,
+ 'ã‚': 865, 'ゃ': 3350, 'ょ': 854, 'ã‚Š': -208, 'ã‚‹': 429, 'ã‚Œ': 504,
+ 'ã‚': 419, 'ã‚’': -1264, 'ã‚“': 327, 'イ': 241, 'ル': 451, 'ン': -343,
+ '中': -871, '京': 722, '会': -1153, '党': -654, '務': 3519, '区': -901,
+ 'å‘Š': 848, 'å“¡': 2104, '大': -1296, 'å­¦': -548, '定': 1785, 'åµ': -1304,
+ '市': -2991, '席': 921, 'å¹´': 1763, 'æ€': 872, '所': -814, '挙': 1618,
+ '新': -1682, '日': 218, '月': -4353, '査': 932, '格': 1356, '機': -1508,
+ 'æ°': -1347, 'ç”°': 240, '町': -3912, 'çš„': -3149, '相': 1319, 'çœ': -1052,
+ '県': -4003, '研': -997, '社': -278, '空': -813, '統': 1955, '者': -2233,
+ '表': 663, '語': -1073, 'è­°': 1219, 'é¸': -1018, '郎': -368, 'é•·': 786,
+ '間': 1191, '題': 2368, '館': -689, '1': -514, 'E2': -32768, '「': 363,
+ 'ï½²': 241, 'ï¾™': 451, 'ï¾': -343}
+ UW6__ = {',': 227, '.': 808, '1': -270, 'E1': 306, 'ã€': 227, '。': 808,
+ 'ã‚': -307, 'ã†': 189, 'ã‹': 241, 'ãŒ': -73, 'ã': -121, 'ã“': -200,
+ 'ã˜': 1782, 'ã™': 383, 'ãŸ': -428, 'ã£': 573, 'ã¦': -1014, 'ã§': 101,
+ 'ã¨': -105, 'ãª': -253, 'ã«': -149, 'ã®': -417, 'ã¯': -236, 'ã‚‚': -206,
+ 'り': 187, 'る': -135, 'を': 195, 'ル': -673, 'ン': -496, '一': -277,
+ '中': 201, '件': -800, '会': 624, 'å‰': 302, '区': 1792, 'å“¡': -1212,
+ '委': 798, '学': -960, '市': 887, '広': -695, '後': 535, '業': -697,
+ '相': 753, '社': -507, 'ç¦': 974, '空': -822, '者': 1811, '連': 463,
+ '郎': 1082, '1': -270, 'E1': 306, 'ï¾™': -673, 'ï¾': -496}
+
+ # ctype_
+ def ctype_(self, char: str) -> str:
+ for pattern, value in self.patterns_.items():
+ if pattern.match(char):
+ return value
+ return 'O'
+
+ # ts_
+ def ts_(self, dict: dict[str, int], key: str) -> int:
+ if key in dict:
+ return dict[key]
+ return 0
+
+ # segment
+ def split(self, input: str) -> list[str]:
+ if not input:
+ return []
+
+ result = []
+ seg = ['B3', 'B2', 'B1']
+ ctype = ['O', 'O', 'O']
+ for t in input:
+ seg.append(t)
+ ctype.append(self.ctype_(t))
+ seg.append('E1')
+ seg.append('E2')
+ seg.append('E3')
+ ctype.append('O')
+ ctype.append('O')
+ ctype.append('O')
+ word = seg[3]
+ p1 = 'U'
+ p2 = 'U'
+ p3 = '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 = 'O'
+ if score > 0:
+ result.append(word.strip())
+ word = ''
+ p = 'B'
+ p1 = p2
+ p2 = p3
+ p3 = p
+ word += seg[i]
+
+ result.append(word.strip())
+ return result
+
+
+class SearchJapanese(SearchLanguage):
+ """
+ Japanese search implementation: uses no stemmer, but word splitting is quite
+ complicated.
+ """
+ lang = 'ja'
+ language_name = 'Japanese'
+
+ def init(self, options: dict) -> None:
+ dotted_path = options.get('type', 'sphinx.search.ja.DefaultSplitter')
+ try:
+ self.splitter = import_object(dotted_path)(options)
+ except ExtensionError as exc:
+ raise ExtensionError("Splitter module %r can't be imported" %
+ dotted_path) from exc
+
+ def split(self, input: str) -> list[str]:
+ return self.splitter.split(input)
+
+ def word_filter(self, stemmed_word: str) -> bool:
+ return len(stemmed_word) > 1
+
+ def stem(self, word: str) -> str:
+ return word
diff --git a/sphinx/search/minified-js/base-stemmer.js b/sphinx/search/minified-js/base-stemmer.js
new file mode 100644
index 0000000..0822908
--- /dev/null
+++ b/sphinx/search/minified-js/base-stemmer.js
@@ -0,0 +1 @@
+BaseStemmer=function(){this.setCurrent=function(r){this.current=r;this.cursor=0;this.limit=this.current.length;this.limit_backward=0;this.bra=this.cursor;this.ket=this.limit};this.getCurrent=function(){return this.current};this.copy_from=function(r){this.current=r.current;this.cursor=r.cursor;this.limit=r.limit;this.limit_backward=r.limit_backward;this.bra=r.bra;this.ket=r.ket};this.in_grouping=function(r,t,i){if(this.cursor>=this.limit)return false;var s=this.current.charCodeAt(this.cursor);if(s>i||s<t)return false;s-=t;if((r[s>>>3]&1<<(s&7))==0)return false;this.cursor++;return true};this.in_grouping_b=function(r,t,i){if(this.cursor<=this.limit_backward)return false;var s=this.current.charCodeAt(this.cursor-1);if(s>i||s<t)return false;s-=t;if((r[s>>>3]&1<<(s&7))==0)return false;this.cursor--;return true};this.out_grouping=function(r,t,i){if(this.cursor>=this.limit)return false;var s=this.current.charCodeAt(this.cursor);if(s>i||s<t){this.cursor++;return true}s-=t;if((r[s>>>3]&1<<(s&7))==0){this.cursor++;return true}return false};this.out_grouping_b=function(r,t,i){if(this.cursor<=this.limit_backward)return false;var s=this.current.charCodeAt(this.cursor-1);if(s>i||s<t){this.cursor--;return true}s-=t;if((r[s>>>3]&1<<(s&7))==0){this.cursor--;return true}return false};this.eq_s=function(r){if(this.limit-this.cursor<r.length)return false;if(this.current.slice(this.cursor,this.cursor+r.length)!=r){return false}this.cursor+=r.length;return true};this.eq_s_b=function(r){if(this.cursor-this.limit_backward<r.length)return false;if(this.current.slice(this.cursor-r.length,this.cursor)!=r){return false}this.cursor-=r.length;return true};this.find_among=function(r){var t=0;var i=r.length;var s=this.cursor;var e=this.limit;var h=0;var u=0;var n=false;while(true){var c=t+(i-t>>>1);var a=0;var f=h<u?h:u;var l=r[c];var o;for(o=f;o<l[0].length;o++){if(s+f==e){a=-1;break}a=this.current.charCodeAt(s+f)-l[0].charCodeAt(o);if(a!=0)break;f++}if(a<0){i=c;u=f}else{t=c;h=f}if(i-t<=1){if(t>0)break;if(i==t)break;if(n)break;n=true}}do{var l=r[t];if(h>=l[0].length){this.cursor=s+l[0].length;if(l.length<4)return l[2];var v=l[3](this);this.cursor=s+l[0].length;if(v)return l[2]}t=l[1]}while(t>=0);return 0};this.find_among_b=function(r){var t=0;var i=r.length;var s=this.cursor;var e=this.limit_backward;var h=0;var u=0;var n=false;while(true){var c=t+(i-t>>1);var a=0;var f=h<u?h:u;var l=r[c];var o;for(o=l[0].length-1-f;o>=0;o--){if(s-f==e){a=-1;break}a=this.current.charCodeAt(s-1-f)-l[0].charCodeAt(o);if(a!=0)break;f++}if(a<0){i=c;u=f}else{t=c;h=f}if(i-t<=1){if(t>0)break;if(i==t)break;if(n)break;n=true}}do{var l=r[t];if(h>=l[0].length){this.cursor=s-l[0].length;if(l.length<4)return l[2];var v=l[3](this);this.cursor=s-l[0].length;if(v)return l[2]}t=l[1]}while(t>=0);return 0};this.replace_s=function(r,t,i){var s=i.length-(t-r);this.current=this.current.slice(0,r)+i+this.current.slice(t);this.limit+=s;if(this.cursor>=t)this.cursor+=s;else if(this.cursor>r)this.cursor=r;return s};this.slice_check=function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>this.current.length){return false}return true};this.slice_from=function(r){var t=false;if(this.slice_check()){this.replace_s(this.bra,this.ket,r);t=true}return t};this.slice_del=function(){return this.slice_from("")};this.insert=function(r,t,i){var s=this.replace_s(r,t,i);if(r<=this.bra)this.bra+=s;if(r<=this.ket)this.ket+=s};this.slice_to=function(){var r="";if(this.slice_check()){r=this.current.slice(this.bra,this.ket)}return r};this.assign_to=function(){return this.current.slice(0,this.limit)}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/danish-stemmer.js b/sphinx/search/minified-js/danish-stemmer.js
new file mode 100644
index 0000000..f3fc600
--- /dev/null
+++ b/sphinx/search/minified-js/danish-stemmer.js
@@ -0,0 +1 @@
+DanishStemmer=function(){var r=new BaseStemmer;var e=[["hed",-1,1],["ethed",0,1],["ered",-1,1],["e",-1,1],["erede",3,1],["ende",3,1],["erende",5,1],["ene",3,1],["erne",3,1],["ere",3,1],["en",-1,1],["heden",10,1],["eren",10,1],["er",-1,1],["heder",13,1],["erer",13,1],["s",-1,2],["heds",16,1],["es",16,1],["endes",18,1],["erendes",19,1],["enes",18,1],["ernes",18,1],["eres",18,1],["ens",16,1],["hedens",24,1],["erens",24,1],["ers",16,1],["ets",16,1],["erets",28,1],["et",-1,1],["eret",30,1]];var i=[["gd",-1,-1],["dt",-1,-1],["gt",-1,-1],["kt",-1,-1]];var s=[["ig",-1,1],["lig",0,1],["elig",1,1],["els",-1,1],["løst",-1,2]];var t=[119,223,119,1];var a=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128];var u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16];var c=0;var l=0;var n="";function o(){l=r.limit;var e=r.cursor;{var i=r.cursor+3;if(i>r.limit){return false}r.cursor=i}c=r.cursor;r.cursor=e;r:while(true){var s=r.cursor;e:{if(!r.in_grouping(a,97,248)){break e}r.cursor=s;break r}r.cursor=s;if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){e:{if(!r.out_grouping(a,97,248)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}l=r.cursor;r:{if(!(l<c)){break r}l=c}return true}function f(){var i;if(r.cursor<l){return false}var s=r.limit_backward;r.limit_backward=l;r.ket=r.cursor;i=r.find_among_b(e);if(i==0){r.limit_backward=s;return false}r.bra=r.cursor;r.limit_backward=s;switch(i){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.in_grouping_b(u,97,229)){return false}if(!r.slice_del()){return false}break}return true}function m(){var e=r.limit-r.cursor;if(r.cursor<l){return false}var s=r.limit_backward;r.limit_backward=l;r.ket=r.cursor;if(r.find_among_b(i)==0){r.limit_backward=s;return false}r.bra=r.cursor;r.limit_backward=s;r.cursor=r.limit-e;if(r.cursor<=r.limit_backward){return false}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}return true}function _(){var e;var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("st")){break r}r.bra=r.cursor;if(!r.eq_s_b("ig")){break r}if(!r.slice_del()){return false}}r.cursor=r.limit-i;if(r.cursor<l){return false}var t=r.limit_backward;r.limit_backward=l;r.ket=r.cursor;e=r.find_among_b(s);if(e==0){r.limit_backward=t;return false}r.bra=r.cursor;r.limit_backward=t;switch(e){case 1:if(!r.slice_del()){return false}var a=r.limit-r.cursor;m();r.cursor=r.limit-a;break;case 2:if(!r.slice_from("løs")){return false}break}return true}function b(){if(r.cursor<l){return false}var e=r.limit_backward;r.limit_backward=l;r.ket=r.cursor;if(!r.in_grouping_b(t,98,122)){r.limit_backward=e;return false}r.bra=r.cursor;n=r.slice_to();if(n==""){return false}r.limit_backward=e;if(!r.eq_s_b(n)){return false}if(!r.slice_del()){return false}return true}this.stem=function(){var e=r.cursor;o();r.cursor=e;r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;f();r.cursor=r.limit-i;var s=r.limit-r.cursor;m();r.cursor=r.limit-s;var t=r.limit-r.cursor;_();r.cursor=r.limit-t;var a=r.limit-r.cursor;b();r.cursor=r.limit-a;r.cursor=r.limit_backward;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/dutch-stemmer.js b/sphinx/search/minified-js/dutch-stemmer.js
new file mode 100644
index 0000000..addbc77
--- /dev/null
+++ b/sphinx/search/minified-js/dutch-stemmer.js
@@ -0,0 +1 @@
+DutchStemmer=function(){var r=new BaseStemmer;var e=[["",-1,6],["á",0,1],["ä",0,1],["é",0,2],["ë",0,2],["í",0,3],["ï",0,3],["ó",0,4],["ö",0,4],["ú",0,5],["ü",0,5]];var i=[["",-1,3],["I",0,2],["Y",0,1]];var u=[["dd",-1,-1],["kk",-1,-1],["tt",-1,-1]];var s=[["ene",-1,2],["se",-1,3],["en",-1,2],["heden",2,1],["s",-1,3]];var a=[["end",-1,1],["ig",-1,2],["ing",-1,1],["lijk",-1,3],["baar",-1,4],["bar",-1,5]];var t=[["aa",-1,-1],["ee",-1,-1],["oo",-1,-1],["uu",-1,-1]];var c=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128];var o=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128];var f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128];var l=0;var n=0;var b=false;function k(){var i;var u=r.cursor;while(true){var s=r.cursor;r:{r.bra=r.cursor;i=r.find_among(e);if(i==0){break r}r.ket=r.cursor;switch(i){case 1:if(!r.slice_from("a")){return false}break;case 2:if(!r.slice_from("e")){return false}break;case 3:if(!r.slice_from("i")){return false}break;case 4:if(!r.slice_from("o")){return false}break;case 5:if(!r.slice_from("u")){return false}break;case 6:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=s;break}r.cursor=u;var a=r.cursor;r:{r.bra=r.cursor;if(!r.eq_s("y")){r.cursor=a;break r}r.ket=r.cursor;if(!r.slice_from("Y")){return false}}while(true){var t=r.cursor;r:{e:while(true){var o=r.cursor;i:{if(!r.in_grouping(c,97,232)){break i}r.bra=r.cursor;u:{var f=r.cursor;s:{if(!r.eq_s("i")){break s}r.ket=r.cursor;if(!r.in_grouping(c,97,232)){break s}if(!r.slice_from("I")){return false}break u}r.cursor=f;if(!r.eq_s("y")){break i}r.ket=r.cursor;if(!r.slice_from("Y")){return false}}r.cursor=o;break e}r.cursor=o;if(r.cursor>=r.limit){break r}r.cursor++}continue}r.cursor=t;break}return true}function _(){n=r.limit;l=r.limit;r:while(true){e:{if(!r.in_grouping(c,97,232)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){e:{if(!r.out_grouping(c,97,232)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}n=r.cursor;r:{if(!(n<3)){break r}n=3}r:while(true){e:{if(!r.in_grouping(c,97,232)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){e:{if(!r.out_grouping(c,97,232)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}l=r.cursor;return true}function m(){var e;while(true){var u=r.cursor;r:{r.bra=r.cursor;e=r.find_among(i);if(e==0){break r}r.ket=r.cursor;switch(e){case 1:if(!r.slice_from("y")){return false}break;case 2:if(!r.slice_from("i")){return false}break;case 3:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=u;break}return true}function v(){if(!(n<=r.cursor)){return false}return true}function g(){if(!(l<=r.cursor)){return false}return true}function d(){var e=r.limit-r.cursor;if(r.find_among_b(u)==0){return false}r.cursor=r.limit-e;r.ket=r.cursor;if(r.cursor<=r.limit_backward){return false}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}return true}function h(){b=false;r.ket=r.cursor;if(!r.eq_s_b("e")){return false}r.bra=r.cursor;if(!v()){return false}var e=r.limit-r.cursor;if(!r.out_grouping_b(c,97,232)){return false}r.cursor=r.limit-e;if(!r.slice_del()){return false}b=true;if(!d()){return false}return true}function w(){if(!v()){return false}var e=r.limit-r.cursor;if(!r.out_grouping_b(c,97,232)){return false}r.cursor=r.limit-e;{var i=r.limit-r.cursor;r:{if(!r.eq_s_b("gem")){break r}return false}r.cursor=r.limit-i}if(!r.slice_del()){return false}if(!d()){return false}return true}function p(){var e;var i=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(s);if(e==0){break r}r.bra=r.cursor;switch(e){case 1:if(!v()){break r}if(!r.slice_from("heid")){return false}break;case 2:if(!w()){break r}break;case 3:if(!v()){break r}if(!r.out_grouping_b(f,97,232)){break r}if(!r.slice_del()){return false}break}}r.cursor=r.limit-i;var u=r.limit-r.cursor;h();r.cursor=r.limit-u;var l=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("heid")){break r}r.bra=r.cursor;if(!g()){break r}{var n=r.limit-r.cursor;e:{if(!r.eq_s_b("c")){break e}break r}r.cursor=r.limit-n}if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("en")){break r}r.bra=r.cursor;if(!w()){break r}}r.cursor=r.limit-l;var k=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(a);if(e==0){break r}r.bra=r.cursor;switch(e){case 1:if(!g()){break r}if(!r.slice_del()){return false}e:{var _=r.limit-r.cursor;i:{r.ket=r.cursor;if(!r.eq_s_b("ig")){break i}r.bra=r.cursor;if(!g()){break i}{var m=r.limit-r.cursor;u:{if(!r.eq_s_b("e")){break u}break i}r.cursor=r.limit-m}if(!r.slice_del()){return false}break e}r.cursor=r.limit-_;if(!d()){break r}}break;case 2:if(!g()){break r}{var p=r.limit-r.cursor;e:{if(!r.eq_s_b("e")){break e}break r}r.cursor=r.limit-p}if(!r.slice_del()){return false}break;case 3:if(!g()){break r}if(!r.slice_del()){return false}if(!h()){break r}break;case 4:if(!g()){break r}if(!r.slice_del()){return false}break;case 5:if(!g()){break r}if(!b){break r}if(!r.slice_del()){return false}break}}r.cursor=r.limit-k;var q=r.limit-r.cursor;r:{if(!r.out_grouping_b(o,73,232)){break r}var y=r.limit-r.cursor;if(r.find_among_b(t)==0){break r}if(!r.out_grouping_b(c,97,232)){break r}r.cursor=r.limit-y;r.ket=r.cursor;if(r.cursor<=r.limit_backward){break r}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}}r.cursor=r.limit-q;return true}this.stem=function(){var e=r.cursor;k();r.cursor=e;var i=r.cursor;_();r.cursor=i;r.limit_backward=r.cursor;r.cursor=r.limit;p();r.cursor=r.limit_backward;var u=r.cursor;m();r.cursor=u;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/finnish-stemmer.js b/sphinx/search/minified-js/finnish-stemmer.js
new file mode 100644
index 0000000..f6301fd
--- /dev/null
+++ b/sphinx/search/minified-js/finnish-stemmer.js
@@ -0,0 +1 @@
+FinnishStemmer=function(){var r=new BaseStemmer;var i=[["pa",-1,1],["sti",-1,2],["kaan",-1,1],["han",-1,1],["kin",-1,1],["hän",-1,1],["kään",-1,1],["ko",-1,1],["pä",-1,1],["kö",-1,1]];var e=[["lla",-1,-1],["na",-1,-1],["ssa",-1,-1],["ta",-1,-1],["lta",3,-1],["sta",3,-1]];var a=[["llä",-1,-1],["nä",-1,-1],["ssä",-1,-1],["tä",-1,-1],["ltä",3,-1],["stä",3,-1]];var s=[["lle",-1,-1],["ine",-1,-1]];var t=[["nsa",-1,3],["mme",-1,3],["nne",-1,3],["ni",-1,2],["si",-1,1],["an",-1,4],["en",-1,6],["än",-1,5],["nsä",-1,3]];var u=[["aa",-1,-1],["ee",-1,-1],["ii",-1,-1],["oo",-1,-1],["uu",-1,-1],["ää",-1,-1],["öö",-1,-1]];var l=[["a",-1,8],["lla",0,-1],["na",0,-1],["ssa",0,-1],["ta",0,-1],["lta",4,-1],["sta",4,-1],["tta",4,2],["lle",-1,-1],["ine",-1,-1],["ksi",-1,-1],["n",-1,7],["han",11,1],["den",11,-1,S],["seen",11,-1,C],["hen",11,2],["tten",11,-1,S],["hin",11,3],["siin",11,-1,S],["hon",11,4],["hän",11,5],["hön",11,6],["ä",-1,8],["llä",22,-1],["nä",22,-1],["ssä",22,-1],["tä",22,-1],["ltä",26,-1],["stä",26,-1],["ttä",26,2]];var c=[["eja",-1,-1],["mma",-1,1],["imma",1,-1],["mpa",-1,1],["impa",3,-1],["mmi",-1,1],["immi",5,-1],["mpi",-1,1],["impi",7,-1],["ejä",-1,-1],["mmä",-1,1],["immä",10,-1],["mpä",-1,1],["impä",12,-1]];var n=[["i",-1,-1],["j",-1,-1]];var f=[["mma",-1,1],["imma",0,-1]];var o=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8];var b=[119,223,119,1];var _=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32];var m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32];var k=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32];var d=false;var v="";var w=0;var g=0;function p(){g=r.limit;w=r.limit;r:while(true){var i=r.cursor;i:{if(!r.in_grouping(_,97,246)){break i}r.cursor=i;break r}r.cursor=i;if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){i:{if(!r.out_grouping(_,97,246)){break i}break r}if(r.cursor>=r.limit){return false}r.cursor++}g=r.cursor;r:while(true){var e=r.cursor;i:{if(!r.in_grouping(_,97,246)){break i}r.cursor=e;break r}r.cursor=e;if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){i:{if(!r.out_grouping(_,97,246)){break i}break r}if(r.cursor>=r.limit){return false}r.cursor++}w=r.cursor;return true}function h(){if(!(w<=r.cursor)){return false}return true}function q(){var e;if(r.cursor<g){return false}var a=r.limit_backward;r.limit_backward=g;r.ket=r.cursor;e=r.find_among_b(i);if(e==0){r.limit_backward=a;return false}r.bra=r.cursor;r.limit_backward=a;switch(e){case 1:if(!r.in_grouping_b(k,97,246)){return false}break;case 2:if(!h()){return false}break}if(!r.slice_del()){return false}return true}function j(){var i;if(r.cursor<g){return false}var u=r.limit_backward;r.limit_backward=g;r.ket=r.cursor;i=r.find_among_b(t);if(i==0){r.limit_backward=u;return false}r.bra=r.cursor;r.limit_backward=u;switch(i){case 1:{var l=r.limit-r.cursor;r:{if(!r.eq_s_b("k")){break r}return false}r.cursor=r.limit-l}if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("kse")){return false}r.bra=r.cursor;if(!r.slice_from("ksi")){return false}break;case 3:if(!r.slice_del()){return false}break;case 4:if(r.find_among_b(e)==0){return false}if(!r.slice_del()){return false}break;case 5:if(r.find_among_b(a)==0){return false}if(!r.slice_del()){return false}break;case 6:if(r.find_among_b(s)==0){return false}if(!r.slice_del()){return false}break}return true}function C(){if(r.find_among_b(u)==0){return false}return true}function S(){if(!r.eq_s_b("i")){return false}if(!r.in_grouping_b(m,97,246)){return false}return true}function B(){var i;if(r.cursor<g){return false}var e=r.limit_backward;r.limit_backward=g;r.ket=r.cursor;i=r.find_among_b(l);if(i==0){r.limit_backward=e;return false}r.bra=r.cursor;r.limit_backward=e;switch(i){case 1:if(!r.eq_s_b("a")){return false}break;case 2:if(!r.eq_s_b("e")){return false}break;case 3:if(!r.eq_s_b("i")){return false}break;case 4:if(!r.eq_s_b("o")){return false}break;case 5:if(!r.eq_s_b("ä")){return false}break;case 6:if(!r.eq_s_b("ö")){return false}break;case 7:var a=r.limit-r.cursor;r:{var s=r.limit-r.cursor;i:{var t=r.limit-r.cursor;e:{if(!C()){break e}break i}r.cursor=r.limit-t;if(!r.eq_s_b("ie")){r.cursor=r.limit-a;break r}}r.cursor=r.limit-s;if(r.cursor<=r.limit_backward){r.cursor=r.limit-a;break r}r.cursor--;r.bra=r.cursor}break;case 8:if(!r.in_grouping_b(_,97,246)){return false}if(!r.in_grouping_b(b,98,122)){return false}break}if(!r.slice_del()){return false}d=true;return true}function F(){var i;if(r.cursor<w){return false}var e=r.limit_backward;r.limit_backward=w;r.ket=r.cursor;i=r.find_among_b(c);if(i==0){r.limit_backward=e;return false}r.bra=r.cursor;r.limit_backward=e;switch(i){case 1:{var a=r.limit-r.cursor;r:{if(!r.eq_s_b("po")){break r}return false}r.cursor=r.limit-a}break}if(!r.slice_del()){return false}return true}function W(){if(r.cursor<g){return false}var i=r.limit_backward;r.limit_backward=g;r.ket=r.cursor;if(r.find_among_b(n)==0){r.limit_backward=i;return false}r.bra=r.cursor;r.limit_backward=i;if(!r.slice_del()){return false}return true}function x(){var i;if(r.cursor<g){return false}var e=r.limit_backward;r.limit_backward=g;r.ket=r.cursor;if(!r.eq_s_b("t")){r.limit_backward=e;return false}r.bra=r.cursor;var a=r.limit-r.cursor;if(!r.in_grouping_b(_,97,246)){r.limit_backward=e;return false}r.cursor=r.limit-a;if(!r.slice_del()){return false}r.limit_backward=e;if(r.cursor<w){return false}var s=r.limit_backward;r.limit_backward=w;r.ket=r.cursor;i=r.find_among_b(f);if(i==0){r.limit_backward=s;return false}r.bra=r.cursor;r.limit_backward=s;switch(i){case 1:{var t=r.limit-r.cursor;r:{if(!r.eq_s_b("po")){break r}return false}r.cursor=r.limit-t}break}if(!r.slice_del()){return false}return true}function y(){if(r.cursor<g){return false}var i=r.limit_backward;r.limit_backward=g;var e=r.limit-r.cursor;r:{var a=r.limit-r.cursor;if(!C()){break r}r.cursor=r.limit-a;r.ket=r.cursor;if(r.cursor<=r.limit_backward){break r}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}}r.cursor=r.limit-e;var s=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.in_grouping_b(o,97,228)){break r}r.bra=r.cursor;if(!r.in_grouping_b(b,98,122)){break r}if(!r.slice_del()){return false}}r.cursor=r.limit-s;var t=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("j")){break r}r.bra=r.cursor;i:{var u=r.limit-r.cursor;e:{if(!r.eq_s_b("o")){break e}break i}r.cursor=r.limit-u;if(!r.eq_s_b("u")){break r}}if(!r.slice_del()){return false}}r.cursor=r.limit-t;var l=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("o")){break r}r.bra=r.cursor;if(!r.eq_s_b("j")){break r}if(!r.slice_del()){return false}}r.cursor=r.limit-l;r.limit_backward=i;r:while(true){var c=r.limit-r.cursor;i:{if(!r.out_grouping_b(_,97,246)){break i}r.cursor=r.limit-c;break r}r.cursor=r.limit-c;if(r.cursor<=r.limit_backward){return false}r.cursor--}r.ket=r.cursor;if(!r.in_grouping_b(b,98,122)){return false}r.bra=r.cursor;v=r.slice_to();if(v==""){return false}if(!r.eq_s_b(v)){return false}if(!r.slice_del()){return false}return true}this.stem=function(){var i=r.cursor;p();r.cursor=i;d=false;r.limit_backward=r.cursor;r.cursor=r.limit;var e=r.limit-r.cursor;q();r.cursor=r.limit-e;var a=r.limit-r.cursor;j();r.cursor=r.limit-a;var s=r.limit-r.cursor;B();r.cursor=r.limit-s;var t=r.limit-r.cursor;F();r.cursor=r.limit-t;r:{i:{if(!d){break i}var u=r.limit-r.cursor;W();r.cursor=r.limit-u;break r}var l=r.limit-r.cursor;x();r.cursor=r.limit-l}var c=r.limit-r.cursor;y();r.cursor=r.limit-c;r.cursor=r.limit_backward;return true};this["stemWord"]=function(i){r.setCurrent(i);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/french-stemmer.js b/sphinx/search/minified-js/french-stemmer.js
new file mode 100644
index 0000000..51ad0ea
--- /dev/null
+++ b/sphinx/search/minified-js/french-stemmer.js
@@ -0,0 +1 @@
+FrenchStemmer=function(){var r=new BaseStemmer;var e=[["col",-1,-1],["par",-1,-1],["tap",-1,-1]];var i=[["",-1,7],["H",0,6],["He",1,4],["Hi",1,5],["I",0,1],["U",0,2],["Y",0,3]];var s=[["iqU",-1,3],["abl",-1,3],["Ièr",-1,4],["ièr",-1,4],["eus",-1,2],["iv",-1,1]];var a=[["ic",-1,2],["abil",-1,1],["iv",-1,3]];var u=[["iqUe",-1,1],["atrice",-1,2],["ance",-1,1],["ence",-1,5],["logie",-1,3],["able",-1,1],["isme",-1,1],["euse",-1,11],["iste",-1,1],["ive",-1,8],["if",-1,8],["usion",-1,4],["ation",-1,2],["ution",-1,4],["ateur",-1,2],["iqUes",-1,1],["atrices",-1,2],["ances",-1,1],["ences",-1,5],["logies",-1,3],["ables",-1,1],["ismes",-1,1],["euses",-1,11],["istes",-1,1],["ives",-1,8],["ifs",-1,8],["usions",-1,4],["ations",-1,2],["utions",-1,4],["ateurs",-1,2],["ments",-1,15],["ements",30,6],["issements",31,12],["ités",-1,7],["ment",-1,15],["ement",34,6],["issement",35,12],["amment",34,13],["emment",34,14],["aux",-1,10],["eaux",39,9],["eux",-1,1],["ité",-1,7]];var t=[["ira",-1,1],["ie",-1,1],["isse",-1,1],["issante",-1,1],["i",-1,1],["irai",4,1],["ir",-1,1],["iras",-1,1],["ies",-1,1],["îmes",-1,1],["isses",-1,1],["issantes",-1,1],["îtes",-1,1],["is",-1,1],["irais",13,1],["issais",13,1],["irions",-1,1],["issions",-1,1],["irons",-1,1],["issons",-1,1],["issants",-1,1],["it",-1,1],["irait",21,1],["issait",21,1],["issant",-1,1],["iraIent",-1,1],["issaIent",-1,1],["irent",-1,1],["issent",-1,1],["iront",-1,1],["ît",-1,1],["iriez",-1,1],["issiez",-1,1],["irez",-1,1],["issez",-1,1]];var c=[["a",-1,3],["era",0,2],["asse",-1,3],["ante",-1,3],["ée",-1,2],["ai",-1,3],["erai",5,2],["er",-1,2],["as",-1,3],["eras",8,2],["âmes",-1,3],["asses",-1,3],["antes",-1,3],["âtes",-1,3],["ées",-1,2],["ais",-1,3],["erais",15,2],["ions",-1,1],["erions",17,2],["assions",17,3],["erons",-1,2],["ants",-1,3],["és",-1,2],["ait",-1,3],["erait",23,2],["ant",-1,3],["aIent",-1,3],["eraIent",26,2],["èrent",-1,2],["assent",-1,3],["eront",-1,2],["ât",-1,3],["ez",-1,2],["iez",32,2],["eriez",33,2],["assiez",33,3],["erez",32,2],["é",-1,2]];var f=[["e",-1,3],["Ière",0,2],["ière",0,2],["ion",-1,1],["Ier",-1,2],["ier",-1,2]];var l=[["ell",-1,-1],["eill",-1,-1],["enn",-1,-1],["onn",-1,-1],["ett",-1,-1]];var o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5];var n=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128];var b=0;var k=0;var m=0;function _(){while(true){var e=r.cursor;r:{e:while(true){var i=r.cursor;i:{s:{var s=r.cursor;a:{if(!r.in_grouping(o,97,251)){break a}r.bra=r.cursor;u:{var a=r.cursor;t:{if(!r.eq_s("u")){break t}r.ket=r.cursor;if(!r.in_grouping(o,97,251)){break t}if(!r.slice_from("U")){return false}break u}r.cursor=a;t:{if(!r.eq_s("i")){break t}r.ket=r.cursor;if(!r.in_grouping(o,97,251)){break t}if(!r.slice_from("I")){return false}break u}r.cursor=a;if(!r.eq_s("y")){break a}r.ket=r.cursor;if(!r.slice_from("Y")){return false}}break s}r.cursor=s;a:{r.bra=r.cursor;if(!r.eq_s("ë")){break a}r.ket=r.cursor;if(!r.slice_from("He")){return false}break s}r.cursor=s;a:{r.bra=r.cursor;if(!r.eq_s("ï")){break a}r.ket=r.cursor;if(!r.slice_from("Hi")){return false}break s}r.cursor=s;a:{r.bra=r.cursor;if(!r.eq_s("y")){break a}r.ket=r.cursor;if(!r.in_grouping(o,97,251)){break a}if(!r.slice_from("Y")){return false}break s}r.cursor=s;if(!r.eq_s("q")){break i}r.bra=r.cursor;if(!r.eq_s("u")){break i}r.ket=r.cursor;if(!r.slice_from("U")){return false}}r.cursor=i;break e}r.cursor=i;if(r.cursor>=r.limit){break r}r.cursor++}continue}r.cursor=e;break}return true}function v(){m=r.limit;k=r.limit;b=r.limit;var i=r.cursor;r:{e:{var s=r.cursor;i:{if(!r.in_grouping(o,97,251)){break i}if(!r.in_grouping(o,97,251)){break i}if(r.cursor>=r.limit){break i}r.cursor++;break e}r.cursor=s;i:{if(r.find_among(e)==0){break i}break e}r.cursor=s;if(r.cursor>=r.limit){break r}r.cursor++;i:while(true){s:{if(!r.in_grouping(o,97,251)){break s}break i}if(r.cursor>=r.limit){break r}r.cursor++}}m=r.cursor}r.cursor=i;var a=r.cursor;r:{e:while(true){i:{if(!r.in_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}k=r.cursor;e:while(true){i:{if(!r.in_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(o,97,251)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}b=r.cursor}r.cursor=a;return true}function d(){var e;while(true){var s=r.cursor;r:{r.bra=r.cursor;e=r.find_among(i);if(e==0){break r}r.ket=r.cursor;switch(e){case 1:if(!r.slice_from("i")){return false}break;case 2:if(!r.slice_from("u")){return false}break;case 3:if(!r.slice_from("y")){return false}break;case 4:if(!r.slice_from("ë")){return false}break;case 5:if(!r.slice_from("ï")){return false}break;case 6:if(!r.slice_del()){return false}break;case 7:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=s;break}return true}function g(){if(!(m<=r.cursor)){return false}return true}function w(){if(!(k<=r.cursor)){return false}return true}function q(){if(!(b<=r.cursor)){return false}return true}function h(){var e;r.ket=r.cursor;e=r.find_among_b(u);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!q()){return false}if(!r.slice_del()){return false}break;case 2:if(!q()){return false}if(!r.slice_del()){return false}var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("ic")){r.cursor=r.limit-i;break r}r.bra=r.cursor;e:{var t=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-t;if(!r.slice_from("iqU")){return false}}}break;case 3:if(!q()){return false}if(!r.slice_from("log")){return false}break;case 4:if(!q()){return false}if(!r.slice_from("u")){return false}break;case 5:if(!q()){return false}if(!r.slice_from("ent")){return false}break;case 6:if(!g()){return false}if(!r.slice_del()){return false}var c=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(s);if(e==0){r.cursor=r.limit-c;break r}r.bra=r.cursor;switch(e){case 1:if(!q()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-c;break r}r.bra=r.cursor;if(!q()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}break;case 2:e:{var f=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-f;if(!w()){r.cursor=r.limit-c;break r}if(!r.slice_from("eux")){return false}}break;case 3:if(!q()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}break;case 4:if(!g()){r.cursor=r.limit-c;break r}if(!r.slice_from("i")){return false}break}}break;case 7:if(!q()){return false}if(!r.slice_del()){return false}var l=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(a);if(e==0){r.cursor=r.limit-l;break r}r.bra=r.cursor;switch(e){case 1:e:{var n=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-n;if(!r.slice_from("abl")){return false}}break;case 2:e:{var b=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-b;if(!r.slice_from("iqU")){return false}}break;case 3:if(!q()){r.cursor=r.limit-l;break r}if(!r.slice_del()){return false}break}}break;case 8:if(!q()){return false}if(!r.slice_del()){return false}var k=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-k;break r}r.bra=r.cursor;if(!q()){r.cursor=r.limit-k;break r}if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("ic")){r.cursor=r.limit-k;break r}r.bra=r.cursor;e:{var m=r.limit-r.cursor;i:{if(!q()){break i}if(!r.slice_del()){return false}break e}r.cursor=r.limit-m;if(!r.slice_from("iqU")){return false}}}break;case 9:if(!r.slice_from("eau")){return false}break;case 10:if(!w()){return false}if(!r.slice_from("al")){return false}break;case 11:r:{var _=r.limit-r.cursor;e:{if(!q()){break e}if(!r.slice_del()){return false}break r}r.cursor=r.limit-_;if(!w()){return false}if(!r.slice_from("eux")){return false}}break;case 12:if(!w()){return false}if(!r.out_grouping_b(o,97,251)){return false}if(!r.slice_del()){return false}break;case 13:if(!g()){return false}if(!r.slice_from("ant")){return false}return false;case 14:if(!g()){return false}if(!r.slice_from("ent")){return false}return false;case 15:var v=r.limit-r.cursor;if(!r.in_grouping_b(o,97,251)){return false}if(!g()){return false}r.cursor=r.limit-v;if(!r.slice_del()){return false}return false}return true}function p(){if(r.cursor<m){return false}var e=r.limit_backward;r.limit_backward=m;r.ket=r.cursor;if(r.find_among_b(t)==0){r.limit_backward=e;return false}r.bra=r.cursor;{var i=r.limit-r.cursor;r:{if(!r.eq_s_b("H")){break r}r.limit_backward=e;return false}r.cursor=r.limit-i}if(!r.out_grouping_b(o,97,251)){r.limit_backward=e;return false}if(!r.slice_del()){return false}r.limit_backward=e;return true}function z(){var e;if(r.cursor<m){return false}var i=r.limit_backward;r.limit_backward=m;r.ket=r.cursor;e=r.find_among_b(c);if(e==0){r.limit_backward=i;return false}r.bra=r.cursor;switch(e){case 1:if(!q()){r.limit_backward=i;return false}if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}break;case 3:if(!r.slice_del()){return false}var s=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("e")){r.cursor=r.limit-s;break r}r.bra=r.cursor;if(!r.slice_del()){return false}}break}r.limit_backward=i;return true}function I(){var e;var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("s")){r.cursor=r.limit-i;break r}r.bra=r.cursor;var s=r.limit-r.cursor;e:{var a=r.limit-r.cursor;i:{if(!r.eq_s_b("Hi")){break i}break e}r.cursor=r.limit-a;if(!r.out_grouping_b(n,97,232)){r.cursor=r.limit-i;break r}}r.cursor=r.limit-s;if(!r.slice_del()){return false}}if(r.cursor<m){return false}var u=r.limit_backward;r.limit_backward=m;r.ket=r.cursor;e=r.find_among_b(f);if(e==0){r.limit_backward=u;return false}r.bra=r.cursor;switch(e){case 1:if(!q()){r.limit_backward=u;return false}r:{var t=r.limit-r.cursor;e:{if(!r.eq_s_b("s")){break e}break r}r.cursor=r.limit-t;if(!r.eq_s_b("t")){r.limit_backward=u;return false}}if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("i")){return false}break;case 3:if(!r.slice_del()){return false}break}r.limit_backward=u;return true}function U(){var e=r.limit-r.cursor;if(r.find_among_b(l)==0){return false}r.cursor=r.limit-e;r.ket=r.cursor;if(r.cursor<=r.limit_backward){return false}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}return true}function H(){{var e=1;while(true){r:{if(!r.out_grouping_b(o,97,251)){break r}e--;continue}break}if(e>0){return false}}r.ket=r.cursor;r:{var i=r.limit-r.cursor;e:{if(!r.eq_s_b("é")){break e}break r}r.cursor=r.limit-i;if(!r.eq_s_b("è")){return false}}r.bra=r.cursor;if(!r.slice_from("e")){return false}return true}this.stem=function(){var e=r.cursor;_();r.cursor=e;v();r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;r:{e:{var s=r.limit-r.cursor;i:{var a=r.limit-r.cursor;s:{var u=r.limit-r.cursor;a:{if(!h()){break a}break s}r.cursor=r.limit-u;a:{if(!p()){break a}break s}r.cursor=r.limit-u;if(!z()){break i}}r.cursor=r.limit-a;var t=r.limit-r.cursor;s:{r.ket=r.cursor;a:{var c=r.limit-r.cursor;u:{if(!r.eq_s_b("Y")){break u}r.bra=r.cursor;if(!r.slice_from("i")){return false}break a}r.cursor=r.limit-c;if(!r.eq_s_b("ç")){r.cursor=r.limit-t;break s}r.bra=r.cursor;if(!r.slice_from("c")){return false}}}break e}r.cursor=r.limit-s;if(!I()){break r}}}r.cursor=r.limit-i;var f=r.limit-r.cursor;U();r.cursor=r.limit-f;var l=r.limit-r.cursor;H();r.cursor=r.limit-l;r.cursor=r.limit_backward;var o=r.cursor;d();r.cursor=o;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/german-stemmer.js b/sphinx/search/minified-js/german-stemmer.js
new file mode 100644
index 0000000..e2a335d
--- /dev/null
+++ b/sphinx/search/minified-js/german-stemmer.js
@@ -0,0 +1 @@
+GermanStemmer=function(){var r=new BaseStemmer;var e=[["",-1,5],["U",0,2],["Y",0,1],["ä",0,3],["ö",0,4],["ü",0,2]];var i=[["e",-1,2],["em",-1,1],["en",-1,2],["ern",-1,1],["er",-1,1],["s",-1,3],["es",5,2]];var s=[["en",-1,1],["er",-1,1],["st",-1,2],["est",2,1]];var u=[["ig",-1,1],["lich",-1,1]];var a=[["end",-1,1],["ig",-1,2],["ung",-1,1],["lich",-1,3],["isch",-1,2],["ik",-1,2],["heit",-1,3],["keit",-1,4]];var c=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8];var t=[117,30,5];var o=[117,30,4];var f=0;var l=0;var n=0;function b(){var e=r.cursor;while(true){var i=r.cursor;r:{e:{var s=r.cursor;i:{r.bra=r.cursor;if(!r.eq_s("ß")){break i}r.ket=r.cursor;if(!r.slice_from("ss")){return false}break e}r.cursor=s;if(r.cursor>=r.limit){break r}r.cursor++}continue}r.cursor=i;break}r.cursor=e;while(true){var u=r.cursor;r:{e:while(true){var a=r.cursor;i:{if(!r.in_grouping(c,97,252)){break i}r.bra=r.cursor;s:{var t=r.cursor;u:{if(!r.eq_s("u")){break u}r.ket=r.cursor;if(!r.in_grouping(c,97,252)){break u}if(!r.slice_from("U")){return false}break s}r.cursor=t;if(!r.eq_s("y")){break i}r.ket=r.cursor;if(!r.in_grouping(c,97,252)){break i}if(!r.slice_from("Y")){return false}}r.cursor=a;break e}r.cursor=a;if(r.cursor>=r.limit){break r}r.cursor++}continue}r.cursor=u;break}return true}function k(){n=r.limit;l=r.limit;var e=r.cursor;{var i=r.cursor+3;if(i>r.limit){return false}r.cursor=i}f=r.cursor;r.cursor=e;r:while(true){e:{if(!r.in_grouping(c,97,252)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){e:{if(!r.out_grouping(c,97,252)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}n=r.cursor;r:{if(!(n<f)){break r}n=f}r:while(true){e:{if(!r.in_grouping(c,97,252)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){e:{if(!r.out_grouping(c,97,252)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}l=r.cursor;return true}function m(){var i;while(true){var s=r.cursor;r:{r.bra=r.cursor;i=r.find_among(e);if(i==0){break r}r.ket=r.cursor;switch(i){case 1:if(!r.slice_from("y")){return false}break;case 2:if(!r.slice_from("u")){return false}break;case 3:if(!r.slice_from("a")){return false}break;case 4:if(!r.slice_from("o")){return false}break;case 5:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=s;break}return true}function _(){if(!(n<=r.cursor)){return false}return true}function v(){if(!(l<=r.cursor)){return false}return true}function g(){var e;var c=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(i);if(e==0){break r}r.bra=r.cursor;if(!_()){break r}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}var f=r.limit-r.cursor;e:{r.ket=r.cursor;if(!r.eq_s_b("s")){r.cursor=r.limit-f;break e}r.bra=r.cursor;if(!r.eq_s_b("nis")){r.cursor=r.limit-f;break e}if(!r.slice_del()){return false}}break;case 3:if(!r.in_grouping_b(t,98,116)){break r}if(!r.slice_del()){return false}break}}r.cursor=r.limit-c;var l=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(s);if(e==0){break r}r.bra=r.cursor;if(!_()){break r}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.in_grouping_b(o,98,116)){break r}{var n=r.cursor-3;if(n<r.limit_backward){break r}r.cursor=n}if(!r.slice_del()){return false}break}}r.cursor=r.limit-l;var b=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(a);if(e==0){break r}r.bra=r.cursor;if(!v()){break r}switch(e){case 1:if(!r.slice_del()){return false}var k=r.limit-r.cursor;e:{r.ket=r.cursor;if(!r.eq_s_b("ig")){r.cursor=r.limit-k;break e}r.bra=r.cursor;{var m=r.limit-r.cursor;i:{if(!r.eq_s_b("e")){break i}r.cursor=r.limit-k;break e}r.cursor=r.limit-m}if(!v()){r.cursor=r.limit-k;break e}if(!r.slice_del()){return false}}break;case 2:{var g=r.limit-r.cursor;e:{if(!r.eq_s_b("e")){break e}break r}r.cursor=r.limit-g}if(!r.slice_del()){return false}break;case 3:if(!r.slice_del()){return false}var d=r.limit-r.cursor;e:{r.ket=r.cursor;i:{var h=r.limit-r.cursor;s:{if(!r.eq_s_b("er")){break s}break i}r.cursor=r.limit-h;if(!r.eq_s_b("en")){r.cursor=r.limit-d;break e}}r.bra=r.cursor;if(!_()){r.cursor=r.limit-d;break e}if(!r.slice_del()){return false}}break;case 4:if(!r.slice_del()){return false}var w=r.limit-r.cursor;e:{r.ket=r.cursor;if(r.find_among_b(u)==0){r.cursor=r.limit-w;break e}r.bra=r.cursor;if(!v()){r.cursor=r.limit-w;break e}if(!r.slice_del()){return false}}break}}r.cursor=r.limit-b;return true}this.stem=function(){var e=r.cursor;b();r.cursor=e;var i=r.cursor;k();r.cursor=i;r.limit_backward=r.cursor;r.cursor=r.limit;g();r.cursor=r.limit_backward;var s=r.cursor;m();r.cursor=s;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/hungarian-stemmer.js b/sphinx/search/minified-js/hungarian-stemmer.js
new file mode 100644
index 0000000..e1fca97
--- /dev/null
+++ b/sphinx/search/minified-js/hungarian-stemmer.js
@@ -0,0 +1 @@
+HungarianStemmer=function(){var r=new BaseStemmer;var e=[["cs",-1,-1],["dzs",-1,-1],["gy",-1,-1],["ly",-1,-1],["ny",-1,-1],["sz",-1,-1],["ty",-1,-1],["zs",-1,-1]];var i=[["á",-1,1],["é",-1,2]];var a=[["bb",-1,-1],["cc",-1,-1],["dd",-1,-1],["ff",-1,-1],["gg",-1,-1],["jj",-1,-1],["kk",-1,-1],["ll",-1,-1],["mm",-1,-1],["nn",-1,-1],["pp",-1,-1],["rr",-1,-1],["ccs",-1,-1],["ss",-1,-1],["zzs",-1,-1],["tt",-1,-1],["vv",-1,-1],["ggy",-1,-1],["lly",-1,-1],["nny",-1,-1],["tty",-1,-1],["ssz",-1,-1],["zz",-1,-1]];var t=[["al",-1,1],["el",-1,1]];var s=[["ba",-1,-1],["ra",-1,-1],["be",-1,-1],["re",-1,-1],["ig",-1,-1],["nak",-1,-1],["nek",-1,-1],["val",-1,-1],["vel",-1,-1],["ul",-1,-1],["nál",-1,-1],["nél",-1,-1],["ból",-1,-1],["ról",-1,-1],["tól",-1,-1],["ül",-1,-1],["ből",-1,-1],["ről",-1,-1],["től",-1,-1],["n",-1,-1],["an",19,-1],["ban",20,-1],["en",19,-1],["ben",22,-1],["képpen",22,-1],["on",19,-1],["ön",19,-1],["képp",-1,-1],["kor",-1,-1],["t",-1,-1],["at",29,-1],["et",29,-1],["ként",29,-1],["anként",32,-1],["enként",32,-1],["onként",32,-1],["ot",29,-1],["ért",29,-1],["öt",29,-1],["hez",-1,-1],["hoz",-1,-1],["höz",-1,-1],["vá",-1,-1],["vé",-1,-1]];var u=[["án",-1,2],["én",-1,1],["ánként",-1,2]];var n=[["stul",-1,1],["astul",0,1],["ástul",0,2],["stül",-1,1],["estül",3,1],["éstül",3,3]];var f=[["á",-1,1],["é",-1,1]];var c=[["k",-1,3],["ak",0,3],["ek",0,3],["ok",0,3],["ák",0,1],["ék",0,2],["ök",0,3]];var l=[["éi",-1,1],["áéi",0,3],["ééi",0,2],["é",-1,1],["ké",3,1],["aké",4,1],["eké",4,1],["oké",4,1],["áké",4,3],["éké",4,2],["öké",4,1],["éé",3,2]];var o=[["a",-1,1],["ja",0,1],["d",-1,1],["ad",2,1],["ed",2,1],["od",2,1],["ád",2,2],["éd",2,3],["öd",2,1],["e",-1,1],["je",9,1],["nk",-1,1],["unk",11,1],["ánk",11,2],["énk",11,3],["ünk",11,1],["uk",-1,1],["juk",16,1],["ájuk",17,2],["ük",-1,1],["jük",19,1],["éjük",20,3],["m",-1,1],["am",22,1],["em",22,1],["om",22,1],["ám",22,2],["ém",22,3],["o",-1,1],["á",-1,2],["é",-1,3]];var k=[["id",-1,1],["aid",0,1],["jaid",1,1],["eid",0,1],["jeid",3,1],["áid",0,2],["éid",0,3],["i",-1,1],["ai",7,1],["jai",8,1],["ei",7,1],["jei",10,1],["ái",7,2],["éi",7,3],["itek",-1,1],["eitek",14,1],["jeitek",15,1],["éitek",14,3],["ik",-1,1],["aik",18,1],["jaik",19,1],["eik",18,1],["jeik",21,1],["áik",18,2],["éik",18,3],["ink",-1,1],["aink",25,1],["jaink",26,1],["eink",25,1],["jeink",28,1],["áink",25,2],["éink",25,3],["aitok",-1,1],["jaitok",32,1],["áitok",-1,2],["im",-1,1],["aim",35,1],["jaim",36,1],["eim",35,1],["jeim",38,1],["áim",35,2],["éim",35,3]];var m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,36,10,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1];var b=0;function _(){b=r.limit;r:{var i=r.cursor;e:{if(!r.in_grouping(m,97,369)){break e}i:while(true){var a=r.cursor;a:{if(!r.out_grouping(m,97,369)){break a}r.cursor=a;break i}r.cursor=a;if(r.cursor>=r.limit){break e}r.cursor++}i:{var t=r.cursor;a:{if(r.find_among(e)==0){break a}break i}r.cursor=t;if(r.cursor>=r.limit){break e}r.cursor++}b=r.cursor;break r}r.cursor=i;if(!r.out_grouping(m,97,369)){return false}e:while(true){i:{if(!r.in_grouping(m,97,369)){break i}break e}if(r.cursor>=r.limit){return false}r.cursor++}b=r.cursor}return true}function d(){if(!(b<=r.cursor)){return false}return true}function v(){var e;r.ket=r.cursor;e=r.find_among_b(i);if(e==0){return false}r.bra=r.cursor;if(!d()){return false}switch(e){case 1:if(!r.slice_from("a")){return false}break;case 2:if(!r.slice_from("e")){return false}break}return true}function g(){var e=r.limit-r.cursor;if(r.find_among_b(a)==0){return false}r.cursor=r.limit-e;return true}function j(){if(r.cursor<=r.limit_backward){return false}r.cursor--;r.ket=r.cursor;{var e=r.cursor-1;if(e<r.limit_backward){return false}r.cursor=e}r.bra=r.cursor;if(!r.slice_del()){return false}return true}function h(){r.ket=r.cursor;if(r.find_among_b(t)==0){return false}r.bra=r.cursor;if(!d()){return false}if(!g()){return false}if(!r.slice_del()){return false}if(!j()){return false}return true}function w(){r.ket=r.cursor;if(r.find_among_b(s)==0){return false}r.bra=r.cursor;if(!d()){return false}if(!r.slice_del()){return false}if(!v()){return false}return true}function z(){var e;r.ket=r.cursor;e=r.find_among_b(u);if(e==0){return false}r.bra=r.cursor;if(!d()){return false}switch(e){case 1:if(!r.slice_from("e")){return false}break;case 2:if(!r.slice_from("a")){return false}break}return true}function p(){var e;r.ket=r.cursor;e=r.find_among_b(n);if(e==0){return false}r.bra=r.cursor;if(!d()){return false}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("a")){return false}break;case 3:if(!r.slice_from("e")){return false}break}return true}function y(){r.ket=r.cursor;if(r.find_among_b(f)==0){return false}r.bra=r.cursor;if(!d()){return false}if(!g()){return false}if(!r.slice_del()){return false}if(!j()){return false}return true}function C(){var e;r.ket=r.cursor;e=r.find_among_b(c);if(e==0){return false}r.bra=r.cursor;if(!d()){return false}switch(e){case 1:if(!r.slice_from("a")){return false}break;case 2:if(!r.slice_from("e")){return false}break;case 3:if(!r.slice_del()){return false}break}return true}function S(){var e;r.ket=r.cursor;e=r.find_among_b(l);if(e==0){return false}r.bra=r.cursor;if(!d()){return false}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("e")){return false}break;case 3:if(!r.slice_from("a")){return false}break}return true}function B(){var e;r.ket=r.cursor;e=r.find_among_b(o);if(e==0){return false}r.bra=r.cursor;if(!d()){return false}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("a")){return false}break;case 3:if(!r.slice_from("e")){return false}break}return true}function H(){var e;r.ket=r.cursor;e=r.find_among_b(k);if(e==0){return false}r.bra=r.cursor;if(!d()){return false}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("a")){return false}break;case 3:if(!r.slice_from("e")){return false}break}return true}this.stem=function(){var e=r.cursor;_();r.cursor=e;r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;h();r.cursor=r.limit-i;var a=r.limit-r.cursor;w();r.cursor=r.limit-a;var t=r.limit-r.cursor;z();r.cursor=r.limit-t;var s=r.limit-r.cursor;p();r.cursor=r.limit-s;var u=r.limit-r.cursor;y();r.cursor=r.limit-u;var n=r.limit-r.cursor;S();r.cursor=r.limit-n;var f=r.limit-r.cursor;B();r.cursor=r.limit-f;var c=r.limit-r.cursor;H();r.cursor=r.limit-c;var l=r.limit-r.cursor;C();r.cursor=r.limit-l;r.cursor=r.limit_backward;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/italian-stemmer.js b/sphinx/search/minified-js/italian-stemmer.js
new file mode 100644
index 0000000..a3a5c42
--- /dev/null
+++ b/sphinx/search/minified-js/italian-stemmer.js
@@ -0,0 +1 @@
+ItalianStemmer=function(){var r=new BaseStemmer;var e=[["",-1,7],["qu",0,6],["á",0,1],["é",0,2],["í",0,3],["ó",0,4],["ú",0,5]];var i=[["",-1,3],["I",0,1],["U",0,2]];var a=[["la",-1,-1],["cela",0,-1],["gliela",0,-1],["mela",0,-1],["tela",0,-1],["vela",0,-1],["le",-1,-1],["cele",6,-1],["gliele",6,-1],["mele",6,-1],["tele",6,-1],["vele",6,-1],["ne",-1,-1],["cene",12,-1],["gliene",12,-1],["mene",12,-1],["sene",12,-1],["tene",12,-1],["vene",12,-1],["ci",-1,-1],["li",-1,-1],["celi",20,-1],["glieli",20,-1],["meli",20,-1],["teli",20,-1],["veli",20,-1],["gli",20,-1],["mi",-1,-1],["si",-1,-1],["ti",-1,-1],["vi",-1,-1],["lo",-1,-1],["celo",31,-1],["glielo",31,-1],["melo",31,-1],["telo",31,-1],["velo",31,-1]];var s=[["ando",-1,1],["endo",-1,1],["ar",-1,2],["er",-1,2],["ir",-1,2]];var o=[["ic",-1,-1],["abil",-1,-1],["os",-1,-1],["iv",-1,1]];var u=[["ic",-1,1],["abil",-1,1],["iv",-1,1]];var t=[["ica",-1,1],["logia",-1,3],["osa",-1,1],["ista",-1,1],["iva",-1,9],["anza",-1,1],["enza",-1,5],["ice",-1,1],["atrice",7,1],["iche",-1,1],["logie",-1,3],["abile",-1,1],["ibile",-1,1],["usione",-1,4],["azione",-1,2],["uzione",-1,4],["atore",-1,2],["ose",-1,1],["ante",-1,1],["mente",-1,1],["amente",19,7],["iste",-1,1],["ive",-1,9],["anze",-1,1],["enze",-1,5],["ici",-1,1],["atrici",25,1],["ichi",-1,1],["abili",-1,1],["ibili",-1,1],["ismi",-1,1],["usioni",-1,4],["azioni",-1,2],["uzioni",-1,4],["atori",-1,2],["osi",-1,1],["anti",-1,1],["amenti",-1,6],["imenti",-1,6],["isti",-1,1],["ivi",-1,9],["ico",-1,1],["ismo",-1,1],["oso",-1,1],["amento",-1,6],["imento",-1,6],["ivo",-1,9],["ità",-1,8],["istà",-1,1],["istè",-1,1],["istì",-1,1]];var c=[["isca",-1,1],["enda",-1,1],["ata",-1,1],["ita",-1,1],["uta",-1,1],["ava",-1,1],["eva",-1,1],["iva",-1,1],["erebbe",-1,1],["irebbe",-1,1],["isce",-1,1],["ende",-1,1],["are",-1,1],["ere",-1,1],["ire",-1,1],["asse",-1,1],["ate",-1,1],["avate",16,1],["evate",16,1],["ivate",16,1],["ete",-1,1],["erete",20,1],["irete",20,1],["ite",-1,1],["ereste",-1,1],["ireste",-1,1],["ute",-1,1],["erai",-1,1],["irai",-1,1],["isci",-1,1],["endi",-1,1],["erei",-1,1],["irei",-1,1],["assi",-1,1],["ati",-1,1],["iti",-1,1],["eresti",-1,1],["iresti",-1,1],["uti",-1,1],["avi",-1,1],["evi",-1,1],["ivi",-1,1],["isco",-1,1],["ando",-1,1],["endo",-1,1],["Yamo",-1,1],["iamo",-1,1],["avamo",-1,1],["evamo",-1,1],["ivamo",-1,1],["eremo",-1,1],["iremo",-1,1],["assimo",-1,1],["ammo",-1,1],["emmo",-1,1],["eremmo",54,1],["iremmo",54,1],["immo",-1,1],["ano",-1,1],["iscano",58,1],["avano",58,1],["evano",58,1],["ivano",58,1],["eranno",-1,1],["iranno",-1,1],["ono",-1,1],["iscono",65,1],["arono",65,1],["erono",65,1],["irono",65,1],["erebbero",-1,1],["irebbero",-1,1],["assero",-1,1],["essero",-1,1],["issero",-1,1],["ato",-1,1],["ito",-1,1],["uto",-1,1],["avo",-1,1],["evo",-1,1],["ivo",-1,1],["ar",-1,1],["ir",-1,1],["erà",-1,1],["irà",-1,1],["erò",-1,1],["irò",-1,1]];var l=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1];var n=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2];var f=[17];var b=0;var m=0;var k=0;function _(){var i;var a=r.cursor;while(true){var s=r.cursor;r:{r.bra=r.cursor;i=r.find_among(e);if(i==0){break r}r.ket=r.cursor;switch(i){case 1:if(!r.slice_from("à")){return false}break;case 2:if(!r.slice_from("è")){return false}break;case 3:if(!r.slice_from("ì")){return false}break;case 4:if(!r.slice_from("ò")){return false}break;case 5:if(!r.slice_from("ù")){return false}break;case 6:if(!r.slice_from("qU")){return false}break;case 7:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=s;break}r.cursor=a;while(true){var o=r.cursor;r:{e:while(true){var u=r.cursor;i:{if(!r.in_grouping(l,97,249)){break i}r.bra=r.cursor;a:{var t=r.cursor;s:{if(!r.eq_s("u")){break s}r.ket=r.cursor;if(!r.in_grouping(l,97,249)){break s}if(!r.slice_from("U")){return false}break a}r.cursor=t;if(!r.eq_s("i")){break i}r.ket=r.cursor;if(!r.in_grouping(l,97,249)){break i}if(!r.slice_from("I")){return false}}r.cursor=u;break e}r.cursor=u;if(r.cursor>=r.limit){break r}r.cursor++}continue}r.cursor=o;break}return true}function v(){k=r.limit;m=r.limit;b=r.limit;var e=r.cursor;r:{e:{var i=r.cursor;i:{if(!r.in_grouping(l,97,249)){break i}a:{var a=r.cursor;s:{if(!r.out_grouping(l,97,249)){break s}o:while(true){u:{if(!r.in_grouping(l,97,249)){break u}break o}if(r.cursor>=r.limit){break s}r.cursor++}break a}r.cursor=a;if(!r.in_grouping(l,97,249)){break i}s:while(true){o:{if(!r.out_grouping(l,97,249)){break o}break s}if(r.cursor>=r.limit){break i}r.cursor++}}break e}r.cursor=i;if(!r.out_grouping(l,97,249)){break r}i:{var s=r.cursor;a:{if(!r.out_grouping(l,97,249)){break a}s:while(true){o:{if(!r.in_grouping(l,97,249)){break o}break s}if(r.cursor>=r.limit){break a}r.cursor++}break i}r.cursor=s;if(!r.in_grouping(l,97,249)){break r}if(r.cursor>=r.limit){break r}r.cursor++}}k=r.cursor}r.cursor=e;var o=r.cursor;r:{e:while(true){i:{if(!r.in_grouping(l,97,249)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(l,97,249)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}m=r.cursor;e:while(true){i:{if(!r.in_grouping(l,97,249)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(l,97,249)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}b=r.cursor}r.cursor=o;return true}function g(){var e;while(true){var a=r.cursor;r:{r.bra=r.cursor;e=r.find_among(i);if(e==0){break r}r.ket=r.cursor;switch(e){case 1:if(!r.slice_from("i")){return false}break;case 2:if(!r.slice_from("u")){return false}break;case 3:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=a;break}return true}function d(){if(!(k<=r.cursor)){return false}return true}function w(){if(!(m<=r.cursor)){return false}return true}function h(){if(!(b<=r.cursor)){return false}return true}function p(){var e;r.ket=r.cursor;if(r.find_among_b(a)==0){return false}r.bra=r.cursor;e=r.find_among_b(s);if(e==0){return false}if(!d()){return false}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("e")){return false}break}return true}function q(){var e;r.ket=r.cursor;e=r.find_among_b(t);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!h()){return false}if(!r.slice_del()){return false}break;case 2:if(!h()){return false}if(!r.slice_del()){return false}var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("ic")){r.cursor=r.limit-i;break r}r.bra=r.cursor;if(!h()){r.cursor=r.limit-i;break r}if(!r.slice_del()){return false}}break;case 3:if(!h()){return false}if(!r.slice_from("log")){return false}break;case 4:if(!h()){return false}if(!r.slice_from("u")){return false}break;case 5:if(!h()){return false}if(!r.slice_from("ente")){return false}break;case 6:if(!d()){return false}if(!r.slice_del()){return false}break;case 7:if(!w()){return false}if(!r.slice_del()){return false}var a=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(o);if(e==0){r.cursor=r.limit-a;break r}r.bra=r.cursor;if(!h()){r.cursor=r.limit-a;break r}if(!r.slice_del()){return false}switch(e){case 1:r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-a;break r}r.bra=r.cursor;if(!h()){r.cursor=r.limit-a;break r}if(!r.slice_del()){return false}break}}break;case 8:if(!h()){return false}if(!r.slice_del()){return false}var s=r.limit-r.cursor;r:{r.ket=r.cursor;if(r.find_among_b(u)==0){r.cursor=r.limit-s;break r}r.bra=r.cursor;if(!h()){r.cursor=r.limit-s;break r}if(!r.slice_del()){return false}}break;case 9:if(!h()){return false}if(!r.slice_del()){return false}var c=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-c;break r}r.bra=r.cursor;if(!h()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("ic")){r.cursor=r.limit-c;break r}r.bra=r.cursor;if(!h()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}}break}return true}function z(){if(r.cursor<k){return false}var e=r.limit_backward;r.limit_backward=k;r.ket=r.cursor;if(r.find_among_b(c)==0){r.limit_backward=e;return false}r.bra=r.cursor;if(!r.slice_del()){return false}r.limit_backward=e;return true}function I(){var e=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.in_grouping_b(n,97,242)){r.cursor=r.limit-e;break r}r.bra=r.cursor;if(!d()){r.cursor=r.limit-e;break r}if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("i")){r.cursor=r.limit-e;break r}r.bra=r.cursor;if(!d()){r.cursor=r.limit-e;break r}if(!r.slice_del()){return false}}var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("h")){r.cursor=r.limit-i;break r}r.bra=r.cursor;if(!r.in_grouping_b(f,99,103)){r.cursor=r.limit-i;break r}if(!d()){r.cursor=r.limit-i;break r}if(!r.slice_del()){return false}}return true}this.stem=function(){var e=r.cursor;_();r.cursor=e;v();r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;p();r.cursor=r.limit-i;var a=r.limit-r.cursor;r:{e:{var s=r.limit-r.cursor;i:{if(!q()){break i}break e}r.cursor=r.limit-s;if(!z()){break r}}}r.cursor=r.limit-a;var o=r.limit-r.cursor;I();r.cursor=r.limit-o;r.cursor=r.limit_backward;var u=r.cursor;g();r.cursor=u;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/norwegian-stemmer.js b/sphinx/search/minified-js/norwegian-stemmer.js
new file mode 100644
index 0000000..c8ec76c
--- /dev/null
+++ b/sphinx/search/minified-js/norwegian-stemmer.js
@@ -0,0 +1 @@
+NorwegianStemmer=function(){var r=new BaseStemmer;var e=[["a",-1,1],["e",-1,1],["ede",1,1],["ande",1,1],["ende",1,1],["ane",1,1],["ene",1,1],["hetene",6,1],["erte",1,3],["en",-1,1],["heten",9,1],["ar",-1,1],["er",-1,1],["heter",12,1],["s",-1,2],["as",14,1],["es",14,1],["edes",16,1],["endes",16,1],["enes",16,1],["hetenes",19,1],["ens",14,1],["hetens",21,1],["ers",14,1],["ets",14,1],["et",-1,1],["het",25,1],["ert",-1,3],["ast",-1,1]];var i=[["dt",-1,-1],["vt",-1,-1]];var t=[["leg",-1,1],["eleg",0,1],["ig",-1,1],["eig",2,1],["lig",2,1],["elig",4,1],["els",-1,1],["lov",-1,1],["elov",7,1],["slov",7,1],["hetslov",9,1]];var a=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128];var s=[119,125,149,1];var u=0;var c=0;function l(){c=r.limit;var e=r.cursor;{var i=r.cursor+3;if(i>r.limit){return false}r.cursor=i}u=r.cursor;r.cursor=e;r:while(true){var t=r.cursor;e:{if(!r.in_grouping(a,97,248)){break e}r.cursor=t;break r}r.cursor=t;if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){e:{if(!r.out_grouping(a,97,248)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}c=r.cursor;r:{if(!(c<u)){break r}c=u}return true}function n(){var i;if(r.cursor<c){return false}var t=r.limit_backward;r.limit_backward=c;r.ket=r.cursor;i=r.find_among_b(e);if(i==0){r.limit_backward=t;return false}r.bra=r.cursor;r.limit_backward=t;switch(i){case 1:if(!r.slice_del()){return false}break;case 2:r:{var u=r.limit-r.cursor;e:{if(!r.in_grouping_b(s,98,122)){break e}break r}r.cursor=r.limit-u;if(!r.eq_s_b("k")){return false}if(!r.out_grouping_b(a,97,248)){return false}}if(!r.slice_del()){return false}break;case 3:if(!r.slice_from("er")){return false}break}return true}function o(){var e=r.limit-r.cursor;if(r.cursor<c){return false}var t=r.limit_backward;r.limit_backward=c;r.ket=r.cursor;if(r.find_among_b(i)==0){r.limit_backward=t;return false}r.bra=r.cursor;r.limit_backward=t;r.cursor=r.limit-e;if(r.cursor<=r.limit_backward){return false}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}return true}function f(){if(r.cursor<c){return false}var e=r.limit_backward;r.limit_backward=c;r.ket=r.cursor;if(r.find_among_b(t)==0){r.limit_backward=e;return false}r.bra=r.cursor;r.limit_backward=e;if(!r.slice_del()){return false}return true}this.stem=function(){var e=r.cursor;l();r.cursor=e;r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;n();r.cursor=r.limit-i;var t=r.limit-r.cursor;o();r.cursor=r.limit-t;var a=r.limit-r.cursor;f();r.cursor=r.limit-a;r.cursor=r.limit_backward;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/porter-stemmer.js b/sphinx/search/minified-js/porter-stemmer.js
new file mode 100644
index 0000000..f05d6ec
--- /dev/null
+++ b/sphinx/search/minified-js/porter-stemmer.js
@@ -0,0 +1 @@
+PorterStemmer=function(){var r=new BaseStemmer;var e=[["s",-1,3],["ies",0,2],["sses",0,1],["ss",0,-1]];var i=[["",-1,3],["bb",0,2],["dd",0,2],["ff",0,2],["gg",0,2],["bl",0,1],["mm",0,2],["nn",0,2],["pp",0,2],["rr",0,2],["at",0,1],["tt",0,2],["iz",0,1]];var s=[["ed",-1,2],["eed",0,1],["ing",-1,2]];var a=[["anci",-1,3],["enci",-1,2],["abli",-1,4],["eli",-1,6],["alli",-1,9],["ousli",-1,11],["entli",-1,5],["aliti",-1,9],["biliti",-1,13],["iviti",-1,12],["tional",-1,1],["ational",10,8],["alism",-1,9],["ation",-1,8],["ization",13,7],["izer",-1,7],["ator",-1,8],["iveness",-1,12],["fulness",-1,10],["ousness",-1,11]];var u=[["icate",-1,2],["ative",-1,3],["alize",-1,1],["iciti",-1,2],["ical",-1,2],["ful",-1,3],["ness",-1,3]];var t=[["ic",-1,1],["ance",-1,1],["ence",-1,1],["able",-1,1],["ible",-1,1],["ate",-1,1],["ive",-1,1],["ize",-1,1],["iti",-1,1],["al",-1,1],["ism",-1,1],["ion",-1,2],["er",-1,1],["ous",-1,1],["ant",-1,1],["ent",-1,1],["ment",15,1],["ement",16,1],["ou",-1,1]];var c=[17,65,16,1];var f=[1,17,65,208,1];var l=false;var o=0;var n=0;function b(){if(!r.out_grouping_b(f,89,121)){return false}if(!r.in_grouping_b(c,97,121)){return false}if(!r.out_grouping_b(c,97,121)){return false}return true}function m(){if(!(n<=r.cursor)){return false}return true}function _(){if(!(o<=r.cursor)){return false}return true}function k(){var i;r.ket=r.cursor;i=r.find_among_b(e);if(i==0){return false}r.bra=r.cursor;switch(i){case 1:if(!r.slice_from("ss")){return false}break;case 2:if(!r.slice_from("i")){return false}break;case 3:if(!r.slice_del()){return false}break}return true}function v(){var e;r.ket=r.cursor;e=r.find_among_b(s);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!m()){return false}if(!r.slice_from("ee")){return false}break;case 2:var a=r.limit-r.cursor;r:while(true){e:{if(!r.in_grouping_b(c,97,121)){break e}break r}if(r.cursor<=r.limit_backward){return false}r.cursor--}r.cursor=r.limit-a;if(!r.slice_del()){return false}var u=r.limit-r.cursor;e=r.find_among_b(i);if(e==0){return false}r.cursor=r.limit-u;switch(e){case 1:{var t=r.cursor;r.insert(r.cursor,r.cursor,"e");r.cursor=t}break;case 2:r.ket=r.cursor;if(r.cursor<=r.limit_backward){return false}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}break;case 3:if(r.cursor!=n){return false}var f=r.limit-r.cursor;if(!b()){return false}r.cursor=r.limit-f;{var l=r.cursor;r.insert(r.cursor,r.cursor,"e");r.cursor=l}break}break}return true}function g(){r.ket=r.cursor;r:{var e=r.limit-r.cursor;e:{if(!r.eq_s_b("y")){break e}break r}r.cursor=r.limit-e;if(!r.eq_s_b("Y")){return false}}r.bra=r.cursor;r:while(true){e:{if(!r.in_grouping_b(c,97,121)){break e}break r}if(r.cursor<=r.limit_backward){return false}r.cursor--}if(!r.slice_from("i")){return false}return true}function d(){var e;r.ket=r.cursor;e=r.find_among_b(a);if(e==0){return false}r.bra=r.cursor;if(!m()){return false}switch(e){case 1:if(!r.slice_from("tion")){return false}break;case 2:if(!r.slice_from("ence")){return false}break;case 3:if(!r.slice_from("ance")){return false}break;case 4:if(!r.slice_from("able")){return false}break;case 5:if(!r.slice_from("ent")){return false}break;case 6:if(!r.slice_from("e")){return false}break;case 7:if(!r.slice_from("ize")){return false}break;case 8:if(!r.slice_from("ate")){return false}break;case 9:if(!r.slice_from("al")){return false}break;case 10:if(!r.slice_from("ful")){return false}break;case 11:if(!r.slice_from("ous")){return false}break;case 12:if(!r.slice_from("ive")){return false}break;case 13:if(!r.slice_from("ble")){return false}break}return true}function w(){var e;r.ket=r.cursor;e=r.find_among_b(u);if(e==0){return false}r.bra=r.cursor;if(!m()){return false}switch(e){case 1:if(!r.slice_from("al")){return false}break;case 2:if(!r.slice_from("ic")){return false}break;case 3:if(!r.slice_del()){return false}break}return true}function h(){var e;r.ket=r.cursor;e=r.find_among_b(t);if(e==0){return false}r.bra=r.cursor;if(!_()){return false}switch(e){case 1:if(!r.slice_del()){return false}break;case 2:r:{var i=r.limit-r.cursor;e:{if(!r.eq_s_b("s")){break e}break r}r.cursor=r.limit-i;if(!r.eq_s_b("t")){return false}}if(!r.slice_del()){return false}break}return true}function p(){r.ket=r.cursor;if(!r.eq_s_b("e")){return false}r.bra=r.cursor;r:{var e=r.limit-r.cursor;e:{if(!_()){break e}break r}r.cursor=r.limit-e;if(!m()){return false}{var i=r.limit-r.cursor;e:{if(!b()){break e}return false}r.cursor=r.limit-i}}if(!r.slice_del()){return false}return true}function q(){r.ket=r.cursor;if(!r.eq_s_b("l")){return false}r.bra=r.cursor;if(!_()){return false}if(!r.eq_s_b("l")){return false}if(!r.slice_del()){return false}return true}this.stem=function(){l=false;var e=r.cursor;r:{r.bra=r.cursor;if(!r.eq_s("y")){break r}r.ket=r.cursor;if(!r.slice_from("Y")){return false}l=true}r.cursor=e;var i=r.cursor;r:{while(true){var s=r.cursor;e:{i:while(true){var a=r.cursor;s:{if(!r.in_grouping(c,97,121)){break s}r.bra=r.cursor;if(!r.eq_s("y")){break s}r.ket=r.cursor;r.cursor=a;break i}r.cursor=a;if(r.cursor>=r.limit){break e}r.cursor++}if(!r.slice_from("Y")){return false}l=true;continue}r.cursor=s;break}}r.cursor=i;n=r.limit;o=r.limit;var u=r.cursor;r:{e:while(true){i:{if(!r.in_grouping(c,97,121)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(c,97,121)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}n=r.cursor;e:while(true){i:{if(!r.in_grouping(c,97,121)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(c,97,121)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}o=r.cursor}r.cursor=u;r.limit_backward=r.cursor;r.cursor=r.limit;var t=r.limit-r.cursor;k();r.cursor=r.limit-t;var f=r.limit-r.cursor;v();r.cursor=r.limit-f;var b=r.limit-r.cursor;g();r.cursor=r.limit-b;var m=r.limit-r.cursor;d();r.cursor=r.limit-m;var _=r.limit-r.cursor;w();r.cursor=r.limit-_;var z=r.limit-r.cursor;h();r.cursor=r.limit-z;var y=r.limit-r.cursor;p();r.cursor=r.limit-y;var Y=r.limit-r.cursor;q();r.cursor=r.limit-Y;r.cursor=r.limit_backward;var C=r.cursor;r:{if(!l){break r}while(true){var S=r.cursor;e:{i:while(true){var B=r.cursor;s:{r.bra=r.cursor;if(!r.eq_s("Y")){break s}r.ket=r.cursor;r.cursor=B;break i}r.cursor=B;if(r.cursor>=r.limit){break e}r.cursor++}if(!r.slice_from("y")){return false}continue}r.cursor=S;break}}r.cursor=C;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/portuguese-stemmer.js b/sphinx/search/minified-js/portuguese-stemmer.js
new file mode 100644
index 0000000..022d860
--- /dev/null
+++ b/sphinx/search/minified-js/portuguese-stemmer.js
@@ -0,0 +1 @@
+PortugueseStemmer=function(){var r=new BaseStemmer;var e=[["",-1,3],["ã",0,1],["õ",0,2]];var i=[["",-1,3],["a~",0,1],["o~",0,2]];var s=[["ic",-1,-1],["ad",-1,-1],["os",-1,-1],["iv",-1,1]];var a=[["ante",-1,1],["avel",-1,1],["ível",-1,1]];var u=[["ic",-1,1],["abil",-1,1],["iv",-1,1]];var o=[["ica",-1,1],["ância",-1,1],["ência",-1,4],["logia",-1,2],["ira",-1,9],["adora",-1,1],["osa",-1,1],["ista",-1,1],["iva",-1,8],["eza",-1,1],["idade",-1,7],["ante",-1,1],["mente",-1,6],["amente",12,5],["ável",-1,1],["ível",-1,1],["ico",-1,1],["ismo",-1,1],["oso",-1,1],["amento",-1,1],["imento",-1,1],["ivo",-1,8],["aça~o",-1,1],["uça~o",-1,3],["ador",-1,1],["icas",-1,1],["ências",-1,4],["logias",-1,2],["iras",-1,9],["adoras",-1,1],["osas",-1,1],["istas",-1,1],["ivas",-1,8],["ezas",-1,1],["idades",-1,7],["adores",-1,1],["antes",-1,1],["aço~es",-1,1],["uço~es",-1,3],["icos",-1,1],["ismos",-1,1],["osos",-1,1],["amentos",-1,1],["imentos",-1,1],["ivos",-1,8]];var t=[["ada",-1,1],["ida",-1,1],["ia",-1,1],["aria",2,1],["eria",2,1],["iria",2,1],["ara",-1,1],["era",-1,1],["ira",-1,1],["ava",-1,1],["asse",-1,1],["esse",-1,1],["isse",-1,1],["aste",-1,1],["este",-1,1],["iste",-1,1],["ei",-1,1],["arei",16,1],["erei",16,1],["irei",16,1],["am",-1,1],["iam",20,1],["ariam",21,1],["eriam",21,1],["iriam",21,1],["aram",20,1],["eram",20,1],["iram",20,1],["avam",20,1],["em",-1,1],["arem",29,1],["erem",29,1],["irem",29,1],["assem",29,1],["essem",29,1],["issem",29,1],["ado",-1,1],["ido",-1,1],["ando",-1,1],["endo",-1,1],["indo",-1,1],["ara~o",-1,1],["era~o",-1,1],["ira~o",-1,1],["ar",-1,1],["er",-1,1],["ir",-1,1],["as",-1,1],["adas",47,1],["idas",47,1],["ias",47,1],["arias",50,1],["erias",50,1],["irias",50,1],["aras",47,1],["eras",47,1],["iras",47,1],["avas",47,1],["es",-1,1],["ardes",58,1],["erdes",58,1],["irdes",58,1],["ares",58,1],["eres",58,1],["ires",58,1],["asses",58,1],["esses",58,1],["isses",58,1],["astes",58,1],["estes",58,1],["istes",58,1],["is",-1,1],["ais",71,1],["eis",71,1],["areis",73,1],["ereis",73,1],["ireis",73,1],["áreis",73,1],["éreis",73,1],["íreis",73,1],["ásseis",73,1],["ésseis",73,1],["ísseis",73,1],["áveis",73,1],["íeis",73,1],["aríeis",84,1],["eríeis",84,1],["iríeis",84,1],["ados",-1,1],["idos",-1,1],["amos",-1,1],["áramos",90,1],["éramos",90,1],["íramos",90,1],["ávamos",90,1],["íamos",90,1],["aríamos",95,1],["eríamos",95,1],["iríamos",95,1],["emos",-1,1],["aremos",99,1],["eremos",99,1],["iremos",99,1],["ássemos",99,1],["êssemos",99,1],["íssemos",99,1],["imos",-1,1],["armos",-1,1],["ermos",-1,1],["irmos",-1,1],["ámos",-1,1],["arás",-1,1],["erás",-1,1],["irás",-1,1],["eu",-1,1],["iu",-1,1],["ou",-1,1],["ará",-1,1],["erá",-1,1],["irá",-1,1]];var c=[["a",-1,1],["i",-1,1],["o",-1,1],["os",-1,1],["á",-1,1],["í",-1,1],["ó",-1,1]];var f=[["e",-1,1],["ç",-1,2],["é",-1,1],["ê",-1,1]];var l=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2];var n=0;var m=0;var b=0;function k(){var i;while(true){var s=r.cursor;r:{r.bra=r.cursor;i=r.find_among(e);if(i==0){break r}r.ket=r.cursor;switch(i){case 1:if(!r.slice_from("a~")){return false}break;case 2:if(!r.slice_from("o~")){return false}break;case 3:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=s;break}return true}function _(){b=r.limit;m=r.limit;n=r.limit;var e=r.cursor;r:{e:{var i=r.cursor;i:{if(!r.in_grouping(l,97,250)){break i}s:{var s=r.cursor;a:{if(!r.out_grouping(l,97,250)){break a}u:while(true){o:{if(!r.in_grouping(l,97,250)){break o}break u}if(r.cursor>=r.limit){break a}r.cursor++}break s}r.cursor=s;if(!r.in_grouping(l,97,250)){break i}a:while(true){u:{if(!r.out_grouping(l,97,250)){break u}break a}if(r.cursor>=r.limit){break i}r.cursor++}}break e}r.cursor=i;if(!r.out_grouping(l,97,250)){break r}i:{var a=r.cursor;s:{if(!r.out_grouping(l,97,250)){break s}a:while(true){u:{if(!r.in_grouping(l,97,250)){break u}break a}if(r.cursor>=r.limit){break s}r.cursor++}break i}r.cursor=a;if(!r.in_grouping(l,97,250)){break r}if(r.cursor>=r.limit){break r}r.cursor++}}b=r.cursor}r.cursor=e;var u=r.cursor;r:{e:while(true){i:{if(!r.in_grouping(l,97,250)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(l,97,250)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}m=r.cursor;e:while(true){i:{if(!r.in_grouping(l,97,250)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(l,97,250)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}n=r.cursor}r.cursor=u;return true}function v(){var e;while(true){var s=r.cursor;r:{r.bra=r.cursor;e=r.find_among(i);if(e==0){break r}r.ket=r.cursor;switch(e){case 1:if(!r.slice_from("ã")){return false}break;case 2:if(!r.slice_from("õ")){return false}break;case 3:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=s;break}return true}function d(){if(!(b<=r.cursor)){return false}return true}function g(){if(!(m<=r.cursor)){return false}return true}function w(){if(!(n<=r.cursor)){return false}return true}function h(){var e;r.ket=r.cursor;e=r.find_among_b(o);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!w()){return false}if(!r.slice_del()){return false}break;case 2:if(!w()){return false}if(!r.slice_from("log")){return false}break;case 3:if(!w()){return false}if(!r.slice_from("u")){return false}break;case 4:if(!w()){return false}if(!r.slice_from("ente")){return false}break;case 5:if(!g()){return false}if(!r.slice_del()){return false}var i=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(s);if(e==0){r.cursor=r.limit-i;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-i;break r}if(!r.slice_del()){return false}switch(e){case 1:r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-i;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-i;break r}if(!r.slice_del()){return false}break}}break;case 6:if(!w()){return false}if(!r.slice_del()){return false}var t=r.limit-r.cursor;r:{r.ket=r.cursor;if(r.find_among_b(a)==0){r.cursor=r.limit-t;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-t;break r}if(!r.slice_del()){return false}}break;case 7:if(!w()){return false}if(!r.slice_del()){return false}var c=r.limit-r.cursor;r:{r.ket=r.cursor;if(r.find_among_b(u)==0){r.cursor=r.limit-c;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}}break;case 8:if(!w()){return false}if(!r.slice_del()){return false}var f=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-f;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-f;break r}if(!r.slice_del()){return false}}break;case 9:if(!d()){return false}if(!r.eq_s_b("e")){return false}if(!r.slice_from("ir")){return false}break}return true}function p(){if(r.cursor<b){return false}var e=r.limit_backward;r.limit_backward=b;r.ket=r.cursor;if(r.find_among_b(t)==0){r.limit_backward=e;return false}r.bra=r.cursor;if(!r.slice_del()){return false}r.limit_backward=e;return true}function q(){r.ket=r.cursor;if(r.find_among_b(c)==0){return false}r.bra=r.cursor;if(!d()){return false}if(!r.slice_del()){return false}return true}function z(){var e;r.ket=r.cursor;e=r.find_among_b(f);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!d()){return false}if(!r.slice_del()){return false}r.ket=r.cursor;r:{var i=r.limit-r.cursor;e:{if(!r.eq_s_b("u")){break e}r.bra=r.cursor;var s=r.limit-r.cursor;if(!r.eq_s_b("g")){break e}r.cursor=r.limit-s;break r}r.cursor=r.limit-i;if(!r.eq_s_b("i")){return false}r.bra=r.cursor;var a=r.limit-r.cursor;if(!r.eq_s_b("c")){return false}r.cursor=r.limit-a}if(!d()){return false}if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("c")){return false}break}return true}this.stem=function(){var e=r.cursor;k();r.cursor=e;_();r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;r:{e:{var s=r.limit-r.cursor;i:{var a=r.limit-r.cursor;s:{var u=r.limit-r.cursor;a:{if(!h()){break a}break s}r.cursor=r.limit-u;if(!p()){break i}}r.cursor=r.limit-a;var o=r.limit-r.cursor;s:{r.ket=r.cursor;if(!r.eq_s_b("i")){break s}r.bra=r.cursor;var t=r.limit-r.cursor;if(!r.eq_s_b("c")){break s}r.cursor=r.limit-t;if(!d()){break s}if(!r.slice_del()){return false}}r.cursor=r.limit-o;break e}r.cursor=r.limit-s;if(!q()){break r}}}r.cursor=r.limit-i;var c=r.limit-r.cursor;z();r.cursor=r.limit-c;r.cursor=r.limit_backward;var f=r.cursor;v();r.cursor=f;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/romanian-stemmer.js b/sphinx/search/minified-js/romanian-stemmer.js
new file mode 100644
index 0000000..01c54d0
--- /dev/null
+++ b/sphinx/search/minified-js/romanian-stemmer.js
@@ -0,0 +1 @@
+RomanianStemmer=function(){var r=new BaseStemmer;var i=[["",-1,3],["I",0,1],["U",0,2]];var e=[["ea",-1,3],["aţia",-1,7],["aua",-1,2],["iua",-1,4],["aţie",-1,7],["ele",-1,3],["ile",-1,5],["iile",6,4],["iei",-1,4],["atei",-1,6],["ii",-1,4],["ului",-1,1],["ul",-1,1],["elor",-1,3],["ilor",-1,4],["iilor",14,4]];var a=[["icala",-1,4],["iciva",-1,4],["ativa",-1,5],["itiva",-1,6],["icale",-1,4],["aţiune",-1,5],["iţiune",-1,6],["atoare",-1,5],["itoare",-1,6],["ătoare",-1,5],["icitate",-1,4],["abilitate",-1,1],["ibilitate",-1,2],["ivitate",-1,3],["icive",-1,4],["ative",-1,5],["itive",-1,6],["icali",-1,4],["atori",-1,5],["icatori",18,4],["itori",-1,6],["ători",-1,5],["icitati",-1,4],["abilitati",-1,1],["ivitati",-1,3],["icivi",-1,4],["ativi",-1,5],["itivi",-1,6],["icităi",-1,4],["abilităi",-1,1],["ivităi",-1,3],["icităţi",-1,4],["abilităţi",-1,1],["ivităţi",-1,3],["ical",-1,4],["ator",-1,5],["icator",35,4],["itor",-1,6],["ător",-1,5],["iciv",-1,4],["ativ",-1,5],["itiv",-1,6],["icală",-1,4],["icivă",-1,4],["ativă",-1,5],["itivă",-1,6]];var t=[["ica",-1,1],["abila",-1,1],["ibila",-1,1],["oasa",-1,1],["ata",-1,1],["ita",-1,1],["anta",-1,1],["ista",-1,3],["uta",-1,1],["iva",-1,1],["ic",-1,1],["ice",-1,1],["abile",-1,1],["ibile",-1,1],["isme",-1,3],["iune",-1,2],["oase",-1,1],["ate",-1,1],["itate",17,1],["ite",-1,1],["ante",-1,1],["iste",-1,3],["ute",-1,1],["ive",-1,1],["ici",-1,1],["abili",-1,1],["ibili",-1,1],["iuni",-1,2],["atori",-1,1],["osi",-1,1],["ati",-1,1],["itati",30,1],["iti",-1,1],["anti",-1,1],["isti",-1,3],["uti",-1,1],["işti",-1,3],["ivi",-1,1],["ităi",-1,1],["oşi",-1,1],["ităţi",-1,1],["abil",-1,1],["ibil",-1,1],["ism",-1,3],["ator",-1,1],["os",-1,1],["at",-1,1],["it",-1,1],["ant",-1,1],["ist",-1,3],["ut",-1,1],["iv",-1,1],["ică",-1,1],["abilă",-1,1],["ibilă",-1,1],["oasă",-1,1],["ată",-1,1],["ită",-1,1],["antă",-1,1],["istă",-1,3],["ută",-1,1],["ivă",-1,1]];var s=[["ea",-1,1],["ia",-1,1],["esc",-1,1],["ăsc",-1,1],["ind",-1,1],["ând",-1,1],["are",-1,1],["ere",-1,1],["ire",-1,1],["âre",-1,1],["se",-1,2],["ase",10,1],["sese",10,2],["ise",10,1],["use",10,1],["âse",10,1],["eşte",-1,1],["ăşte",-1,1],["eze",-1,1],["ai",-1,1],["eai",19,1],["iai",19,1],["sei",-1,2],["eşti",-1,1],["ăşti",-1,1],["ui",-1,1],["ezi",-1,1],["âi",-1,1],["aşi",-1,1],["seşi",-1,2],["aseşi",29,1],["seseşi",29,2],["iseşi",29,1],["useşi",29,1],["âseşi",29,1],["işi",-1,1],["uşi",-1,1],["âşi",-1,1],["aţi",-1,2],["eaţi",38,1],["iaţi",38,1],["eţi",-1,2],["iţi",-1,2],["âţi",-1,2],["arăţi",-1,1],["serăţi",-1,2],["aserăţi",45,1],["seserăţi",45,2],["iserăţi",45,1],["userăţi",45,1],["âserăţi",45,1],["irăţi",-1,1],["urăţi",-1,1],["ârăţi",-1,1],["am",-1,1],["eam",54,1],["iam",54,1],["em",-1,2],["asem",57,1],["sesem",57,2],["isem",57,1],["usem",57,1],["âsem",57,1],["im",-1,2],["âm",-1,2],["ăm",-1,2],["arăm",65,1],["serăm",65,2],["aserăm",67,1],["seserăm",67,2],["iserăm",67,1],["userăm",67,1],["âserăm",67,1],["irăm",65,1],["urăm",65,1],["ârăm",65,1],["au",-1,1],["eau",76,1],["iau",76,1],["indu",-1,1],["ându",-1,1],["ez",-1,1],["ească",-1,1],["ară",-1,1],["seră",-1,2],["aseră",84,1],["seseră",84,2],["iseră",84,1],["useră",84,1],["âseră",84,1],["iră",-1,1],["ură",-1,1],["âră",-1,1],["ează",-1,1]];var u=[["a",-1,1],["e",-1,1],["ie",1,1],["i",-1,1],["ă",-1,1]];var c=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4];var o=false;var f=0;var l=0;var n=0;function b(){while(true){var i=r.cursor;r:{i:while(true){var e=r.cursor;e:{if(!r.in_grouping(c,97,259)){break e}r.bra=r.cursor;a:{var a=r.cursor;t:{if(!r.eq_s("u")){break t}r.ket=r.cursor;if(!r.in_grouping(c,97,259)){break t}if(!r.slice_from("U")){return false}break a}r.cursor=a;if(!r.eq_s("i")){break e}r.ket=r.cursor;if(!r.in_grouping(c,97,259)){break e}if(!r.slice_from("I")){return false}}r.cursor=e;break i}r.cursor=e;if(r.cursor>=r.limit){break r}r.cursor++}continue}r.cursor=i;break}return true}function m(){n=r.limit;l=r.limit;f=r.limit;var i=r.cursor;r:{i:{var e=r.cursor;e:{if(!r.in_grouping(c,97,259)){break e}a:{var a=r.cursor;t:{if(!r.out_grouping(c,97,259)){break t}s:while(true){u:{if(!r.in_grouping(c,97,259)){break u}break s}if(r.cursor>=r.limit){break t}r.cursor++}break a}r.cursor=a;if(!r.in_grouping(c,97,259)){break e}t:while(true){s:{if(!r.out_grouping(c,97,259)){break s}break t}if(r.cursor>=r.limit){break e}r.cursor++}}break i}r.cursor=e;if(!r.out_grouping(c,97,259)){break r}e:{var t=r.cursor;a:{if(!r.out_grouping(c,97,259)){break a}t:while(true){s:{if(!r.in_grouping(c,97,259)){break s}break t}if(r.cursor>=r.limit){break a}r.cursor++}break e}r.cursor=t;if(!r.in_grouping(c,97,259)){break r}if(r.cursor>=r.limit){break r}r.cursor++}}n=r.cursor}r.cursor=i;var s=r.cursor;r:{i:while(true){e:{if(!r.in_grouping(c,97,259)){break e}break i}if(r.cursor>=r.limit){break r}r.cursor++}i:while(true){e:{if(!r.out_grouping(c,97,259)){break e}break i}if(r.cursor>=r.limit){break r}r.cursor++}l=r.cursor;i:while(true){e:{if(!r.in_grouping(c,97,259)){break e}break i}if(r.cursor>=r.limit){break r}r.cursor++}i:while(true){e:{if(!r.out_grouping(c,97,259)){break e}break i}if(r.cursor>=r.limit){break r}r.cursor++}f=r.cursor}r.cursor=s;return true}function k(){var e;while(true){var a=r.cursor;r:{r.bra=r.cursor;e=r.find_among(i);if(e==0){break r}r.ket=r.cursor;switch(e){case 1:if(!r.slice_from("i")){return false}break;case 2:if(!r.slice_from("u")){return false}break;case 3:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=a;break}return true}function _(){if(!(n<=r.cursor)){return false}return true}function v(){if(!(l<=r.cursor)){return false}return true}function g(){if(!(f<=r.cursor)){return false}return true}function w(){var i;r.ket=r.cursor;i=r.find_among_b(e);if(i==0){return false}r.bra=r.cursor;if(!v()){return false}switch(i){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("a")){return false}break;case 3:if(!r.slice_from("e")){return false}break;case 4:if(!r.slice_from("i")){return false}break;case 5:{var a=r.limit-r.cursor;r:{if(!r.eq_s_b("ab")){break r}return false}r.cursor=r.limit-a}if(!r.slice_from("i")){return false}break;case 6:if(!r.slice_from("at")){return false}break;case 7:if(!r.slice_from("aţi")){return false}break}return true}function d(){var i;var e=r.limit-r.cursor;r.ket=r.cursor;i=r.find_among_b(a);if(i==0){return false}r.bra=r.cursor;if(!v()){return false}switch(i){case 1:if(!r.slice_from("abil")){return false}break;case 2:if(!r.slice_from("ibil")){return false}break;case 3:if(!r.slice_from("iv")){return false}break;case 4:if(!r.slice_from("ic")){return false}break;case 5:if(!r.slice_from("at")){return false}break;case 6:if(!r.slice_from("it")){return false}break}o=true;r.cursor=r.limit-e;return true}function h(){var i;o=false;while(true){var e=r.limit-r.cursor;r:{if(!d()){break r}continue}r.cursor=r.limit-e;break}r.ket=r.cursor;i=r.find_among_b(t);if(i==0){return false}r.bra=r.cursor;if(!g()){return false}switch(i){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.eq_s_b("ţ")){return false}r.bra=r.cursor;if(!r.slice_from("t")){return false}break;case 3:if(!r.slice_from("ist")){return false}break}o=true;return true}function p(){var i;if(r.cursor<n){return false}var e=r.limit_backward;r.limit_backward=n;r.ket=r.cursor;i=r.find_among_b(s);if(i==0){r.limit_backward=e;return false}r.bra=r.cursor;switch(i){case 1:r:{var a=r.limit-r.cursor;i:{if(!r.out_grouping_b(c,97,259)){break i}break r}r.cursor=r.limit-a;if(!r.eq_s_b("u")){r.limit_backward=e;return false}}if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}break}r.limit_backward=e;return true}function q(){r.ket=r.cursor;if(r.find_among_b(u)==0){return false}r.bra=r.cursor;if(!_()){return false}if(!r.slice_del()){return false}return true}this.stem=function(){var i=r.cursor;b();r.cursor=i;m();r.limit_backward=r.cursor;r.cursor=r.limit;var e=r.limit-r.cursor;w();r.cursor=r.limit-e;var a=r.limit-r.cursor;h();r.cursor=r.limit-a;var t=r.limit-r.cursor;r:{i:{var s=r.limit-r.cursor;e:{if(!o){break e}break i}r.cursor=r.limit-s;if(!p()){break r}}}r.cursor=r.limit-t;var u=r.limit-r.cursor;q();r.cursor=r.limit-u;r.cursor=r.limit_backward;var c=r.cursor;k();r.cursor=c;return true};this["stemWord"]=function(i){r.setCurrent(i);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/russian-stemmer.js b/sphinx/search/minified-js/russian-stemmer.js
new file mode 100644
index 0000000..698d92b
--- /dev/null
+++ b/sphinx/search/minified-js/russian-stemmer.js
@@ -0,0 +1 @@
+RussianStemmer=function(){var r=new BaseStemmer;var e=[["в",-1,1],["ив",0,2],["ыв",0,2],["вши",-1,1],["ивши",3,2],["ывши",3,2],["вшиÑÑŒ",-1,1],["ившиÑÑŒ",6,2],["ывшиÑÑŒ",6,2]];var i=[["ее",-1,1],["ие",-1,1],["ое",-1,1],["ые",-1,1],["ими",-1,1],["ыми",-1,1],["ей",-1,1],["ий",-1,1],["ой",-1,1],["ый",-1,1],["ем",-1,1],["им",-1,1],["ом",-1,1],["ым",-1,1],["его",-1,1],["ого",-1,1],["ему",-1,1],["ому",-1,1],["их",-1,1],["Ñ‹Ñ…",-1,1],["ею",-1,1],["ою",-1,1],["ую",-1,1],["ÑŽÑŽ",-1,1],["аÑ",-1,1],["ÑÑ",-1,1]];var u=[["ем",-1,1],["нн",-1,1],["вш",-1,1],["ивш",2,2],["ывш",2,2],["щ",-1,1],["ющ",5,1],["ующ",6,2]];var s=[["ÑÑŒ",-1,1],["ÑÑ",-1,1]];var a=[["ла",-1,1],["ила",0,2],["ыла",0,2],["на",-1,1],["ена",3,2],["ете",-1,1],["ите",-1,2],["йте",-1,1],["ейте",7,2],["уйте",7,2],["ли",-1,1],["или",10,2],["ыли",10,2],["й",-1,1],["ей",13,2],["уй",13,2],["л",-1,1],["ил",16,2],["ыл",16,2],["ем",-1,1],["им",-1,2],["ым",-1,2],["н",-1,1],["ен",22,2],["ло",-1,1],["ило",24,2],["ыло",24,2],["но",-1,1],["ено",27,2],["нно",27,1],["ет",-1,1],["ует",30,2],["ит",-1,2],["Ñ‹Ñ‚",-1,2],["ÑŽÑ‚",-1,1],["уют",34,2],["ÑÑ‚",-1,2],["ны",-1,1],["ены",37,2],["Ñ‚ÑŒ",-1,1],["ить",39,2],["Ñ‹Ñ‚ÑŒ",39,2],["ешь",-1,1],["ишь",-1,2],["ÑŽ",-1,2],["ую",44,2]];var t=[["а",-1,1],["ев",-1,1],["ов",-1,1],["е",-1,1],["ие",3,1],["ье",3,1],["и",-1,1],["еи",6,1],["ии",6,1],["ами",6,1],["Ñми",6,1],["иÑми",10,1],["й",-1,1],["ей",12,1],["ией",13,1],["ий",12,1],["ой",12,1],["ам",-1,1],["ем",-1,1],["ием",18,1],["ом",-1,1],["Ñм",-1,1],["иÑм",21,1],["о",-1,1],["у",-1,1],["ах",-1,1],["ÑÑ…",-1,1],["иÑÑ…",26,1],["Ñ‹",-1,1],["ÑŒ",-1,1],["ÑŽ",-1,1],["ию",30,1],["ью",30,1],["Ñ",-1,1],["иÑ",33,1],["ÑŒÑ",33,1]];var c=[["оÑÑ‚",-1,1],["оÑÑ‚ÑŒ",-1,1]];var f=[["ейше",-1,1],["н",-1,2],["ейш",-1,1],["ÑŒ",-1,3]];var l=[33,65,8,232];var o=0;var n=0;function b(){n=r.limit;o=r.limit;var e=r.cursor;r:{e:while(true){i:{if(!r.in_grouping(l,1072,1103)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}n=r.cursor;e:while(true){i:{if(!r.out_grouping(l,1072,1103)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.in_grouping(l,1072,1103)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(l,1072,1103)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}o=r.cursor}r.cursor=e;return true}function _(){if(!(o<=r.cursor)){return false}return true}function k(){var i;r.ket=r.cursor;i=r.find_among_b(e);if(i==0){return false}r.bra=r.cursor;switch(i){case 1:r:{var u=r.limit-r.cursor;e:{if(!r.eq_s_b("а")){break e}break r}r.cursor=r.limit-u;if(!r.eq_s_b("Ñ")){return false}}if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}break}return true}function m(){r.ket=r.cursor;if(r.find_among_b(i)==0){return false}r.bra=r.cursor;if(!r.slice_del()){return false}return true}function v(){var e;if(!m()){return false}var i=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(u);if(e==0){r.cursor=r.limit-i;break r}r.bra=r.cursor;switch(e){case 1:e:{var s=r.limit-r.cursor;i:{if(!r.eq_s_b("а")){break i}break e}r.cursor=r.limit-s;if(!r.eq_s_b("Ñ")){r.cursor=r.limit-i;break r}}if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}break}}return true}function d(){r.ket=r.cursor;if(r.find_among_b(s)==0){return false}r.bra=r.cursor;if(!r.slice_del()){return false}return true}function g(){var e;r.ket=r.cursor;e=r.find_among_b(a);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:r:{var i=r.limit-r.cursor;e:{if(!r.eq_s_b("а")){break e}break r}r.cursor=r.limit-i;if(!r.eq_s_b("Ñ")){return false}}if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}break}return true}function w(){r.ket=r.cursor;if(r.find_among_b(t)==0){return false}r.bra=r.cursor;if(!r.slice_del()){return false}return true}function h(){r.ket=r.cursor;if(r.find_among_b(c)==0){return false}r.bra=r.cursor;if(!_()){return false}if(!r.slice_del()){return false}return true}function q(){var e;r.ket=r.cursor;e=r.find_among_b(f);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!r.slice_del()){return false}r.ket=r.cursor;if(!r.eq_s_b("н")){return false}r.bra=r.cursor;if(!r.eq_s_b("н")){return false}if(!r.slice_del()){return false}break;case 2:if(!r.eq_s_b("н")){return false}if(!r.slice_del()){return false}break;case 3:if(!r.slice_del()){return false}break}return true}this.stem=function(){var e=r.cursor;r:{while(true){var i=r.cursor;e:{i:while(true){var u=r.cursor;u:{r.bra=r.cursor;if(!r.eq_s("Ñ‘")){break u}r.ket=r.cursor;r.cursor=u;break i}r.cursor=u;if(r.cursor>=r.limit){break e}r.cursor++}if(!r.slice_from("е")){return false}continue}r.cursor=i;break}}r.cursor=e;b();r.limit_backward=r.cursor;r.cursor=r.limit;if(r.cursor<n){return false}var s=r.limit_backward;r.limit_backward=n;var a=r.limit-r.cursor;r:{e:{var t=r.limit-r.cursor;i:{if(!k()){break i}break e}r.cursor=r.limit-t;var c=r.limit-r.cursor;i:{if(!d()){r.cursor=r.limit-c;break i}}i:{var f=r.limit-r.cursor;u:{if(!v()){break u}break i}r.cursor=r.limit-f;u:{if(!g()){break u}break i}r.cursor=r.limit-f;if(!w()){break r}}}}r.cursor=r.limit-a;var l=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("и")){r.cursor=r.limit-l;break r}r.bra=r.cursor;if(!r.slice_del()){return false}}var o=r.limit-r.cursor;h();r.cursor=r.limit-o;var _=r.limit-r.cursor;q();r.cursor=r.limit-_;r.limit_backward=s;r.cursor=r.limit_backward;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/spanish-stemmer.js b/sphinx/search/minified-js/spanish-stemmer.js
new file mode 100644
index 0000000..ef634a8
--- /dev/null
+++ b/sphinx/search/minified-js/spanish-stemmer.js
@@ -0,0 +1 @@
+SpanishStemmer=function(){var r=new BaseStemmer;var e=[["",-1,6],["á",0,1],["é",0,2],["í",0,3],["ó",0,4],["ú",0,5]];var i=[["la",-1,-1],["sela",0,-1],["le",-1,-1],["me",-1,-1],["se",-1,-1],["lo",-1,-1],["selo",5,-1],["las",-1,-1],["selas",7,-1],["les",-1,-1],["los",-1,-1],["selos",10,-1],["nos",-1,-1]];var a=[["ando",-1,6],["iendo",-1,6],["yendo",-1,7],["ándo",-1,2],["iéndo",-1,1],["ar",-1,6],["er",-1,6],["ir",-1,6],["ár",-1,3],["ér",-1,4],["ír",-1,5]];var s=[["ic",-1,-1],["ad",-1,-1],["os",-1,-1],["iv",-1,1]];var u=[["able",-1,1],["ible",-1,1],["ante",-1,1]];var o=[["ic",-1,1],["abil",-1,1],["iv",-1,1]];var t=[["ica",-1,1],["ancia",-1,2],["encia",-1,5],["adora",-1,2],["osa",-1,1],["ista",-1,1],["iva",-1,9],["anza",-1,1],["logía",-1,3],["idad",-1,8],["able",-1,1],["ible",-1,1],["ante",-1,2],["mente",-1,7],["amente",13,6],["ación",-1,2],["ución",-1,4],["ico",-1,1],["ismo",-1,1],["oso",-1,1],["amiento",-1,1],["imiento",-1,1],["ivo",-1,9],["ador",-1,2],["icas",-1,1],["ancias",-1,2],["encias",-1,5],["adoras",-1,2],["osas",-1,1],["istas",-1,1],["ivas",-1,9],["anzas",-1,1],["logías",-1,3],["idades",-1,8],["ables",-1,1],["ibles",-1,1],["aciones",-1,2],["uciones",-1,4],["adores",-1,2],["antes",-1,2],["icos",-1,1],["ismos",-1,1],["osos",-1,1],["amientos",-1,1],["imientos",-1,1],["ivos",-1,9]];var c=[["ya",-1,1],["ye",-1,1],["yan",-1,1],["yen",-1,1],["yeron",-1,1],["yendo",-1,1],["yo",-1,1],["yas",-1,1],["yes",-1,1],["yais",-1,1],["yamos",-1,1],["yó",-1,1]];var l=[["aba",-1,2],["ada",-1,2],["ida",-1,2],["ara",-1,2],["iera",-1,2],["ía",-1,2],["aría",5,2],["ería",5,2],["iría",5,2],["ad",-1,2],["ed",-1,2],["id",-1,2],["ase",-1,2],["iese",-1,2],["aste",-1,2],["iste",-1,2],["an",-1,2],["aban",16,2],["aran",16,2],["ieran",16,2],["ían",16,2],["arían",20,2],["erían",20,2],["irían",20,2],["en",-1,1],["asen",24,2],["iesen",24,2],["aron",-1,2],["ieron",-1,2],["arán",-1,2],["erán",-1,2],["irán",-1,2],["ado",-1,2],["ido",-1,2],["ando",-1,2],["iendo",-1,2],["ar",-1,2],["er",-1,2],["ir",-1,2],["as",-1,2],["abas",39,2],["adas",39,2],["idas",39,2],["aras",39,2],["ieras",39,2],["ías",39,2],["arías",45,2],["erías",45,2],["irías",45,2],["es",-1,1],["ases",49,2],["ieses",49,2],["abais",-1,2],["arais",-1,2],["ierais",-1,2],["íais",-1,2],["aríais",55,2],["eríais",55,2],["iríais",55,2],["aseis",-1,2],["ieseis",-1,2],["asteis",-1,2],["isteis",-1,2],["áis",-1,2],["éis",-1,1],["aréis",64,2],["eréis",64,2],["iréis",64,2],["ados",-1,2],["idos",-1,2],["amos",-1,2],["ábamos",70,2],["áramos",70,2],["iéramos",70,2],["íamos",70,2],["aríamos",74,2],["eríamos",74,2],["iríamos",74,2],["emos",-1,1],["aremos",78,2],["eremos",78,2],["iremos",78,2],["ásemos",78,2],["iésemos",78,2],["imos",-1,2],["arás",-1,2],["erás",-1,2],["irás",-1,2],["ís",-1,2],["ará",-1,2],["erá",-1,2],["irá",-1,2],["aré",-1,2],["eré",-1,2],["iré",-1,2],["ió",-1,2]];var f=[["a",-1,1],["e",-1,2],["o",-1,1],["os",-1,1],["á",-1,1],["é",-1,2],["í",-1,1],["ó",-1,1]];var n=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10];var b=0;var m=0;var k=0;function _(){k=r.limit;m=r.limit;b=r.limit;var e=r.cursor;r:{e:{var i=r.cursor;i:{if(!r.in_grouping(n,97,252)){break i}a:{var a=r.cursor;s:{if(!r.out_grouping(n,97,252)){break s}u:while(true){o:{if(!r.in_grouping(n,97,252)){break o}break u}if(r.cursor>=r.limit){break s}r.cursor++}break a}r.cursor=a;if(!r.in_grouping(n,97,252)){break i}s:while(true){u:{if(!r.out_grouping(n,97,252)){break u}break s}if(r.cursor>=r.limit){break i}r.cursor++}}break e}r.cursor=i;if(!r.out_grouping(n,97,252)){break r}i:{var s=r.cursor;a:{if(!r.out_grouping(n,97,252)){break a}s:while(true){u:{if(!r.in_grouping(n,97,252)){break u}break s}if(r.cursor>=r.limit){break a}r.cursor++}break i}r.cursor=s;if(!r.in_grouping(n,97,252)){break r}if(r.cursor>=r.limit){break r}r.cursor++}}k=r.cursor}r.cursor=e;var u=r.cursor;r:{e:while(true){i:{if(!r.in_grouping(n,97,252)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(n,97,252)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}m=r.cursor;e:while(true){i:{if(!r.in_grouping(n,97,252)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}e:while(true){i:{if(!r.out_grouping(n,97,252)){break i}break e}if(r.cursor>=r.limit){break r}r.cursor++}b=r.cursor}r.cursor=u;return true}function d(){var i;while(true){var a=r.cursor;r:{r.bra=r.cursor;i=r.find_among(e);if(i==0){break r}r.ket=r.cursor;switch(i){case 1:if(!r.slice_from("a")){return false}break;case 2:if(!r.slice_from("e")){return false}break;case 3:if(!r.slice_from("i")){return false}break;case 4:if(!r.slice_from("o")){return false}break;case 5:if(!r.slice_from("u")){return false}break;case 6:if(r.cursor>=r.limit){break r}r.cursor++;break}continue}r.cursor=a;break}return true}function v(){if(!(k<=r.cursor)){return false}return true}function g(){if(!(m<=r.cursor)){return false}return true}function w(){if(!(b<=r.cursor)){return false}return true}function h(){var e;r.ket=r.cursor;if(r.find_among_b(i)==0){return false}r.bra=r.cursor;e=r.find_among_b(a);if(e==0){return false}if(!v()){return false}switch(e){case 1:r.bra=r.cursor;if(!r.slice_from("iendo")){return false}break;case 2:r.bra=r.cursor;if(!r.slice_from("ando")){return false}break;case 3:r.bra=r.cursor;if(!r.slice_from("ar")){return false}break;case 4:r.bra=r.cursor;if(!r.slice_from("er")){return false}break;case 5:r.bra=r.cursor;if(!r.slice_from("ir")){return false}break;case 6:if(!r.slice_del()){return false}break;case 7:if(!r.eq_s_b("u")){return false}if(!r.slice_del()){return false}break}return true}function p(){var e;r.ket=r.cursor;e=r.find_among_b(t);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!w()){return false}if(!r.slice_del()){return false}break;case 2:if(!w()){return false}if(!r.slice_del()){return false}var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("ic")){r.cursor=r.limit-i;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-i;break r}if(!r.slice_del()){return false}}break;case 3:if(!w()){return false}if(!r.slice_from("log")){return false}break;case 4:if(!w()){return false}if(!r.slice_from("u")){return false}break;case 5:if(!w()){return false}if(!r.slice_from("ente")){return false}break;case 6:if(!g()){return false}if(!r.slice_del()){return false}var a=r.limit-r.cursor;r:{r.ket=r.cursor;e=r.find_among_b(s);if(e==0){r.cursor=r.limit-a;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-a;break r}if(!r.slice_del()){return false}switch(e){case 1:r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-a;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-a;break r}if(!r.slice_del()){return false}break}}break;case 7:if(!w()){return false}if(!r.slice_del()){return false}var c=r.limit-r.cursor;r:{r.ket=r.cursor;if(r.find_among_b(u)==0){r.cursor=r.limit-c;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-c;break r}if(!r.slice_del()){return false}}break;case 8:if(!w()){return false}if(!r.slice_del()){return false}var l=r.limit-r.cursor;r:{r.ket=r.cursor;if(r.find_among_b(o)==0){r.cursor=r.limit-l;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-l;break r}if(!r.slice_del()){return false}}break;case 9:if(!w()){return false}if(!r.slice_del()){return false}var f=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("at")){r.cursor=r.limit-f;break r}r.bra=r.cursor;if(!w()){r.cursor=r.limit-f;break r}if(!r.slice_del()){return false}}break}return true}function y(){if(r.cursor<k){return false}var e=r.limit_backward;r.limit_backward=k;r.ket=r.cursor;if(r.find_among_b(c)==0){r.limit_backward=e;return false}r.bra=r.cursor;r.limit_backward=e;if(!r.eq_s_b("u")){return false}if(!r.slice_del()){return false}return true}function q(){var e;if(r.cursor<k){return false}var i=r.limit_backward;r.limit_backward=k;r.ket=r.cursor;e=r.find_among_b(l);if(e==0){r.limit_backward=i;return false}r.bra=r.cursor;r.limit_backward=i;switch(e){case 1:var a=r.limit-r.cursor;r:{if(!r.eq_s_b("u")){r.cursor=r.limit-a;break r}var s=r.limit-r.cursor;if(!r.eq_s_b("g")){r.cursor=r.limit-a;break r}r.cursor=r.limit-s}r.bra=r.cursor;if(!r.slice_del()){return false}break;case 2:if(!r.slice_del()){return false}break}return true}function S(){var e;r.ket=r.cursor;e=r.find_among_b(f);if(e==0){return false}r.bra=r.cursor;switch(e){case 1:if(!v()){return false}if(!r.slice_del()){return false}break;case 2:if(!v()){return false}if(!r.slice_del()){return false}var i=r.limit-r.cursor;r:{r.ket=r.cursor;if(!r.eq_s_b("u")){r.cursor=r.limit-i;break r}r.bra=r.cursor;var a=r.limit-r.cursor;if(!r.eq_s_b("g")){r.cursor=r.limit-i;break r}r.cursor=r.limit-a;if(!v()){r.cursor=r.limit-i;break r}if(!r.slice_del()){return false}}break}return true}this.stem=function(){_();r.limit_backward=r.cursor;r.cursor=r.limit;var e=r.limit-r.cursor;h();r.cursor=r.limit-e;var i=r.limit-r.cursor;r:{e:{var a=r.limit-r.cursor;i:{if(!p()){break i}break e}r.cursor=r.limit-a;i:{if(!y()){break i}break e}r.cursor=r.limit-a;if(!q()){break r}}}r.cursor=r.limit-i;var s=r.limit-r.cursor;S();r.cursor=r.limit-s;r.cursor=r.limit_backward;var u=r.cursor;d();r.cursor=u;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/swedish-stemmer.js b/sphinx/search/minified-js/swedish-stemmer.js
new file mode 100644
index 0000000..b975f54
--- /dev/null
+++ b/sphinx/search/minified-js/swedish-stemmer.js
@@ -0,0 +1 @@
+SwedishStemmer=function(){var r=new BaseStemmer;var e=[["a",-1,1],["arna",0,1],["erna",0,1],["heterna",2,1],["orna",0,1],["ad",-1,1],["e",-1,1],["ade",6,1],["ande",6,1],["arne",6,1],["are",6,1],["aste",6,1],["en",-1,1],["anden",12,1],["aren",12,1],["heten",12,1],["ern",-1,1],["ar",-1,1],["er",-1,1],["heter",18,1],["or",-1,1],["s",-1,2],["as",21,1],["arnas",22,1],["ernas",22,1],["ornas",22,1],["es",21,1],["ades",26,1],["andes",26,1],["ens",21,1],["arens",29,1],["hetens",29,1],["erns",21,1],["at",-1,1],["andet",-1,1],["het",-1,1],["ast",-1,1]];var a=[["dd",-1,-1],["gd",-1,-1],["nn",-1,-1],["dt",-1,-1],["gt",-1,-1],["kt",-1,-1],["tt",-1,-1]];var i=[["ig",-1,1],["lig",0,1],["els",-1,1],["fullt",-1,3],["löst",-1,2]];var t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32];var s=[119,127,149];var u=0;var n=0;function c(){n=r.limit;var e=r.cursor;{var a=r.cursor+3;if(a>r.limit){return false}r.cursor=a}u=r.cursor;r.cursor=e;r:while(true){var i=r.cursor;e:{if(!r.in_grouping(t,97,246)){break e}r.cursor=i;break r}r.cursor=i;if(r.cursor>=r.limit){return false}r.cursor++}r:while(true){e:{if(!r.out_grouping(t,97,246)){break e}break r}if(r.cursor>=r.limit){return false}r.cursor++}n=r.cursor;r:{if(!(n<u)){break r}n=u}return true}function l(){var a;if(r.cursor<n){return false}var i=r.limit_backward;r.limit_backward=n;r.ket=r.cursor;a=r.find_among_b(e);if(a==0){r.limit_backward=i;return false}r.bra=r.cursor;r.limit_backward=i;switch(a){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.in_grouping_b(s,98,121)){return false}if(!r.slice_del()){return false}break}return true}function o(){if(r.cursor<n){return false}var e=r.limit_backward;r.limit_backward=n;var i=r.limit-r.cursor;if(r.find_among_b(a)==0){r.limit_backward=e;return false}r.cursor=r.limit-i;r.ket=r.cursor;if(r.cursor<=r.limit_backward){r.limit_backward=e;return false}r.cursor--;r.bra=r.cursor;if(!r.slice_del()){return false}r.limit_backward=e;return true}function f(){var e;if(r.cursor<n){return false}var a=r.limit_backward;r.limit_backward=n;r.ket=r.cursor;e=r.find_among_b(i);if(e==0){r.limit_backward=a;return false}r.bra=r.cursor;switch(e){case 1:if(!r.slice_del()){return false}break;case 2:if(!r.slice_from("lös")){return false}break;case 3:if(!r.slice_from("full")){return false}break}r.limit_backward=a;return true}this.stem=function(){var e=r.cursor;c();r.cursor=e;r.limit_backward=r.cursor;r.cursor=r.limit;var a=r.limit-r.cursor;l();r.cursor=r.limit-a;var i=r.limit-r.cursor;o();r.cursor=r.limit-i;var t=r.limit-r.cursor;f();r.cursor=r.limit-t;r.cursor=r.limit_backward;return true};this["stemWord"]=function(e){r.setCurrent(e);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/minified-js/turkish-stemmer.js b/sphinx/search/minified-js/turkish-stemmer.js
new file mode 100644
index 0000000..4c0a699
--- /dev/null
+++ b/sphinx/search/minified-js/turkish-stemmer.js
@@ -0,0 +1 @@
+TurkishStemmer=function(){var r=new BaseStemmer;var i=[["m",-1,-1],["n",-1,-1],["miz",-1,-1],["niz",-1,-1],["muz",-1,-1],["nuz",-1,-1],["müz",-1,-1],["nüz",-1,-1],["mız",-1,-1],["nız",-1,-1]];var e=[["leri",-1,-1],["ları",-1,-1]];var u=[["ni",-1,-1],["nu",-1,-1],["nü",-1,-1],["nı",-1,-1]];var a=[["in",-1,-1],["un",-1,-1],["ün",-1,-1],["ın",-1,-1]];var s=[["a",-1,-1],["e",-1,-1]];var t=[["na",-1,-1],["ne",-1,-1]];var l=[["da",-1,-1],["ta",-1,-1],["de",-1,-1],["te",-1,-1]];var c=[["nda",-1,-1],["nde",-1,-1]];var o=[["dan",-1,-1],["tan",-1,-1],["den",-1,-1],["ten",-1,-1]];var f=[["ndan",-1,-1],["nden",-1,-1]];var n=[["la",-1,-1],["le",-1,-1]];var b=[["ca",-1,-1],["ce",-1,-1]];var m=[["im",-1,-1],["um",-1,-1],["üm",-1,-1],["ım",-1,-1]];var k=[["sin",-1,-1],["sun",-1,-1],["sün",-1,-1],["sın",-1,-1]];var _=[["iz",-1,-1],["uz",-1,-1],["üz",-1,-1],["ız",-1,-1]];var v=[["siniz",-1,-1],["sunuz",-1,-1],["sünüz",-1,-1],["sınız",-1,-1]];var d=[["lar",-1,-1],["ler",-1,-1]];var g=[["niz",-1,-1],["nuz",-1,-1],["nüz",-1,-1],["nız",-1,-1]];var w=[["dir",-1,-1],["tir",-1,-1],["dur",-1,-1],["tur",-1,-1],["dür",-1,-1],["tür",-1,-1],["dır",-1,-1],["tır",-1,-1]];var q=[["casına",-1,-1],["cesine",-1,-1]];var p=[["di",-1,-1],["ti",-1,-1],["dik",-1,-1],["tik",-1,-1],["duk",-1,-1],["tuk",-1,-1],["dük",-1,-1],["tük",-1,-1],["dık",-1,-1],["tık",-1,-1],["dim",-1,-1],["tim",-1,-1],["dum",-1,-1],["tum",-1,-1],["düm",-1,-1],["tüm",-1,-1],["dım",-1,-1],["tım",-1,-1],["din",-1,-1],["tin",-1,-1],["dun",-1,-1],["tun",-1,-1],["dün",-1,-1],["tün",-1,-1],["dın",-1,-1],["tın",-1,-1],["du",-1,-1],["tu",-1,-1],["dü",-1,-1],["tü",-1,-1],["dı",-1,-1],["tı",-1,-1]];var h=[["sa",-1,-1],["se",-1,-1],["sak",-1,-1],["sek",-1,-1],["sam",-1,-1],["sem",-1,-1],["san",-1,-1],["sen",-1,-1]];var z=[["miş",-1,-1],["muş",-1,-1],["müş",-1,-1],["mış",-1,-1]];var y=[["b",-1,1],["c",-1,2],["d",-1,3],["ğ",-1,4]];var C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1];var S=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1];var B=[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1];var T=[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130];var W=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1];var j=[17];var x=[65];var A=[65];var D=false;function E(){var i=r.limit-r.cursor;r:while(true){var e=r.limit-r.cursor;i:{if(!r.in_grouping_b(C,97,305)){break i}r.cursor=r.limit-e;break r}r.cursor=r.limit-e;if(r.cursor<=r.limit_backward){return false}r.cursor--}r:{var u=r.limit-r.cursor;i:{if(!r.eq_s_b("a")){break i}e:while(true){var a=r.limit-r.cursor;u:{if(!r.in_grouping_b(B,97,305)){break u}r.cursor=r.limit-a;break e}r.cursor=r.limit-a;if(r.cursor<=r.limit_backward){break i}r.cursor--}break r}r.cursor=r.limit-u;i:{if(!r.eq_s_b("e")){break i}e:while(true){var s=r.limit-r.cursor;u:{if(!r.in_grouping_b(T,101,252)){break u}r.cursor=r.limit-s;break e}r.cursor=r.limit-s;if(r.cursor<=r.limit_backward){break i}r.cursor--}break r}r.cursor=r.limit-u;i:{if(!r.eq_s_b("ı")){break i}e:while(true){var t=r.limit-r.cursor;u:{if(!r.in_grouping_b(W,97,305)){break u}r.cursor=r.limit-t;break e}r.cursor=r.limit-t;if(r.cursor<=r.limit_backward){break i}r.cursor--}break r}r.cursor=r.limit-u;i:{if(!r.eq_s_b("i")){break i}e:while(true){var l=r.limit-r.cursor;u:{if(!r.in_grouping_b(j,101,105)){break u}r.cursor=r.limit-l;break e}r.cursor=r.limit-l;if(r.cursor<=r.limit_backward){break i}r.cursor--}break r}r.cursor=r.limit-u;i:{if(!r.eq_s_b("o")){break i}e:while(true){var c=r.limit-r.cursor;u:{if(!r.in_grouping_b(x,111,117)){break u}r.cursor=r.limit-c;break e}r.cursor=r.limit-c;if(r.cursor<=r.limit_backward){break i}r.cursor--}break r}r.cursor=r.limit-u;i:{if(!r.eq_s_b("ö")){break i}e:while(true){var o=r.limit-r.cursor;u:{if(!r.in_grouping_b(A,246,252)){break u}r.cursor=r.limit-o;break e}r.cursor=r.limit-o;if(r.cursor<=r.limit_backward){break i}r.cursor--}break r}r.cursor=r.limit-u;i:{if(!r.eq_s_b("u")){break i}e:while(true){var f=r.limit-r.cursor;u:{if(!r.in_grouping_b(x,111,117)){break u}r.cursor=r.limit-f;break e}r.cursor=r.limit-f;if(r.cursor<=r.limit_backward){break i}r.cursor--}break r}r.cursor=r.limit-u;if(!r.eq_s_b("ü")){return false}i:while(true){var n=r.limit-r.cursor;e:{if(!r.in_grouping_b(A,246,252)){break e}r.cursor=r.limit-n;break i}r.cursor=r.limit-n;if(r.cursor<=r.limit_backward){return false}r.cursor--}}r.cursor=r.limit-i;return true}function F(){r:{var i=r.limit-r.cursor;i:{if(!r.eq_s_b("n")){break i}var e=r.limit-r.cursor;if(!r.in_grouping_b(C,97,305)){break i}r.cursor=r.limit-e;break r}r.cursor=r.limit-i;{var u=r.limit-r.cursor;i:{var a=r.limit-r.cursor;if(!r.eq_s_b("n")){break i}r.cursor=r.limit-a;return false}r.cursor=r.limit-u}var s=r.limit-r.cursor;if(r.cursor<=r.limit_backward){return false}r.cursor--;if(!r.in_grouping_b(C,97,305)){return false}r.cursor=r.limit-s}return true}function G(){r:{var i=r.limit-r.cursor;i:{if(!r.eq_s_b("s")){break i}var e=r.limit-r.cursor;if(!r.in_grouping_b(C,97,305)){break i}r.cursor=r.limit-e;break r}r.cursor=r.limit-i;{var u=r.limit-r.cursor;i:{var a=r.limit-r.cursor;if(!r.eq_s_b("s")){break i}r.cursor=r.limit-a;return false}r.cursor=r.limit-u}var s=r.limit-r.cursor;if(r.cursor<=r.limit_backward){return false}r.cursor--;if(!r.in_grouping_b(C,97,305)){return false}r.cursor=r.limit-s}return true}function H(){r:{var i=r.limit-r.cursor;i:{if(!r.eq_s_b("y")){break i}var e=r.limit-r.cursor;if(!r.in_grouping_b(C,97,305)){break i}r.cursor=r.limit-e;break r}r.cursor=r.limit-i;{var u=r.limit-r.cursor;i:{var a=r.limit-r.cursor;if(!r.eq_s_b("y")){break i}r.cursor=r.limit-a;return false}r.cursor=r.limit-u}var s=r.limit-r.cursor;if(r.cursor<=r.limit_backward){return false}r.cursor--;if(!r.in_grouping_b(C,97,305)){return false}r.cursor=r.limit-s}return true}function I(){r:{var i=r.limit-r.cursor;i:{if(!r.in_grouping_b(S,105,305)){break i}var e=r.limit-r.cursor;if(!r.out_grouping_b(C,97,305)){break i}r.cursor=r.limit-e;break r}r.cursor=r.limit-i;{var u=r.limit-r.cursor;i:{var a=r.limit-r.cursor;if(!r.in_grouping_b(S,105,305)){break i}r.cursor=r.limit-a;return false}r.cursor=r.limit-u}var s=r.limit-r.cursor;if(r.cursor<=r.limit_backward){return false}r.cursor--;if(!r.out_grouping_b(C,97,305)){return false}r.cursor=r.limit-s}return true}function J(){if(r.find_among_b(i)==0){return false}if(!I()){return false}return true}function K(){if(!E()){return false}if(!r.in_grouping_b(S,105,305)){return false}if(!G()){return false}return true}function L(){if(r.find_among_b(e)==0){return false}return true}function M(){if(!E()){return false}if(!r.in_grouping_b(S,105,305)){return false}if(!H()){return false}return true}function N(){if(!E()){return false}if(r.find_among_b(u)==0){return false}return true}function O(){if(!E()){return false}if(r.find_among_b(a)==0){return false}if(!F()){return false}return true}function P(){if(!E()){return false}if(r.find_among_b(s)==0){return false}if(!H()){return false}return true}function Q(){if(!E()){return false}if(r.find_among_b(t)==0){return false}return true}function R(){if(!E()){return false}if(r.find_among_b(l)==0){return false}return true}function U(){if(!E()){return false}if(r.find_among_b(c)==0){return false}return true}function V(){if(!E()){return false}if(r.find_among_b(o)==0){return false}return true}function X(){if(!E()){return false}if(r.find_among_b(f)==0){return false}return true}function Y(){if(!E()){return false}if(r.find_among_b(n)==0){return false}if(!H()){return false}return true}function Z(){if(!r.eq_s_b("ki")){return false}return true}function $(){if(!E()){return false}if(r.find_among_b(b)==0){return false}if(!F()){return false}return true}function rr(){if(!E()){return false}if(r.find_among_b(m)==0){return false}if(!H()){return false}return true}function ir(){if(!E()){return false}if(r.find_among_b(k)==0){return false}return true}function er(){if(!E()){return false}if(r.find_among_b(_)==0){return false}if(!H()){return false}return true}function ur(){if(r.find_among_b(v)==0){return false}return true}function ar(){if(!E()){return false}if(r.find_among_b(d)==0){return false}return true}function sr(){if(!E()){return false}if(r.find_among_b(g)==0){return false}return true}function tr(){if(!E()){return false}if(r.find_among_b(w)==0){return false}return true}function lr(){if(r.find_among_b(q)==0){return false}return true}function cr(){if(!E()){return false}if(r.find_among_b(p)==0){return false}if(!H()){return false}return true}function or(){if(r.find_among_b(h)==0){return false}if(!H()){return false}return true}function fr(){if(!E()){return false}if(r.find_among_b(z)==0){return false}if(!H()){return false}return true}function nr(){if(!r.eq_s_b("ken")){return false}if(!H()){return false}return true}function br(){r.ket=r.cursor;D=true;r:{var i=r.limit-r.cursor;i:{e:{var e=r.limit-r.cursor;u:{if(!fr()){break u}break e}r.cursor=r.limit-e;u:{if(!cr()){break u}break e}r.cursor=r.limit-e;u:{if(!or()){break u}break e}r.cursor=r.limit-e;if(!nr()){break i}}break r}r.cursor=r.limit-i;i:{if(!lr()){break i}e:{var u=r.limit-r.cursor;u:{if(!ur()){break u}break e}r.cursor=r.limit-u;u:{if(!ar()){break u}break e}r.cursor=r.limit-u;u:{if(!rr()){break u}break e}r.cursor=r.limit-u;u:{if(!ir()){break u}break e}r.cursor=r.limit-u;u:{if(!er()){break u}break e}r.cursor=r.limit-u}if(!fr()){break i}break r}r.cursor=r.limit-i;i:{if(!ar()){break i}r.bra=r.cursor;if(!r.slice_del()){return false}var a=r.limit-r.cursor;e:{r.ket=r.cursor;u:{var s=r.limit-r.cursor;a:{if(!tr()){break a}break u}r.cursor=r.limit-s;a:{if(!cr()){break a}break u}r.cursor=r.limit-s;a:{if(!or()){break a}break u}r.cursor=r.limit-s;if(!fr()){r.cursor=r.limit-a;break e}}}D=false;break r}r.cursor=r.limit-i;i:{if(!sr()){break i}e:{var t=r.limit-r.cursor;u:{if(!cr()){break u}break e}r.cursor=r.limit-t;if(!or()){break i}}break r}r.cursor=r.limit-i;i:{e:{var l=r.limit-r.cursor;u:{if(!ur()){break u}break e}r.cursor=r.limit-l;u:{if(!er()){break u}break e}r.cursor=r.limit-l;u:{if(!ir()){break u}break e}r.cursor=r.limit-l;if(!rr()){break i}}r.bra=r.cursor;if(!r.slice_del()){return false}var c=r.limit-r.cursor;e:{r.ket=r.cursor;if(!fr()){r.cursor=r.limit-c;break e}}break r}r.cursor=r.limit-i;if(!tr()){return false}r.bra=r.cursor;if(!r.slice_del()){return false}var o=r.limit-r.cursor;i:{r.ket=r.cursor;e:{var f=r.limit-r.cursor;u:{if(!ur()){break u}break e}r.cursor=r.limit-f;u:{if(!ar()){break u}break e}r.cursor=r.limit-f;u:{if(!rr()){break u}break e}r.cursor=r.limit-f;u:{if(!ir()){break u}break e}r.cursor=r.limit-f;u:{if(!er()){break u}break e}r.cursor=r.limit-f}if(!fr()){r.cursor=r.limit-o;break i}}}r.bra=r.cursor;if(!r.slice_del()){return false}return true}function mr(){r.ket=r.cursor;if(!Z()){return false}r:{var i=r.limit-r.cursor;i:{if(!R()){break i}r.bra=r.cursor;if(!r.slice_del()){return false}var e=r.limit-r.cursor;e:{r.ket=r.cursor;u:{var u=r.limit-r.cursor;a:{if(!ar()){break a}r.bra=r.cursor;if(!r.slice_del()){return false}var a=r.limit-r.cursor;s:{if(!mr()){r.cursor=r.limit-a;break s}}break u}r.cursor=r.limit-u;if(!J()){r.cursor=r.limit-e;break e}r.bra=r.cursor;if(!r.slice_del()){return false}var s=r.limit-r.cursor;a:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-s;break a}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-s;break a}}}}break r}r.cursor=r.limit-i;i:{if(!O()){break i}r.bra=r.cursor;if(!r.slice_del()){return false}var t=r.limit-r.cursor;e:{r.ket=r.cursor;u:{var l=r.limit-r.cursor;a:{if(!L()){break a}r.bra=r.cursor;if(!r.slice_del()){return false}break u}r.cursor=r.limit-l;a:{r.ket=r.cursor;s:{var c=r.limit-r.cursor;t:{if(!J()){break t}break s}r.cursor=r.limit-c;if(!K()){break a}}r.bra=r.cursor;if(!r.slice_del()){return false}var o=r.limit-r.cursor;s:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-o;break s}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-o;break s}}break u}r.cursor=r.limit-l;if(!mr()){r.cursor=r.limit-t;break e}}}break r}r.cursor=r.limit-i;if(!U()){return false}i:{var f=r.limit-r.cursor;e:{if(!L()){break e}r.bra=r.cursor;if(!r.slice_del()){return false}break i}r.cursor=r.limit-f;e:{if(!K()){break e}r.bra=r.cursor;if(!r.slice_del()){return false}var n=r.limit-r.cursor;u:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-n;break u}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-n;break u}}break i}r.cursor=r.limit-f;if(!mr()){return false}}}return true}function kr(){r:{var i=r.limit-r.cursor;i:{r.ket=r.cursor;if(!ar()){break i}r.bra=r.cursor;if(!r.slice_del()){return false}var e=r.limit-r.cursor;e:{if(!mr()){r.cursor=r.limit-e;break e}}break r}r.cursor=r.limit-i;i:{r.ket=r.cursor;if(!$()){break i}r.bra=r.cursor;if(!r.slice_del()){return false}var u=r.limit-r.cursor;e:{u:{var a=r.limit-r.cursor;a:{r.ket=r.cursor;if(!L()){break a}r.bra=r.cursor;if(!r.slice_del()){return false}break u}r.cursor=r.limit-a;a:{r.ket=r.cursor;s:{var s=r.limit-r.cursor;t:{if(!J()){break t}break s}r.cursor=r.limit-s;if(!K()){break a}}r.bra=r.cursor;if(!r.slice_del()){return false}var t=r.limit-r.cursor;s:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-t;break s}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-t;break s}}break u}r.cursor=r.limit-a;r.ket=r.cursor;if(!ar()){r.cursor=r.limit-u;break e}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-u;break e}}}break r}r.cursor=r.limit-i;i:{r.ket=r.cursor;e:{var l=r.limit-r.cursor;u:{if(!U()){break u}break e}r.cursor=r.limit-l;if(!Q()){break i}}e:{var c=r.limit-r.cursor;u:{if(!L()){break u}r.bra=r.cursor;if(!r.slice_del()){return false}break e}r.cursor=r.limit-c;u:{if(!K()){break u}r.bra=r.cursor;if(!r.slice_del()){return false}var o=r.limit-r.cursor;a:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-o;break a}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-o;break a}}break e}r.cursor=r.limit-c;if(!mr()){break i}}break r}r.cursor=r.limit-i;i:{r.ket=r.cursor;e:{var f=r.limit-r.cursor;u:{if(!X()){break u}break e}r.cursor=r.limit-f;if(!N()){break i}}e:{var n=r.limit-r.cursor;u:{if(!K()){break u}r.bra=r.cursor;if(!r.slice_del()){return false}var b=r.limit-r.cursor;a:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-b;break a}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-b;break a}}break e}r.cursor=r.limit-n;if(!L()){break i}}break r}r.cursor=r.limit-i;i:{r.ket=r.cursor;if(!V()){break i}r.bra=r.cursor;if(!r.slice_del()){return false}var m=r.limit-r.cursor;e:{r.ket=r.cursor;u:{var k=r.limit-r.cursor;a:{if(!J()){break a}r.bra=r.cursor;if(!r.slice_del()){return false}var _=r.limit-r.cursor;s:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-_;break s}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-_;break s}}break u}r.cursor=r.limit-k;a:{if(!ar()){break a}r.bra=r.cursor;if(!r.slice_del()){return false}var v=r.limit-r.cursor;s:{if(!mr()){r.cursor=r.limit-v;break s}}break u}r.cursor=r.limit-k;if(!mr()){r.cursor=r.limit-m;break e}}}break r}r.cursor=r.limit-i;i:{r.ket=r.cursor;e:{var d=r.limit-r.cursor;u:{if(!O()){break u}break e}r.cursor=r.limit-d;if(!Y()){break i}}r.bra=r.cursor;if(!r.slice_del()){return false}var g=r.limit-r.cursor;e:{u:{var w=r.limit-r.cursor;a:{r.ket=r.cursor;if(!ar()){break a}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){break a}break u}r.cursor=r.limit-w;a:{r.ket=r.cursor;s:{var q=r.limit-r.cursor;t:{if(!J()){break t}break s}r.cursor=r.limit-q;if(!K()){break a}}r.bra=r.cursor;if(!r.slice_del()){return false}var p=r.limit-r.cursor;s:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-p;break s}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-p;break s}}break u}r.cursor=r.limit-w;if(!mr()){r.cursor=r.limit-g;break e}}}break r}r.cursor=r.limit-i;i:{r.ket=r.cursor;if(!L()){break i}r.bra=r.cursor;if(!r.slice_del()){return false}break r}r.cursor=r.limit-i;i:{if(!mr()){break i}break r}r.cursor=r.limit-i;i:{r.ket=r.cursor;e:{var h=r.limit-r.cursor;u:{if(!R()){break u}break e}r.cursor=r.limit-h;u:{if(!M()){break u}break e}r.cursor=r.limit-h;if(!P()){break i}}r.bra=r.cursor;if(!r.slice_del()){return false}var z=r.limit-r.cursor;e:{r.ket=r.cursor;u:{var y=r.limit-r.cursor;a:{if(!J()){break a}r.bra=r.cursor;if(!r.slice_del()){return false}var C=r.limit-r.cursor;s:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-C;break s}}break u}r.cursor=r.limit-y;if(!ar()){r.cursor=r.limit-z;break e}}r.bra=r.cursor;if(!r.slice_del()){return false}r.ket=r.cursor;if(!mr()){r.cursor=r.limit-z;break e}}break r}r.cursor=r.limit-i;r.ket=r.cursor;i:{var S=r.limit-r.cursor;e:{if(!J()){break e}break i}r.cursor=r.limit-S;if(!K()){return false}}r.bra=r.cursor;if(!r.slice_del()){return false}var B=r.limit-r.cursor;i:{r.ket=r.cursor;if(!ar()){r.cursor=r.limit-B;break i}r.bra=r.cursor;if(!r.slice_del()){return false}if(!mr()){r.cursor=r.limit-B;break i}}}return true}function _r(){var i;r.ket=r.cursor;i=r.find_among_b(y);if(i==0){return false}r.bra=r.cursor;switch(i){case 1:if(!r.slice_from("p")){return false}break;case 2:if(!r.slice_from("ç")){return false}break;case 3:if(!r.slice_from("t")){return false}break;case 4:if(!r.slice_from("k")){return false}break}return true}function vr(){var i=r.limit-r.cursor;r:{var e=r.limit-r.cursor;i:{if(!r.eq_s_b("d")){break i}break r}r.cursor=r.limit-e;if(!r.eq_s_b("g")){return false}}r.cursor=r.limit-i;r:{var u=r.limit-r.cursor;i:{var a=r.limit-r.cursor;e:while(true){var s=r.limit-r.cursor;u:{if(!r.in_grouping_b(C,97,305)){break u}r.cursor=r.limit-s;break e}r.cursor=r.limit-s;if(r.cursor<=r.limit_backward){break i}r.cursor--}e:{var t=r.limit-r.cursor;u:{if(!r.eq_s_b("a")){break u}break e}r.cursor=r.limit-t;if(!r.eq_s_b("ı")){break i}}r.cursor=r.limit-a;{var l=r.cursor;r.insert(r.cursor,r.cursor,"ı");r.cursor=l}break r}r.cursor=r.limit-u;i:{var c=r.limit-r.cursor;e:while(true){var o=r.limit-r.cursor;u:{if(!r.in_grouping_b(C,97,305)){break u}r.cursor=r.limit-o;break e}r.cursor=r.limit-o;if(r.cursor<=r.limit_backward){break i}r.cursor--}e:{var f=r.limit-r.cursor;u:{if(!r.eq_s_b("e")){break u}break e}r.cursor=r.limit-f;if(!r.eq_s_b("i")){break i}}r.cursor=r.limit-c;{var n=r.cursor;r.insert(r.cursor,r.cursor,"i");r.cursor=n}break r}r.cursor=r.limit-u;i:{var b=r.limit-r.cursor;e:while(true){var m=r.limit-r.cursor;u:{if(!r.in_grouping_b(C,97,305)){break u}r.cursor=r.limit-m;break e}r.cursor=r.limit-m;if(r.cursor<=r.limit_backward){break i}r.cursor--}e:{var k=r.limit-r.cursor;u:{if(!r.eq_s_b("o")){break u}break e}r.cursor=r.limit-k;if(!r.eq_s_b("u")){break i}}r.cursor=r.limit-b;{var _=r.cursor;r.insert(r.cursor,r.cursor,"u");r.cursor=_}break r}r.cursor=r.limit-u;var v=r.limit-r.cursor;i:while(true){var d=r.limit-r.cursor;e:{if(!r.in_grouping_b(C,97,305)){break e}r.cursor=r.limit-d;break i}r.cursor=r.limit-d;if(r.cursor<=r.limit_backward){return false}r.cursor--}i:{var g=r.limit-r.cursor;e:{if(!r.eq_s_b("ö")){break e}break i}r.cursor=r.limit-g;if(!r.eq_s_b("ü")){return false}}r.cursor=r.limit-v;{var w=r.cursor;r.insert(r.cursor,r.cursor,"ü");r.cursor=w}}return true}function dr(){if(!r.eq_s_b("ad")){return false}var i=r.limit-r.cursor;r:{if(!r.eq_s_b("soy")){r.cursor=r.limit-i;break r}}if(r.cursor>r.limit_backward){return false}return true}function gr(){var i=r.cursor;{var e=2;while(true){var u=r.cursor;r:{i:while(true){e:{if(!r.in_grouping(C,97,305)){break e}break i}if(r.cursor>=r.limit){break r}r.cursor++}e--;continue}r.cursor=u;break}if(e>0){return false}}r.cursor=i;return true}function wr(){r.limit_backward=r.cursor;r.cursor=r.limit;{var i=r.limit-r.cursor;r:{if(!dr()){break r}return false}r.cursor=r.limit-i}var e=r.limit-r.cursor;vr();r.cursor=r.limit-e;var u=r.limit-r.cursor;_r();r.cursor=r.limit-u;r.cursor=r.limit_backward;return true}this.stem=function(){if(!gr()){return false}r.limit_backward=r.cursor;r.cursor=r.limit;var i=r.limit-r.cursor;br();r.cursor=r.limit-i;if(!D){return false}var e=r.limit-r.cursor;kr();r.cursor=r.limit-e;r.cursor=r.limit_backward;if(!wr()){return false}return true};this["stemWord"]=function(i){r.setCurrent(i);this.stem();return r.getCurrent()}}; \ No newline at end of file
diff --git a/sphinx/search/nl.py b/sphinx/search/nl.py
new file mode 100644
index 0000000..a610b12
--- /dev/null
+++ b/sphinx/search/nl.py
@@ -0,0 +1,127 @@
+"""Dutch search language: includes the JS porter stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+dutch_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/dutch/stop.txt
+de | the
+en | and
+van | of, from
+ik | I, the ego
+te | (1) chez, at etc, (2) to, (3) too
+dat | that, which
+die | that, those, who, which
+in | in, inside
+een | a, an, one
+hij | he
+het | the, it
+niet | not, nothing, naught
+zijn | (1) to be, being, (2) his, one's, its
+is | is
+was | (1) was, past tense of all persons sing. of 'zijn' (to be) (2) wax, (3) the washing, (4) rise of river
+op | on, upon, at, in, up, used up
+aan | on, upon, to (as dative)
+met | with, by
+als | like, such as, when
+voor | (1) before, in front of, (2) furrow
+had | had, past tense all persons sing. of 'hebben' (have)
+er | there
+maar | but, only
+om | round, about, for etc
+hem | him
+dan | then
+zou | should/would, past tense all persons sing. of 'zullen'
+of | or, whether, if
+wat | what, something, anything
+mijn | possessive and noun 'mine'
+men | people, 'one'
+dit | this
+zo | so, thus, in this way
+door | through by
+over | over, across
+ze | she, her, they, them
+zich | oneself
+bij | (1) a bee, (2) by, near, at
+ook | also, too
+tot | till, until
+je | you
+mij | me
+uit | out of, from
+der | Old Dutch form of 'van der' still found in surnames
+daar | (1) there, (2) because
+haar | (1) her, their, them, (2) hair
+naar | (1) unpleasant, unwell etc, (2) towards, (3) as
+heb | present first person sing. of 'to have'
+hoe | how, why
+heeft | present third person sing. of 'to have'
+hebben | 'to have' and various parts thereof
+deze | this
+u | you
+want | (1) for, (2) mitten, (3) rigging
+nog | yet, still
+zal | 'shall', first and third person sing. of verb 'zullen' (will)
+me | me
+zij | she, they
+nu | now
+ge | 'thou', still used in Belgium and south Netherlands
+geen | none
+omdat | because
+iets | something, somewhat
+worden | to become, grow, get
+toch | yet, still
+al | all, every, each
+waren | (1) 'were' (2) to wander, (3) wares, (3)
+veel | much, many
+meer | (1) more, (2) lake
+doen | to do, to make
+toen | then, when
+moet | noun 'spot/mote' and present form of 'to must'
+ben | (1) am, (2) 'are' in interrogative second person singular of 'to be'
+zonder | without
+kan | noun 'can' and present form of 'to be able'
+hun | their, them
+dus | so, consequently
+alles | all, everything, anything
+onder | under, beneath
+ja | yes, of course
+eens | once, one day
+hier | here
+wie | who
+werd | imperfect third person sing. of 'become'
+altijd | always
+doch | yet, but etc
+wordt | present third person sing. of 'become'
+wezen | (1) to be, (2) 'been' as in 'been fishing', (3) orphans
+kunnen | to be able
+ons | us/our
+zelf | self
+tegen | against, towards, at
+na | after, near
+reeds | already
+wil | (1) present tense of 'want', (2) 'will', noun, (3) fender
+kon | could; past tense of 'to be able'
+niets | nothing
+uw | your
+iemand | somebody
+geweest | been; past participle of 'be'
+andere | other
+''')
+
+
+class SearchDutch(SearchLanguage):
+ lang = 'nl'
+ language_name = 'Dutch'
+ js_stemmer_rawcode = 'dutch-stemmer.js'
+ stopwords = dutch_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('dutch')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/no.py b/sphinx/search/no.py
new file mode 100644
index 0000000..a69380b
--- /dev/null
+++ b/sphinx/search/no.py
@@ -0,0 +1,202 @@
+"""Norwegian search language: includes the JS Norwegian stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+norwegian_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/norwegian/stop.txt
+og | and
+i | in
+jeg | I
+det | it/this/that
+at | to (w. inf.)
+en | a/an
+et | a/an
+den | it/this/that
+til | to
+er | is/am/are
+som | who/that
+på | on
+de | they / you(formal)
+med | with
+han | he
+av | of
+ikke | not
+ikkje | not *
+der | there
+så | so
+var | was/were
+meg | me
+seg | you
+men | but
+ett | one
+har | have
+om | about
+vi | we
+min | my
+mitt | my
+ha | have
+hadde | had
+hun | she
+nå | now
+over | over
+da | when/as
+ved | by/know
+fra | from
+du | you
+ut | out
+sin | your
+dem | them
+oss | us
+opp | up
+man | you/one
+kan | can
+hans | his
+hvor | where
+eller | or
+hva | what
+skal | shall/must
+selv | self (reflective)
+sjøl | self (reflective)
+her | here
+alle | all
+vil | will
+bli | become
+ble | became
+blei | became *
+blitt | have become
+kunne | could
+inn | in
+når | when
+være | be
+kom | come
+noen | some
+noe | some
+ville | would
+dere | you
+som | who/which/that
+deres | their/theirs
+kun | only/just
+ja | yes
+etter | after
+ned | down
+skulle | should
+denne | this
+for | for/because
+deg | you
+si | hers/his
+sine | hers/his
+sitt | hers/his
+mot | against
+Ã¥ | to
+meget | much
+hvorfor | why
+dette | this
+disse | these/those
+uten | without
+hvordan | how
+ingen | none
+din | your
+ditt | your
+blir | become
+samme | same
+hvilken | which
+hvilke | which (plural)
+sånn | such a
+inni | inside/within
+mellom | between
+vår | our
+hver | each
+hvem | who
+vors | us/ours
+hvis | whose
+både | both
+bare | only/just
+enn | than
+fordi | as/because
+før | before
+mange | many
+også | also
+slik | just
+vært | been
+være | to be
+båe | both *
+begge | both
+siden | since
+dykk | your *
+dykkar | yours *
+dei | they *
+deira | them *
+deires | theirs *
+deim | them *
+di | your (fem.) *
+då | as/when *
+eg | I *
+ein | a/an *
+eit | a/an *
+eitt | a/an *
+elles | or *
+honom | he *
+hjå | at *
+ho | she *
+hoe | she *
+henne | her
+hennar | her/hers
+hennes | hers
+hoss | how *
+hossen | how *
+ikkje | not *
+ingi | noone *
+inkje | noone *
+korleis | how *
+korso | how *
+kva | what/which *
+kvar | where *
+kvarhelst | where *
+kven | who/whom *
+kvi | why *
+kvifor | why *
+me | we *
+medan | while *
+mi | my *
+mine | my *
+mykje | much *
+no | now *
+nokon | some (masc./neut.) *
+noka | some (fem.) *
+nokor | some *
+noko | some *
+nokre | some *
+si | his/hers *
+sia | since *
+sidan | since *
+so | so *
+somt | some *
+somme | some *
+um | about*
+upp | up *
+vere | be *
+vore | was *
+verte | become *
+vort | become *
+varte | became *
+vart | became *
+''')
+
+
+class SearchNorwegian(SearchLanguage):
+ lang = 'no'
+ language_name = 'Norwegian'
+ js_stemmer_rawcode = 'norwegian-stemmer.js'
+ stopwords = norwegian_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('norwegian')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/non-minified-js/base-stemmer.js b/sphinx/search/non-minified-js/base-stemmer.js
new file mode 100644
index 0000000..ca6cca1
--- /dev/null
+++ b/sphinx/search/non-minified-js/base-stemmer.js
@@ -0,0 +1,294 @@
+/**@constructor*/
+BaseStemmer = function() {
+ this.setCurrent = function(value) {
+ this.current = value;
+ this.cursor = 0;
+ this.limit = this.current.length;
+ this.limit_backward = 0;
+ this.bra = this.cursor;
+ this.ket = this.limit;
+ };
+
+ this.getCurrent = function() {
+ return this.current;
+ };
+
+ this.copy_from = function(other) {
+ this.current = other.current;
+ this.cursor = other.cursor;
+ this.limit = other.limit;
+ this.limit_backward = other.limit_backward;
+ this.bra = other.bra;
+ this.ket = other.ket;
+ };
+
+ this.in_grouping = function(s, min, max) {
+ if (this.cursor >= this.limit) return false;
+ var ch = this.current.charCodeAt(this.cursor);
+ if (ch > max || ch < min) return false;
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
+ this.cursor++;
+ return true;
+ };
+
+ this.in_grouping_b = function(s, min, max) {
+ if (this.cursor <= this.limit_backward) return false;
+ var ch = this.current.charCodeAt(this.cursor - 1);
+ if (ch > max || ch < min) return false;
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false;
+ this.cursor--;
+ return true;
+ };
+
+ this.out_grouping = function(s, min, max) {
+ if (this.cursor >= this.limit) return false;
+ var ch = this.current.charCodeAt(this.cursor);
+ if (ch > max || ch < min) {
+ this.cursor++;
+ return true;
+ }
+ ch -= min;
+ if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) {
+ this.cursor++;
+ return true;
+ }
+ return false;
+ };
+
+ this.out_grouping_b = function(s, min, max) {
+ if (this.cursor <= this.limit_backward) return false;
+ var ch = this.current.charCodeAt(this.cursor - 1);
+ if (ch > max || ch < min) {
+ this.cursor--;
+ return true;
+ }
+ ch -= min;
+ if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) {
+ this.cursor--;
+ return true;
+ }
+ return false;
+ };
+
+ this.eq_s = function(s)
+ {
+ if (this.limit - this.cursor < s.length) return false;
+ if (this.current.slice(this.cursor, this.cursor + s.length) != s)
+ {
+ return false;
+ }
+ this.cursor += s.length;
+ return true;
+ };
+
+ this.eq_s_b = function(s)
+ {
+ if (this.cursor - this.limit_backward < s.length) return false;
+ if (this.current.slice(this.cursor - s.length, this.cursor) != s)
+ {
+ return false;
+ }
+ this.cursor -= s.length;
+ return true;
+ };
+
+ /** @return {number} */ this.find_among = function(v)
+ {
+ var i = 0;
+ var j = v.length;
+
+ var c = this.cursor;
+ var l = this.limit;
+
+ var common_i = 0;
+ var common_j = 0;
+
+ var first_key_inspected = false;
+
+ while (true)
+ {
+ var k = i + ((j - i) >>> 1);
+ var diff = 0;
+ var common = common_i < common_j ? common_i : common_j; // smaller
+ // w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional)
+ var w = v[k];
+ var i2;
+ for (i2 = common; i2 < w[0].length; i2++)
+ {
+ if (c + common == l)
+ {
+ diff = -1;
+ break;
+ }
+ diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2);
+ if (diff != 0) break;
+ common++;
+ }
+ if (diff < 0)
+ {
+ j = k;
+ common_j = common;
+ }
+ else
+ {
+ i = k;
+ common_i = common;
+ }
+ if (j - i <= 1)
+ {
+ if (i > 0) break; // v->s has been inspected
+ if (j == i) break; // only one item in v
+
+ // - but now we need to go round once more to get
+ // v->s inspected. This looks messy, but is actually
+ // the optimal approach.
+
+ if (first_key_inspected) break;
+ first_key_inspected = true;
+ }
+ }
+ do {
+ var w = v[i];
+ if (common_i >= w[0].length)
+ {
+ this.cursor = c + w[0].length;
+ if (w.length < 4) return w[2];
+ var res = w[3](this);
+ this.cursor = c + w[0].length;
+ if (res) return w[2];
+ }
+ i = w[1];
+ } while (i >= 0);
+ return 0;
+ };
+
+ // find_among_b is for backwards processing. Same comments apply
+ this.find_among_b = function(v)
+ {
+ var i = 0;
+ var j = v.length
+
+ var c = this.cursor;
+ var lb = this.limit_backward;
+
+ var common_i = 0;
+ var common_j = 0;
+
+ var first_key_inspected = false;
+
+ while (true)
+ {
+ var k = i + ((j - i) >> 1);
+ var diff = 0;
+ var common = common_i < common_j ? common_i : common_j;
+ var w = v[k];
+ var i2;
+ for (i2 = w[0].length - 1 - common; i2 >= 0; i2--)
+ {
+ if (c - common == lb)
+ {
+ diff = -1;
+ break;
+ }
+ diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2);
+ if (diff != 0) break;
+ common++;
+ }
+ if (diff < 0)
+ {
+ j = k;
+ common_j = common;
+ }
+ else
+ {
+ i = k;
+ common_i = common;
+ }
+ if (j - i <= 1)
+ {
+ if (i > 0) break;
+ if (j == i) break;
+ if (first_key_inspected) break;
+ first_key_inspected = true;
+ }
+ }
+ do {
+ var w = v[i];
+ if (common_i >= w[0].length)
+ {
+ this.cursor = c - w[0].length;
+ if (w.length < 4) return w[2];
+ var res = w[3](this);
+ this.cursor = c - w[0].length;
+ if (res) return w[2];
+ }
+ i = w[1];
+ } while (i >= 0);
+ return 0;
+ };
+
+ /* to replace chars between c_bra and c_ket in this.current by the
+ * chars in s.
+ */
+ this.replace_s = function(c_bra, c_ket, s)
+ {
+ var adjustment = s.length - (c_ket - c_bra);
+ this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket);
+ this.limit += adjustment;
+ if (this.cursor >= c_ket) this.cursor += adjustment;
+ else if (this.cursor > c_bra) this.cursor = c_bra;
+ return adjustment;
+ };
+
+ this.slice_check = function()
+ {
+ if (this.bra < 0 ||
+ this.bra > this.ket ||
+ this.ket > this.limit ||
+ this.limit > this.current.length)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ this.slice_from = function(s)
+ {
+ var result = false;
+ if (this.slice_check())
+ {
+ this.replace_s(this.bra, this.ket, s);
+ result = true;
+ }
+ return result;
+ };
+
+ this.slice_del = function()
+ {
+ return this.slice_from("");
+ };
+
+ this.insert = function(c_bra, c_ket, s)
+ {
+ var adjustment = this.replace_s(c_bra, c_ket, s);
+ if (c_bra <= this.bra) this.bra += adjustment;
+ if (c_bra <= this.ket) this.ket += adjustment;
+ };
+
+ this.slice_to = function()
+ {
+ var result = '';
+ if (this.slice_check())
+ {
+ result = this.current.slice(this.bra, this.ket);
+ }
+ return result;
+ };
+
+ this.assign_to = function()
+ {
+ return this.current.slice(0, this.limit);
+ };
+};
diff --git a/sphinx/search/non-minified-js/danish-stemmer.js b/sphinx/search/non-minified-js/danish-stemmer.js
new file mode 100644
index 0000000..46b5d55
--- /dev/null
+++ b/sphinx/search/non-minified-js/danish-stemmer.js
@@ -0,0 +1,310 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+DanishStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["hed", -1, 1],
+ ["ethed", 0, 1],
+ ["ered", -1, 1],
+ ["e", -1, 1],
+ ["erede", 3, 1],
+ ["ende", 3, 1],
+ ["erende", 5, 1],
+ ["ene", 3, 1],
+ ["erne", 3, 1],
+ ["ere", 3, 1],
+ ["en", -1, 1],
+ ["heden", 10, 1],
+ ["eren", 10, 1],
+ ["er", -1, 1],
+ ["heder", 13, 1],
+ ["erer", 13, 1],
+ ["s", -1, 2],
+ ["heds", 16, 1],
+ ["es", 16, 1],
+ ["endes", 18, 1],
+ ["erendes", 19, 1],
+ ["enes", 18, 1],
+ ["ernes", 18, 1],
+ ["eres", 18, 1],
+ ["ens", 16, 1],
+ ["hedens", 24, 1],
+ ["erens", 24, 1],
+ ["ers", 16, 1],
+ ["ets", 16, 1],
+ ["erets", 28, 1],
+ ["et", -1, 1],
+ ["eret", 30, 1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["gd", -1, -1],
+ ["dt", -1, -1],
+ ["gt", -1, -1],
+ ["kt", -1, -1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ig", -1, 1],
+ ["lig", 0, 1],
+ ["elig", 1, 1],
+ ["els", -1, 1],
+ ["l\u00F8st", -1, 2]
+ ];
+
+ /** @const */ var /** Array<int> */ g_c = [119, 223, 119, 1];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128];
+
+ /** @const */ var /** Array<int> */ g_s_ending = [239, 254, 42, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16];
+
+ var /** number */ I_x = 0;
+ var /** number */ I_p1 = 0;
+ var /** string */ S_ch = '';
+
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ {
+ var /** number */ c1 = base.cursor + 3;
+ if (c1 > base.limit)
+ {
+ return false;
+ }
+ base.cursor = c1;
+ }
+ I_x = base.cursor;
+ base.cursor = v_1;
+ golab0: while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab1: {
+ if (!(base.in_grouping(g_v, 97, 248)))
+ {
+ break lab1;
+ }
+ base.cursor = v_2;
+ break golab0;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab2: while(true)
+ {
+ lab3: {
+ if (!(base.out_grouping(g_v, 97, 248)))
+ {
+ break lab3;
+ }
+ break golab2;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ lab4: {
+ if (!(I_p1 < I_x))
+ {
+ break lab4;
+ }
+ I_p1 = I_x;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_main_suffix() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_0);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!(base.in_grouping_b(g_s_ending, 97, 229)))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_consonant_pair() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_1) == 0)
+ {
+ base.limit_backward = v_3;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_3;
+ base.cursor = base.limit - v_1;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_other_suffix() {
+ var /** number */ among_var;
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("st")))
+ {
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!(base.eq_s_b("ig")))
+ {
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_1;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_3;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_3;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ r_consonant_pair();
+ base.cursor = base.limit - v_4;
+ break;
+ case 2:
+ if (!base.slice_from("l\u00F8s"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_undouble() {
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ if (!(base.in_grouping_b(g_c, 98, 122)))
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ S_ch = base.slice_to();
+ if (S_ch == '')
+ {
+ return false;
+ }
+ base.limit_backward = v_2;
+ if (!(base.eq_s_b(S_ch)))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_mark_regions();
+ base.cursor = v_1;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_main_suffix();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_consonant_pair();
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ r_other_suffix();
+ base.cursor = base.limit - v_4;
+ var /** number */ v_5 = base.limit - base.cursor;
+ r_undouble();
+ base.cursor = base.limit - v_5;
+ base.cursor = base.limit_backward;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/dutch-stemmer.js b/sphinx/search/non-minified-js/dutch-stemmer.js
new file mode 100644
index 0000000..0ad11e2
--- /dev/null
+++ b/sphinx/search/non-minified-js/dutch-stemmer.js
@@ -0,0 +1,685 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+DutchStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["", -1, 6],
+ ["\u00E1", 0, 1],
+ ["\u00E4", 0, 1],
+ ["\u00E9", 0, 2],
+ ["\u00EB", 0, 2],
+ ["\u00ED", 0, 3],
+ ["\u00EF", 0, 3],
+ ["\u00F3", 0, 4],
+ ["\u00F6", 0, 4],
+ ["\u00FA", 0, 5],
+ ["\u00FC", 0, 5]
+ ];
+
+ /** @const */ var a_1 = [
+ ["", -1, 3],
+ ["I", 0, 2],
+ ["Y", 0, 1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["dd", -1, -1],
+ ["kk", -1, -1],
+ ["tt", -1, -1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["ene", -1, 2],
+ ["se", -1, 3],
+ ["en", -1, 2],
+ ["heden", 2, 1],
+ ["s", -1, 3]
+ ];
+
+ /** @const */ var a_4 = [
+ ["end", -1, 1],
+ ["ig", -1, 2],
+ ["ing", -1, 1],
+ ["lijk", -1, 3],
+ ["baar", -1, 4],
+ ["bar", -1, 5]
+ ];
+
+ /** @const */ var a_5 = [
+ ["aa", -1, -1],
+ ["ee", -1, -1],
+ ["oo", -1, -1],
+ ["uu", -1, -1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128];
+
+ /** @const */ var /** Array<int> */ g_v_I = [1, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128];
+
+ /** @const */ var /** Array<int> */ g_v_j = [17, 67, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128];
+
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+ var /** boolean */ B_e_found = false;
+
+
+ /** @return {boolean} */
+ function r_prelude() {
+ var /** number */ among_var;
+ var /** number */ v_1 = base.cursor;
+ while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_0);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("o"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_2;
+ break;
+ }
+ base.cursor = v_1;
+ var /** number */ v_3 = base.cursor;
+ lab1: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("y")))
+ {
+ base.cursor = v_3;
+ break lab1;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ }
+ while(true)
+ {
+ var /** number */ v_4 = base.cursor;
+ lab2: {
+ golab3: while(true)
+ {
+ var /** number */ v_5 = base.cursor;
+ lab4: {
+ if (!(base.in_grouping(g_v, 97, 232)))
+ {
+ break lab4;
+ }
+ base.bra = base.cursor;
+ lab5: {
+ var /** number */ v_6 = base.cursor;
+ lab6: {
+ if (!(base.eq_s("i")))
+ {
+ break lab6;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 232)))
+ {
+ break lab6;
+ }
+ if (!base.slice_from("I"))
+ {
+ return false;
+ }
+ break lab5;
+ }
+ base.cursor = v_6;
+ if (!(base.eq_s("y")))
+ {
+ break lab4;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ }
+ base.cursor = v_5;
+ break golab3;
+ }
+ base.cursor = v_5;
+ if (base.cursor >= base.limit)
+ {
+ break lab2;
+ }
+ base.cursor++;
+ }
+ continue;
+ }
+ base.cursor = v_4;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ golab0: while(true)
+ {
+ lab1: {
+ if (!(base.in_grouping(g_v, 97, 232)))
+ {
+ break lab1;
+ }
+ break golab0;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab2: while(true)
+ {
+ lab3: {
+ if (!(base.out_grouping(g_v, 97, 232)))
+ {
+ break lab3;
+ }
+ break golab2;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ lab4: {
+ if (!(I_p1 < 3))
+ {
+ break lab4;
+ }
+ I_p1 = 3;
+ }
+ golab5: while(true)
+ {
+ lab6: {
+ if (!(base.in_grouping(g_v, 97, 232)))
+ {
+ break lab6;
+ }
+ break golab5;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.out_grouping(g_v, 97, 232)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_1);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("y"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_undouble() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ if (base.find_among_b(a_2) == 0)
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ base.ket = base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_e_ending() {
+ B_e_found = false;
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("e")))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ if (!(base.out_grouping_b(g_v, 97, 232)))
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ B_e_found = true;
+ if (!r_undouble())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_en_ending() {
+ if (!r_R1())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ if (!(base.out_grouping_b(g_v, 97, 232)))
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ {
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("gem")))
+ {
+ break lab0;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_2;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_undouble())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_standard_suffix() {
+ var /** number */ among_var;
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_3);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R1())
+ {
+ break lab0;
+ }
+ if (!base.slice_from("heid"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_en_ending())
+ {
+ break lab0;
+ }
+ break;
+ case 3:
+ if (!r_R1())
+ {
+ break lab0;
+ }
+ if (!(base.out_grouping_b(g_v_j, 97, 232)))
+ {
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ base.cursor = base.limit - v_1;
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_e_ending();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("heid")))
+ {
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ break lab1;
+ }
+ {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab2: {
+ if (!(base.eq_s_b("c")))
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_4;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("en")))
+ {
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!r_en_ending())
+ {
+ break lab1;
+ }
+ }
+ base.cursor = base.limit - v_3;
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab3: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ break lab3;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ lab4: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab5: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("ig")))
+ {
+ break lab5;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ break lab5;
+ }
+ {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab6: {
+ if (!(base.eq_s_b("e")))
+ {
+ break lab6;
+ }
+ break lab5;
+ }
+ base.cursor = base.limit - v_7;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab4;
+ }
+ base.cursor = base.limit - v_6;
+ if (!r_undouble())
+ {
+ break lab3;
+ }
+ }
+ break;
+ case 2:
+ if (!r_R2())
+ {
+ break lab3;
+ }
+ {
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab7: {
+ if (!(base.eq_s_b("e")))
+ {
+ break lab7;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_8;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!r_R2())
+ {
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_e_ending())
+ {
+ break lab3;
+ }
+ break;
+ case 4:
+ if (!r_R2())
+ {
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!r_R2())
+ {
+ break lab3;
+ }
+ if (!B_e_found)
+ {
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ base.cursor = base.limit - v_5;
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab8: {
+ if (!(base.out_grouping_b(g_v_I, 73, 232)))
+ {
+ break lab8;
+ }
+ var /** number */ v_10 = base.limit - base.cursor;
+ if (base.find_among_b(a_5) == 0)
+ {
+ break lab8;
+ }
+ if (!(base.out_grouping_b(g_v, 97, 232)))
+ {
+ break lab8;
+ }
+ base.cursor = base.limit - v_10;
+ base.ket = base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab8;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_9;
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_prelude();
+ base.cursor = v_1;
+ var /** number */ v_2 = base.cursor;
+ r_mark_regions();
+ base.cursor = v_2;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ r_standard_suffix();
+ base.cursor = base.limit_backward;
+ var /** number */ v_4 = base.cursor;
+ r_postlude();
+ base.cursor = v_4;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/finnish-stemmer.js b/sphinx/search/non-minified-js/finnish-stemmer.js
new file mode 100644
index 0000000..c907c4a
--- /dev/null
+++ b/sphinx/search/non-minified-js/finnish-stemmer.js
@@ -0,0 +1,790 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+FinnishStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["pa", -1, 1],
+ ["sti", -1, 2],
+ ["kaan", -1, 1],
+ ["han", -1, 1],
+ ["kin", -1, 1],
+ ["h\u00E4n", -1, 1],
+ ["k\u00E4\u00E4n", -1, 1],
+ ["ko", -1, 1],
+ ["p\u00E4", -1, 1],
+ ["k\u00F6", -1, 1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["lla", -1, -1],
+ ["na", -1, -1],
+ ["ssa", -1, -1],
+ ["ta", -1, -1],
+ ["lta", 3, -1],
+ ["sta", 3, -1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ll\u00E4", -1, -1],
+ ["n\u00E4", -1, -1],
+ ["ss\u00E4", -1, -1],
+ ["t\u00E4", -1, -1],
+ ["lt\u00E4", 3, -1],
+ ["st\u00E4", 3, -1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["lle", -1, -1],
+ ["ine", -1, -1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["nsa", -1, 3],
+ ["mme", -1, 3],
+ ["nne", -1, 3],
+ ["ni", -1, 2],
+ ["si", -1, 1],
+ ["an", -1, 4],
+ ["en", -1, 6],
+ ["\u00E4n", -1, 5],
+ ["ns\u00E4", -1, 3]
+ ];
+
+ /** @const */ var a_5 = [
+ ["aa", -1, -1],
+ ["ee", -1, -1],
+ ["ii", -1, -1],
+ ["oo", -1, -1],
+ ["uu", -1, -1],
+ ["\u00E4\u00E4", -1, -1],
+ ["\u00F6\u00F6", -1, -1]
+ ];
+
+ /** @const */ var a_6 = [
+ ["a", -1, 8],
+ ["lla", 0, -1],
+ ["na", 0, -1],
+ ["ssa", 0, -1],
+ ["ta", 0, -1],
+ ["lta", 4, -1],
+ ["sta", 4, -1],
+ ["tta", 4, 2],
+ ["lle", -1, -1],
+ ["ine", -1, -1],
+ ["ksi", -1, -1],
+ ["n", -1, 7],
+ ["han", 11, 1],
+ ["den", 11, -1, r_VI],
+ ["seen", 11, -1, r_LONG],
+ ["hen", 11, 2],
+ ["tten", 11, -1, r_VI],
+ ["hin", 11, 3],
+ ["siin", 11, -1, r_VI],
+ ["hon", 11, 4],
+ ["h\u00E4n", 11, 5],
+ ["h\u00F6n", 11, 6],
+ ["\u00E4", -1, 8],
+ ["ll\u00E4", 22, -1],
+ ["n\u00E4", 22, -1],
+ ["ss\u00E4", 22, -1],
+ ["t\u00E4", 22, -1],
+ ["lt\u00E4", 26, -1],
+ ["st\u00E4", 26, -1],
+ ["tt\u00E4", 26, 2]
+ ];
+
+ /** @const */ var a_7 = [
+ ["eja", -1, -1],
+ ["mma", -1, 1],
+ ["imma", 1, -1],
+ ["mpa", -1, 1],
+ ["impa", 3, -1],
+ ["mmi", -1, 1],
+ ["immi", 5, -1],
+ ["mpi", -1, 1],
+ ["impi", 7, -1],
+ ["ej\u00E4", -1, -1],
+ ["mm\u00E4", -1, 1],
+ ["imm\u00E4", 10, -1],
+ ["mp\u00E4", -1, 1],
+ ["imp\u00E4", 12, -1]
+ ];
+
+ /** @const */ var a_8 = [
+ ["i", -1, -1],
+ ["j", -1, -1]
+ ];
+
+ /** @const */ var a_9 = [
+ ["mma", -1, 1],
+ ["imma", 0, -1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_AEI = [17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8];
+
+ /** @const */ var /** Array<int> */ g_C = [119, 223, 119, 1];
+
+ /** @const */ var /** Array<int> */ g_V1 = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32];
+
+ /** @const */ var /** Array<int> */ g_V2 = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32];
+
+ /** @const */ var /** Array<int> */ g_particle_end = [17, 97, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32];
+
+ var /** boolean */ B_ending_removed = false;
+ var /** string */ S_x = '';
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ golab0: while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab1: {
+ if (!(base.in_grouping(g_V1, 97, 246)))
+ {
+ break lab1;
+ }
+ base.cursor = v_1;
+ break golab0;
+ }
+ base.cursor = v_1;
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab2: while(true)
+ {
+ lab3: {
+ if (!(base.out_grouping(g_V1, 97, 246)))
+ {
+ break lab3;
+ }
+ break golab2;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ golab4: while(true)
+ {
+ var /** number */ v_3 = base.cursor;
+ lab5: {
+ if (!(base.in_grouping(g_V1, 97, 246)))
+ {
+ break lab5;
+ }
+ base.cursor = v_3;
+ break golab4;
+ }
+ base.cursor = v_3;
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab6: while(true)
+ {
+ lab7: {
+ if (!(base.out_grouping(g_V1, 97, 246)))
+ {
+ break lab7;
+ }
+ break golab6;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_particle_etc() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_0);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ if (!(base.in_grouping_b(g_particle_end, 97, 246)))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_R2())
+ {
+ return false;
+ }
+ break;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_possessive() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("k")))
+ {
+ break lab0;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("kse")))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_from("ksi"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (base.find_among_b(a_1) == 0)
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (base.find_among_b(a_2) == 0)
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (base.find_among_b(a_3) == 0)
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_LONG() {
+ if (base.find_among_b(a_5) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_VI() {
+ if (!(base.eq_s_b("i")))
+ {
+ return false;
+ }
+ if (!(base.in_grouping_b(g_V2, 97, 246)))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_case_ending() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_6);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ if (!(base.eq_s_b("a")))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!(base.eq_s_b("e")))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!(base.eq_s_b("i")))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!(base.eq_s_b("o")))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!(base.eq_s_b("\u00E4")))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!(base.eq_s_b("\u00F6")))
+ {
+ return false;
+ }
+ break;
+ case 7:
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab1: {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab2: {
+ if (!r_LONG())
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_5;
+ if (!(base.eq_s_b("ie")))
+ {
+ base.cursor = base.limit - v_3;
+ break lab0;
+ }
+ }
+ base.cursor = base.limit - v_4;
+ if (base.cursor <= base.limit_backward)
+ {
+ base.cursor = base.limit - v_3;
+ break lab0;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ }
+ break;
+ case 8:
+ if (!(base.in_grouping_b(g_V1, 97, 246)))
+ {
+ return false;
+ }
+ if (!(base.in_grouping_b(g_C, 98, 122)))
+ {
+ return false;
+ }
+ break;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ B_ending_removed = true;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_other_endings() {
+ var /** number */ among_var;
+ if (base.cursor < I_p2)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p2;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_7);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("po")))
+ {
+ break lab0;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ break;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_i_plural() {
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_8) == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_t_plural() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("t")))
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ var /** number */ v_3 = base.limit - base.cursor;
+ if (!(base.in_grouping_b(g_V1, 97, 246)))
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.limit_backward = v_2;
+ if (base.cursor < I_p2)
+ {
+ return false;
+ }
+ var /** number */ v_5 = base.limit_backward;
+ base.limit_backward = I_p2;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_9);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_5;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_5;
+ switch (among_var) {
+ case 1:
+ {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("po")))
+ {
+ break lab0;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_6;
+ }
+ break;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_tidy() {
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ if (!r_LONG())
+ {
+ break lab0;
+ }
+ base.cursor = base.limit - v_4;
+ base.ket = base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab0;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_3;
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ if (!(base.in_grouping_b(g_AEI, 97, 228)))
+ {
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!(base.in_grouping_b(g_C, 98, 122)))
+ {
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_5;
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab2: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("j")))
+ {
+ break lab2;
+ }
+ base.bra = base.cursor;
+ lab3: {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab4: {
+ if (!(base.eq_s_b("o")))
+ {
+ break lab4;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_7;
+ if (!(base.eq_s_b("u")))
+ {
+ break lab2;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_6;
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab5: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("o")))
+ {
+ break lab5;
+ }
+ base.bra = base.cursor;
+ if (!(base.eq_s_b("j")))
+ {
+ break lab5;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_8;
+ base.limit_backward = v_2;
+ golab6: while(true)
+ {
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab7: {
+ if (!(base.out_grouping_b(g_V1, 97, 246)))
+ {
+ break lab7;
+ }
+ base.cursor = base.limit - v_9;
+ break golab6;
+ }
+ base.cursor = base.limit - v_9;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping_b(g_C, 98, 122)))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ S_x = base.slice_to();
+ if (S_x == '')
+ {
+ return false;
+ }
+ if (!(base.eq_s_b(S_x)))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_mark_regions();
+ base.cursor = v_1;
+ B_ending_removed = false;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_particle_etc();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_possessive();
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ r_case_ending();
+ base.cursor = base.limit - v_4;
+ var /** number */ v_5 = base.limit - base.cursor;
+ r_other_endings();
+ base.cursor = base.limit - v_5;
+ lab0: {
+ lab1: {
+ if (!B_ending_removed)
+ {
+ break lab1;
+ }
+ var /** number */ v_7 = base.limit - base.cursor;
+ r_i_plural();
+ base.cursor = base.limit - v_7;
+ break lab0;
+ }
+ var /** number */ v_8 = base.limit - base.cursor;
+ r_t_plural();
+ base.cursor = base.limit - v_8;
+ }
+ var /** number */ v_9 = base.limit - base.cursor;
+ r_tidy();
+ base.cursor = base.limit - v_9;
+ base.cursor = base.limit_backward;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/french-stemmer.js b/sphinx/search/non-minified-js/french-stemmer.js
new file mode 100644
index 0000000..c970831
--- /dev/null
+++ b/sphinx/search/non-minified-js/french-stemmer.js
@@ -0,0 +1,1325 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+FrenchStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["col", -1, -1],
+ ["par", -1, -1],
+ ["tap", -1, -1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["", -1, 7],
+ ["H", 0, 6],
+ ["He", 1, 4],
+ ["Hi", 1, 5],
+ ["I", 0, 1],
+ ["U", 0, 2],
+ ["Y", 0, 3]
+ ];
+
+ /** @const */ var a_2 = [
+ ["iqU", -1, 3],
+ ["abl", -1, 3],
+ ["I\u00E8r", -1, 4],
+ ["i\u00E8r", -1, 4],
+ ["eus", -1, 2],
+ ["iv", -1, 1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["ic", -1, 2],
+ ["abil", -1, 1],
+ ["iv", -1, 3]
+ ];
+
+ /** @const */ var a_4 = [
+ ["iqUe", -1, 1],
+ ["atrice", -1, 2],
+ ["ance", -1, 1],
+ ["ence", -1, 5],
+ ["logie", -1, 3],
+ ["able", -1, 1],
+ ["isme", -1, 1],
+ ["euse", -1, 11],
+ ["iste", -1, 1],
+ ["ive", -1, 8],
+ ["if", -1, 8],
+ ["usion", -1, 4],
+ ["ation", -1, 2],
+ ["ution", -1, 4],
+ ["ateur", -1, 2],
+ ["iqUes", -1, 1],
+ ["atrices", -1, 2],
+ ["ances", -1, 1],
+ ["ences", -1, 5],
+ ["logies", -1, 3],
+ ["ables", -1, 1],
+ ["ismes", -1, 1],
+ ["euses", -1, 11],
+ ["istes", -1, 1],
+ ["ives", -1, 8],
+ ["ifs", -1, 8],
+ ["usions", -1, 4],
+ ["ations", -1, 2],
+ ["utions", -1, 4],
+ ["ateurs", -1, 2],
+ ["ments", -1, 15],
+ ["ements", 30, 6],
+ ["issements", 31, 12],
+ ["it\u00E9s", -1, 7],
+ ["ment", -1, 15],
+ ["ement", 34, 6],
+ ["issement", 35, 12],
+ ["amment", 34, 13],
+ ["emment", 34, 14],
+ ["aux", -1, 10],
+ ["eaux", 39, 9],
+ ["eux", -1, 1],
+ ["it\u00E9", -1, 7]
+ ];
+
+ /** @const */ var a_5 = [
+ ["ira", -1, 1],
+ ["ie", -1, 1],
+ ["isse", -1, 1],
+ ["issante", -1, 1],
+ ["i", -1, 1],
+ ["irai", 4, 1],
+ ["ir", -1, 1],
+ ["iras", -1, 1],
+ ["ies", -1, 1],
+ ["\u00EEmes", -1, 1],
+ ["isses", -1, 1],
+ ["issantes", -1, 1],
+ ["\u00EEtes", -1, 1],
+ ["is", -1, 1],
+ ["irais", 13, 1],
+ ["issais", 13, 1],
+ ["irions", -1, 1],
+ ["issions", -1, 1],
+ ["irons", -1, 1],
+ ["issons", -1, 1],
+ ["issants", -1, 1],
+ ["it", -1, 1],
+ ["irait", 21, 1],
+ ["issait", 21, 1],
+ ["issant", -1, 1],
+ ["iraIent", -1, 1],
+ ["issaIent", -1, 1],
+ ["irent", -1, 1],
+ ["issent", -1, 1],
+ ["iront", -1, 1],
+ ["\u00EEt", -1, 1],
+ ["iriez", -1, 1],
+ ["issiez", -1, 1],
+ ["irez", -1, 1],
+ ["issez", -1, 1]
+ ];
+
+ /** @const */ var a_6 = [
+ ["a", -1, 3],
+ ["era", 0, 2],
+ ["asse", -1, 3],
+ ["ante", -1, 3],
+ ["\u00E9e", -1, 2],
+ ["ai", -1, 3],
+ ["erai", 5, 2],
+ ["er", -1, 2],
+ ["as", -1, 3],
+ ["eras", 8, 2],
+ ["\u00E2mes", -1, 3],
+ ["asses", -1, 3],
+ ["antes", -1, 3],
+ ["\u00E2tes", -1, 3],
+ ["\u00E9es", -1, 2],
+ ["ais", -1, 3],
+ ["erais", 15, 2],
+ ["ions", -1, 1],
+ ["erions", 17, 2],
+ ["assions", 17, 3],
+ ["erons", -1, 2],
+ ["ants", -1, 3],
+ ["\u00E9s", -1, 2],
+ ["ait", -1, 3],
+ ["erait", 23, 2],
+ ["ant", -1, 3],
+ ["aIent", -1, 3],
+ ["eraIent", 26, 2],
+ ["\u00E8rent", -1, 2],
+ ["assent", -1, 3],
+ ["eront", -1, 2],
+ ["\u00E2t", -1, 3],
+ ["ez", -1, 2],
+ ["iez", 32, 2],
+ ["eriez", 33, 2],
+ ["assiez", 33, 3],
+ ["erez", 32, 2],
+ ["\u00E9", -1, 2]
+ ];
+
+ /** @const */ var a_7 = [
+ ["e", -1, 3],
+ ["I\u00E8re", 0, 2],
+ ["i\u00E8re", 0, 2],
+ ["ion", -1, 1],
+ ["Ier", -1, 2],
+ ["ier", -1, 2]
+ ];
+
+ /** @const */ var a_8 = [
+ ["ell", -1, -1],
+ ["eill", -1, -1],
+ ["enn", -1, -1],
+ ["onn", -1, -1],
+ ["ett", -1, -1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 130, 103, 8, 5];
+
+ /** @const */ var /** Array<int> */ g_keep_with_s = [1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128];
+
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+ var /** number */ I_pV = 0;
+
+
+ /** @return {boolean} */
+ function r_prelude() {
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ golab1: while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab2: {
+ lab3: {
+ var /** number */ v_3 = base.cursor;
+ lab4: {
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab4;
+ }
+ base.bra = base.cursor;
+ lab5: {
+ var /** number */ v_4 = base.cursor;
+ lab6: {
+ if (!(base.eq_s("u")))
+ {
+ break lab6;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab6;
+ }
+ if (!base.slice_from("U"))
+ {
+ return false;
+ }
+ break lab5;
+ }
+ base.cursor = v_4;
+ lab7: {
+ if (!(base.eq_s("i")))
+ {
+ break lab7;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab7;
+ }
+ if (!base.slice_from("I"))
+ {
+ return false;
+ }
+ break lab5;
+ }
+ base.cursor = v_4;
+ if (!(base.eq_s("y")))
+ {
+ break lab4;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ lab8: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("\u00EB")))
+ {
+ break lab8;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("He"))
+ {
+ return false;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ lab9: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("\u00EF")))
+ {
+ break lab9;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("Hi"))
+ {
+ return false;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ lab10: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("y")))
+ {
+ break lab10;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab10;
+ }
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ if (!(base.eq_s("q")))
+ {
+ break lab2;
+ }
+ base.bra = base.cursor;
+ if (!(base.eq_s("u")))
+ {
+ break lab2;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("U"))
+ {
+ return false;
+ }
+ }
+ base.cursor = v_2;
+ break golab1;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_pV = base.limit;
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_2 = base.cursor;
+ lab2: {
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab2;
+ }
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab2;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab2;
+ }
+ base.cursor++;
+ break lab1;
+ }
+ base.cursor = v_2;
+ lab3: {
+ if (base.find_among(a_0) == 0)
+ {
+ break lab3;
+ }
+ break lab1;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ golab4: while(true)
+ {
+ lab5: {
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab5;
+ }
+ break golab4;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ }
+ I_pV = base.cursor;
+ }
+ base.cursor = v_1;
+ var /** number */ v_4 = base.cursor;
+ lab6: {
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab6;
+ }
+ base.cursor++;
+ }
+ golab9: while(true)
+ {
+ lab10: {
+ if (!(base.out_grouping(g_v, 97, 251)))
+ {
+ break lab10;
+ }
+ break golab9;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab6;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ golab11: while(true)
+ {
+ lab12: {
+ if (!(base.in_grouping(g_v, 97, 251)))
+ {
+ break lab12;
+ }
+ break golab11;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab6;
+ }
+ base.cursor++;
+ }
+ golab13: while(true)
+ {
+ lab14: {
+ if (!(base.out_grouping(g_v, 97, 251)))
+ {
+ break lab14;
+ }
+ break golab13;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab6;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_4;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_1);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("y"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("\u00EB"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("\u00EF"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_RV() {
+ if (!(I_pV <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_standard_suffix() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("ic")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ lab1: {
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab2: {
+ if (!r_R2())
+ {
+ break lab2;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ if (!base.slice_from("iqU"))
+ {
+ return false;
+ }
+ }
+ }
+ break;
+ case 3:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("log"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("ent"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab3: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ base.cursor = base.limit - v_3;
+ break lab3;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_3;
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_3;
+ break lab3;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_3;
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ lab4: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab5: {
+ if (!r_R2())
+ {
+ break lab5;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab4;
+ }
+ base.cursor = base.limit - v_4;
+ if (!r_R1())
+ {
+ base.cursor = base.limit - v_3;
+ break lab3;
+ }
+ if (!base.slice_from("eux"))
+ {
+ return false;
+ }
+ }
+ break;
+ case 3:
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_3;
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!r_RV())
+ {
+ base.cursor = base.limit - v_3;
+ break lab3;
+ }
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ break;
+ case 7:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab6: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_3);
+ if (among_var == 0)
+ {
+ base.cursor = base.limit - v_5;
+ break lab6;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ lab7: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab8: {
+ if (!r_R2())
+ {
+ break lab8;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab7;
+ }
+ base.cursor = base.limit - v_6;
+ if (!base.slice_from("abl"))
+ {
+ return false;
+ }
+ }
+ break;
+ case 2:
+ lab9: {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab10: {
+ if (!r_R2())
+ {
+ break lab10;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab9;
+ }
+ base.cursor = base.limit - v_7;
+ if (!base.slice_from("iqU"))
+ {
+ return false;
+ }
+ }
+ break;
+ case 3:
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_5;
+ break lab6;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ break;
+ case 8:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab11: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_8;
+ break lab11;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_8;
+ break lab11;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("ic")))
+ {
+ base.cursor = base.limit - v_8;
+ break lab11;
+ }
+ base.bra = base.cursor;
+ lab12: {
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab13: {
+ if (!r_R2())
+ {
+ break lab13;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab12;
+ }
+ base.cursor = base.limit - v_9;
+ if (!base.slice_from("iqU"))
+ {
+ return false;
+ }
+ }
+ }
+ break;
+ case 9:
+ if (!base.slice_from("eau"))
+ {
+ return false;
+ }
+ break;
+ case 10:
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!base.slice_from("al"))
+ {
+ return false;
+ }
+ break;
+ case 11:
+ lab14: {
+ var /** number */ v_10 = base.limit - base.cursor;
+ lab15: {
+ if (!r_R2())
+ {
+ break lab15;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab14;
+ }
+ base.cursor = base.limit - v_10;
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!base.slice_from("eux"))
+ {
+ return false;
+ }
+ }
+ break;
+ case 12:
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!(base.out_grouping_b(g_v, 97, 251)))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 13:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_from("ant"))
+ {
+ return false;
+ }
+ return false;
+ case 14:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_from("ent"))
+ {
+ return false;
+ }
+ return false;
+ case 15:
+ var /** number */ v_11 = base.limit - base.cursor;
+ if (!(base.in_grouping_b(g_v, 97, 251)))
+ {
+ return false;
+ }
+ if (!r_RV())
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_11;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_i_verb_suffix() {
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_5) == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("H")))
+ {
+ break lab0;
+ }
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ if (!(base.out_grouping_b(g_v, 97, 251)))
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.limit_backward = v_2;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_verb_suffix() {
+ var /** number */ among_var;
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_6);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("e")))
+ {
+ base.cursor = base.limit - v_3;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ }
+ base.limit_backward = v_2;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_residual_suffix() {
+ var /** number */ among_var;
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("s")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ if (!(base.eq_s_b("Hi")))
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_3;
+ if (!(base.out_grouping_b(g_keep_with_s, 97, 232)))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ }
+ base.cursor = base.limit - v_2;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_5 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_7);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_5;
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ base.limit_backward = v_5;
+ return false;
+ }
+ lab3: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab4: {
+ if (!(base.eq_s_b("s")))
+ {
+ break lab4;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_6;
+ if (!(base.eq_s_b("t")))
+ {
+ base.limit_backward = v_5;
+ return false;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ base.limit_backward = v_5;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_un_double() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ if (base.find_among_b(a_8) == 0)
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ base.ket = base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_un_accent() {
+ {
+ var v_1 = 1;
+ while(true)
+ {
+ lab0: {
+ if (!(base.out_grouping_b(g_v, 97, 251)))
+ {
+ break lab0;
+ }
+ v_1--;
+ continue;
+ }
+ break;
+ }
+ if (v_1 > 0)
+ {
+ return false;
+ }
+ }
+ base.ket = base.cursor;
+ lab1: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ if (!(base.eq_s_b("\u00E9")))
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_3;
+ if (!(base.eq_s_b("\u00E8")))
+ {
+ return false;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_prelude();
+ base.cursor = v_1;
+ r_mark_regions();
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab2: {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab3: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab4: {
+ if (!r_standard_suffix())
+ {
+ break lab4;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_6;
+ lab5: {
+ if (!r_i_verb_suffix())
+ {
+ break lab5;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_6;
+ if (!r_verb_suffix())
+ {
+ break lab2;
+ }
+ }
+ base.cursor = base.limit - v_5;
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab6: {
+ base.ket = base.cursor;
+ lab7: {
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab8: {
+ if (!(base.eq_s_b("Y")))
+ {
+ break lab8;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break lab7;
+ }
+ base.cursor = base.limit - v_8;
+ if (!(base.eq_s_b("\u00E7")))
+ {
+ base.cursor = base.limit - v_7;
+ break lab6;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_from("c"))
+ {
+ return false;
+ }
+ }
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_4;
+ if (!r_residual_suffix())
+ {
+ break lab0;
+ }
+ }
+ }
+ base.cursor = base.limit - v_3;
+ var /** number */ v_9 = base.limit - base.cursor;
+ r_un_double();
+ base.cursor = base.limit - v_9;
+ var /** number */ v_10 = base.limit - base.cursor;
+ r_un_accent();
+ base.cursor = base.limit - v_10;
+ base.cursor = base.limit_backward;
+ var /** number */ v_11 = base.cursor;
+ r_postlude();
+ base.cursor = v_11;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/german-stemmer.js b/sphinx/search/non-minified-js/german-stemmer.js
new file mode 100644
index 0000000..f5ff81b
--- /dev/null
+++ b/sphinx/search/non-minified-js/german-stemmer.js
@@ -0,0 +1,577 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+GermanStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["", -1, 5],
+ ["U", 0, 2],
+ ["Y", 0, 1],
+ ["\u00E4", 0, 3],
+ ["\u00F6", 0, 4],
+ ["\u00FC", 0, 2]
+ ];
+
+ /** @const */ var a_1 = [
+ ["e", -1, 2],
+ ["em", -1, 1],
+ ["en", -1, 2],
+ ["ern", -1, 1],
+ ["er", -1, 1],
+ ["s", -1, 3],
+ ["es", 5, 2]
+ ];
+
+ /** @const */ var a_2 = [
+ ["en", -1, 1],
+ ["er", -1, 1],
+ ["st", -1, 2],
+ ["est", 2, 1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["ig", -1, 1],
+ ["lich", -1, 1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["end", -1, 1],
+ ["ig", -1, 2],
+ ["ung", -1, 1],
+ ["lich", -1, 3],
+ ["isch", -1, 2],
+ ["ik", -1, 2],
+ ["heit", -1, 3],
+ ["keit", -1, 4]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8];
+
+ /** @const */ var /** Array<int> */ g_s_ending = [117, 30, 5];
+
+ /** @const */ var /** Array<int> */ g_st_ending = [117, 30, 4];
+
+ var /** number */ I_x = 0;
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+
+
+ /** @return {boolean} */
+ function r_prelude() {
+ var /** number */ v_1 = base.cursor;
+ while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_3 = base.cursor;
+ lab2: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("\u00DF")))
+ {
+ break lab2;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("ss"))
+ {
+ return false;
+ }
+ break lab1;
+ }
+ base.cursor = v_3;
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ continue;
+ }
+ base.cursor = v_2;
+ break;
+ }
+ base.cursor = v_1;
+ while(true)
+ {
+ var /** number */ v_4 = base.cursor;
+ lab3: {
+ golab4: while(true)
+ {
+ var /** number */ v_5 = base.cursor;
+ lab5: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab5;
+ }
+ base.bra = base.cursor;
+ lab6: {
+ var /** number */ v_6 = base.cursor;
+ lab7: {
+ if (!(base.eq_s("u")))
+ {
+ break lab7;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab7;
+ }
+ if (!base.slice_from("U"))
+ {
+ return false;
+ }
+ break lab6;
+ }
+ base.cursor = v_6;
+ if (!(base.eq_s("y")))
+ {
+ break lab5;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab5;
+ }
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ }
+ base.cursor = v_5;
+ break golab4;
+ }
+ base.cursor = v_5;
+ if (base.cursor >= base.limit)
+ {
+ break lab3;
+ }
+ base.cursor++;
+ }
+ continue;
+ }
+ base.cursor = v_4;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ {
+ var /** number */ c1 = base.cursor + 3;
+ if (c1 > base.limit)
+ {
+ return false;
+ }
+ base.cursor = c1;
+ }
+ I_x = base.cursor;
+ base.cursor = v_1;
+ golab0: while(true)
+ {
+ lab1: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab1;
+ }
+ break golab0;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab2: while(true)
+ {
+ lab3: {
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab3;
+ }
+ break golab2;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ lab4: {
+ if (!(I_p1 < I_x))
+ {
+ break lab4;
+ }
+ I_p1 = I_x;
+ }
+ golab5: while(true)
+ {
+ lab6: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab6;
+ }
+ break golab5;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_0);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("y"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("o"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_standard_suffix() {
+ var /** number */ among_var;
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_1);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ break lab0;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("s")))
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!(base.eq_s_b("nis")))
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 3:
+ if (!(base.in_grouping_b(g_s_ending, 98, 116)))
+ {
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ base.cursor = base.limit - v_1;
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ break lab2;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ break lab2;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!(base.in_grouping_b(g_st_ending, 98, 116)))
+ {
+ break lab2;
+ }
+ {
+ var /** number */ c1 = base.cursor - 3;
+ if (c1 < base.limit_backward)
+ {
+ break lab2;
+ }
+ base.cursor = c1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab3: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ break lab3;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ break lab3;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab4: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("ig")))
+ {
+ base.cursor = base.limit - v_5;
+ break lab4;
+ }
+ base.bra = base.cursor;
+ {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab5: {
+ if (!(base.eq_s_b("e")))
+ {
+ break lab5;
+ }
+ base.cursor = base.limit - v_5;
+ break lab4;
+ }
+ base.cursor = base.limit - v_6;
+ }
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_5;
+ break lab4;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 2:
+ {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab6: {
+ if (!(base.eq_s_b("e")))
+ {
+ break lab6;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_7;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab7: {
+ base.ket = base.cursor;
+ lab8: {
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab9: {
+ if (!(base.eq_s_b("er")))
+ {
+ break lab9;
+ }
+ break lab8;
+ }
+ base.cursor = base.limit - v_9;
+ if (!(base.eq_s_b("en")))
+ {
+ base.cursor = base.limit - v_8;
+ break lab7;
+ }
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ base.cursor = base.limit - v_8;
+ break lab7;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 4:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_10 = base.limit - base.cursor;
+ lab10: {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_3) == 0)
+ {
+ base.cursor = base.limit - v_10;
+ break lab10;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_10;
+ break lab10;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ }
+ }
+ base.cursor = base.limit - v_4;
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_prelude();
+ base.cursor = v_1;
+ var /** number */ v_2 = base.cursor;
+ r_mark_regions();
+ base.cursor = v_2;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ r_standard_suffix();
+ base.cursor = base.limit_backward;
+ var /** number */ v_4 = base.cursor;
+ r_postlude();
+ base.cursor = v_4;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/hungarian-stemmer.js b/sphinx/search/non-minified-js/hungarian-stemmer.js
new file mode 100644
index 0000000..2c550ac
--- /dev/null
+++ b/sphinx/search/non-minified-js/hungarian-stemmer.js
@@ -0,0 +1,711 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+HungarianStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["cs", -1, -1],
+ ["dzs", -1, -1],
+ ["gy", -1, -1],
+ ["ly", -1, -1],
+ ["ny", -1, -1],
+ ["sz", -1, -1],
+ ["ty", -1, -1],
+ ["zs", -1, -1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["\u00E1", -1, 1],
+ ["\u00E9", -1, 2]
+ ];
+
+ /** @const */ var a_2 = [
+ ["bb", -1, -1],
+ ["cc", -1, -1],
+ ["dd", -1, -1],
+ ["ff", -1, -1],
+ ["gg", -1, -1],
+ ["jj", -1, -1],
+ ["kk", -1, -1],
+ ["ll", -1, -1],
+ ["mm", -1, -1],
+ ["nn", -1, -1],
+ ["pp", -1, -1],
+ ["rr", -1, -1],
+ ["ccs", -1, -1],
+ ["ss", -1, -1],
+ ["zzs", -1, -1],
+ ["tt", -1, -1],
+ ["vv", -1, -1],
+ ["ggy", -1, -1],
+ ["lly", -1, -1],
+ ["nny", -1, -1],
+ ["tty", -1, -1],
+ ["ssz", -1, -1],
+ ["zz", -1, -1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["al", -1, 1],
+ ["el", -1, 1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["ba", -1, -1],
+ ["ra", -1, -1],
+ ["be", -1, -1],
+ ["re", -1, -1],
+ ["ig", -1, -1],
+ ["nak", -1, -1],
+ ["nek", -1, -1],
+ ["val", -1, -1],
+ ["vel", -1, -1],
+ ["ul", -1, -1],
+ ["n\u00E1l", -1, -1],
+ ["n\u00E9l", -1, -1],
+ ["b\u00F3l", -1, -1],
+ ["r\u00F3l", -1, -1],
+ ["t\u00F3l", -1, -1],
+ ["\u00FCl", -1, -1],
+ ["b\u0151l", -1, -1],
+ ["r\u0151l", -1, -1],
+ ["t\u0151l", -1, -1],
+ ["n", -1, -1],
+ ["an", 19, -1],
+ ["ban", 20, -1],
+ ["en", 19, -1],
+ ["ben", 22, -1],
+ ["k\u00E9ppen", 22, -1],
+ ["on", 19, -1],
+ ["\u00F6n", 19, -1],
+ ["k\u00E9pp", -1, -1],
+ ["kor", -1, -1],
+ ["t", -1, -1],
+ ["at", 29, -1],
+ ["et", 29, -1],
+ ["k\u00E9nt", 29, -1],
+ ["ank\u00E9nt", 32, -1],
+ ["enk\u00E9nt", 32, -1],
+ ["onk\u00E9nt", 32, -1],
+ ["ot", 29, -1],
+ ["\u00E9rt", 29, -1],
+ ["\u00F6t", 29, -1],
+ ["hez", -1, -1],
+ ["hoz", -1, -1],
+ ["h\u00F6z", -1, -1],
+ ["v\u00E1", -1, -1],
+ ["v\u00E9", -1, -1]
+ ];
+
+ /** @const */ var a_5 = [
+ ["\u00E1n", -1, 2],
+ ["\u00E9n", -1, 1],
+ ["\u00E1nk\u00E9nt", -1, 2]
+ ];
+
+ /** @const */ var a_6 = [
+ ["stul", -1, 1],
+ ["astul", 0, 1],
+ ["\u00E1stul", 0, 2],
+ ["st\u00FCl", -1, 1],
+ ["est\u00FCl", 3, 1],
+ ["\u00E9st\u00FCl", 3, 3]
+ ];
+
+ /** @const */ var a_7 = [
+ ["\u00E1", -1, 1],
+ ["\u00E9", -1, 1]
+ ];
+
+ /** @const */ var a_8 = [
+ ["k", -1, 3],
+ ["ak", 0, 3],
+ ["ek", 0, 3],
+ ["ok", 0, 3],
+ ["\u00E1k", 0, 1],
+ ["\u00E9k", 0, 2],
+ ["\u00F6k", 0, 3]
+ ];
+
+ /** @const */ var a_9 = [
+ ["\u00E9i", -1, 1],
+ ["\u00E1\u00E9i", 0, 3],
+ ["\u00E9\u00E9i", 0, 2],
+ ["\u00E9", -1, 1],
+ ["k\u00E9", 3, 1],
+ ["ak\u00E9", 4, 1],
+ ["ek\u00E9", 4, 1],
+ ["ok\u00E9", 4, 1],
+ ["\u00E1k\u00E9", 4, 3],
+ ["\u00E9k\u00E9", 4, 2],
+ ["\u00F6k\u00E9", 4, 1],
+ ["\u00E9\u00E9", 3, 2]
+ ];
+
+ /** @const */ var a_10 = [
+ ["a", -1, 1],
+ ["ja", 0, 1],
+ ["d", -1, 1],
+ ["ad", 2, 1],
+ ["ed", 2, 1],
+ ["od", 2, 1],
+ ["\u00E1d", 2, 2],
+ ["\u00E9d", 2, 3],
+ ["\u00F6d", 2, 1],
+ ["e", -1, 1],
+ ["je", 9, 1],
+ ["nk", -1, 1],
+ ["unk", 11, 1],
+ ["\u00E1nk", 11, 2],
+ ["\u00E9nk", 11, 3],
+ ["\u00FCnk", 11, 1],
+ ["uk", -1, 1],
+ ["juk", 16, 1],
+ ["\u00E1juk", 17, 2],
+ ["\u00FCk", -1, 1],
+ ["j\u00FCk", 19, 1],
+ ["\u00E9j\u00FCk", 20, 3],
+ ["m", -1, 1],
+ ["am", 22, 1],
+ ["em", 22, 1],
+ ["om", 22, 1],
+ ["\u00E1m", 22, 2],
+ ["\u00E9m", 22, 3],
+ ["o", -1, 1],
+ ["\u00E1", -1, 2],
+ ["\u00E9", -1, 3]
+ ];
+
+ /** @const */ var a_11 = [
+ ["id", -1, 1],
+ ["aid", 0, 1],
+ ["jaid", 1, 1],
+ ["eid", 0, 1],
+ ["jeid", 3, 1],
+ ["\u00E1id", 0, 2],
+ ["\u00E9id", 0, 3],
+ ["i", -1, 1],
+ ["ai", 7, 1],
+ ["jai", 8, 1],
+ ["ei", 7, 1],
+ ["jei", 10, 1],
+ ["\u00E1i", 7, 2],
+ ["\u00E9i", 7, 3],
+ ["itek", -1, 1],
+ ["eitek", 14, 1],
+ ["jeitek", 15, 1],
+ ["\u00E9itek", 14, 3],
+ ["ik", -1, 1],
+ ["aik", 18, 1],
+ ["jaik", 19, 1],
+ ["eik", 18, 1],
+ ["jeik", 21, 1],
+ ["\u00E1ik", 18, 2],
+ ["\u00E9ik", 18, 3],
+ ["ink", -1, 1],
+ ["aink", 25, 1],
+ ["jaink", 26, 1],
+ ["eink", 25, 1],
+ ["jeink", 28, 1],
+ ["\u00E1ink", 25, 2],
+ ["\u00E9ink", 25, 3],
+ ["aitok", -1, 1],
+ ["jaitok", 32, 1],
+ ["\u00E1itok", -1, 2],
+ ["im", -1, 1],
+ ["aim", 35, 1],
+ ["jaim", 36, 1],
+ ["eim", 35, 1],
+ ["jeim", 38, 1],
+ ["\u00E1im", 35, 2],
+ ["\u00E9im", 35, 3]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 36, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1];
+
+ var /** number */ I_p1 = 0;
+
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ lab0: {
+ var /** number */ v_1 = base.cursor;
+ lab1: {
+ if (!(base.in_grouping(g_v, 97, 369)))
+ {
+ break lab1;
+ }
+ golab2: while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab3: {
+ if (!(base.out_grouping(g_v, 97, 369)))
+ {
+ break lab3;
+ }
+ base.cursor = v_2;
+ break golab2;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ break lab1;
+ }
+ base.cursor++;
+ }
+ lab4: {
+ var /** number */ v_3 = base.cursor;
+ lab5: {
+ if (base.find_among(a_0) == 0)
+ {
+ break lab5;
+ }
+ break lab4;
+ }
+ base.cursor = v_3;
+ if (base.cursor >= base.limit)
+ {
+ break lab1;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ break lab0;
+ }
+ base.cursor = v_1;
+ if (!(base.out_grouping(g_v, 97, 369)))
+ {
+ return false;
+ }
+ golab6: while(true)
+ {
+ lab7: {
+ if (!(base.in_grouping(g_v, 97, 369)))
+ {
+ break lab7;
+ }
+ break golab6;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_v_ending() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_1);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_double() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ if (base.find_among_b(a_2) == 0)
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_undouble() {
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ base.ket = base.cursor;
+ {
+ var /** number */ c1 = base.cursor - 1;
+ if (c1 < base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor = c1;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_instrum() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_3) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!r_double())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_undouble())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_case() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_4) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_v_ending())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_case_special() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_5);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_case_other() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_6);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_factive() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_7) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!r_double())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_undouble())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_plural() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_8);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_owned() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_9);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_sing_owner() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_10);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_plur_owner() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_11);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_mark_regions();
+ base.cursor = v_1;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_instrum();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_case();
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ r_case_special();
+ base.cursor = base.limit - v_4;
+ var /** number */ v_5 = base.limit - base.cursor;
+ r_case_other();
+ base.cursor = base.limit - v_5;
+ var /** number */ v_6 = base.limit - base.cursor;
+ r_factive();
+ base.cursor = base.limit - v_6;
+ var /** number */ v_7 = base.limit - base.cursor;
+ r_owned();
+ base.cursor = base.limit - v_7;
+ var /** number */ v_8 = base.limit - base.cursor;
+ r_sing_owner();
+ base.cursor = base.limit - v_8;
+ var /** number */ v_9 = base.limit - base.cursor;
+ r_plur_owner();
+ base.cursor = base.limit - v_9;
+ var /** number */ v_10 = base.limit - base.cursor;
+ r_plural();
+ base.cursor = base.limit - v_10;
+ base.cursor = base.limit_backward;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/italian-stemmer.js b/sphinx/search/non-minified-js/italian-stemmer.js
new file mode 100644
index 0000000..df6ddfd
--- /dev/null
+++ b/sphinx/search/non-minified-js/italian-stemmer.js
@@ -0,0 +1,996 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+ItalianStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["", -1, 7],
+ ["qu", 0, 6],
+ ["\u00E1", 0, 1],
+ ["\u00E9", 0, 2],
+ ["\u00ED", 0, 3],
+ ["\u00F3", 0, 4],
+ ["\u00FA", 0, 5]
+ ];
+
+ /** @const */ var a_1 = [
+ ["", -1, 3],
+ ["I", 0, 1],
+ ["U", 0, 2]
+ ];
+
+ /** @const */ var a_2 = [
+ ["la", -1, -1],
+ ["cela", 0, -1],
+ ["gliela", 0, -1],
+ ["mela", 0, -1],
+ ["tela", 0, -1],
+ ["vela", 0, -1],
+ ["le", -1, -1],
+ ["cele", 6, -1],
+ ["gliele", 6, -1],
+ ["mele", 6, -1],
+ ["tele", 6, -1],
+ ["vele", 6, -1],
+ ["ne", -1, -1],
+ ["cene", 12, -1],
+ ["gliene", 12, -1],
+ ["mene", 12, -1],
+ ["sene", 12, -1],
+ ["tene", 12, -1],
+ ["vene", 12, -1],
+ ["ci", -1, -1],
+ ["li", -1, -1],
+ ["celi", 20, -1],
+ ["glieli", 20, -1],
+ ["meli", 20, -1],
+ ["teli", 20, -1],
+ ["veli", 20, -1],
+ ["gli", 20, -1],
+ ["mi", -1, -1],
+ ["si", -1, -1],
+ ["ti", -1, -1],
+ ["vi", -1, -1],
+ ["lo", -1, -1],
+ ["celo", 31, -1],
+ ["glielo", 31, -1],
+ ["melo", 31, -1],
+ ["telo", 31, -1],
+ ["velo", 31, -1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["ando", -1, 1],
+ ["endo", -1, 1],
+ ["ar", -1, 2],
+ ["er", -1, 2],
+ ["ir", -1, 2]
+ ];
+
+ /** @const */ var a_4 = [
+ ["ic", -1, -1],
+ ["abil", -1, -1],
+ ["os", -1, -1],
+ ["iv", -1, 1]
+ ];
+
+ /** @const */ var a_5 = [
+ ["ic", -1, 1],
+ ["abil", -1, 1],
+ ["iv", -1, 1]
+ ];
+
+ /** @const */ var a_6 = [
+ ["ica", -1, 1],
+ ["logia", -1, 3],
+ ["osa", -1, 1],
+ ["ista", -1, 1],
+ ["iva", -1, 9],
+ ["anza", -1, 1],
+ ["enza", -1, 5],
+ ["ice", -1, 1],
+ ["atrice", 7, 1],
+ ["iche", -1, 1],
+ ["logie", -1, 3],
+ ["abile", -1, 1],
+ ["ibile", -1, 1],
+ ["usione", -1, 4],
+ ["azione", -1, 2],
+ ["uzione", -1, 4],
+ ["atore", -1, 2],
+ ["ose", -1, 1],
+ ["ante", -1, 1],
+ ["mente", -1, 1],
+ ["amente", 19, 7],
+ ["iste", -1, 1],
+ ["ive", -1, 9],
+ ["anze", -1, 1],
+ ["enze", -1, 5],
+ ["ici", -1, 1],
+ ["atrici", 25, 1],
+ ["ichi", -1, 1],
+ ["abili", -1, 1],
+ ["ibili", -1, 1],
+ ["ismi", -1, 1],
+ ["usioni", -1, 4],
+ ["azioni", -1, 2],
+ ["uzioni", -1, 4],
+ ["atori", -1, 2],
+ ["osi", -1, 1],
+ ["anti", -1, 1],
+ ["amenti", -1, 6],
+ ["imenti", -1, 6],
+ ["isti", -1, 1],
+ ["ivi", -1, 9],
+ ["ico", -1, 1],
+ ["ismo", -1, 1],
+ ["oso", -1, 1],
+ ["amento", -1, 6],
+ ["imento", -1, 6],
+ ["ivo", -1, 9],
+ ["it\u00E0", -1, 8],
+ ["ist\u00E0", -1, 1],
+ ["ist\u00E8", -1, 1],
+ ["ist\u00EC", -1, 1]
+ ];
+
+ /** @const */ var a_7 = [
+ ["isca", -1, 1],
+ ["enda", -1, 1],
+ ["ata", -1, 1],
+ ["ita", -1, 1],
+ ["uta", -1, 1],
+ ["ava", -1, 1],
+ ["eva", -1, 1],
+ ["iva", -1, 1],
+ ["erebbe", -1, 1],
+ ["irebbe", -1, 1],
+ ["isce", -1, 1],
+ ["ende", -1, 1],
+ ["are", -1, 1],
+ ["ere", -1, 1],
+ ["ire", -1, 1],
+ ["asse", -1, 1],
+ ["ate", -1, 1],
+ ["avate", 16, 1],
+ ["evate", 16, 1],
+ ["ivate", 16, 1],
+ ["ete", -1, 1],
+ ["erete", 20, 1],
+ ["irete", 20, 1],
+ ["ite", -1, 1],
+ ["ereste", -1, 1],
+ ["ireste", -1, 1],
+ ["ute", -1, 1],
+ ["erai", -1, 1],
+ ["irai", -1, 1],
+ ["isci", -1, 1],
+ ["endi", -1, 1],
+ ["erei", -1, 1],
+ ["irei", -1, 1],
+ ["assi", -1, 1],
+ ["ati", -1, 1],
+ ["iti", -1, 1],
+ ["eresti", -1, 1],
+ ["iresti", -1, 1],
+ ["uti", -1, 1],
+ ["avi", -1, 1],
+ ["evi", -1, 1],
+ ["ivi", -1, 1],
+ ["isco", -1, 1],
+ ["ando", -1, 1],
+ ["endo", -1, 1],
+ ["Yamo", -1, 1],
+ ["iamo", -1, 1],
+ ["avamo", -1, 1],
+ ["evamo", -1, 1],
+ ["ivamo", -1, 1],
+ ["eremo", -1, 1],
+ ["iremo", -1, 1],
+ ["assimo", -1, 1],
+ ["ammo", -1, 1],
+ ["emmo", -1, 1],
+ ["eremmo", 54, 1],
+ ["iremmo", 54, 1],
+ ["immo", -1, 1],
+ ["ano", -1, 1],
+ ["iscano", 58, 1],
+ ["avano", 58, 1],
+ ["evano", 58, 1],
+ ["ivano", 58, 1],
+ ["eranno", -1, 1],
+ ["iranno", -1, 1],
+ ["ono", -1, 1],
+ ["iscono", 65, 1],
+ ["arono", 65, 1],
+ ["erono", 65, 1],
+ ["irono", 65, 1],
+ ["erebbero", -1, 1],
+ ["irebbero", -1, 1],
+ ["assero", -1, 1],
+ ["essero", -1, 1],
+ ["issero", -1, 1],
+ ["ato", -1, 1],
+ ["ito", -1, 1],
+ ["uto", -1, 1],
+ ["avo", -1, 1],
+ ["evo", -1, 1],
+ ["ivo", -1, 1],
+ ["ar", -1, 1],
+ ["ir", -1, 1],
+ ["er\u00E0", -1, 1],
+ ["ir\u00E0", -1, 1],
+ ["er\u00F2", -1, 1],
+ ["ir\u00F2", -1, 1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2, 1];
+
+ /** @const */ var /** Array<int> */ g_AEIO = [17, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2];
+
+ /** @const */ var /** Array<int> */ g_CG = [17];
+
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+ var /** number */ I_pV = 0;
+
+
+ /** @return {boolean} */
+ function r_prelude() {
+ var /** number */ among_var;
+ var /** number */ v_1 = base.cursor;
+ while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_0);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("\u00E0"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("\u00E8"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("\u00EC"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("\u00F2"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("\u00F9"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_from("qU"))
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_2;
+ break;
+ }
+ base.cursor = v_1;
+ while(true)
+ {
+ var /** number */ v_3 = base.cursor;
+ lab1: {
+ golab2: while(true)
+ {
+ var /** number */ v_4 = base.cursor;
+ lab3: {
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab3;
+ }
+ base.bra = base.cursor;
+ lab4: {
+ var /** number */ v_5 = base.cursor;
+ lab5: {
+ if (!(base.eq_s("u")))
+ {
+ break lab5;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab5;
+ }
+ if (!base.slice_from("U"))
+ {
+ return false;
+ }
+ break lab4;
+ }
+ base.cursor = v_5;
+ if (!(base.eq_s("i")))
+ {
+ break lab3;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab3;
+ }
+ if (!base.slice_from("I"))
+ {
+ return false;
+ }
+ }
+ base.cursor = v_4;
+ break golab2;
+ }
+ base.cursor = v_4;
+ if (base.cursor >= base.limit)
+ {
+ break lab1;
+ }
+ base.cursor++;
+ }
+ continue;
+ }
+ base.cursor = v_3;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_pV = base.limit;
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_2 = base.cursor;
+ lab2: {
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab2;
+ }
+ lab3: {
+ var /** number */ v_3 = base.cursor;
+ lab4: {
+ if (!(base.out_grouping(g_v, 97, 249)))
+ {
+ break lab4;
+ }
+ golab5: while(true)
+ {
+ lab6: {
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab6;
+ }
+ break golab5;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab4;
+ }
+ base.cursor++;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab2;
+ }
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.out_grouping(g_v, 97, 249)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab2;
+ }
+ base.cursor++;
+ }
+ }
+ break lab1;
+ }
+ base.cursor = v_2;
+ if (!(base.out_grouping(g_v, 97, 249)))
+ {
+ break lab0;
+ }
+ lab9: {
+ var /** number */ v_6 = base.cursor;
+ lab10: {
+ if (!(base.out_grouping(g_v, 97, 249)))
+ {
+ break lab10;
+ }
+ golab11: while(true)
+ {
+ lab12: {
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab12;
+ }
+ break golab11;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab10;
+ }
+ base.cursor++;
+ }
+ break lab9;
+ }
+ base.cursor = v_6;
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab0;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ }
+ I_pV = base.cursor;
+ }
+ base.cursor = v_1;
+ var /** number */ v_8 = base.cursor;
+ lab13: {
+ golab14: while(true)
+ {
+ lab15: {
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab15;
+ }
+ break golab14;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab16: while(true)
+ {
+ lab17: {
+ if (!(base.out_grouping(g_v, 97, 249)))
+ {
+ break lab17;
+ }
+ break golab16;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ golab18: while(true)
+ {
+ lab19: {
+ if (!(base.in_grouping(g_v, 97, 249)))
+ {
+ break lab19;
+ }
+ break golab18;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab20: while(true)
+ {
+ lab21: {
+ if (!(base.out_grouping(g_v, 97, 249)))
+ {
+ break lab21;
+ }
+ break golab20;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_8;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_1);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_RV() {
+ if (!(I_pV <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_attached_pronoun() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_2) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ among_var = base.find_among_b(a_3);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ if (!r_RV())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_standard_suffix() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_6);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("ic")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 3:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("log"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("ente"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ break;
+ case 8:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_5) == 0)
+ {
+ base.cursor = base.limit - v_3;
+ break lab2;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_3;
+ break lab2;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 9:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab3: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("ic")))
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_verb_suffix() {
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_7) == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.limit_backward = v_2;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_vowel_suffix() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.in_grouping_b(g_AEIO, 97, 242)))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!r_RV())
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("i")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!r_RV())
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("h")))
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!(base.in_grouping_b(g_CG, 99, 103)))
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!r_RV())
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_prelude();
+ base.cursor = v_1;
+ r_mark_regions();
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_attached_pronoun();
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab2: {
+ if (!r_standard_suffix())
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_5;
+ if (!r_verb_suffix())
+ {
+ break lab0;
+ }
+ }
+ }
+ base.cursor = base.limit - v_4;
+ var /** number */ v_6 = base.limit - base.cursor;
+ r_vowel_suffix();
+ base.cursor = base.limit - v_6;
+ base.cursor = base.limit_backward;
+ var /** number */ v_7 = base.cursor;
+ r_postlude();
+ base.cursor = v_7;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/norwegian-stemmer.js b/sphinx/search/non-minified-js/norwegian-stemmer.js
new file mode 100644
index 0000000..e176063
--- /dev/null
+++ b/sphinx/search/non-minified-js/norwegian-stemmer.js
@@ -0,0 +1,261 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+NorwegianStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["a", -1, 1],
+ ["e", -1, 1],
+ ["ede", 1, 1],
+ ["ande", 1, 1],
+ ["ende", 1, 1],
+ ["ane", 1, 1],
+ ["ene", 1, 1],
+ ["hetene", 6, 1],
+ ["erte", 1, 3],
+ ["en", -1, 1],
+ ["heten", 9, 1],
+ ["ar", -1, 1],
+ ["er", -1, 1],
+ ["heter", 12, 1],
+ ["s", -1, 2],
+ ["as", 14, 1],
+ ["es", 14, 1],
+ ["edes", 16, 1],
+ ["endes", 16, 1],
+ ["enes", 16, 1],
+ ["hetenes", 19, 1],
+ ["ens", 14, 1],
+ ["hetens", 21, 1],
+ ["ers", 14, 1],
+ ["ets", 14, 1],
+ ["et", -1, 1],
+ ["het", 25, 1],
+ ["ert", -1, 3],
+ ["ast", -1, 1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["dt", -1, -1],
+ ["vt", -1, -1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["leg", -1, 1],
+ ["eleg", 0, 1],
+ ["ig", -1, 1],
+ ["eig", 2, 1],
+ ["lig", 2, 1],
+ ["elig", 4, 1],
+ ["els", -1, 1],
+ ["lov", -1, 1],
+ ["elov", 7, 1],
+ ["slov", 7, 1],
+ ["hetslov", 9, 1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128];
+
+ /** @const */ var /** Array<int> */ g_s_ending = [119, 125, 149, 1];
+
+ var /** number */ I_x = 0;
+ var /** number */ I_p1 = 0;
+
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ {
+ var /** number */ c1 = base.cursor + 3;
+ if (c1 > base.limit)
+ {
+ return false;
+ }
+ base.cursor = c1;
+ }
+ I_x = base.cursor;
+ base.cursor = v_1;
+ golab0: while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab1: {
+ if (!(base.in_grouping(g_v, 97, 248)))
+ {
+ break lab1;
+ }
+ base.cursor = v_2;
+ break golab0;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab2: while(true)
+ {
+ lab3: {
+ if (!(base.out_grouping(g_v, 97, 248)))
+ {
+ break lab3;
+ }
+ break golab2;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ lab4: {
+ if (!(I_p1 < I_x))
+ {
+ break lab4;
+ }
+ I_p1 = I_x;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_main_suffix() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_0);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ lab0: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.in_grouping_b(g_s_ending, 98, 122)))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_3;
+ if (!(base.eq_s_b("k")))
+ {
+ return false;
+ }
+ if (!(base.out_grouping_b(g_v, 97, 248)))
+ {
+ return false;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("er"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_consonant_pair() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_1) == 0)
+ {
+ base.limit_backward = v_3;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_3;
+ base.cursor = base.limit - v_1;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_other_suffix() {
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_2) == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_mark_regions();
+ base.cursor = v_1;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_main_suffix();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_consonant_pair();
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ r_other_suffix();
+ base.cursor = base.limit - v_4;
+ base.cursor = base.limit_backward;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/porter-stemmer.js b/sphinx/search/non-minified-js/porter-stemmer.js
new file mode 100644
index 0000000..0747d2c
--- /dev/null
+++ b/sphinx/search/non-minified-js/porter-stemmer.js
@@ -0,0 +1,749 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+PorterStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["s", -1, 3],
+ ["ies", 0, 2],
+ ["sses", 0, 1],
+ ["ss", 0, -1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["", -1, 3],
+ ["bb", 0, 2],
+ ["dd", 0, 2],
+ ["ff", 0, 2],
+ ["gg", 0, 2],
+ ["bl", 0, 1],
+ ["mm", 0, 2],
+ ["nn", 0, 2],
+ ["pp", 0, 2],
+ ["rr", 0, 2],
+ ["at", 0, 1],
+ ["tt", 0, 2],
+ ["iz", 0, 1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ed", -1, 2],
+ ["eed", 0, 1],
+ ["ing", -1, 2]
+ ];
+
+ /** @const */ var a_3 = [
+ ["anci", -1, 3],
+ ["enci", -1, 2],
+ ["abli", -1, 4],
+ ["eli", -1, 6],
+ ["alli", -1, 9],
+ ["ousli", -1, 11],
+ ["entli", -1, 5],
+ ["aliti", -1, 9],
+ ["biliti", -1, 13],
+ ["iviti", -1, 12],
+ ["tional", -1, 1],
+ ["ational", 10, 8],
+ ["alism", -1, 9],
+ ["ation", -1, 8],
+ ["ization", 13, 7],
+ ["izer", -1, 7],
+ ["ator", -1, 8],
+ ["iveness", -1, 12],
+ ["fulness", -1, 10],
+ ["ousness", -1, 11]
+ ];
+
+ /** @const */ var a_4 = [
+ ["icate", -1, 2],
+ ["ative", -1, 3],
+ ["alize", -1, 1],
+ ["iciti", -1, 2],
+ ["ical", -1, 2],
+ ["ful", -1, 3],
+ ["ness", -1, 3]
+ ];
+
+ /** @const */ var a_5 = [
+ ["ic", -1, 1],
+ ["ance", -1, 1],
+ ["ence", -1, 1],
+ ["able", -1, 1],
+ ["ible", -1, 1],
+ ["ate", -1, 1],
+ ["ive", -1, 1],
+ ["ize", -1, 1],
+ ["iti", -1, 1],
+ ["al", -1, 1],
+ ["ism", -1, 1],
+ ["ion", -1, 2],
+ ["er", -1, 1],
+ ["ous", -1, 1],
+ ["ant", -1, 1],
+ ["ent", -1, 1],
+ ["ment", 15, 1],
+ ["ement", 16, 1],
+ ["ou", -1, 1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1];
+
+ /** @const */ var /** Array<int> */ g_v_WXY = [1, 17, 65, 208, 1];
+
+ var /** boolean */ B_Y_found = false;
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+
+
+ /** @return {boolean} */
+ function r_shortv() {
+ if (!(base.out_grouping_b(g_v_WXY, 89, 121)))
+ {
+ return false;
+ }
+ if (!(base.in_grouping_b(g_v, 97, 121)))
+ {
+ return false;
+ }
+ if (!(base.out_grouping_b(g_v, 97, 121)))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_1a() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_0);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("ss"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_1b() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!base.slice_from("ee"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ var /** number */ v_1 = base.limit - base.cursor;
+ golab0: while(true)
+ {
+ lab1: {
+ if (!(base.in_grouping_b(g_v, 97, 121)))
+ {
+ break lab1;
+ }
+ break golab0;
+ }
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ }
+ base.cursor = base.limit - v_1;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit - base.cursor;
+ among_var = base.find_among_b(a_1);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ switch (among_var) {
+ case 1:
+ {
+ var /** number */ c1 = base.cursor;
+ base.insert(base.cursor, base.cursor, "e");
+ base.cursor = c1;
+ }
+ break;
+ case 2:
+ base.ket = base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (base.cursor != I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ if (!r_shortv())
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_4;
+ {
+ var /** number */ c2 = base.cursor;
+ base.insert(base.cursor, base.cursor, "e");
+ base.cursor = c2;
+ }
+ break;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_1c() {
+ base.ket = base.cursor;
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("y")))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("Y")))
+ {
+ return false;
+ }
+ }
+ base.bra = base.cursor;
+ golab2: while(true)
+ {
+ lab3: {
+ if (!(base.in_grouping_b(g_v, 97, 121)))
+ {
+ break lab3;
+ }
+ break golab2;
+ }
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ }
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_2() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_3);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("tion"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("ence"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("ance"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("able"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("ent"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (!base.slice_from("ize"))
+ {
+ return false;
+ }
+ break;
+ case 8:
+ if (!base.slice_from("ate"))
+ {
+ return false;
+ }
+ break;
+ case 9:
+ if (!base.slice_from("al"))
+ {
+ return false;
+ }
+ break;
+ case 10:
+ if (!base.slice_from("ful"))
+ {
+ return false;
+ }
+ break;
+ case 11:
+ if (!base.slice_from("ous"))
+ {
+ return false;
+ }
+ break;
+ case 12:
+ if (!base.slice_from("ive"))
+ {
+ return false;
+ }
+ break;
+ case 13:
+ if (!base.slice_from("ble"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_3() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("al"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("ic"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_4() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_5);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("s")))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("t")))
+ {
+ return false;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_5a() {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("e")))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!r_R2())
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!r_R1())
+ {
+ return false;
+ }
+ {
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab2: {
+ if (!r_shortv())
+ {
+ break lab2;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_2;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_Step_5b() {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("l")))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!(base.eq_s_b("l")))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ B_Y_found = false;
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("y")))
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ B_Y_found = true;
+ }
+ base.cursor = v_1;
+ var /** number */ v_2 = base.cursor;
+ lab1: {
+ while(true)
+ {
+ var /** number */ v_3 = base.cursor;
+ lab2: {
+ golab3: while(true)
+ {
+ var /** number */ v_4 = base.cursor;
+ lab4: {
+ if (!(base.in_grouping(g_v, 97, 121)))
+ {
+ break lab4;
+ }
+ base.bra = base.cursor;
+ if (!(base.eq_s("y")))
+ {
+ break lab4;
+ }
+ base.ket = base.cursor;
+ base.cursor = v_4;
+ break golab3;
+ }
+ base.cursor = v_4;
+ if (base.cursor >= base.limit)
+ {
+ break lab2;
+ }
+ base.cursor++;
+ }
+ if (!base.slice_from("Y"))
+ {
+ return false;
+ }
+ B_Y_found = true;
+ continue;
+ }
+ base.cursor = v_3;
+ break;
+ }
+ }
+ base.cursor = v_2;
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_5 = base.cursor;
+ lab5: {
+ golab6: while(true)
+ {
+ lab7: {
+ if (!(base.in_grouping(g_v, 97, 121)))
+ {
+ break lab7;
+ }
+ break golab6;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab5;
+ }
+ base.cursor++;
+ }
+ golab8: while(true)
+ {
+ lab9: {
+ if (!(base.out_grouping(g_v, 97, 121)))
+ {
+ break lab9;
+ }
+ break golab8;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab5;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ golab10: while(true)
+ {
+ lab11: {
+ if (!(base.in_grouping(g_v, 97, 121)))
+ {
+ break lab11;
+ }
+ break golab10;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab5;
+ }
+ base.cursor++;
+ }
+ golab12: while(true)
+ {
+ lab13: {
+ if (!(base.out_grouping(g_v, 97, 121)))
+ {
+ break lab13;
+ }
+ break golab12;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab5;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_5;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_10 = base.limit - base.cursor;
+ r_Step_1a();
+ base.cursor = base.limit - v_10;
+ var /** number */ v_11 = base.limit - base.cursor;
+ r_Step_1b();
+ base.cursor = base.limit - v_11;
+ var /** number */ v_12 = base.limit - base.cursor;
+ r_Step_1c();
+ base.cursor = base.limit - v_12;
+ var /** number */ v_13 = base.limit - base.cursor;
+ r_Step_2();
+ base.cursor = base.limit - v_13;
+ var /** number */ v_14 = base.limit - base.cursor;
+ r_Step_3();
+ base.cursor = base.limit - v_14;
+ var /** number */ v_15 = base.limit - base.cursor;
+ r_Step_4();
+ base.cursor = base.limit - v_15;
+ var /** number */ v_16 = base.limit - base.cursor;
+ r_Step_5a();
+ base.cursor = base.limit - v_16;
+ var /** number */ v_17 = base.limit - base.cursor;
+ r_Step_5b();
+ base.cursor = base.limit - v_17;
+ base.cursor = base.limit_backward;
+ var /** number */ v_18 = base.cursor;
+ lab14: {
+ if (!B_Y_found)
+ {
+ break lab14;
+ }
+ while(true)
+ {
+ var /** number */ v_19 = base.cursor;
+ lab15: {
+ golab16: while(true)
+ {
+ var /** number */ v_20 = base.cursor;
+ lab17: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("Y")))
+ {
+ break lab17;
+ }
+ base.ket = base.cursor;
+ base.cursor = v_20;
+ break golab16;
+ }
+ base.cursor = v_20;
+ if (base.cursor >= base.limit)
+ {
+ break lab15;
+ }
+ base.cursor++;
+ }
+ if (!base.slice_from("y"))
+ {
+ return false;
+ }
+ continue;
+ }
+ base.cursor = v_19;
+ break;
+ }
+ }
+ base.cursor = v_18;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/portuguese-stemmer.js b/sphinx/search/non-minified-js/portuguese-stemmer.js
new file mode 100644
index 0000000..662b976
--- /dev/null
+++ b/sphinx/search/non-minified-js/portuguese-stemmer.js
@@ -0,0 +1,914 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+PortugueseStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["", -1, 3],
+ ["\u00E3", 0, 1],
+ ["\u00F5", 0, 2]
+ ];
+
+ /** @const */ var a_1 = [
+ ["", -1, 3],
+ ["a~", 0, 1],
+ ["o~", 0, 2]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ic", -1, -1],
+ ["ad", -1, -1],
+ ["os", -1, -1],
+ ["iv", -1, 1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["ante", -1, 1],
+ ["avel", -1, 1],
+ ["\u00EDvel", -1, 1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["ic", -1, 1],
+ ["abil", -1, 1],
+ ["iv", -1, 1]
+ ];
+
+ /** @const */ var a_5 = [
+ ["ica", -1, 1],
+ ["\u00E2ncia", -1, 1],
+ ["\u00EAncia", -1, 4],
+ ["logia", -1, 2],
+ ["ira", -1, 9],
+ ["adora", -1, 1],
+ ["osa", -1, 1],
+ ["ista", -1, 1],
+ ["iva", -1, 8],
+ ["eza", -1, 1],
+ ["idade", -1, 7],
+ ["ante", -1, 1],
+ ["mente", -1, 6],
+ ["amente", 12, 5],
+ ["\u00E1vel", -1, 1],
+ ["\u00EDvel", -1, 1],
+ ["ico", -1, 1],
+ ["ismo", -1, 1],
+ ["oso", -1, 1],
+ ["amento", -1, 1],
+ ["imento", -1, 1],
+ ["ivo", -1, 8],
+ ["a\u00E7a~o", -1, 1],
+ ["u\u00E7a~o", -1, 3],
+ ["ador", -1, 1],
+ ["icas", -1, 1],
+ ["\u00EAncias", -1, 4],
+ ["logias", -1, 2],
+ ["iras", -1, 9],
+ ["adoras", -1, 1],
+ ["osas", -1, 1],
+ ["istas", -1, 1],
+ ["ivas", -1, 8],
+ ["ezas", -1, 1],
+ ["idades", -1, 7],
+ ["adores", -1, 1],
+ ["antes", -1, 1],
+ ["a\u00E7o~es", -1, 1],
+ ["u\u00E7o~es", -1, 3],
+ ["icos", -1, 1],
+ ["ismos", -1, 1],
+ ["osos", -1, 1],
+ ["amentos", -1, 1],
+ ["imentos", -1, 1],
+ ["ivos", -1, 8]
+ ];
+
+ /** @const */ var a_6 = [
+ ["ada", -1, 1],
+ ["ida", -1, 1],
+ ["ia", -1, 1],
+ ["aria", 2, 1],
+ ["eria", 2, 1],
+ ["iria", 2, 1],
+ ["ara", -1, 1],
+ ["era", -1, 1],
+ ["ira", -1, 1],
+ ["ava", -1, 1],
+ ["asse", -1, 1],
+ ["esse", -1, 1],
+ ["isse", -1, 1],
+ ["aste", -1, 1],
+ ["este", -1, 1],
+ ["iste", -1, 1],
+ ["ei", -1, 1],
+ ["arei", 16, 1],
+ ["erei", 16, 1],
+ ["irei", 16, 1],
+ ["am", -1, 1],
+ ["iam", 20, 1],
+ ["ariam", 21, 1],
+ ["eriam", 21, 1],
+ ["iriam", 21, 1],
+ ["aram", 20, 1],
+ ["eram", 20, 1],
+ ["iram", 20, 1],
+ ["avam", 20, 1],
+ ["em", -1, 1],
+ ["arem", 29, 1],
+ ["erem", 29, 1],
+ ["irem", 29, 1],
+ ["assem", 29, 1],
+ ["essem", 29, 1],
+ ["issem", 29, 1],
+ ["ado", -1, 1],
+ ["ido", -1, 1],
+ ["ando", -1, 1],
+ ["endo", -1, 1],
+ ["indo", -1, 1],
+ ["ara~o", -1, 1],
+ ["era~o", -1, 1],
+ ["ira~o", -1, 1],
+ ["ar", -1, 1],
+ ["er", -1, 1],
+ ["ir", -1, 1],
+ ["as", -1, 1],
+ ["adas", 47, 1],
+ ["idas", 47, 1],
+ ["ias", 47, 1],
+ ["arias", 50, 1],
+ ["erias", 50, 1],
+ ["irias", 50, 1],
+ ["aras", 47, 1],
+ ["eras", 47, 1],
+ ["iras", 47, 1],
+ ["avas", 47, 1],
+ ["es", -1, 1],
+ ["ardes", 58, 1],
+ ["erdes", 58, 1],
+ ["irdes", 58, 1],
+ ["ares", 58, 1],
+ ["eres", 58, 1],
+ ["ires", 58, 1],
+ ["asses", 58, 1],
+ ["esses", 58, 1],
+ ["isses", 58, 1],
+ ["astes", 58, 1],
+ ["estes", 58, 1],
+ ["istes", 58, 1],
+ ["is", -1, 1],
+ ["ais", 71, 1],
+ ["eis", 71, 1],
+ ["areis", 73, 1],
+ ["ereis", 73, 1],
+ ["ireis", 73, 1],
+ ["\u00E1reis", 73, 1],
+ ["\u00E9reis", 73, 1],
+ ["\u00EDreis", 73, 1],
+ ["\u00E1sseis", 73, 1],
+ ["\u00E9sseis", 73, 1],
+ ["\u00EDsseis", 73, 1],
+ ["\u00E1veis", 73, 1],
+ ["\u00EDeis", 73, 1],
+ ["ar\u00EDeis", 84, 1],
+ ["er\u00EDeis", 84, 1],
+ ["ir\u00EDeis", 84, 1],
+ ["ados", -1, 1],
+ ["idos", -1, 1],
+ ["amos", -1, 1],
+ ["\u00E1ramos", 90, 1],
+ ["\u00E9ramos", 90, 1],
+ ["\u00EDramos", 90, 1],
+ ["\u00E1vamos", 90, 1],
+ ["\u00EDamos", 90, 1],
+ ["ar\u00EDamos", 95, 1],
+ ["er\u00EDamos", 95, 1],
+ ["ir\u00EDamos", 95, 1],
+ ["emos", -1, 1],
+ ["aremos", 99, 1],
+ ["eremos", 99, 1],
+ ["iremos", 99, 1],
+ ["\u00E1ssemos", 99, 1],
+ ["\u00EAssemos", 99, 1],
+ ["\u00EDssemos", 99, 1],
+ ["imos", -1, 1],
+ ["armos", -1, 1],
+ ["ermos", -1, 1],
+ ["irmos", -1, 1],
+ ["\u00E1mos", -1, 1],
+ ["ar\u00E1s", -1, 1],
+ ["er\u00E1s", -1, 1],
+ ["ir\u00E1s", -1, 1],
+ ["eu", -1, 1],
+ ["iu", -1, 1],
+ ["ou", -1, 1],
+ ["ar\u00E1", -1, 1],
+ ["er\u00E1", -1, 1],
+ ["ir\u00E1", -1, 1]
+ ];
+
+ /** @const */ var a_7 = [
+ ["a", -1, 1],
+ ["i", -1, 1],
+ ["o", -1, 1],
+ ["os", -1, 1],
+ ["\u00E1", -1, 1],
+ ["\u00ED", -1, 1],
+ ["\u00F3", -1, 1]
+ ];
+
+ /** @const */ var a_8 = [
+ ["e", -1, 1],
+ ["\u00E7", -1, 2],
+ ["\u00E9", -1, 1],
+ ["\u00EA", -1, 1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 12, 2];
+
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+ var /** number */ I_pV = 0;
+
+
+ /** @return {boolean} */
+ function r_prelude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_0);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("a~"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("o~"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_pV = base.limit;
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_2 = base.cursor;
+ lab2: {
+ if (!(base.in_grouping(g_v, 97, 250)))
+ {
+ break lab2;
+ }
+ lab3: {
+ var /** number */ v_3 = base.cursor;
+ lab4: {
+ if (!(base.out_grouping(g_v, 97, 250)))
+ {
+ break lab4;
+ }
+ golab5: while(true)
+ {
+ lab6: {
+ if (!(base.in_grouping(g_v, 97, 250)))
+ {
+ break lab6;
+ }
+ break golab5;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab4;
+ }
+ base.cursor++;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ if (!(base.in_grouping(g_v, 97, 250)))
+ {
+ break lab2;
+ }
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.out_grouping(g_v, 97, 250)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab2;
+ }
+ base.cursor++;
+ }
+ }
+ break lab1;
+ }
+ base.cursor = v_2;
+ if (!(base.out_grouping(g_v, 97, 250)))
+ {
+ break lab0;
+ }
+ lab9: {
+ var /** number */ v_6 = base.cursor;
+ lab10: {
+ if (!(base.out_grouping(g_v, 97, 250)))
+ {
+ break lab10;
+ }
+ golab11: while(true)
+ {
+ lab12: {
+ if (!(base.in_grouping(g_v, 97, 250)))
+ {
+ break lab12;
+ }
+ break golab11;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab10;
+ }
+ base.cursor++;
+ }
+ break lab9;
+ }
+ base.cursor = v_6;
+ if (!(base.in_grouping(g_v, 97, 250)))
+ {
+ break lab0;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ }
+ I_pV = base.cursor;
+ }
+ base.cursor = v_1;
+ var /** number */ v_8 = base.cursor;
+ lab13: {
+ golab14: while(true)
+ {
+ lab15: {
+ if (!(base.in_grouping(g_v, 97, 250)))
+ {
+ break lab15;
+ }
+ break golab14;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab16: while(true)
+ {
+ lab17: {
+ if (!(base.out_grouping(g_v, 97, 250)))
+ {
+ break lab17;
+ }
+ break golab16;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ golab18: while(true)
+ {
+ lab19: {
+ if (!(base.in_grouping(g_v, 97, 250)))
+ {
+ break lab19;
+ }
+ break golab18;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab20: while(true)
+ {
+ lab21: {
+ if (!(base.out_grouping(g_v, 97, 250)))
+ {
+ break lab21;
+ }
+ break golab20;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_8;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_1);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("\u00E3"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("\u00F5"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_RV() {
+ if (!(I_pV <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_standard_suffix() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_5);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("log"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("ente"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ break;
+ case 6:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_3) == 0)
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 7:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_4) == 0)
+ {
+ base.cursor = base.limit - v_3;
+ break lab2;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_3;
+ break lab2;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 8:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab3: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 9:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!(base.eq_s_b("e")))
+ {
+ return false;
+ }
+ if (!base.slice_from("ir"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_verb_suffix() {
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_6) == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.limit_backward = v_2;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_residual_suffix() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_7) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_residual_form() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_8);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("u")))
+ {
+ break lab1;
+ }
+ base.bra = base.cursor;
+ var /** number */ v_2 = base.limit - base.cursor;
+ if (!(base.eq_s_b("g")))
+ {
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("i")))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ var /** number */ v_3 = base.limit - base.cursor;
+ if (!(base.eq_s_b("c")))
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("c"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_prelude();
+ base.cursor = v_1;
+ r_mark_regions();
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab2: {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab3: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab4: {
+ if (!r_standard_suffix())
+ {
+ break lab4;
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_6;
+ if (!r_verb_suffix())
+ {
+ break lab2;
+ }
+ }
+ base.cursor = base.limit - v_5;
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab5: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("i")))
+ {
+ break lab5;
+ }
+ base.bra = base.cursor;
+ var /** number */ v_8 = base.limit - base.cursor;
+ if (!(base.eq_s_b("c")))
+ {
+ break lab5;
+ }
+ base.cursor = base.limit - v_8;
+ if (!r_RV())
+ {
+ break lab5;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_7;
+ break lab1;
+ }
+ base.cursor = base.limit - v_4;
+ if (!r_residual_suffix())
+ {
+ break lab0;
+ }
+ }
+ }
+ base.cursor = base.limit - v_3;
+ var /** number */ v_9 = base.limit - base.cursor;
+ r_residual_form();
+ base.cursor = base.limit - v_9;
+ base.cursor = base.limit_backward;
+ var /** number */ v_10 = base.cursor;
+ r_postlude();
+ base.cursor = v_10;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/romanian-stemmer.js b/sphinx/search/non-minified-js/romanian-stemmer.js
new file mode 100644
index 0000000..67538f1
--- /dev/null
+++ b/sphinx/search/non-minified-js/romanian-stemmer.js
@@ -0,0 +1,872 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+RomanianStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["", -1, 3],
+ ["I", 0, 1],
+ ["U", 0, 2]
+ ];
+
+ /** @const */ var a_1 = [
+ ["ea", -1, 3],
+ ["a\u0163ia", -1, 7],
+ ["aua", -1, 2],
+ ["iua", -1, 4],
+ ["a\u0163ie", -1, 7],
+ ["ele", -1, 3],
+ ["ile", -1, 5],
+ ["iile", 6, 4],
+ ["iei", -1, 4],
+ ["atei", -1, 6],
+ ["ii", -1, 4],
+ ["ului", -1, 1],
+ ["ul", -1, 1],
+ ["elor", -1, 3],
+ ["ilor", -1, 4],
+ ["iilor", 14, 4]
+ ];
+
+ /** @const */ var a_2 = [
+ ["icala", -1, 4],
+ ["iciva", -1, 4],
+ ["ativa", -1, 5],
+ ["itiva", -1, 6],
+ ["icale", -1, 4],
+ ["a\u0163iune", -1, 5],
+ ["i\u0163iune", -1, 6],
+ ["atoare", -1, 5],
+ ["itoare", -1, 6],
+ ["\u0103toare", -1, 5],
+ ["icitate", -1, 4],
+ ["abilitate", -1, 1],
+ ["ibilitate", -1, 2],
+ ["ivitate", -1, 3],
+ ["icive", -1, 4],
+ ["ative", -1, 5],
+ ["itive", -1, 6],
+ ["icali", -1, 4],
+ ["atori", -1, 5],
+ ["icatori", 18, 4],
+ ["itori", -1, 6],
+ ["\u0103tori", -1, 5],
+ ["icitati", -1, 4],
+ ["abilitati", -1, 1],
+ ["ivitati", -1, 3],
+ ["icivi", -1, 4],
+ ["ativi", -1, 5],
+ ["itivi", -1, 6],
+ ["icit\u0103i", -1, 4],
+ ["abilit\u0103i", -1, 1],
+ ["ivit\u0103i", -1, 3],
+ ["icit\u0103\u0163i", -1, 4],
+ ["abilit\u0103\u0163i", -1, 1],
+ ["ivit\u0103\u0163i", -1, 3],
+ ["ical", -1, 4],
+ ["ator", -1, 5],
+ ["icator", 35, 4],
+ ["itor", -1, 6],
+ ["\u0103tor", -1, 5],
+ ["iciv", -1, 4],
+ ["ativ", -1, 5],
+ ["itiv", -1, 6],
+ ["ical\u0103", -1, 4],
+ ["iciv\u0103", -1, 4],
+ ["ativ\u0103", -1, 5],
+ ["itiv\u0103", -1, 6]
+ ];
+
+ /** @const */ var a_3 = [
+ ["ica", -1, 1],
+ ["abila", -1, 1],
+ ["ibila", -1, 1],
+ ["oasa", -1, 1],
+ ["ata", -1, 1],
+ ["ita", -1, 1],
+ ["anta", -1, 1],
+ ["ista", -1, 3],
+ ["uta", -1, 1],
+ ["iva", -1, 1],
+ ["ic", -1, 1],
+ ["ice", -1, 1],
+ ["abile", -1, 1],
+ ["ibile", -1, 1],
+ ["isme", -1, 3],
+ ["iune", -1, 2],
+ ["oase", -1, 1],
+ ["ate", -1, 1],
+ ["itate", 17, 1],
+ ["ite", -1, 1],
+ ["ante", -1, 1],
+ ["iste", -1, 3],
+ ["ute", -1, 1],
+ ["ive", -1, 1],
+ ["ici", -1, 1],
+ ["abili", -1, 1],
+ ["ibili", -1, 1],
+ ["iuni", -1, 2],
+ ["atori", -1, 1],
+ ["osi", -1, 1],
+ ["ati", -1, 1],
+ ["itati", 30, 1],
+ ["iti", -1, 1],
+ ["anti", -1, 1],
+ ["isti", -1, 3],
+ ["uti", -1, 1],
+ ["i\u015Fti", -1, 3],
+ ["ivi", -1, 1],
+ ["it\u0103i", -1, 1],
+ ["o\u015Fi", -1, 1],
+ ["it\u0103\u0163i", -1, 1],
+ ["abil", -1, 1],
+ ["ibil", -1, 1],
+ ["ism", -1, 3],
+ ["ator", -1, 1],
+ ["os", -1, 1],
+ ["at", -1, 1],
+ ["it", -1, 1],
+ ["ant", -1, 1],
+ ["ist", -1, 3],
+ ["ut", -1, 1],
+ ["iv", -1, 1],
+ ["ic\u0103", -1, 1],
+ ["abil\u0103", -1, 1],
+ ["ibil\u0103", -1, 1],
+ ["oas\u0103", -1, 1],
+ ["at\u0103", -1, 1],
+ ["it\u0103", -1, 1],
+ ["ant\u0103", -1, 1],
+ ["ist\u0103", -1, 3],
+ ["ut\u0103", -1, 1],
+ ["iv\u0103", -1, 1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["ea", -1, 1],
+ ["ia", -1, 1],
+ ["esc", -1, 1],
+ ["\u0103sc", -1, 1],
+ ["ind", -1, 1],
+ ["\u00E2nd", -1, 1],
+ ["are", -1, 1],
+ ["ere", -1, 1],
+ ["ire", -1, 1],
+ ["\u00E2re", -1, 1],
+ ["se", -1, 2],
+ ["ase", 10, 1],
+ ["sese", 10, 2],
+ ["ise", 10, 1],
+ ["use", 10, 1],
+ ["\u00E2se", 10, 1],
+ ["e\u015Fte", -1, 1],
+ ["\u0103\u015Fte", -1, 1],
+ ["eze", -1, 1],
+ ["ai", -1, 1],
+ ["eai", 19, 1],
+ ["iai", 19, 1],
+ ["sei", -1, 2],
+ ["e\u015Fti", -1, 1],
+ ["\u0103\u015Fti", -1, 1],
+ ["ui", -1, 1],
+ ["ezi", -1, 1],
+ ["\u00E2i", -1, 1],
+ ["a\u015Fi", -1, 1],
+ ["se\u015Fi", -1, 2],
+ ["ase\u015Fi", 29, 1],
+ ["sese\u015Fi", 29, 2],
+ ["ise\u015Fi", 29, 1],
+ ["use\u015Fi", 29, 1],
+ ["\u00E2se\u015Fi", 29, 1],
+ ["i\u015Fi", -1, 1],
+ ["u\u015Fi", -1, 1],
+ ["\u00E2\u015Fi", -1, 1],
+ ["a\u0163i", -1, 2],
+ ["ea\u0163i", 38, 1],
+ ["ia\u0163i", 38, 1],
+ ["e\u0163i", -1, 2],
+ ["i\u0163i", -1, 2],
+ ["\u00E2\u0163i", -1, 2],
+ ["ar\u0103\u0163i", -1, 1],
+ ["ser\u0103\u0163i", -1, 2],
+ ["aser\u0103\u0163i", 45, 1],
+ ["seser\u0103\u0163i", 45, 2],
+ ["iser\u0103\u0163i", 45, 1],
+ ["user\u0103\u0163i", 45, 1],
+ ["\u00E2ser\u0103\u0163i", 45, 1],
+ ["ir\u0103\u0163i", -1, 1],
+ ["ur\u0103\u0163i", -1, 1],
+ ["\u00E2r\u0103\u0163i", -1, 1],
+ ["am", -1, 1],
+ ["eam", 54, 1],
+ ["iam", 54, 1],
+ ["em", -1, 2],
+ ["asem", 57, 1],
+ ["sesem", 57, 2],
+ ["isem", 57, 1],
+ ["usem", 57, 1],
+ ["\u00E2sem", 57, 1],
+ ["im", -1, 2],
+ ["\u00E2m", -1, 2],
+ ["\u0103m", -1, 2],
+ ["ar\u0103m", 65, 1],
+ ["ser\u0103m", 65, 2],
+ ["aser\u0103m", 67, 1],
+ ["seser\u0103m", 67, 2],
+ ["iser\u0103m", 67, 1],
+ ["user\u0103m", 67, 1],
+ ["\u00E2ser\u0103m", 67, 1],
+ ["ir\u0103m", 65, 1],
+ ["ur\u0103m", 65, 1],
+ ["\u00E2r\u0103m", 65, 1],
+ ["au", -1, 1],
+ ["eau", 76, 1],
+ ["iau", 76, 1],
+ ["indu", -1, 1],
+ ["\u00E2ndu", -1, 1],
+ ["ez", -1, 1],
+ ["easc\u0103", -1, 1],
+ ["ar\u0103", -1, 1],
+ ["ser\u0103", -1, 2],
+ ["aser\u0103", 84, 1],
+ ["seser\u0103", 84, 2],
+ ["iser\u0103", 84, 1],
+ ["user\u0103", 84, 1],
+ ["\u00E2ser\u0103", 84, 1],
+ ["ir\u0103", -1, 1],
+ ["ur\u0103", -1, 1],
+ ["\u00E2r\u0103", -1, 1],
+ ["eaz\u0103", -1, 1]
+ ];
+
+ /** @const */ var a_5 = [
+ ["a", -1, 1],
+ ["e", -1, 1],
+ ["ie", 1, 1],
+ ["i", -1, 1],
+ ["\u0103", -1, 1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 4];
+
+ var /** boolean */ B_standard_suffix_removed = false;
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+ var /** number */ I_pV = 0;
+
+
+ /** @return {boolean} */
+ function r_prelude() {
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ golab1: while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab2: {
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab2;
+ }
+ base.bra = base.cursor;
+ lab3: {
+ var /** number */ v_3 = base.cursor;
+ lab4: {
+ if (!(base.eq_s("u")))
+ {
+ break lab4;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab4;
+ }
+ if (!base.slice_from("U"))
+ {
+ return false;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ if (!(base.eq_s("i")))
+ {
+ break lab2;
+ }
+ base.ket = base.cursor;
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab2;
+ }
+ if (!base.slice_from("I"))
+ {
+ return false;
+ }
+ }
+ base.cursor = v_2;
+ break golab1;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_pV = base.limit;
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_2 = base.cursor;
+ lab2: {
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab2;
+ }
+ lab3: {
+ var /** number */ v_3 = base.cursor;
+ lab4: {
+ if (!(base.out_grouping(g_v, 97, 259)))
+ {
+ break lab4;
+ }
+ golab5: while(true)
+ {
+ lab6: {
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab6;
+ }
+ break golab5;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab4;
+ }
+ base.cursor++;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab2;
+ }
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.out_grouping(g_v, 97, 259)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab2;
+ }
+ base.cursor++;
+ }
+ }
+ break lab1;
+ }
+ base.cursor = v_2;
+ if (!(base.out_grouping(g_v, 97, 259)))
+ {
+ break lab0;
+ }
+ lab9: {
+ var /** number */ v_6 = base.cursor;
+ lab10: {
+ if (!(base.out_grouping(g_v, 97, 259)))
+ {
+ break lab10;
+ }
+ golab11: while(true)
+ {
+ lab12: {
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab12;
+ }
+ break golab11;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab10;
+ }
+ base.cursor++;
+ }
+ break lab9;
+ }
+ base.cursor = v_6;
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab0;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ }
+ I_pV = base.cursor;
+ }
+ base.cursor = v_1;
+ var /** number */ v_8 = base.cursor;
+ lab13: {
+ golab14: while(true)
+ {
+ lab15: {
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab15;
+ }
+ break golab14;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab16: while(true)
+ {
+ lab17: {
+ if (!(base.out_grouping(g_v, 97, 259)))
+ {
+ break lab17;
+ }
+ break golab16;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ golab18: while(true)
+ {
+ lab19: {
+ if (!(base.in_grouping(g_v, 97, 259)))
+ {
+ break lab19;
+ }
+ break golab18;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab20: while(true)
+ {
+ lab21: {
+ if (!(base.out_grouping(g_v, 97, 259)))
+ {
+ break lab21;
+ }
+ break golab20;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_8;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_0);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_RV() {
+ if (!(I_pV <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_step_0() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_1);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("ab")))
+ {
+ break lab0;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ }
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_from("at"))
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (!base.slice_from("a\u0163i"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_combo_suffix() {
+ var /** number */ among_var;
+ var /** number */ v_1 = base.limit - base.cursor;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R1())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("abil"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("ibil"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("iv"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("ic"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("at"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_from("it"))
+ {
+ return false;
+ }
+ break;
+ }
+ B_standard_suffix_removed = true;
+ base.cursor = base.limit - v_1;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_standard_suffix() {
+ var /** number */ among_var;
+ B_standard_suffix_removed = false;
+ while(true)
+ {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ if (!r_combo_suffix())
+ {
+ break lab0;
+ }
+ continue;
+ }
+ base.cursor = base.limit - v_1;
+ break;
+ }
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_3);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!(base.eq_s_b("\u0163")))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_from("t"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("ist"))
+ {
+ return false;
+ }
+ break;
+ }
+ B_standard_suffix_removed = true;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_verb_suffix() {
+ var /** number */ among_var;
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ lab0: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.out_grouping_b(g_v, 97, 259)))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_3;
+ if (!(base.eq_s_b("u")))
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ base.limit_backward = v_2;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_vowel_suffix() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_5) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_prelude();
+ base.cursor = v_1;
+ r_mark_regions();
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_step_0();
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ r_standard_suffix();
+ base.cursor = base.limit - v_4;
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab2: {
+ if (!B_standard_suffix_removed)
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_6;
+ if (!r_verb_suffix())
+ {
+ break lab0;
+ }
+ }
+ }
+ base.cursor = base.limit - v_5;
+ var /** number */ v_7 = base.limit - base.cursor;
+ r_vowel_suffix();
+ base.cursor = base.limit - v_7;
+ base.cursor = base.limit_backward;
+ var /** number */ v_8 = base.cursor;
+ r_postlude();
+ base.cursor = v_8;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/russian-stemmer.js b/sphinx/search/non-minified-js/russian-stemmer.js
new file mode 100644
index 0000000..28ded5f
--- /dev/null
+++ b/sphinx/search/non-minified-js/russian-stemmer.js
@@ -0,0 +1,624 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+RussianStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["\u0432", -1, 1],
+ ["\u0438\u0432", 0, 2],
+ ["\u044B\u0432", 0, 2],
+ ["\u0432\u0448\u0438", -1, 1],
+ ["\u0438\u0432\u0448\u0438", 3, 2],
+ ["\u044B\u0432\u0448\u0438", 3, 2],
+ ["\u0432\u0448\u0438\u0441\u044C", -1, 1],
+ ["\u0438\u0432\u0448\u0438\u0441\u044C", 6, 2],
+ ["\u044B\u0432\u0448\u0438\u0441\u044C", 6, 2]
+ ];
+
+ /** @const */ var a_1 = [
+ ["\u0435\u0435", -1, 1],
+ ["\u0438\u0435", -1, 1],
+ ["\u043E\u0435", -1, 1],
+ ["\u044B\u0435", -1, 1],
+ ["\u0438\u043C\u0438", -1, 1],
+ ["\u044B\u043C\u0438", -1, 1],
+ ["\u0435\u0439", -1, 1],
+ ["\u0438\u0439", -1, 1],
+ ["\u043E\u0439", -1, 1],
+ ["\u044B\u0439", -1, 1],
+ ["\u0435\u043C", -1, 1],
+ ["\u0438\u043C", -1, 1],
+ ["\u043E\u043C", -1, 1],
+ ["\u044B\u043C", -1, 1],
+ ["\u0435\u0433\u043E", -1, 1],
+ ["\u043E\u0433\u043E", -1, 1],
+ ["\u0435\u043C\u0443", -1, 1],
+ ["\u043E\u043C\u0443", -1, 1],
+ ["\u0438\u0445", -1, 1],
+ ["\u044B\u0445", -1, 1],
+ ["\u0435\u044E", -1, 1],
+ ["\u043E\u044E", -1, 1],
+ ["\u0443\u044E", -1, 1],
+ ["\u044E\u044E", -1, 1],
+ ["\u0430\u044F", -1, 1],
+ ["\u044F\u044F", -1, 1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["\u0435\u043C", -1, 1],
+ ["\u043D\u043D", -1, 1],
+ ["\u0432\u0448", -1, 1],
+ ["\u0438\u0432\u0448", 2, 2],
+ ["\u044B\u0432\u0448", 2, 2],
+ ["\u0449", -1, 1],
+ ["\u044E\u0449", 5, 1],
+ ["\u0443\u044E\u0449", 6, 2]
+ ];
+
+ /** @const */ var a_3 = [
+ ["\u0441\u044C", -1, 1],
+ ["\u0441\u044F", -1, 1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["\u043B\u0430", -1, 1],
+ ["\u0438\u043B\u0430", 0, 2],
+ ["\u044B\u043B\u0430", 0, 2],
+ ["\u043D\u0430", -1, 1],
+ ["\u0435\u043D\u0430", 3, 2],
+ ["\u0435\u0442\u0435", -1, 1],
+ ["\u0438\u0442\u0435", -1, 2],
+ ["\u0439\u0442\u0435", -1, 1],
+ ["\u0435\u0439\u0442\u0435", 7, 2],
+ ["\u0443\u0439\u0442\u0435", 7, 2],
+ ["\u043B\u0438", -1, 1],
+ ["\u0438\u043B\u0438", 10, 2],
+ ["\u044B\u043B\u0438", 10, 2],
+ ["\u0439", -1, 1],
+ ["\u0435\u0439", 13, 2],
+ ["\u0443\u0439", 13, 2],
+ ["\u043B", -1, 1],
+ ["\u0438\u043B", 16, 2],
+ ["\u044B\u043B", 16, 2],
+ ["\u0435\u043C", -1, 1],
+ ["\u0438\u043C", -1, 2],
+ ["\u044B\u043C", -1, 2],
+ ["\u043D", -1, 1],
+ ["\u0435\u043D", 22, 2],
+ ["\u043B\u043E", -1, 1],
+ ["\u0438\u043B\u043E", 24, 2],
+ ["\u044B\u043B\u043E", 24, 2],
+ ["\u043D\u043E", -1, 1],
+ ["\u0435\u043D\u043E", 27, 2],
+ ["\u043D\u043D\u043E", 27, 1],
+ ["\u0435\u0442", -1, 1],
+ ["\u0443\u0435\u0442", 30, 2],
+ ["\u0438\u0442", -1, 2],
+ ["\u044B\u0442", -1, 2],
+ ["\u044E\u0442", -1, 1],
+ ["\u0443\u044E\u0442", 34, 2],
+ ["\u044F\u0442", -1, 2],
+ ["\u043D\u044B", -1, 1],
+ ["\u0435\u043D\u044B", 37, 2],
+ ["\u0442\u044C", -1, 1],
+ ["\u0438\u0442\u044C", 39, 2],
+ ["\u044B\u0442\u044C", 39, 2],
+ ["\u0435\u0448\u044C", -1, 1],
+ ["\u0438\u0448\u044C", -1, 2],
+ ["\u044E", -1, 2],
+ ["\u0443\u044E", 44, 2]
+ ];
+
+ /** @const */ var a_5 = [
+ ["\u0430", -1, 1],
+ ["\u0435\u0432", -1, 1],
+ ["\u043E\u0432", -1, 1],
+ ["\u0435", -1, 1],
+ ["\u0438\u0435", 3, 1],
+ ["\u044C\u0435", 3, 1],
+ ["\u0438", -1, 1],
+ ["\u0435\u0438", 6, 1],
+ ["\u0438\u0438", 6, 1],
+ ["\u0430\u043C\u0438", 6, 1],
+ ["\u044F\u043C\u0438", 6, 1],
+ ["\u0438\u044F\u043C\u0438", 10, 1],
+ ["\u0439", -1, 1],
+ ["\u0435\u0439", 12, 1],
+ ["\u0438\u0435\u0439", 13, 1],
+ ["\u0438\u0439", 12, 1],
+ ["\u043E\u0439", 12, 1],
+ ["\u0430\u043C", -1, 1],
+ ["\u0435\u043C", -1, 1],
+ ["\u0438\u0435\u043C", 18, 1],
+ ["\u043E\u043C", -1, 1],
+ ["\u044F\u043C", -1, 1],
+ ["\u0438\u044F\u043C", 21, 1],
+ ["\u043E", -1, 1],
+ ["\u0443", -1, 1],
+ ["\u0430\u0445", -1, 1],
+ ["\u044F\u0445", -1, 1],
+ ["\u0438\u044F\u0445", 26, 1],
+ ["\u044B", -1, 1],
+ ["\u044C", -1, 1],
+ ["\u044E", -1, 1],
+ ["\u0438\u044E", 30, 1],
+ ["\u044C\u044E", 30, 1],
+ ["\u044F", -1, 1],
+ ["\u0438\u044F", 33, 1],
+ ["\u044C\u044F", 33, 1]
+ ];
+
+ /** @const */ var a_6 = [
+ ["\u043E\u0441\u0442", -1, 1],
+ ["\u043E\u0441\u0442\u044C", -1, 1]
+ ];
+
+ /** @const */ var a_7 = [
+ ["\u0435\u0439\u0448\u0435", -1, 1],
+ ["\u043D", -1, 2],
+ ["\u0435\u0439\u0448", -1, 1],
+ ["\u044C", -1, 3]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [33, 65, 8, 232];
+
+ var /** number */ I_p2 = 0;
+ var /** number */ I_pV = 0;
+
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_pV = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ golab1: while(true)
+ {
+ lab2: {
+ if (!(base.in_grouping(g_v, 1072, 1103)))
+ {
+ break lab2;
+ }
+ break golab1;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ I_pV = base.cursor;
+ golab3: while(true)
+ {
+ lab4: {
+ if (!(base.out_grouping(g_v, 1072, 1103)))
+ {
+ break lab4;
+ }
+ break golab3;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ golab5: while(true)
+ {
+ lab6: {
+ if (!(base.in_grouping(g_v, 1072, 1103)))
+ {
+ break lab6;
+ }
+ break golab5;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.out_grouping(g_v, 1072, 1103)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_1;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_perfective_gerund() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_0);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("\u0430")))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("\u044F")))
+ {
+ return false;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_adjective() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_1) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_adjectival() {
+ var /** number */ among_var;
+ if (!r_adjective())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ lab1: {
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab2: {
+ if (!(base.eq_s_b("\u0430")))
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ if (!(base.eq_s_b("\u044F")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_reflexive() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_3) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_verb() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_4);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("\u0430")))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!(base.eq_s_b("\u044F")))
+ {
+ return false;
+ }
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_noun() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_5) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_derivational() {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_6) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_tidy_up() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_7);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("\u043D")))
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!(base.eq_s_b("\u043D")))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!(base.eq_s_b("\u043D")))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab1: {
+ golab2: while(true)
+ {
+ var /** number */ v_3 = base.cursor;
+ lab3: {
+ base.bra = base.cursor;
+ if (!(base.eq_s("\u0451")))
+ {
+ break lab3;
+ }
+ base.ket = base.cursor;
+ base.cursor = v_3;
+ break golab2;
+ }
+ base.cursor = v_3;
+ if (base.cursor >= base.limit)
+ {
+ break lab1;
+ }
+ base.cursor++;
+ }
+ if (!base.slice_from("\u0435"))
+ {
+ return false;
+ }
+ continue;
+ }
+ base.cursor = v_2;
+ break;
+ }
+ }
+ base.cursor = v_1;
+ r_mark_regions();
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_6 = base.limit_backward;
+ base.limit_backward = I_pV;
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab4: {
+ lab5: {
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab6: {
+ if (!r_perfective_gerund())
+ {
+ break lab6;
+ }
+ break lab5;
+ }
+ base.cursor = base.limit - v_8;
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab7: {
+ if (!r_reflexive())
+ {
+ base.cursor = base.limit - v_9;
+ break lab7;
+ }
+ }
+ lab8: {
+ var /** number */ v_10 = base.limit - base.cursor;
+ lab9: {
+ if (!r_adjectival())
+ {
+ break lab9;
+ }
+ break lab8;
+ }
+ base.cursor = base.limit - v_10;
+ lab10: {
+ if (!r_verb())
+ {
+ break lab10;
+ }
+ break lab8;
+ }
+ base.cursor = base.limit - v_10;
+ if (!r_noun())
+ {
+ break lab4;
+ }
+ }
+ }
+ }
+ base.cursor = base.limit - v_7;
+ var /** number */ v_11 = base.limit - base.cursor;
+ lab11: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("\u0438")))
+ {
+ base.cursor = base.limit - v_11;
+ break lab11;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ var /** number */ v_12 = base.limit - base.cursor;
+ r_derivational();
+ base.cursor = base.limit - v_12;
+ var /** number */ v_13 = base.limit - base.cursor;
+ r_tidy_up();
+ base.cursor = base.limit - v_13;
+ base.limit_backward = v_6;
+ base.cursor = base.limit_backward;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/spanish-stemmer.js b/sphinx/search/non-minified-js/spanish-stemmer.js
new file mode 100644
index 0000000..fffd616
--- /dev/null
+++ b/sphinx/search/non-minified-js/spanish-stemmer.js
@@ -0,0 +1,990 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+SpanishStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["", -1, 6],
+ ["\u00E1", 0, 1],
+ ["\u00E9", 0, 2],
+ ["\u00ED", 0, 3],
+ ["\u00F3", 0, 4],
+ ["\u00FA", 0, 5]
+ ];
+
+ /** @const */ var a_1 = [
+ ["la", -1, -1],
+ ["sela", 0, -1],
+ ["le", -1, -1],
+ ["me", -1, -1],
+ ["se", -1, -1],
+ ["lo", -1, -1],
+ ["selo", 5, -1],
+ ["las", -1, -1],
+ ["selas", 7, -1],
+ ["les", -1, -1],
+ ["los", -1, -1],
+ ["selos", 10, -1],
+ ["nos", -1, -1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ando", -1, 6],
+ ["iendo", -1, 6],
+ ["yendo", -1, 7],
+ ["\u00E1ndo", -1, 2],
+ ["i\u00E9ndo", -1, 1],
+ ["ar", -1, 6],
+ ["er", -1, 6],
+ ["ir", -1, 6],
+ ["\u00E1r", -1, 3],
+ ["\u00E9r", -1, 4],
+ ["\u00EDr", -1, 5]
+ ];
+
+ /** @const */ var a_3 = [
+ ["ic", -1, -1],
+ ["ad", -1, -1],
+ ["os", -1, -1],
+ ["iv", -1, 1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["able", -1, 1],
+ ["ible", -1, 1],
+ ["ante", -1, 1]
+ ];
+
+ /** @const */ var a_5 = [
+ ["ic", -1, 1],
+ ["abil", -1, 1],
+ ["iv", -1, 1]
+ ];
+
+ /** @const */ var a_6 = [
+ ["ica", -1, 1],
+ ["ancia", -1, 2],
+ ["encia", -1, 5],
+ ["adora", -1, 2],
+ ["osa", -1, 1],
+ ["ista", -1, 1],
+ ["iva", -1, 9],
+ ["anza", -1, 1],
+ ["log\u00EDa", -1, 3],
+ ["idad", -1, 8],
+ ["able", -1, 1],
+ ["ible", -1, 1],
+ ["ante", -1, 2],
+ ["mente", -1, 7],
+ ["amente", 13, 6],
+ ["aci\u00F3n", -1, 2],
+ ["uci\u00F3n", -1, 4],
+ ["ico", -1, 1],
+ ["ismo", -1, 1],
+ ["oso", -1, 1],
+ ["amiento", -1, 1],
+ ["imiento", -1, 1],
+ ["ivo", -1, 9],
+ ["ador", -1, 2],
+ ["icas", -1, 1],
+ ["ancias", -1, 2],
+ ["encias", -1, 5],
+ ["adoras", -1, 2],
+ ["osas", -1, 1],
+ ["istas", -1, 1],
+ ["ivas", -1, 9],
+ ["anzas", -1, 1],
+ ["log\u00EDas", -1, 3],
+ ["idades", -1, 8],
+ ["ables", -1, 1],
+ ["ibles", -1, 1],
+ ["aciones", -1, 2],
+ ["uciones", -1, 4],
+ ["adores", -1, 2],
+ ["antes", -1, 2],
+ ["icos", -1, 1],
+ ["ismos", -1, 1],
+ ["osos", -1, 1],
+ ["amientos", -1, 1],
+ ["imientos", -1, 1],
+ ["ivos", -1, 9]
+ ];
+
+ /** @const */ var a_7 = [
+ ["ya", -1, 1],
+ ["ye", -1, 1],
+ ["yan", -1, 1],
+ ["yen", -1, 1],
+ ["yeron", -1, 1],
+ ["yendo", -1, 1],
+ ["yo", -1, 1],
+ ["yas", -1, 1],
+ ["yes", -1, 1],
+ ["yais", -1, 1],
+ ["yamos", -1, 1],
+ ["y\u00F3", -1, 1]
+ ];
+
+ /** @const */ var a_8 = [
+ ["aba", -1, 2],
+ ["ada", -1, 2],
+ ["ida", -1, 2],
+ ["ara", -1, 2],
+ ["iera", -1, 2],
+ ["\u00EDa", -1, 2],
+ ["ar\u00EDa", 5, 2],
+ ["er\u00EDa", 5, 2],
+ ["ir\u00EDa", 5, 2],
+ ["ad", -1, 2],
+ ["ed", -1, 2],
+ ["id", -1, 2],
+ ["ase", -1, 2],
+ ["iese", -1, 2],
+ ["aste", -1, 2],
+ ["iste", -1, 2],
+ ["an", -1, 2],
+ ["aban", 16, 2],
+ ["aran", 16, 2],
+ ["ieran", 16, 2],
+ ["\u00EDan", 16, 2],
+ ["ar\u00EDan", 20, 2],
+ ["er\u00EDan", 20, 2],
+ ["ir\u00EDan", 20, 2],
+ ["en", -1, 1],
+ ["asen", 24, 2],
+ ["iesen", 24, 2],
+ ["aron", -1, 2],
+ ["ieron", -1, 2],
+ ["ar\u00E1n", -1, 2],
+ ["er\u00E1n", -1, 2],
+ ["ir\u00E1n", -1, 2],
+ ["ado", -1, 2],
+ ["ido", -1, 2],
+ ["ando", -1, 2],
+ ["iendo", -1, 2],
+ ["ar", -1, 2],
+ ["er", -1, 2],
+ ["ir", -1, 2],
+ ["as", -1, 2],
+ ["abas", 39, 2],
+ ["adas", 39, 2],
+ ["idas", 39, 2],
+ ["aras", 39, 2],
+ ["ieras", 39, 2],
+ ["\u00EDas", 39, 2],
+ ["ar\u00EDas", 45, 2],
+ ["er\u00EDas", 45, 2],
+ ["ir\u00EDas", 45, 2],
+ ["es", -1, 1],
+ ["ases", 49, 2],
+ ["ieses", 49, 2],
+ ["abais", -1, 2],
+ ["arais", -1, 2],
+ ["ierais", -1, 2],
+ ["\u00EDais", -1, 2],
+ ["ar\u00EDais", 55, 2],
+ ["er\u00EDais", 55, 2],
+ ["ir\u00EDais", 55, 2],
+ ["aseis", -1, 2],
+ ["ieseis", -1, 2],
+ ["asteis", -1, 2],
+ ["isteis", -1, 2],
+ ["\u00E1is", -1, 2],
+ ["\u00E9is", -1, 1],
+ ["ar\u00E9is", 64, 2],
+ ["er\u00E9is", 64, 2],
+ ["ir\u00E9is", 64, 2],
+ ["ados", -1, 2],
+ ["idos", -1, 2],
+ ["amos", -1, 2],
+ ["\u00E1bamos", 70, 2],
+ ["\u00E1ramos", 70, 2],
+ ["i\u00E9ramos", 70, 2],
+ ["\u00EDamos", 70, 2],
+ ["ar\u00EDamos", 74, 2],
+ ["er\u00EDamos", 74, 2],
+ ["ir\u00EDamos", 74, 2],
+ ["emos", -1, 1],
+ ["aremos", 78, 2],
+ ["eremos", 78, 2],
+ ["iremos", 78, 2],
+ ["\u00E1semos", 78, 2],
+ ["i\u00E9semos", 78, 2],
+ ["imos", -1, 2],
+ ["ar\u00E1s", -1, 2],
+ ["er\u00E1s", -1, 2],
+ ["ir\u00E1s", -1, 2],
+ ["\u00EDs", -1, 2],
+ ["ar\u00E1", -1, 2],
+ ["er\u00E1", -1, 2],
+ ["ir\u00E1", -1, 2],
+ ["ar\u00E9", -1, 2],
+ ["er\u00E9", -1, 2],
+ ["ir\u00E9", -1, 2],
+ ["i\u00F3", -1, 2]
+ ];
+
+ /** @const */ var a_9 = [
+ ["a", -1, 1],
+ ["e", -1, 2],
+ ["o", -1, 1],
+ ["os", -1, 1],
+ ["\u00E1", -1, 1],
+ ["\u00E9", -1, 2],
+ ["\u00ED", -1, 1],
+ ["\u00F3", -1, 1]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 10];
+
+ var /** number */ I_p2 = 0;
+ var /** number */ I_p1 = 0;
+ var /** number */ I_pV = 0;
+
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_pV = base.limit;
+ I_p1 = base.limit;
+ I_p2 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_2 = base.cursor;
+ lab2: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab2;
+ }
+ lab3: {
+ var /** number */ v_3 = base.cursor;
+ lab4: {
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab4;
+ }
+ golab5: while(true)
+ {
+ lab6: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab6;
+ }
+ break golab5;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab4;
+ }
+ base.cursor++;
+ }
+ break lab3;
+ }
+ base.cursor = v_3;
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab2;
+ }
+ golab7: while(true)
+ {
+ lab8: {
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab8;
+ }
+ break golab7;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab2;
+ }
+ base.cursor++;
+ }
+ }
+ break lab1;
+ }
+ base.cursor = v_2;
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab0;
+ }
+ lab9: {
+ var /** number */ v_6 = base.cursor;
+ lab10: {
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab10;
+ }
+ golab11: while(true)
+ {
+ lab12: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab12;
+ }
+ break golab11;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab10;
+ }
+ base.cursor++;
+ }
+ break lab9;
+ }
+ base.cursor = v_6;
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab0;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ }
+ I_pV = base.cursor;
+ }
+ base.cursor = v_1;
+ var /** number */ v_8 = base.cursor;
+ lab13: {
+ golab14: while(true)
+ {
+ lab15: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab15;
+ }
+ break golab14;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab16: while(true)
+ {
+ lab17: {
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab17;
+ }
+ break golab16;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ golab18: while(true)
+ {
+ lab19: {
+ if (!(base.in_grouping(g_v, 97, 252)))
+ {
+ break lab19;
+ }
+ break golab18;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ golab20: while(true)
+ {
+ lab21: {
+ if (!(base.out_grouping(g_v, 97, 252)))
+ {
+ break lab21;
+ }
+ break golab20;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab13;
+ }
+ base.cursor++;
+ }
+ I_p2 = base.cursor;
+ }
+ base.cursor = v_8;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ var /** number */ among_var;
+ while(true)
+ {
+ var /** number */ v_1 = base.cursor;
+ lab0: {
+ base.bra = base.cursor;
+ among_var = base.find_among(a_0);
+ if (among_var == 0)
+ {
+ break lab0;
+ }
+ base.ket = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("a"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("e"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("i"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("o"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ break;
+ }
+ continue;
+ }
+ base.cursor = v_1;
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_RV() {
+ if (!(I_pV <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R1() {
+ if (!(I_p1 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_R2() {
+ if (!(I_p2 <= base.cursor))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_attached_pronoun() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_1) == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ if (!r_RV())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ base.bra = base.cursor;
+ if (!base.slice_from("iendo"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ base.bra = base.cursor;
+ if (!base.slice_from("ando"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ base.bra = base.cursor;
+ if (!base.slice_from("ar"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ base.bra = base.cursor;
+ if (!base.slice_from("er"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ base.bra = base.cursor;
+ if (!base.slice_from("ir"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 7:
+ if (!(base.eq_s_b("u")))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_standard_suffix() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_6);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("ic")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 3:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("log"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("u"))
+ {
+ return false;
+ }
+ break;
+ case 5:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_from("ente"))
+ {
+ return false;
+ }
+ break;
+ case 6:
+ if (!r_R1())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_3);
+ if (among_var == 0)
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ switch (among_var) {
+ case 1:
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_2;
+ break lab1;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ }
+ break;
+ case 7:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_4) == 0)
+ {
+ base.cursor = base.limit - v_3;
+ break lab2;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_3;
+ break lab2;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 8:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab3: {
+ base.ket = base.cursor;
+ if (base.find_among_b(a_5) == 0)
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_4;
+ break lab3;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ case 9:
+ if (!r_R2())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab4: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("at")))
+ {
+ base.cursor = base.limit - v_5;
+ break lab4;
+ }
+ base.bra = base.cursor;
+ if (!r_R2())
+ {
+ base.cursor = base.limit - v_5;
+ break lab4;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_y_verb_suffix() {
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ if (base.find_among_b(a_7) == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ if (!(base.eq_s_b("u")))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_verb_suffix() {
+ var /** number */ among_var;
+ if (base.cursor < I_pV)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_pV;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_8);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("u")))
+ {
+ base.cursor = base.limit - v_3;
+ break lab0;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ if (!(base.eq_s_b("g")))
+ {
+ base.cursor = base.limit - v_3;
+ break lab0;
+ }
+ base.cursor = base.limit - v_4;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_residual_suffix() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_9);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!r_RV())
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ base.ket = base.cursor;
+ if (!(base.eq_s_b("u")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.bra = base.cursor;
+ var /** number */ v_2 = base.limit - base.cursor;
+ if (!(base.eq_s_b("g")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ base.cursor = base.limit - v_2;
+ if (!r_RV())
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ }
+ break;
+ }
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ r_mark_regions();
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_attached_pronoun();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab0: {
+ lab1: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab2: {
+ if (!r_standard_suffix())
+ {
+ break lab2;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_4;
+ lab3: {
+ if (!r_y_verb_suffix())
+ {
+ break lab3;
+ }
+ break lab1;
+ }
+ base.cursor = base.limit - v_4;
+ if (!r_verb_suffix())
+ {
+ break lab0;
+ }
+ }
+ }
+ base.cursor = base.limit - v_3;
+ var /** number */ v_5 = base.limit - base.cursor;
+ r_residual_suffix();
+ base.cursor = base.limit - v_5;
+ base.cursor = base.limit_backward;
+ var /** number */ v_6 = base.cursor;
+ r_postlude();
+ base.cursor = v_6;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/swedish-stemmer.js b/sphinx/search/non-minified-js/swedish-stemmer.js
new file mode 100644
index 0000000..4d7d49f
--- /dev/null
+++ b/sphinx/search/non-minified-js/swedish-stemmer.js
@@ -0,0 +1,265 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+SwedishStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["a", -1, 1],
+ ["arna", 0, 1],
+ ["erna", 0, 1],
+ ["heterna", 2, 1],
+ ["orna", 0, 1],
+ ["ad", -1, 1],
+ ["e", -1, 1],
+ ["ade", 6, 1],
+ ["ande", 6, 1],
+ ["arne", 6, 1],
+ ["are", 6, 1],
+ ["aste", 6, 1],
+ ["en", -1, 1],
+ ["anden", 12, 1],
+ ["aren", 12, 1],
+ ["heten", 12, 1],
+ ["ern", -1, 1],
+ ["ar", -1, 1],
+ ["er", -1, 1],
+ ["heter", 18, 1],
+ ["or", -1, 1],
+ ["s", -1, 2],
+ ["as", 21, 1],
+ ["arnas", 22, 1],
+ ["ernas", 22, 1],
+ ["ornas", 22, 1],
+ ["es", 21, 1],
+ ["ades", 26, 1],
+ ["andes", 26, 1],
+ ["ens", 21, 1],
+ ["arens", 29, 1],
+ ["hetens", 29, 1],
+ ["erns", 21, 1],
+ ["at", -1, 1],
+ ["andet", -1, 1],
+ ["het", -1, 1],
+ ["ast", -1, 1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["dd", -1, -1],
+ ["gd", -1, -1],
+ ["nn", -1, -1],
+ ["dt", -1, -1],
+ ["gt", -1, -1],
+ ["kt", -1, -1],
+ ["tt", -1, -1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ig", -1, 1],
+ ["lig", 0, 1],
+ ["els", -1, 1],
+ ["fullt", -1, 3],
+ ["l\u00F6st", -1, 2]
+ ];
+
+ /** @const */ var /** Array<int> */ g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 32];
+
+ /** @const */ var /** Array<int> */ g_s_ending = [119, 127, 149];
+
+ var /** number */ I_x = 0;
+ var /** number */ I_p1 = 0;
+
+
+ /** @return {boolean} */
+ function r_mark_regions() {
+ I_p1 = base.limit;
+ var /** number */ v_1 = base.cursor;
+ {
+ var /** number */ c1 = base.cursor + 3;
+ if (c1 > base.limit)
+ {
+ return false;
+ }
+ base.cursor = c1;
+ }
+ I_x = base.cursor;
+ base.cursor = v_1;
+ golab0: while(true)
+ {
+ var /** number */ v_2 = base.cursor;
+ lab1: {
+ if (!(base.in_grouping(g_v, 97, 246)))
+ {
+ break lab1;
+ }
+ base.cursor = v_2;
+ break golab0;
+ }
+ base.cursor = v_2;
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ golab2: while(true)
+ {
+ lab3: {
+ if (!(base.out_grouping(g_v, 97, 246)))
+ {
+ break lab3;
+ }
+ break golab2;
+ }
+ if (base.cursor >= base.limit)
+ {
+ return false;
+ }
+ base.cursor++;
+ }
+ I_p1 = base.cursor;
+ lab4: {
+ if (!(I_p1 < I_x))
+ {
+ break lab4;
+ }
+ I_p1 = I_x;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_main_suffix() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_0);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ base.limit_backward = v_2;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!(base.in_grouping_b(g_s_ending, 98, 121)))
+ {
+ return false;
+ }
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_consonant_pair() {
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ var /** number */ v_3 = base.limit - base.cursor;
+ if (base.find_among_b(a_1) == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ base.ket = base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.cursor--;
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.limit_backward = v_2;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_other_suffix() {
+ var /** number */ among_var;
+ if (base.cursor < I_p1)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit_backward;
+ base.limit_backward = I_p1;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_2);
+ if (among_var == 0)
+ {
+ base.limit_backward = v_2;
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("l\u00F6s"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("full"))
+ {
+ return false;
+ }
+ break;
+ }
+ base.limit_backward = v_2;
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ var /** number */ v_1 = base.cursor;
+ r_mark_regions();
+ base.cursor = v_1;
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_main_suffix();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_consonant_pair();
+ base.cursor = base.limit - v_3;
+ var /** number */ v_4 = base.limit - base.cursor;
+ r_other_suffix();
+ base.cursor = base.limit - v_4;
+ base.cursor = base.limit_backward;
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/non-minified-js/turkish-stemmer.js b/sphinx/search/non-minified-js/turkish-stemmer.js
new file mode 100644
index 0000000..8ba74b9
--- /dev/null
+++ b/sphinx/search/non-minified-js/turkish-stemmer.js
@@ -0,0 +1,2439 @@
+// Generated by Snowball 2.1.0 - https://snowballstem.org/
+
+/**@constructor*/
+TurkishStemmer = function() {
+ var base = new BaseStemmer();
+ /** @const */ var a_0 = [
+ ["m", -1, -1],
+ ["n", -1, -1],
+ ["miz", -1, -1],
+ ["niz", -1, -1],
+ ["muz", -1, -1],
+ ["nuz", -1, -1],
+ ["m\u00FCz", -1, -1],
+ ["n\u00FCz", -1, -1],
+ ["m\u0131z", -1, -1],
+ ["n\u0131z", -1, -1]
+ ];
+
+ /** @const */ var a_1 = [
+ ["leri", -1, -1],
+ ["lar\u0131", -1, -1]
+ ];
+
+ /** @const */ var a_2 = [
+ ["ni", -1, -1],
+ ["nu", -1, -1],
+ ["n\u00FC", -1, -1],
+ ["n\u0131", -1, -1]
+ ];
+
+ /** @const */ var a_3 = [
+ ["in", -1, -1],
+ ["un", -1, -1],
+ ["\u00FCn", -1, -1],
+ ["\u0131n", -1, -1]
+ ];
+
+ /** @const */ var a_4 = [
+ ["a", -1, -1],
+ ["e", -1, -1]
+ ];
+
+ /** @const */ var a_5 = [
+ ["na", -1, -1],
+ ["ne", -1, -1]
+ ];
+
+ /** @const */ var a_6 = [
+ ["da", -1, -1],
+ ["ta", -1, -1],
+ ["de", -1, -1],
+ ["te", -1, -1]
+ ];
+
+ /** @const */ var a_7 = [
+ ["nda", -1, -1],
+ ["nde", -1, -1]
+ ];
+
+ /** @const */ var a_8 = [
+ ["dan", -1, -1],
+ ["tan", -1, -1],
+ ["den", -1, -1],
+ ["ten", -1, -1]
+ ];
+
+ /** @const */ var a_9 = [
+ ["ndan", -1, -1],
+ ["nden", -1, -1]
+ ];
+
+ /** @const */ var a_10 = [
+ ["la", -1, -1],
+ ["le", -1, -1]
+ ];
+
+ /** @const */ var a_11 = [
+ ["ca", -1, -1],
+ ["ce", -1, -1]
+ ];
+
+ /** @const */ var a_12 = [
+ ["im", -1, -1],
+ ["um", -1, -1],
+ ["\u00FCm", -1, -1],
+ ["\u0131m", -1, -1]
+ ];
+
+ /** @const */ var a_13 = [
+ ["sin", -1, -1],
+ ["sun", -1, -1],
+ ["s\u00FCn", -1, -1],
+ ["s\u0131n", -1, -1]
+ ];
+
+ /** @const */ var a_14 = [
+ ["iz", -1, -1],
+ ["uz", -1, -1],
+ ["\u00FCz", -1, -1],
+ ["\u0131z", -1, -1]
+ ];
+
+ /** @const */ var a_15 = [
+ ["siniz", -1, -1],
+ ["sunuz", -1, -1],
+ ["s\u00FCn\u00FCz", -1, -1],
+ ["s\u0131n\u0131z", -1, -1]
+ ];
+
+ /** @const */ var a_16 = [
+ ["lar", -1, -1],
+ ["ler", -1, -1]
+ ];
+
+ /** @const */ var a_17 = [
+ ["niz", -1, -1],
+ ["nuz", -1, -1],
+ ["n\u00FCz", -1, -1],
+ ["n\u0131z", -1, -1]
+ ];
+
+ /** @const */ var a_18 = [
+ ["dir", -1, -1],
+ ["tir", -1, -1],
+ ["dur", -1, -1],
+ ["tur", -1, -1],
+ ["d\u00FCr", -1, -1],
+ ["t\u00FCr", -1, -1],
+ ["d\u0131r", -1, -1],
+ ["t\u0131r", -1, -1]
+ ];
+
+ /** @const */ var a_19 = [
+ ["cas\u0131na", -1, -1],
+ ["cesine", -1, -1]
+ ];
+
+ /** @const */ var a_20 = [
+ ["di", -1, -1],
+ ["ti", -1, -1],
+ ["dik", -1, -1],
+ ["tik", -1, -1],
+ ["duk", -1, -1],
+ ["tuk", -1, -1],
+ ["d\u00FCk", -1, -1],
+ ["t\u00FCk", -1, -1],
+ ["d\u0131k", -1, -1],
+ ["t\u0131k", -1, -1],
+ ["dim", -1, -1],
+ ["tim", -1, -1],
+ ["dum", -1, -1],
+ ["tum", -1, -1],
+ ["d\u00FCm", -1, -1],
+ ["t\u00FCm", -1, -1],
+ ["d\u0131m", -1, -1],
+ ["t\u0131m", -1, -1],
+ ["din", -1, -1],
+ ["tin", -1, -1],
+ ["dun", -1, -1],
+ ["tun", -1, -1],
+ ["d\u00FCn", -1, -1],
+ ["t\u00FCn", -1, -1],
+ ["d\u0131n", -1, -1],
+ ["t\u0131n", -1, -1],
+ ["du", -1, -1],
+ ["tu", -1, -1],
+ ["d\u00FC", -1, -1],
+ ["t\u00FC", -1, -1],
+ ["d\u0131", -1, -1],
+ ["t\u0131", -1, -1]
+ ];
+
+ /** @const */ var a_21 = [
+ ["sa", -1, -1],
+ ["se", -1, -1],
+ ["sak", -1, -1],
+ ["sek", -1, -1],
+ ["sam", -1, -1],
+ ["sem", -1, -1],
+ ["san", -1, -1],
+ ["sen", -1, -1]
+ ];
+
+ /** @const */ var a_22 = [
+ ["mi\u015F", -1, -1],
+ ["mu\u015F", -1, -1],
+ ["m\u00FC\u015F", -1, -1],
+ ["m\u0131\u015F", -1, -1]
+ ];
+
+ /** @const */ var a_23 = [
+ ["b", -1, 1],
+ ["c", -1, 2],
+ ["d", -1, 3],
+ ["\u011F", -1, 4]
+ ];
+
+ /** @const */ var /** Array<int> */ g_vowel = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 1];
+
+ /** @const */ var /** Array<int> */ g_U = [1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1];
+
+ /** @const */ var /** Array<int> */ g_vowel1 = [1, 64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
+
+ /** @const */ var /** Array<int> */ g_vowel2 = [17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130];
+
+ /** @const */ var /** Array<int> */ g_vowel3 = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
+
+ /** @const */ var /** Array<int> */ g_vowel4 = [17];
+
+ /** @const */ var /** Array<int> */ g_vowel5 = [65];
+
+ /** @const */ var /** Array<int> */ g_vowel6 = [65];
+
+ var /** boolean */ B_continue_stemming_noun_suffixes = false;
+
+
+ /** @return {boolean} */
+ function r_check_vowel_harmony() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ golab0: while(true)
+ {
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ break golab0;
+ }
+ base.cursor = base.limit - v_2;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ }
+ lab2: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab3: {
+ if (!(base.eq_s_b("a")))
+ {
+ break lab3;
+ }
+ golab4: while(true)
+ {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab5: {
+ if (!(base.in_grouping_b(g_vowel1, 97, 305)))
+ {
+ break lab5;
+ }
+ base.cursor = base.limit - v_4;
+ break golab4;
+ }
+ base.cursor = base.limit - v_4;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab3;
+ }
+ base.cursor--;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab6: {
+ if (!(base.eq_s_b("e")))
+ {
+ break lab6;
+ }
+ golab7: while(true)
+ {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab8: {
+ if (!(base.in_grouping_b(g_vowel2, 101, 252)))
+ {
+ break lab8;
+ }
+ base.cursor = base.limit - v_5;
+ break golab7;
+ }
+ base.cursor = base.limit - v_5;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab6;
+ }
+ base.cursor--;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab9: {
+ if (!(base.eq_s_b("\u0131")))
+ {
+ break lab9;
+ }
+ golab10: while(true)
+ {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab11: {
+ if (!(base.in_grouping_b(g_vowel3, 97, 305)))
+ {
+ break lab11;
+ }
+ base.cursor = base.limit - v_6;
+ break golab10;
+ }
+ base.cursor = base.limit - v_6;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab9;
+ }
+ base.cursor--;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab12: {
+ if (!(base.eq_s_b("i")))
+ {
+ break lab12;
+ }
+ golab13: while(true)
+ {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab14: {
+ if (!(base.in_grouping_b(g_vowel4, 101, 105)))
+ {
+ break lab14;
+ }
+ base.cursor = base.limit - v_7;
+ break golab13;
+ }
+ base.cursor = base.limit - v_7;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab12;
+ }
+ base.cursor--;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab15: {
+ if (!(base.eq_s_b("o")))
+ {
+ break lab15;
+ }
+ golab16: while(true)
+ {
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab17: {
+ if (!(base.in_grouping_b(g_vowel5, 111, 117)))
+ {
+ break lab17;
+ }
+ base.cursor = base.limit - v_8;
+ break golab16;
+ }
+ base.cursor = base.limit - v_8;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab15;
+ }
+ base.cursor--;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab18: {
+ if (!(base.eq_s_b("\u00F6")))
+ {
+ break lab18;
+ }
+ golab19: while(true)
+ {
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab20: {
+ if (!(base.in_grouping_b(g_vowel6, 246, 252)))
+ {
+ break lab20;
+ }
+ base.cursor = base.limit - v_9;
+ break golab19;
+ }
+ base.cursor = base.limit - v_9;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab18;
+ }
+ base.cursor--;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab21: {
+ if (!(base.eq_s_b("u")))
+ {
+ break lab21;
+ }
+ golab22: while(true)
+ {
+ var /** number */ v_10 = base.limit - base.cursor;
+ lab23: {
+ if (!(base.in_grouping_b(g_vowel5, 111, 117)))
+ {
+ break lab23;
+ }
+ base.cursor = base.limit - v_10;
+ break golab22;
+ }
+ base.cursor = base.limit - v_10;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab21;
+ }
+ base.cursor--;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ if (!(base.eq_s_b("\u00FC")))
+ {
+ return false;
+ }
+ golab24: while(true)
+ {
+ var /** number */ v_11 = base.limit - base.cursor;
+ lab25: {
+ if (!(base.in_grouping_b(g_vowel6, 246, 252)))
+ {
+ break lab25;
+ }
+ base.cursor = base.limit - v_11;
+ break golab24;
+ }
+ base.cursor = base.limit - v_11;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ }
+ }
+ base.cursor = base.limit - v_1;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_suffix_with_optional_n_consonant() {
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("n")))
+ {
+ break lab1;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ if (!(base.eq_s_b("n")))
+ {
+ break lab2;
+ }
+ base.cursor = base.limit - v_4;
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_5;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_suffix_with_optional_s_consonant() {
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("s")))
+ {
+ break lab1;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ if (!(base.eq_s_b("s")))
+ {
+ break lab2;
+ }
+ base.cursor = base.limit - v_4;
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_5;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_suffix_with_optional_y_consonant() {
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("y")))
+ {
+ break lab1;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ if (!(base.eq_s_b("y")))
+ {
+ break lab2;
+ }
+ base.cursor = base.limit - v_4;
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_5;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_suffix_with_optional_U_vowel() {
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.in_grouping_b(g_U, 105, 305)))
+ {
+ break lab1;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ if (!(base.out_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab1;
+ }
+ base.cursor = base.limit - v_2;
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab2: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ if (!(base.in_grouping_b(g_U, 105, 305)))
+ {
+ break lab2;
+ }
+ base.cursor = base.limit - v_4;
+ return false;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ if (!(base.out_grouping_b(g_vowel, 97, 305)))
+ {
+ return false;
+ }
+ base.cursor = base.limit - v_5;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_possessives() {
+ if (base.find_among_b(a_0) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_U_vowel())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_sU() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (!(base.in_grouping_b(g_U, 105, 305)))
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_s_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_lArI() {
+ if (base.find_among_b(a_1) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_yU() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (!(base.in_grouping_b(g_U, 105, 305)))
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_nU() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_2) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_nUn() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_3) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_n_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_yA() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_4) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_nA() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_5) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_DA() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_6) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_ndA() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_7) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_DAn() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_8) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_ndAn() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_9) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_ylA() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_10) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_ki() {
+ if (!(base.eq_s_b("ki")))
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_ncA() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_11) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_n_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_yUm() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_12) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_sUn() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_13) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_yUz() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_14) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_sUnUz() {
+ if (base.find_among_b(a_15) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_lAr() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_16) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_nUz() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_17) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_DUr() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_18) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_cAsInA() {
+ if (base.find_among_b(a_19) == 0)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_yDU() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_20) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_ysA() {
+ if (base.find_among_b(a_21) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_ymUs_() {
+ if (!r_check_vowel_harmony())
+ {
+ return false;
+ }
+ if (base.find_among_b(a_22) == 0)
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_mark_yken() {
+ if (!(base.eq_s_b("ken")))
+ {
+ return false;
+ }
+ if (!r_mark_suffix_with_optional_y_consonant())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_stem_nominal_verb_suffixes() {
+ base.ket = base.cursor;
+ B_continue_stemming_noun_suffixes = true;
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ lab2: {
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab3: {
+ if (!r_mark_ymUs_())
+ {
+ break lab3;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_2;
+ lab4: {
+ if (!r_mark_yDU())
+ {
+ break lab4;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_2;
+ lab5: {
+ if (!r_mark_ysA())
+ {
+ break lab5;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_2;
+ if (!r_mark_yken())
+ {
+ break lab1;
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab6: {
+ if (!r_mark_cAsInA())
+ {
+ break lab6;
+ }
+ lab7: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab8: {
+ if (!r_mark_sUnUz())
+ {
+ break lab8;
+ }
+ break lab7;
+ }
+ base.cursor = base.limit - v_3;
+ lab9: {
+ if (!r_mark_lAr())
+ {
+ break lab9;
+ }
+ break lab7;
+ }
+ base.cursor = base.limit - v_3;
+ lab10: {
+ if (!r_mark_yUm())
+ {
+ break lab10;
+ }
+ break lab7;
+ }
+ base.cursor = base.limit - v_3;
+ lab11: {
+ if (!r_mark_sUn())
+ {
+ break lab11;
+ }
+ break lab7;
+ }
+ base.cursor = base.limit - v_3;
+ lab12: {
+ if (!r_mark_yUz())
+ {
+ break lab12;
+ }
+ break lab7;
+ }
+ base.cursor = base.limit - v_3;
+ }
+ if (!r_mark_ymUs_())
+ {
+ break lab6;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab13: {
+ if (!r_mark_lAr())
+ {
+ break lab13;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab14: {
+ base.ket = base.cursor;
+ lab15: {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab16: {
+ if (!r_mark_DUr())
+ {
+ break lab16;
+ }
+ break lab15;
+ }
+ base.cursor = base.limit - v_5;
+ lab17: {
+ if (!r_mark_yDU())
+ {
+ break lab17;
+ }
+ break lab15;
+ }
+ base.cursor = base.limit - v_5;
+ lab18: {
+ if (!r_mark_ysA())
+ {
+ break lab18;
+ }
+ break lab15;
+ }
+ base.cursor = base.limit - v_5;
+ if (!r_mark_ymUs_())
+ {
+ base.cursor = base.limit - v_4;
+ break lab14;
+ }
+ }
+ }
+ B_continue_stemming_noun_suffixes = false;
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab19: {
+ if (!r_mark_nUz())
+ {
+ break lab19;
+ }
+ lab20: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab21: {
+ if (!r_mark_yDU())
+ {
+ break lab21;
+ }
+ break lab20;
+ }
+ base.cursor = base.limit - v_6;
+ if (!r_mark_ysA())
+ {
+ break lab19;
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab22: {
+ lab23: {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab24: {
+ if (!r_mark_sUnUz())
+ {
+ break lab24;
+ }
+ break lab23;
+ }
+ base.cursor = base.limit - v_7;
+ lab25: {
+ if (!r_mark_yUz())
+ {
+ break lab25;
+ }
+ break lab23;
+ }
+ base.cursor = base.limit - v_7;
+ lab26: {
+ if (!r_mark_sUn())
+ {
+ break lab26;
+ }
+ break lab23;
+ }
+ base.cursor = base.limit - v_7;
+ if (!r_mark_yUm())
+ {
+ break lab22;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab27: {
+ base.ket = base.cursor;
+ if (!r_mark_ymUs_())
+ {
+ base.cursor = base.limit - v_8;
+ break lab27;
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!r_mark_DUr())
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab28: {
+ base.ket = base.cursor;
+ lab29: {
+ var /** number */ v_10 = base.limit - base.cursor;
+ lab30: {
+ if (!r_mark_sUnUz())
+ {
+ break lab30;
+ }
+ break lab29;
+ }
+ base.cursor = base.limit - v_10;
+ lab31: {
+ if (!r_mark_lAr())
+ {
+ break lab31;
+ }
+ break lab29;
+ }
+ base.cursor = base.limit - v_10;
+ lab32: {
+ if (!r_mark_yUm())
+ {
+ break lab32;
+ }
+ break lab29;
+ }
+ base.cursor = base.limit - v_10;
+ lab33: {
+ if (!r_mark_sUn())
+ {
+ break lab33;
+ }
+ break lab29;
+ }
+ base.cursor = base.limit - v_10;
+ lab34: {
+ if (!r_mark_yUz())
+ {
+ break lab34;
+ }
+ break lab29;
+ }
+ base.cursor = base.limit - v_10;
+ }
+ if (!r_mark_ymUs_())
+ {
+ base.cursor = base.limit - v_9;
+ break lab28;
+ }
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_stem_suffix_chain_before_ki() {
+ base.ket = base.cursor;
+ if (!r_mark_ki())
+ {
+ return false;
+ }
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ if (!r_mark_DA())
+ {
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab2: {
+ base.ket = base.cursor;
+ lab3: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab4: {
+ if (!r_mark_lAr())
+ {
+ break lab4;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab5: {
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_4;
+ break lab5;
+ }
+ }
+ break lab3;
+ }
+ base.cursor = base.limit - v_3;
+ if (!r_mark_possessives())
+ {
+ base.cursor = base.limit - v_2;
+ break lab2;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab6: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_5;
+ break lab6;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_5;
+ break lab6;
+ }
+ }
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab7: {
+ if (!r_mark_nUn())
+ {
+ break lab7;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab8: {
+ base.ket = base.cursor;
+ lab9: {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab10: {
+ if (!r_mark_lArI())
+ {
+ break lab10;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab9;
+ }
+ base.cursor = base.limit - v_7;
+ lab11: {
+ base.ket = base.cursor;
+ lab12: {
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab13: {
+ if (!r_mark_possessives())
+ {
+ break lab13;
+ }
+ break lab12;
+ }
+ base.cursor = base.limit - v_8;
+ if (!r_mark_sU())
+ {
+ break lab11;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab14: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_9;
+ break lab14;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_9;
+ break lab14;
+ }
+ }
+ break lab9;
+ }
+ base.cursor = base.limit - v_7;
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_6;
+ break lab8;
+ }
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ if (!r_mark_ndA())
+ {
+ return false;
+ }
+ lab15: {
+ var /** number */ v_10 = base.limit - base.cursor;
+ lab16: {
+ if (!r_mark_lArI())
+ {
+ break lab16;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab15;
+ }
+ base.cursor = base.limit - v_10;
+ lab17: {
+ if (!r_mark_sU())
+ {
+ break lab17;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_11 = base.limit - base.cursor;
+ lab18: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_11;
+ break lab18;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_11;
+ break lab18;
+ }
+ }
+ break lab15;
+ }
+ base.cursor = base.limit - v_10;
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ return false;
+ }
+ }
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_stem_noun_suffixes() {
+ lab0: {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab1: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ break lab1;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab2: {
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_2;
+ break lab2;
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab3: {
+ base.ket = base.cursor;
+ if (!r_mark_ncA())
+ {
+ break lab3;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab4: {
+ lab5: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ lab6: {
+ base.ket = base.cursor;
+ if (!r_mark_lArI())
+ {
+ break lab6;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab5;
+ }
+ base.cursor = base.limit - v_4;
+ lab7: {
+ base.ket = base.cursor;
+ lab8: {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab9: {
+ if (!r_mark_possessives())
+ {
+ break lab9;
+ }
+ break lab8;
+ }
+ base.cursor = base.limit - v_5;
+ if (!r_mark_sU())
+ {
+ break lab7;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab10: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_6;
+ break lab10;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_6;
+ break lab10;
+ }
+ }
+ break lab5;
+ }
+ base.cursor = base.limit - v_4;
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_3;
+ break lab4;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_3;
+ break lab4;
+ }
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab11: {
+ base.ket = base.cursor;
+ lab12: {
+ var /** number */ v_7 = base.limit - base.cursor;
+ lab13: {
+ if (!r_mark_ndA())
+ {
+ break lab13;
+ }
+ break lab12;
+ }
+ base.cursor = base.limit - v_7;
+ if (!r_mark_nA())
+ {
+ break lab11;
+ }
+ }
+ lab14: {
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab15: {
+ if (!r_mark_lArI())
+ {
+ break lab15;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab14;
+ }
+ base.cursor = base.limit - v_8;
+ lab16: {
+ if (!r_mark_sU())
+ {
+ break lab16;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab17: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_9;
+ break lab17;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_9;
+ break lab17;
+ }
+ }
+ break lab14;
+ }
+ base.cursor = base.limit - v_8;
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ break lab11;
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab18: {
+ base.ket = base.cursor;
+ lab19: {
+ var /** number */ v_10 = base.limit - base.cursor;
+ lab20: {
+ if (!r_mark_ndAn())
+ {
+ break lab20;
+ }
+ break lab19;
+ }
+ base.cursor = base.limit - v_10;
+ if (!r_mark_nU())
+ {
+ break lab18;
+ }
+ }
+ lab21: {
+ var /** number */ v_11 = base.limit - base.cursor;
+ lab22: {
+ if (!r_mark_sU())
+ {
+ break lab22;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_12 = base.limit - base.cursor;
+ lab23: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_12;
+ break lab23;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_12;
+ break lab23;
+ }
+ }
+ break lab21;
+ }
+ base.cursor = base.limit - v_11;
+ if (!r_mark_lArI())
+ {
+ break lab18;
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab24: {
+ base.ket = base.cursor;
+ if (!r_mark_DAn())
+ {
+ break lab24;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_13 = base.limit - base.cursor;
+ lab25: {
+ base.ket = base.cursor;
+ lab26: {
+ var /** number */ v_14 = base.limit - base.cursor;
+ lab27: {
+ if (!r_mark_possessives())
+ {
+ break lab27;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_15 = base.limit - base.cursor;
+ lab28: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_15;
+ break lab28;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_15;
+ break lab28;
+ }
+ }
+ break lab26;
+ }
+ base.cursor = base.limit - v_14;
+ lab29: {
+ if (!r_mark_lAr())
+ {
+ break lab29;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_16 = base.limit - base.cursor;
+ lab30: {
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_16;
+ break lab30;
+ }
+ }
+ break lab26;
+ }
+ base.cursor = base.limit - v_14;
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_13;
+ break lab25;
+ }
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab31: {
+ base.ket = base.cursor;
+ lab32: {
+ var /** number */ v_17 = base.limit - base.cursor;
+ lab33: {
+ if (!r_mark_nUn())
+ {
+ break lab33;
+ }
+ break lab32;
+ }
+ base.cursor = base.limit - v_17;
+ if (!r_mark_ylA())
+ {
+ break lab31;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_18 = base.limit - base.cursor;
+ lab34: {
+ lab35: {
+ var /** number */ v_19 = base.limit - base.cursor;
+ lab36: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ break lab36;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ break lab36;
+ }
+ break lab35;
+ }
+ base.cursor = base.limit - v_19;
+ lab37: {
+ base.ket = base.cursor;
+ lab38: {
+ var /** number */ v_20 = base.limit - base.cursor;
+ lab39: {
+ if (!r_mark_possessives())
+ {
+ break lab39;
+ }
+ break lab38;
+ }
+ base.cursor = base.limit - v_20;
+ if (!r_mark_sU())
+ {
+ break lab37;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_21 = base.limit - base.cursor;
+ lab40: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_21;
+ break lab40;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_21;
+ break lab40;
+ }
+ }
+ break lab35;
+ }
+ base.cursor = base.limit - v_19;
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_18;
+ break lab34;
+ }
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab41: {
+ base.ket = base.cursor;
+ if (!r_mark_lArI())
+ {
+ break lab41;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab42: {
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ break lab42;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ lab43: {
+ base.ket = base.cursor;
+ lab44: {
+ var /** number */ v_22 = base.limit - base.cursor;
+ lab45: {
+ if (!r_mark_DA())
+ {
+ break lab45;
+ }
+ break lab44;
+ }
+ base.cursor = base.limit - v_22;
+ lab46: {
+ if (!r_mark_yU())
+ {
+ break lab46;
+ }
+ break lab44;
+ }
+ base.cursor = base.limit - v_22;
+ if (!r_mark_yA())
+ {
+ break lab43;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_23 = base.limit - base.cursor;
+ lab47: {
+ base.ket = base.cursor;
+ lab48: {
+ var /** number */ v_24 = base.limit - base.cursor;
+ lab49: {
+ if (!r_mark_possessives())
+ {
+ break lab49;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_25 = base.limit - base.cursor;
+ lab50: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_25;
+ break lab50;
+ }
+ }
+ break lab48;
+ }
+ base.cursor = base.limit - v_24;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_23;
+ break lab47;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ base.ket = base.cursor;
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_23;
+ break lab47;
+ }
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_1;
+ base.ket = base.cursor;
+ lab51: {
+ var /** number */ v_26 = base.limit - base.cursor;
+ lab52: {
+ if (!r_mark_possessives())
+ {
+ break lab52;
+ }
+ break lab51;
+ }
+ base.cursor = base.limit - v_26;
+ if (!r_mark_sU())
+ {
+ return false;
+ }
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ var /** number */ v_27 = base.limit - base.cursor;
+ lab53: {
+ base.ket = base.cursor;
+ if (!r_mark_lAr())
+ {
+ base.cursor = base.limit - v_27;
+ break lab53;
+ }
+ base.bra = base.cursor;
+ if (!base.slice_del())
+ {
+ return false;
+ }
+ if (!r_stem_suffix_chain_before_ki())
+ {
+ base.cursor = base.limit - v_27;
+ break lab53;
+ }
+ }
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_post_process_last_consonants() {
+ var /** number */ among_var;
+ base.ket = base.cursor;
+ among_var = base.find_among_b(a_23);
+ if (among_var == 0)
+ {
+ return false;
+ }
+ base.bra = base.cursor;
+ switch (among_var) {
+ case 1:
+ if (!base.slice_from("p"))
+ {
+ return false;
+ }
+ break;
+ case 2:
+ if (!base.slice_from("\u00E7"))
+ {
+ return false;
+ }
+ break;
+ case 3:
+ if (!base.slice_from("t"))
+ {
+ return false;
+ }
+ break;
+ case 4:
+ if (!base.slice_from("k"))
+ {
+ return false;
+ }
+ break;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_append_U_to_stems_ending_with_d_or_g() {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ var /** number */ v_2 = base.limit - base.cursor;
+ lab1: {
+ if (!(base.eq_s_b("d")))
+ {
+ break lab1;
+ }
+ break lab0;
+ }
+ base.cursor = base.limit - v_2;
+ if (!(base.eq_s_b("g")))
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_1;
+ lab2: {
+ var /** number */ v_3 = base.limit - base.cursor;
+ lab3: {
+ var /** number */ v_4 = base.limit - base.cursor;
+ golab4: while(true)
+ {
+ var /** number */ v_5 = base.limit - base.cursor;
+ lab5: {
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab5;
+ }
+ base.cursor = base.limit - v_5;
+ break golab4;
+ }
+ base.cursor = base.limit - v_5;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab3;
+ }
+ base.cursor--;
+ }
+ lab6: {
+ var /** number */ v_6 = base.limit - base.cursor;
+ lab7: {
+ if (!(base.eq_s_b("a")))
+ {
+ break lab7;
+ }
+ break lab6;
+ }
+ base.cursor = base.limit - v_6;
+ if (!(base.eq_s_b("\u0131")))
+ {
+ break lab3;
+ }
+ }
+ base.cursor = base.limit - v_4;
+ {
+ var /** number */ c1 = base.cursor;
+ base.insert(base.cursor, base.cursor, "\u0131");
+ base.cursor = c1;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab8: {
+ var /** number */ v_7 = base.limit - base.cursor;
+ golab9: while(true)
+ {
+ var /** number */ v_8 = base.limit - base.cursor;
+ lab10: {
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab10;
+ }
+ base.cursor = base.limit - v_8;
+ break golab9;
+ }
+ base.cursor = base.limit - v_8;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab8;
+ }
+ base.cursor--;
+ }
+ lab11: {
+ var /** number */ v_9 = base.limit - base.cursor;
+ lab12: {
+ if (!(base.eq_s_b("e")))
+ {
+ break lab12;
+ }
+ break lab11;
+ }
+ base.cursor = base.limit - v_9;
+ if (!(base.eq_s_b("i")))
+ {
+ break lab8;
+ }
+ }
+ base.cursor = base.limit - v_7;
+ {
+ var /** number */ c2 = base.cursor;
+ base.insert(base.cursor, base.cursor, "i");
+ base.cursor = c2;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ lab13: {
+ var /** number */ v_10 = base.limit - base.cursor;
+ golab14: while(true)
+ {
+ var /** number */ v_11 = base.limit - base.cursor;
+ lab15: {
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab15;
+ }
+ base.cursor = base.limit - v_11;
+ break golab14;
+ }
+ base.cursor = base.limit - v_11;
+ if (base.cursor <= base.limit_backward)
+ {
+ break lab13;
+ }
+ base.cursor--;
+ }
+ lab16: {
+ var /** number */ v_12 = base.limit - base.cursor;
+ lab17: {
+ if (!(base.eq_s_b("o")))
+ {
+ break lab17;
+ }
+ break lab16;
+ }
+ base.cursor = base.limit - v_12;
+ if (!(base.eq_s_b("u")))
+ {
+ break lab13;
+ }
+ }
+ base.cursor = base.limit - v_10;
+ {
+ var /** number */ c3 = base.cursor;
+ base.insert(base.cursor, base.cursor, "u");
+ base.cursor = c3;
+ }
+ break lab2;
+ }
+ base.cursor = base.limit - v_3;
+ var /** number */ v_13 = base.limit - base.cursor;
+ golab18: while(true)
+ {
+ var /** number */ v_14 = base.limit - base.cursor;
+ lab19: {
+ if (!(base.in_grouping_b(g_vowel, 97, 305)))
+ {
+ break lab19;
+ }
+ base.cursor = base.limit - v_14;
+ break golab18;
+ }
+ base.cursor = base.limit - v_14;
+ if (base.cursor <= base.limit_backward)
+ {
+ return false;
+ }
+ base.cursor--;
+ }
+ lab20: {
+ var /** number */ v_15 = base.limit - base.cursor;
+ lab21: {
+ if (!(base.eq_s_b("\u00F6")))
+ {
+ break lab21;
+ }
+ break lab20;
+ }
+ base.cursor = base.limit - v_15;
+ if (!(base.eq_s_b("\u00FC")))
+ {
+ return false;
+ }
+ }
+ base.cursor = base.limit - v_13;
+ {
+ var /** number */ c4 = base.cursor;
+ base.insert(base.cursor, base.cursor, "\u00FC");
+ base.cursor = c4;
+ }
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_is_reserved_word() {
+ if (!(base.eq_s_b("ad")))
+ {
+ return false;
+ }
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ if (!(base.eq_s_b("soy")))
+ {
+ base.cursor = base.limit - v_1;
+ break lab0;
+ }
+ }
+ if (base.cursor > base.limit_backward)
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_more_than_one_syllable_word() {
+ var /** number */ v_1 = base.cursor;
+ {
+ var v_2 = 2;
+ while(true)
+ {
+ var /** number */ v_3 = base.cursor;
+ lab0: {
+ golab1: while(true)
+ {
+ lab2: {
+ if (!(base.in_grouping(g_vowel, 97, 305)))
+ {
+ break lab2;
+ }
+ break golab1;
+ }
+ if (base.cursor >= base.limit)
+ {
+ break lab0;
+ }
+ base.cursor++;
+ }
+ v_2--;
+ continue;
+ }
+ base.cursor = v_3;
+ break;
+ }
+ if (v_2 > 0)
+ {
+ return false;
+ }
+ }
+ base.cursor = v_1;
+ return true;
+ };
+
+ /** @return {boolean} */
+ function r_postlude() {
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ {
+ var /** number */ v_1 = base.limit - base.cursor;
+ lab0: {
+ if (!r_is_reserved_word())
+ {
+ break lab0;
+ }
+ return false;
+ }
+ base.cursor = base.limit - v_1;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_append_U_to_stems_ending_with_d_or_g();
+ base.cursor = base.limit - v_2;
+ var /** number */ v_3 = base.limit - base.cursor;
+ r_post_process_last_consonants();
+ base.cursor = base.limit - v_3;
+ base.cursor = base.limit_backward;
+ return true;
+ };
+
+ this.stem = /** @return {boolean} */ function() {
+ if (!r_more_than_one_syllable_word())
+ {
+ return false;
+ }
+ base.limit_backward = base.cursor; base.cursor = base.limit;
+ var /** number */ v_1 = base.limit - base.cursor;
+ r_stem_nominal_verb_suffixes();
+ base.cursor = base.limit - v_1;
+ if (!B_continue_stemming_noun_suffixes)
+ {
+ return false;
+ }
+ var /** number */ v_2 = base.limit - base.cursor;
+ r_stem_noun_suffixes();
+ base.cursor = base.limit - v_2;
+ base.cursor = base.limit_backward;
+ if (!r_postlude())
+ {
+ return false;
+ }
+ return true;
+ };
+
+ /**@return{string}*/
+ this['stemWord'] = function(/**string*/word) {
+ base.setCurrent(word);
+ this.stem();
+ return base.getCurrent();
+ };
+};
diff --git a/sphinx/search/pt.py b/sphinx/search/pt.py
new file mode 100644
index 0000000..908a417
--- /dev/null
+++ b/sphinx/search/pt.py
@@ -0,0 +1,261 @@
+"""Portuguese search language: includes the JS Portuguese stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+portuguese_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/portuguese/stop.txt
+de | of, from
+a | the; to, at; her
+o | the; him
+que | who, that
+e | and
+do | de + o
+da | de + a
+em | in
+um | a
+para | for
+ | é from SER
+com | with
+não | not, no
+uma | a
+os | the; them
+no | em + o
+se | himself etc
+na | em + a
+por | for
+mais | more
+as | the; them
+dos | de + os
+como | as, like
+mas | but
+ | foi from SER
+ao | a + o
+ele | he
+das | de + as
+ | tem from TER
+à | a + a
+seu | his
+sua | her
+ou | or
+ | ser from SER
+quando | when
+muito | much
+ | há from HAV
+nos | em + os; us
+já | already, now
+ | está from EST
+eu | I
+também | also
+só | only, just
+pelo | per + o
+pela | per + a
+até | up to
+isso | that
+ela | he
+entre | between
+ | era from SER
+depois | after
+sem | without
+mesmo | same
+aos | a + os
+ | ter from TER
+seus | his
+quem | whom
+nas | em + as
+me | me
+esse | that
+eles | they
+ | estão from EST
+você | you
+ | tinha from TER
+ | foram from SER
+essa | that
+num | em + um
+nem | nor
+suas | her
+meu | my
+às | a + as
+minha | my
+ | têm from TER
+numa | em + uma
+pelos | per + os
+elas | they
+ | havia from HAV
+ | seja from SER
+qual | which
+ | será from SER
+nós | we
+ | tenho from TER
+lhe | to him, her
+deles | of them
+essas | those
+esses | those
+pelas | per + as
+este | this
+ | fosse from SER
+dele | of him
+
+ | other words. There are many contractions such as naquele = em+aquele,
+ | mo = me+o, but they are rare.
+ | Indefinite article plural forms are also rare.
+
+tu | thou
+te | thee
+vocês | you (plural)
+vos | you
+lhes | to them
+meus | my
+minhas
+teu | thy
+tua
+teus
+tuas
+nosso | our
+nossa
+nossos
+nossas
+
+dela | of her
+delas | of them
+
+esta | this
+estes | these
+estas | these
+aquele | that
+aquela | that
+aqueles | those
+aquelas | those
+isto | this
+aquilo | that
+
+ | forms of estar, to be (not including the infinitive):
+estou
+está
+estamos
+estão
+estive
+esteve
+estivemos
+estiveram
+estava
+estávamos
+estavam
+estivera
+estivéramos
+esteja
+estejamos
+estejam
+estivesse
+estivéssemos
+estivessem
+estiver
+estivermos
+estiverem
+
+ | forms of haver, to have (not including the infinitive):
+hei
+há
+havemos
+hão
+houve
+houvemos
+houveram
+houvera
+houvéramos
+haja
+hajamos
+hajam
+houvesse
+houvéssemos
+houvessem
+houver
+houvermos
+houverem
+houverei
+houverá
+houveremos
+houverão
+houveria
+houveríamos
+houveriam
+
+ | forms of ser, to be (not including the infinitive):
+sou
+somos
+são
+era
+éramos
+eram
+fui
+foi
+fomos
+foram
+fora
+fôramos
+seja
+sejamos
+sejam
+fosse
+fôssemos
+fossem
+for
+formos
+forem
+serei
+será
+seremos
+serão
+seria
+seríamos
+seriam
+
+ | forms of ter, to have (not including the infinitive):
+tenho
+tem
+temos
+tém
+tinha
+tínhamos
+tinham
+tive
+teve
+tivemos
+tiveram
+tivera
+tivéramos
+tenha
+tenhamos
+tenham
+tivesse
+tivéssemos
+tivessem
+tiver
+tivermos
+tiverem
+terei
+terá
+teremos
+terão
+teria
+teríamos
+teriam
+''')
+
+
+class SearchPortuguese(SearchLanguage):
+ lang = 'pt'
+ language_name = 'Portuguese'
+ js_stemmer_rawcode = 'portuguese-stemmer.js'
+ stopwords = portuguese_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('portuguese')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/ro.py b/sphinx/search/ro.py
new file mode 100644
index 0000000..b6c9d67
--- /dev/null
+++ b/sphinx/search/ro.py
@@ -0,0 +1,22 @@
+"""Romanian search language: includes the JS Romanian stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict, Set
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage
+
+
+class SearchRomanian(SearchLanguage):
+ lang = 'ro'
+ language_name = 'Romanian'
+ js_stemmer_rawcode = 'romanian-stemmer.js'
+ stopwords: set[str] = set()
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('romanian')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/ru.py b/sphinx/search/ru.py
new file mode 100644
index 0000000..b8412c1
--- /dev/null
+++ b/sphinx/search/ru.py
@@ -0,0 +1,251 @@
+"""Russian search language: includes the JS Russian stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+russian_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/russian/stop.txt
+и | and
+в | in/into
+во | alternative form
+не | not
+что | what/that
+он | he
+на | on/onto
+Ñ | i
+Ñ | from
+Ñо | alternative form
+как | how
+а | milder form of `no' (but)
+то | conjunction and form of `that'
+вÑе | all
+она | she
+так | so, thus
+его | him
+но | but
+да | yes/and
+Ñ‚Ñ‹ | thou
+к | towards, by
+у | around, chez
+же | intensifier particle
+вы | you
+за | beyond, behind
+бы | conditional/subj. particle
+по | up to, along
+только | only
+ее | her
+мне | to me
+было | it was
+вот | here is/are, particle
+от | away from
+Ð¼ÐµÐ½Ñ | me
+еще | still, yet, more
+нет | no, there isnt/arent
+о | about
+из | out of
+ему | to him
+теперь | now
+когда | when
+даже | even
+ну | so, well
+вдруг | suddenly
+ли | interrogative particle
+еÑли | if
+уже | already, but homonym of `narrower'
+или | or
+ни | neither
+быть | to be
+был | he was
+него | prepositional form of его
+до | up to
+Ð²Ð°Ñ | you accusative
+нибудь | indef. suffix preceded by hyphen
+опÑÑ‚ÑŒ | again
+уж | already, but homonym of `adder'
+вам | to you
+Ñказал | he said
+ведь | particle `after all'
+там | there
+потом | then
+ÑÐµÐ±Ñ | oneself
+ничего | nothing
+ей | to her
+может | usually with `быть' as `maybe'
+они | they
+тут | here
+где | where
+еÑÑ‚ÑŒ | there is/are
+надо | got to, must
+ней | prepositional form of ей
+Ð´Ð»Ñ | for
+мы | we
+Ñ‚ÐµÐ±Ñ | thee
+их | them, their
+чем | than
+была | she was
+Ñам | self
+чтоб | in order to
+без | without
+будто | as if
+человек | man, person, one
+чего | genitive form of `what'
+раз | once
+тоже | also
+Ñебе | to oneself
+под | beneath
+жизнь | life
+будет | will be
+ж | short form of intensifer particle `же'
+тогда | then
+кто | who
+Ñтот | this
+говорил | was saying
+того | genitive form of `that'
+потому | for that reason
+Ñтого | genitive form of `this'
+какой | which
+ÑовÑем | altogether
+ним | prepositional form of `его', `они'
+здеÑÑŒ | here
+Ñтом | prepositional form of `Ñтот'
+один | one
+почти | almost
+мой | my
+тем | instrumental/dative plural of `тот', `то'
+чтобы | full form of `in order that'
+нее | her (acc.)
+кажетÑÑ | it seems
+ÑÐµÐ¹Ñ‡Ð°Ñ | now
+были | they were
+куда | where to
+зачем | why
+Ñказать | to say
+вÑех | all (acc., gen. preposn. plural)
+никогда | never
+ÑÐµÐ³Ð¾Ð´Ð½Ñ | today
+можно | possible, one can
+при | by
+наконец | finally
+два | two
+об | alternative form of `о', about
+другой | another
+хоть | even
+поÑле | after
+над | above
+больше | more
+тот | that one (masc.)
+через | across, in
+Ñти | these
+Ð½Ð°Ñ | us
+про | about
+вÑего | in all, only, of all
+них | prepositional form of `они' (they)
+ÐºÐ°ÐºÐ°Ñ | which, feminine
+много | lots
+разве | interrogative particle
+Ñказала | she said
+три | three
+Ñту | this, acc. fem. sing.
+Ð¼Ð¾Ñ | my, feminine
+впрочем | moreover, besides
+хорошо | good
+Ñвою | ones own, acc. fem. sing.
+Ñтой | oblique form of `Ñта', fem. `this'
+перед | in front of
+иногда | sometimes
+лучше | better
+чуть | a little
+том | preposn. form of `that one'
+Ð½ÐµÐ»ÑŒÐ·Ñ | one must not
+такой | such a one
+им | to them
+более | more
+вÑегда | always
+конечно | of course
+вÑÑŽ | acc. fem. sing of `all'
+между | between
+
+
+ | b: some paradigms
+ |
+ | personal pronouns
+ |
+ | Ñ Ð¼ÐµÐ½Ñ Ð¼Ð½Ðµ мной [мною]
+ | Ñ‚Ñ‹ Ñ‚ÐµÐ±Ñ Ñ‚ÐµÐ±Ðµ тобой [тобою]
+ | он его ему им [него, нему, ним]
+ | она ее Ñи ею [нее, нÑи, нею]
+ | оно его ему им [него, нему, ним]
+ |
+ | мы Ð½Ð°Ñ Ð½Ð°Ð¼ нами
+ | вы Ð²Ð°Ñ Ð²Ð°Ð¼ вами
+ | они их им ими [них, ним, ними]
+ |
+ | ÑÐµÐ±Ñ Ñебе Ñобой [Ñобою]
+ |
+ | demonstrative pronouns: Ñтот (this), тот (that)
+ |
+ | Ñтот Ñта Ñто Ñти
+ | Ñтого ÑÑ‚Ñ‹ Ñто Ñти
+ | Ñтого Ñтой Ñтого Ñтих
+ | Ñтому Ñтой Ñтому Ñтим
+ | Ñтим Ñтой Ñтим [Ñтою] Ñтими
+ | Ñтом Ñтой Ñтом Ñтих
+ |
+ | тот та то те
+ | того ту то те
+ | того той того тех
+ | тому той тому тем
+ | тем той тем [тою] теми
+ | том той том тех
+ |
+ | determinative pronouns
+ |
+ | (a) веÑÑŒ (all)
+ |
+ | веÑÑŒ вÑÑ Ð²Ñе вÑе
+ | вÑего вÑÑŽ вÑе вÑе
+ | вÑего вÑей вÑего вÑех
+ | вÑему вÑей вÑему вÑем
+ | вÑем вÑей вÑем [вÑею] вÑеми
+ | вÑем вÑей вÑем вÑех
+ |
+ | (b) Ñам (himself etc)
+ |
+ | Ñам Ñама Ñамо Ñами
+ | Ñамого Ñаму Ñамо Ñамих
+ | Ñамого Ñамой Ñамого Ñамих
+ | Ñамому Ñамой Ñамому Ñамим
+ | Ñамим Ñамой Ñамим [Ñамою] Ñамими
+ | Ñамом Ñамой Ñамом Ñамих
+ |
+ | stems of verbs `to be', `to have', `to do' and modal
+ |
+ | быть бы буд быв еÑÑ‚ÑŒ Ñуть
+ | име
+ | дел
+ | мог мож мочь
+ | уме
+ | хоч хот
+ | долж
+ | можн
+ | нужн
+ | нельзÑ
+''')
+
+
+class SearchRussian(SearchLanguage):
+ lang = 'ru'
+ language_name = 'Russian'
+ js_stemmer_rawcode = 'russian-stemmer.js'
+ stopwords = russian_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('russian')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/sv.py b/sphinx/search/sv.py
new file mode 100644
index 0000000..88cc560
--- /dev/null
+++ b/sphinx/search/sv.py
@@ -0,0 +1,140 @@
+"""Swedish search language: includes the JS Swedish stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage, parse_stop_word
+
+swedish_stopwords = parse_stop_word('''
+| source: http://snowball.tartarus.org/algorithms/swedish/stop.txt
+och | and
+det | it, this/that
+att | to (with infinitive)
+i | in, at
+en | a
+jag | I
+hon | she
+som | who, that
+han | he
+på | on
+den | it, this/that
+med | with
+var | where, each
+sig | him(self) etc
+för | for
+så | so (also: seed)
+till | to
+är | is
+men | but
+ett | a
+om | if; around, about
+hade | had
+de | they, these/those
+av | of
+icke | not, no
+mig | me
+du | you
+henne | her
+då | then, when
+sin | his
+nu | now
+har | have
+inte | inte någon = no one
+hans | his
+honom | him
+skulle | 'sake'
+hennes | her
+där | there
+min | my
+man | one (pronoun)
+ej | nor
+vid | at, by, on (also: vast)
+kunde | could
+något | some etc
+från | from, off
+ut | out
+när | when
+efter | after, behind
+upp | up
+vi | we
+dem | them
+vara | be
+vad | what
+över | over
+än | than
+dig | you
+kan | can
+sina | his
+här | here
+ha | have
+mot | towards
+alla | all
+under | under (also: wonder)
+någon | some etc
+eller | or (else)
+allt | all
+mycket | much
+sedan | since
+ju | why
+denna | this/that
+själv | myself, yourself etc
+detta | this/that
+Ã¥t | to
+utan | without
+varit | was
+hur | how
+ingen | no
+mitt | my
+ni | you
+bli | to be, become
+blev | from bli
+oss | us
+din | thy
+dessa | these/those
+några | some etc
+deras | their
+blir | from bli
+mina | my
+samma | (the) same
+vilken | who, that
+er | you, your
+sådan | such a
+vår | our
+blivit | from bli
+dess | its
+inom | within
+mellan | between
+sådant | such a
+varför | why
+varje | each
+vilka | who, that
+ditt | thy
+vem | who
+vilket | who, that
+sitta | his
+sådana | such a
+vart | each
+dina | thy
+vars | whose
+vårt | our
+våra | our
+ert | your
+era | your
+vilkas | whose
+''')
+
+
+class SearchSwedish(SearchLanguage):
+ lang = 'sv'
+ language_name = 'Swedish'
+ js_stemmer_rawcode = 'swedish-stemmer.js'
+ stopwords = swedish_stopwords
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('swedish')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/tr.py b/sphinx/search/tr.py
new file mode 100644
index 0000000..f4a865c
--- /dev/null
+++ b/sphinx/search/tr.py
@@ -0,0 +1,22 @@
+"""Turkish search language: includes the JS Turkish stemmer."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Dict, Set
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage
+
+
+class SearchTurkish(SearchLanguage):
+ lang = 'tr'
+ language_name = 'Turkish'
+ js_stemmer_rawcode = 'turkish-stemmer.js'
+ stopwords: set[str] = set()
+
+ def init(self, options: dict) -> None:
+ self.stemmer = snowballstemmer.stemmer('turkish')
+
+ def stem(self, word: str) -> str:
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/search/zh.py b/sphinx/search/zh.py
new file mode 100644
index 0000000..2a3a6e7
--- /dev/null
+++ b/sphinx/search/zh.py
@@ -0,0 +1,262 @@
+"""Chinese search language: includes routine to split words."""
+
+from __future__ import annotations
+
+import os
+import re
+from typing import TYPE_CHECKING, Dict, List
+
+import snowballstemmer
+
+from sphinx.search import SearchLanguage
+
+try:
+ import jieba
+ JIEBA = True
+except ImportError:
+ JIEBA = 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 SearchChinese(SearchLanguage):
+ """
+ Chinese search implementation
+ """
+
+ lang = 'zh'
+ language_name = 'Chinese'
+ js_stemmer_code = js_porter_stemmer
+ stopwords = english_stopwords
+ latin1_letters = re.compile(r'[a-zA-Z0-9_]+')
+ latin_terms: list[str] = []
+
+ def init(self, options: dict) -> None:
+ if JIEBA:
+ dict_path = options.get('dict')
+ if dict_path and os.path.isfile(dict_path):
+ jieba.load_userdict(dict_path)
+
+ self.stemmer = snowballstemmer.stemmer('english')
+
+ def split(self, input: str) -> list[str]:
+ chinese: list[str] = []
+ if JIEBA:
+ chinese = list(jieba.cut_for_search(input))
+
+ latin1 = \
+ [term.strip() for term in self.latin1_letters.findall(input)]
+ self.latin_terms.extend(latin1)
+ return chinese + latin1
+
+ def word_filter(self, stemmed_word: str) -> bool:
+ return len(stemmed_word) > 1
+
+ def stem(self, word: str) -> str:
+ # Don't stem Latin words that are long enough to be relevant for search
+ # if not stemmed, but would be too short after being stemmed
+ # avoids some issues with acronyms
+ should_not_be_stemmed = (
+ word in self.latin_terms and
+ len(word) >= 3 and
+ len(self.stemmer.stemWord(word.lower())) < 3
+ )
+ if should_not_be_stemmed:
+ return word.lower()
+ return self.stemmer.stemWord(word.lower())
diff --git a/sphinx/templates/apidoc/module.rst_t b/sphinx/templates/apidoc/module.rst_t
new file mode 100644
index 0000000..2490278
--- /dev/null
+++ b/sphinx/templates/apidoc/module.rst_t
@@ -0,0 +1,9 @@
+{%- if show_headings %}
+{{- [basename, "module"] | join(' ') | e | heading }}
+
+{% endif -%}
+.. automodule:: {{ qualname }}
+{%- for option in automodule_options %}
+ :{{ option }}:
+{%- endfor %}
+
diff --git a/sphinx/templates/apidoc/package.rst_t b/sphinx/templates/apidoc/package.rst_t
new file mode 100644
index 0000000..2229c31
--- /dev/null
+++ b/sphinx/templates/apidoc/package.rst_t
@@ -0,0 +1,57 @@
+{%- macro automodule(modname, options) -%}
+.. automodule:: {{ modname }}
+{%- for option in options %}
+ :{{ option }}:
+{%- endfor %}
+{%- endmacro %}
+
+{%- macro toctree(docnames) -%}
+.. toctree::
+ :maxdepth: {{ maxdepth }}
+{% for docname in docnames %}
+ {{ docname }}
+{%- endfor %}
+{%- endmacro %}
+
+{%- if is_namespace %}
+{{- [pkgname, "namespace"] | join(" ") | e | heading }}
+{% else %}
+{{- [pkgname, "package"] | join(" ") | e | heading }}
+{% endif %}
+
+{%- if is_namespace %}
+.. py:module:: {{ pkgname }}
+{% endif %}
+
+{%- if modulefirst and not is_namespace %}
+{{ automodule(pkgname, automodule_options) }}
+{% endif %}
+
+{%- if subpackages %}
+Subpackages
+-----------
+
+{{ toctree(subpackages) }}
+{% endif %}
+
+{%- if submodules %}
+Submodules
+----------
+{% if separatemodules %}
+{{ toctree(submodules) }}
+{% else %}
+{%- for submodule in submodules %}
+{% if show_headings %}
+{{- [submodule, "module"] | join(" ") | e | heading(2) }}
+{% endif %}
+{{ automodule(submodule, automodule_options) }}
+{% endfor %}
+{%- endif %}
+{%- endif %}
+
+{%- if not modulefirst and not is_namespace %}
+Module contents
+---------------
+
+{{ automodule(pkgname, automodule_options) }}
+{% endif %}
diff --git a/sphinx/templates/apidoc/toc.rst_t b/sphinx/templates/apidoc/toc.rst_t
new file mode 100644
index 0000000..f0877ee
--- /dev/null
+++ b/sphinx/templates/apidoc/toc.rst_t
@@ -0,0 +1,8 @@
+{{ header | heading }}
+
+.. toctree::
+ :maxdepth: {{ maxdepth }}
+{% for docname in docnames %}
+ {{ docname }}
+{%- endfor %}
+
diff --git a/sphinx/templates/epub3/container.xml b/sphinx/templates/epub3/container.xml
new file mode 100644
index 0000000..326cf15
--- /dev/null
+++ b/sphinx/templates/epub3/container.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
+ <rootfiles>
+ <rootfile full-path="content.opf" media-type="application/oebps-package+xml"/>
+ </rootfiles>
+</container>
diff --git a/sphinx/templates/epub3/content.opf_t b/sphinx/templates/epub3/content.opf_t
new file mode 100644
index 0000000..417888c
--- /dev/null
+++ b/sphinx/templates/epub3/content.opf_t
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://www.idpf.org/2007/opf" version="{{ epub_version }}" xml:lang="{{ lang }}"
+ unique-identifier="{{ uid }}"
+ prefix="ibooks: http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/">
+ <metadata xmlns:opf="http://www.idpf.org/2007/opf"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:language>{{ lang }}</dc:language>
+ <dc:title>{{ title }}</dc:title>
+ <dc:description>{{ description }}</dc:description>
+ <dc:creator>{{ author }}</dc:creator>
+ <dc:contributor>{{ contributor }}</dc:contributor>
+ <dc:publisher>{{ publisher }}</dc:publisher>
+ <dc:rights>{{ copyright }}</dc:rights>
+ {%- if epub_version == 3.1 %}
+ <dc:identifier id="{{ uid }}" opf:scheme="{{ scheme }}">{{ id }}</dc:identifier>
+ {%- else %}
+ <dc:identifier id="{{ uid }}">{{ id }}</dc:identifier>
+ {%- endif %}
+ <dc:date>{{ date }}</dc:date>
+ <meta property="dcterms:modified">{{ date }}</meta>
+ <meta property="ibooks:version">{{ version }}</meta>
+ <meta property="ibooks:specified-fonts">true</meta>
+ <meta property="ibooks:binding">true</meta>
+ <meta property="ibooks:scroll-axis">{{ ibook_scroll_axis }}</meta>
+ {%- if cover %}
+ <meta name="cover" content="{{ cover }}"/>
+ {%- endif %}
+ </metadata>
+ <manifest>
+ <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
+ <item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" properties="nav"/>
+ {%- for item in manifest_items %}
+ <item id="{{ item.id }}" href="{{ item.href }}" media-type="{{ item.media_type }}" />
+ {%- endfor %}
+ </manifest>
+ <spine toc="ncx" page-progression-direction="{{ page_progression_direction }}">
+ {%- for spine in spines %}
+ {%- if spine.linear %}
+ <itemref idref="{{ spine.idref }}" />
+ {%- else %}
+ <itemref idref="{{ spine.idref }}" linear="no" />
+ {%- endif %}
+ {%- endfor %}
+ </spine>
+ <guide>
+ {%- for guide in guides %}
+ <reference type="{{ guide.type }}" title="{{ guide.title }}" href="{{ guide.uri }}" />
+ {%- endfor %}
+ </guide>
+</package>
diff --git a/sphinx/templates/epub3/mimetype b/sphinx/templates/epub3/mimetype
new file mode 100644
index 0000000..57ef03f
--- /dev/null
+++ b/sphinx/templates/epub3/mimetype
@@ -0,0 +1 @@
+application/epub+zip \ No newline at end of file
diff --git a/sphinx/templates/epub3/nav.xhtml_t b/sphinx/templates/epub3/nav.xhtml_t
new file mode 100644
index 0000000..2a32c20
--- /dev/null
+++ b/sphinx/templates/epub3/nav.xhtml_t
@@ -0,0 +1,26 @@
+{%- macro toctree(navlist) -%}
+<ol>
+{%- for nav in navlist %}
+ <li>
+ <a href="{{ nav.refuri }}">{{ nav.text }}</a>
+ {%- if nav.children %}
+{{ toctree(nav.children)|indent(4, true) }}
+ {%- endif %}
+ </li>
+{%- endfor %}
+</ol>
+{%- endmacro -%}
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:epub="http://www.idpf.org/2007/ops" lang="{{ lang }}" xml:lang="{{ lang }}">
+ <head>
+ <title>{{ toc_locale }}</title>
+ </head>
+ <body>
+ <nav epub:type="toc">
+ <h1>{{ toc_locale }}</h1>
+{{ toctree(navlist)|indent(6, true) }}
+ </nav>
+ </body>
+</html>
diff --git a/sphinx/templates/epub3/toc.ncx_t b/sphinx/templates/epub3/toc.ncx_t
new file mode 100644
index 0000000..0ea7ca3
--- /dev/null
+++ b/sphinx/templates/epub3/toc.ncx_t
@@ -0,0 +1,24 @@
+{%- macro navPoints(navlist) %}
+{%- for nav in navlist %}
+<navPoint id="{{ nav.navpoint }}" playOrder="{{ nav.playorder }}">
+ <navLabel>
+ <text>{{ nav.text }}</text>
+ </navLabel>
+ <content src="{{ nav.refuri }}" />{{ navPoints(nav.children)|indent(2, true) }}
+</navPoint>
+{%- endfor %}
+{%- endmacro -%}
+<?xml version="1.0"?>
+<ncx version="2005-1" xmlns="http://www.daisy.org/z3986/2005/ncx/">
+ <head>
+ <meta name="dtb:uid" content="{{ uid }}"/>
+ <meta name="dtb:depth" content="{{ level }}"/>
+ <meta name="dtb:totalPageCount" content="0"/>
+ <meta name="dtb:maxPageNumber" content="0"/>
+ </head>
+ <docTitle>
+ <text>{{ title }}</text>
+ </docTitle>
+ <navMap>{{ navPoints(navpoints)|indent(4, true) }}
+ </navMap>
+</ncx>
diff --git a/sphinx/templates/gettext/message.pot_t b/sphinx/templates/gettext/message.pot_t
new file mode 100644
index 0000000..6138f54
--- /dev/null
+++ b/sphinx/templates/gettext/message.pot_t
@@ -0,0 +1,33 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) {{ copyright }}
+# This file is distributed under the same license as the {{ project }} package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: {{ project|e }} {{ version|e }}\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: {{ ctime|e }}\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: {{ last_translator|e }}\n"
+"Language-Team: {{ language_team|e }}\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+{% for message in messages %}
+{% if display_location -%}
+{% for source, line in message.locations -%}
+#: {{ relpath(source) }}:{{ line }}
+{% endfor -%}
+{% endif -%}
+
+{% if display_uuid -%}
+{% for uuid in message.uuids -%}
+#: {{ uuid }}
+{% endfor -%}
+{% endif -%}
+
+msgid "{{ message.text|e }}"
+msgstr ""
+{% endfor -%}
diff --git a/sphinx/templates/graphviz/graphviz.css b/sphinx/templates/graphviz/graphviz.css
new file mode 100644
index 0000000..8d81c02
--- /dev/null
+++ b/sphinx/templates/graphviz/graphviz.css
@@ -0,0 +1,19 @@
+/*
+ * graphviz.css
+ * ~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- graphviz extension.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+img.graphviz {
+ border: 0;
+ max-width: 100%;
+}
+
+object.graphviz {
+ max-width: 100%;
+}
diff --git a/sphinx/templates/htmlhelp/project.hhc b/sphinx/templates/htmlhelp/project.hhc
new file mode 100644
index 0000000..705cfeb
--- /dev/null
+++ b/sphinx/templates/htmlhelp/project.hhc
@@ -0,0 +1,31 @@
+{%- macro sitemap(name, docname) -%}
+<OBJECT type="text/sitemap">
+ <PARAM name="Name" value="{{ name|e }}" />
+ <PARAM name="Local" value="{{ docname|e }}{{ suffix }}" />
+</OBJECT>
+{%- endmacro -%}
+
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<HTML>
+ <HEAD>
+ <META name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1" />
+ <!-- Sitemap 1.0 -->
+ </HEAD>
+ <BODY>
+ <OBJECT type="text/site properties">
+ <PARAM name="Window Styles" value="0x801227" />
+ <PARAM name="ImageType" value="Folder" />
+ </OBJECT>
+ <UL>
+ <LI>
+ {{ sitemap(short_title, root_doc)|indent(8) }}
+ </LI>
+ {%- for indexname, indexcls, content, collapse in domain_indices %}
+ <LI>
+ {{ sitemap(indexcls.localname, indexname)|indent(8) }}
+ </LI>
+ {%- endfor %}
+ {{ body|indent(6) }}
+ </UL>
+ </BODY>
+</HTML>
diff --git a/sphinx/templates/htmlhelp/project.hhp b/sphinx/templates/htmlhelp/project.hhp
new file mode 100644
index 0000000..17edc1f
--- /dev/null
+++ b/sphinx/templates/htmlhelp/project.hhp
@@ -0,0 +1,21 @@
+[OPTIONS]
+Binary TOC=No
+Binary Index=No
+Compiled file={{ outname }}.chm
+Contents file={{ outname }}.hhc
+Default Window={{ outname }}
+Default topic={{ root_doc }}
+Display compile progress=No
+Full text search stop list file={{ outname }}.stp
+Full-text search=Yes
+Index file={{ outname }}.hhk
+Language={{ "%#x"|format(lcid) }}
+Title={{ title }}
+
+[WINDOWS]
+{{ outname }}="{{ title }}","{{ outname }}.hhc","{{ outname }}.hhk","{{ root_doc }}","{{ root_doc }}",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0
+
+[FILES]
+{%- for filename in files %}
+{{ filename }}
+{%- endfor %}
diff --git a/sphinx/templates/htmlhelp/project.stp b/sphinx/templates/htmlhelp/project.stp
new file mode 100644
index 0000000..bae1f90
--- /dev/null
+++ b/sphinx/templates/htmlhelp/project.stp
@@ -0,0 +1,33 @@
+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
diff --git a/sphinx/templates/imgmath/preview.tex_t b/sphinx/templates/imgmath/preview.tex_t
new file mode 100644
index 0000000..f3fdcda
--- /dev/null
+++ b/sphinx/templates/imgmath/preview.tex_t
@@ -0,0 +1,18 @@
+\documentclass[12pt]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage{amssymb}
+\usepackage{amsfonts}
+\usepackage{anyfontsize}
+\usepackage{bm}
+\pagestyle{empty}
+<%= preamble %>
+
+\usepackage[active<%= tightpage %>]{preview}
+
+\begin{document}
+\begin{preview}
+\fontsize{<%= fontsize %>}{<%= baselineskip %>}\selectfont <%= math %>
+\end{preview}
+\end{document}
diff --git a/sphinx/templates/imgmath/template.tex_t b/sphinx/templates/imgmath/template.tex_t
new file mode 100644
index 0000000..92fa8b0
--- /dev/null
+++ b/sphinx/templates/imgmath/template.tex_t
@@ -0,0 +1,14 @@
+\documentclass[12pt]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage{amssymb}
+\usepackage{amsfonts}
+\usepackage{anyfontsize}
+\usepackage{bm}
+\pagestyle{empty}
+<%= preamble %>
+
+\begin{document}
+\fontsize{<%= fontsize %>}{<%= baselineskip %>}\selectfont <%= math %>
+\end{document}
diff --git a/sphinx/templates/latex/latex.tex_t b/sphinx/templates/latex/latex.tex_t
new file mode 100644
index 0000000..deb0305
--- /dev/null
+++ b/sphinx/templates/latex/latex.tex_t
@@ -0,0 +1,108 @@
+%% Generated by Sphinx.
+\def\sphinxdocclass{<%= docclass %>}
+<% if latex_engine == 'lualatex' -%>
+\IfFileExists{luatex85.sty}
+ {\RequirePackage{luatex85}}
+ {\ifdefined\luatexversion\ifnum\luatexversion>84\relax
+ \PackageError{sphinx}
+ {** With this LuaTeX (\the\luatexversion),Sphinx requires luatex85.sty **}
+ {** Add the LaTeX package luatex85 to your TeX installation, and try again **}
+ \endinput\fi\fi}
+<% endif -%>
+\documentclass[<%= papersize %>,<%= pointsize %><%= classoptions %>]{<%= wrapperclass %>}
+\ifdefined\pdfpxdimen
+ \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
+\fi \sphinxpxdimen=<%= pxunit %>\relax
+\ifdefined\pdfimageresolution
+ \pdfimageresolution= \numexpr \dimexpr1in\relax/\sphinxpxdimen\relax
+\fi
+%% let collapsible pdf bookmarks panel have high depth per default
+\PassOptionsToPackage{bookmarksdepth=5}{hyperref}
+<% if use_xindy -%>
+%% turn off hyperref patch of \index as sphinx.xdy xindy module takes care of
+%% suitable \hyperpage mark-up, working around hyperref-xindy incompatibility
+\PassOptionsToPackage{hyperindex=false}{hyperref}
+%% memoir class requires extra handling
+\makeatletter\@ifclassloaded{memoir}
+{\ifdefined\memhyperindexfalse\memhyperindexfalse\fi}{}\makeatother
+<% endif %>
+<% if booktabs -%>
+\PassOptionsToPackage{booktabs}{sphinx}
+<% endif -%>
+<% if borderless -%>
+\PassOptionsToPackage{borderless}{sphinx}
+<% endif -%>
+<% if colorrows -%>
+\PassOptionsToPackage{colorrows}{sphinx}
+<% endif -%>
+<%= passoptionstopackages %>
+\PassOptionsToPackage{warn}{textcomp}
+<%= inputenc %>
+<%= utf8extra %>
+<%= cmappkg %>
+<%= fontenc %>
+<%= amsmath %>
+<%= multilingual %>
+<%= substitutefont %>
+<%= textcyrillic %>
+<%= fontpkg %>
+<%= fontsubstitution %>
+<%= textgreek %>
+<%= fncychap %>
+\usepackage<%= sphinxpkgoptions %>{sphinx}
+<%= sphinxsetup %>
+<%= fvset %>
+<%= geometry %>
+<%= extrapackages %>
+
+<%- for name, option in packages %>
+<%- if option %>
+\usepackage[<%= option %>]{<%= name %>}
+<%- else %>
+\usepackage{<%= name %>}
+<%- endif %>
+<%- endfor %>
+
+<%= hyperref %>
+<%- for name, option in packages_after_hyperref %>
+<%- if option %>
+\usepackage[<%= option %>]{<%= name %>}
+<%- else %>
+\usepackage{<%= name %>}
+<%- endif %>
+<%- endfor %>
+
+<%= contentsname %>
+\usepackage{sphinxmessages}
+<%= tocdepth %>
+<%= secnumdepth %>
+<%= preamble %>
+
+\title{<%= title %>}
+\date{<%= date %>}
+\release{<%= release | e %>}
+\author{<%= author %>}
+<%- if logofilename %>
+\newcommand{\sphinxlogo}{\sphinxincludegraphics{<%= logofilename %>}\par}
+<%- else %>
+\newcommand{\sphinxlogo}{\vbox{}}
+<%- endif %>
+<%- if releasename or release %>
+\renewcommand{\releasename}{<%= releasename or _('Release') | e %>}
+<%- else %>
+\renewcommand{\releasename}{}
+<%- endif %>
+<%= makeindex %>
+\begin{document}
+<%= shorthandoff %>
+\pagestyle{empty}
+<%= maketitle %>
+\pagestyle{plain}
+<%= tableofcontents %>
+\pagestyle{normal}
+<%= body %>
+<%= atendofbody %>
+<%= indices %>
+\renewcommand{\indexname}{<%= _('Index') | e %>}
+<%= printindex %>
+\end{document}
diff --git a/sphinx/templates/latex/longtable.tex_t b/sphinx/templates/latex/longtable.tex_t
new file mode 100644
index 0000000..83790f4
--- /dev/null
+++ b/sphinx/templates/latex/longtable.tex_t
@@ -0,0 +1,74 @@
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+<% if 'booktabs' in table.styles -%>
+\sphinxthistablewithbooktabsstyle
+<% endif -%>
+<% if 'borderless' in table.styles -%>
+\sphinxthistablewithborderlessstyle
+<% endif -%>
+<% if 'standard' in table.styles -%>
+\sphinxthistablewithstandardstyle
+<% endif -%>
+<% if 'vlines' in table.styles -%>
+\sphinxthistablewithvlinesstyle
+<% endif -%>
+<% if 'novlines' in table.styles -%>
+\sphinxthistablewithnovlinesstyle
+<% endif -%>
+<% if 'colorrows' in table.styles -%>
+\sphinxthistablewithcolorrowsstyle
+<% endif -%>
+<% if 'nocolorrows' in table.styles -%>
+\sphinxthistablewithnocolorrowsstyle
+<% endif -%>
+\makeatletter
+<%- if table.align in ('center', 'default') %>
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+<%- elif table.align == 'left' %>
+ \LTleft \@totalleftmargin
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+<%- elif table.align == 'right' %>
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax
+<%- endif %>
+\makeatother
+\begin{longtable}<%= table.get_colspec() %>
+<%- if table.caption -%>
+\sphinxthelongtablecaptionisattop
+\caption{<%= ''.join(table.caption) %>\strut}<%= labels %>\\*[\sphinxlongtablecapskipadjust]
+<% elif labels -%>
+\noalign{\phantomsection<%= labels %>}%
+<% endif -%>
+\sphinxtoprule
+<%= ''.join(table.header) -%>
+<%- if table.header -%>
+\sphinxmidrule
+<% endif -%>
+\endfirsthead
+
+\multicolumn{<%= table.colcount %>}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} <%= _('continued from previous page') %>}}%
+}\\
+\sphinxtoprule
+<%= ''.join(table.header) -%>
+<%- if table.header -%>
+\sphinxmidrule
+<% endif -%>
+\endhead
+
+\sphinxbottomrule
+\multicolumn{<%= table.colcount %>}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{<%= _('continues on next page') %>}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+<%= ''.join(table.body) -%>
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/sphinx/templates/latex/sphinxmessages.sty_t b/sphinx/templates/latex/sphinxmessages.sty_t
new file mode 100644
index 0000000..ef2750f
--- /dev/null
+++ b/sphinx/templates/latex/sphinxmessages.sty_t
@@ -0,0 +1,21 @@
+%
+% sphinxmessages.sty
+%
+% message resources for Sphinx
+%
+\ProvidesPackage{sphinxmessages}[2019/01/04 v2.0 Localized LaTeX macros (Sphinx team)]
+
+\renewcommand{\literalblockcontinuedname}{<%= _('continued from previous page') | e %>}
+\renewcommand{\literalblockcontinuesname}{<%= _('continues on next page') | e %>}
+\renewcommand{\sphinxnonalphabeticalgroupname}{<%= _('Non-alphabetical') | e %>}
+\renewcommand{\sphinxsymbolsname}{<%= _('Symbols') | e %>}
+\renewcommand{\sphinxnumbersname}{<%= _('Numbers') | e %>}
+\def\pageautorefname{<%= _('page') | e %>}
+
+<%= addtocaptions %>{\renewcommand{\figurename}{<%= figurename[0] | e | eabbr %>}}
+\def\fnum@figure{\figurename\thefigure{}<%= figurename[1] | e %>}
+
+<%= addtocaptions %>{\renewcommand{\tablename}{<%= tablename[0] | e | eabbr %>}}
+\def\fnum@table{\tablename\thetable{}<%= tablename[1] | e %>}
+
+<%= addtocaptions %>{\renewcommand{\literalblockname}{<%= literalblockname[0].strip() %>}}
diff --git a/sphinx/templates/latex/tabular.tex_t b/sphinx/templates/latex/tabular.tex_t
new file mode 100644
index 0000000..0a9310a
--- /dev/null
+++ b/sphinx/templates/latex/tabular.tex_t
@@ -0,0 +1,54 @@
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+<% if 'booktabs' in table.styles -%>
+\sphinxthistablewithbooktabsstyle
+<% endif -%>
+<% if 'borderless' in table.styles -%>
+\sphinxthistablewithborderlessstyle
+<% endif -%>
+<% if 'standard' in table.styles -%>
+\sphinxthistablewithstandardstyle
+<% endif -%>
+<% if 'vlines' in table.styles -%>
+\sphinxthistablewithvlinesstyle
+<% endif -%>
+<% if 'novlines' in table.styles -%>
+\sphinxthistablewithnovlinesstyle
+<% endif -%>
+<% if 'colorrows' in table.styles -%>
+\sphinxthistablewithcolorrowsstyle
+<% endif -%>
+<% if 'nocolorrows' in table.styles -%>
+\sphinxthistablewithnocolorrowsstyle
+<% endif -%>
+<% if table.align -%>
+ <%- if table.align in ('center', 'default') -%>
+ \centering
+ <%- elif table.align == 'left' -%>
+ \raggedright
+ <%- else -%>
+ \raggedleft
+ <%- endif %>
+<%- else -%>
+ \centering
+<%- endif %>
+<% if table.caption -%>
+\sphinxcapstartof{table}
+\sphinxthecaptionisattop
+\sphinxcaption{<%= ''.join(table.caption) %>}<%= labels %>
+\sphinxaftertopcaption
+<% elif labels -%>
+\phantomsection<%= labels %>\nobreak
+<% endif -%>
+\begin{tabular}[t]<%= table.get_colspec() -%>
+\sphinxtoprule
+<%= ''.join(table.header) -%>
+<%- if table.header -%>
+\sphinxmidrule
+<% endif -%>
+\sphinxtableatstartofbodyhook
+<%=- ''.join(table.body) -%>
+\sphinxbottomrule
+\end{tabular}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/sphinx/templates/latex/tabulary.tex_t b/sphinx/templates/latex/tabulary.tex_t
new file mode 100644
index 0000000..6ebcec6
--- /dev/null
+++ b/sphinx/templates/latex/tabulary.tex_t
@@ -0,0 +1,54 @@
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+<% if 'booktabs' in table.styles -%>
+\sphinxthistablewithbooktabsstyle
+<% endif -%>
+<% if 'borderless' in table.styles -%>
+\sphinxthistablewithborderlessstyle
+<% endif -%>
+<% if 'standard' in table.styles -%>
+\sphinxthistablewithstandardstyle
+<% endif -%>
+<% if 'vlines' in table.styles -%>
+\sphinxthistablewithvlinesstyle
+<% endif -%>
+<% if 'novlines' in table.styles -%>
+\sphinxthistablewithnovlinesstyle
+<% endif -%>
+<% if 'colorrows' in table.styles -%>
+\sphinxthistablewithcolorrowsstyle
+<% endif -%>
+<% if 'nocolorrows' in table.styles -%>
+\sphinxthistablewithnocolorrowsstyle
+<% endif -%>
+<% if table.align -%>
+ <%- if table.align in ('center', 'default') -%>
+ \centering
+ <%- elif table.align == 'left' -%>
+ \raggedright
+ <%- else -%>
+ \raggedleft
+ <%- endif %>
+<%- else -%>
+ \centering
+<%- endif %>
+<% if table.caption -%>
+\sphinxcapstartof{table}
+\sphinxthecaptionisattop
+\sphinxcaption{<%= ''.join(table.caption) %>}<%= labels %>
+\sphinxaftertopcaption
+<% elif labels -%>
+\phantomsection<%= labels %>\nobreak
+<% endif -%>
+\begin{tabulary}{\linewidth}[t]<%= table.get_colspec() -%>
+\sphinxtoprule
+<%= ''.join(table.header) -%>
+<%- if table.header -%>
+\sphinxmidrule
+<% endif -%>
+\sphinxtableatstartofbodyhook
+<%=- ''.join(table.body) -%>
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/sphinx/templates/quickstart/Makefile.new_t b/sphinx/templates/quickstart/Makefile.new_t
new file mode 100644
index 0000000..1a52757
--- /dev/null
+++ b/sphinx/templates/quickstart/Makefile.new_t
@@ -0,0 +1,21 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = {{ rsrcdir }}
+BUILDDIR = {{ rbuilddir }}
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
diff --git a/sphinx/templates/quickstart/Makefile_t b/sphinx/templates/quickstart/Makefile_t
new file mode 100644
index 0000000..14b2dc5
--- /dev/null
+++ b/sphinx/templates/quickstart/Makefile_t
@@ -0,0 +1,98 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+PAPER ?=
+SOURCEDIR = {{ rsrcdir }}
+BUILDDIR = {{ rbuilddir }}
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_elements.papersize=a4paper
+PAPEROPT_letter = -D latex_elements.papersize=letterpaper
+# $(O) is meant as a shortcut for $(SPHINXOPTS)
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(O) $(SOURCEDIR)
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(O) $(SOURCEDIR)
+
+.PHONY: help
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and an HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " applehelp to make an Apple Help Book"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files (you can set PAPER=a4 or PAPER=letter)"
+ @echo " latexpdf to make LaTeX files and then PDFs out of them"
+ @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+ @echo " lualatexpdf to make LaTeX files and run them through lualatex"
+ @echo " xelatexpdf to make LaTeX files and run them through xelatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @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 of all changed/added/deprecated items"
+ @echo " xml to make Docutils-native XML files"
+ @echo " pseudoxml to make pseudoxml-XML files for display purposes"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+ @echo " coverage to run coverage check of the documentation (if enabled)"
+ @echo " dummy to check syntax errors of document sources"
+ @echo " clean to remove everything in the build directory"
+
+.PHONY: clean
+clean:
+ rm -rf $(BUILDDIR)
+
+.PHONY: latexpdf
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: latexpdfja
+latexpdfja:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through platex and dvipdfmx..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: lualatexpdf
+lualatexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through lualatex..."
+ $(MAKE) PDFLATEX=lualatex -C $(BUILDDIR)/latex all-pdf
+ @echo "lualatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: xelatexpdf
+xelatexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through xelatex..."
+ $(MAKE) PDFLATEX=xelatex -C $(BUILDDIR)/latex all-pdf
+ @echo "xelatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: info
+info:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+ @echo "Running Texinfo files through makeinfo..."
+ make -C $(BUILDDIR)/texinfo info
+ @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+.PHONY: gettext
+gettext:
+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+
+# Catch-all target: route all unknown targets to Sphinx
+.PHONY: Makefile
+%: Makefile
+ $(SPHINXBUILD) -b "$@" $(ALLSPHINXOPTS) "$(BUILDDIR)/$@"
+
diff --git a/sphinx/templates/quickstart/conf.py_t b/sphinx/templates/quickstart/conf.py_t
new file mode 100644
index 0000000..3836486
--- /dev/null
+++ b/sphinx/templates/quickstart/conf.py_t
@@ -0,0 +1,71 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+{% if append_syspath -%}
+# -- Path setup --------------------------------------------------------------
+
+import os
+import sys
+sys.path.insert(0, {{ module_path | repr }})
+
+{% endif -%}
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = {{ project | repr }}
+copyright = {{ copyright | repr }}
+author = {{ author | repr }}
+
+{%- if version %}
+
+version = {{ version | repr }}
+{%- endif %}
+{%- if release %}
+release = {{ release | repr }}
+{%- endif %}
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [{% if extensions %}
+{%- for ext in extensions %}
+ '{{ ext }}',
+{%- endfor %}
+{% endif %}]
+
+templates_path = ['{{ dot }}templates']
+exclude_patterns = [{{ exclude_patterns }}]
+
+{% if suffix != '.rst' -%}
+source_suffix = {{ suffix | repr }}
+{% endif -%}
+
+{% if root_doc != 'index' -%}
+root_doc = {{ root_doc | repr }}
+{% endif -%}
+
+{% if language -%}
+language = {{ language | repr }}
+{%- endif %}
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = 'alabaster'
+html_static_path = ['{{ dot }}static']
+{% if 'sphinx.ext.intersphinx' in extensions %}
+# -- Options for intersphinx extension ---------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html#configuration
+
+intersphinx_mapping = {
+ 'python': ('https://docs.python.org/3', None),
+}
+{% endif -%}
+{% if 'sphinx.ext.todo' in extensions %}
+# -- Options for todo extension ----------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/extensions/todo.html#configuration
+
+todo_include_todos = True
+{% endif %}
diff --git a/sphinx/templates/quickstart/make.bat.new_t b/sphinx/templates/quickstart/make.bat.new_t
new file mode 100644
index 0000000..c89237b
--- /dev/null
+++ b/sphinx/templates/quickstart/make.bat.new_t
@@ -0,0 +1,36 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR={{ rsrcdir }}
+set BUILDDIR={{ rbuilddir }}
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
+
diff --git a/sphinx/templates/quickstart/make.bat_t b/sphinx/templates/quickstart/make.bat_t
new file mode 100644
index 0000000..dfc619a
--- /dev/null
+++ b/sphinx/templates/quickstart/make.bat_t
@@ -0,0 +1,110 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+pushd %~dp0
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR={{ rbuilddir }}
+set SOURCEDIR={{ rsrcdir }}
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% %O% %SOURCEDIR%
+set I18NSPHINXOPTS=%SPHINXOPTS% %SOURCEDIR%
+if NOT "%PAPER%" == "" (
+ set ALLSPHINXOPTS=-D latex_elements.papersize=%PAPER%paper %ALLSPHINXOPTS%
+ set I18NSPHINXOPTS=-D latex_elements.papersize=%PAPER%paper %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+ :help
+ echo.Please use `make ^<target^>` where ^<target^> is one of
+ echo. html to make standalone HTML files
+ echo. dirhtml to make HTML files named index.html in directories
+ echo. singlehtml to make a single large HTML file
+ echo. pickle to make pickle files
+ echo. json to make JSON files
+ echo. htmlhelp to make HTML files and an HTML help project
+ echo. qthelp to make HTML files and a Qt help project
+ echo. devhelp to make HTML files and a Devhelp project
+ echo. epub to make an EPUB
+ echo. latex to make LaTeX files (you can set PAPER=a4 or PAPER=letter)
+ echo. latexpdf to make LaTeX files and then PDFs out of them
+ echo. text to make text files
+ echo. man to make manual pages
+ echo. texinfo to make Texinfo files
+ echo. gettext to make PO message catalogs
+ echo. changes to make an overview over all changed/added/deprecated items
+ echo. xml to make Docutils-native XML files
+ echo. pseudoxml to make pseudoxml-XML files for display purposes
+ echo. linkcheck to check all external links for integrity
+ echo. doctest to run all doctests embedded in the documentation if enabled
+ echo. coverage to run coverage check of the documentation if enabled
+ echo. dummy to check syntax errors of document sources
+ echo. clean to remove everything in the build directory
+ goto end
+)
+
+if "%1" == "clean" (
+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+ del /q /s %BUILDDIR%\*
+ goto end
+)
+
+REM Check if sphinx-build is available and fallback to Python version if any
+%SPHINXBUILD% 1>NUL 2>NUL
+if errorlevel 9009 goto sphinx_python
+goto sphinx_ok
+
+:sphinx_python
+
+set SPHINXBUILD=python -m sphinx.__init__
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+:sphinx_ok
+
+if "%1" == "latexpdf" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf
+ cd %~dp0
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "latexpdfja" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf-ja
+ cd %~dp0
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "gettext" (
+ %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+ if errorlevel 1 exit /b 1
+ goto end
+)
+
+%SPHINXBUILD% -b %1 %ALLSPHINXOPTS% %BUILDDIR%/%1
+goto end
+
+:end
+popd
+
diff --git a/sphinx/templates/quickstart/root_doc.rst_t b/sphinx/templates/quickstart/root_doc.rst_t
new file mode 100644
index 0000000..3aa98af
--- /dev/null
+++ b/sphinx/templates/quickstart/root_doc.rst_t
@@ -0,0 +1,21 @@
+.. {{ project }} documentation master file, created by
+ sphinx-quickstart on {{ now }}.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to {{ project }}'s documentation!
+==========={{ project_underline }}=================
+
+.. toctree::
+ :maxdepth: {{ mastertocmaxdepth }}
+ :caption: Contents:
+
+{{ mastertoctree }}
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/sphinx/templates/texinfo/Makefile b/sphinx/templates/texinfo/Makefile
new file mode 100644
index 0000000..e3b732c
--- /dev/null
+++ b/sphinx/templates/texinfo/Makefile
@@ -0,0 +1,57 @@
+# 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
+ for f in *.info; do \
+ mkdir -p $(infodir) && \
+ cp "$$f" $(infodir) && \
+ $(INSTALL_INFO) --info-dir=$(infodir) "$$f" && \
+ \
+ FIGURE_DIR="`basename \"$$f\" .info`-figures" && \
+ if [ -e "$$FIGURE_DIR" ]; then \
+ cp -r "$$FIGURE_DIR" $(infodir) ; \
+ fi; \
+ done
+
+uninstall-info: info
+ for f in *.info; do \
+ rm -f "$(infodir)/$$f" ; \
+ rm -rf "$(infodir)/`basename '$$f' .info`-figures" && \
+ $(INSTALL_INFO) --delete --info-dir=$(infodir) "$$f" ; \
+ done
+
+%.info: %.texi
+ $(MAKEINFO) -o '$@' '$<'
+
+%.txt: %.texi
+ $(MAKEINFO_plaintext) -o '$@' '$<'
+
+%.html: %.texi
+ $(MAKEINFO_html) -o '$@' '$<'
+
+%.pdf: %.texi
+ -$(TEXI2PDF) '$<'
+ -$(TEXI2PDF) '$<'
+ -$(TEXI2PDF) '$<'
+
+clean:
+ rm -f *.info *.pdf *.txt *.html
+ rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ky *.pg
+ rm -f *.vr *.tp *.fn *.fns *.def *.defs *.cp *.cps *.ge *.ges *.mo
+
+.PHONY: all info plaintext html pdf install-info uninstall-info clean
diff --git a/sphinx/testing/__init__.py b/sphinx/testing/__init__.py
new file mode 100644
index 0000000..1cf074f
--- /dev/null
+++ b/sphinx/testing/__init__.py
@@ -0,0 +1,7 @@
+"""Sphinx test utilities
+
+You can require sphinx.testing pytest fixtures in a test module or a conftest
+file like this:
+
+ pytest_plugins = 'sphinx.testing.fixtures'
+"""
diff --git a/sphinx/testing/fixtures.py b/sphinx/testing/fixtures.py
new file mode 100644
index 0000000..0cc4882
--- /dev/null
+++ b/sphinx/testing/fixtures.py
@@ -0,0 +1,243 @@
+"""Sphinx test fixtures for pytest"""
+
+from __future__ import annotations
+
+import shutil
+import subprocess
+import sys
+from collections import namedtuple
+from io import StringIO
+from typing import TYPE_CHECKING, Any, Callable
+
+import pytest
+
+from sphinx.testing.util import SphinxTestApp, SphinxTestAppWrapperForSkipBuilding
+
+if TYPE_CHECKING:
+ from collections.abc import Generator
+ from pathlib import Path
+
+DEFAULT_ENABLED_MARKERS = [
+ (
+ 'sphinx(builder, testroot=None, freshenv=False, confoverrides=None, tags=None,'
+ ' docutilsconf=None, parallel=0): arguments to initialize the sphinx test application.'
+ ),
+ 'test_params(shared_result=...): test parameters.',
+]
+
+
+def pytest_configure(config):
+ """Register custom markers"""
+ for marker in DEFAULT_ENABLED_MARKERS:
+ config.addinivalue_line('markers', marker)
+
+
+@pytest.fixture(scope='session')
+def rootdir() -> str | None:
+ return None
+
+
+class SharedResult:
+ cache: dict[str, dict[str, str]] = {}
+
+ def store(self, key: str, app_: SphinxTestApp) -> Any:
+ if key in self.cache:
+ return
+ data = {
+ 'status': app_._status.getvalue(),
+ 'warning': app_._warning.getvalue(),
+ }
+ self.cache[key] = data
+
+ def restore(self, key: str) -> dict[str, StringIO]:
+ if key not in self.cache:
+ return {}
+ data = self.cache[key]
+ return {
+ 'status': StringIO(data['status']),
+ 'warning': StringIO(data['warning']),
+ }
+
+
+@pytest.fixture()
+def app_params(request: Any, test_params: dict, shared_result: SharedResult,
+ sphinx_test_tempdir: str, rootdir: str) -> _app_params:
+ """
+ Parameters that are specified by 'pytest.mark.sphinx' for
+ sphinx.application.Sphinx initialization
+ """
+
+ # ##### process pytest.mark.sphinx
+
+ pargs = {}
+ kwargs: dict[str, Any] = {}
+
+ # to avoid stacking positional args
+ for info in reversed(list(request.node.iter_markers("sphinx"))):
+ for i, a in enumerate(info.args):
+ pargs[i] = a
+ kwargs.update(info.kwargs)
+
+ args = [pargs[i] for i in sorted(pargs.keys())]
+
+ # ##### process pytest.mark.test_params
+ if test_params['shared_result']:
+ if 'srcdir' in kwargs:
+ msg = 'You can not specify shared_result and srcdir in same time.'
+ raise pytest.Exception(msg)
+ kwargs['srcdir'] = test_params['shared_result']
+ restore = shared_result.restore(test_params['shared_result'])
+ kwargs.update(restore)
+
+ # ##### prepare Application params
+
+ testroot = kwargs.pop('testroot', 'root')
+ kwargs['srcdir'] = srcdir = sphinx_test_tempdir / kwargs.get('srcdir', testroot)
+
+ # special support for sphinx/tests
+ if rootdir and not srcdir.exists():
+ testroot_path = rootdir / ('test-' + testroot)
+ shutil.copytree(testroot_path, srcdir)
+
+ return _app_params(args, kwargs)
+
+
+_app_params = namedtuple('_app_params', 'args,kwargs')
+
+
+@pytest.fixture()
+def test_params(request: Any) -> dict:
+ """
+ Test parameters that are specified by 'pytest.mark.test_params'
+
+ :param Union[str] shared_result:
+ If the value is provided, app._status and app._warning objects will be
+ shared in the parametrized test functions and/or test functions that
+ have same 'shared_result' value.
+ **NOTE**: You can not specify both shared_result and srcdir.
+ """
+ env = request.node.get_closest_marker('test_params')
+ kwargs = env.kwargs if env else {}
+ result = {
+ 'shared_result': None,
+ }
+ result.update(kwargs)
+
+ if result['shared_result'] and not isinstance(result['shared_result'], str):
+ msg = 'You can only provide a string type of value for "shared_result"'
+ raise pytest.Exception(msg)
+ return result
+
+
+@pytest.fixture()
+def app(test_params: dict, app_params: tuple[dict, dict], make_app: Callable,
+ shared_result: SharedResult) -> Generator[SphinxTestApp, None, None]:
+ """
+ Provides the 'sphinx.application.Sphinx' object
+ """
+ args, kwargs = app_params
+ app_ = make_app(*args, **kwargs)
+ yield app_
+
+ print('# testroot:', kwargs.get('testroot', 'root'))
+ print('# builder:', app_.builder.name)
+ print('# srcdir:', app_.srcdir)
+ print('# outdir:', app_.outdir)
+ print('# status:', '\n' + app_._status.getvalue())
+ print('# warning:', '\n' + app_._warning.getvalue())
+
+ if test_params['shared_result']:
+ shared_result.store(test_params['shared_result'], app_)
+
+
+@pytest.fixture()
+def status(app: SphinxTestApp) -> StringIO:
+ """
+ Back-compatibility for testing with previous @with_app decorator
+ """
+ return app._status
+
+
+@pytest.fixture()
+def warning(app: SphinxTestApp) -> StringIO:
+ """
+ Back-compatibility for testing with previous @with_app decorator
+ """
+ return app._warning
+
+
+@pytest.fixture()
+def make_app(test_params: dict, monkeypatch: Any) -> Generator[Callable, None, None]:
+ """
+ Provides make_app function to initialize SphinxTestApp instance.
+ if you want to initialize 'app' in your test function. please use this
+ instead of using SphinxTestApp class directory.
+ """
+ apps = []
+ syspath = sys.path[:]
+
+ def make(*args, **kwargs):
+ status, warning = StringIO(), StringIO()
+ kwargs.setdefault('status', status)
+ kwargs.setdefault('warning', warning)
+ app_: Any = SphinxTestApp(*args, **kwargs)
+ apps.append(app_)
+ if test_params['shared_result']:
+ app_ = SphinxTestAppWrapperForSkipBuilding(app_)
+ return app_
+ yield make
+
+ sys.path[:] = syspath
+ for app_ in reversed(apps): # clean up applications from the new ones
+ app_.cleanup()
+
+
+@pytest.fixture()
+def shared_result() -> SharedResult:
+ return SharedResult()
+
+
+@pytest.fixture(scope='module', autouse=True)
+def _shared_result_cache() -> None:
+ SharedResult.cache.clear()
+
+
+@pytest.fixture()
+def if_graphviz_found(app: SphinxTestApp) -> None: # NoQA: PT004
+ """
+ The test will be skipped when using 'if_graphviz_found' fixture and graphviz
+ dot command is not found.
+ """
+ graphviz_dot = getattr(app.config, 'graphviz_dot', '')
+ try:
+ if graphviz_dot:
+ subprocess.run([graphviz_dot, '-V'], capture_output=True) # show version
+ return
+ except OSError: # No such file or directory
+ pass
+
+ pytest.skip('graphviz "dot" is not available')
+
+
+@pytest.fixture(scope='session')
+def sphinx_test_tempdir(tmp_path_factory: Any) -> Path:
+ """Temporary directory."""
+ return tmp_path_factory.getbasetemp()
+
+
+@pytest.fixture()
+def rollback_sysmodules(): # NoQA: PT004
+ """
+ Rollback sys.modules to its value before testing to unload modules
+ during tests.
+
+ For example, used in test_ext_autosummary.py to permit unloading the
+ target module to clear its cache.
+ """
+ try:
+ sysmodules = list(sys.modules)
+ yield
+ finally:
+ for modname in list(sys.modules):
+ if modname not in sysmodules:
+ sys.modules.pop(modname)
diff --git a/sphinx/testing/path.py b/sphinx/testing/path.py
new file mode 100644
index 0000000..f4069ba
--- /dev/null
+++ b/sphinx/testing/path.py
@@ -0,0 +1,221 @@
+from __future__ import annotations
+
+import os
+import shutil
+import sys
+import warnings
+from typing import IO, TYPE_CHECKING, Any, Callable
+
+from sphinx.deprecation import RemovedInSphinx90Warning
+
+if TYPE_CHECKING:
+ import builtins
+
+warnings.warn("'sphinx.testing.path' is deprecated. "
+ "Use 'os.path' or 'pathlib' instead.",
+ RemovedInSphinx90Warning, stacklevel=2)
+
+FILESYSTEMENCODING = sys.getfilesystemencoding() or sys.getdefaultencoding()
+
+
+def getumask() -> int:
+ """Get current umask value"""
+ umask = os.umask(0) # Note: Change umask value temporarily to obtain it
+ os.umask(umask)
+
+ return umask
+
+
+UMASK = getumask()
+
+
+class path(str):
+ """
+ Represents a path which behaves like a string.
+ """
+
+ __slots__ = ()
+
+ @property
+ def parent(self) -> path:
+ """
+ The name of the directory the file or directory is in.
+ """
+ return self.__class__(os.path.dirname(self))
+
+ def basename(self) -> str:
+ return os.path.basename(self)
+
+ def abspath(self) -> path:
+ """
+ Returns the absolute path.
+ """
+ return self.__class__(os.path.abspath(self))
+
+ def isabs(self) -> bool:
+ """
+ Returns ``True`` if the path is absolute.
+ """
+ return os.path.isabs(self)
+
+ def isdir(self) -> bool:
+ """
+ Returns ``True`` if the path is a directory.
+ """
+ return os.path.isdir(self)
+
+ def isfile(self) -> bool:
+ """
+ Returns ``True`` if the path is a file.
+ """
+ return os.path.isfile(self)
+
+ def islink(self) -> bool:
+ """
+ Returns ``True`` if the path is a symbolic link.
+ """
+ return os.path.islink(self)
+
+ def ismount(self) -> bool:
+ """
+ Returns ``True`` if the path is a mount point.
+ """
+ return os.path.ismount(self)
+
+ def rmtree(self, ignore_errors: bool = False, onerror: Callable | None = None) -> None:
+ """
+ Removes the file or directory and any files or directories it may
+ contain.
+
+ :param ignore_errors:
+ If ``True`` errors are silently ignored, otherwise an exception
+ is raised in case an error occurs.
+
+ :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)
+
+ def copytree(self, destination: str, symlinks: bool = False) -> None:
+ """
+ Recursively copy a directory to the given `destination`. If the given
+ `destination` does not exist it will be created.
+
+ :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)
+ if os.environ.get('SPHINX_READONLY_TESTDIR'):
+ # If source tree is marked read-only (e.g. because it is on a read-only
+ # filesystem), `shutil.copytree` will mark the destination as read-only
+ # as well. To avoid failures when adding additional files/directories
+ # to the destination tree, ensure destination directories are not marked
+ # read-only.
+ for root, _dirs, files in os.walk(destination):
+ os.chmod(root, 0o755 & ~UMASK)
+ for name in files:
+ os.chmod(os.path.join(root, name), 0o644 & ~UMASK)
+
+ def movetree(self, destination: str) -> None:
+ """
+ Recursively move the file or directory to the given `destination`
+ similar to the Unix "mv" command.
+
+ If the `destination` is a file it may be overwritten depending on the
+ :func:`os.rename` semantics.
+ """
+ shutil.move(self, destination)
+
+ move = movetree
+
+ def unlink(self) -> None:
+ """
+ Removes a file.
+ """
+ os.unlink(self)
+
+ def stat(self) -> Any:
+ """
+ Returns a stat of the file.
+ """
+ return os.stat(self)
+
+ def utime(self, arg: Any) -> None:
+ os.utime(self, arg)
+
+ def open(self, mode: str = 'r', **kwargs: Any) -> IO:
+ return open(self, mode, **kwargs)
+
+ def write_text(self, text: str, encoding: str = 'utf-8', **kwargs: Any) -> None:
+ """
+ Writes the given `text` to the file.
+ """
+ with open(self, 'w', encoding=encoding, **kwargs) as f:
+ f.write(text)
+
+ def read_text(self, encoding: str = 'utf-8', **kwargs: Any) -> str:
+ """
+ Returns the text in the file.
+ """
+ with open(self, encoding=encoding, **kwargs) as f:
+ return f.read()
+
+ def read_bytes(self) -> builtins.bytes:
+ """
+ Returns the bytes in the file.
+ """
+ with open(self, mode='rb') as f:
+ return f.read()
+
+ def write_bytes(self, bytes: str, append: bool = False) -> None:
+ """
+ Writes the given `bytes` to the file.
+
+ :param append:
+ If ``True`` given `bytes` are added at the end of the file.
+ """
+ if append:
+ mode = 'ab'
+ else:
+ mode = 'wb'
+ with open(self, mode=mode) as f:
+ f.write(bytes)
+
+ def exists(self) -> bool:
+ """
+ Returns ``True`` if the path exist.
+ """
+ return os.path.exists(self)
+
+ def lexists(self) -> bool:
+ """
+ Returns ``True`` if the path exists unless it is a broken symbolic
+ link.
+ """
+ return os.path.lexists(self)
+
+ def makedirs(self, mode: int = 0o777, exist_ok: bool = False) -> None:
+ """
+ Recursively create directories.
+ """
+ os.makedirs(self, mode, exist_ok=exist_ok)
+
+ def joinpath(self, *args: Any) -> path:
+ """
+ Joins the path with the argument given and returns the result.
+ """
+ return self.__class__(os.path.join(self, *map(self.__class__, args)))
+
+ def listdir(self) -> list[str]:
+ return os.listdir(self)
+
+ __div__ = __truediv__ = joinpath
+
+ def __repr__(self) -> str:
+ return f'{self.__class__.__name__}({super().__repr__()})'
diff --git a/sphinx/testing/restructuredtext.py b/sphinx/testing/restructuredtext.py
new file mode 100644
index 0000000..1f89336
--- /dev/null
+++ b/sphinx/testing/restructuredtext.py
@@ -0,0 +1,35 @@
+from os import path
+
+from docutils import nodes
+from docutils.core import publish_doctree
+
+from sphinx.application import Sphinx
+from sphinx.io import SphinxStandaloneReader
+from sphinx.parsers import RSTParser
+from sphinx.util.docutils import sphinx_domains
+
+
+def parse(app: Sphinx, text: str, docname: str = 'index') -> nodes.document:
+ """Parse a string as reStructuredText with Sphinx application."""
+ try:
+ app.env.temp_data['docname'] = docname
+ reader = SphinxStandaloneReader()
+ reader.setup(app)
+ parser = RSTParser()
+ parser.set_application(app)
+ with sphinx_domains(app.env):
+ return publish_doctree(
+ text,
+ path.join(app.srcdir, docname + '.rst'),
+ reader=reader,
+ parser=parser,
+ settings_overrides={
+ 'env': app.env,
+ 'gettext_compact': True,
+ 'input_encoding': 'utf-8',
+ 'output_encoding': 'unicode',
+ 'traceback': True,
+ },
+ )
+ finally:
+ app.env.temp_data.pop('docname', None)
diff --git a/sphinx/testing/util.py b/sphinx/testing/util.py
new file mode 100644
index 0000000..e76d401
--- /dev/null
+++ b/sphinx/testing/util.py
@@ -0,0 +1,171 @@
+"""Sphinx test suite utilities"""
+from __future__ import annotations
+
+import contextlib
+import os
+import re
+import sys
+import warnings
+from typing import IO, TYPE_CHECKING, Any
+from xml.etree import ElementTree
+
+from docutils import nodes
+from docutils.parsers.rst import directives, roles
+
+from sphinx import application, locale
+from sphinx.pycode import ModuleAnalyzer
+
+if TYPE_CHECKING:
+ from io import StringIO
+ from pathlib import Path
+
+ from docutils.nodes import Node
+
+__all__ = 'SphinxTestApp', 'SphinxTestAppWrapperForSkipBuilding'
+
+
+def assert_node(node: Node, cls: Any = None, xpath: str = "", **kwargs: Any) -> None:
+ if cls:
+ if isinstance(cls, list):
+ assert_node(node, cls[0], xpath=xpath, **kwargs)
+ if cls[1:]:
+ if isinstance(cls[1], tuple):
+ assert_node(node, cls[1], xpath=xpath, **kwargs)
+ else:
+ assert isinstance(node, nodes.Element), \
+ 'The node%s does not have any children' % xpath
+ assert len(node) == 1, \
+ 'The node%s has %d child nodes, not one' % (xpath, len(node))
+ assert_node(node[0], cls[1:], xpath=xpath + "[0]", **kwargs)
+ elif isinstance(cls, tuple):
+ assert isinstance(node, (list, nodes.Element)), \
+ 'The node%s does not have any items' % xpath
+ assert len(node) == len(cls), \
+ 'The node%s has %d child nodes, not %r' % (xpath, len(node), len(cls))
+ for i, nodecls in enumerate(cls):
+ path = xpath + "[%d]" % i
+ assert_node(node[i], nodecls, xpath=path, **kwargs)
+ elif isinstance(cls, str):
+ assert node == cls, f'The node {xpath!r} is not {cls!r}: {node!r}'
+ else:
+ assert isinstance(node, cls), \
+ f'The node{xpath} is not subclass of {cls!r}: {node!r}'
+
+ if kwargs:
+ assert isinstance(node, nodes.Element), \
+ 'The node%s does not have any attributes' % xpath
+
+ for key, value in kwargs.items():
+ if key not in node:
+ if (key := key.replace('_', '-')) not in node:
+ msg = f'The node{xpath} does not have {key!r} attribute: {node!r}'
+ raise AssertionError(msg)
+ assert node[key] == value, \
+ f'The node{xpath}[{key}] is not {value!r}: {node[key]!r}'
+
+
+def etree_parse(path: str) -> Any:
+ with warnings.catch_warnings(record=False):
+ warnings.filterwarnings("ignore", category=DeprecationWarning)
+ return ElementTree.parse(path) # NoQA: S314 # using known data in tests
+
+
+class SphinxTestApp(application.Sphinx):
+ """
+ A subclass of :class:`Sphinx` that runs on the test root, with some
+ better default values for the initialization parameters.
+ """
+ _status: StringIO
+ _warning: StringIO
+
+ def __init__(
+ self,
+ buildername: str = 'html',
+ srcdir: Path | None = None,
+ builddir: Path | None = None,
+ freshenv: bool = False,
+ confoverrides: dict | None = None,
+ status: IO | None = None,
+ warning: IO | None = None,
+ tags: list[str] | None = None,
+ docutilsconf: str | None = None,
+ parallel: int = 0,
+ ) -> None:
+ assert srcdir is not None
+
+ self.docutils_conf_path = srcdir / 'docutils.conf'
+ if docutilsconf is not None:
+ self.docutils_conf_path.write_text(docutilsconf, encoding='utf8')
+
+ if builddir is None:
+ builddir = srcdir / '_build'
+
+ confdir = srcdir
+ outdir = builddir.joinpath(buildername)
+ outdir.mkdir(parents=True, exist_ok=True)
+ doctreedir = builddir.joinpath('doctrees')
+ doctreedir.mkdir(parents=True, exist_ok=True)
+ if confoverrides is None:
+ confoverrides = {}
+ warningiserror = False
+
+ self._saved_path = sys.path[:]
+ self._saved_directives = directives._directives.copy() # type: ignore[attr-defined]
+ self._saved_roles = roles._roles.copy() # type: ignore[attr-defined]
+
+ self._saved_nodeclasses = {v for v in dir(nodes.GenericNodeVisitor)
+ if v.startswith('visit_')}
+
+ try:
+ super().__init__(srcdir, confdir, outdir, doctreedir,
+ buildername, confoverrides, status, warning,
+ freshenv, warningiserror, tags, parallel=parallel)
+ except Exception:
+ self.cleanup()
+ raise
+
+ def cleanup(self, doctrees: bool = False) -> None:
+ ModuleAnalyzer.cache.clear()
+ locale.translators.clear()
+ sys.path[:] = self._saved_path
+ sys.modules.pop('autodoc_fodder', None)
+ directives._directives = self._saved_directives # type: ignore[attr-defined]
+ roles._roles = self._saved_roles # type: ignore[attr-defined]
+ for method in dir(nodes.GenericNodeVisitor):
+ if method.startswith('visit_') and \
+ method not in self._saved_nodeclasses:
+ delattr(nodes.GenericNodeVisitor, 'visit_' + method[6:])
+ delattr(nodes.GenericNodeVisitor, 'depart_' + method[6:])
+ with contextlib.suppress(FileNotFoundError):
+ os.remove(self.docutils_conf_path)
+
+ def __repr__(self) -> str:
+ return f'<{self.__class__.__name__} buildername={self.builder.name!r}>'
+
+ def build(self, force_all: bool = False, filenames: list[str] | None = None) -> None:
+ self.env._pickled_doctree_cache.clear()
+ super().build(force_all, filenames)
+
+
+class SphinxTestAppWrapperForSkipBuilding:
+ """
+ This class is a wrapper for SphinxTestApp to speed up the test by skipping
+ `app.build` process if it is already built and there is even one output
+ file.
+ """
+
+ def __init__(self, app_: SphinxTestApp) -> None:
+ self.app = app_
+
+ def __getattr__(self, name: str) -> Any:
+ return getattr(self.app, name)
+
+ def build(self, *args: Any, **kwargs: Any) -> None:
+ if not os.listdir(self.app.outdir):
+ # if listdir is empty, do build.
+ self.app.build(*args, **kwargs)
+ # otherwise, we can use built cache
+
+
+def strip_escseq(text: str) -> str:
+ return re.sub('\x1b.*?m', '', text)
diff --git a/sphinx/texinputs/LICRcyr2utf8.xdy b/sphinx/texinputs/LICRcyr2utf8.xdy
new file mode 100644
index 0000000..a9ca1c8
--- /dev/null
+++ b/sphinx/texinputs/LICRcyr2utf8.xdy
@@ -0,0 +1,101 @@
+;; -*- coding: utf-8; mode: Lisp; -*-
+;; style file for xindy
+;; filename: LICRcyr2utf8.xdy
+;; description: style file for xindy which maps back LaTeX Internal
+;; Character Representation of Cyrillic to utf-8
+;; usage: for use with pdflatex produced .idx files.
+;; Contributed by the Sphinx team, July 2018.
+(merge-rule "\IeC {\'\CYRG }" "Ѓ" :string)
+(merge-rule "\IeC {\'\CYRK }" "Ќ" :string)
+(merge-rule "\IeC {\'\cyrg }" "Ñ“" :string)
+(merge-rule "\IeC {\'\cyrk }" "ќ" :string)
+(merge-rule "\IeC {\CYRA }" "Ð" :string)
+(merge-rule "\IeC {\CYRB }" "Б" :string)
+(merge-rule "\IeC {\CYRC }" "Ц" :string)
+(merge-rule "\IeC {\CYRCH }" "Ч" :string)
+(merge-rule "\IeC {\CYRD }" "Д" :string)
+(merge-rule "\IeC {\CYRDJE }" "Ђ" :string)
+(merge-rule "\IeC {\CYRDZE }" "Ð…" :string)
+(merge-rule "\IeC {\CYRDZHE }" "Ð" :string)
+(merge-rule "\IeC {\CYRE }" "Е" :string)
+(merge-rule "\IeC {\CYREREV }" "Э" :string)
+(merge-rule "\IeC {\CYRERY }" "Ы" :string)
+(merge-rule "\IeC {\CYRF }" "Ф" :string)
+(merge-rule "\IeC {\CYRG }" "Г" :string)
+(merge-rule "\IeC {\CYRGUP }" "Ò" :string)
+(merge-rule "\IeC {\CYRH }" "Ð¥" :string)
+(merge-rule "\IeC {\CYRHRDSN }" "Ъ" :string)
+(merge-rule "\IeC {\CYRI }" "И" :string)
+(merge-rule "\IeC {\CYRIE }" "Є" :string)
+(merge-rule "\IeC {\CYRII }" "І" :string)
+(merge-rule "\IeC {\CYRISHRT }" "Й" :string)
+(merge-rule "\IeC {\CYRJE }" "Ј" :string)
+(merge-rule "\IeC {\CYRK }" "К" :string)
+(merge-rule "\IeC {\CYRL }" "Л" :string)
+(merge-rule "\IeC {\CYRLJE }" "Љ" :string)
+(merge-rule "\IeC {\CYRM }" "М" :string)
+(merge-rule "\IeC {\CYRN }" "Ð" :string)
+(merge-rule "\IeC {\CYRNJE }" "Њ" :string)
+(merge-rule "\IeC {\CYRO }" "О" :string)
+(merge-rule "\IeC {\CYRP }" "П" :string)
+(merge-rule "\IeC {\CYRR }" "Р" :string)
+(merge-rule "\IeC {\CYRS }" "С" :string)
+(merge-rule "\IeC {\CYRSFTSN }" "Ь" :string)
+(merge-rule "\IeC {\CYRSH }" "Ш" :string)
+(merge-rule "\IeC {\CYRSHCH }" "Щ" :string)
+(merge-rule "\IeC {\CYRT }" "Т" :string)
+(merge-rule "\IeC {\CYRTSHE }" "Ћ" :string)
+(merge-rule "\IeC {\CYRU }" "У" :string)
+(merge-rule "\IeC {\CYRUSHRT }" "ÐŽ" :string)
+(merge-rule "\IeC {\CYRV }" "Ð’" :string)
+(merge-rule "\IeC {\CYRYA }" "Я" :string)
+(merge-rule "\IeC {\CYRYI }" "Ї" :string)
+(merge-rule "\IeC {\CYRYO }" "Ð" :string)
+(merge-rule "\IeC {\CYRYU }" "Ю" :string)
+(merge-rule "\IeC {\CYRZ }" "З" :string)
+(merge-rule "\IeC {\CYRZH }" "Ж" :string)
+(merge-rule "\IeC {\cyra }" "а" :string)
+(merge-rule "\IeC {\cyrb }" "б" :string)
+(merge-rule "\IeC {\cyrc }" "ц" :string)
+(merge-rule "\IeC {\cyrch }" "ч" :string)
+(merge-rule "\IeC {\cyrd }" "д" :string)
+(merge-rule "\IeC {\cyrdje }" "Ñ’" :string)
+(merge-rule "\IeC {\cyrdze }" "Ñ•" :string)
+(merge-rule "\IeC {\cyrdzhe }" "ÑŸ" :string)
+(merge-rule "\IeC {\cyre }" "е" :string)
+(merge-rule "\IeC {\cyrerev }" "Ñ" :string)
+(merge-rule "\IeC {\cyrery }" "Ñ‹" :string)
+(merge-rule "\IeC {\cyrf }" "Ñ„" :string)
+(merge-rule "\IeC {\cyrg }" "г" :string)
+(merge-rule "\IeC {\cyrgup }" "Ò‘" :string)
+(merge-rule "\IeC {\cyrh }" "Ñ…" :string)
+(merge-rule "\IeC {\cyrhrdsn }" "ÑŠ" :string)
+(merge-rule "\IeC {\cyri }" "и" :string)
+(merge-rule "\IeC {\cyrie }" "Ñ”" :string)
+(merge-rule "\IeC {\cyrii }" "Ñ–" :string)
+(merge-rule "\IeC {\cyrishrt }" "й" :string)
+(merge-rule "\IeC {\cyrje }" "ј" :string)
+(merge-rule "\IeC {\cyrk }" "к" :string)
+(merge-rule "\IeC {\cyrl }" "л" :string)
+(merge-rule "\IeC {\cyrlje }" "Ñ™" :string)
+(merge-rule "\IeC {\cyrm }" "м" :string)
+(merge-rule "\IeC {\cyrn }" "н" :string)
+(merge-rule "\IeC {\cyrnje }" "Ñš" :string)
+(merge-rule "\IeC {\cyro }" "о" :string)
+(merge-rule "\IeC {\cyrp }" "п" :string)
+(merge-rule "\IeC {\cyrr }" "Ñ€" :string)
+(merge-rule "\IeC {\cyrs }" "Ñ" :string)
+(merge-rule "\IeC {\cyrsftsn }" "ь" :string)
+(merge-rule "\IeC {\cyrsh }" "ш" :string)
+(merge-rule "\IeC {\cyrshch }" "щ" :string)
+(merge-rule "\IeC {\cyrt }" "Ñ‚" :string)
+(merge-rule "\IeC {\cyrtshe }" "Ñ›" :string)
+(merge-rule "\IeC {\cyru }" "у" :string)
+(merge-rule "\IeC {\cyrushrt }" "Ñž" :string)
+(merge-rule "\IeC {\cyrv }" "в" :string)
+(merge-rule "\IeC {\cyrya }" "Ñ" :string)
+(merge-rule "\IeC {\cyryi }" "Ñ—" :string)
+(merge-rule "\IeC {\cyryo }" "Ñ‘" :string)
+(merge-rule "\IeC {\cyryu }" "ÑŽ" :string)
+(merge-rule "\IeC {\cyrz }" "з" :string)
+(merge-rule "\IeC {\cyrzh }" "ж" :string)
diff --git a/sphinx/texinputs/LICRlatin2utf8.xdy b/sphinx/texinputs/LICRlatin2utf8.xdy
new file mode 100644
index 0000000..1d76825
--- /dev/null
+++ b/sphinx/texinputs/LICRlatin2utf8.xdy
@@ -0,0 +1,239 @@
+;; style file for xindy
+;; filename: LICRlatin2utf8.xdy
+;; description: style file for xindy which maps back LaTeX Internal
+;; Character Representation of letters (as arising in .idx index
+;; file) to UTF-8 encoding for correct sorting by xindy.
+;; usage: for use with the pdflatex engine,
+;; *not* for use with xelatex or lualatex.
+;;
+;; This is based upon xindy's distributed file tex/inputenc/utf8.xdy.
+;; The modifications include:
+;;
+;; - Updates for compatibility with current LaTeX macro encoding.
+;;
+;; - Systematic usage of the \IeC {...} mark-up, because mark-up in
+;; tex/inputenc/utf8.xdy was using it on seemingly random basis, and
+;; Sphinx coercing of xindy usability for both Latin and Cyrillic scripts
+;; with pdflatex requires its systematic presence here.
+;;
+;; - Support for some extra letters: Ÿ, Ŋ, ŋ, Œ, œ, IJ, ij, ȷ and ẞ.
+;;
+;; Indeed Sphinx needs to support for pdflatex engine all Unicode letters
+;; available in TeX T1 font encoding. The above letters are found in
+;; that encoding but not in the Latin1, 2, 3 charsets which are those
+;; covered by original tex/inputenc/utf8.xdy.
+;;
+;; - There is a problem that È· is not supported out-of-the box by LaTeX
+;; with inputenc, one must add explicitly
+;; \DeclareUnicodeCharacter{0237}{\j}
+;; to preamble of LaTeX document. However this character is not supported
+;; by the TeX "times" font used by default by Sphinx for pdflatex engine.
+;;
+;; **Update**: since LaTeX 2018/12/01, the \j as well as \SS, \k{} and
+;; \.{} need no extra user declaration anymore.
+;;
+;; - ẞ needs \DeclareUnicodeCharacter{1E9E}{\SS} (but ß needs no extra set-up).
+;;
+;; - U+02DB (Ë›) and U+02D9 (Ë™) are also not supported by inputenc
+;; out of the box and require
+;; \DeclareUnicodeCharacter{02DB}{\k{}}
+;; \DeclareUnicodeCharacter{02D9}{\.{}}
+;; to be added to preamble.
+;;
+;; - U+0127 ħ and U+0126 Ħ are absent from TeX T1+TS1 font encodings.
+;;
+;; - Characters ÅŠ and Å‹ are not supported by TeX font "times" used by
+;; default by Sphinx for pdflatex engine but they are supported by
+;; some TeX fonts, in particular by the default LaTeX font for T1
+;; encoding.
+;;
+;; - " and ~ must be escaped as ~" and resp. ~~ in xindy merge rules.
+;;
+;; Contributed by the Sphinx team, July 2018.
+;;
+;; See sphinx.xdy for superior figures, as they are escaped by LaTeX writer.
+(merge-rule "\IeC {\textonesuperior }" "¹" :string)
+(merge-rule "\IeC {\texttwosuperior }" "²" :string)
+(merge-rule "\IeC {\textthreesuperior }" "³" :string)
+(merge-rule "\IeC {\'a}" "á" :string)
+(merge-rule "\IeC {\'A}" "Ã" :string)
+(merge-rule "\IeC {\`a}" "à" :string)
+(merge-rule "\IeC {\`A}" "À" :string)
+(merge-rule "\IeC {\^a}" "â" :string)
+(merge-rule "\IeC {\^A}" "Â" :string)
+(merge-rule "\IeC {\~"a}" "ä" :string)
+(merge-rule "\IeC {\~"A}" "Ä" :string)
+(merge-rule "\IeC {\~~a}" "ã" :string)
+(merge-rule "\IeC {\~~A}" "Ã" :string)
+(merge-rule "\IeC {\c c}" "ç" :string)
+(merge-rule "\IeC {\c C}" "Ç" :string)
+(merge-rule "\IeC {\'c}" "ć" :string)
+(merge-rule "\IeC {\'C}" "Ć" :string)
+(merge-rule "\IeC {\^c}" "ĉ" :string)
+(merge-rule "\IeC {\^C}" "Ĉ" :string)
+(merge-rule "\IeC {\.c}" "Ä‹" :string)
+(merge-rule "\IeC {\.C}" "ÄŠ" :string)
+(merge-rule "\IeC {\c s}" "ÅŸ" :string)
+(merge-rule "\IeC {\c S}" "Åž" :string)
+(merge-rule "\IeC {\c t}" "Å£" :string)
+(merge-rule "\IeC {\c T}" "Å¢" :string)
+(merge-rule "\IeC {\-}" "­" :string); soft hyphen
+(merge-rule "\IeC {\textdiv }" "÷" :string)
+(merge-rule "\IeC {\'e}" "é" :string)
+(merge-rule "\IeC {\'E}" "É" :string)
+(merge-rule "\IeC {\`e}" "è" :string)
+(merge-rule "\IeC {\`E}" "È" :string)
+(merge-rule "\IeC {\^e}" "ê" :string)
+(merge-rule "\IeC {\^E}" "Ê" :string)
+(merge-rule "\IeC {\~"e}" "ë" :string)
+(merge-rule "\IeC {\~"E}" "Ë" :string)
+(merge-rule "\IeC {\^g}" "Ä" :string)
+(merge-rule "\IeC {\^G}" "Ĝ" :string)
+(merge-rule "\IeC {\.g}" "Ä¡" :string)
+(merge-rule "\IeC {\.G}" "Ä " :string)
+(merge-rule "\IeC {\^h}" "Ä¥" :string)
+(merge-rule "\IeC {\^H}" "Ĥ" :string)
+(merge-rule "\IeC {\H o}" "Å‘" :string)
+(merge-rule "\IeC {\H O}" "Å" :string)
+(merge-rule "\IeC {\textacutedbl }" "Ë" :string)
+(merge-rule "\IeC {\H u}" "ű" :string)
+(merge-rule "\IeC {\H U}" "Å°" :string)
+(merge-rule "\IeC {\ae }" "æ" :string)
+(merge-rule "\IeC {\AE }" "Æ" :string)
+(merge-rule "\IeC {\textcopyright }" "©" :string)
+(merge-rule "\IeC {\c \ }" "¸" :string)
+(merge-rule "\IeC {\dh }" "ð" :string)
+(merge-rule "\IeC {\DH }" "Ã" :string)
+(merge-rule "\IeC {\dj }" "Ä‘" :string)
+(merge-rule "\IeC {\DJ }" "Ä" :string)
+(merge-rule "\IeC {\guillemotleft }" "«" :string)
+(merge-rule "\IeC {\guillemotright }" "»" :string)
+(merge-rule "\IeC {\'\i }" "í" :string)
+(merge-rule "\IeC {\`\i }" "ì" :string)
+(merge-rule "\IeC {\^\i }" "î" :string)
+(merge-rule "\IeC {\~"\i }" "ï" :string)
+(merge-rule "\IeC {\i }" "ı" :string)
+(merge-rule "\IeC {\^\j }" "ĵ" :string)
+(merge-rule "\IeC {\k {}}" "Ë›" :string)
+(merge-rule "\IeC {\l }" "Å‚" :string)
+(merge-rule "\IeC {\L }" "Å" :string)
+(merge-rule "\IeC {\nobreakspace }" " " :string)
+(merge-rule "\IeC {\o }" "ø" :string)
+(merge-rule "\IeC {\O }" "Ø" :string)
+(merge-rule "\IeC {\textsterling }" "£" :string)
+(merge-rule "\IeC {\textparagraph }" "¶" :string)
+(merge-rule "\IeC {\ss }" "ß" :string)
+(merge-rule "\IeC {\textsection }" "§" :string)
+(merge-rule "\IeC {\textbrokenbar }" "¦" :string)
+(merge-rule "\IeC {\textcent }" "¢" :string)
+(merge-rule "\IeC {\textcurrency }" "¤" :string)
+(merge-rule "\IeC {\textdegree }" "°" :string)
+(merge-rule "\IeC {\textexclamdown }" "¡" :string)
+(merge-rule "\IeC {\texthbar }" "ħ" :string)
+(merge-rule "\IeC {\textHbar }" "Ħ" :string)
+(merge-rule "\IeC {\textonehalf }" "½" :string)
+(merge-rule "\IeC {\textonequarter }" "¼" :string)
+(merge-rule "\IeC {\textordfeminine }" "ª" :string)
+(merge-rule "\IeC {\textordmasculine }" "º" :string)
+(merge-rule "\IeC {\textperiodcentered }" "·" :string)
+(merge-rule "\IeC {\textquestiondown }" "¿" :string)
+(merge-rule "\IeC {\textregistered }" "®" :string)
+(merge-rule "\IeC {\textthreequarters }" "¾" :string)
+(merge-rule "\IeC {\textyen }" "Â¥" :string)
+(merge-rule "\IeC {\th }" "þ" :string)
+(merge-rule "\IeC {\TH }" "Þ" :string)
+(merge-rule "\IeC {\'I}" "Ã" :string)
+(merge-rule "\IeC {\`I}" "Ì" :string)
+(merge-rule "\IeC {\^I}" "ÃŽ" :string)
+(merge-rule "\IeC {\~"I}" "Ã" :string)
+(merge-rule "\IeC {\.I}" "Ä°" :string)
+(merge-rule "\IeC {\^J}" "Ä´" :string)
+(merge-rule "\IeC {\k a}" "Ä…" :string)
+(merge-rule "\IeC {\k A}" "Ä„" :string)
+(merge-rule "\IeC {\k e}" "Ä™" :string)
+(merge-rule "\IeC {\k E}" "Ę" :string)
+(merge-rule "\IeC {\'l}" "ĺ" :string)
+(merge-rule "\IeC {\'L}" "Ĺ" :string)
+(merge-rule "\IeC {\textlnot }" "¬" :string)
+(merge-rule "\IeC {\textmu }" "µ" :string)
+(merge-rule "\IeC {\'n}" "Å„" :string)
+(merge-rule "\IeC {\'N}" "Ń" :string)
+(merge-rule "\IeC {\~~n}" "ñ" :string)
+(merge-rule "\IeC {\~~N}" "Ñ" :string)
+(merge-rule "\IeC {\'o}" "ó" :string)
+(merge-rule "\IeC {\'O}" "Ó" :string)
+(merge-rule "\IeC {\`o}" "ò" :string)
+(merge-rule "\IeC {\`O}" "Ã’" :string)
+(merge-rule "\IeC {\^o}" "ô" :string)
+(merge-rule "\IeC {\^O}" "Ô" :string)
+(merge-rule "\IeC {\~"o}" "ö" :string)
+(merge-rule "\IeC {\~"O}" "Ö" :string)
+(merge-rule "\IeC {\~~o}" "õ" :string)
+(merge-rule "\IeC {\~~O}" "Õ" :string)
+(merge-rule "\IeC {\textpm }" "±" :string)
+(merge-rule "\IeC {\r a}" "Ã¥" :string)
+(merge-rule "\IeC {\r A}" "Ã…" :string)
+(merge-rule "\IeC {\'r}" "Å•" :string)
+(merge-rule "\IeC {\'R}" "Å”" :string)
+(merge-rule "\IeC {\r u}" "ů" :string)
+(merge-rule "\IeC {\r U}" "Å®" :string)
+(merge-rule "\IeC {\'s}" "Å›" :string)
+(merge-rule "\IeC {\'S}" "Åš" :string)
+(merge-rule "\IeC {\^s}" "Å" :string)
+(merge-rule "\IeC {\^S}" "Ŝ" :string)
+(merge-rule "\IeC {\textasciidieresis }" "¨" :string)
+(merge-rule "\IeC {\textasciimacron }" "¯" :string)
+(merge-rule "\IeC {\.{}}" "Ë™" :string)
+(merge-rule "\IeC {\textasciiacute }" "´" :string)
+(merge-rule "\IeC {\texttimes }" "×" :string)
+(merge-rule "\IeC {\u a}" "ă" :string)
+(merge-rule "\IeC {\u A}" "Ä‚" :string)
+(merge-rule "\IeC {\u g}" "ÄŸ" :string)
+(merge-rule "\IeC {\u G}" "Äž" :string)
+(merge-rule "\IeC {\textasciibreve }" "˘" :string)
+(merge-rule "\IeC {\'u}" "ú" :string)
+(merge-rule "\IeC {\'U}" "Ú" :string)
+(merge-rule "\IeC {\`u}" "ù" :string)
+(merge-rule "\IeC {\`U}" "Ù" :string)
+(merge-rule "\IeC {\^u}" "û" :string)
+(merge-rule "\IeC {\^U}" "Û" :string)
+(merge-rule "\IeC {\~"u}" "ü" :string)
+(merge-rule "\IeC {\~"U}" "Ü" :string)
+(merge-rule "\IeC {\u u}" "Å­" :string)
+(merge-rule "\IeC {\u U}" "Ŭ" :string)
+(merge-rule "\IeC {\v c}" "Ä" :string)
+(merge-rule "\IeC {\v C}" "Č" :string)
+(merge-rule "\IeC {\v d}" "Ä" :string)
+(merge-rule "\IeC {\v D}" "ÄŽ" :string)
+(merge-rule "\IeC {\v e}" "Ä›" :string)
+(merge-rule "\IeC {\v E}" "Äš" :string)
+(merge-rule "\IeC {\v l}" "ľ" :string)
+(merge-rule "\IeC {\v L}" "Ľ" :string)
+(merge-rule "\IeC {\v n}" "ň" :string)
+(merge-rule "\IeC {\v N}" "Ň" :string)
+(merge-rule "\IeC {\v r}" "Å™" :string)
+(merge-rule "\IeC {\v R}" "Ř" :string)
+(merge-rule "\IeC {\v s}" "Å¡" :string)
+(merge-rule "\IeC {\v S}" "Å " :string)
+(merge-rule "\IeC {\textasciicaron }" "ˇ" :string)
+(merge-rule "\IeC {\v t}" "Å¥" :string)
+(merge-rule "\IeC {\v T}" "Ť" :string)
+(merge-rule "\IeC {\v z}" "ž" :string)
+(merge-rule "\IeC {\v Z}" "Ž" :string)
+(merge-rule "\IeC {\'y}" "ý" :string)
+(merge-rule "\IeC {\'Y}" "Ã" :string)
+(merge-rule "\IeC {\~"y}" "ÿ" :string)
+(merge-rule "\IeC {\'z}" "ź" :string)
+(merge-rule "\IeC {\'Z}" "Ź" :string)
+(merge-rule "\IeC {\.z}" "ż" :string)
+(merge-rule "\IeC {\.Z}" "Å»" :string)
+;; letters not in Latin1, 2, 3 but available in TeX T1 font encoding
+(merge-rule "\IeC {\~"Y}" "Ÿ" :string)
+(merge-rule "\IeC {\NG }" "ÅŠ" :string)
+(merge-rule "\IeC {\ng }" "Å‹" :string)
+(merge-rule "\IeC {\OE }" "Å’" :string)
+(merge-rule "\IeC {\oe }" "Å“" :string)
+(merge-rule "\IeC {\IJ }" "IJ" :string)
+(merge-rule "\IeC {\ij }" "ij" :string)
+(merge-rule "\IeC {\j }" "È·" :string)
+(merge-rule "\IeC {\SS }" "ẞ" :string)
diff --git a/sphinx/texinputs/LatinRules.xdy b/sphinx/texinputs/LatinRules.xdy
new file mode 100644
index 0000000..b20fbbb
--- /dev/null
+++ b/sphinx/texinputs/LatinRules.xdy
@@ -0,0 +1,611 @@
+;; Common Lisp style file for xindy
+;; filename: LatinRules.xdy
+;;
+;; Please note that this data file deliberately uses strings
+;; with single non-ascii bytes. This is intentional and
+;; follows the usage observed in similar xindy support files.
+;;
+;; It is based upon xindy's files lang/general/utf8.xdy and
+;; lang/general/utf8-lang.xdy which implement
+;; "a general sorting order for Western European languages".
+;;
+;; The aim for Sphinx is to be able to index in a Cyrillic document
+;; also terms using the Latin alphabets, inclusive of letters
+;; with diacritics. To this effect the xindy rules from lang/general
+;; got manually re-coded to avoid collisions with the encoding
+;; done by xindy for sorting words in Cyrillic languages, which was
+;; observed not to use bytes with octal encoding 0o266 or higher.
+;;
+;; So here we use only 0o266 or higher bytes.
+;; (Ŋ, ŋ, IJ, and ij are absent from
+;; lang/general/utf8.xdy and not included here.)
+;; Contributed by the Sphinx team, 2018.
+
+(define-letter-group "A" :prefixes ("¶"))
+(define-letter-group "B" :after "A" :prefixes ("·"))
+(define-letter-group "C" :after "B" :prefixes ("¸"))
+(define-letter-group "D" :after "C" :prefixes ("¹"))
+(define-letter-group "E" :after "D" :prefixes ("º"))
+(define-letter-group "F" :after "E" :prefixes ("»"))
+(define-letter-group "G" :after "F" :prefixes ("¼"))
+(define-letter-group "H" :after "G" :prefixes ("½"))
+(define-letter-group "I" :after "H" :prefixes ("¾"))
+(define-letter-group "J" :after "I" :prefixes ("¿"))
+(define-letter-group "K" :after "J" :prefixes ("À"))
+(define-letter-group "L" :after "K" :prefixes ("Á"))
+(define-letter-group "M" :after "L" :prefixes ("Â"))
+(define-letter-group "N" :after "M" :prefixes ("Ã"))
+(define-letter-group "O" :after "N" :prefixes ("Ä"))
+(define-letter-group "P" :after "O" :prefixes ("È"))
+(define-letter-group "Q" :after "P" :prefixes ("Ê"))
+(define-letter-group "R" :after "Q" :prefixes ("Ë"))
+(define-letter-group "S" :after "R" :prefixes ("Ð"))
+(define-letter-group "T" :after "S" :prefixes ("Ú"))
+(define-letter-group "U" :after "T" :prefixes ("à"))
+(define-letter-group "V" :after "U" :prefixes ("å"))
+(define-letter-group "W" :after "V" :prefixes ("æ"))
+(define-letter-group "X" :after "W" :prefixes ("ë"))
+(define-letter-group "Y" :after "X" :prefixes ("í"))
+(define-letter-group "Z" :after "Y" :prefixes ("ð"))
+
+(define-rule-set "sphinx-xy-alphabetize"
+
+ :rules (("À" "¶" :string)
+ ("Ä‚" "¶" :string)
+ ("â" "¶" :string)
+ ("Ä" "¶" :string)
+ ("à" "¶" :string)
+ ("Ã…" "¶" :string)
+ ("Ã" "¶" :string)
+ ("Ã" "¶" :string)
+ ("á" "¶" :string)
+ ("ã" "¶" :string)
+ ("Â" "¶" :string)
+ ("ă" "¶" :string)
+ ("Ã¥" "¶" :string)
+ ("Ä…" "¶" :string)
+ ("ä" "¶" :string)
+ ("Ä„" "¶" :string)
+ ("æ" "¶º" :string)
+ ("Æ" "¶º" :string)
+ ("ć" "¸" :string)
+ ("ĉ" "¸" :string)
+ ("ç" "¸" :string)
+ ("ÄŒ" "¸" :string)
+ ("Ä" "¸" :string)
+ ("Ĉ" "¸" :string)
+ ("Ç" "¸" :string)
+ ("Ć" "¸" :string)
+ ("Ä" "¹" :string)
+ ("Ä" "¹" :string)
+ ("ÄŽ" "¹" :string)
+ ("Ä‘" "¹" :string)
+ ("ê" "º" :string)
+ ("Ę" "º" :string)
+ ("Äš" "º" :string)
+ ("ë" "º" :string)
+ ("Ä›" "º" :string)
+ ("é" "º" :string)
+ ("È" "º" :string)
+ ("Ë" "º" :string)
+ ("É" "º" :string)
+ ("è" "º" :string)
+ ("Ê" "º" :string)
+ ("Ä™" "º" :string)
+ ("Ä" "¼" :string)
+ ("ÄŸ" "¼" :string)
+ ("Äž" "¼" :string)
+ ("Äœ" "¼" :string)
+ ("Ä¥" "½" :string)
+ ("Ĥ" "½" :string)
+ ("Ã" "¾" :string)
+ ("Ã" "¾" :string)
+ ("ï" "¾" :string)
+ ("ÃŽ" "¾" :string)
+ ("î" "¾" :string)
+ ("ı" "¾" :string)
+ ("Ä°" "¾" :string)
+ ("í" "¾" :string)
+ ("ÃŒ" "¾" :string)
+ ("ì" "¾" :string)
+ ("Ä´" "¿" :string)
+ ("ĵ" "¿" :string)
+ ("Å‚" "Á" :string)
+ ("Å" "Á" :string)
+ ("ľ" "Á" :string)
+ ("Ľ" "Á" :string)
+ ("Å„" "Ã" :string)
+ ("Ń" "Ã" :string)
+ ("ñ" "Ã" :string)
+ ("ň" "Ã" :string)
+ ("Ñ" "Ã" :string)
+ ("Ň" "Ã" :string)
+ ("Õ" "Ä" :string)
+ ("Å" "Ä" :string)
+ ("ó" "Ä" :string)
+ ("ö" "Ä" :string)
+ ("ô" "Ä" :string)
+ ("Å‘" "Ä" :string)
+ ("Ø" "Ä" :string)
+ ("Ö" "Ä" :string)
+ ("õ" "Ä" :string)
+ ("Ô" "Ä" :string)
+ ("ø" "Ä" :string)
+ ("Ó" "Ä" :string)
+ ("Ã’" "Ä" :string)
+ ("ò" "Ä" :string)
+ ("œ" "ĺ" :string)
+ ("Œ" "ĺ" :string)
+ ("Ř" "Ë" :string)
+ ("Å™" "Ë" :string)
+ ("Å”" "Ë" :string)
+ ("Å•" "Ë" :string)
+ ("Å" "Ð" :string)
+ ("Åš" "Ð" :string)
+ ("È™" "Ð" :string)
+ ("ÅŸ" "Ð" :string)
+ ("Åœ" "Ð" :string)
+ ("Å›" "Ð" :string)
+ ("Ș" "Ð" :string)
+ ("Å¡" "Ð" :string)
+ ("Åž" "Ð" :string)
+ ("Å " "Ð" :string)
+ ("ß" "ÐÐ" :string)
+ ("Èš" "Ú" :string)
+ ("Ť" "Ú" :string)
+ ("È›" "Ú" :string)
+ ("Å¥" "Ú" :string)
+ ("û" "à" :string)
+ ("Å­" "à" :string)
+ ("ů" "à" :string)
+ ("ű" "à" :string)
+ ("ù" "à" :string)
+ ("Ŭ" "à" :string)
+ ("Ù" "à" :string)
+ ("Å°" "à" :string)
+ ("Ãœ" "à" :string)
+ ("Å®" "à" :string)
+ ("ú" "à" :string)
+ ("Ú" "à" :string)
+ ("Û" "à" :string)
+ ("ü" "à" :string)
+ ("ÿ" "í" :string)
+ ("Ã" "í" :string)
+ ("Ÿ" "í" :string)
+ ("ý" "í" :string)
+ ("Å»" "ð" :string)
+ ("Ž" "ð" :string)
+ ("Ź" "ð" :string)
+ ("ž" "ð" :string)
+ ("ż" "ð" :string)
+ ("ź" "ð" :string)
+ ("a" "¶" :string)
+ ("A" "¶" :string)
+ ("b" "·" :string)
+ ("B" "·" :string)
+ ("c" "¸" :string)
+ ("C" "¸" :string)
+ ("d" "¹" :string)
+ ("D" "¹" :string)
+ ("e" "º" :string)
+ ("E" "º" :string)
+ ("F" "»" :string)
+ ("f" "»" :string)
+ ("G" "¼" :string)
+ ("g" "¼" :string)
+ ("H" "½" :string)
+ ("h" "½" :string)
+ ("i" "¾" :string)
+ ("I" "¾" :string)
+ ("J" "¿" :string)
+ ("j" "¿" :string)
+ ("K" "À" :string)
+ ("k" "À" :string)
+ ("L" "Á" :string)
+ ("l" "Á" :string)
+ ("M" "Â" :string)
+ ("m" "Â" :string)
+ ("n" "Ã" :string)
+ ("N" "Ã" :string)
+ ("O" "Ä" :string)
+ ("o" "Ä" :string)
+ ("p" "È" :string)
+ ("P" "È" :string)
+ ("Q" "Ê" :string)
+ ("q" "Ê" :string)
+ ("r" "Ë" :string)
+ ("R" "Ë" :string)
+ ("S" "Ð" :string)
+ ("s" "Ð" :string)
+ ("t" "Ú" :string)
+ ("T" "Ú" :string)
+ ("u" "à" :string)
+ ("U" "à" :string)
+ ("v" "å" :string)
+ ("V" "å" :string)
+ ("W" "æ" :string)
+ ("w" "æ" :string)
+ ("x" "ë" :string)
+ ("X" "ë" :string)
+ ("Y" "í" :string)
+ ("y" "í" :string)
+ ("z" "ð" :string)
+ ("Z" "ð" :string)
+ ))
+
+(define-rule-set "sphinx-xy-resolve-diacritics"
+
+ :rules (("Ĥ" "£" :string)
+ ("ó" "£" :string)
+ ("ľ" "£" :string)
+ ("Ř" "£" :string)
+ ("Ä" "£" :string)
+ ("Ä" "£" :string)
+ ("Äš" "£" :string)
+ ("Ä¥" "£" :string)
+ ("ÄŒ" "£" :string)
+ ("Ä´" "£" :string)
+ ("Ä›" "£" :string)
+ ("ž" "£" :string)
+ ("ÄŽ" "£" :string)
+ ("Å™" "£" :string)
+ ("Ž" "£" :string)
+ ("ı" "£" :string)
+ ("Ť" "£" :string)
+ ("á" "£" :string)
+ ("Ä" "£" :string)
+ ("Ã" "£" :string)
+ ("ň" "£" :string)
+ ("Å " "£" :string)
+ ("Ň" "£" :string)
+ ("ĵ" "£" :string)
+ ("Å¥" "£" :string)
+ ("Ó" "£" :string)
+ ("ý" "£" :string)
+ ("Äœ" "£" :string)
+ ("Ú" "£" :string)
+ ("Ľ" "£" :string)
+ ("Å¡" "£" :string)
+ ("Ã" "£" :string)
+ ("ú" "£" :string)
+ ("Åš" "¤" :string)
+ ("ć" "¤" :string)
+ ("Å" "¤" :string)
+ ("Å‚" "¤" :string)
+ ("Å„" "¤" :string)
+ ("À" "¤" :string)
+ ("Ź" "¤" :string)
+ ("à" "¤" :string)
+ ("Ń" "¤" :string)
+ ("Ä" "¤" :string)
+ ("ÿ" "¤" :string)
+ ("Å›" "¤" :string)
+ ("Äž" "¤" :string)
+ ("ÄŸ" "¤" :string)
+ ("Ù" "¤" :string)
+ ("Ä°" "¤" :string)
+ ("Ä‘" "¤" :string)
+ ("ù" "¤" :string)
+ ("Èš" "¤" :string)
+ ("é" "¤" :string)
+ ("Å•" "¤" :string)
+ ("Ć" "¤" :string)
+ ("È›" "¤" :string)
+ ("ò" "¤" :string)
+ ("ź" "¤" :string)
+ ("Ã’" "¤" :string)
+ ("Ÿ" "¤" :string)
+ ("Å”" "¤" :string)
+ ("É" "¤" :string)
+ ("ĉ" "¥" :string)
+ ("ô" "¥" :string)
+ ("Ã" "¥" :string)
+ ("Å" "¥" :string)
+ ("Å»" "¥" :string)
+ ("Ä‚" "¥" :string)
+ ("Åœ" "¥" :string)
+ ("ñ" "¥" :string)
+ ("Å­" "¥" :string)
+ ("í" "¥" :string)
+ ("È" "¥" :string)
+ ("Ô" "¥" :string)
+ ("Ŭ" "¥" :string)
+ ("ż" "¥" :string)
+ ("Ñ" "¥" :string)
+ ("è" "¥" :string)
+ ("Ĉ" "¥" :string)
+ ("ă" "¥" :string)
+ ("â" "¦" :string)
+ ("û" "¦" :string)
+ ("ê" "¦" :string)
+ ("Õ" "¦" :string)
+ ("õ" "¦" :string)
+ ("È™" "¦" :string)
+ ("ç" "¦" :string)
+ ("Â" "¦" :string)
+ ("Ê" "¦" :string)
+ ("Û" "¦" :string)
+ ("Ç" "¦" :string)
+ ("ì" "¦" :string)
+ ("ÃŒ" "¦" :string)
+ ("Ș" "¦" :string)
+ ("ö" "§" :string)
+ ("Ö" "§" :string)
+ ("ÅŸ" "§" :string)
+ ("ů" "§" :string)
+ ("ë" "§" :string)
+ ("ã" "§" :string)
+ ("î" "§" :string)
+ ("ÃŽ" "§" :string)
+ ("Ã" "§" :string)
+ ("Åž" "§" :string)
+ ("Å®" "§" :string)
+ ("Ë" "§" :string)
+ ("ï" "¨" :string)
+ ("Å" "¨" :string)
+ ("Ã" "¨" :string)
+ ("Ę" "¨" :string)
+ ("Å‘" "¨" :string)
+ ("Ãœ" "¨" :string)
+ ("Ã…" "¨" :string)
+ ("ü" "¨" :string)
+ ("Ä™" "¨" :string)
+ ("Ã¥" "¨" :string)
+ ("Ä" "©" :string)
+ ("ű" "©" :string)
+ ("Ø" "©" :string)
+ ("ø" "©" :string)
+ ("Å°" "©" :string)
+ ("ä" "©" :string)
+ ("Ä„" "ª" :string)
+ ("Ä…" "ª" :string)
+ ("Å“" "ÿ" :string)
+ ("ß" "ÿ" :string)
+ ("Æ" "ÿ" :string)
+ ("Å’" "ÿ" :string)
+ ("æ" "ÿ" :string)
+ ("e" "¢" :string)
+ ("t" "¢" :string)
+ ("L" "¢" :string)
+ ("Y" "¢" :string)
+ ("J" "¢" :string)
+ ("a" "¢" :string)
+ ("p" "¢" :string)
+ ("u" "¢" :string)
+ ("j" "¢" :string)
+ ("b" "¢" :string)
+ ("G" "¢" :string)
+ ("U" "¢" :string)
+ ("F" "¢" :string)
+ ("H" "¢" :string)
+ ("i" "¢" :string)
+ ("z" "¢" :string)
+ ("c" "¢" :string)
+ ("l" "¢" :string)
+ ("A" "¢" :string)
+ ("Q" "¢" :string)
+ ("w" "¢" :string)
+ ("D" "¢" :string)
+ ("R" "¢" :string)
+ ("d" "¢" :string)
+ ("s" "¢" :string)
+ ("r" "¢" :string)
+ ("k" "¢" :string)
+ ("v" "¢" :string)
+ ("m" "¢" :string)
+ ("P" "¢" :string)
+ ("y" "¢" :string)
+ ("K" "¢" :string)
+ ("q" "¢" :string)
+ ("S" "¢" :string)
+ ("I" "¢" :string)
+ ("C" "¢" :string)
+ ("M" "¢" :string)
+ ("Z" "¢" :string)
+ ("T" "¢" :string)
+ ("W" "¢" :string)
+ ("B" "¢" :string)
+ ("h" "¢" :string)
+ ("x" "¢" :string)
+ ("X" "¢" :string)
+ ("f" "¢" :string)
+ ("E" "¢" :string)
+ ("V" "¢" :string)
+ ("N" "¢" :string)
+ ("O" "¢" :string)
+ ("o" "¢" :string)
+ ("g" "¢" :string)
+ ("n" "¢" :string)
+ ))
+
+(define-rule-set "sphinx-xy-resolve-case"
+
+ :rules (("Ú" "8" :string)
+ ("Ÿ" "8" :string)
+ ("Ç" "8" :string)
+ ("Ĉ" "8" :string)
+ ("Å”" "8" :string)
+ ("Ľ" "8" :string)
+ ("Å®" "8" :string)
+ ("Ã" "8" :string)
+ ("É" "8" :string)
+ ("Ë" "8" :string)
+ ("Ș" "8" :string)
+ ("Ì" "8" :string)
+ ("Ê" "8" :string)
+ ("Ň" "8" :string)
+ ("Ä„" "8" :string)
+ ("Å " "8" :string)
+ ("Û" "8" :string)
+ ("Åž" "8" :string)
+ ("Ć" "8" :string)
+ ("Ã’" "8" :string)
+ ("Ĝ" "8" :string)
+ ("Ñ" "8" :string)
+ ("Ó" "8" :string)
+ ("ÃŽ" "8" :string)
+ ("Ã" "8" :string)
+ ("Ã" "8" :string)
+ ("Èš" "8" :string)
+ ("Ã…" "8" :string)
+ ("Äž" "8" :string)
+ ("Ü" "8" :string)
+ ("È" "8" :string)
+ ("Ô" "8" :string)
+ ("Ä°" "8" :string)
+ ("Å°" "8" :string)
+ ("Ù" "8" :string)
+ ("Ŭ" "8" :string)
+ ("Â" "8" :string)
+ ("Ť" "8" :string)
+ ("Ń" "8" :string)
+ ("ÄŽ" "8" :string)
+ ("Ź" "8" :string)
+ ("Ž" "8" :string)
+ ("Ä" "8" :string)
+ ("Ŝ" "8" :string)
+ ("Č" "8" :string)
+ ("Ä´" "8" :string)
+ ("Ö" "8" :string)
+ ("Ø" "8" :string)
+ ("Å»" "8" :string)
+ ("Å" "8" :string)
+ ("Ä‚" "8" :string)
+ ("Äš" "8" :string)
+ ("Å" "8" :string)
+ ("Õ" "8" :string)
+ ("Ę" "8" :string)
+ ("Ã" "8" :string)
+ ("À" "8" :string)
+ ("Ĥ" "8" :string)
+ ("Ä" "8" :string)
+ ("Åš" "8" :string)
+ ("Ř" "8" :string)
+ ("Ã" "8" :string)
+ ("Å’" "89" :string)
+ ("Æ" "89" :string)
+ ("ì" "9" :string)
+ ("è" "9" :string)
+ ("Ä…" "9" :string)
+ ("Å¡" "9" :string)
+ ("ú" "9" :string)
+ ("Ã¥" "9" :string)
+ ("ă" "9" :string)
+ ("Ä™" "9" :string)
+ ("ü" "9" :string)
+ ("ź" "9" :string)
+ ("ò" "9" :string)
+ ("Å¥" "9" :string)
+ ("È›" "9" :string)
+ ("ĵ" "9" :string)
+ ("Å•" "9" :string)
+ ("ż" "9" :string)
+ ("ä" "9" :string)
+ ("ý" "9" :string)
+ ("ù" "9" :string)
+ ("á" "9" :string)
+ ("é" "9" :string)
+ ("Ä" "9" :string)
+ ("ň" "9" :string)
+ ("Å›" "9" :string)
+ ("ø" "9" :string)
+ ("í" "9" :string)
+ ("Ä‘" "9" :string)
+ ("ı" "9" :string)
+ ("ÄŸ" "9" :string)
+ ("î" "9" :string)
+ ("ã" "9" :string)
+ ("à" "9" :string)
+ ("Å™" "9" :string)
+ ("Å‘" "9" :string)
+ ("ů" "9" :string)
+ ("È™" "9" :string)
+ ("ÿ" "9" :string)
+ ("ë" "9" :string)
+ ("Å­" "9" :string)
+ ("ç" "9" :string)
+ ("ű" "9" :string)
+ ("ñ" "9" :string)
+ ("õ" "9" :string)
+ ("Ä›" "9" :string)
+ ("ÅŸ" "9" :string)
+ ("ž" "9" :string)
+ ("Ä" "9" :string)
+ ("Å" "9" :string)
+ ("Å„" "9" :string)
+ ("û" "9" :string)
+ ("Å‚" "9" :string)
+ ("Ä" "9" :string)
+ ("Ä¥" "9" :string)
+ ("ê" "9" :string)
+ ("ô" "9" :string)
+ ("ĉ" "9" :string)
+ ("â" "9" :string)
+ ("ć" "9" :string)
+ ("ï" "9" :string)
+ ("ö" "9" :string)
+ ("ľ" "9" :string)
+ ("ó" "9" :string)
+ ("æ" "99" :string)
+ ("ß" "99" :string)
+ ("Å“" "99" :string)
+ ("N" "8" :string)
+ ("V" "8" :string)
+ ("O" "8" :string)
+ ("X" "8" :string)
+ ("E" "8" :string)
+ ("P" "8" :string)
+ ("K" "8" :string)
+ ("T" "8" :string)
+ ("Z" "8" :string)
+ ("M" "8" :string)
+ ("C" "8" :string)
+ ("I" "8" :string)
+ ("S" "8" :string)
+ ("B" "8" :string)
+ ("W" "8" :string)
+ ("D" "8" :string)
+ ("R" "8" :string)
+ ("H" "8" :string)
+ ("F" "8" :string)
+ ("Q" "8" :string)
+ ("A" "8" :string)
+ ("G" "8" :string)
+ ("U" "8" :string)
+ ("J" "8" :string)
+ ("Y" "8" :string)
+ ("L" "8" :string)
+ ("o" "9" :string)
+ ("n" "9" :string)
+ ("g" "9" :string)
+ ("x" "9" :string)
+ ("f" "9" :string)
+ ("y" "9" :string)
+ ("q" "9" :string)
+ ("h" "9" :string)
+ ("w" "9" :string)
+ ("s" "9" :string)
+ ("d" "9" :string)
+ ("v" "9" :string)
+ ("k" "9" :string)
+ ("r" "9" :string)
+ ("m" "9" :string)
+ ("z" "9" :string)
+ ("c" "9" :string)
+ ("i" "9" :string)
+ ("l" "9" :string)
+ ("b" "9" :string)
+ ("j" "9" :string)
+ ("a" "9" :string)
+ ("p" "9" :string)
+ ("u" "9" :string)
+ ("t" "9" :string)
+ ("e" "9" :string)
+ ))
+
+(use-rule-set :run 0
+ :rule-set ("sphinx-xy-alphabetize"))
+(use-rule-set :run 1
+ :rule-set ("sphinx-xy-resolve-diacritics"))
+(use-rule-set :run 2
+ :rule-set ("sphinx-xy-resolve-case"))
diff --git a/sphinx/texinputs/Makefile_t b/sphinx/texinputs/Makefile_t
new file mode 100644
index 0000000..96bb0fe
--- /dev/null
+++ b/sphinx/texinputs/Makefile_t
@@ -0,0 +1,92 @@
+# Makefile for Sphinx LaTeX output
+
+ALLDOCS = $(basename $(wildcard *.tex))
+ALLPDF = $(addsuffix .pdf,$(ALLDOCS))
+{% if latex_engine == 'xelatex' -%}
+ALLDVI =
+ALLXDV = $(addsuffix .xdv,$(ALLDOCS))
+{% else -%}
+ALLDVI = $(addsuffix .dvi,$(ALLDOCS))
+ALLXDV =
+{% endif -%}
+ALLPS = $(addsuffix .ps,$(ALLDOCS))
+
+# Prefix for archive names
+ARCHIVEPREFIX =
+# Additional LaTeX options (passed via variables in latexmkrc/latexmkjarc file)
+export LATEXOPTS ?=
+# Additional latexmk options
+{% if latex_engine == 'xelatex' -%}
+# with latexmk version 4.52b or higher set LATEXMKOPTS to -xelatex either here
+# or on command line for faster builds.
+{% endif -%}
+LATEXMKOPTS ?=
+{% if xindy_use -%}
+export XINDYOPTS = {{ xindy_lang_option }} -M sphinx.xdy
+{% if latex_engine == 'pdflatex' -%}
+XINDYOPTS += -M LICRlatin2utf8.xdy
+{% if xindy_cyrillic -%}
+XINDYOPTS += -M LICRcyr2utf8.xdy
+{% endif -%}
+{% endif -%}
+{% if xindy_cyrillic -%}
+XINDYOPTS += -M LatinRules.xdy
+{% endif -%}
+{% endif -%}
+# format: pdf or dvi (used only by archive targets)
+FMT = pdf
+
+{% if latex_engine in ('platex', 'uplatex') -%}
+# latexmkrc is read then overridden by latexmkjarc
+LATEX = latexmk -r latexmkjarc -dvi
+PDFLATEX = latexmk -r latexmkjarc -pdfdvi -dvi- -ps-
+{% else -%}
+LATEX = latexmk -dvi
+PDFLATEX = latexmk -pdf -dvi- -ps-
+{% endif %}
+
+{% if latex_engine != 'xelatex' -%}
+%.dvi: %.tex FORCE_MAKE
+ $(LATEX) $(LATEXMKOPTS) '$<'
+
+{% endif -%}
+%.ps: %.dvi
+ dvips '$<'
+
+%.pdf: %.tex FORCE_MAKE
+ $(PDFLATEX) $(LATEXMKOPTS) '$<'
+
+all: $(ALLPDF)
+
+all-dvi: $(ALLDVI)
+
+all-ps: $(ALLPS)
+
+all-pdf: $(ALLPDF)
+
+zip: all-$(FMT)
+ mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+ cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+ zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT)
+ rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+tar: all-$(FMT)
+ mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+ cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+ tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT)
+ rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+gz: tar
+ gzip -9 < $(ARCHIVEPREFIX)docs-$(FMT).tar > $(ARCHIVEPREFIX)docs-$(FMT).tar.gz
+
+bz2: tar
+ bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+xz: tar
+ xz -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+clean:
+ rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI) $(ALLXDV) *.fls *.fdb_latexmk
+
+.PHONY: all all-pdf all-dvi all-ps clean zip tar gz bz2 xz
+.PHONY: FORCE_MAKE
diff --git a/sphinx/texinputs/latexmkjarc_t b/sphinx/texinputs/latexmkjarc_t
new file mode 100644
index 0000000..c7403a9
--- /dev/null
+++ b/sphinx/texinputs/latexmkjarc_t
@@ -0,0 +1,22 @@
+$latex = '{{ latex_engine }} ' . $ENV{'LATEXOPTS'} . ' -kanji=utf8 %O %S';
+$dvipdf = 'dvipdfmx %O -o %D %S';
+$makeindex = 'internal mendex %S %B %D';
+sub mendex {
+ my ($source, $basename, $destination) = @_;
+ my $dictfile = $basename . ".dic";
+ unlink($destination);
+ system("mendex", "-U", "-f", "-d", $dictfile, "-s", "python.ist", $source);
+ if ($? > 0) {
+ print("mendex exited with error code $? (ignored)\n");
+ }
+ if (!-e $destination) {
+ # create an empty .ind file if nothing
+ open(FH, ">" . $destination);
+ close(FH);
+ }
+ return 0;
+}
+add_cus_dep( "glo", "gls", 0, "makeglo" );
+sub makeglo {
+ return system( "mendex -J -f -s gglo.ist -o '$_[0].gls' '$_[0].glo'" );
+}
diff --git a/sphinx/texinputs/latexmkrc_t b/sphinx/texinputs/latexmkrc_t
new file mode 100644
index 0000000..a33b541
--- /dev/null
+++ b/sphinx/texinputs/latexmkrc_t
@@ -0,0 +1,32 @@
+{% if latex_engine == 'pdflatex' -%}
+$latex = 'latex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$pdflatex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+{% elif latex_engine == 'lualatex' -%}
+$latex = 'lualatex --output-format=dvi ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$pdflatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+{% elif latex_engine == 'xelatex' -%}
+$latex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$pdflatex = 'xelatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+{% endif -%}
+$lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S';
+$xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S';
+{% if xindy_use -%}
+$makeindex = 'internal xindy ' . $ENV{'XINDYOPTS'} . ' %O -o %D %S';
+sub xindy {
+ my @args = @_;
+ if (-z $args[-1]) {
+ # create an empty .ind file if .idx is empty
+ open(FH, ">" . $args[-2]);
+ close(FH);
+ return 0;
+ } else {
+ return system("xindy", @args);
+ }
+}
+{% else -%}
+$makeindex = 'makeindex -s python.ist %O -o %D %S';
+{% endif -%}
+add_cus_dep( "glo", "gls", 0, "makeglo" );
+sub makeglo {
+ return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" );
+}
diff --git a/sphinx/texinputs/make.bat_t b/sphinx/texinputs/make.bat_t
new file mode 100644
index 0000000..da2805a
--- /dev/null
+++ b/sphinx/texinputs/make.bat_t
@@ -0,0 +1,50 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+pushd %~dp0
+
+{% if latex_engine in ('platex', 'uplatex') -%}
+REM latexmkrc is read then overridden by latexmkjarc
+set PDFLATEX=latexmk -r latexmkjarc -pdfdvi -dvi- -ps-
+{% else -%}
+set PDFLATEX=latexmk -pdf -dvi- -ps-
+{% endif %}
+set "LATEXOPTS= "
+
+{% if xindy_use -%}
+set XINDYOPTS={{ xindy_lang_option }} -M sphinx.xdy
+{% if latex_engine == 'pdflatex' -%}
+set XINDYOPTS=%XINDYOPTS% -M LICRlatin2utf8.xdy
+{% if xindy_cyrillic -%}
+set XINDYOPTS=%XINDYOPTS% -M LICRcyr2utf8.xdy
+{% endif -%}
+{% endif -%}
+{% if xindy_cyrillic -%}
+set XINDYOPTS=%XINDYOPTS% -M LatinRules.xdy
+{% endif -%}
+set XINDYOPTS=%XINDYOPTS% -I xelatex
+{% endif -%}
+
+
+if "%1" == "" goto all-pdf
+
+if "%1" == "all-pdf" (
+ :all-pdf
+ for %%i in (*.tex) do (
+ %PDFLATEX% %LATEXMKOPTS% %%i
+ )
+ goto end
+)
+
+if "%1" == "all-pdf-ja" (
+ goto all-pdf
+)
+
+if "%1" == "clean" (
+ del /q /s *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz *.fls *.fdb_latexmk
+ goto end
+)
+
+:end
+popd
diff --git a/sphinx/texinputs/python.ist b/sphinx/texinputs/python.ist
new file mode 100644
index 0000000..70536a6
--- /dev/null
+++ b/sphinx/texinputs/python.ist
@@ -0,0 +1,16 @@
+line_max 100
+headings_flag 1
+heading_prefix " \\bigletter "
+
+preamble "\\begin{sphinxtheindex}
+\\let\\bigletter\\sphinxstyleindexlettergroup
+\\let\\spxpagem \\sphinxstyleindexpagemain
+\\let\\spxentry \\sphinxstyleindexentry
+\\let\\spxextra \\sphinxstyleindexextra
+
+"
+
+postamble "\n\n\\end{sphinxtheindex}\n"
+
+symhead_positive "{\\sphinxsymbolsname}"
+numhead_positive "{\\sphinxnumbersname}"
diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty
new file mode 100644
index 0000000..6c31f32
--- /dev/null
+++ b/sphinx/texinputs/sphinx.sty
@@ -0,0 +1,1013 @@
+%
+% sphinx.sty
+%
+% Adapted from the old python.sty, mostly written by Fred Drake,
+% by Georg Brandl.
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesPackage{sphinx}[2023/03/19 v6.2.0 LaTeX package (Sphinx markup)]
+
+% provides \ltx@ifundefined
+% (many packages load ltxcmds: graphicx does for pdftex and lualatex but
+% not xelatex, and anyhow kvoptions does, but it may be needed in future to
+% use \sphinxdeprecationwarning earlier, and it needs \ltx@ifundefined)
+\RequirePackage{ltxcmds}
+
+%% for deprecation warnings
+\newcommand\sphinxdeprecationwarning[4]{% #1 the deprecated macro or name,
+% #2 = when deprecated, #3 = when removed, #4 = additional info
+ {% limit scope of \spx@tempa, \AtEndDocument works even if nested.
+ \edef\spx@tempa{\detokenize{#1}}%
+ \ltx@ifundefined{sphinx_depr_\spx@tempa}{%
+ \global\expandafter\let\csname sphinx_depr_\spx@tempa\endcsname\spx@tempa
+ \expandafter\AtEndDocument\expandafter{\expandafter\let\expandafter
+ \sphinxdeprecatedmacro\csname sphinx_depr_\spx@tempa\endcsname
+ \PackageWarningNoLine{sphinx}{^^J**** SPHINX DEPRECATION WARNING:^^J
+ \sphinxdeprecatedmacro^^J
+ \@spaces- is deprecated at Sphinx #2^^J
+ \@spaces- and removed at Sphinx #3.^^J
+ #4^^J****}}%
+ }{% warning already emitted (at end of latex log), don't repeat
+ }%
+ }% end of scope limiting group for \spx@tempa
+}
+%% important build warnings use an undefined reference to induce latexmk
+%% into complaining (once per warning) at very end of console output
+\newcommand\sphinxbuildwarning[1]{%
+ \ifcsname sphinx_emitted_#1\endcsname
+ \else
+ \global\expandafter\let\csname sphinx_emitted_#1\endcsname\@empty
+ \AtEndDocument{\hbox{% should the printing of text be made conditional on
+ % some boolean?
+ \bfseries\color{red}%
+ \@nameuse{sphinx_buildwarning_#1}%
+ % place an undefined reference deliberately
+ \let\nfss@text\@gobble % no ??
+ \ref{!!\@nameuse{sphinx_buildwarning_#1}}%
+ }}%
+ \fi
+}
+\@namedef{sphinx_buildwarning_coloursyntax}{%
+ The colours whose definition used xcolor syntax were set to white
+ as xcolor was not found; check the latex log warnings for details}
+\@namedef{sphinx_buildwarning_colorblend}{%
+ Command \string\sphinxcolorblend\space seen but ignored in tables
+ as xcolor was not found; check the latex log warnings for details}
+\@namedef{sphinx_buildwarning_badtitlesec}{%
+ Your system has titlesec version 2.10.1 which causes disappearance
+ of section numbers; check the latex log warning for details}
+\@namedef{sphinx_buildwarning_booktabs}{%
+ Some tables with booktabs class (check latex log) but booktabs
+ package not loaded; add its loading to the latex preamble}%
+\@namedef{sphinx_buildwarning_badfootnotes}{%
+ Footnote rendering may have had problems, due to extra package or
+ document class; check latex log for instructions}%
+
+
+%% OPTION HANDLING
+%
+
+% We generally first handle options then load packages, but we need
+% \definecolor from xcolor/color to handle the options.
+
+% MEMO: xcolor \fcolorbox coloured boxes render better in some PDF viewers
+% than with color package \fcolorbox. Since 1.6.3, Sphinx uses only its own
+% custom variant of \fcolorbox when handling code-blocks. But \fcolorbox
+% appears also in Pygmentize output mark-up. Also, since 5.3.0, 'sphinxsetup'
+% color options get a richer input syntax if Sphinx knows xcolor is loaded,
+% and the \sphinxcolorblend (for tables) is made available only if xcolor is
+% loaded.
+\IfFileExists{xcolor.sty}{
+% Should Sphinx load xcolor with its dvipsnames and svgnames options?
+ \RequirePackage{xcolor}
+}{
+ \RequirePackage{color}
+}
+
+% the \colorlet of xcolor (if at all loaded) is overkill for most internal use
+\newcommand{\sphinxcolorlet}[2]
+ {\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname
+ \csname\@backslashchar color@#2\endcsname }
+
+% (5.3.0) Allow colour options to use both the \definecolor and the \colorlet
+% syntaxes, for example VerbatimColor={gray}{0.9} or VerbatimColor=red!10
+% In the latter case we need the real \colorlet from xcolor package.
+\def\spx@defineorletcolor#1{%
+ \def\spx@definedcolor{{#1}}%
+ \futurelet\spx@token\spx@defineorlet}
+\def\spx@defineorlet{%
+ \ifx\spx@token\bgroup
+ \expandafter\spx@definecolor\else\expandafter\spx@colorlet\fi}
+\def\spx@colorlet#1\relax{\expandafter\colorlet\spx@definedcolor{#1}}
+\def\spx@definecolor{\expandafter\definecolor\spx@definedcolor}
+%
+\@ifpackageloaded{xcolor}%
+ {}%
+ {% xcolor not loaded because it was not found in the LaTeX installation
+\def\spx@colorlet#1\relax{%
+ \sphinxbuildwarning{coloursyntax}%
+ \PackageWarning{sphinx}{%
+Sorry, the #1 syntax requires package xcolor,\MessageBreak
+which was not found on your TeX/LaTeX installation.\MessageBreak
+\@spaces\expandafter\@firstofone\spx@definedcolor\MessageBreak
+will be set to white}%
+ \expandafter\definecolor\spx@definedcolor{rgb}{1,1,1}%
+ }% end of redefinition of \spx@colorlet
+ }% end of xcolor not found branch
+
+
+% Handle options via "kvoptions" (later loaded by hyperref anyhow)
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix
+
+% Optional usage of booktabs package for tables
+\DeclareBoolOption[false]{booktabs}
+\DeclareBoolOption[false]{borderless}
+\DeclareBoolOption[true]{booktabscolorgaps}
+\DeclareVoidOption{booktabsnogaps}{%
+ \ifx\@nodocument\relax
+ % in body
+ \expandafter\@firstofone
+ \else
+ % in preamble, wait for at begin document
+ \expandafter\AtBeginDocument
+ \fi
+ {\ifdefined\abovetopsep % silently do nothing if booktabs not loaded
+ \abovetopsep\z@\belowrulesep\z@\aboverulesep\z@\belowbottomsep\z@
+ \fi
+ }%
+}
+% Coloured table rows
+\DeclareBoolOption[false]{colorrows}
+% Sphinx legacy text layout: 1in margins on all four sides
+\ifx\@jsc@uplatextrue\@undefined
+\DeclareStringOption[1in]{hmargin}
+\DeclareStringOption[1in]{vmargin}
+\DeclareStringOption[.5in]{marginpar}
+\else
+% Japanese standard document classes handle \mag in a special way
+\DeclareStringOption[\inv@mag in]{hmargin}
+\DeclareStringOption[\inv@mag in]{vmargin}
+\DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar}
+\fi
+
+\DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0}
+\DeclareStringOption[-1]{numfigreset}
+\DeclareBoolOption[false]{nonumfigreset}
+\DeclareBoolOption[false]{mathnumfig}
+\define@key{sphinx}{bookmarksdepth}{\AtBeginDocument{\hypersetup{bookmarksdepth=#1}}}
+\AtBeginDocument{\define@key{sphinx}{bookmarksdepth}{\hypersetup{bookmarksdepth=#1}}}
+% \DeclareBoolOption[false]{usespart}% not used
+% INFO: the keys for padding and border widths were extended at 5.1.0,
+% and legacy names for user interface were kept, but their definitions
+% are delayed further down. The legacy internally used dimen registers
+% \sphinxverbatimborder and \sphinxverbatimsep got removed at 6.2.0.
+\DeclareBoolOption[true]{verbatimwithframe}
+\DeclareBoolOption[true]{verbatimwrapslines}
+\DeclareBoolOption[false]{verbatimforcewraps}
+\DeclareStringOption[3]{verbatimmaxoverfull}
+\DeclareStringOption[100]{verbatimmaxunderfull}
+\DeclareBoolOption[true]{verbatimhintsturnover}
+\DeclareBoolOption[true]{inlineliteralwraps}
+\DeclareStringOption[t]{literalblockcappos}
+\DeclareStringOption[r]{verbatimcontinuedalign}
+\DeclareStringOption[r]{verbatimcontinuesalign}
+% parsed literal
+\DeclareBoolOption[true]{parsedliteralwraps}
+% \textvisiblespace for compatibility with fontspec+XeTeX/LuaTeX
+\DeclareStringOption[\textcolor{red}{\textvisiblespace}]{verbatimvisiblespace}
+\DeclareStringOption % must use braces to hide the brackets
+ [{\makebox[2\fontcharwd\font`\x][r]{\textcolor{red}{\tiny$\m@th\hookrightarrow$}}}]%
+ {verbatimcontinued}
+% topic boxes
+%
+% 5.1.0 added new keys for configuration. The legacy keys shadowsep,
+% shadowsize, shadowrule were kept for backward compatibility. Unfortunately
+% this had bugs due to typos, which got fixed later at 6.1.2.
+%
+% All configuration is now to be found in the "CSS" section below.
+%
+% \sphinxshadowsep, \sphinxshadowsize, \sphinxshadowrule \dimen registers
+% became at 5.1.0 either no-op or, for the latter, were used under an aliased
+% name. They got removed at 6.2.0.
+%
+% notices/admonitions
+%
+% 5.1.0 added much customizability to warning, caution, attention, danger and
+% error types of notices via an enhanced sphinxheavybox environment.
+%
+% 6.2.0 added the possibility to use the same kind of rendering also for
+% note, hint, important, and tip.
+%
+% Legacy user interface for options was kept working. All of it is handled in
+% the "CSS" section below.
+%
+% These 6.2.0 added booleans serve internally. There is no reason for user to
+% know about them, except if it is desired to toggle mid-way in the document
+% whether note, hint, important, and tip should use the "lightbox" or the
+% "heavybox" rendering.
+\DeclareBoolOption[false]{heavynote}
+\DeclareBoolOption[false]{heavyhint}
+\DeclareBoolOption[false]{heavyimportant}
+\DeclareBoolOption[false]{heavytip}
+% footnotes
+\DeclareStringOption[\mbox{ }]{AtStartFootnote}
+% we need a public macro name for direct use in latex file
+\newcommand*{\sphinxAtStartFootnote}{\spx@opt@AtStartFootnote}
+% no such need for this one, as it is used inside other macros
+\DeclareStringOption[\leavevmode\unskip]{BeforeFootnote}
+% some font styling.
+\DeclareStringOption[\sffamily\bfseries]{HeaderFamily}
+% colours
+% same problems as for dimensions: we want the key handler to use \definecolor.
+% first, some colours with no prefix, for backward compatibility
+\newcommand*{\sphinxDeclareColorOption}[2]{%
+ % set the initial default; only \definecolor syntax for defaults!
+ \definecolor{#1}#2%
+ % set the key handler to accept both \definecolor and \colorlet syntax
+ \define@key{sphinx}{#1}{\spx@defineorletcolor{#1}##1\relax}%
+}%
+\sphinxDeclareColorOption{TitleColor}{{rgb}{0.126,0.263,0.361}}
+\sphinxDeclareColorOption{InnerLinkColor}{{rgb}{0.208,0.374,0.486}}
+\sphinxDeclareColorOption{OuterLinkColor}{{rgb}{0.216,0.439,0.388}}
+\sphinxDeclareColorOption{VerbatimColor}{{gray}{0.95}}
+\sphinxDeclareColorOption{VerbatimBorderColor}{{RGB}{32,32,32}}
+% all other colours will be named with a "sphinx" prefix
+\newcommand*{\sphinxDeclareSphinxColorOption}[2]{%
+ % set the initial default; only \definecolor syntax for defaults!
+ \definecolor{sphinx#1}#2%
+ % set the key handler to accept both \definecolor and \colorlet syntax
+ \define@key{sphinx}{#1}{\spx@defineorletcolor{sphinx#1}##1\relax}%
+}%
+% table row colors
+\sphinxDeclareSphinxColorOption{TableRowColorHeader}{{gray}{0.86}}
+\sphinxDeclareSphinxColorOption{TableRowColorOdd}{{gray}{0.92}}
+\sphinxDeclareSphinxColorOption{TableRowColorEven}{{gray}{0.98}}
+% if not set, the "Merge" colour will keep in sync with the "Row" colour
+\def\sphinxTableMergeColorHeader{sphinxTableRowColorHeader}
+\define@key{sphinx}{TableMergeColorHeader}{%
+ \spx@defineorletcolor{sphinxTableMergeColorHeader}#1\relax
+ \def\sphinxTableMergeColorHeader{sphinxTableMergeColorHeader}%
+}%
+\def\sphinxTableMergeColorOdd{sphinxTableRowColorOdd}
+\define@key{sphinx}{TableMergeColorOdd}{%
+ \spx@defineorletcolor{sphinxTableMergeColorOdd}#1\relax
+ \def\sphinxTableMergeColorOdd{sphinxTableMergeColorOdd}%
+}%
+\def\sphinxTableMergeColorEven{sphinxTableRowColorEven}
+\define@key{sphinx}{TableMergeColorEven}{%
+ \spx@defineorletcolor{sphinxTableMergeColorEven}#1\relax
+ \def\sphinxTableMergeColorEven{sphinxTableMergeColorEven}%
+}%
+% Default color chosen to be as in minted.sty LaTeX package!
+\sphinxDeclareSphinxColorOption{VerbatimHighlightColor}{{rgb}{0.878,1,1}}
+% admonition boxes, "light" style
+% border color defaults to black
+% at 6.2.0 also background color is possible, but it then triggers
+% usage of the "sphinxheavybox" from sphinxlatexadmonitions.sty.
+\sphinxDeclareSphinxColorOption{noteBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{hintBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{importantBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{tipBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{noteBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{hintBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{importantBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{tipBgColor}{{rgb}{1,1,1}}
+% admonition boxes, "heavy" style
+% border color defaults to black and background color to white
+% As long as the color are not explicitly set via user options,
+% the sphinxpackageboxes.sty code will actually not use them anyhow.
+\sphinxDeclareSphinxColorOption{warningBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{cautionBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{attentionBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{dangerBorderColor}{{rgb}{0,0,0}}
+\sphinxDeclareSphinxColorOption{errorBorderColor}{{rgb}{0,0,0}}
+% BgColor should have been from the start BackgroundColor for better
+% match with CSS property names, but this is legacy interface
+% which is too late to change because the internal color names
+% and not only the option names have been documented at user level.
+\sphinxDeclareSphinxColorOption{warningBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{cautionBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{attentionBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{dangerBgColor}{{rgb}{1,1,1}}
+\sphinxDeclareSphinxColorOption{errorBgColor}{{rgb}{1,1,1}}
+%%%%%%%%
+%
+% Additions of CSS-like keys at 5.1.0 (and possibility of rounded boxes)
+% -----------------------------------
+%
+% These CSS-named alikes allow to configure 4 border widths, 4 padding seps, 4
+% corner radii, optional shadow, border color, background color, shadow color.
+%
+% In future, an alternative user interface will perhaps be provided to parse
+% genuine CSS, but this will be easier to do in Python than in LaTeX.
+%
+% Refactoring (and extension) at 6.2.0
+% ------------------------------------
+%
+% 6.2.0 batch defines in one go all auxiliaries for code-blocks, topics, and
+% admonitions. The needed steps to maintain the legacy option names working
+% and to set some specific defaults are handled in a second step.
+%
+% This allowed to:
+%
+% - associate these CSS-named options also to note, hint, important, and tip
+% which thus can access the full customizability of sphinxheavybox if they use
+% it.
+%
+% - provide a \sphinxbox command for boxing inline text elements with the same
+% full customizability.
+%
+% The \dimen's \sphinxverbatimborder, \sphinxverbatimsep, \sphinxshadowsep,
+% \sphinxshadowsize, and \sphinxshadowrule, which had been deprecated have
+% finally been removed entirely. No more \dimen register is used here only
+% storage in macros.
+%
+\def\spxstring@none{none}
+\def\spxstring@clone{clone}
+%
+% Border keys
+%
+\def\spx@tempa#1{% #1 = macro prefix
+ \expandafter\spx@tempb
+ \csname #1border\expandafter\endcsname
+ \csname #1border@top\expandafter\endcsname
+ \csname #1border@right\expandafter\endcsname
+ \csname #1border@bottom\expandafter\endcsname
+ \csname #1border@left\expandafter\endcsname
+ \csname if#1border@open\expandafter\endcsname
+ \csname #1border@opentrue\expandafter\endcsname
+ \csname #1border@openfalse\endcsname
+}%
+\def\spx@tempb #1#2#3#4#5#6#7#8#9{% #9 = option prefix
+ \define@key{sphinx}{#9border-top-width}{\def#2{##1}}%
+ \define@key{sphinx}{#9border-right-width}{\def#3{##1}}%
+ \define@key{sphinx}{#9border-bottom-width}{\def#4{##1}}%
+ \define@key{sphinx}{#9border-left-width}{\def#5{##1}}%
+ \define@key{sphinx}{#9border-width}{%
+ \def#1{##1}% MEMO: not immediately expanded, should this be changed?
+ \def#2{#1}\let#3#2\let#4#2\let#5#2%
+ }%
+ \newif#6%
+ \define@key{sphinx}{#9box-decoration-break}%
+ {\begingroup\edef\spx@tempa{##1}\expandafter\endgroup
+ \ifx\spx@tempa\spxstring@clone#8\else#7\fi}%
+ \spx@tempc{#9}% option prefix
+}
+\def\spx@tempc #1#2{% #1 = option prefix, #2 = legacy option name
+ % keep legacy option names as aliases to new-named options
+ \expandafter\let\csname KV@sphinx@#2\expandafter\endcsname
+ \csname KV@sphinx@#1border-width\endcsname
+ % init border-width (fetches next argument)
+ \csname KV@sphinx@#1border-width\endcsname
+}
+% MEMO: prior to 6.2.0 the \fboxrule value (0.4pt, a priori) was frozen here via
+% a \dimen assignment done immediately. Now it remains \fboxrule until being used.
+% macro prefix option prefix legacy option init value
+\spx@tempa{spx@pre@} {pre_} {verbatimborder} \fboxrule
+\spx@tempa{spx@topic@} {div.topic_} {shadowrule} \fboxrule
+\spx@tempa{spx@note@} {div.note_} {noteborder} {0.5pt}
+\spx@tempa{spx@hint@} {div.hint_} {hintborder} {0.5pt}
+\spx@tempa{spx@important@}{div.important_}{importantborder}{0.5pt}
+\spx@tempa{spx@tip@} {div.tip_} {tipborder} {0.5pt}
+\spx@tempa{spx@warning@} {div.warning_} {warningborder} {1pt}
+\spx@tempa{spx@caution@} {div.caution_} {cautionborder} {1pt}
+\spx@tempa{spx@attention@}{div.attention_}{attentionborder}{1pt}
+\spx@tempa{spx@danger@} {div.danger_} {dangerborder} {1pt}
+\spx@tempa{spx@error@} {div.error_} {errorborder} {1pt}
+% this one new at 6.2.0: (we do not create a "legacy name" for it)
+\spx@tempa{spx@box@} {box_} {box_border-width}\fboxrule
+% Set default box-decoration-break style for codeblocks to slice
+\spx@pre@border@opentrue % new default at 6.0.0: slice, not clone
+% 6.2.0 has added support for box-decoration-break=slice to all
+% other directives, formerly the option setting was ignored for them.
+
+% Padding keys
+%
+\def\spx@tempa#1{%
+ \expandafter\spx@tempb
+ \csname #1padding\expandafter\endcsname
+ \csname #1padding@top\expandafter\endcsname
+ \csname #1padding@right\expandafter\endcsname
+ \csname #1padding@bottom\expandafter\endcsname
+ \csname #1padding@left\endcsname
+}%
+\def\spx@tempb #1#2#3#4#5#6{% #6 = option prefix
+ \define@key{sphinx}{#6padding-top}{\def#2{##1}}%
+ \define@key{sphinx}{#6padding-right}{\def#3{##1}}%
+ \define@key{sphinx}{#6padding-bottom}{\def#4{##1}}%
+ \define@key{sphinx}{#6padding-left}{\def#5{##1}}%
+ \define@key{sphinx}{#6padding}{%
+ \def#1{##1}%
+ \def#2{#1}\let#3#2\let#4#2\let#5#2%
+ }%
+ % initialization (will fetch "init" argument next):
+ \csname KV@sphinx@#6padding\endcsname
+}
+% MEMO: prior to 6.2.0 the \fboxsep value (3pt, a priori) was frozen here via
+% a \dimen assignment done immediately. Now it remains \fboxsep until being used.
+% #1 macro prefix #6 option prefix init value
+\spx@tempa{spx@pre@} {pre_} \fboxsep
+\spx@tempa{spx@topic@} {div.topic_} {5pt}
+% MEMO: prior to 6.2.0, "note" type admonitions used sphinxlightbox automatically
+% and had no interface to set the padding parameters needed by sphinxheavybox.
+% At 6.2.0 they acquired such interface and the default is set as for legacy
+% default of "warning" type. I hesitated using \fboxsep, but if I did I would
+% then need to explain how to change "note etc..." into behaving exactly
+% as "warning etc...", which goes via the \dimexpr here which is too scary to
+% put sanely into documentation.
+\spx@tempa{spx@note@} {div.note_} {\dimexpr.6\baselineskip-\spx@note@border\relax}
+\spx@tempa{spx@hint@} {div.hint_} {\dimexpr.6\baselineskip-\spx@hint@border\relax}
+\spx@tempa{spx@important@}{div.important_} {\dimexpr.6\baselineskip-\spx@important@border\relax}
+\spx@tempa{spx@tip@} {div.tip_} {\dimexpr.6\baselineskip-\spx@tip@border\relax}
+% MEMO: prior to 5.1.0 padding was not separately customizable from border
+% width for warning type admonitions. The below keeps the legacy behavior of a
+% constant borderwidth+padding. The dim expression is not evaluated yet, only
+% at time of use (so that it dynamically adapts to the border width setting).
+% MEMO: I could use everywhere \spx@notice@border, as sphinxadmonition environment
+% configures it to hold the \spx@<type>@border value.
+\spx@tempa{spx@warning@} {div.warning_} {\dimexpr.6\baselineskip-\spx@warning@border\relax}
+\spx@tempa{spx@caution@} {div.caution_} {\dimexpr.6\baselineskip-\spx@caution@border\relax}
+\spx@tempa{spx@attention@}{div.attention_} {\dimexpr.6\baselineskip-\spx@attention@border\relax}
+\spx@tempa{spx@danger@} {div.danger_} {\dimexpr.6\baselineskip-\spx@danger@border\relax}
+\spx@tempa{spx@error@} {div.error_} {\dimexpr.6\baselineskip-\spx@error@border\relax}
+\spx@tempa{spx@box@} {box_} \fboxsep
+% define legacy verbatimsep key as alias of pre_padding key
+\expandafter\let\expandafter\KV@sphinx@verbatimsep\csname KV@sphinx@pre_padding\endcsname
+% define legacy shadowsep key as alias of div.topic_padding key
+\expandafter\let\expandafter\KV@sphinx@shadowsep\csname KV@sphinx@div.topic_padding\endcsname
+
+% Corner radii keys
+%
+% Prior to 6.2.0, the "rounded box" branch obeyed the 4 radii but ignored
+% the separate border widths and used only the border-width setting.
+% Now, all 4 + 4 parameters are obeyed.
+\def\spx@tempa#1{% #1 = macro prefix
+ \expandafter\spx@tempb
+ \csname #1radius@topleft\expandafter\endcsname
+ \csname #1radius@topright\expandafter\endcsname
+ \csname #1radius@bottomright\expandafter\endcsname
+ \csname #1radius@bottomleft\endcsname
+}%
+\def\spx@tempb #1#2#3#4#5{% #5 = option prefix
+ \define@key{sphinx}{#5border-top-left-radius}{\def#1{##1}}%
+ \define@key{sphinx}{#5border-top-right-radius}{\def#2{##1}}%
+ \define@key{sphinx}{#5border-bottom-right-radius}{\def#3{##1}}%
+ \define@key{sphinx}{#5border-bottom-left-radius}{\def#4{##1}}%
+ \define@key{sphinx}{#5border-radius}{\def#1{##1}\let#2#1\let#3#1\let#4#1}%
+ \csname KV@sphinx@#5border-radius\endcsname % fetches next argument
+}
+% The init value for corner radius in code-blocks was \z@ (i.e. 0pt) prior
+% to 6.0.0., then 3pt, then \fboxsep at 6.2.0 as padding is \fboxsep,
+% and \fboxsep=3pt per default (also with platex).
+% macro prefix option prefix init value
+\spx@tempa{spx@pre@} {pre_} \fboxsep
+\spx@tempa{spx@topic@} {div.topic_} \z@
+\spx@tempa{spx@note@} {div.note_} \z@
+\spx@tempa{spx@hint@} {div.hint_} \z@
+\spx@tempa{spx@important@}{div.important_} \z@
+\spx@tempa{spx@tip@} {div.tip_} \z@
+\spx@tempa{spx@warning@} {div.warning_} \z@
+\spx@tempa{spx@caution@} {div.caution_} \z@
+\spx@tempa{spx@attention@}{div.attention_} \z@
+\spx@tempa{spx@danger@} {div.danger_} \z@
+\spx@tempa{spx@error@} {div.error_} \z@
+\spx@tempa{spx@box@} {box_} \fboxsep
+
+% Shadow keys
+%
+% Prior to 6.2.0, an "inset" shadow caused the rendering to ignore
+% rounded corners. Starting with 6.2.0, an "inset" shadow is simply
+% ignored (not implemented) if any of the corner radii is positive,
+% rather than forcing a rectangle+inset shadow output.
+\def\spx@tempa#1{%
+ \expandafter\spx@tempb
+ \csname if#1withshadow\expandafter\endcsname
+ \csname if#1insetshadow\endcsname
+}%
+\def\spx@tempb#1#2{\newif#1\newif#2}%
+% macro prefix
+\spx@tempa{spx@pre@}
+\spx@tempa{spx@topic@}
+\spx@tempa{spx@note@}
+\spx@tempa{spx@hint@}
+\spx@tempa{spx@important@}
+\spx@tempa{spx@tip@}
+\spx@tempa{spx@warning@}
+\spx@tempa{spx@caution@}
+\spx@tempa{spx@attention@}
+\spx@tempa{spx@danger@}
+\spx@tempa{spx@error@}
+\spx@tempa{spx@box@}
+%
+\def\spx@tempa#1{% #1 = macro prefix
+ \expandafter\spx@tempb
+ \csname #1withshadowtrue\expandafter\endcsname
+ \csname #1withshadowfalse\expandafter\endcsname
+ \csname #1insetshadowtrue\expandafter\endcsname
+ \csname #1insetshadowfalse\expandafter\endcsname
+ \csname #1shadow@setter\expandafter\endcsname
+ \csname #1shadow@xoffset\expandafter\endcsname
+ \csname #1shadow@yoffset\endcsname
+}%
+\def\spx@tempb#1#2#3#4#5#6#7#8{% #8 = option prefix
+ \define@key{sphinx}{#8box-shadow}{#5##1 {} {} \@nnil}%
+ \def#5##1 ##2 ##3 ##4\@nnil{%
+ \begingroup\edef\spx@tempa{##1}\expandafter\endgroup
+ \ifx\spx@tempa\spxstring@none
+ #2%
+ % MEMO: at 5.1.0 and up to 6.2.0, an \edef with \number\dimexpr was
+ % used here. Since 6.2.0, expansion is delayed to time of use as for
+ % the other dimensions handled above. This is synched with an added
+ % encapsulation in \dimexpr...\relax by the "setup" from
+ % sphinxpackageboxes.sty. An induced regression had to be fixed in
+ % the sphinxShadowBox environment as it was using in an \ifdim the
+ % \spx@topic@shadow@yoffset macro, now holding by default 4pt+\z@
+ % rather than an already digested 262144sp. The +\z@ is in case ##2
+ % is empty.
+ \else #1%
+ \def#6{##1}\def#7{##2+\z@}%
+ \if\relax\detokenize{##3}\relax#4\else#3\fi
+ \fi
+ }%
+ #5none {} {} \@nnil % no shadow by default (except for topic, see below)
+}
+\spx@tempa{spx@pre@} {pre_}
+\spx@tempa{spx@topic@} {div.topic_}
+% This corresponds to the legacy parameters of ShadowBox
+ \spx@topic@shadow@setter 4pt 4pt {} \@nnil
+\spx@tempa{spx@note@} {div.note_}
+\spx@tempa{spx@hint@} {div.hint_}
+\spx@tempa{spx@important@}{div.important_}
+\spx@tempa{spx@tip@} {div.tip_}
+\spx@tempa{spx@warning@} {div.warning_}
+\spx@tempa{spx@caution@} {div.caution_}
+\spx@tempa{spx@attention@}{div.attention_}
+\spx@tempa{spx@danger@} {div.danger_}
+\spx@tempa{spx@error@} {div.error_}
+\spx@tempa{spx@box@} {box_}
+
+% Support for legacy shadowsize (topic/contents)
+% This definition was broken due to a typo at 5.1.0 and got fixed at 6.1.2
+% MEMO: at 6.2.0 this no longer does \number\dimexpr in an \edef. Reason is to
+% keep in sync with div.topic_box-shadow handling of xoffset and yoffset.
+% Attention in particular to \ifdim context, we add a \dimexpr to the one here.
+\define@key{sphinx}{shadowsize}{%
+ \def\spx@topic@shadow@xoffset{#1}%
+ \let\spx@topic@shadow@yoffset\spx@topic@shadow@xoffset
+ \ifdim\dimexpr\spx@topic@shadow@xoffset=\z@
+ \spx@topic@withshadowfalse
+ \else
+ \spx@topic@withshadowtrue
+ \spx@topic@insetshadowfalse
+ \fi
+}%
+
+% Color keys
+% (four of them: border, background, shadow and the text color)
+%
+% Some problems due to legacy naming scheme which had diverging conventions
+% for code-blocks (VerbatimBorderColor, VerbatimColor) and admonitions
+% (sphinxwarningBorderColor, sphinxwarningBgColor, etc...) regarding the
+% internal names of the used colors. Unfortunately VerbatimColor and for
+% example sphinxwarningBgColor are also documented at user level, they are not
+% only internally used.
+%
+% For topic directive, "legacy" (by this I mean Sphinx around 2016-2017 after
+% my first additions to LaTeX) had no interface for colors, so I could change
+% some internals with no breakage during 5.x up to 6.2.0. So topic
+% (shadowbox) could be unified with admonitions (sphinxheavybox), and the
+% "set-up" macros could all be moved into a single one in the
+% sphinxpackageboxes.sty file, with only one argument holding the directive
+% type.
+%
+% It was then needed only for sphinxlatexliterals.sty to let its
+% \spx@verb@boxes@fcolorbox@setup incorporate some extra adjustment.
+%
+% We associate a boolean to each color, so that the box code can
+% decide to insert a \color command or consider it is not needed.
+\def\spx@tempa#1{%
+ \expandafter\spx@tempb
+ \csname if#1withshadowcolor\expandafter\endcsname
+ \csname if#1withbordercolor\expandafter\endcsname
+ \csname if#1withbackgroundcolor\expandafter\endcsname
+ \csname if#1withtextcolor\endcsname
+}%
+\def\spx@tempb#1#2#3#4{\newif#1\newif#2\newif#3\newif#4}%
+% macro prefix
+\spx@tempa{spx@pre@}
+\spx@tempa{spx@topic@}
+\spx@tempa{spx@note@}
+\spx@tempa{spx@hint@}
+\spx@tempa{spx@important@}
+\spx@tempa{spx@tip@}
+\spx@tempa{spx@warning@}
+\spx@tempa{spx@caution@}
+\spx@tempa{spx@attention@}
+\spx@tempa{spx@danger@}
+\spx@tempa{spx@error@}
+\spx@tempa{spx@box@}
+%
+\def\spx@tempa#1{% #1 = macro prefix
+ \expandafter\spx@tempb
+ \csname #1withbordercolortrue\expandafter\endcsname
+ \csname #1withbackgroundcolortrue\expandafter\endcsname
+ \csname #1withshadowcolortrue\expandafter\endcsname
+ \csname #1withtextcolortrue\endcsname
+}
+\def\spx@tempb#1#2#3#4#5#6{% #5 = option prefix, #6 = color name prefix
+ \define@key{sphinx}{#5border-TeXcolor}%
+ {#1\spx@defineorletcolor{#6BorderColor}##1\relax}%
+ \define@key{sphinx}{#5background-TeXcolor}%
+ {#2\spx@defineorletcolor{#6BgColor}##1\relax}%
+ \define@key{sphinx}{#5box-shadow-TeXcolor}%
+ {#3\spx@defineorletcolor{#6ShadowColor}##1\relax}%
+ \define@key{sphinx}{#5TeXcolor}%
+ {#4\spx@defineorletcolor{#6TextColor}##1\relax}%
+}
+% macro prefix option prefix color name prefix
+\spx@tempa{spx@pre@} {pre_} {Verbatim}
+ % (memo: internal VerbatimShadowColor was formerly sphinxVerbatimShadowColor)
+ % internal legacy color name is VerbatimColor not VerbatimBgColor, so redefine:
+ \define@key{sphinx}{pre_background-TeXcolor}%
+ {\spx@pre@withbackgroundcolortrue\spx@defineorletcolor{VerbatimColor}#1\relax}%
+ \spx@pre@withbordercolortrue % 6.0.0 VerbatimBorderColor {RGB}{32,32,32}
+ \spx@pre@withbackgroundcolortrue % 6.0.0 VerbatimColor {gray}{0.95}
+ % Keep legacy option names working
+ \expandafter\let\expandafter\KV@sphinx@VerbatimBorderColor
+ \csname KV@sphinx@pre_border-TeXcolor\endcsname
+ \expandafter\let\expandafter\KV@sphinx@VerbatimColor
+ \csname KV@sphinx@pre_background-TeXcolor\endcsname
+% (6.2.0 modified some internal namings for the colors of topic boxes)
+% macro prefix option prefix color name prefix
+\spx@tempa{spx@topic@} {div.topic_} {sphinxtopic}% (no legacy interface)
+\spx@tempa{spx@note@} {div.note_} {sphinxnote}
+\spx@tempa{spx@hint@} {div.hint_} {sphinxhint}
+\spx@tempa{spx@important@}{div.important_} {sphinximportant}
+\spx@tempa{spx@tip@} {div.tip_} {sphinxtip}
+\spx@tempa{spx@warning@} {div.warning_} {sphinxwarning}
+\spx@tempa{spx@caution@} {div.caution_} {sphinxcaution}
+\spx@tempa{spx@attention@}{div.attention_} {sphinxattention}
+\spx@tempa{spx@danger@} {div.danger_} {sphinxdanger}
+\spx@tempa{spx@error@} {div.error_} {sphinxerror}
+\spx@tempa{spx@box@} {box_} {sphinxbox}
+ % Keep legacy sphinxsetup color options interface for "strong" admonitions
+ \def\spx@tempa#1#2{% #1 = option prefix, #2 = legacy option prefix
+ \expandafter\let\csname KV@sphinx@#2BorderColor\expandafter\endcsname
+ \csname KV@sphinx@#1border-TeXcolor\endcsname
+ \expandafter\let\csname KV@sphinx@#2BgColor\expandafter\endcsname
+ \csname KV@sphinx@#1background-TeXcolor\endcsname
+ }
+ \spx@tempa{div.warning_} {warning}
+ \spx@tempa{div.caution_} {caution}
+ \spx@tempa{div.attention_} {attention}
+ \spx@tempa{div.danger_} {danger}
+ \spx@tempa{div.error_} {error}
+
+ % Keep legacy sphinxsetup <type>BorderColor for <type>=note, hint, ...
+ % which will not trigger sphinxheavybox
+ % Add "legacy" hintTextColor etc... that will not trigger sphinxheavybox
+ \def\spx@tempa#1#2{% #1 = CSS like option prefix, #2 = legacy option prefix
+ \expandafter\let\csname KV@sphinx@#2BorderColor\expandafter\endcsname
+ \csname KV@sphinx@#1border-TeXcolor\endcsname
+ \expandafter\let\csname KV@sphinx@#2TextColor\expandafter\endcsname
+ \csname KV@sphinx@#1TeXcolor\endcsname
+ }
+ \spx@tempa{div.note_} {note}
+ \spx@tempa{div.hint_} {hint}
+ \spx@tempa{div.important_} {important}
+ \spx@tempa{div.tip_} {tip}
+
+% The TeXextras key
+%
+\def\spx@tempa#1{% #1 = macro prefix
+ \expandafter\spx@tempb\csname #1TeXextras\endcsname
+}
+\def\spx@tempb#1#2{% #2 = option prefix
+ \define@key{sphinx}{#2TeXextras}{\def#1{##1}}%
+}
+% macro prefix option prefix
+\spx@tempa{spx@pre@} {pre_}
+\spx@tempa{spx@topic@} {div.topic_}
+\spx@tempa{spx@note@} {div.note_}
+\spx@tempa{spx@hint@} {div.hint_}
+\spx@tempa{spx@important@}{div.important_}
+\spx@tempa{spx@tip@} {div.tip_}
+\spx@tempa{spx@warning@} {div.warning_}
+\spx@tempa{spx@caution@} {div.caution_}
+\spx@tempa{spx@attention@}{div.attention_}
+\spx@tempa{spx@danger@} {div.danger_}
+\spx@tempa{spx@error@} {div.error_}
+\spx@tempa{spx@box@} {box_}
+ % Add "legacy" hintTeXextras etc... that will not trigger sphinxheavybox
+ \def\spx@tempa#1#2{% #1 = CSS like option prefix, #2 = legacy option prefix
+ \expandafter\let\csname KV@sphinx@#2TeXextras\expandafter\endcsname
+ \csname KV@sphinx@#1TeXextras\endcsname
+ }
+ \spx@tempa{div.note_} {note}
+ \spx@tempa{div.hint_} {hint}
+ \spx@tempa{div.important_} {important}
+ \spx@tempa{div.tip_} {tip}
+
+% For note type admonitions, redefine all CSS-like named options to trigger
+% the "heavybox" path.
+%
+% MEMO: the noteBorderColor and noteborder legacy options have already been
+% re-created and they do not trigger the "heavybox" as their meaning will not
+% be modified in the loop below contrarily to their CSS counterparts
+% div.note_border-TeXcolor and div.note_border-width, and to the noteBgColor
+% etc... which are handled below.
+%
+% This goes via rather hardcore TeX here.
+\def\spx@tempa#1{\if\relax#1\expandafter\@gobble
+ \else
+ \toks@{##1}%
+ \expandafter\def\csname KV@sphinx@div.note_#1\expandafter\endcsname
+ \the\toks0\expandafter{%
+ \csname spx@opt@heavynotetrue\expandafter\expandafter\expandafter\endcsname
+ \csname KV@sphinx@div.note_#1\endcsname{##1}}%
+ \expandafter\def\csname KV@sphinx@div.hint_#1\expandafter\endcsname
+ \the\toks0\expandafter{%
+ \csname spx@opt@heavyhinttrue\expandafter\expandafter\expandafter\endcsname
+ \csname KV@sphinx@div.hint_#1\endcsname{##1}}%
+ \expandafter\def\csname KV@sphinx@div.important_#1\expandafter\endcsname
+ \the\toks0\expandafter{%
+ \csname spx@opt@heavyimportanttrue\expandafter\expandafter\expandafter\endcsname
+ \csname KV@sphinx@div.important_#1\endcsname{##1}}%
+ \expandafter\def\csname KV@sphinx@div.tip_#1\expandafter\endcsname
+ \the\toks0\expandafter{%
+ \csname spx@opt@heavytiptrue\expandafter\expandafter\expandafter\endcsname
+ \csname KV@sphinx@div.tip_#1\endcsname{##1}}%
+ \fi
+ \spx@tempa
+}
+\spx@tempa{border-width}%
+ {border-top-width}{border-right-width}{border-bottom-width}{border-left-width}%
+ {box-decoration-break}%
+ {padding}%
+ {padding-top}{padding-right}{padding-bottom}{padding-left}%
+ {border-radius}%
+ {border-top-left-radius}{border-top-right-radius}%
+ {border-bottom-right-radius}{border-bottom-left-radius}%
+ {box-shadow}%
+ {border-TeXcolor}{background-TeXcolor}{box-shadow-TeXcolor}{TeXcolor}%
+ {TeXextras}%
+\relax
+
+% Now we add at 6.2.0 <type>BgColor et al. options which will trigger the
+% "heavybox" as they are \let to the div.<type>_background-TeXColor option
+% which has already been enhanced to set the boolean for rendering via
+% "heavybox". This is in contrast with legacy <type>BorderColor,
+% and with the new <type>TeXcolor and <type>TeXextras.
+ \def\spx@tempa#1#2{% #1 = CSS like option prefix, #2 = legacy style option prefix
+ \expandafter\let\csname KV@sphinx@#2BgColor\expandafter\endcsname
+ \csname KV@sphinx@#1background-TeXcolor\endcsname
+ }
+ \spx@tempa{div.note_} {note}
+ \spx@tempa{div.hint_} {hint}
+ \spx@tempa{div.important_} {important}
+ \spx@tempa{div.tip_} {tip}
+
+\newif\ifspx@opt@box@addstrut
+\expandafter\def\csname KV@sphinx@box_addstrut\endcsname#1{%
+ \csname spx@opt@box@addstrut#1\endcsname
+}
+\expandafter\def\csname KV@sphinx@box_addstrut@default\endcsname{%
+ \spx@opt@box@addstruttrue
+}
+
+\DeclareDefaultOption{\@unknownoptionerror}
+\ProcessKeyvalOptions*
+% don't allow use of maxlistdepth via \sphinxsetup.
+\DisableKeyvalOption{sphinx}{maxlistdepth}
+\DisableKeyvalOption{sphinx}{numfigreset}
+\DisableKeyvalOption{sphinx}{nonumfigreset}
+\DisableKeyvalOption{sphinx}{mathnumfig}
+\DisableKeyvalOption{sphinx}{booktabs}
+\DisableKeyvalOption{sphinx}{borderless}
+\DisableKeyvalOption{sphinx}{rowcolors}
+% FIXME: this is unrelated to an option, move this elsewhere
+% To allow hyphenation of first word in narrow contexts; no option,
+% customization to be done via 'preamble' key
+\newcommand*\sphinxAtStartPar{\leavevmode\nobreak\hskip\z@skip}
+% No need for the \hspace{0pt} trick (\hskip\z@skip) with luatex
+\ifdefined\directlua\let\sphinxAtStartPar\@empty\fi
+% user interface: options can be changed midway in a document!
+\newcommand\sphinxsetup{\setkeys{sphinx}}
+
+
+%% MISCELLANEOUS CONTEXT
+%
+% flag to be set in a framed environment
+% (defined here as currently needed by three sphinxlatex....sty files and
+% even if not needed if such files are replaced, the definition does no harm)
+\newif\ifspx@inframed
+%
+% \spx@ifcaptionpackage (defined at begin document)
+% is needed currently in macros from:
+% sphinxlatexliterals.sty (sphinxVerbatim)
+% sphinxlatextables.sty (for some macros used in the table templates)
+%
+% \sphinxcaption is mark-up injected by the tabular and tabulary templates
+% it is defined in sphinxlatextables.sty
+%
+% store the original \caption macro for usage with figures inside longtable
+% and tabulary cells. Make sure we get the final \caption in presence of
+% caption package, whether the latter was loaded before or after sphinx.
+\AtBeginDocument{%
+ \let\spx@originalcaption\caption
+ \@ifpackageloaded{caption}
+ {\let\spx@ifcaptionpackage\@firstoftwo
+ \caption@AtBeginDocument*{\let\spx@originalcaption\caption}%
+% in presence of caption package, drop our own \sphinxcaption whose aim was to
+% ensure same width of caption to all kinds of tables (tabular(y), longtable),
+% because caption package has its own width (or margin) option
+ \def\sphinxcaption{\caption}%
+ }%
+ {\let\spx@ifcaptionpackage\@secondoftwo}%
+}
+
+%% PASS OPTIONS
+%
+% pass options to hyperref; it must not have been loaded already
+\input{sphinxoptionshyperref.sty}
+% pass options to geometry; it must not have been loaded already
+\input{sphinxoptionsgeometry.sty}
+
+
+%% COLOR (general)
+%
+% FIXME: these two should be deprecated
+%
+% FIXME: \normalcolor should be used and \py@NormalColor never defined
+\def\py@NormalColor{\color{black}}
+% FIXME: \color{TitleColor} should be used directly and \py@TitleColor
+% should never get defined.
+\def\py@TitleColor{\color{TitleColor}}
+
+
+%% PACKAGES
+%
+% as will be indicated below, secondary style files load some more packages
+%
+% For \text macro (sphinx.util.texescape)
+% also for usage of \firstchoice@true(false) in sphinxlatexgraphics.sty
+\RequirePackage{amstext}
+% It was passed "warn" option from latex template in case it is already loaded
+% via some other package before \usepackage{sphinx} in preamble
+\RequirePackage{textcomp}
+% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code
+% for allowing figures in tables.
+\RequirePackage{float}
+% For floating figures in the text. Better to load after float.
+\RequirePackage{wrapfig}
+% Provides \captionof, used once by latex writer (\captionof{figure})
+\RequirePackage{capt-of}
+% Support hlist directive
+\RequirePackage{multicol}
+
+
+%% GRAPHICS
+%
+% It will always be needed, so let's load it here
+\RequirePackage{graphicx}
+\input{sphinxlatexgraphics.sty}
+
+
+%% FRAMED ENVIRONMENTS
+%
+% \sphinxbox added at 6.2.0, its definition is in sphinxpackageboxes.
+%
+% Alias all \sphinxsetup "box_" keys to become \sphinxboxsetup no-prefix keys
+\@tfor\x:={border-width}%
+ {border-top-width}{border-right-width}{border-bottom-width}{border-left-width}%
+ {box-decoration-break}% This one is actually useless, as \sphinxbox
+ % creates an unbreakable horizontal box, not a breakable vertical
+ % box. And as is well-known it is very complicated (not to say
+ % impossible) to create in LaTeX breakable horizontal boxes. No
+ % package offers them. See the complications for the support of
+ % verbatimforcewraps in sphinxlatexliterals.sty or see the source
+ % code of the soul or soulutf8 packages.
+ {padding}%
+ {padding-top}{padding-right}{padding-bottom}{padding-left}%
+ {border-radius}%
+ {border-top-left-radius}{border-top-right-radius}%
+ {border-bottom-right-radius}{border-bottom-left-radius}%
+ {box-shadow}%
+ {border-TeXcolor}{background-TeXcolor}{box-shadow-TeXcolor}{TeXcolor}%
+ {TeXextras}{addstrut}{addstrut@default}%
+\do{\expandafter\let\csname KV@sphinxbox@\x\expandafter\endcsname
+ \csname KV@sphinx@box_\x\endcsname}
+% Let \sphinxboxsetup also prepare a "reset", which will be used by nested
+% boxes; currently and by laziness this is implemented simply by accumulating
+% all passed options inside some storage, in the order they were given, rather
+% than saving the box would-be parameters. Advantage is that this will not
+% have to be modified if additional keys are added in future (e.g. for
+% elliptic corners). Storing obeys TeX groups. (these details would be
+% relevant only for some genuine independent LaTeX package and manual user
+% authored mark-up, not Sphinx auto mark-up).
+\newcommand\sphinxboxsetup[1]{%
+ \setkeys{sphinxbox}{#1}%
+ \expandafter\def\expandafter\spx@boxes@sphinxbox@defaults\expandafter
+ {\spx@boxes@sphinxbox@defaults,#1}%
+}
+\def\spx@boxes@sphinxbox@reset{%
+ \begingroup\def\x{\endgroup\setkeys{sphinxbox}}%
+ \expandafter\x\expandafter{\spx@boxes@sphinxbox@defaults}%
+}
+% Some of these defaults got already set. But we now list them all explicitly
+% for a complete initial configuration of reset storage.
+%
+\let\spx@boxes@sphinxbox@defaults\@gobble
+\sphinxboxsetup{%
+ border-width=\fboxrule,% <-not really needed to avoid EOL space
+ padding=\fboxsep,% but done here out of habit
+ border-radius=\fboxsep,%
+ box-shadow=none,%
+% As xcolor is perhaps not loaded we can not use background-TeXcolor=VerbatimColor
+% which would not be compatible with \definecolor syntax.
+ border-TeXcolor={RGB}{32,32,32},% the default VerbatimBorderColor
+ background-TeXcolor={gray}{0.95},% the default VerbatimColor
+ box-shadow-TeXcolor={rgb}{0,0,0},%
+ TeXextras={},%
+ addstrut=false% (a final comma here would not hurt)
+ }%
+\RequirePackage{sphinxpackageboxes}
+\input{sphinxlatexadmonitions.sty}
+\input{sphinxlatexliterals.sty}
+\input{sphinxlatexshadowbox.sty}
+
+
+%% CONTAINERS
+%
+\input{sphinxlatexcontainers.sty}
+
+
+%% PYGMENTS
+% stylesheet for highlighting with pygments
+\RequirePackage{sphinxhighlight}
+
+
+%% TABLES
+%
+\input{sphinxlatextables.sty}
+
+
+%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS
+%
+\input{sphinxlatexnumfig.sty}
+
+
+%% LISTS
+%
+\input{sphinxlatexlists.sty}
+
+
+%% FOOTNOTES
+%
+% Support scopes for footnote numbering
+% This is currently stepped at each input file
+\newcounter{sphinxscope}
+\newcommand{\sphinxstepscope}{\stepcounter{sphinxscope}}
+% We ensure \thesphinxscope expands to digits tokens, independently of language
+\renewcommand{\thesphinxscope}{\number\value{sphinxscope}}
+\newcommand\sphinxthefootnotemark[2]{%
+ % this is used to make reference to an explicitly numbered footnote not on same page
+ % #1=label of footnote text, #2=page number where footnote text was printed
+ \ifdefined\pagename
+ \pagename\space#2, % <- space
+ \else
+ p. #2, % <- space
+ \fi #1% no space
+}
+% support large numbered footnotes in minipage; but this is now obsolete
+% from systematic use of savenotes environment around minipages
+\def\thempfootnote{\arabic{mpfootnote}}
+% This package is needed to support hyperlinked footnotes in tables and
+% framed contents, and to allow code-blocks in footnotes.
+\RequirePackage{sphinxpackagefootnote}
+
+
+%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS
+%
+\input{sphinxlatexindbibtoc.sty}
+
+
+%% STYLING
+%
+\input{sphinxlatexstylepage.sty}
+\input{sphinxlatexstyleheadings.sty}
+\input{sphinxlatexstyletext.sty}
+
+
+%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS
+%
+\input{sphinxlatexobjects.sty}
+
+
+% FIXME: this line should be dropped, as "9" is default anyhow.
+\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi
+
+
+\endinput
diff --git a/sphinx/texinputs/sphinx.xdy b/sphinx/texinputs/sphinx.xdy
new file mode 100644
index 0000000..0dcf113
--- /dev/null
+++ b/sphinx/texinputs/sphinx.xdy
@@ -0,0 +1,230 @@
+;;; -*- mode: lisp; coding: utf-8; -*-
+
+;; Unfortunately xindy is out-of-the-box hyperref-incompatible. This
+;; configuration is a workaround, which requires to pass option
+;; hyperindex=false to hyperref.
+;; textit and emph not currently used, spxpagem replaces former textbf
+(define-attributes (("textbf" "textit" "emph" "spxpagem" "default")))
+(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf")
+(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit")
+(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph")
+(markup-locref :open "\spxpagem{\hyperpage{" :close "}}" :attr "spxpagem")
+(markup-locref :open "\hyperpage{" :close "}" :attr "default")
+
+(require "numeric-sort.xdy")
+
+;; xindy base module latex.xdy loads tex.xdy and the latter instructs
+;; xindy to ignore **all** TeX macros in .idx entries, except those
+;; explicitly described in merge rule. But when after applying all
+;; merge rules an empty string results, xindy raises an error:
+
+;; ERROR: CHAR: index 0 should be less than the length of the string
+
+;; For example when using pdflatex with utf-8 characters the index
+;; file will contain \IeC macros and they will get ignored except if
+;; suitable merge rules are loaded early. The texindy script coming
+;; with xindy provides this, but only for Latin scripts. The texindy
+;; man page says to use rather xelatex or lualatex in case of Cyrillic
+;; scripts.
+
+;; Sphinx contributes LICRcyr2utf8.xdy to provide support for Cyrillic
+;; scripts for the pdflatex engine.
+
+;; Another issue caused by xindy ignoring all TeX macros except those
+;; explicitly declared reveals itself when attempting to index ">>>",
+;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX
+;; escaping.
+
+;; To fix this, Sphinx does **not** use texindy, and does not even
+;; load the xindy latex.xdy base module.
+
+;(require "latex.xdy")
+
+;; Rather it incorporates some suitable extracts from latex.xdy and
+;; tex.xdy with additional Sphinx contributed rules.
+
+;; But, this means for pdflatex and Latin scripts that the xindy file
+;; tex/inputenc/uf8.xdy is not usable because it refers to the macro
+;; \IeC only sporadically, and as tex.xdy is not loaded, a rule such as
+;; (merge-rule "\'e" "é" :string)
+;; does not work, it must be
+;; (merge-rule "\IeC {\'e}" "é" :string)
+;; So Sphinx contributes LICRlatin2utf8.xdy to mitigate that problem.
+
+;;;;;;;; extracts from tex.xdy (discarding most original comments):
+
+;;;
+;;; TeX conventions
+;;;
+
+;; Discard leading and trailing white space. Collapse multiple white
+;; space characters to blank.
+
+(merge-rule "^ +" "" :eregexp)
+(merge-rule " +$" "" :eregexp)
+(merge-rule " +" " " :eregexp)
+
+;; Handle TeX markup
+
+(merge-rule "\\([{}$%&#])" "\1" :eregexp)
+
+;;;;;;;; end of extracts from xindy's tex.xdy
+
+;;;;;;;; extracts from latex.xdy:
+
+;; Standard location classes: arabic and roman numbers, and alphabets.
+
+(define-location-class "arabic-page-numbers" ("arabic-numbers"))
+(define-location-class "roman-page-numbers" ("roman-numbers-lowercase"))
+(define-location-class "Roman-page-numbers" ("roman-numbers-uppercase"))
+(define-location-class "alpha-page-numbers" ("alpha"))
+(define-location-class "Alpha-page-numbers" ("ALPHA"))
+
+;; Output Markup
+
+(markup-letter-group-list :sep "~n~n \indexspace~n")
+
+(markup-indexentry :open "~n \item " :depth 0)
+(markup-indexentry :open "~n \subitem " :depth 1)
+(markup-indexentry :open "~n \subsubitem " :depth 2)
+
+(markup-locclass-list :open ", " :sep ", ")
+(markup-locref-list :sep ", ")
+
+;;;;;;;; end of extracts from latex.xdy
+
+;; The LaTeX \index command turns \ into normal character so the TeX macros
+;; written to .idx files are not followed by a blank. This is different
+;; from non-ascii letters which end up (with pdflatex) as \IeC macros in .idx
+;; file, with a blank space after \IeC
+
+;; Details of the syntax are explained at
+;; http://xindy.sourceforge.net/doc/manual-3.html
+;; In absence of :string, "xindy uses an auto-detection mechanism to decide,
+;; if the pattern is a regular expression or not". But it is not obvious to
+;; guess, for example "\\_" is not detected as RE but "\\P\{\}" is, so for
+;; being sure we apply the :string switch everywhere and do not use \\ etc...
+
+;; Go back from sphinx.util.texescape TeX macros to UTF-8
+
+(merge-rule "\sphinxleftcurlybrace{}" "{" :string)
+(merge-rule "\sphinxrightcurlybrace{}" "}" :string)
+(merge-rule "\_" "_" :string)
+(merge-rule "{[}" "[" :string)
+(merge-rule "{]}" "]" :string)
+(merge-rule "\textbackslash{}" "\" :string) ; " for Emacs syntax highlighting
+(merge-rule "\textasciitilde{}" "~~" :string); the ~~ escape is needed here
+(merge-rule "\textasciicircum{}" "^" :string)
+(merge-rule "\sphinxhyphen{}" "-" :string)
+(merge-rule "\textquotesingle{}" "'" :string)
+(merge-rule "\textasciigrave{}" "`" :string)
+(merge-rule "\textless{}" "<" :string)
+(merge-rule "\textgreater{}" ">" :string)
+(merge-rule "\P{}" "¶" :string)
+(merge-rule "\S{}" "§" :string)
+(merge-rule "\texteuro{}" "€" :string)
+(merge-rule "\(\infty\)" "∞" :string)
+(merge-rule "\(\pm\)" "±" :string)
+(merge-rule "\(\rightarrow\)" "→" :string)
+(merge-rule "\(\checkmark\)" "✓" :string)
+(merge-rule "\textendash{}" "–" :string)
+(merge-rule "\textbar{}" "|" :string)
+(merge-rule "\(\sp{\text{0}}\)" "â°" :string)
+(merge-rule "\(\sp{\text{1}}\)" "¹" :string)
+(merge-rule "\(\sp{\text{2}}\)" "²" :string)
+(merge-rule "\(\sp{\text{3}}\)" "³" :string)
+(merge-rule "\(\sp{\text{4}}\)" "â´" :string)
+(merge-rule "\(\sp{\text{5}}\)" "âµ" :string)
+(merge-rule "\(\sp{\text{6}}\)" "â¶" :string)
+(merge-rule "\(\sp{\text{7}}\)" "â·" :string)
+(merge-rule "\(\sp{\text{8}}\)" "â¸" :string)
+(merge-rule "\(\sp{\text{9}}\)" "â¹" :string)
+(merge-rule "\(\sb{\text{0}}\)" "â‚€" :string)
+(merge-rule "\(\sb{\text{1}}\)" "â‚" :string)
+(merge-rule "\(\sb{\text{2}}\)" "â‚‚" :string)
+(merge-rule "\(\sb{\text{3}}\)" "₃" :string)
+(merge-rule "\(\sb{\text{4}}\)" "â‚„" :string)
+(merge-rule "\(\sb{\text{5}}\)" "â‚…" :string)
+(merge-rule "\(\sb{\text{6}}\)" "₆" :string)
+(merge-rule "\(\sb{\text{7}}\)" "₇" :string)
+(merge-rule "\(\sb{\text{8}}\)" "₈" :string)
+(merge-rule "\(\sb{\text{9}}\)" "₉" :string)
+(merge-rule "\IeC {\textalpha }" "α" :string)
+(merge-rule "\IeC {\textbeta }" "β" :string)
+(merge-rule "\IeC {\textgamma }" "γ" :string)
+(merge-rule "\IeC {\textdelta }" "δ" :string)
+(merge-rule "\IeC {\textepsilon }" "ε" :string)
+(merge-rule "\IeC {\textzeta }" "ζ" :string)
+(merge-rule "\IeC {\texteta }" "η" :string)
+(merge-rule "\IeC {\texttheta }" "θ" :string)
+(merge-rule "\IeC {\textiota }" "ι" :string)
+(merge-rule "\IeC {\textkappa }" "κ" :string)
+(merge-rule "\IeC {\textlambda }" "λ" :string)
+(merge-rule "\IeC {\textmu }" "μ" :string)
+(merge-rule "\IeC {\textnu }" "ν" :string)
+(merge-rule "\IeC {\textxi }" "ξ" :string)
+(merge-rule "\IeC {\textomicron }" "ο" :string)
+(merge-rule "\IeC {\textpi }" "Ï€" :string)
+(merge-rule "\IeC {\textrho }" "Ï" :string)
+(merge-rule "\IeC {\textsigma }" "σ" :string)
+(merge-rule "\IeC {\texttau }" "Ï„" :string)
+(merge-rule "\IeC {\textupsilon }" "Ï…" :string)
+(merge-rule "\IeC {\textphi }" "φ" :string)
+(merge-rule "\IeC {\textchi }" "χ" :string)
+(merge-rule "\IeC {\textpsi }" "ψ" :string)
+(merge-rule "\IeC {\textomega }" "ω" :string)
+(merge-rule "\IeC {\textAlpha }" "Α" :string)
+(merge-rule "\IeC {\textBeta }" "Î’" :string)
+(merge-rule "\IeC {\textGamma }" "Γ" :string)
+(merge-rule "\IeC {\textDelta }" "Δ" :string)
+(merge-rule "\IeC {\textEpsilon }" "Ε" :string)
+(merge-rule "\IeC {\textZeta }" "Ζ" :string)
+(merge-rule "\IeC {\textEta }" "Η" :string)
+(merge-rule "\IeC {\textTheta }" "Θ" :string)
+(merge-rule "\IeC {\textIota }" "Ι" :string)
+(merge-rule "\IeC {\textKappa }" "Κ" :string)
+(merge-rule "\IeC {\textLambda }" "Λ" :string)
+(merge-rule "\IeC {\textMu }" "Μ" :string)
+(merge-rule "\IeC {\textNu }" "Î" :string)
+(merge-rule "\IeC {\textTheta }" "Θ" :string)
+(merge-rule "\IeC {\textIota }" "Ι" :string)
+(merge-rule "\IeC {\textKappa }" "Κ" :string)
+(merge-rule "\IeC {\textLambda }" "Λ" :string)
+(merge-rule "\IeC {\textMu }" "Μ" :string)
+(merge-rule "\IeC {\textNu }" "Î" :string)
+(merge-rule "\IeC {\textXi }" "Ξ" :string)
+(merge-rule "\IeC {\textOmicron }" "Ο" :string)
+(merge-rule "\IeC {\textPi }" "Π" :string)
+(merge-rule "\IeC {\textRho }" "Ρ" :string)
+(merge-rule "\IeC {\textSigma }" "Σ" :string)
+(merge-rule "\IeC {\textTau }" "Τ" :string)
+(merge-rule "\IeC {\textUpsilon }" "Î¥" :string)
+(merge-rule "\IeC {\textPhi }" "Φ" :string)
+(merge-rule "\IeC {\textChi }" "Χ" :string)
+(merge-rule "\IeC {\textPsi }" "Ψ" :string)
+(merge-rule "\IeC {\textOmega }" "Ω" :string)
+(merge-rule "\IeC {\textohm }" "Ω" :string)
+
+;; This xindy module provides some basic support for "see"
+(require "makeindex.xdy")
+
+;; This creates one-letter headings and works fine with utf-8 letters.
+;; For Cyrillic with pdflatex works thanks to LICRcyr2utf8.xdy
+(require "latin-lettergroups.xdy")
+
+;; currently we don't (know how to easily) separate "Numbers" from
+;; "Symbols" with xindy as is the case with makeindex.
+(markup-index :open "\begin{sphinxtheindex}
+\let\lettergroup\sphinxstyleindexlettergroup
+\let\lettergroupDefault\sphinxstyleindexlettergroupDefault
+\let\spxpagem\sphinxstyleindexpagemain
+\let\spxentry\sphinxstyleindexentry
+\let\spxextra\sphinxstyleindexextra
+
+"
+ :close "
+
+\end{sphinxtheindex}
+"
+ :tree)
+
diff --git a/sphinx/texinputs/sphinxhowto.cls b/sphinx/texinputs/sphinxhowto.cls
new file mode 100644
index 0000000..8d7dd0e
--- /dev/null
+++ b/sphinx/texinputs/sphinxhowto.cls
@@ -0,0 +1,102 @@
+%
+% sphinxhowto.cls for Sphinx (https://www.sphinx-doc.org/)
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{sphinxhowto}[2019/12/01 v2.3.0 Document class (Sphinx howto)]
+
+% 'oneside' option overriding the 'twoside' default
+\newif\if@oneside
+\DeclareOption{oneside}{\@onesidetrue}
+% Pass remaining document options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}}
+\ProcessOptions\relax
+
+% Default to two-side document
+\if@oneside
+% nothing to do (oneside is the default)
+\else
+\PassOptionsToClass{twoside}{\sphinxdocclass}
+\fi
+
+\LoadClass{\sphinxdocclass}
+
+% Set some sane defaults for section numbering depth and TOC depth. You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{2}% i.e. section and subsection
+
+% Adapt \and command to the flushright context of \sphinxmaketitle, to
+% avoid ragged line endings if author names do not fit all on one single line
+\DeclareRobustCommand{\and}{%
+ \end{tabular}\kern-\tabcolsep
+ \allowbreak
+ \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}%
+}%
+% If it is desired that each author name be on its own line, use in preamble:
+%\DeclareRobustCommand{\and}{%
+% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}%
+%}%
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\newcommand{\sphinxmaketitle}{%
+ \noindent\rule{\linewidth}{1pt}\par
+ \begingroup % for PDF information dictionary
+ \def\endgraf{ }\def\and{\& }%
+ \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup
+ \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}%
+ \endgroup
+ \begin{flushright}
+ \sphinxlogo
+ \py@HeaderFamily
+ {\Huge \@title }\par
+ {\itshape\large \py@release \releaseinfo}\par
+ \vspace{25pt}
+ {\Large
+ \begin{tabular}[t]{c}
+ \@author
+ \end{tabular}\kern-\tabcolsep}\par
+ \vspace{25pt}
+ \@date \par
+ \py@authoraddress \par
+ \end{flushright}
+ \@thanks
+ \setcounter{footnote}{0}
+ \let\thanks\relax\let\maketitle\relax
+ %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+}
+
+\newcommand{\sphinxtableofcontents}{%
+ \begingroup
+ \parskip \z@skip
+ \sphinxtableofcontentshook
+ \tableofcontents
+ \endgroup
+ \noindent\rule{\linewidth}{1pt}\par
+ \vspace{12pt}%
+}
+\newcommand\sphinxtableofcontentshook{}
+\pagenumbering{arabic}
+
+% Fix the bibliography environment to add an entry to the Table of
+% Contents.
+% For an article document class this environment is a section,
+% so no page break before it.
+%
+\newenvironment{sphinxthebibliography}[1]{%
+ % \phantomsection % not needed here since TeXLive 2010's hyperref
+ \begin{thebibliography}{#1}%
+ \addcontentsline{toc}{section}{\ifdefined\refname\refname\else\ifdefined\bibname\bibname\fi\fi}}{\end{thebibliography}}
+
+
+% Same for the indices.
+% The memoir class already does this, so we don't duplicate it in that case.
+%
+\@ifclassloaded{memoir}
+ {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}
+ {\newenvironment{sphinxtheindex}{%
+ \phantomsection % needed because no chapter, section, ... is created by theindex
+ \begin{theindex}%
+ \addcontentsline{toc}{section}{\indexname}}{\end{theindex}}}
diff --git a/sphinx/texinputs/sphinxlatexadmonitions.sty b/sphinx/texinputs/sphinxlatexadmonitions.sty
new file mode 100644
index 0000000..a31ae4c
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexadmonitions.sty
@@ -0,0 +1,242 @@
+%% NOTICES AND ADMONITIONS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexadmonitions.sty}[2023/03/19 admonitions]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - sphinxseealso environment added at 6.1.0
+%
+% - sphinxadmonition (environment)
+% This is a dispatch supporting
+%
+% - note, hint, important, tip (via sphinxlightbox)
+% (also optionally via sphinxheavybox since 6.2.0)
+% - warning, caution, attention, danger, error (via sphinxheavybox)
+%
+% Each sphinx<notice name> environment can be redefined by user.
+% The defaults are customizable via various colour and dimension
+% settings, cf sphinx docs (latex customization).
+%
+% Requires:
+\RequirePackage{sphinxpackageboxes}
+\RequirePackage{framed}% used by sphinxheavybox
+%
+% Dependencies (they do not need to be defined at time of loading):
+%
+% - of course the various colour and dimension options handled via sphinx.sty
+%
+% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty
+%
+% - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox)
+%
+% - \sphinxstylenotetitle, ..., \sphinxstylewarningtitle, etc... which are used by
+% default in the corresponding sphinx<notice> environments to replace at 6.2.0
+% formerly hard-coded \sphinxstrong{#1}<space>
+% Their definitions are in sphinxlatexstyletext.sty.
+
+
+% Provides: (also in sphinxlatexliterals.sty)
+\providecommand*\sphinxvspacefixafterfrenchlists{%
+ \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi
+}
+
+% Some are quite plain
+\newenvironment{sphinxseealso}[1]{\sphinxstyleseealsotitle{#1}}{}
+
+% This \dimen register is a legacy relic from Sphinx 1.5 which is used now
+% only for sphinxlightbox. It is set in the sphinxadmonition environment.
+\newdimen\spx@notice@border
+
+\newenvironment{sphinxlightbox}{%
+ \par
+ \noindent{\color{spx@notice@bordercolor}%
+ \rule{\linewidth}{\spx@notice@border}}%
+ \par\nobreak
+ {\parskip\z@skip\noindent}%
+ }
+ {%
+ % counteract previous possible negative skip (French lists!):
+ % (we can't cancel that any earlier \vskip introduced a potential pagebreak)
+ \sphinxvspacefixafterfrenchlists
+ \nobreak\vbox{\noindent\kern\@totalleftmargin
+ {\color{spx@notice@bordercolor}%
+ \rule[\dimexpr.4\baselineskip-\spx@notice@border\relax]
+ {\linewidth}{\spx@notice@border}}\hss}\allowbreak
+ }% end of sphinxlightbox environment definition
+
+% note/hint/important/tip notices
+%
+% Since 1.5 these environments are named individually to allow user to
+% redefine them entirely.
+%
+% The Sphinx definitions were done like this, prior to 6.2.0:
+%
+% \newenvironment{sphinxhint}[1]
+% {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
+%
+% The more complex definition below will branch to sphinxheavybox if a certain
+% boolean associated to the notice type is true. This boolean is set to true
+% whenever a CSS-named alike options for the notice type has been used in
+% sphinxsetup. The old coding as above would still work, with the new options
+% being then simply ignored. A user redefinition will probably either use
+% directly sphinxlightbox or sphinxheavybox or something else, with no need to
+% test the boolean.
+%
+% 6.2.0 also adds one layer of mark-up via \sphinxnotetitle etc..., because
+% the former \sphinxstrong{#1}<space> used a too generic \sphinxstrong. But
+% perhaps the #1 should be passed over to sphinx{light,heavy}box as parameter.
+% Unfortunately replacing these environments with one-parameter environments
+% would be potentially a breaking change. Anyway, sphinxpackageboxes.sty does not
+% provide a "titled" box; the caption of code-blocks is handled by extra
+% code in sphinxVerbatim.
+\newenvironment{sphinxnote}[1]
+ {\edef\spx@env{sphinx\ifspx@opt@heavynote heavy\else light\fi box}%
+ \expandafter\begin\expandafter{\spx@env}\sphinxstylenotetitle{#1}}
+ {\expandafter\end\expandafter{\spx@env}}
+\newenvironment{sphinxhint}[1]
+ {\edef\spx@env{sphinx\ifspx@opt@heavyhint heavy\else light\fi box}%
+ \expandafter\begin\expandafter{\spx@env}\sphinxstylehinttitle{#1}}
+ {\expandafter\end\expandafter{\spx@env}}
+\newenvironment{sphinximportant}[1]
+ {\edef\spx@env{sphinx\ifspx@opt@heavyimportant heavy\else light\fi box}%
+ \expandafter\begin\expandafter{\spx@env}\sphinxstyleimportanttitle{#1}}
+ {\expandafter\end\expandafter{\spx@env}}
+\newenvironment{sphinxtip}[1]
+ {\edef\spx@env{sphinx\ifspx@opt@heavytip heavy\else light\fi box}%
+ \expandafter\begin\expandafter{\spx@env}\sphinxstyletiptitle{#1}}
+ {\expandafter\end\expandafter{\spx@env}}
+
+% warning/caution/attention/danger/error get more distinction
+%
+% Code adapted from framed.sty's "snugshade" environment.
+% Nesting works (inner frames do not allow page breaks).
+\newenvironment{sphinxheavybox}{\par
+ % 6.2.0 allows to not have to distinguish here between warning type notices
+ % which always use sphinxheavybox or note type notices which might use it.
+ % (MEMO: it is not a problem here if there is no sphinx<type>ShadowColor,
+ % as it used only if set)
+ \spx@boxes@fcolorbox@setup{\spx@noticetype}%
+ % Those are used by sphinxVerbatim if the \ifspx@inframed boolean is true
+ \setlength{\FrameRule}{0.5\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom\relax}%
+ % MEMO: prior to 5.1.0 \FrameSep was determined as 0.6\baselineskip -
+ % \FrameRule, and there was no possibility for user to adjust padding.
+ % Then \fcolorbox was used with \fboxrule set to \FrameRule and \fboxsep
+ % set to \FrameSep.
+ % The 5.1.0 default calculation of padding parameters maintains PDF output
+ % identical to legacy behaviour, as long as padding is not set by user.
+ \setlength{\FrameSep}{0.5\dimexpr\spx@boxes@padding@top+\spx@boxes@padding@bottom\relax}%
+ % "setup" macro has prepared the \spx@boxes@... dimen registers
+ \advance\spx@image@maxheight
+ -\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom
+ +\spx@boxes@padding@top+\spx@boxes@padding@bottom
+ +\baselineskip\relax % will happen again if nested, needed indeed!
+ % MEMO: the next comment is before boxing was extended to allow padding and
+ % multiple border-widths, not to mention shadows...
+ % configure framed.sty's parameters to obtain same vertical spacing
+ % as for "light" boxes. We need for this to manually insert parskip glue and
+ % revert a skip done by framed before the frame.
+ \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}%
+ \vspace{\FrameHeightAdjust}
+ % copied/adapted from framed.sty's snugshade
+ % but now using in place of \fcolorbox the Sphinx sophisticated own
+ \def\FrameCommand##1{%
+ \hskip\@totalleftmargin
+ % "setup" macro MUST have been called before
+ \spx@boxes@fcolorbox{##1}%
+ \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth
+ }%
+ % 6.2.0 adds support for div.<notice type>_box-decoration-break=slice.
+ % (it is yet undecided if slice style should inhibit a bottom shadow)
+ \csname ifspx@\spx@noticetype @border@open\endcsname
+ \def\FirstFrameCommand
+ {\spx@boxes@fcolorbox@setup@openbottom\FrameCommand}%
+ \def\MidFrameCommand
+ {\spx@boxes@fcolorbox@setup@openboth \FrameCommand}%
+ \def\LastFrameCommand
+ {\spx@boxes@fcolorbox@setup@opentop \FrameCommand}%
+ \fi
+ \savenotes
+ % use a minipage if we are already inside a framed environment
+ \ifspx@inframed
+ \noindent\begin{minipage}{\linewidth}
+ \else
+ % handle case where notice is first thing in a list item (or is quoted)
+ \if@inlabel
+ \noindent\par\vspace{-\baselineskip}
+ \else
+ \vspace{\parskip}
+ \fi
+ \fi
+ \MakeFramed {\spx@inframedtrue
+ \advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize
+ % minipage initialization copied from LaTeX source code.
+ \@pboxswfalse
+ \let\@listdepth\@mplistdepth \@mplistdepth\z@
+ \@minipagerestore
+ \@setminipage }%
+ \color@begingroup % workaround to an upstream framed.sty bug
+ }
+ {%
+ \par\unskip
+ \color@endgroup % matches the \color@begingroup
+ \@minipagefalse
+ \endMakeFramed
+ \ifspx@inframed\end{minipage}\fi
+ % set footnotes at bottom of page
+ \spewnotes
+ % arrange for similar spacing below frame as for "light" boxes.
+ \vskip .4\baselineskip
+ }% end of sphinxheavybox environment definition
+
+% - Since 1.5 these environments are named individually to allow user to
+% redefine them entirely.
+%
+% - Since 5.1.0, sphinxheavybox is more versatile and four border widths, four
+% padding widths, four corner radii, optional shadow, and three colors can all
+% be modified via CSS-named alike options.
+%
+% - Since 6.2.0, also note/hint/important/tip notices can use these options
+% and then they go automatically via sphinxheavybox. If only the legacy options
+% are used, they keep using sphinxlightbox.
+%
+% - Since 6.2.0, \sphinxwarningtitle etc... add one level of mark-up (they
+% expand to \sphinxstrong{#1}<space> which was former hard-coded mark-up).
+% Example:
+% \renewcommand{\sphinxwarningtitle}[1]{\textbf{#1}\par\smallskip
+% {\color{sphinxwarningBorderColor}\hrule height1pt}\smallskip}
+\newenvironment{sphinxwarning}[1]
+ {\begin{sphinxheavybox}\sphinxstylewarningtitle{#1}}{\end{sphinxheavybox}}
+\newenvironment{sphinxcaution}[1]
+ {\begin{sphinxheavybox}\sphinxstylecautiontitle{#1}}{\end{sphinxheavybox}}
+\newenvironment{sphinxattention}[1]
+ {\begin{sphinxheavybox}\sphinxstyleattentiontitle{#1}}{\end{sphinxheavybox}}
+\newenvironment{sphinxdanger}[1]
+ {\begin{sphinxheavybox}\sphinxstyledangertitle{#1}}{\end{sphinxheavybox}}
+\newenvironment{sphinxerror}[1]
+ {\begin{sphinxheavybox}\sphinxstyleerrortitle{#1}}{\end{sphinxheavybox}}
+
+% the main dispatch for all types of notices
+\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading
+ % can't use #1 directly in definition of end part
+ \def\spx@noticetype {#1}%
+ % those next three are a remnant of legacy code; they are not used at
+ % all by sphinxheavybox, and their usage could be disposed of by sphinxlightbox
+ % but we keep for backward compatibility and also because it may be simpler
+ % for user redefinitions to employ for example "spx@notice@bgcolor" and not
+ % the more bulky "sphinx\spx@noticetype BgColor".
+ \sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}%
+ \sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}%
+ \spx@notice@border \dimexpr\csname spx@#1@border\endcsname\relax
+ % trigger the sphinx<type> environment, #2=heading is passed as argument
+ \begin{sphinx#1}{#2}%
+ % 6.2.0 support of div.<type>_TeX{color,extras} options
+ \csname ifspx@\spx@noticetype @withtextcolor\endcsname
+ \color{sphinx\spx@noticetype TextColor}%
+ \fi
+ \csname spx@\spx@noticetype @TeXextras\endcsname
+ }
+ % workaround some LaTeX "feature" of \end command (can't use "sphinx#1" here)
+ {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp}
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexcontainers.sty b/sphinx/texinputs/sphinxlatexcontainers.sty
new file mode 100644
index 0000000..93b2c8c
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexcontainers.sty
@@ -0,0 +1,22 @@
+%% CONTAINER DIRECTIVES
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexcontainers.sty}[2021/05/03 containers]
+
+% The purpose of this file is to provide a dummy environment sphinxclass which
+% will be inserted for each class in each container directive. The class name
+% will be passed as the argument to the environment.
+%
+% For a class foo, the user can define customised handling of that class by
+% defining the sphinxclassfoo LaTeX environment.
+
+\newenvironment{sphinxuseclass}[1]{%
+ \def\sphinxClassFunctionName{sphinxclass#1}%
+ \ltx@ifundefined{\sphinxClassFunctionName}%
+ {}% undefined so do nothing
+ {\expandafter\begin\expandafter{\sphinxClassFunctionName}}%
+}{%
+ \ltx@ifundefined{\sphinxClassFunctionName}%
+ {}% we did nothing so we keep doing nothing
+ {\expandafter\end\expandafter{\sphinxClassFunctionName}}%
+}%
diff --git a/sphinx/texinputs/sphinxlatexgraphics.sty b/sphinx/texinputs/sphinxlatexgraphics.sty
new file mode 100644
index 0000000..fd0aae6
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexgraphics.sty
@@ -0,0 +1,122 @@
+%% GRAPHICS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexgraphics.sty}[2021/01/27 graphics]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - macros:
+%
+% - \sphinxfigcaption
+% - \sphinxincludegraphics
+%
+% - environments:
+%
+% - sphinxfigure-in-table
+%
+% May change:
+%
+% - \sphinxcaption (at begin document)
+%
+% Also provides:
+%
+% - \sphinxsafeincludegraphics (default of \sphinxincludegraphics since 2.0)
+% - \spx@image@maxheight dimension (used by sphinxlatexadmonitions.sty)
+% - \spx@image@box scratch box register (also used by sphinxlatexliterals.sty)
+%
+% Requires:
+% \RequirePackage{graphicx}% done in sphinx.sty
+\RequirePackage{amstext}% needed for \firstchoice@true(false)
+
+% \sphinxincludegraphics resizes images larger than the TeX \linewidth (which
+% is adjusted in indented environments), or taller than a certain maximal
+% height (usually \textheight and this is reduced in the environments which use
+% framed.sty to avoid infinite loop if image too tall).
+%
+% In case height or width options are present the rescaling is done
+% (since 2.0), in a way keeping the width:height ratio either native from
+% image or from the width and height options if both were present.
+%
+\newdimen\spx@image@maxheight
+\AtBeginDocument{\spx@image@maxheight\textheight}
+
+% box scratch register
+\newbox\spx@image@box
+\newcommand*{\sphinxsafeincludegraphics}[2][]{%
+ % #1 contains possibly width=, height=, but no scale= since 1.8.4
+ \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}%
+ \in@false % use some handy boolean flag
+ \ifdim \wd\spx@image@box>\linewidth
+ \in@true % flag to remember to adjust options and set box dimensions
+ % compute height which results from rescaling width to \linewidth
+ % and keep current aspect ratio. multiply-divide in \numexpr uses
+ % temporarily doubled precision, hence no overflow. (of course we
+ % assume \ht is not a few sp's below \maxdimen...(about 16384pt).
+ \edef\spx@image@rescaledheight % with sp units
+ {\the\numexpr\ht\spx@image@box
+ *\linewidth/\wd\spx@image@box sp}%
+ \ifdim\spx@image@rescaledheight>\spx@image@maxheight
+ % the rescaled height will be too big, so it is height which decides
+ % the rescaling factor
+ \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register
+ \edef\spx@image@requiredwidth % with sp units
+ {\the\numexpr\wd\spx@image@box
+ *\spx@image@maxheight/\ht\spx@image@box sp}%
+ % TODO: decide if this commented-out block could be needed due to
+ % rounding in numexpr operations going up
+ % \ifdim\spx@image@requiredwidth>\linewidth
+ % \def\spx@image@requiredwidth{\linewidth}% dimen register
+ % \fi
+ \else
+ \def\spx@image@requiredwidth{\linewidth}% dimen register
+ \let\spx@image@requiredheight\spx@image@rescaledheight% sp units
+ \fi
+ \else
+ % width is ok, let's check height
+ \ifdim\ht\spx@image@box>\spx@image@maxheight
+ \in@true
+ \edef\spx@image@requiredwidth % with sp units
+ {\the\numexpr\wd\spx@image@box
+ *\spx@image@maxheight/\ht\spx@image@box sp}%
+ \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register
+ \fi
+ \fi % end of check of width and height
+ \ifin@
+ \setbox\spx@image@box
+ \hbox{\includegraphics
+ [%#1,% contained only width and/or height and overruled anyhow
+ width=\spx@image@requiredwidth,height=\spx@image@requiredheight]%
+ {#2}}%
+ % \includegraphics does not set box dimensions to the exactly
+ % requested ones, see https://github.com/latex3/latex2e/issues/112
+ \wd\spx@image@box\spx@image@requiredwidth
+ \ht\spx@image@box\spx@image@requiredheight
+ \leavevmode\box\spx@image@box
+ \else
+ % here we do not modify the options, no need to adjust width and height
+ % on output, they will be computed exactly as with "draft" option
+ \setbox\spx@image@box\box\voidb@x % clear memory
+ \includegraphics[#1]{#2}%
+ \fi
+}%
+% Use the "safe" one by default (2.0)
+\def\sphinxincludegraphics{\sphinxsafeincludegraphics}
+
+
+%% FIGURE IN TABLE
+%
+\newenvironment{sphinxfigure-in-table}[1][\linewidth]{%
+ \def\@captype{figure}%
+ \sphinxsetvskipsforfigintablecaption
+ \begin{minipage}{#1}%
+}{\end{minipage}}
+% tabulary expands twice contents, we need to prevent double counter stepping
+\newcommand*\sphinxfigcaption
+ {\ifx\equation$%$% this is trick to identify tabulary first pass
+ \firstchoice@false\else\firstchoice@true\fi
+ \spx@originalcaption }
+\newcommand*\sphinxsetvskipsforfigintablecaption
+ {\abovecaptionskip\smallskipamount
+ \belowcaptionskip\smallskipamount}
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexindbibtoc.sty b/sphinx/texinputs/sphinxlatexindbibtoc.sty
new file mode 100644
index 0000000..79e30a1
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexindbibtoc.sty
@@ -0,0 +1,69 @@
+%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexindbibtoc.sty}[2021/01/27 index, bib., toc]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - environments: (backup defaults or get redefined)
+%
+% - sphinxtheindex (direct mark-up or via python.ist or sphinx.xdy)
+% - sphinxthebibliography
+%
+% - macros: (defines defaults)
+%
+% - \sphinxmaketitle
+% - \sphinxtableofcontents
+% - \sphinxnonalphabeticalgroupname
+% - \sphinxsymbolsname
+% - \sphinxnumbersname
+% - \sphinxcite
+%
+% Requires:
+\RequirePackage{makeidx}
+
+% fix the double index and bibliography on the table of contents
+% in jsclasses (Japanese standard document classes)
+\ifx\@jsc@uplatextrue\@undefined\else
+ \renewenvironment{sphinxtheindex}
+ {\cleardoublepage\phantomsection
+ \begin{theindex}}
+ {\end{theindex}}
+
+ \renewenvironment{sphinxthebibliography}[1]
+ {\cleardoublepage% \phantomsection % not needed here since TeXLive 2010's hyperref
+ \begin{thebibliography}{#1}}
+ {\end{thebibliography}}
+\fi
+
+% disable \@chappos in Appendix in pTeX
+\ifx\kanjiskip\@undefined\else
+ \let\py@OldAppendix=\appendix
+ \renewcommand{\appendix}{
+ \py@OldAppendix
+ \gdef\@chappos{}
+ }
+\fi
+
+% make commands known to non-Sphinx document classes
+\providecommand*{\sphinxmaketitle}{\maketitle}
+\providecommand*{\sphinxtableofcontents}{\tableofcontents}
+\ltx@ifundefined{sphinxthebibliography}
+ {\newenvironment
+ {sphinxthebibliography}{\begin{thebibliography}}{\end{thebibliography}}%
+ }
+ {}% else clause of \ltx@ifundefined
+\ltx@ifundefined{sphinxtheindex}
+ {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}%
+ {}% else clause of \ltx@ifundefined
+
+% for usage with xindy: this string gets internationalized in preamble
+\newcommand*{\sphinxnonalphabeticalgroupname}{}
+% redefined in preamble, headings for makeindex produced index
+\newcommand*{\sphinxsymbolsname}{}
+\newcommand*{\sphinxnumbersname}{}
+
+\protected\def\sphinxcite{\cite}
+
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexlists.sty b/sphinx/texinputs/sphinxlatexlists.sty
new file mode 100644
index 0000000..8e79355
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexlists.sty
@@ -0,0 +1,131 @@
+%% ALPHANUMERIC LIST ITEMS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexlists.sty}[2021/12/20 lists]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+% - \sphinxsetlistlabels
+% - \sphinxlineitem
+% and for the maxlistdepth key of sphinxsetup
+% Dependencies: the \spx@opt@maxlistdepth from sphinx.sty
+
+% We need some helpers macros
+\newtoks\spx@lineitemlabel
+\long\def\sphinx@gobto@sphinxlineitem#1\sphinxlineitem{}
+% TeX/LaTeX has no (easy to use) built-in "peek-ahead" mechanism, but
+% we would like to know if next token is another \sphinxlineitem (this
+% can happen in glossary entries with multiple terms for same definition)
+% so we simply grab next token (assuming it is not {tokens} originally)
+\newcommand\sphinxlineitem[2]{%
+ % safe test of whether #2 is \sphinxlineitem
+ \sphinx@gobto@sphinxlineitem#2\@gobbletwo\sphinxlineitem\unless
+ \iftrue
+ % case with sphinxlineitem immediately followed by another \sphinxlineitem:
+ % accumulate successive terms until actual definition or sub-list is found
+ \spx@lineitemlabel\expandafter{\the\spx@lineitemlabel\strut#1\\}%
+ \else
+ % now issue the \item command with possibly multi-line contents
+ % these weird incantations with \kern are related to how LaTeX
+ % handles \item generally
+ \item[\kern\labelwidth\kern-\itemindent\kern-\leftmargin
+ {\parbox[t]{\dimexpr\linewidth+\leftmargin\relax}{%
+ \raggedright
+ \the\spx@lineitemlabel% accumulated terms before this one, CR separated
+ \strut#1}}% due to LaTeX internals no \par token allowed here,
+ % but the \parbox will insert one tacitly at end
+ \kern-\labelsep]%
+ \spx@lineitemlabel{}%
+ % this causes the label to be typeset (filling up the line), clearing up
+ % things in case a nested list follows.
+ \leavevmode
+ \fi #2%
+}%
+
+
+\newcommand\sphinxsetlistlabels[5]
+{% #1 = style, #2 = enum, #3 = enumnext, #4 = prefix, #5 = suffix
+ % #2 and #3 are counters used by enumerate environment e.g. enumi, enumii.
+ % #1 is a macro such as \arabic or \alph
+ % prefix and suffix are strings (by default empty and a dot).
+ \@namedef{the#2}{#1{#2}}%
+ \@namedef{label#2}{#4\@nameuse{the#2}#5}%
+ \@namedef{p@#3}{\@nameuse{p@#2}#4\@nameuse{the#2}#5}%
+}%
+
+
+%% MAXLISTDEPTH
+%
+% remove LaTeX's cap on nesting depth if 'maxlistdepth' key used.
+% This is a hack, which works with the standard classes: it assumes \@toodeep
+% is always used in "true" branches: "\if ... \@toodeep \else .. \fi."
+
+% will force use the "false" branch (if there is one)
+\def\spx@toodeep@hack{\fi\iffalse}
+
+% do nothing if 'maxlistdepth' key not used or if package enumitem loaded.
+\ifnum\spx@opt@maxlistdepth=\z@\expandafter\@gobbletwo\fi
+\AtBeginDocument{%
+\@ifpackageloaded{enumitem}{\remove@to@nnil}{}%
+ \let\spx@toodeepORI\@toodeep
+ \def\@toodeep{%
+ \ifnum\@listdepth<\spx@opt@maxlistdepth\relax
+ \expandafter\spx@toodeep@hack
+ \else
+ \expandafter\spx@toodeepORI
+ \fi}%
+% define all missing \@list... macros
+ \count@\@ne
+ \loop
+ \ltx@ifundefined{@list\romannumeral\the\count@}
+ {\iffalse}{\iftrue\advance\count@\@ne}%
+ \repeat
+ \loop
+ \ifnum\count@>\spx@opt@maxlistdepth\relax\else
+ \expandafter\let
+ \csname @list\romannumeral\the\count@\expandafter\endcsname
+ \csname @list\romannumeral\the\numexpr\count@-\@ne\endcsname
+ % workaround 2.6--3.2d babel-french issue (fixed in 3.2e; no change needed)
+ \ltx@ifundefined{leftmargin\romannumeral\the\count@}
+ {\expandafter\let
+ \csname leftmargin\romannumeral\the\count@\expandafter\endcsname
+ \csname leftmargin\romannumeral\the\numexpr\count@-\@ne\endcsname}{}%
+ \advance\count@\@ne
+ \repeat
+% define all missing enum... counters and \labelenum... macros and \p@enum..
+ \count@\@ne
+ \loop
+ \ltx@ifundefined{c@enum\romannumeral\the\count@}
+ {\iffalse}{\iftrue\advance\count@\@ne}%
+ \repeat
+ \loop
+ \ifnum\count@>\spx@opt@maxlistdepth\relax\else
+ \newcounter{enum\romannumeral\the\count@}%
+ \expandafter\def
+ \csname labelenum\romannumeral\the\count@\expandafter\endcsname
+ \expandafter
+ {\csname theenum\romannumeral\the\numexpr\count@\endcsname.}%
+ \expandafter\def
+ \csname p@enum\romannumeral\the\count@\expandafter\endcsname
+ \expandafter
+ {\csname p@enum\romannumeral\the\numexpr\count@-\@ne\expandafter
+ \endcsname\csname theenum\romannumeral\the\numexpr\count@-\@ne\endcsname.}%
+ \advance\count@\@ne
+ \repeat
+% define all missing labelitem... macros
+ \count@\@ne
+ \loop
+ \ltx@ifundefined{labelitem\romannumeral\the\count@}
+ {\iffalse}{\iftrue\advance\count@\@ne}%
+ \repeat
+ \loop
+ \ifnum\count@>\spx@opt@maxlistdepth\relax\else
+ \expandafter\let
+ \csname labelitem\romannumeral\the\count@\expandafter\endcsname
+ \csname labelitem\romannumeral\the\numexpr\count@-\@ne\endcsname
+ \advance\count@\@ne
+ \repeat
+ \PackageInfo{sphinx}{maximal list depth extended to \spx@opt@maxlistdepth}%
+\@gobble\@nnil
+}
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexliterals.sty b/sphinx/texinputs/sphinxlatexliterals.sty
new file mode 100644
index 0000000..3a73a76
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexliterals.sty
@@ -0,0 +1,1004 @@
+%% LITERAL BLOCKS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexliterals.sty}[2023/04/01 code-blocks and parsed literals]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - macros:
+% - \sphinxLiteralBlockLabel
+% - \sphinxSetupCaptionForVerbatim
+% - \sphinxSetupCodeBlockInFootnote
+% - \sphinxhref
+% - \sphinxnolinkurl
+% - \sphinxresetverbatimhllines
+% - \sphinxunactivateextrasandspace
+% - \sphinxupquote
+% - \sphinxurl
+%
+% - environments:
+% - sphinxVerbatim
+% - sphinxVerbatimintable
+% - sphinxalltt
+%
+% Dependency:
+%
+% - hyperref (for \phantomsection and \capstart) (loaded later)
+%
+% Executes \RequirePackage for:
+%
+% - framed
+% - fancyvrb
+% - alltt
+% - upquote
+% - needspace
+% - sphinxpackageboxes
+\RequirePackage{sphinxpackageboxes}
+
+% also in sphinxlatexadmonitions.sty:
+% This is a workaround to a "feature" of French lists, when literal block
+% follows immediately; usable generally (does only \par then), a priori...
+\providecommand*\sphinxvspacefixafterfrenchlists{%
+ \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi
+}
+
+% For framing allowing pagebreaks
+\RequirePackage{framed}
+% For source code
+% MEMO: fancyvrb is used mainly to
+% 1- control horizontal and vertical spacing
+% 2- optional line numbering
+% 3- optional line emphasizing
+% 4- while still allowing expansion of Pygments latex mark-up
+% Other aspects such as framing, caption handling, codeline wrapping are
+% added on top of it. We should stop using fancyvrb and implement
+% 1, 2, 3, 4 by own Sphinx fully native Verbatim. This would greatly simplify
+% in particular wrapping long code lines in a way allowing page breaks.
+\RequirePackage{fancyvrb}
+% For parsed-literal blocks.
+\RequirePackage{alltt}
+% Display "real" single quotes in literal blocks.
+\RequirePackage{upquote}
+% Skip to next page if not enough space at bottom
+\RequirePackage{needspace}
+
+% Based on use of "fancyvrb.sty"'s Verbatim.
+% - with framing allowing page breaks ("framed.sty")
+% - with breaking of long lines (exploits Pygments mark-up),
+% - with possibly of a top caption, non-separable by pagebreak.
+% - and usable inside tables or footnotes ("sphinxpackagefootnote.sty").
+
+% for emphasizing lines
+\define@key{FV}{hllines}{\def\sphinx@verbatim@checkifhl##1{\in@{, ##1,}{#1}}}
+% sphinxVerbatim must be usable by third party without requiring hllines set-up
+\def\sphinxresetverbatimhllines{\def\sphinx@verbatim@checkifhl##1{\in@false}}
+\sphinxresetverbatimhllines
+
+% Prior to Sphinx 1.5, \Verbatim and \endVerbatim were modified by Sphinx.
+% The aliases defined here are used in sphinxVerbatim environment and can
+% serve as hook-points with no need to modify \Verbatim itself.
+\let\OriginalVerbatim \Verbatim
+\let\endOriginalVerbatim\endVerbatim
+
+% for captions of literal blocks
+% at start of caption title
+\newcommand*{\fnum@literalblock}{\literalblockname\nobreakspace\theliteralblock}
+% this will be overwritten in document preamble by Babel translation
+\newcommand*{\literalblockname}{Listing }
+% file extension needed for \caption's good functioning, the file is created
+% only if a \listof{literalblock}{foo} command is encountered, which is
+% analogous to \listoffigures, but for the code listings (foo = chosen title.)
+\newcommand*{\ext@literalblock}{lol}
+
+% if forced use of minipage encapsulation is needed (e.g. table cells)
+\newif\ifsphinxverbatimwithminipage \sphinxverbatimwithminipagefalse
+
+% Framing macro for use with framed.sty's \FrameCommand
+% MEMO: the sophisticated code in \spx@fcolorbox/\spx@CustomFBox
+% is here for good reasons
+% - be responsive to indented list environments in the manner of
+% the "framed" (\fbox) and "shaded" (\colorbox) environments of
+% framed.sty; indeed code here is an evolution related to \fcolorbox
+% - attach non-detachable continuation hints above/below frame
+% - draw the frame and fill the background color in a manner avoiding
+% problems in some pdf viewers
+% - do background coloring differently from color.sty/xcolor.sty macros
+% (even core internal ones) to work around issues at page breaks
+% as the framed contents are split into chunks with possibly unpaired
+% "color push" or "color pop"
+% About the produced output:
+% - it obeys current indentation,
+% - frame with 4 padding parameters and 4 border-width parameters
+% - the contents use the full available text width, limited by indentation,
+% - #1 = will be typeset above frame, in a non detachable way,
+% - #2 = will be typeset below frame, in a non detachable way,
+% - #3 = will be typeset within the frame.
+% #1 and #2 are expected to be already typeset \hbox'es.
+% #3 are the contents, and in the context of usage of fancyvrb+framed,
+% it will arrive here already transformed into horizontal boxes,
+% interline penalties and glues.
+%
+\long\def\spx@verb@FrameCommand #1#2#3{%
+ % The \spx@verb@boxes@fcolorbox@setup MUST have been executed beforehand.
+ % These \hskips are for fancyvrb.sty measuring and will make the
+ % framing "adapt" to an indented context.
+ \hskip\@totalleftmargin
+ \hskip-\spx@boxes@border@left\hskip-\spx@boxes@padding@left
+ \spx@verb@fcolorbox {#1}{#2}{#3}%
+ \hskip-\spx@boxes@padding@right\hskip-\spx@boxes@border@right
+ \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth
+}%
+\long\def\spx@verb@fcolorbox #1#2#3{%
+ % The \spx@verb@boxes@fcolorbox@setup MUST have been executed beforehand.
+%
+ % MEMO: in the context of framed.sty this will always expand inside some
+ % \hbox isolated from other code, so we can use \box\z@, \box\tw@,...
+ % with no need of extra group.
+%
+ % MEMO: this code was originally using \color@b@x but the latter has
+ % problematic features regarding color in a context like here where #3
+ % may contain an unbalanced "color push".
+%
+ \setbox\z@\hbox{#3}%
+ \edef\spx@verb@fcolorbox@width@sp
+ {\number\dimexpr\wd\z@+\spx@boxes@border@left
+ +\spx@boxes@padding@left
+ +\spx@boxes@padding@right
+ +\spx@boxes@border@right\relax sp}%
+ \vbox{#1% continuation hint attached above frame, uses \spx@verb@fcolorbox@width@sp
+ % the boxes@fcolorbox constructs an \hbox with bbox containing the border
+ % \spx@verb@boxes@fcolorbox@setup MUST have been executed beforehand.
+ \spx@boxes@fcolorbox{\box\z@}%
+ % This \nointerlineskip to maintain legacy spacing when a \hrule was
+ % formerly last prior item in vertical list. TODO: remove this at 6.0.0 ?
+ \nointerlineskip
+ #2% continuation hint attached below frame, uses \spx@verb@fcolorbox@width@sp
+ }% end of \vbox
+}%
+\def\spx@verb@fcolorbox@put@c#1{% hide width from framed.sty measuring
+ \moveright.5\dimexpr\spx@verb@fcolorbox@width@sp\hb@xt@\z@{\hss#1\hss}%
+}%
+\def\spx@verb@fcolorbox@put@r#1{% right align with contents, width hidden
+ \moveright\dimexpr\spx@verb@fcolorbox@width@sp-%
+ \spx@boxes@padding@right-%
+ \spx@boxes@border@right\hb@xt@\z@{\hss#1}%
+}%
+\def\spx@verb@fcolorbox@put@l#1{% left align with contents, width hidden
+ \moveright\dimexpr\spx@boxes@border@left+%
+ \spx@boxes@padding@left\hb@xt@\z@{#1\hss}%
+}%
+%
+\def\sphinxVerbatim@Continued{%
+ \csname spx@verb@fcolorbox@put@\spx@opt@verbatimcontinuedalign\endcsname
+ {{\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}%
+}%
+\def\sphinxVerbatim@Continues{%
+ \csname spx@verb@fcolorbox@put@\spx@opt@verbatimcontinuesalign\endcsname
+ {{\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}%
+}%
+\def\sphinxVerbatim@Title{%
+ \spx@verb@fcolorbox@put@c{\unhcopy\sphinxVerbatim@TitleBox}%
+}%
+\let\sphinxVerbatim@Before\@empty
+\let\sphinxVerbatim@After\@empty
+% Defaults are redefined in document preamble according to language
+\newcommand*\literalblockcontinuedname{continued from previous page}%
+\newcommand*\literalblockcontinuesname{continues on next page}%
+%
+\def\sphinxVerbatim@FrameCommand{%
+ \spx@verb@FrameCommand\sphinxVerbatim@Before\sphinxVerbatim@After
+}%
+\def\sphinxVerbatim@FirstFrameCommand{%
+ \ifspx@pre@border@open
+ \spx@boxes@fcolorbox@setup@openbottom
+ \fi
+ \spx@verb@FrameCommand\sphinxVerbatim@Before\sphinxVerbatim@Continues
+}%
+\def\sphinxVerbatim@MidFrameCommand{%
+ \ifspx@pre@border@open
+ \spx@boxes@fcolorbox@setup@openboth
+ \fi
+ \spx@verb@FrameCommand\sphinxVerbatim@Continued\sphinxVerbatim@Continues
+}%
+\def\sphinxVerbatim@LastFrameCommand{%
+ \ifspx@pre@border@open
+ \spx@boxes@fcolorbox@setup@opentop
+ \fi
+ \spx@verb@FrameCommand\sphinxVerbatim@Continued\sphinxVerbatim@After
+}%
+%
+\def\spx@verb@boxes@fcolorbox@setup{%
+ % Prepares usage of \spx@boxes@fcolorbox
+ % Extras to remap legacy color names VerbatimBorderColor and VerbatimColor
+ % to a common naming scheme with admonitions (and topic directive), as
+ % expected by \spx@boxes@fcolorbox@setup from sphinxpackageboxes.sty.
+ \sphinxcolorlet{sphinxpreBorderColor}{VerbatimBorderColor}%
+ \sphinxcolorlet{sphinxpreBgColor}{VerbatimColor}%
+ % This VerbatimShadowColor is not a legacy name nor user documented but is
+ % an outcome of sphinx.sty batch definitions for CSS option support.
+ \sphinxcolorlet{sphinxpreShadowColor}{VerbatimShadowColor}%
+ \spx@boxes@fcolorbox@setup{pre}%
+ \ifspx@opt@verbatimwithframe
+ \else
+ \spx@boxes@border@top\z@
+ \spx@boxes@border@right\z@
+ \spx@boxes@border@bottom\z@
+ \spx@boxes@border@left\z@
+ \spx@boxes@border\z@
+ % MEMO: rounded corners still make sense in presence of a background
+ % color, so we do not force the fcolorbox@rectangle here
+ \fi
+}%
+
+% For linebreaks inside Verbatim environment from package fancyvrb.
+\newbox\sphinxcontinuationbox
+\newbox\sphinxvisiblespacebox
+\newcommand*\sphinxafterbreak {\copy\sphinxcontinuationbox}
+
+% Take advantage of the already applied Pygments mark-up to insert
+% potential linebreaks for TeX processing.
+% {, <, #, %, $, ' and ": go to next line.
+% _, }, ^, &, >, -, ~, and \: stay at end of broken line.
+% Use of \textquotesingle for straight quote.
+% FIXME: convert this to package options ?
+\newcommand*\sphinxbreaksbeforelist {%
+ \do\PYGZob\{\do\PYGZlt\<\do\PYGZsh\#\do\PYGZpc\%% {, <, #, %,
+ \do\PYGZdl\$\do\PYGZdq\"% $, "
+ \def\PYGZsq
+ {\discretionary{}{\sphinxafterbreak\textquotesingle}{\textquotesingle}}% '
+}
+\newcommand*\sphinxbreaksafterlist {%
+ \do\PYGZus\_\do\PYGZcb\}\do\PYGZca\^\do\PYGZam\&% _, }, ^, &,
+ \do\PYGZgt\>\do\PYGZhy\-\do\PYGZti\~% >, -, ~
+ \do\PYGZbs\\% \
+}
+\newcommand*\sphinxbreaksatspecials {%
+ \def\do##1##2%
+ {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}%
+ \sphinxbreaksbeforelist
+ \def\do##1##2%
+ {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}%
+ \sphinxbreaksafterlist
+}
+
+\def\sphinx@verbatim@nolig@list {\do \`}%
+% Some characters . , ; ? ! / are neither pygmentized nor "tex-escaped".
+% This macro makes them "active" and they will insert potential linebreaks.
+% Not compatible with math mode (cf \sphinxunactivateextras, which uses
+% these lists to make sure activated characters get de-activated).
+\newcommand*\sphinxbreaksbeforeactivelist {}% none
+\newcommand*\sphinxbreaksafteractivelist {\do\.\do\,\do\;\do\?\do\!\do\/}
+\newcommand*\sphinxbreaksviaactive {%
+ \def\do##1{\lccode`\~`##1%
+ \lowercase{\def~}{\discretionary{}{\sphinxafterbreak\char`##1}{\char`##1}}%
+ \catcode`##1\active}%
+ \sphinxbreaksbeforeactivelist
+ \def\do##1{\lccode`\~`##1%
+ \lowercase{\def~}{\discretionary{\char`##1}{\sphinxafterbreak}{\char`##1}}%
+ \catcode`##1\active}%
+ \sphinxbreaksafteractivelist
+ \lccode`\~`\~
+}
+
+% If the linebreak is at a space, the latter will be displayed as visible
+% space at end of first line, and a continuation symbol starts next line.
+\def\spx@verbatim@space {%
+ \nobreak\hskip\z@skip
+ \discretionary{\copy\sphinxvisiblespacebox}{\sphinxafterbreak}
+ {\kern\fontdimen2\font}%
+}%
+
+% if the available space on page is less than \literalblockneedspace, insert pagebreak
+\newcommand{\sphinxliteralblockneedspace}{5\baselineskip}
+\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip}
+% The title (caption) is specified from outside as macro \sphinxVerbatimTitle.
+% \sphinxVerbatimTitle is reset to empty after each use of Verbatim.
+\newcommand*\sphinxVerbatimTitle {}
+% This box to typeset the caption before framed.sty multiple passes for framing.
+\newbox\sphinxVerbatim@TitleBox
+% This box to measure contents if nested as inner \MakeFramed requires then
+% minipage encapsulation but too long contents then break outer \MakeFramed
+\newbox\sphinxVerbatim@ContentsBox
+% Holder macro for labels of literal blocks. Set-up by LaTeX writer.
+\newcommand*\sphinxLiteralBlockLabel {}
+\newcommand*\sphinxSetupCaptionForVerbatim [1]
+{%
+ \sphinxvspacefixafterfrenchlists
+ \needspace{\sphinxliteralblockneedspace}%
+% insert a \label via \sphinxLiteralBlockLabel
+% reset to normal the color for the literal block caption
+ \def\sphinxVerbatimTitle
+ {\py@NormalColor\sphinxcaption{\sphinxLiteralBlockLabel #1}}%
+}
+\newcommand*\sphinxSetupCodeBlockInFootnote {%
+ \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption
+ \sphinxverbatimwithminipagetrue % reduces vertical spaces
+ % we counteract (this is in a group) the \@normalsize from \caption
+ \let\normalsize\footnotesize\let\@parboxrestore\relax
+ \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}%
+}
+\newcommand*{\sphinxverbatimsmallskipamount}{\smallskipamount}
+% serves to implement line highlighting
+\newcommand\sphinxFancyVerbFormatLine[1]{%
+ \expandafter\sphinx@verbatim@checkifhl\expandafter{\the\FV@CodeLineNo}%
+ \ifin@
+ \sphinxVerbatimHighlightLine{#1}%
+ \else
+ \sphinxVerbatimFormatLine{#1}%
+ \fi
+}%
+\let\spx@original@set@color\set@color
+\newcommand\sphinxVerbatimHighlightLine[1]{%
+% This is morally a \colorbox (with a \fboxsep which would be 0pt)
+% but some issues of potential colour disappearance at pagebreaks
+% require workaround such as the one done here.
+ \leavevmode
+ % MEMO: usage of original \colorbox would insert a \set@color here
+ % and this then places a "color pop" at the end of the \box\z@.
+ % But this could pair erroneously with an unmatched "color push"
+ % as #1 is maybe only a part (already hboxed) of a codeline
+ % if (default) verbatimwrapslines=true
+ % (cf \spx@verb@@PreProcessLine; refs: #8686)
+ % MEMO: formerly we did something with \fboxsep in relation to the LaTeX
+ % bug graphics/4524 for \colorbox, but as we don't use \colorbox...
+ \setbox\z@\hb@xt@\linewidth{\strut#1\hss}%
+ % MEMO: \colorbox would lead to \color{sphinxVerbatimHighlightColor}
+ % plus \color@block, which results in doubled (a color.sty feature)
+ % color command send to device driver and more importantly has
+ % a "color pop" which will be after \box\z@. We avoid that for reasons
+ % mentioned above.
+ {%
+ \def\set@color{\let\set@color\spx@original@set@color}%
+ % will only set \current@color and delay the \set@color to \color@block
+ % as this all happens inside fancyvrb nested \hbox'es.
+ \color{sphinxVerbatimHighlightColor}%
+ % will use \current@color and pop it **before** \box\z@
+ \color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@
+ }%
+ % we added a group only for \FV@RightListNumber not be influenced by the
+ % \current@color, if \fvset has been used to set numbers to the right.
+}%
+% MEMO: fancyvrb has options obeytabs and tabsize. Anyhow tab characters
+% do not make it to the tex file, they have been converted to spaces earlier.
+% But, if this was not the case, the support would be implemented here via
+% \newcommand\sphinxVerbatimFormatLine[1]{\FV@ObeyTabs{\strut #1}}%
+\newcommand\sphinxVerbatimFormatLine[1]{\strut#1}%
+% MEMO: if verbatimwrapslines is set to true (default) the #1 above is
+% simply \box\spx@tempboxb, from the next two macros.
+% The next two macros are a deep hack of fancyvrb.sty core line processing in
+% order to wrap too long lines, either at spaces and natural break-points,
+% (soft wrap) or optionally at any character (hard wrap). This requires deep
+% hack to work around the \hbox'es wrappers of fancyvrb.sty as they would
+% prevent page breaks. Formerly Sphinx obtained wrapping by inserting the
+% material into a vertical box (which was later again boxed -- twice -- by
+% fancyvrb thinking it was a single line...) but this was incompatible with
+% allowing page breaks (refs: #8686).
+% We use core TeX techniques to pre-process a paragraph then recover its
+% constituents lines (as boxes, not as tokens) and hand them over to original
+% fancyvrb line process. It is mandatory to update \FV@ProcessLine and
+% \@tempboxa globally to get fancyvrb internals into working to our
+% satisfaction.
+% This will get disrupted if anything adding vertical penalties or glues
+% is activated via some \vadjust from inside the Pygmentized code lines.
+\def\spx@verb@@ProcessLines{%
+ \unskip
+ \unpenalty
+ \setbox\spx@tempboxb\lastbox
+\ifvoid\spx@tempboxb\else
+ {\spx@verb@@ProcessLines}%
+ \FV@ProcessLine{\box\spx@tempboxb}%
+ \global\let\FV@ProcessLine\FV@ProcessLine
+ \global\setbox\@tempboxa=\box\@tempboxa
+ \aftergroup\spx@verb@@InhibitLineNumber
+\fi
+}%
+\def\spx@verb@@InhibitLineNumber{%
+ \let\FV@LeftListNumber\relax
+ \let\FV@RightListNumber\relax
+}%
+% This will replace fancyvrb's \FV@@PreProcessLine
+% Instead of boxing \FV@Line (which contains the Pygmentized line tokens), we
+% first typeset it in a vertical box of the suitable width (taking into
+% account nested lists) to activate the TeX built-in paragraph builder, then
+% we recover individual lines as horizontal boxes and feed them to fancyvrb
+% native line processing (which may add line numbers). The interline
+% penalties and vertical glue to maintain baseline distance will be added
+% again by this process so in recursive \spx@verb@@ProcessLines which starts
+% from bottom and makes its way up to first part of the wrapped line we do not
+% need to worry about them. An additional initial measuring step is needed if
+% user issued verbatimforcewraps=true, which elaborates on the same technique.
+% If hard wraps get activated, they get implemented via hacked \PYG macros.
+\def\spx@verb@@PreProcessLine{%
+ \FV@StepLineNo
+ \FV@Gobble
+ \def\spx@verb@FV@Line{\FV@Line}%
+ \ifspx@opt@verbatimforcewraps
+ \spx@verb@DecideIfWillDoForceWrap
+ \fi
+% MEMO: \everypar{} was issued earlier (and due to \@setminipage
+% would have been only \@minipagefalse\everypar{} otherwise).
+ \setbox\spx@tempboxa=\vtop{\hsize\linewidth
+ \raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
+ \doublehyphendemerits\z@\finalhyphendemerits\z@
+% MEMO: fancyvrb has options obeytabs and tabsize. Anyhow tab characters
+% do not make it to the tex file, they have been converted to spaces earlier.
+% But, if this was not the case, the support would be implemented here via
+% \FV@ObeyTabs{\strut\spx@verb@FV@Line\strut}%
+% And one would need a similar change in the measuring phase done by
+% \spx@verb@DecideIfWillDoForceWrap
+ \strut\spx@verb@FV@Line\strut
+% MEMO: since LaTeX 2021-06-01, there might be some hooks executed at
+% start and end of paragraphs (in future: PDF tagging), but we need an
+% explicit \par here for that. Else the kernel hooks at start of paragraph
+% are executed but not the ones at its end.
+ \par
+ }%
+ \setbox\spx@tempboxa=\vtop{\unvbox\spx@tempboxa
+ \setbox\spx@tempboxb\lastbox
+ {\spx@verb@@ProcessLines}%
+ \FV@ProcessLine{\box\spx@tempboxb}%
+ \global\let\FV@ProcessLine\FV@ProcessLine
+ \global\setbox\@tempboxa=\box\@tempboxa
+ }%
+ \unvbox\spx@tempboxa
+}%
+%
+% The normal line wrapping allows breaks at spaces and ascii non
+% letters, non digits. The \raggedright above means there will be
+% an overfilled line only if some non-breakable "word" was
+% encountered, which is longer than a line (it is moved always to
+% be on its own on a new line).
+%
+% The "forced" line wrapping will parse the tokens to add potential
+% breakpoints at each character. As some strings are highlighted,
+% we have to apply the highlighting character per character, which
+% requires to manipulate the output of the Pygments LaTeXFormatter.
+%
+% Doing this at latex level is complicated. The contents should
+% be as expected: i.e. some active characters from
+% \sphinxbreaksviaactive, some Pygments character escapes such as
+% \PYGZdl{}, and the highlighting \PYG macro with always 2
+% arguments. No other macros should be there, except perhaps
+% zero-parameter macros. In particular:
+% - the texcomments Pygments option must be set to False
+%
+% With pdflatex, Unicode input gives multi-bytes characters
+% where the first byte is active. We support the "utf8" macros
+% only. "utf8x" is not supported.
+%
+% The highlighting macro \PYG will be applied character per
+% character. Highlighting via a colored background gives thus a
+% chain of small colored boxes which may cause some artefact in
+% some pdf viewers. Can't do anything here if we do want the line
+% break to be possible.
+%
+% First a measurement step is done of what would the standard line
+% wrapping give (i.e line breaks only at spaces and non-letter,
+% non-digit ascii characters), cf TeX by Topic for the basic
+% dissecting technique: TeX unfortunately when building a vertical
+% box does not store in an accessible way what was the maximal
+% line-width during paragraph building.
+%
+% MEMO: in future use perhaps rather \RawNoindent/\RawParEnd, but
+% ltpara (LaTeX 2021-06-01) is not yet in final form (June 2022).
+%
+% Avoid LaTeX 2021 alteration of \@@par which potentially could break our
+% measurement step (typically if the para/after hook is configured to use
+% \vspace). Of course, breakage could happen only from user or package
+% adding things to basic Sphinx latex. And perhaps spring LaTeX 2021 will
+% provide a non-hooked \@@par, but this should work anyway and can't be
+% beaten for speed.
+\ltx@ifundefined{tex_par:D}
+% We could use \@ifl@t@r\fmtversion{2020/02/02}{use \tex_par:D}{use \@@par}.
+ {\let\spx@par\@@par}% \@@par is then expected to be TeX's original \par
+ {\expandafter\let\expandafter\spx@par\csname tex_par:D\endcsname}
+% More hesitation for avoiding the at-start-of-par hooks for our
+% measurement : 1. with old LaTeX, we can not avoid hooks from everyhook
+% or similar packages, 2. and perhaps the hooks add stuff which we should
+% actually measure. Ideally, hooks are for inserting things in margin
+% which do not change spacing. Most everything else in fact should not be
+% executed in our scratch box for measurement, such as counter stepping.
+\ltx@ifundefined{tex_everypar:D}
+ {\let\spx@everypar\everypar}
+ {\expandafter\let\expandafter\spx@everypar\csname tex_everypar:D\endcsname}
+%
+% If the max width exceeds the linewidth by more than verbatimmaxoverfull
+% character widths, or if the min width plus verbatimmaxunderfull character
+% widths is inferior to linewidth, then we apply the "force wrapping" with
+% potential line break at each character, else we don't.
+\long\def\spx@verb@DecideIfWillDoForceWrap{%
+ \global\let\spx@verb@maxwidth\z@
+ \global\let\spx@verb@minwidth\linewidth
+ \setbox\spx@tempboxa
+ \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@
+ \doublehyphendemerits\z@\finalhyphendemerits\z@
+ \spx@everypar{}\noindent\strut\FV@Line\strut\spx@par
+ \spx@verb@getwidths}%
+ \ifdim\spx@verb@maxwidth>
+ \dimexpr\linewidth+\spx@opt@verbatimmaxoverfull\fontcharwd\font`X \relax
+% The \expandafter is due to \spx@verb@wrapPYG requiring to "see" the TeX tokens
+% from the pygmentize output.
+ \def\spx@verb@FV@Line{\expandafter\spx@verb@wrapPYG\FV@Line\spx@verb@wrapPYG}%
+ \else
+ \ifdim\spx@verb@minwidth<
+ \dimexpr\linewidth-\spx@opt@verbatimmaxunderfull\fontcharwd\font`X \relax
+ \def\spx@verb@FV@Line{\expandafter\spx@verb@wrapPYG\FV@Line\spx@verb@wrapPYG}%
+ \fi
+ \fi
+}%
+% auxiliary paragraph dissector to get max and min widths
+% but minwidth must not take into account the last line
+\def\spx@verb@getwidths {%
+ \unskip\unpenalty
+ \setbox\spx@tempboxb\lastbox
+ \ifvoid\spx@tempboxb
+ \else
+ \setbox\spx@tempboxb\hbox{\unhbox\spx@tempboxb}%
+ \ifdim\spx@verb@maxwidth<\wd\spx@tempboxb
+ \xdef\spx@verb@maxwidth{\number\wd\spx@tempboxb sp}%
+ \fi
+ \expandafter\spx@verb@getwidths@loop
+ \fi
+}%
+\def\spx@verb@getwidths@loop {%
+ \unskip\unpenalty
+ \setbox\spx@tempboxb\lastbox
+ \ifvoid\spx@tempboxb
+ \else
+ \setbox\spx@tempboxb\hbox{\unhbox\spx@tempboxb}%
+ \ifdim\spx@verb@maxwidth<\wd\spx@tempboxb
+ \xdef\spx@verb@maxwidth{\number\wd\spx@tempboxb sp}%
+ \fi
+ \ifdim\spx@verb@minwidth>\wd\spx@tempboxb
+ \xdef\spx@verb@minwidth{\number\wd\spx@tempboxb sp}%
+ \fi
+ \expandafter\spx@verb@getwidths@loop
+ \fi
+}%
+% auxiliary macros to implement "cut long line even in middle of word"
+\catcode`Z=3 % safe delimiter
+\def\spx@verb@wrapPYG{%
+ \futurelet\spx@nexttoken\spx@verb@wrapPYG@i
+}%
+\def\spx@verb@wrapPYG@i{%
+ \ifx\spx@nexttoken\spx@verb@wrapPYG\let\next=\@gobble\else
+ \ifx\spx@nexttoken\PYG\let\next=\spx@verb@wrapPYG@PYG@onebyone\else
+ \discretionary{}{\sphinxafterbreak}{}%
+ \let\next\spx@verb@wrapPYG@ii
+ \fi\fi
+ \next
+}%
+% Let's recognize active characters. We don't support utf8x only utf8.
+% And here #1 should not have picked up (non empty) braced contents
+\long\def\spx@verb@wrapPYG@ii#1{%
+ \ifcat\noexpand~\noexpand#1\relax% active character
+ \expandafter\spx@verb@wrapPYG@active
+ \else % non-active character, control sequence such as \PYGZdl, or empty
+ \expandafter\spx@verb@wrapPYG@one
+ \fi {#1}%
+}%
+\long\def\spx@verb@wrapPYG@active#1{%
+% Let's hope expansion of active character does not really require arguments,
+% as we certainly don't want to go into expanding upfront token stream anyway.
+ \expandafter\spx@verb@wrapPYG@iii#1{}{}{}{}{}{}{}{}{}Z#1%
+}%
+\long\def\spx@verb@wrapPYG@iii#1#2Z{%
+ \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@four\else
+ \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@three\else
+ \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@two\else
+ \let\next=\spx@verb@wrapPYG@one
+ \fi\fi\fi
+ \next
+}%
+\long\def\spx@verb@wrapPYG@one #1{#1\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@two #1#2{#1#2\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@three #1#2#3{#1#2#3\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@four #1#2#3#4{#1#2#3#4\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+% Replace \PYG by itself applied one character at a time! This way breakpoints
+% can be inserted.
+\def\spx@verb@wrapPYG@PYG@onebyone#1#2#3{% #1 = \PYG, #2 = highlight spec, #3 = tokens
+ \def\spx@verb@wrapPYG@PYG@spec{{#2}}%
+ \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i#3Z%
+}%
+\def\spx@verb@wrapPYG@PYG@i{%
+ \ifx\spx@nexttokenZ\let\next=\spx@verb@wrapPYG@PYG@done\else
+ \discretionary{}{\sphinxafterbreak}{}%
+ \let\next\spx@verb@wrapPYG@PYG@ii
+ \fi
+ \next
+}%
+\def\spx@verb@wrapPYG@PYG@doneZ{\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}%
+\long\def\spx@verb@wrapPYG@PYG@ii#1{%
+ \ifcat\noexpand~\noexpand#1\relax% active character
+ \expandafter\spx@verb@wrapPYG@PYG@active
+ \else % non-active character, control sequence such as \PYGZdl, or empty
+ \expandafter\spx@verb@wrapPYG@PYG@one
+ \fi {#1}%
+}%
+\long\def\spx@verb@wrapPYG@PYG@active#1{%
+% Let's hope expansion of active character does not really require arguments,
+% as we certainly don't want to go into expanding upfront token stream anyway.
+ \expandafter\spx@verb@wrapPYG@PYG@iii#1{}{}{}{}{}{}{}{}{}Z#1%
+}%
+\long\def\spx@verb@wrapPYG@PYG@iii#1#2Z{%
+ \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@PYG@four\else
+ \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@PYG@three\else
+ \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@PYG@two\else
+ \let\next=\spx@verb@wrapPYG@PYG@one
+ \fi\fi\fi
+ \next
+}%
+\long\def\spx@verb@wrapPYG@PYG@one#1{%
+ \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1}%
+ \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\long\def\spx@verb@wrapPYG@PYG@two#1#2{%
+ \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2}%
+ \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\long\def\spx@verb@wrapPYG@PYG@three#1#2#3{%
+ \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3}%
+ \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\long\def\spx@verb@wrapPYG@PYG@four#1#2#3#4{%
+ \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3#4}%
+ \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i
+}%
+\catcode`Z 11 %
+%
+\g@addto@macro\FV@SetupFont{%
+ \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}%
+ \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}%
+}%
+\newenvironment{sphinxVerbatim}{%
+ % first, let's check if there is a caption
+ \ifx\sphinxVerbatimTitle\empty
+ \sphinxvspacefixafterfrenchlists
+ \parskip\z@skip
+ \vskip\sphinxverbatimsmallskipamount
+ % there was no caption. Check if nevertheless a label was set.
+ \ifx\sphinxLiteralBlockLabel\empty\else
+ % we require some space to be sure hyperlink target from \phantomsection
+ % will not be separated from upcoming verbatim by a page break
+ \needspace{\sphinxliteralblockwithoutcaptionneedspace}%
+ \phantomsection\sphinxLiteralBlockLabel
+ \fi
+ \else
+ \parskip\z@skip
+ \if t\spx@opt@literalblockcappos
+ \vskip\spx@abovecaptionskip
+ \def\sphinxVerbatim@Before
+ {\sphinxVerbatim@Title\nointerlineskip
+ \kern\dimexpr-\dp\strutbox+\sphinxbelowcaptionspace
+ % if no frame (code-blocks inside table cells), remove
+ % the top padding (better visually)
+ \ifspx@opt@verbatimwithframe\else
+ % but we must now check if there is a background color
+ % MEMO: "fcolorbox@setup" will have been done by time of use
+ \ifspx@boxes@withbackgroundcolor\else-\spx@boxes@padding@top\fi
+ \fi
+ % caption package adds \abovecaptionskip vspace, remove it
+ \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax}%
+ \else
+ \vskip\sphinxverbatimsmallskipamount
+ \def\sphinxVerbatim@After
+ {\nointerlineskip\kern\dimexpr\dp\strutbox
+ \ifspx@opt@verbatimwithframe\else
+ % but we must now check if there is a background color
+ % MEMO: "fcolorbox@setup" will have been done by time of use
+ \ifspx@boxes@withbackgroundcolor\else-\spx@boxes@padding@bottom\fi
+ \fi
+ \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax
+ \sphinxVerbatim@Title}%
+ \fi
+ \def\@captype{literalblock}%
+ \capstart
+ % \sphinxVerbatimTitle must reset color
+ \setbox\sphinxVerbatim@TitleBox
+ \hbox{\begin{minipage}{\linewidth}%
+ % caption package may detect wrongly if top or bottom, so we help it
+ \spx@ifcaptionpackage
+ {\caption@setposition{\spx@opt@literalblockcappos}}{}%
+ \sphinxVerbatimTitle
+ \end{minipage}}%
+ \fi
+ \global\let\sphinxLiteralBlockLabel\empty
+ \global\let\sphinxVerbatimTitle\empty
+ % the "FrameCommand"'s are also responsible to attach the "Title".
+ \let\FrameCommand \sphinxVerbatim@FrameCommand
+ % those will also check status of the pre_box-decoration-break option
+ \let\FirstFrameCommand\sphinxVerbatim@FirstFrameCommand
+ \let\MidFrameCommand \sphinxVerbatim@MidFrameCommand
+ \let\LastFrameCommand \sphinxVerbatim@LastFrameCommand
+ %
+ \ifspx@opt@verbatimhintsturnover\else
+ \let\sphinxVerbatim@Continued\@empty
+ \let\sphinxVerbatim@Continues\@empty
+ \fi
+ % initialization for \spx@boxes@fcolorbox from sphinxpackageboxes.sty
+ % it will take into account status of verbatimwithframe Boolean
+ \spx@verb@boxes@fcolorbox@setup
+ \ifspx@opt@verbatimwrapslines
+ % deep hack into fancyvrb's internal processing of input lines
+ \let\FV@@PreProcessLine\spx@verb@@PreProcessLine
+ % space character will allow line breaks
+ \let\FV@Space\spx@verbatim@space
+ % allow breaks at special characters using \PYG... macros.
+ \sphinxbreaksatspecials
+ % breaks at punctuation characters . , ; ? ! and / (needs catcode activation)
+ \fvset{codes*=\sphinxbreaksviaactive}%
+ \fi
+ \let\FancyVerbFormatLine\sphinxFancyVerbFormatLine
+ \VerbatimEnvironment
+ % workaround to fancyvrb's check of current list depth
+ \def\@toodeep {\advance\@listdepth\@ne}%
+ % The list environment is needed to control perfectly the vertical space.
+ % Note: \OuterFrameSep used by framed.sty is later set to \topsep hence 0pt.
+ % - if caption: distance from last text baseline to caption baseline is
+ % A+(B-F)+\ht\strutbox, A = \abovecaptionskip (default 10pt), B =
+ % \baselineskip, F is the framed.sty \FrameHeightAdjust macro, default 6pt.
+ % Formula valid for F < 10pt.
+ % - distance of baseline of caption to top of frame is like for tables:
+ % \sphinxbelowcaptionspace (=0.5\baselineskip)
+ % - if no caption: distance of last text baseline to code frame is S+(B-F),
+ % with S = \sphinxverbatimtopskip (=\smallskip)
+ % - and distance from bottom of frame to next text baseline is
+ % \baselineskip+\parskip.
+ % The \trivlist is used to avoid possible "too deeply nested" error.
+ \itemsep \z@skip
+ \topsep \z@skip
+ \partopsep \z@skip
+ % trivlist will set \parsep to \parskip (which itself is set to zero above)
+ % \leftmargin will be set to zero by trivlist
+ \rightmargin\z@
+ \parindent \z@% becomes \itemindent. Default zero, but perhaps overwritten.
+ \trivlist\item\relax
+ \ifspx@inframed\setbox\sphinxVerbatim@ContentsBox\vbox\bgroup
+ \@setminipage\hsize\linewidth
+ % use bulk of minipage paragraph shape restores (this is needed
+ % in indented contexts, at least for some)
+ \textwidth\hsize \columnwidth\hsize \@totalleftmargin\z@
+ \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip
+ \else
+ \ifsphinxverbatimwithminipage\noindent\begin{minipage}{\linewidth}\fi
+ \MakeFramed {% adapted over from framed.sty's snugshade environment
+ \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage
+ }%
+ \fi
+ % For grid placement from \strut's in \FancyVerbFormatLine
+ \lineskip\z@skip
+ % active comma should not be overwritten by \@noligs
+ \ifspx@opt@verbatimwrapslines
+ \let\verbatim@nolig@list \sphinx@verbatim@nolig@list
+ \fi
+ % optimization: as codelines will be handled inside boxes, \everypar is
+ % never reset, and it issues \@minipagefalse repeatedly (from \@setminipage).
+ % As fancyvrb Verbatim will do \@minipagefalse itself, let's simplify things.
+ \everypar{}%
+ \color@begingroup % protect against color leaks (upstream framed.sty bug)
+ \ifspx@pre@withtextcolor\color{VerbatimTextColor}\fi % mostly shadowed by
+ % Pygments highlighting anyhow
+ \spx@pre@TeXextras
+ % will fetch its optional arguments if any
+ \OriginalVerbatim
+}%
+{%
+ \endOriginalVerbatim
+ \color@endgroup % matches the \color@begingroup
+ \ifspx@inframed
+ \egroup % finish \sphinxVerbatim@ContentsBox vbox
+ \nobreak % update page totals
+%%%%
+% MEMO (2022/07/09, while preparing 5.1.0 LaTeX CSS-style sphinxsetup options)
+% This test will systematically cause to abandon framing if the code-block
+% is near bottom of a warning-type notice which TeX has not yet decided whether
+% it fits on current page and which is near bottom of page. Indeed the
+% \pagetotal will already be very near \pagegoal. This is probably a not
+% intended behaviour, and perhaps the whole thing should be removed? Indeed
+% the result is surprising then because the notice will be split, code-block
+% will be on page 2 and will have no background-color, no border.
+ \ifdim\dimexpr
+ \ht\sphinxVerbatim@ContentsBox+
+ \dp\sphinxVerbatim@ContentsBox+
+ \ht\sphinxVerbatim@TitleBox+
+ \dp\sphinxVerbatim@TitleBox+
+ % 6.2.0 uses here the dimen registers from sphinxpackageboxes.sty,
+ % they got setup by \spx@verb@boxes@fcolorbox@setup
+ \spx@boxes@padding@top+
+ \spx@boxes@padding@bottom+
+ \ifspx@opt@verbatimwithframe \spx@boxes@border@top+
+ \spx@boxes@border@bottom+\fi
+ % try to account for external frame parameters
+ % MEMO: this is because the sphinxheavybox (for warning admonitions)
+ % environment sets \FrameSep and \FrameRule
+ % TODO: fix this bad implicit dependency
+ \FrameSep+\FrameRule+
+ % Usage here of 2 baseline distances is empirical.
+ % In border case where code-block fits barely in remaining space,
+ % it gets framed and looks good but the outer frame may continue
+ % on top of next page and give (if no contents after code-block)
+ % an empty framed line, as testing showed.
+ 2\baselineskip+
+ % now add all to accumulated page totals and compare to \pagegoal
+ \pagetotal+\pagedepth>\pagegoal
+ % long contents: do not \MakeFramed. Do make a caption (either before or
+ % after) if title exists. Continuation hints across pagebreaks dropped.
+ % FIXME? a bottom caption may end up isolated at top of next page
+ % (no problem with a top caption, which is default)
+ \spx@opt@verbatimwithframefalse
+ \def\sphinxVerbatim@Title{\noindent\box\sphinxVerbatim@TitleBox\par}%
+ \sphinxVerbatim@Before
+ \noindent\unvbox\sphinxVerbatim@ContentsBox\par
+ \sphinxVerbatim@After
+ \else
+ % short enough contents: use \MakeFramed. As it is nested, this requires
+ % minipage encapsulation.
+ \noindent\begin{minipage}{\linewidth}%
+ \MakeFramed {% Use it now with the fetched contents
+ \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage
+ }%
+ \unvbox\sphinxVerbatim@ContentsBox
+ % the \@minipagefalse is superfluous, actually.
+ \par\unskip\@minipagefalse\endMakeFramed
+ \end{minipage}%
+ \fi
+ \else % non-nested \MakeFramed
+ \par\unskip\@minipagefalse\endMakeFramed % from framed.sty snugshade
+ \ifsphinxverbatimwithminipage\end{minipage}\fi
+ \fi
+ \endtrivlist
+}
+\newenvironment {sphinxVerbatimNoFrame}
+ {\spx@opt@verbatimwithframefalse
+ \VerbatimEnvironment
+ \begin{sphinxVerbatim}}
+ {\end{sphinxVerbatim}}
+\newenvironment {sphinxVerbatimintable}
+ {% don't use a frame if in a table cell
+ \spx@opt@verbatimwithframefalse
+ \sphinxverbatimwithminipagetrue
+ % the literal block caption uses \sphinxcaption which is wrapper of \caption,
+ % but \caption must be modified because longtable redefines it to work only
+ % for the own table caption, and tabulary has multiple passes
+ \let\caption\sphinxfigcaption
+ % reduce above caption skip
+ \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}%
+ \VerbatimEnvironment
+ \begin{sphinxVerbatim}}
+ {\end{sphinxVerbatim}}
+
+
+%% PARSED LITERALS
+% allow long lines to wrap like they do in code-blocks
+
+% this should be kept in sync with definitions in sphinx.util.texescape
+\newcommand*\sphinxbreaksattexescapedchars{%
+ \def\do##1##2% put potential break point before character
+ {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}%
+ \do\{\{\do\textless\<\do\#\#\do\%\%\do\$\$% {, <, #, %, $
+ \def\do##1##2% put potential break point after character
+ {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}%
+ \do\_\_\do\}\}\do\textasciicircum\^\do\&\&% _, }, ^, &,
+ \do\textgreater\>\do\textasciitilde\~% >, ~
+ \do\textbackslash\\% \
+}
+\newcommand*\sphinxbreaksviaactiveinparsedliteral{%
+ \sphinxbreaksviaactive % by default handles . , ; ? ! /
+ \lccode`\~`\~ %
+ % update \dospecials as it is used by \url
+ % but deactivation will already have been done hence this is unneeded:
+ % \expandafter\def\expandafter\dospecials\expandafter{\dospecials
+ % \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist\do\-}%
+}
+\newcommand*\sphinxbreaksatspaceinparsedliteral{%
+ \lccode`~32 \lowercase{\let~}\spx@verbatim@space\lccode`\~`\~
+}
+\newcommand*{\sphinxunactivateextras}{\let\do\@makeother
+ \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist}%
+% the \catcode13=5\relax (deactivate end of input lines) is left to callers
+\newcommand*{\sphinxunactivateextrasandspace}{\catcode32=10\relax
+ \sphinxunactivateextras}%
+% alltt uses a monospace font and linebreaks at dashes (which are escaped
+% to \sphinxhyphen{} which expands to -\kern\z@) are inhibited with pdflatex.
+% Not with xelatex (cf \defaultfontfeatures in latex writer), so:
+\newcommand*{\sphinxhypheninparsedliteral}{\sphinxhyphennobreak}
+% now for the modified alltt environment
+\newenvironment{sphinxalltt}
+{% at start of next line to workaround Emacs/AUCTeX issue with this file
+\begin{alltt}%
+ \ifspx@opt@parsedliteralwraps
+ \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}%
+ \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}%
+ \let\sphinxhyphen\sphinxhypheninparsedliteral
+ \sphinxbreaksattexescapedchars
+ \sphinxbreaksviaactiveinparsedliteral
+ \sphinxbreaksatspaceinparsedliteral
+% alltt takes care of the ' as derivative ("prime") in math mode
+ \everymath\expandafter{\the\everymath\sphinxunactivateextrasandspace
+ \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }%
+% not sure if displayed math (align,...) can end up in parsed-literal, anyway
+ \everydisplay\expandafter{\the\everydisplay
+ \catcode13=5 \sphinxunactivateextrasandspace
+ \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }%
+ \fi }
+{\end{alltt}}
+
+
+%% INLINE MARK-UP
+%
+
+% Protect \href's first argument in contexts such as sphinxalltt (or
+% \sphinxcode). Sphinx uses \#, \%, \& ... always inside \sphinxhref.
+\protected\def\sphinxhref#1#2{{%
+ \sphinxunactivateextrasandspace % never do \scantokens with active space!
+% for the \endlinechar business, https://github.com/latex3/latex2e/issues/286
+ \endlinechar\m@ne\everyeof{{\endlinechar13 #2}}% keep catcode regime for #2
+ \scantokens{\href{#1}}% normalise it for #1 during \href expansion
+}}
+% Same for \url. And also \nolinkurl for coherence.
+\protected\def\sphinxurl#1{{%
+ \sphinxunactivateextrasandspace\everyeof{}% (<- precaution for \scantokens)
+ \endlinechar\m@ne\scantokens{\url{#1}}%
+}}
+\protected\def\sphinxnolinkurl#1{{%
+ \sphinxunactivateextrasandspace\everyeof{}%
+ \endlinechar\m@ne\scantokens{\nolinkurl{#1}}%
+}}
+
+% \sphinxupquote
+% to obtain straight quotes we execute \@noligs as patched by upquote, and
+% \scantokens is needed in cases where it would be too late for the macro to
+% first set catcodes and then fetch its argument. We also make the contents
+% breakable at non-escaped . , ; ? ! / using \sphinxbreaksviaactive,
+% and also at \ character (which is escaped to \textbackslash{}).
+\protected\def\sphinxtextbackslashbreakbefore
+ {\discretionary{}{\sphinxafterbreak\sphinx@textbackslash}{\sphinx@textbackslash}}
+\protected\def\sphinxtextbackslashbreakafter
+ {\discretionary{\sphinx@textbackslash}{\sphinxafterbreak}{\sphinx@textbackslash}}
+\let\sphinxtextbackslash\sphinxtextbackslashbreakafter
+% - is escaped to \sphinxhyphen{} and this default ensures no linebreak
+% behaviour (also with a non monospace font, or with xelatex)
+\newcommand*{\sphinxhyphenininlineliteral}{\sphinxhyphennobreak}
+% the macro must be protected if it ends up used in moving arguments,
+% in 'alltt' \@noligs is done already, and the \scantokens must be avoided.
+\protected\def\sphinxupquote#1{{\def\@tempa{alltt}%
+ \ifx\@tempa\@currenvir\else
+ \let\sphinxhyphen\sphinxhyphenininlineliteral
+ \ifspx@opt@inlineliteralwraps
+ % break at . , ; ? ! /
+ \sphinxbreaksviaactive
+ % break also at \
+ \setbox8=\hbox{\textbackslash}%
+ \def\sphinx@textbackslash{\copy8}%
+ \let\textbackslash\sphinxtextbackslash
+ % by default, no continuation symbol on next line but may be added
+ \let\sphinxafterbreak\sphinxafterbreakofinlineliteral
+ % do not overwrite the comma set-up
+ \let\verbatim@nolig@list\sphinx@literal@nolig@list
+ \fi
+ % fix a space-gobbling issue due to LaTeX's original \do@noligs
+% TODO: using \@noligs as patched by upquote.sty is now unneeded because
+% either ` and ' are escaped (non-unicode engines) or they don't build
+% ligatures (unicode engines). Thus remove this and unify handling of `, <, >,
+% ' and - with the characters . , ; ? ! / as handled via
+% \sphinxbreaksviaactive.
+% Hence \sphinx@do@noligs will be removed, or rather replaced with code
+% inserting discretionaries, as they allow a continuation symbol on start of
+% next line to achieve common design with code-blocks.
+% TODO: do the above TODO!
+% Extend \sphinxunactivateextras for \sphinxhref as the latter may
+% actually be in the scope of \sphinxupquote and does a \scantokens
+% of its own.
+ \expandafter\def\expandafter\sphinxunactivateextras\expandafter
+ {\sphinxunactivateextras\verbatim@nolig@list}%
+ \let\do@noligs\sphinx@do@noligs
+ \@noligs\endlinechar\m@ne\everyeof{}% (<- in case inside \sphinxhref)
+ \expandafter\scantokens
+ \fi {{#1}}}}% extra brace pair to fix end-space gobbling issue...
+\def\sphinx@do@noligs #1{\catcode`#1\active\begingroup\lccode`\~`#1\relax
+ \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1 }}}
+\def\sphinx@literal@nolig@list {\do\`\do\<\do\>\do\'\do\-}%
+\let\sphinxafterbreakofinlineliteral\empty
+
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexnumfig.sty b/sphinx/texinputs/sphinxlatexnumfig.sty
new file mode 100644
index 0000000..6d72961
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexnumfig.sty
@@ -0,0 +1,122 @@
+%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexnumfig.sty}[2021/01/27 numbering]
+
+% Requires: remreset (old LaTeX only)
+% relates to numfig and numfig_secnum_depth configuration variables
+
+% LaTeX 2018-04-01 and later provides \@removefromreset
+\ltx@ifundefined{@removefromreset}
+ {\RequirePackage{remreset}}
+ {}% avoid warning
+% Everything is delayed to \begin{document} to allow hyperref patches into
+% \newcounter to solve duplicate label problems for internal hyperlinks to
+% code listings (literalblock counter). User or extension re-definitions of
+% \theliteralblock, et al., thus have also to be delayed. (changed at 3.5.0)
+\AtBeginDocument{%
+\ltx@ifundefined{c@chapter}
+ {\newcounter{literalblock}}%
+ {\newcounter{literalblock}[chapter]%
+ \def\theliteralblock{\ifnum\c@chapter>\z@\arabic{chapter}.\fi
+ \arabic{literalblock}}%
+ }%
+\ifspx@opt@nonumfigreset
+ \ltx@ifundefined{c@chapter}{}{%
+ \@removefromreset{figure}{chapter}%
+ \@removefromreset{table}{chapter}%
+ \@removefromreset{literalblock}{chapter}%
+ \ifspx@opt@mathnumfig
+ \@removefromreset{equation}{chapter}%
+ \fi
+ }%
+ \def\thefigure{\arabic{figure}}%
+ \def\thetable {\arabic{table}}%
+ \def\theliteralblock{\arabic{literalblock}}%
+ \ifspx@opt@mathnumfig
+ \def\theequation{\arabic{equation}}%
+ \fi
+\else
+\let\spx@preAthefigure\@empty
+\let\spx@preBthefigure\@empty
+% \ifspx@opt@usespart % <-- LaTeX writer could pass such a 'usespart' boolean
+% % as sphinx.sty package option
+% If document uses \part, (triggered in Sphinx by latex_toplevel_sectioning)
+% LaTeX core per default does not reset chapter or section
+% counters at each part.
+% But if we modify this, we need to redefine \thechapter, \thesection to
+% include the part number and this will cause problems in table of contents
+% because of too wide numbering. Simplest is to do nothing.
+% \fi
+\ifnum\spx@opt@numfigreset>0
+ \ltx@ifundefined{c@chapter}
+ {}
+ {\g@addto@macro\spx@preAthefigure{\ifnum\c@chapter>\z@\arabic{chapter}.}%
+ \g@addto@macro\spx@preBthefigure{\fi}}%
+\fi
+\ifnum\spx@opt@numfigreset>1
+ \@addtoreset{figure}{section}%
+ \@addtoreset{table}{section}%
+ \@addtoreset{literalblock}{section}%
+ \ifspx@opt@mathnumfig
+ \@addtoreset{equation}{section}%
+ \fi%
+ \g@addto@macro\spx@preAthefigure{\ifnum\c@section>\z@\arabic{section}.}%
+ \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>2
+ \@addtoreset{figure}{subsection}%
+ \@addtoreset{table}{subsection}%
+ \@addtoreset{literalblock}{subsection}%
+ \ifspx@opt@mathnumfig
+ \@addtoreset{equation}{subsection}%
+ \fi%
+ \g@addto@macro\spx@preAthefigure{\ifnum\c@subsection>\z@\arabic{subsection}.}%
+ \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>3
+ \@addtoreset{figure}{subsubsection}%
+ \@addtoreset{table}{subsubsection}%
+ \@addtoreset{literalblock}{subsubsection}%
+ \ifspx@opt@mathnumfig
+ \@addtoreset{equation}{subsubsection}%
+ \fi%
+ \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubsection>\z@\arabic{subsubsection}.}%
+ \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>4
+ \@addtoreset{figure}{paragraph}%
+ \@addtoreset{table}{paragraph}%
+ \@addtoreset{literalblock}{paragraph}%
+ \ifspx@opt@mathnumfig
+ \@addtoreset{equation}{paragraph}%
+ \fi%
+ \g@addto@macro\spx@preAthefigure{\ifnum\c@subparagraph>\z@\arabic{subparagraph}.}%
+ \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\ifnum\spx@opt@numfigreset>5
+ \@addtoreset{figure}{subparagraph}%
+ \@addtoreset{table}{subparagraph}%
+ \@addtoreset{literalblock}{subparagraph}%
+ \ifspx@opt@mathnumfig
+ \@addtoreset{equation}{subparagraph}%
+ \fi%
+ \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubparagraph>\z@\arabic{subsubparagraph}.}%
+ \g@addto@macro\spx@preBthefigure{\fi}%
+\fi
+\expandafter\g@addto@macro
+\expandafter\spx@preAthefigure\expandafter{\spx@preBthefigure}%
+\let\thefigure\spx@preAthefigure
+\let\thetable\spx@preAthefigure
+\let\theliteralblock\spx@preAthefigure
+\g@addto@macro\thefigure{\arabic{figure}}%
+\g@addto@macro\thetable{\arabic{table}}%
+\g@addto@macro\theliteralblock{\arabic{literalblock}}%
+ \ifspx@opt@mathnumfig
+ \let\theequation\spx@preAthefigure
+ \g@addto@macro\theequation{\arabic{equation}}%
+ \fi
+\fi
+}% end of big \AtBeginDocument
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexobjects.sty b/sphinx/texinputs/sphinxlatexobjects.sty
new file mode 100644
index 0000000..5d9b69b
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexobjects.sty
@@ -0,0 +1,365 @@
+%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexobjects.sty}[2023/07/23 documentation environments]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - environments
+%
+% - fulllineitems
+% - productionlist
+% - optionlist
+% - DUlineblock (also "lineblock")
+%
+% - macros
+%
+% - \DUrole
+% - various legacy support macros related to author and release
+% data of documented objects and modules.
+
+% \moduleauthor{name}{email}
+\newcommand{\moduleauthor}[2]{}
+
+% \sectionauthor{name}{email}
+\newcommand{\sectionauthor}[2]{}
+
+% Allow the release number to be specified independently of the
+% \date{}. This allows the date to reflect the document's date and
+% release to specify the release that is documented.
+%
+\newcommand{\py@release}{\releasename\space\version}
+\newcommand{\version}{}% part of \py@release, used by title page and headers
+% \releaseinfo is used on titlepage (sphinxmanual.cls, sphinxhowto.cls)
+\newcommand{\releaseinfo}{}
+\newcommand{\setreleaseinfo}[1]{\renewcommand{\releaseinfo}{#1}}
+% this is inserted via template and #1=release config variable
+\newcommand{\release}[1]{\renewcommand{\version}{#1}}
+% this is defined by template to 'releasename' latex_elements key
+\newcommand{\releasename}{}
+% Fix issue in case release and releasename deliberately left blank
+\newcommand{\sphinxheadercomma}{, }% used in fancyhdr header definition
+\newcommand{\sphinxifemptyorblank}[1]{%
+% test after one expansion of macro #1 if contents is empty or spaces
+ \if&\expandafter\@firstofone\detokenize\expandafter{#1}&%
+ \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}%
+\AtBeginDocument {%
+ \sphinxifemptyorblank{\releasename}
+ {\sphinxifemptyorblank{\version}{\let\sphinxheadercomma\empty}{}}
+ {}%
+}%
+
+% Allow specification of the author's address separately from the
+% author's name. This can be used to format them differently, which
+% is a good thing.
+%
+\newcommand{\py@authoraddress}{}
+\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}}
+
+% {fulllineitems} is the main environment for object descriptions.
+%
+% With 4.0.0 \pysigline (and \pysiglinewithargsret), used in a fulllineitems
+% environment the #1 will already be of the width which is computed here, i.e.
+% the available width on line, so the \makebox becomes a bit superfluous
+\newcommand{\py@itemnewline}[1]{% macro used as \makelabel in fulllineitems
+% Memo: this presupposes \itemindent is 0pt
+ \kern\labelsep % because \@labels core latex box does \hskip-\labelsep
+ \makebox[\dimexpr\linewidth+\labelwidth\relax][l]{#1}%
+ \kern-\labelsep % because at end of \@labels box there is \hskip\labelsep
+}
+
+\newenvironment{fulllineitems}{%
+ \begin{list}{}{\labelwidth \leftmargin
+ \rightmargin \z@ \topsep -\parskip \partopsep \parskip
+ \itemsep -\parsep
+ \let\makelabel=\py@itemnewline}%
+}{\end{list}}
+
+% Signatures, possibly multi-line
+%
+% For legacy reasons Sphinx uses LaTeX \list and \item's for signatures
+% This is delicate:
+% - the actual item label is not typeset immediately by \item but later as part
+% of the \everypar which will be triggered by either next paragraph or a manual
+% \leavevmode, or if nothing in-between by the next \item,
+% - \begingroup <set-up>\item[foo] <setup>\endgroup leads to errors,
+% - vertical space depends on \parskip and \itemsep values in somewhat
+% subtle manners.
+%
+% Since the 2022/01/13 version things are simpler as \parskip is simply set
+% to zero during execution of \pysigline/\pysiglinewithargsret
+%
+% Parameter for separation via \itemsep of multiple signatures with common desc
+\newlength\sphinxsignaturesep
+\setlength\sphinxsignaturesep{\smallskipamount}
+% latex.py outputs mark-up like this:
+% \pysigstartsignatures <signatures> \pysigstopsignatures <actual desc>
+\newcommand{\pysigstartsignatures}{%
+ % store current \parskip and \itemsep
+ \edef\pysig@restore@itemsep@and@parskip{%
+ \itemsep\the\itemsep\relax
+ \parskip\the\parskip\relax
+ }%
+ % set them to control the spacing between signatures sharing common desc
+ \parskip\z@skip
+ \itemsep\sphinxsignaturesep
+}
+\newcommand{\pysigstopsignatures}{%
+% 1) encourage a pagebreak in an attempt to try to avoid last
+% signature ending up separated from description (due to voodoo next)
+\penalty-100
+% 2) some voodoo to separate last signature from description in a manner
+% robust with respect to the latter being itself a LaTeX list object
+\leavevmode\par\kern-\baselineskip\item[\strut]
+%
+ \leavevmode
+ % it is important \leavevmode was issued before the \parskip reset, and
+ % it is also needed for the case of an object desc itself a LaTeX \list
+ % now restore \itemsep and \parskip
+ \pysig@restore@itemsep@and@parskip
+}
+% Each signature is rendered as NAME<SPACE>[TPLIST]<SPACE>(ARGLIST) where the
+% size of <SPACE> is parametrized by \sphinxsignaturelistskip (0pt by default).
+\newlength\sphinxsignaturelistskip
+\setlength\sphinxsignaturelistskip{0pt}
+\newcommand{\pysigtypelistopen}{\hskip\sphinxsignaturelistskip\sphinxcode{[}}
+\newcommand{\pysigtypelistclose}{\sphinxcode{]}}
+\newcommand{\pysigarglistopen}{\hskip\sphinxsignaturelistskip\sphinxcode{(}}
+\newcommand{\pysigarglistclose}{\sphinxcode{)}}
+%
+% Use a \parbox to accommodate long argument list in signatures
+% LaTeX did not imagine that an \item label could need multi-line rendering
+\newlength{\py@argswidth}
+\newcommand{\py@sigparams}[2]{%
+ % The \py@argswidth has been computed in \pysiglinewithargsret to make the
+ % argument list use full available width
+ \parbox[t]{\py@argswidth}{\raggedright #1\pysigarglistclose#2\strut}%
+ % final strut is to help get correct vertical separation
+}
+\newcommand{\py@sigparamswithtypelist}[3]{%
+ % similar to \py@sigparams but with different delimiters and an additional
+ % type parameters list given as #1, the argument list as #2 and the return
+ % annotation as #3
+ \parbox[t]{\py@argswidth}{%
+ \raggedright #1\pysigtypelistclose%
+ \pysigarglistopen#2\pysigarglistclose%
+ #3\strut}%
+}
+
+\newcommand{\pysigline}[1]{%
+ % as \py@argswidth is available, we use it but no "args" here
+ % the \relax\relax is because \py@argswidth is a "skip" variable
+ % this will make the label occupy the full available linewidth
+ \py@argswidth=\dimexpr\linewidth+\labelwidth\relax\relax
+ \item[{\parbox[t]{\py@argswidth}{\raggedright #1\strut}}]
+ \pysigadjustitemsep
+}
+\newcommand{\pysiglinewithargsret}[3]{%
+ % as #1 may contain a footnote using \label we need to make \label
+ % a no-op here to avoid LaTeX complaining about duplicates
+\let\spx@label\label\let\label\@gobble
+ \settowidth{\py@argswidth}{#1\pysigarglistopen}%
+\let\label\spx@label
+ \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
+ \item[{#1\pysigarglistopen\py@sigparams{#2}{#3}\strut}]
+ \pysigadjustitemsep
+}
+\newcommand{\pysiglinewithargsretwithtypelist}[4]{
+% #1 = name, #2 = typelist, #3 = arglist, #4 = retann
+\let\spx@label\label\let\label\@gobble
+ \settowidth{\py@argswidth}{#1\pysigtypelistopen}%
+\let\label\spx@label
+ \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
+ \item[{#1\pysigtypelistopen\py@sigparamswithtypelist{#2}{#3}{#4}\strut}]
+ \pysigadjustitemsep
+}
+
+\def\sphinxoptionalextraspace{0.5mm}
+\newcommand{\pysigwithonelineperarg}[3]{%
+ % render each argument on its own line
+ \item[#1\pysigarglistopen\strut]
+ \leavevmode\par\nopagebreak
+ % this relies on \pysigstartsignatures having set \parskip to zero
+ \begingroup
+ \let\sphinxparamcomma\sphinxparamcommaoneperline
+ \def\sphinxoptionalhook{\ifvmode\else\kern\sphinxoptionalextraspace\relax\fi}%
+ % The very first \sphinxparam should not emit a \par hence a complication
+ % with a group and global definition here as it may occur in a \sphinxoptional
+ \global\let\spx@sphinxparam\sphinxparam
+ \gdef\sphinxparam{\gdef\sphinxparam{\par\spx@sphinxparam}\spx@sphinxparam}%
+ #2\par
+ \endgroup
+ \global\let\sphinxparam\spx@sphinxparam
+ % fulllineitems sets \labelwidth to be like \leftmargin
+ \nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#3}
+ \pysigadjustitemsep
+}
+\newcommand{\pysigwithonelineperargwithonelinepertparg}[4]{
+ % #1 = name, #2 = typelist, #3 = arglist, #4 = retann
+ % render each type parameter and argument on its own line
+ \item[#1\pysigtypelistopen\strut]
+ \leavevmode\par\nopagebreak
+ \begingroup
+ \let\sphinxparamcomma\sphinxparamcommaoneperline
+ % \sphinxtypeparam is treated similarly to \sphinxparam but since
+ % \sphinxoptional is not accepted in a type parameters list, we do
+ % not need the hook or the global definition
+ \let\spx@sphinxtypeparam\sphinxtypeparam
+ \def\sphinxtypeparam{\def\sphinxtypeparam{\par\spx@sphinxtypeparam}\spx@sphinxtypeparam}%
+ #2\par
+ \endgroup
+ \nopagebreak\noindent\kern-\labelwidth\pysigtypelistclose%
+ % render the rest of the signature like in \pysigwithonelineperarg
+ \pysigarglistopen\strut\par\nopagebreak
+ \begingroup
+ \let\sphinxparamcomma\sphinxparamcommaoneperline
+ \def\sphinxoptionalhook{\ifvmode\else\kern\sphinxoptionalextraspace\relax\fi}%
+ \global\let\spx@sphinxparam\sphinxparam
+ \gdef\sphinxparam{\gdef\sphinxparam{\par\spx@sphinxparam}\spx@sphinxparam}%
+ #3\par
+ \endgroup
+ \global\let\sphinxparam\spx@sphinxparam
+ \nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#4}
+ \pysigadjustitemsep
+}
+\newcommand{\pysiglinewithargsretwithonelinepertparg}[4]{
+ % #1 = name, #2 = typelist, #3 = arglist, #4 = retann
+ % render each type parameter on its own line but the arguments list inline
+ \item[#1\pysigtypelistopen\strut]
+ \leavevmode\par\nopagebreak
+ \begingroup
+ \let\sphinxparamcomma\sphinxparamcommaoneperline
+ % \sphinxtypeparam is treated similarly to \sphinxparam but since
+ % \sphinxoptional is not accepted in a type parameters list, we do
+ % not need the hook or the global definition
+ \let\spx@sphinxtypeparam\sphinxtypeparam
+ \def\sphinxtypeparam{\def\sphinxtypeparam{\par\spx@sphinxtypeparam}\spx@sphinxtypeparam}%
+ #2\par
+ \endgroup
+ \nopagebreak\noindent\kern-\labelwidth\pysigtypelistclose%
+ % render the arguments list on one line
+ \pysigarglistopen#3\pysigarglistclose#4\strut
+ \pysigadjustitemsep
+}
+\newcommand{\pysigwithonelineperargwithtypelist}[4]{
+ % #1 = name, #2 = typelist, #3 = arglist, #4 = retann
+ % render the type parameters list on one line, but each argument is rendered on its own line
+\let\spx@label\label\let\label\@gobble
+ \settowidth{\py@argswidth}{#1\pysigtypelistopen}%
+\let\label\spx@label
+ \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax
+ \item[{#1\pysigtypelistopen\parbox[t]{\py@argswidth}{%
+ \raggedright #2\pysigtypelistclose\pysigarglistopen\strut}\strut}]
+ % render the rest of the signature like in \pysigwithonelineperarg
+ \begingroup
+ \let\sphinxparamcomma\sphinxparamcommaoneperline
+ \def\sphinxoptionalhook{\ifvmode\else\kern\sphinxoptionalextraspace\relax\fi}%
+ \global\let\spx@sphinxparam\sphinxparam
+ \gdef\sphinxparam{\gdef\sphinxparam{\par\spx@sphinxparam}\spx@sphinxparam}%
+ #3\par
+ \endgroup
+ \global\let\sphinxparam\spx@sphinxparam
+ \nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#4}
+ \pysigadjustitemsep
+}
+\newcommand{\pysigadjustitemsep}{%
+ % adjust \itemsep to control the separation with the next signature
+ % sharing common description
+ \ifsphinxsigismultiline
+ % inside a multiline signature, no extra vertical spacing
+ % ("multiline" here does not refer to possibly long
+ % list of arguments, but to a cpp domain feature)
+ \itemsep\z@skip
+ \else
+ \itemsep\sphinxsignaturesep
+ \fi
+}
+\newif\ifsphinxsigismultiline
+\newcommand{\pysigstartmultiline}{\sphinxsigismultilinetrue}%
+\newcommand{\pysigstopmultiline}{\sphinxsigismultilinefalse\itemsep\sphinxsignaturesep}%
+
+% Production lists
+%
+\newenvironment{productionlist}{%
+% \def\sphinxoptional##1{{\Large[}##1{\Large]}}
+ \def\production##1##2{\\\sphinxcode{\sphinxupquote{##1}}&::=&\sphinxcode{\sphinxupquote{##2}}}%
+ \def\productioncont##1{\\& &\sphinxcode{\sphinxupquote{##1}}}%
+ \parindent=2em
+ \indent
+ \setlength{\LTpre}{0pt}%
+ \setlength{\LTpost}{0pt}%
+ \begin{longtable}[l]{lcl}
+}{%
+ \end{longtable}
+}
+
+% Definition lists; requested by AMK for HOWTO documents. Probably useful
+% elsewhere as well, so keep in in the general style support.
+%
+\newenvironment{definitions}{%
+ \begin{description}%
+ \def\term##1{\item[{##1}]\mbox{}\\*[0mm]}%
+}{%
+ \end{description}%
+}
+
+%% FROM DOCTUTILS LATEX WRITER
+%
+% The following is stuff copied from docutils' latex writer.
+%
+\newcommand{\optionlistlabel}[1]{\normalfont\bfseries #1 \hfill}% \bf deprecated
+\newenvironment{optionlist}[1]
+{\begin{list}{}
+ {\setlength{\labelwidth}{#1}%
+ \setlength{\rightmargin}{1cm}%
+ \setlength{\leftmargin}{\rightmargin}%
+ \addtolength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\optionlistlabel}}%
+}{\end{list}}
+
+\newlength{\lineblockindentation}
+\setlength{\lineblockindentation}{2.5em}
+\newenvironment{lineblock}[1]
+{\begin{list}{}
+ {\setlength{\partopsep}{\parskip}%
+ \addtolength{\partopsep}{\baselineskip}%
+ \topsep0pt\itemsep0.15\baselineskip\parsep0pt
+ \leftmargin#1\relax}%
+ \raggedright}
+{\end{list}}
+
+% From docutils.writers.latex2e
+% inline markup (custom roles)
+% \DUrole{#1}{#2} tries \DUrole#1{#2}
+\providecommand*{\DUrole}[2]{%
+ \ifcsname DUrole\detokenize{#1}\endcsname
+ \csname DUrole\detokenize{#1}\endcsname{#2}%
+ \else% backwards compatibility: try \docutilsrole#1{#2}
+ \ifcsname docutilsrole\detokenize{#1}\endcsname
+ \csname docutilsrole\detokenize{#1}\endcsname{#2}%
+ \else
+ #2%
+ \fi
+ \fi
+}
+
+\providecommand*{\DUprovidelength}[2]{%
+ \ifdefined#1\else\newlength{#1}\setlength{#1}{#2}\fi
+}
+
+\DUprovidelength{\DUlineblockindent}{2.5em}
+\ifdefined\DUlineblock\else
+ \newenvironment{DUlineblock}[1]{%
+ \list{}{\setlength{\partopsep}{\parskip}%
+ \addtolength{\partopsep}{\baselineskip}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\itemsep}{0.15\baselineskip}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\leftmargin}{#1}}%
+ \raggedright
+ }
+ {\endlist}
+\fi
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexshadowbox.sty b/sphinx/texinputs/sphinxlatexshadowbox.sty
new file mode 100644
index 0000000..a2a1a0e
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexshadowbox.sty
@@ -0,0 +1,116 @@
+%% TOPIC AND CONTENTS BOXES
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexshadowbox.sty}[2023/03/19 sphinxShadowBox]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - sphinxShadowBox (environment)
+%
+% Dependencies (they do not need to be defined at time of loading):
+%
+% - of course the various colour and dimension options handled via sphinx.sty
+% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty
+% - \savenotes/\spewnotes from sphinxpackagefootnote
+% - \ifspx@inframed defined in sphinx.sty
+%
+% Requires:
+\RequirePackage{framed}
+\RequirePackage{sphinxpackageboxes}
+
+% At 5.1.0 the code formerly here in a definition of \spx@ShadowFBox has been
+% refactored to hand over to a more powerful \spx@boxes@fcolorbox provided by
+% file sphinxpackageboxes.sty, it can draw rounded corners and add a background
+% color.
+
+% At 6.2.0, \spx@ShadowFBox is so much simplified that it is now not
+% separately defined but directly incorporated into the \FrameCommand
+% definition done by sphinxShadowBox environment below.
+
+% Use framed.sty \MakeFramed/\endMakeFramed to allow page breaks for topic
+% boxes. Originally Sphinx used \shadowbox from fancybox.sty but it did not
+% allow pagebreaks (which was problematic for "contents" directive if there
+% are many subsections).
+%
+% Docutils does not allow topic to be nested within topics or other body
+% elements. But the LaTeX code here does allow it:
+%
+% - a topic inside another topic would be rendered in a minipage (thus not
+% allowing pagebreaks). Its external frame would adapt perfectly to
+% the *current (smaller) width for text*.
+%
+% - a topic inside (nested) lists or quote environments would have its frame
+% take the *full width* of the page, but its text contents on the other hand
+% would obey exactly the current indentation plus inner separation. This is
+% in contrast with the framing used for literal blocks, also based, but in a
+% more sophisticated way on usage of \MakeFramed/\endMakeFramed, and
+% adjusting to current text indentation.
+\newenvironment{sphinxShadowBox}
+ {%
+ \spx@boxes@fcolorbox@setup{topic}%
+ % we will use the dimen registers from sphinxpackageboxes.sty which now hold
+ % the values from options related to topic/contents
+ % MEMO: \spx@boxes@fcolorbox creates an \hbox but does not quit vertical
+ % mode; but in context of framed.sty's \FrameCommand TeX is already
+ % in restricted horizontal mode, so no need for a \leavevmode here.
+ \def\FrameCommand {\spx@boxes@fcolorbox}%
+ % 6.2.0 adds support for div.topic_box-decoration-break=slice.
+ % (it is yet undecided if slice style should inhibit a bottom shadow)
+ \ifspx@topic@border@open
+ \def\FirstFrameCommand
+ {\spx@boxes@fcolorbox@setup@openbottom\FrameCommand}%
+ \def\MidFrameCommand
+ {\spx@boxes@fcolorbox@setup@openboth \FrameCommand}%
+ \def\LastFrameCommand
+ {\spx@boxes@fcolorbox@setup@opentop \FrameCommand}%
+ \fi
+ \advance\spx@image@maxheight
+ -\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom
+ +\spx@boxes@padding@top+\spx@boxes@padding@bottom
+ +\ifdim\spx@boxes@shadow@yoffset<\z@-\fi\spx@boxes@shadow@yoffset
+ +\baselineskip\relax
+ % configure framed.sty not to add extra vertical spacing
+ \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}%
+ % the \trivlist will add the vertical spacing on top and bottom which is
+ % typical of center environment as used in Sphinx <= 1.4.1
+ % the \noindent has the effet of an extra blank line on top, to
+ % imitate closely the layout from Sphinx <= 1.4.1; the \FrameHeightAdjust
+ % will put top part of frame on this baseline.
+ \def\FrameHeightAdjust {\baselineskip}%
+ % use package footnote to handle footnotes
+ \savenotes
+ \trivlist\item\noindent
+ % use a minipage if we are already inside a framed environment
+ \ifspx@inframed\begin{minipage}{\linewidth}\fi
+ \MakeFramed {\spx@inframedtrue
+ % framed.sty puts into "\width" the added width (padding+border widths)
+ % adjust \hsize to what the contents must use
+ \advance\hsize-\width
+ % adjust LaTeX parameters to behave properly in indented/quoted contexts
+ \FrameRestore
+ % typeset the contents as in a minipage (Sphinx <= 1.4.1 used a minipage and
+ % itemize/enumerate are therein typeset more tightly, we want to keep
+ % that). We copy-paste from LaTeX source code but don't do a real minipage.
+ \@pboxswfalse
+ \let\@listdepth\@mplistdepth \@mplistdepth\z@
+ \@minipagerestore
+ \@setminipage
+ }%
+ \color@begingroup % workaround upstream framed.sty bug
+ \ifspx@topic@withtextcolor
+ \color{sphinxtopicTextColor}%
+ \fi
+ \spx@topic@TeXextras
+ }%
+ {% insert the "endminipage" code
+ \par\unskip
+ \color@endgroup % matches the \color@begingroup
+ \@minipagefalse
+ \endMakeFramed
+ \ifspx@inframed\end{minipage}\fi
+ \endtrivlist
+ % output the stored footnotes
+ \spewnotes
+ }
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexstyleheadings.sty b/sphinx/texinputs/sphinxlatexstyleheadings.sty
new file mode 100644
index 0000000..b5e9c85
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexstyleheadings.sty
@@ -0,0 +1,86 @@
+%% TITLES
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexstyleheadings.sty}[2023/02/11 headings]
+
+\RequirePackage[nobottomtitles*]{titlesec}
+\@ifpackagelater{titlesec}{2016/03/15}%
+ {\@ifpackagelater{titlesec}{2016/03/21}%
+ {}%
+ {\newif\ifsphinx@ttlpatch@ok
+ \IfFileExists{etoolbox.sty}{%
+ \RequirePackage{etoolbox}%
+ \patchcmd{\ttlh@hang}{\parindent\z@}{\parindent\z@\leavevmode}%
+ {\sphinx@ttlpatch@oktrue}{}%
+ \ifsphinx@ttlpatch@ok
+ \patchcmd{\ttlh@hang}{\noindent}{}{}{\sphinx@ttlpatch@okfalse}%
+ \fi
+ }{}%
+ \ifsphinx@ttlpatch@ok
+ \typeout{^^J Package Sphinx Info: ^^J
+ **** titlesec 2.10.1 successfully patched for bugfix ****^^J}%
+ \else
+ \AtEndDocument{\PackageWarningNoLine{sphinx}{^^J%
+******** titlesec 2.10.1 has a bug, (section numbers disappear) ......|^^J%
+******** and Sphinx could not patch it, perhaps because your local ...|^^J%
+******** copy is already fixed without a changed release date. .......|^^J%
+******** If not, you must update titlesec! ...........................|}}%
+ \sphinxbuildwarning{badtitlesec}%
+ \fi
+ }%
+ }{}
+
+% Augment the sectioning commands used to get our own font family in place,
+% and reset some internal data items (\titleformat from titlesec package)
+\titleformat{\section}{\Large\py@HeaderFamily}%
+ {\py@TitleColor\thesection}{0.5em}{\py@TitleColor}
+\titleformat{\subsection}{\large\py@HeaderFamily}%
+ {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor}
+% \normalsize added as work-around to a lualatex-ja upstream problem
+% https://osdn.net/projects/luatex-ja/ticket/47321
+\titleformat{\subsubsection}{\normalsize\py@HeaderFamily}%
+ {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor}
+% By default paragraphs (and subsubsections) will not be numbered because
+% sphinxmanual.cls and sphinxhowto.cls set secnumdepth to 2
+\titleformat{\paragraph}{\normalsize\py@HeaderFamily}%
+ {\py@TitleColor\theparagraph}{0.5em}{\py@TitleColor}
+\titleformat{\subparagraph}{\normalsize\py@HeaderFamily}%
+ {\py@TitleColor\thesubparagraph}{0.5em}{\py@TitleColor}
+
+
+% Since Sphinx 1.5, users should use HeaderFamily key to 'sphinxsetup' rather
+% than defining their own \py@HeaderFamily command (which is still possible).
+% Memo: \py@HeaderFamily is also used by \maketitle as defined in
+% sphinxmanual.cls/sphinxhowto.cls
+\newcommand{\py@HeaderFamily}{\spx@opt@HeaderFamily}
+
+% This sets up the fancy chapter headings that make the documents look
+% at least a little better than the usual LaTeX output.
+\@ifpackagewith{fncychap}{Bjarne}{
+ \ChNameVar {\raggedleft\normalsize \py@HeaderFamily}
+ \ChNumVar {\raggedleft\Large \py@HeaderFamily}
+ \ChTitleVar{\raggedleft\Large \py@HeaderFamily}
+ % This creates (numbered) chapter heads without the leading \vspace*{}:
+ \def\@makechapterhead#1{%
+ {\parindent \z@ \raggedright \normalfont
+ \ifnum \c@secnumdepth >\m@ne
+ \if@mainmatter
+ \DOCH
+ \fi
+ \fi
+ \interlinepenalty\@M
+ \if@mainmatter
+ \DOTI{#1}%
+ \else%
+ \DOTIS{#1}%
+ \fi
+ }}
+}{}% <-- "false" clause of \@ifpackagewith
+
+% fix fncychap's bug which uses prematurely the \textwidth value
+\@ifpackagewith{fncychap}{Bjornstrup}
+ {\AtBeginDocument{\mylen\textwidth\advance\mylen-2\myhi}}%
+ {}% <-- "false" clause of \@ifpackagewith
+
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexstylepage.sty b/sphinx/texinputs/sphinxlatexstylepage.sty
new file mode 100644
index 0000000..4066129
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexstylepage.sty
@@ -0,0 +1,79 @@
+%% PAGE STYLING
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexstylepage.sty}[2021/01/27 page styling]
+
+% Separate paragraphs by space by default.
+\IfFileExists{parskip-2001-04-09.sty}% since September 2018 TeXLive update
+% new parskip.sty, but let it rollback to old one.
+% hopefully TeX installation not broken and LaTeX kernel not too old
+ {\RequirePackage{parskip}[=v1]}
+% standard one from 1989. Admittedly \section of article/book gives possibly
+% anomalous spacing, but we can't require September 2018 release for some time.
+ {\RequirePackage{parskip}}
+
+% Style parameters and macros used by most documents here
+\raggedbottom
+\sloppy
+\hbadness = 5000 % don't print trivial gripes
+
+% Require package fancyhdr except under memoir class
+\@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}}
+% Use \pagestyle{normal} as the primary pagestyle for text.
+% Redefine the 'normal' header/footer style when using "fancyhdr" package:
+\@ifpackageloaded{fancyhdr}{%
+ \ltx@ifundefined{c@chapter}
+ {% no \chapter, "howto" (non-Japanese) docclass
+ \fancypagestyle{plain}{
+ \fancyhf{}
+ \fancyfoot[C]{{\py@HeaderFamily\thepage}}
+ \renewcommand{\headrulewidth}{0pt}
+ \renewcommand{\footrulewidth}{0pt}
+ }
+ % Same as 'plain', this way we can use it in template
+ % FIXME: shouldn't this have a running header with Name and Release like 'manual'?
+ \fancypagestyle{normal}{
+ \fancyhf{}
+ \fancyfoot[C]{{\py@HeaderFamily\thepage}}
+ \renewcommand{\headrulewidth}{0pt}
+ \renewcommand{\footrulewidth}{0pt}
+ }
+ }%
+ {% classes with \chapter command
+ \fancypagestyle{normal}{
+ \fancyhf{}
+ \fancyfoot[RO]{{\py@HeaderFamily\thepage}}
+ \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
+ \fancyhead[RO]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}}
+ \if@twoside
+ \fancyfoot[LE]{{\py@HeaderFamily\thepage}}
+ \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
+ \fancyhead[LE]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}}
+ \fi
+ \renewcommand{\headrulewidth}{0.4pt}
+ \renewcommand{\footrulewidth}{0.4pt}
+ % define chaptermark with \@chappos when \@chappos is available for Japanese
+ \ltx@ifundefined{@chappos}{}
+ {\def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}}}
+ }
+ % Update the plain style so we get the page number & footer line,
+ % but not a chapter or section title. This is to keep the first
+ % page of a chapter `clean.'
+ \fancypagestyle{plain}{
+ \fancyhf{}
+ \fancyfoot[RO]{{\py@HeaderFamily\thepage}}
+ \if@twoside\fancyfoot[LE]{{\py@HeaderFamily\thepage}}\fi
+ \renewcommand{\headrulewidth}{0pt}
+ \renewcommand{\footrulewidth}{0.4pt}
+ }
+ }
+ }
+ {% no fancyhdr: memoir class
+ % Provide default for 'normal' style simply as an alias of 'plain' style
+ % This way we can use \pagestyle{normal} in LaTeX template
+ \def\ps@normal{\ps@plain}
+ % Users of memoir class are invited to redefine 'normal' style in preamble
+ }
+
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatexstyletext.sty b/sphinx/texinputs/sphinxlatexstyletext.sty
new file mode 100644
index 0000000..d900090
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexstyletext.sty
@@ -0,0 +1,181 @@
+%% TEXT STYLING
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexstyletext.sty}[2023/07/23 text styling]
+
+% Basically everything here consists of macros which are part of the latex
+% markup produced by the Sphinx latex writer
+
+% But those arise rather from the default definitions of the respective
+% latex environments done in sphinxlatexadmonitions.sty
+\def\sphinxstylenotetitle #1{\sphinxstrong{#1} }
+\let\sphinxstylehinttitle \sphinxstylenotetitle % #1 holds the localized notice name
+\let\sphinxstyleimportanttitle\sphinxstylenotetitle % followed by a colon
+\let\sphinxstyletiptitle \sphinxstylenotetitle
+\let\sphinxstylewarningtitle \sphinxstylenotetitle
+\let\sphinxstylecautiontitle \sphinxstylenotetitle
+\let\sphinxstyleattentiontitle\sphinxstylenotetitle
+\let\sphinxstyledangertitle \sphinxstylenotetitle
+\let\sphinxstyleerrortitle \sphinxstylenotetitle
+\def\sphinxstyleseealsotitle#1{\sphinxstrong{#1}\par\nopagebreak}
+%
+% A utility to remove a final colon. Removing last token is not easy in
+% LaTeX, and there are additional complications:
+% - some languages will make the : "active" in document body,
+% - the generic admonition ends up using "note", so for \sphinxnotetitle to
+% use it safely, the utility has to allow an input not having any final colon.
+% - a bit far-fetched but maybe there is more than one colon inside the input
+% (possible from a generic admonition title).
+% Hence the scary code.
+\def\sphinxremovefinalcolon#1{% #1 is the "active" : TeX token
+\protected\def\sphinxremovefinalcolon ##1{%
+ % complications due to : possibly "active"
+ \begingroup\ifnum\catcode`:=\active
+ \def\x####1#1\relax{####1}%
+ \else\def\x####1:\relax{####1}\fi
+ \expandafter\endgroup\x##1\relax
+ % trick to let \x work also if input ##1 has no ending colon
+ \@gobblefour#1\relax:\relax\relax\relax
+ }%
+}% end of wrapper to inject active :
+\begingroup\catcode`:\active\expandafter\endgroup\sphinxremovefinalcolon:
+% See doc/latex.rst for an example.
+
+% Some custom font markup commands.
+\protected\def\sphinxstrong#1{\textbf{#1}}
+\protected\def\sphinxcode#1{\texttt{#1}}
+\protected\def\sphinxbfcode#1{\textbf{\sphinxcode{#1}}}
+\protected\def\sphinxemail#1{\textsf{#1}}
+\protected\def\sphinxtablecontinued#1{\textsf{#1}}
+\protected\def\sphinxtitleref#1{\emph{#1}}
+\protected\def\sphinxmenuselection#1{\emph{#1}}
+\protected\def\sphinxguilabel#1{\emph{#1}}
+\protected\def\sphinxkeyboard#1{\sphinxcode{#1}}
+\protected\def\sphinxaccelerator#1{\underline{#1}}
+\protected\def\sphinxcrossref#1{\emph{#1}}
+\protected\def\sphinxtermref#1{\emph{#1}}
+\protected\def\sphinxsamedocref#1{\emph{#1}}
+\protected\def\sphinxparam#1{\emph{#1}}
+\protected\def\sphinxtypeparam#1{\emph{#1}}
+% \optional is used for ``[, arg]``, i.e. desc_optional nodes.
+\long\protected\def\sphinxoptional#1{%
+ {\sphinxoptionalhook\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}}
+\let\sphinxoptionalhook\empty
+
+% additional customizable styling
+\def\sphinxstyleindexentry #1{\texttt{#1}}
+\def\sphinxstyleindexextra #1{ (\emph{#1})}
+\def\sphinxstyleindexpageref #1{, \pageref{#1}}
+\def\sphinxstyleindexpagemain#1{\textbf{#1}}
+\def\spxentry{\@backslashchar spxentry}% let to \sphinxstyleindexentry in index
+\def\spxextra{\@backslashchar spxextra}% let to \sphinxstyleindexextra in index
+\def\sphinxstyleindexlettergroup #1%
+ {{\Large\sffamily#1}\nopagebreak\vspace{1mm}}
+\def\sphinxstyleindexlettergroupDefault #1%
+ {{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}}
+\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip}
+\let\sphinxstylesidebartitle\sphinxstyletopictitle
+\protected\def\sphinxstyleothertitle #1{\textbf{#1}}
+\protected\def\sphinxstylesidebarsubtitle #1{~\\\textbf{#1} \smallskip}
+% \text.. commands do not allow multiple paragraphs
+% attention, this one is not self-delimiting
+\protected\def\sphinxstyletheadfamily {\sffamily}
+\protected\def\sphinxstyleemphasis #1{\emph{#1}}
+\protected\def\sphinxstyleliteralemphasis#1{\emph{\sphinxcode{#1}}}
+\protected\def\sphinxstylestrong #1{\textbf{#1}}
+\protected\def\sphinxstyleliteralstrong#1{\sphinxbfcode{#1}}
+\protected\def\sphinxstyleabbreviation #1{\textsc{#1}}
+\protected\def\sphinxstyleliteralintitle#1{\sphinxcode{#1}}
+\newcommand*\sphinxstylecodecontinued[1]{{\footnotesize(#1)}}%
+\newcommand*\sphinxstylecodecontinues[1]{{\footnotesize(#1)}}%
+% figure legend comes after caption and may contain arbitrary body elements
+\newenvironment{sphinxlegend}{\par\small}{\par}
+% reduce hyperref "Token not allowed in a PDF string" warnings on PDF builds
+\AtBeginDocument{\pdfstringdefDisableCommands{%
+% all "protected" macros possibly ending up in section titles should be here
+% TODO: examine if \sphinxhref, \sphinxurl, \sphinnolinkurl should be handled
+ \let\sphinxstyleemphasis \@firstofone
+ \let\sphinxstyleliteralemphasis \@firstofone
+ \let\sphinxstylestrong \@firstofone
+ \let\sphinxstyleliteralstrong \@firstofone
+ \let\sphinxstyleabbreviation \@firstofone
+ \let\sphinxstyleliteralintitle \@firstofone
+ \let\sphinxupquote \@firstofone
+ \let\sphinxstrong \@firstofone
+ \let\sphinxcode \@firstofone
+ \let\sphinxbfcode \@firstofone
+ \let\sphinxemail \@firstofone
+ \let\sphinxcrossref \@firstofone
+ \let\sphinxtermref \@firstofone
+ \let\sphinxsamedocref\@firstofone
+ \let\sphinxhyphen\sphinxhyphenforbookmarks
+ \def\PYG#1#2{#2}% (can not yet appear in section titles, but perhaps in future)
+}}
+
+% Special characters
+%
+\def\sphinxparamcomma{, }% by default separate parameters with comma + space
+% If the signature is rendered with one line per param, this wil be used
+% instead (this \texttt makes the comma slightly more distinctive).
+\def\sphinxparamcommaoneperline{\texttt{,}}
+%
+% The \kern\z@ is to prevent en-dash and em-dash TeX ligatures.
+% A linebreak can occur after the dash in regular text (this is
+% normal behaviour of "-" in TeX, it is not related to \kern\z@).
+%
+% Parsed-literals and inline literals also use the \sphinxhyphen
+% but linebreaks there are prevented due to monospace font family.
+% (xelatex needs a special addition, cf. sphinxlatexliterals.sty)
+%
+% Inside code-blocks, dashes are escaped via another macro, from
+% Pygments latex output (search for \PYGZhy in sphinxlatexliterals.sty),
+% and are configured to allow linebreaks despite the monospace font.
+% (the #1 swallows the {} from \sphinxhyphen{} mark-up)
+\protected\def\sphinxhyphen#1{-\kern\z@}
+\protected\def\sphinxhyphennobreak#1{\mbox{-}}
+% The {} from texescape mark-up is kept, else -- gives en-dash in PDF bookmark
+\def\sphinxhyphenforbookmarks{-}
+
+% For curly braces inside \index macro
+\def\sphinxleftcurlybrace{\{}
+\def\sphinxrightcurlybrace{\}}
+
+% Declare Unicode characters used by linux tree command to pdflatex utf8/utf8x
+\def\spx@bd#1#2{%
+ \leavevmode
+ \begingroup
+ \ifx\spx@bd@height \@undefined\def\spx@bd@height{\baselineskip}\fi
+ \ifx\spx@bd@width \@undefined\setbox0\hbox{0}\def\spx@bd@width{\wd0 }\fi
+ \ifx\spx@bd@thickness\@undefined\def\spx@bd@thickness{.6\p@}\fi
+ \ifx\spx@bd@lower \@undefined\def\spx@bd@lower{\dp\strutbox}\fi
+ \lower\spx@bd@lower#1{#2}%
+ \endgroup
+}%
+\@namedef{sphinx@u2500}% BOX DRAWINGS LIGHT HORIZONTAL
+ {\spx@bd{\vbox to\spx@bd@height}
+ {\vss\hrule\@height\spx@bd@thickness
+ \@width\spx@bd@width\vss}}%
+\@namedef{sphinx@u2502}% BOX DRAWINGS LIGHT VERTICAL
+ {\spx@bd{\hb@xt@\spx@bd@width}
+ {\hss\vrule\@height\spx@bd@height
+ \@width \spx@bd@thickness\hss}}%
+\@namedef{sphinx@u2514}% BOX DRAWINGS LIGHT UP AND RIGHT
+ {\spx@bd{\hb@xt@\spx@bd@width}
+ {\hss\raise.5\spx@bd@height
+ \hb@xt@\z@{\hss\vrule\@height.5\spx@bd@height
+ \@width \spx@bd@thickness\hss}%
+ \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness
+ \@width.5\spx@bd@width\vss}}}%
+\@namedef{sphinx@u251C}% BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ {\spx@bd{\hb@xt@\spx@bd@width}
+ {\hss
+ \hb@xt@\z@{\hss\vrule\@height\spx@bd@height
+ \@width \spx@bd@thickness\hss}%
+ \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness
+ \@width.5\spx@bd@width\vss}}}%
+\protected\def\sphinxunichar#1{\@nameuse{sphinx@u#1}}%
+
+% Tell TeX about pathological hyphenation cases:
+\hyphenation{Base-HTTP-Re-quest-Hand-ler}
+
+\endinput
diff --git a/sphinx/texinputs/sphinxlatextables.sty b/sphinx/texinputs/sphinxlatextables.sty
new file mode 100644
index 0000000..9e44532
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatextables.sty
@@ -0,0 +1,1246 @@
+%% TABLES (WITH SUPPORT FOR MERGED CELLS OF GENERAL CONTENTS)
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatextables.sty}[2022/08/15 tables]%
+
+% Provides support for this output mark-up from Sphinx latex writer
+% and table templates:
+%
+% - the tabulary and longtable environments from the eponymous packages
+% - the varwidth environment
+% - the >{} etc mark-up possible in tabularcolumns is from array package
+% which is loaded by longtable and tabulary
+% - \X, \Y, T column types; others (L, C, R, J) are from tabulary package
+% - \sphinxaftertopcaption
+% - \sphinxatlongtableend
+% - \sphinxatlongtablestart
+% - \sphinxattableend
+% - \sphinxattablestart
+% - \sphinxcapstartof
+% - \sphinxcolwidth
+% - \sphinxlongtablecapskipadjust
+% - \sphinxmultirow
+% - \sphinxstartmulticolumn
+% - \sphinxstopmulticolumn
+% - \sphinxtablestrut
+% - \sphinxthecaptionisattop
+% - \sphinxthelongtablecaptionisattop
+% - \sphinxhline
+% - \sphinxcline
+% - \sphinxvlinecrossing
+% - \sphinxfixclines
+% - \sphinxtoprule
+% - \sphinxmidrule
+% - \sphinxbottomrule
+% - \sphinxtableatstartofbodyhook
+% - \sphinxtableafterendhook
+% - \sphinxthistablewithglobalstyle
+% - \sphinxthistablewithbooktabsstyle
+% - \sphinxthistablewithborderlessstyle
+% - \sphinxthistablewithstandardstyle
+% - \sphinxthistablewithcolorrowsstyle
+% - \sphinxthistablewithnocolorrowsstyle
+% - \sphinxthistablewithvlinesstyle
+% - \sphinxthistablewithnovlinesstyle
+%
+% Executes \RequirePackage for:
+%
+% - tabulary
+% - longtable
+% - varwidth
+% - colortbl
+% - booktabs if 'booktabs' in latex_table_style
+%
+% Extends tabulary and longtable via patches and custom macros to support
+% merged cells possibly containing code-blocks in complex tables
+
+\RequirePackage{tabulary}
+% tabulary has a bug with its re-definition of \multicolumn in its first pass
+% which is not \long. But now Sphinx does not use LaTeX's \multicolumn but its
+% own macro. Hence we don't even need to patch tabulary. See
+% sphinxpackagemulticell.sty
+% X or S (Sphinx) may have meanings if some table package is loaded hence
+% \X was chosen to avoid possibility of conflict
+\newcolumntype{\X}[2]{p{\dimexpr
+ (\linewidth-\spx@arrayrulewidth)*#1/#2-\tw@\tabcolsep-\spx@arrayrulewidth\relax}}
+\newcolumntype{\Y}[1]{p{\dimexpr
+ #1\dimexpr\linewidth-\spx@arrayrulewidth\relax-\tw@\tabcolsep-\spx@arrayrulewidth\relax}}
+% \spx@arrayrulewidth is used internally and its meaning will be set according
+% to the table type; no extra user code should modify it. In particular any
+% \setlength{\spx@arrayrulewidth}{...} may break all of LaTeX... (really...)
+\def\spx@arrayrulewidth{\arrayrulewidth}% 5.3.0, to be adjusted by each table
+% using here T (for Tabulary) feels less of a problem than the X could be
+\newcolumntype{T}{J}%
+% For tables allowing pagebreaks
+\RequirePackage{longtable}
+% User interface to set-up whitespace before and after tables:
+\newcommand*\sphinxtablepre {0pt}%
+\newcommand*\sphinxtablepost{\medskipamount}%
+% Space from caption baseline to top of table or frame of literal-block
+\newcommand*\sphinxbelowcaptionspace{.5\sphinxbaselineskip}%
+% as one can not use \baselineskip from inside longtable (it is zero there)
+% we need \sphinxbaselineskip, which defaults to \baselineskip
+\def\sphinxbaselineskip{\baselineskip}%
+% The following is to ensure that, whether tabular(y) or longtable:
+% - if a caption is on top of table:
+% a) the space between its last baseline and the top rule of table is
+% exactly \sphinxbelowcaptionspace
+% b) the space from last baseline of previous text to first baseline of
+% caption is exactly \parskip+\baselineskip+ height of a strut.
+% c) the caption text will wrap at width \LTcapwidth (4in)
+% - make sure this works also if "caption" package is loaded by user
+% (with its width or margin option taking place of \LTcapwidth role)
+% TODO: obtain same for caption of literal block: a) & c) DONE, b) TO BE DONE
+%
+% To modify space below such top caption, adjust \sphinxbelowcaptionspace
+% To add or remove space above such top caption, adjust \sphinxtablepre:
+% notice that \abovecaptionskip, \belowcaptionskip, \LTpre are **ignored**
+% A. Table with longtable
+\def\sphinxatlongtablestart
+ {\par
+ \vskip\parskip
+ \vskip\dimexpr\sphinxtablepre\relax % adjust vertical position
+ \vbox{}% get correct baseline from above
+ \LTpre\z@skip\LTpost\z@skip % set to zero longtable's own skips
+ \edef\sphinxbaselineskip{\dimexpr\the\dimexpr\baselineskip\relax\relax}%
+ }%
+% Compatibility with caption package
+\def\sphinxthelongtablecaptionisattop{%
+ \spx@ifcaptionpackage{\noalign{\vskip-\belowcaptionskip}}{}%
+}%
+% Achieves exactly \sphinxbelowcaptionspace below longtable caption
+\def\sphinxlongtablecapskipadjust
+ {\dimexpr-\dp\strutbox
+ -\spx@ifcaptionpackage{\abovecaptionskip}{\sphinxbaselineskip}%
+ +\sphinxbelowcaptionspace\relax}%
+\def\sphinxatlongtableend{\@nobreakfalse % latex3/latex2e#173
+ \prevdepth\z@\vskip\sphinxtablepost\relax}%
+% B. Table with tabular or tabulary
+\def\sphinxattablestart{\par\vskip\dimexpr\sphinxtablepre\relax}%
+\let\sphinxattableend\sphinxatlongtableend
+% This is used by tabular and tabulary templates
+\newcommand*\sphinxcapstartof[1]{%
+ \vskip\parskip
+ \vbox{}% force baselineskip for good positioning by capstart of hyperanchor
+ % hyperref puts the anchor 6pt above this baseline; in case of caption
+ % this baseline will be \ht\strutbox above first baseline of caption
+ \def\@captype{#1}%
+ \capstart
+% move back vertically, as tabular (or its caption) will compensate
+ \vskip-\baselineskip\vskip-\parskip
+}%
+\def\sphinxthecaptionisattop{% locate it after \sphinxcapstartof
+ \spx@ifcaptionpackage
+ {\caption@setposition{t}%
+ \vskip\baselineskip\vskip\parskip % undo those from \sphinxcapstartof
+ \vskip-\belowcaptionskip % anticipate caption package skip
+ % caption package uses a \vbox, not a \vtop, so "single line" case
+ % gives different result from "multi-line" without this:
+ \nointerlineskip
+ }%
+ {}%
+}%
+\def\sphinxthecaptionisatbottom{% (not finalized; for template usage)
+ \spx@ifcaptionpackage{\caption@setposition{b}}{}%
+}%
+% The aim of \sphinxcaption is to apply to tabular(y) the maximal width
+% of caption as done by longtable
+\def\sphinxtablecapwidth{\LTcapwidth}%
+\newcommand\sphinxcaption{\@dblarg\spx@caption}%
+\long\def\spx@caption[#1]#2{%
+ \noindent\hb@xt@\linewidth{\hss
+ \vtop{\@tempdima\dimexpr\sphinxtablecapwidth\relax
+% don't exceed linewidth for the caption width
+ \ifdim\@tempdima>\linewidth\hsize\linewidth\else\hsize\@tempdima\fi
+% longtable ignores \abovecaptionskip/\belowcaptionskip, so do the same here
+ \abovecaptionskip\sphinxabovecaptionskip % \z@skip
+ \belowcaptionskip\sphinxbelowcaptionskip % \z@skip
+ \caption[{#1}]%
+ {\strut\ignorespaces#2\ifhmode\unskip\@finalstrut\strutbox\fi}%
+ }\hss}%
+ \par\prevdepth\dp\strutbox
+}%
+\def\sphinxabovecaptionskip{\z@skip}% Do not use! Flagged for removal
+\def\sphinxbelowcaptionskip{\z@skip}% Do not use! Flagged for removal
+% This wrapper of \abovecaptionskip is used in sphinxVerbatim for top
+% caption, and with another value in sphinxVerbatimintable
+% TODO: To unify space above caption of a code-block with the one above
+% caption of a table/longtable, \abovecaptionskip must not be used
+% This auxiliary will get renamed and receive a different meaning
+% in future.
+\def\spx@abovecaptionskip{\abovecaptionskip}%
+% Achieve \sphinxbelowcaptionspace below a caption located above a tabular
+% or a tabulary
+\newcommand\sphinxaftertopcaption
+{%
+ \spx@ifcaptionpackage
+ {\par\prevdepth\dp\strutbox\nobreak\vskip-\abovecaptionskip}{\nobreak}%
+ \vskip\dimexpr\sphinxbelowcaptionspace\relax
+ \vskip-\baselineskip\vskip-\parskip
+}%
+% varwidth is crucial for our handling of general contents in merged cells
+\RequirePackage{varwidth}
+% but addition of a compatibility patch with hyperref is needed
+% (tested with varwidth v 0.92 Mar 2009)
+\AtBeginDocument {%
+ \let\@@vwid@Hy@raisedlink\Hy@raisedlink
+ \long\def\@vwid@Hy@raisedlink#1{\@vwid@wrap{\@@vwid@Hy@raisedlink{#1}}}%
+ \edef\@vwid@setup{%
+ \let\noexpand\Hy@raisedlink\noexpand\@vwid@Hy@raisedlink % HYPERREF !
+ \unexpanded\expandafter{\@vwid@setup}}%
+}%
+
+% NOTA BENE: since the multicolumn and multirow code was written Sphinx
+% decided to prefix non public internal macros by \spx@ and in fact all
+% such macros here should now be prefixed by \spx@table@, but doing the
+% update is delayed to later. (written at 5.3.0)
+
+%%%%%%%%%%%%%%%%%%%%%
+% --- MULTICOLUMN ---
+% standard LaTeX's \multicolumn
+% 1. does not allow verbatim contents,
+% 2. interacts very poorly with tabulary.
+%
+% It is needed to write own macros for Sphinx: to allow code-blocks in merged
+% cells rendered by tabular/longtable, and to allow multi-column cells with
+% paragraphs to be taken into account sanely by tabulary algorithm for column
+% widths.
+%
+% This requires quite a bit of hacking. First, in Sphinx, the multi-column
+% contents will *always* be wrapped in a varwidth environment. The issue
+% becomes to pass it the correct target width. We must trick tabulary into
+% believing the multicolumn is simply separate columns, else tabulary does not
+% incorporate the contents in its algorithm. But then we must clear the
+% vertical rules...
+%
+% configuration of tabulary
+\setlength{\tymin}{3\fontcharwd\font`0 }% minimal width of "squeezed" columns
+\setlength{\tymax}{10000pt}% allow enough room for paragraphs to "compete"
+% we need access to tabulary's final computed width. \@tempdima is too volatile
+% to hope it has kept tabulary's value when \sphinxcolwidth needs it.
+\newdimen\sphinx@TY@tablewidth
+\def\tabulary{%
+ \def\TY@final{\sphinx@TY@tablewidth\@tempdima\tabular}%
+ \let\endTY@final\endtabular
+ \TY@tabular}%
+% next hack is needed only if user has set latex_use_latex_multicolumn to True:
+% it fixes tabulary's bug with \multicolumn defined "short" in first pass. (if
+% upstream tabulary adds a \long, our extra one causes no harm)
+\def\sphinx@tempa #1\def\multicolumn#2#3#4#5#6#7#8#9\sphinx@tempa
+ {\def\TY@tab{#1\long\def\multicolumn####1####2####3{\multispan####1\relax}#9}}%
+\expandafter\sphinx@tempa\TY@tab\sphinx@tempa
+%
+% TN. 1: as \omit is never executed, Sphinx multicolumn does not need to worry
+% like standard multicolumn about |l| vs l|. On the other hand it assumes
+% columns are separated by a | ... (if not it will add extraneous
+% \arrayrulewidth space for each column separation in its estimate of available
+% width).
+%
+% Update at 5.3.0: code uses \spx@arrayrulewidth which is kept in sync with the
+% table column specification (aka preamble):
+% - no | in preamble: \spx@arrayrulewidth -> \z@
+% - at least a | in the preamble: \spx@arrayrulewidth -> \arrayrulewidth
+% This is used for computation of merged cells widths. Mixed preambles using
+% at least a | but not using it for all columns (as can be obtained via the
+% tabularcolumns directive) may cause some merged cells contents to be slightly
+% shifted to the left as they assume merged columns are | separated where in
+% fact they perhaps are not.
+%
+% TN. 1b: as Sphinx multicolumn uses neither \omit nor \span, it can not
+% (easily) get rid of extra macros from >{...} or <{...} between columns. At
+% least, it has been made compatible with colortbl's \columncolor.
+%
+% TN. 2: tabulary's second pass is handled like tabular/longtable's single
+% pass, with the difference that we hacked \TY@final to set in
+% \sphinx@TY@tablewidth the final target width as computed by tabulary. This is
+% needed only to handle columns with a "horizontal" specifier: "p" type columns
+% (inclusive of tabulary's LJRC) holds the target column width in the
+% \linewidth dimension.
+%
+% TN. 3: use of \begin{sphinxmulticolumn}...\end{sphinxmulticolumn} mark-up
+% would need some hacking around the fact that groups can not span across table
+% cells (the code does inserts & tokens, see TN1b). It was decided to keep it
+% simple with \sphinxstartmulticolumn...\sphinxstopmulticolumn.
+%
+% MEMO about nesting: if sphinxmulticolumn is encountered in a nested tabular
+% inside a tabulary it will think to be at top level in the tabulary. But
+% Sphinx generates no nested tables, and if some LaTeX macro uses internally a
+% tabular this will not have a \sphinxstartmulticolumn within it!
+%
+% 5.3.0 adds a check for multirow as single-row multi-column will allow a row
+% colour but multi-row multi-column should not.
+% Attention that this assumes \sphinxstartmulticolumn is always followed
+% in latex mark-up either by \sphinxmultirow or \begin (from \begin{varwidth}).
+\def\sphinxstartmulticolumn#1#2{%
+ \ifx\sphinxmultirow#2%
+ \gdef\spx@table@hackCT@inmergedcell{\spx@table@hackCT@nocolor}%
+ \else
+ \global\let\spx@table@hackCT@inmergedcell\spx@@table@hackCT@inmergedcell
+ \fi
+ \sphinx@startmulticolumn{#1}#2%
+}%
+\def\sphinx@startmulticolumn{%
+ \ifx\equation$% $ tabulary's first pass
+ \expandafter\sphinx@TYI@start@multicolumn
+ \else % either not tabulary or tabulary's second pass
+ \expandafter\sphinx@start@multicolumn
+ \fi
+}%
+\def\sphinxstopmulticolumn{%
+ \ifx\equation$% $ tabulary's first pass
+ \expandafter\sphinx@TYI@stop@multicolumn
+ \else % either not tabulary or tabulary's second pass
+ \ignorespaces
+ \fi
+}%
+\def\sphinx@TYI@start@multicolumn#1{%
+ % use \gdef always to avoid stack space build up
+ \gdef\sphinx@tempa{#1}\begingroup\setbox\z@\hbox\bgroup
+}%
+\def\sphinx@TYI@stop@multicolumn{\egroup % varwidth was used with \tymax
+ \xdef\sphinx@tempb{\the\dimexpr\wd\z@/\sphinx@tempa}% per column width
+ \endgroup
+ \expandafter\sphinx@TYI@multispan\expandafter{\sphinx@tempa}%
+}%
+\def\sphinx@TYI@multispan #1{%
+ \kern\sphinx@tempb\ignorespaces % the per column occupied width
+ \ifnum#1>\@ne % repeat, taking into account subtleties of TeX's & ...
+ \expandafter\sphinx@TYI@multispan@next\expandafter{\the\numexpr#1-\@ne\expandafter}%
+ \fi
+}%
+\def\sphinx@TYI@multispan@next{&\relax\sphinx@TYI@multispan}%
+%
+% Now the branch handling either the second pass of tabulary or the single pass
+% of tabular/longtable. This is the delicate part where we gather the
+% dimensions from the p columns either set-up by tabulary or by user p column
+% or Sphinx \X, \Y columns. The difficulty is that to get the said width, the
+% template must be inserted (other hacks would be horribly complicated except
+% if we rewrote crucial parts of LaTeX's \@array !) and we can not do
+% \omit\span like standard \multicolumn's easy approach. Thus we must cancel
+% the \vrule separators. Also, perhaps the column specifier is of the l, c, r
+% type, then we attempt an ad hoc rescue to give varwidth a reasonable target
+% width.
+\def\sphinx@start@multicolumn#1{%
+ \gdef\sphinx@multiwidth{0pt}\gdef\sphinx@tempa{#1}\sphinx@multispan{#1}%
+}%
+\def\sphinx@multispan #1{%
+ \ifnum#1=\@ne\expandafter\sphinx@multispan@end
+ \else\expandafter\sphinx@multispan@next
+ \fi {#1}%
+}%
+\def\sphinx@multispan@next #1{%
+ % trick to recognize L, C, R, J or p, m, b type columns
+ \ifdim\baselineskip>\z@
+ \gdef\sphinx@tempb{\linewidth}%
+ \else
+ % if in an l, r, c type column, try and hope for the best
+ \xdef\sphinx@tempb{\the\dimexpr(\ifx\TY@final\@undefined\linewidth\else
+ \sphinx@TY@tablewidth\fi-\spx@arrayrulewidth)/\sphinx@tempa
+ -\tw@\tabcolsep-\spx@arrayrulewidth\relax}%
+ \fi
+ \noindent\kern\sphinx@tempb\relax
+ \xdef\sphinx@multiwidth
+ {\the\dimexpr\sphinx@multiwidth+\sphinx@tempb+\tw@\tabcolsep+\spx@arrayrulewidth}%
+ \spx@table@hackCT@fixcolorpanel
+ % silence a | column separator in our merged cell
+ \spx@table@hackCT@inhibitvline
+ % prevent column colours to interfere with our multi-column but allow row
+ % colour (we can't obey a \cellcolor as it has not be seen yet at this stage)
+ \spx@table@hackCT@inmergedcell&\relax
+ % repeat
+ \expandafter\sphinx@multispan\expandafter{\the\numexpr#1-\@ne}%
+}%
+\def\sphinx@multispan@end#1{%
+ % first, trace back our steps horizontally
+ \noindent\kern-\dimexpr\sphinx@multiwidth\relax
+ % and now we set the final computed width for the varwidth environment
+ \ifdim\baselineskip>\z@
+ \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+\linewidth}%
+ \else
+ \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+
+ (\ifx\TY@final\@undefined\linewidth\else
+ \sphinx@TY@tablewidth\fi-\spx@arrayrulewidth)/\sphinx@tempa
+ -\tw@\tabcolsep-\spx@arrayrulewidth\relax}%
+ \fi
+ % last cell of the multi-column
+ \aftergroup\spx@table@hackCT@fixcolorpanel
+ \aftergroup\spx@table@hackCT@inmergedcell
+}%
+\newcommand*\sphinxcolwidth[2]{%
+ % this dimension will always be used for varwidth, and serves as maximum
+ % width when cells are merged either via multirow or multicolumn or both,
+ % as always their contents is wrapped in varwidth environment.
+ \ifnum#1>\@ne % multi-column (and possibly also multi-row)
+ % we wrote our own multicolumn code especially to handle that (and allow
+ % verbatim contents)
+ \ifx\equation$%$
+ \tymax % first pass of tabulary (cf MEMO above regarding nesting)
+ \else % the \@gobble thing is for compatibility with standard \multicolumn
+ \sphinx@multiwidth\@gobble{#1/#2}%
+ \fi
+ \else % single column multirow
+ \ifx\TY@final\@undefined % not a tabulary.
+ \ifdim\baselineskip>\z@
+ % in a p{..} type column, \linewidth is the target box width
+ \linewidth
+ \else
+ % l, c, r columns. Do our best.
+ \dimexpr(\linewidth-\spx@arrayrulewidth)/#2-
+ \tw@\tabcolsep-\spx@arrayrulewidth\relax
+ \fi
+ \else % in tabulary
+ \ifx\equation$%$% first pass
+ \tymax % it is set to a big value so that paragraphs can express themselves
+ \else
+ % second pass.
+ \ifdim\baselineskip>\z@
+ \linewidth % in a L, R, C, J column or a p, \X, \Y ...
+ \else
+ % we have hacked \TY@final to put in \sphinx@TY@tablewidth the table width
+ \dimexpr(\sphinx@TY@tablewidth-\spx@arrayrulewidth)/#2-
+ \tw@\tabcolsep-\spx@arrayrulewidth\relax
+ \fi
+ \fi
+ \fi
+ \fi
+}%
+% fallback default in case user has set latex_use_latex_multicolumn to True:
+% \sphinxcolwidth will use this only inside LaTeX's standard \multicolumn
+\def\sphinx@multiwidth #1#2{\dimexpr % #1 to gobble the \@gobble (!)
+ (\ifx\TY@final\@undefined\linewidth\else\sphinx@TY@tablewidth\fi
+ -\spx@arrayrulewidth)*#2-\tw@\tabcolsep-\spx@arrayrulewidth\relax}%
+
+% \spx@table@hackCT@inhibitvline
+% packages like colortbl add group levels, we need to "climb back up" to be
+% able to hack the \vline and also the colortbl inserted tokens. The hack
+% sets the \arrayrulewidth to \z@ to inhibit a | separator at right end
+% of the cell, if present (our code does not use \omit so can not avoid the
+% \vline insertion, but setting its width to zero makes it do nothing).
+% Some subtlety with colour panels must be taken care of.
+\def\spx@table@hackCT@inhibitvline{\ifnum\currentgrouptype=6\relax
+ \kern\spx@arrayrulewidth % will be compensated by extra colour panel left overhang
+ \arrayrulewidth\z@% trick to inhibit the {\vrule width \arrayrulewidth}
+ \else\aftergroup\spx@table@hackCT@inhibitvline\fi}%
+
+% hacking around colour matters
+% Sphinx 1.6 comment:
+% It turns out \CT@row@color is not expanded contrarily to \CT@column@color
+% during LaTeX+colortbl preamble preparation, hence it would be possible for
+% \CT@setup to discard only the column color and choose to obey or not
+% row color and cell color. It would even be possible to propagate cell color
+% to row color for the duration of the Sphinx multicolumn... the (provisional?)
+% choice has been made to cancel the colortbl colours for the multicolumn
+% duration.
+% Sphinx 5.3.0 comment:
+% - colortbl has no mechanism to disable colour background in a given cell:
+% \cellcolor triggers one more \color, but has no possibility to revert
+% a previously emitted \color, only to override it via an additional \color
+% - prior to 5.3.0, Sphinx did not officially support colour in tables,
+% but it did have a mechanism to protect merged cells from being partly
+% covered by colour panels at various places. At 5.3.0 this mechanism
+% is relaxed a bit to allow row colour for a single-row merged cell.
+%
+% fixcolorpanel
+\def\spx@table@hackCT@fixcolorpanel{\ifnum\currentgrouptype=6\relax
+ \edef\spx@table@leftcolorpanelextra
+ % \edef as \arrayrulewidth will be set to \z@ next,
+ % hence also \spx@arrayrulewidth...
+ {\sphinxcolorpanelextraoverhang+\the\spx@arrayrulewidth}%
+ \else\aftergroup\spx@table@hackCT@fixcolorpanel\fi}%
+%
+% inmergedcell
+% \spx@table@hackCT@inmergedcell will be locally set to either this
+% \spx@@table@hackCT@inmergedcell or to \spx@table@hackCT@nocolor
+% "\let\spx@original@CT@setup\CT@setup" is done after loading colortbl
+\def\spx@@table@hackCT@inmergedcell{\ifnum\currentgrouptype=6\relax
+ \let\CT@setup\spx@CT@setup@inmergedcell
+ \else\aftergroup\spx@@table@hackCT@inmergedcell\fi
+}%
+\newif\ifspx@table@inmergedcell
+\def\spx@CT@setup@inmergedcell #1\endgroup{%
+ % - obey only row color and disable effect of \sphinxcolorblend
+ % - turn on the inmergedcell boolean to signal to \CT@row@color
+ \spx@original@CT@setup
+ \spx@table@inmergedcelltrue % needed by \CT@row@color
+ % deactivate effect of \sphinxcolorblend if it happened at all
+ \ifdefined\blendcolors\blendcolors{}\fi
+ \CT@row@color
+ \CT@do@color
+ \global\let\CT@cell@color\relax
+ \endgroup
+}%
+%
+% nocolor
+\def\spx@table@hackCT@nocolor{\ifnum\currentgrouptype=6\relax
+% sadly \CT@column@color is possibly already expanded so we can't
+% simply do \let\CT@column@color\relax etc...
+% admittedly we could perhaps hack \CT@color but well
+ \let\CT@setup\spx@CT@setup@nocolor
+ \else\aftergroup\spx@table@hackCT@nocolor\fi
+}
+\def\spx@CT@setup@nocolor#1\endgroup{%
+ \global\let\CT@cell@color\relax
+ % the above fix was added at 5.3.0
+ % formerly a \cellcolor added by a raw latex directive in the merged cell
+ % would have caused colour to apply to the *next* cell after the merged
+ % one; we don't support \cellcolor from merged cells contents anyhow.
+ \endgroup}
+%
+% norowcolor
+\def\spx@table@hackCT@norowcolor{%
+% a bit easier although merged cells complicate the matter as they do need
+% to keep the rowcolor; and we can't know yet if we are in a merged cell
+ \ifnum\currentgrouptype=6\relax
+ \ifx\CT@row@color\relax
+ \else
+ \let\spx@saved@CT@row@color\CT@row@color
+ \def\CT@row@color{%
+ \ifspx@table@inmergedcell\expandafter\spx@saved@CT@row@color\fi
+ }%
+ \fi
+ \else\aftergroup\spx@table@hackCT@norowcolor\fi
+}
+%
+% \sphinxcolorblend
+\def\spx@table@hackCT@colorblend{%
+ \ifnum\currentgrouptype=6\relax
+ \expandafter\blendcolors\spx@colorblendparam
+ % merged cells will do a \blendcolors{} to cancel the effet
+ % we can not know here yet if in merged cell as the boolean
+ % \ifspx@table@inmergedcell is not yet updated
+ \else
+ \aftergroup\spx@table@hackCT@colorblend
+ \fi
+}
+\def\sphinxcolorblend#1{\gdef\spx@colorblendparam{{#1}}\spx@table@hackCT@colorblend}
+% Either xcolor.sty exists on user system and has been loaded by sphinx.sty,
+% or it does not exist, so we can use \@ifpackageloaded without delaying.
+\@ifpackageloaded{xcolor}%
+ {}%
+ {\def\sphinxcolorblend#1{%
+\PackageWarning{sphinx}{This table uses \string\sphinxcolorblend\space
+ but xcolor is not in\MessageBreak
+ the TeX/LaTeX installation, the command will be\MessageBreak
+ ignored in this and the next tables}%
+ \global\let\sphinxcolorblend\@gobble
+ \sphinxbuildwarning{colorblend}%
+ }%
+ }
+
+
+%%%%%%%%%%%%%%%%%%
+% --- MULTIROW ---
+% standard \multirow
+% 1. does not allow verbatim contents,
+% 2. does not allow blank lines in its argument,
+% 3. its * specifier means to typeset "horizontally" which is very
+% bad for paragraph content. 2016 version has = specifier but it
+% must be used with p type columns only, else results are bad,
+% 4. it requires manual intervention if the contents is too long to fit
+% in the asked-for number of rows.
+% 5. colour panels (either from \rowcolor or \columncolor) will hide
+% the bottom part of multirow text, hence manual tuning is needed
+% to put the multirow insertion at the _bottom_.
+%
+% The Sphinx solution consists in always having contents wrapped
+% in a varwidth environment so that it makes sense to estimate how many
+% lines it will occupy, and then ensure by insertion of suitable struts
+% that the table rows have the needed height. The needed mark-up is done
+% by LaTeX writer, which has its own id for the merged cells.
+%
+% The colour issue is "solved" by clearing colour panels in all cells,
+% whether or not the multirow is single-column or multi-column.
+%
+% MEMO at 5.3.0: to allow a multirow cell in a single column to react to
+% \columncolor correctly, it seems only way is that the contents
+% are inserted by bottom cell (this is mentioned in multirow.sty doc, too).
+% Sphinx could at Python level "move" the contents to that cell. But the
+% mechanism used here via \sphinxtablestrut to enlarge rows to make room for
+% the contents if needed becomes more challenging yet, because \sphinxtablestrut
+% mark-up will be parsed by TeX *before* it sees the contents of the merged
+% cell.. So it seems the best way would be to actually store the contents into
+% some owned-by-Sphinx box storage which needs to be globally allocated to
+% that usage ; then we need multiple such boxes, say at least 5 to cover
+% 99% or use case. Or perhaps some trick with storing in a \vbox and recovering
+% via some \vsplit but this becomes complicated... perhaps in future.
+%
+% In passing we obtain baseline alignements across rows (only if
+% \arraystretch is 1, as LaTeX's does not obey \arraystretch in "p"
+% multi-line contents, only first and last line...)
+%
+% TODO: examine the situation with \arraystretch > 1. The \extrarowheight
+% is hopeless for multirow anyhow, it makes baseline alignment strictly
+% impossible.
+\newcommand\sphinxmultirow[2]{\begingroup
+ % #1 = nb of spanned rows, #2 = Sphinx id of "cell", #3 = contents
+ % but let's fetch #3 in a way allowing verbatim contents !
+ \def\sphinx@nbofrows{#1}\def\sphinx@cellid{#2}%
+ \afterassignment\sphinx@multirow\let\next=
+}%
+\def\sphinx@multirow {%
+ \setbox\z@\hbox\bgroup\aftergroup\sphinx@@multirow\strut
+}%
+\def\sphinx@@multirow {%
+% MEMO: we could check status of \CT@cell@color here, but unfortunately we
+% can't know the exact height which will be covered by the cells in total
+% (it may be more than our \box\z@ dimensions). We could use an \fcolorbox
+% wrapper on \box\z@ but this will not extend precisely to the bottom rule.
+%
+% Only solution if we want to obey a raw \cellcolor, or a \columncolor, seems
+% to delay unboxing the gathered contents as part of the bottom row with
+% a suitable vertical adjustment...
+%
+ % The contents, which is a varwidth environment, has been captured in
+ % \box0 (a \hbox).
+ % We have with \sphinx@cellid an assigned unique id. The goal is to give
+ % about the same height to all the involved rows.
+ % For this Sphinx will insert a \sphinxtablestrut{cell_id} mark-up
+ % in LaTeX file and the expansion of the latter will do the suitable thing.
+ \dimen@\dp\z@
+ \dimen\tw@\ht\@arstrutbox
+ \advance\dimen@\dimen\tw@
+ \advance\dimen\tw@\dp\@arstrutbox
+ \count@=\dimen@ % type conversion dim -> int
+ \count\tw@=\dimen\tw@
+ \divide\count@\count\tw@ % TeX division truncates
+ \advance\dimen@-\count@\dimen\tw@
+ % 1300sp is about 0.02pt. For comparison a rule default width is 0.4pt.
+ % (note that if \count@ holds 0, surely \dimen@>1300sp)
+ \ifdim\dimen@>1300sp \advance\count@\@ne \fi
+ % now \count@ holds the count L of needed "lines"
+ % and \sphinx@nbofrows holds the number N of rows
+ % we have L >= 1 and N >= 1
+ % if L is a multiple of N, ... clear what to do !
+ % else write L = qN + r, 1 <= r < N and we will
+ % arrange for each row to have enough space for:
+ % q+1 "lines" in each of the first r rows
+ % q "lines" in each of the (N-r) bottom rows
+ % for a total of (q+1) * r + q * (N-r) = q * N + r = L
+ % It is possible that q == 0.
+ \count\tw@\count@
+ % the TeX division truncates
+ \divide\count\tw@\sphinx@nbofrows\relax
+ \count4\count\tw@ % q
+ \multiply\count\tw@\sphinx@nbofrows\relax
+ \advance\count@-\count\tw@ % r
+ \expandafter\xdef\csname sphinx@tablestrut_\sphinx@cellid\endcsname
+ {\noexpand\sphinx@tablestrut{\the\count4}{\the\count@}{\sphinx@cellid}}%
+ \dp\z@\z@
+ % this will use the real height if it is >\ht\@arstrutbox
+ \sphinxtablestrut{\sphinx@cellid}\box\z@
+ \endgroup % group was opened in \sphinxmultirow
+}%
+\newcommand*\sphinxtablestrut[1]{%
+ % #1 is a "cell_id", i.e. the id of a merged group of table cells
+ \csname sphinx@tablestrut_#1\endcsname
+}%
+% LaTeX typesets the table row by row, hence each execution can do
+% an update for the next row.
+\newcommand*\sphinx@tablestrut[3]{\begingroup
+ % #1 = q, #2 = (initially) r, #3 = cell_id, q+1 lines in first r rows
+ % if #2 = 0, create space for max(q,1) table lines
+ % if #2 > 0, create space for q+1 lines and decrement #2
+ \leavevmode
+ \count@#1\relax
+ \ifnum#2=\z@
+ \ifnum\count@=\z@\count@\@ne\fi
+ \else
+ % next row will be with a #2 decremented by one
+ \expandafter\xdef\csname sphinx@tablestrut_#3\endcsname
+ {\noexpand\sphinx@tablestrut{#1}{\the\numexpr#2-\@ne}{#3}}%
+ \advance\count@\@ne
+ \fi
+ \vrule\@height\ht\@arstrutbox
+ \@depth\dimexpr\count@\ht\@arstrutbox+\count@\dp\@arstrutbox-\ht\@arstrutbox\relax
+ \@width\z@
+ \endgroup
+ % we need this to avoid colour panels hiding bottom parts of multirow text
+ \spx@table@hackCT@nocolor
+}%
+
+%%%%%%%%%%%%%%%%%%
+% --- STYLING ---
+%
+
+%
+% Support for colour in table
+%
+% Core LaTeX package (very old, part of texlive-latex-base on Debian distr.)
+% providing \columncolor, \rowcolor, \cellcolor and \arrayrulecolor.
+\RequirePackage{colortbl}
+\let\spx@original@CT@setup\CT@setup
+
+% LaTeX's \cline has **strong** deficiencies
+% ******************************************
+% We work around them via an added \sphinxfixclines{number of columns} in the
+% table mark-up, and also extra mark-up \sphinxvlinecrossing{col no} for
+% crossings not contiguous to any cline. To fix the gap at left extremity of a
+% \cline, we redefine the core LaTeX \c@line because this avoids adjoining a
+% small square with potential PDF viewer anti-aliasing issues. We waited
+% after loading colortbl because it also redefines \c@line for it to obey the
+% colour set by \arrayrulecolor.
+% MEMO: booktabs package does *not* redefine \@cline so we are safe here.
+\def\@cline#1-#2\@nil{%
+ \omit
+ \@multicnt#1%
+ \advance\@multispan\m@ne
+ \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
+ \@multicnt#2%
+ \advance\@multicnt-#1%
+ \advance\@multispan\@ne
+ {\CT@arc@
+% start of Sphinx modification
+ \ifnum#1>\@ne\kern-\spx@arrayrulewidth\fi% fix gap at join with vertical lines
+% end of Sphinx modification
+% Comments:
+%
+% If we had the information whether the previous column ended with a | or
+% not, we could decide what to do here. Alternatively the mark-up could
+% use either original \cline or the one modified as here depending on case.
+% One wonders why LaTeX does not provide itself the alternative as a
+% complement to \cline, to use on case by case basis.
+% Here we handle both at same time via using the \spx@arrayrulewidth which
+% will be \z@ if no | at all so will induce here nothing.
+%
+% As a result Sphinx basically supports well only tables having either all
+% columns |-separated, or no | at all, as it uses \spx@arrayrrulewidth in
+% all columns (here and in multicolumn code).
+%
+% We also considered a method not modifying \c@line but it requires too
+% much extra mark-up from Python LaTeX writer and/or extra LaTeX coding.
+% back to LaTeX+colortbl code
+ \leaders\hrule\@height\arrayrulewidth\hfill}%
+ \cr
+% the last one will need to be compensated, this is job of \sphinxclines
+ \noalign{\vskip-\arrayrulewidth}%
+}
+\def\spx@table@fixvlinejoin{%
+ {\CT@arc@ % this is the color command set up by \arrayrulecolor
+ \vrule\@height\arrayrulewidth
+% side remark: LaTeX has only a single \arrayrulewidth for all kinds
+% for cell borders in table, horizontal or vertical...
+ \@depth\z@
+ \@width\spx@arrayrulewidth
+ }%
+}
+% Sphinx LaTeX writer issues one such for each vertical line separating two
+% contiguous multirow cells; i.e. those crossings which can are not already
+% taken care of by our modified at left extremity \cline.
+% One could imagine a more \...crossingS (plural) receiving a comma delimited
+% list, which would simplify the mark-up but this would complexify both the
+% Python and the LaTeX coding.
+\def\sphinxtablevlinecrossing#1{%
+ \sphinxtabledecrementrownum
+ \omit
+ \@multispan{#1}%
+ \hfill
+ \spx@table@fixvlinejoin
+ \cr
+ \noalign{\vskip-\arrayrulewidth}%
+}
+% This "fixclines" is also needed if no \sphinxcline emitted and is useful
+% even in extreme case with no \sphinxvlinecrossing either, to give correct
+% height to multirow extending across all table width assuming other rows are
+% separated generally by an \hline, so as to keep coherent line spacing.
+%
+% It is designed to work ok even if no | separators are in the table (because
+% \spx@table@fixvlinejoin uses \spx@arrayrulewidth which is \z@ in that case).
+\def\sphinxtablefixclines#1{% #1 is the number of columns of the table
+ \sphinxtabledecrementrownum
+ \omit
+ \spx@table@fixvlinejoin% unneeded if first \cline started at column 1 but does
+ % not hurt; fills small gap at left-bordered table
+ \@multispan{#1}%
+ \hfill
+ \spx@table@fixvlinejoin% fill small gap at right-bordered table
+ \cr
+ % this final one does NO \vskip-\arrayrulewidth... that's the whole point
+}
+%%%% end of \cline workarounds
+
+%
+% - passing option "table" to xcolor also loads colortbl but we needed to
+% load color or xcolor prior to the handling of the options
+%
+% - the \rowcolors command from [table]{xcolor} has various problems:
+%
+% * it is rigid and does not out-of-the-box allow a more complex scheme
+% such as colorA+colorB+colorC+colorB+colorC+colorB+colorC... suitable to
+% distinguish a header row.
+%
+% * its code does not export the used colour, an information which we may
+% need for example to colourize the rule via \arrayrulecolor in the
+% appropriate manner, for example to colourize the booktabs induced vertical
+% whitespace to avoid gaps (if one wants to).
+%
+% * incompatibility with tabulary: the output depends on parity of total
+% number of rows!
+%
+% * problems with longtable: the caption will receive a background colour
+% panel, if we do not deactivate the \rowcolors action during definition of
+% the headers and footers; this requires extra mark-up. Besides if we
+% deactivate using \hiderowcolors during header and footer formation, the
+% parity of the body rows is shifted, \rownum is even, not odd, at first body
+% row. And setting \rownum at start of first body row is too late for
+% influencing the colour.
+%
+% * it has a global impact and must be reset at each table. We can not
+% issue it only once and it provides no public interface (without @) to
+% cancel its effect conveniently (\hiderowcolors can only be used from
+% *inside* a table.)
+%
+% * its core mechanism which increments the row count is triggered
+% if a \cline is encountered... so this offsets the alternating colours...
+% ... or not if there are two \cline's in the row...
+% (as we will use same mechanism we have to correct this increment).
+%
+% So we need our own code.
+
+% Provide \rownum and rownum LaTeX counter (code copied from colortbl v1.0f)
+\ltx@ifundefined{rownum}{%
+ \ltx@ifundefined{c@rownum}%
+ {\newcount\rownum\let\c@rownum\rownum}%
+ {\let\rownum\c@rownum}%
+ }%
+{\let\c@rownum\rownum}
+\providecommand\therownum{\arabic{rownum}}
+
+% extra overhang for color panels to avoid visual artifacts in pdf viewers
+% (particularly if borderless)
+\def\sphinxcolorpanelextraoverhang{0.1pt}
+\def\spx@table@leftcolorpanelextra {\sphinxcolorpanelextraoverhang}
+\def\spx@table@rightcolorpanelextra{\sphinxcolorpanelextraoverhang}
+% the macro to which \CT@row@color will be set for coloured rows, serves both
+% in header and body, the colours must have been defined at time of use
+\def\spx@table@CT@row@color{\ifspx@table@inmergedcell
+ \CT@color{sphinxTableMergeColor}%
+ \else
+ \CT@color{sphinxTableRowColor}%
+ \fi
+ \@tempdimb\dimexpr\col@sep+\spx@table@leftcolorpanelextra\relax
+ \@tempdimc\dimexpr\col@sep+\spx@table@rightcolorpanelextra\relax
+ }%
+% used by itself this will influence a single row if \CT@everycr is the
+% colortbl one, to influences all rows the \CT@everycr must be modified (see
+% below)
+\def\sphinxrowcolorON {\global\let\CT@row@color\spx@table@CT@row@color}%
+% this one turns off row colours until the next \sphinxrowcolorON
+\def\sphinxrowcolorOFF{\global\let\CT@row@color\relax}%
+% this one inhibits the row colour in one cell only (can be used as
+% >{\sphinxnorowcolor} for turning off row colours in a given column)
+\def\sphinxnorowcolor{\spx@table@hackCT@norowcolor}%
+
+% \sphinxtoprule (or rather \sphinxtabletoprulehook) will be modified by
+% the colorrows class to execute this one:
+\def\spx@table@@toprule@rowcolorON{%
+ \noalign{%
+ % Because of tabulary 2-pass system, the colour set-up at end of table
+ % would contaminate the header colours at start of table, so must reset
+ % them here. We want all header rows to obey same colours, so we don't
+ % use original \CT@everycr which sets \CT@row@color to \relax.
+ \global\CT@everycr{\the\everycr}%
+ \global\sphinxcolorlet{sphinxTableRowColor}{sphinxTableRowColorHeader}%
+ \global\sphinxcolorlet{sphinxTableMergeColor}{\sphinxTableMergeColorHeader}%
+ \sphinxrowcolorON
+ }%
+}%
+
+% \sphinxtableatstartofbodyhook will be modified by colorrows class to
+% execute this one; it starts the alternating colours and triggers increment
+% or \rownum count at each new row (the xcolor base method for \rowcolors)
+\def\spx@table@@startbodycolorrows{%
+ \noalign{%
+ \global\CT@everycr{% Nota Bene: in a longtable with \hline the \everycr is
+ % done two extra times! but 2 is even, so this is ok
+ \noalign{\global\advance\rownum\@ne % the xcolor \rowcolors base trick
+% MEMO: colortbl \CT@row@color is expanded *after* the cell contents have been
+% gathered and measured, so it can't be used to expose e.g. the colour to the
+% cell contents macro code. Of course if it is known how the colour is chosen
+% the procedure could be done from inside the cell. Simpler to expose the colour
+% in a public name sphinxTableRowColor at start of the row in this \noalign.
+ \sphinxSwitchCaseRowColor\rownum
+ }%
+ \the\everycr
+ }%
+ \global\rownum\@ne % is done from inside table so ok with tabulary two passes
+ \sphinxSwitchCaseRowColor\rownum % set up color for the first body row
+ \sphinxrowcolorON % has been done from \sphinxtoprule location but let's do
+ % it again in case \sphinxtabletoprulehook has been used
+ % to inhibit colours in the header rows
+ }% end of noalign contents
+}
+% set the colours according to row parity; a priori #1 is \rownum, but
+% the macro has been designed to be usable in user level added code
+\def\sphinxSwitchCaseRowColor#1{%
+ \ifodd#1\relax
+ \global\sphinxcolorlet{sphinxTableRowColor}{sphinxTableRowColorOdd}%
+ \global\sphinxcolorlet{sphinxTableMergeColor}{\sphinxTableMergeColorOdd}%
+ \else
+ \global\sphinxcolorlet{sphinxTableRowColor}{sphinxTableRowColorEven}%
+ \global\sphinxcolorlet{sphinxTableMergeColor}{\sphinxTableMergeColorEven}%
+ \fi
+}
+
+% each \cline or \cmidrule (booktabs) consumes one \cr, offsetting the \rownum
+% parity; so this macro serves to compensate and must be added to each such
+% \cline or \cmidrule (see below)
+\def\spx@table@@decrementrownum{\noalign{\global\advance\rownum\m@ne}}
+\let\sphinxtabledecrementrownum\@empty
+
+% \sphinxtableafterendhook will be modified by colorrows class to execute
+% this after the table
+\def\spx@table@resetcolortbl{%
+ \sphinxrowcolorOFF
+ \spx@table@reset@CTeverycr
+% this last bit is done in order for the \sphinxbottomrule from the "foot"
+% longtable template to be able to use same code as the \sphinxbottomrule
+% at end of table body; see \sphinxbooktabsspecialbottomrule code
+ \global\rownum\z@
+}
+\def\spx@table@reset@CTeverycr{%
+% we should probably be more cautious and not hard-code here the colortbl
+% set-up; so the macro is defined without @ to fac
+ \global\CT@everycr{\noalign{\global\let\CT@row@color\relax}\the\everycr}%
+}
+
+% At last the style macros \sphinxthistablewithstandardstyle etc...
+
+% They are executed before the table environments in a scope limiting
+% wrapper "savenotes" environment.
+%
+% 0) colour support is enacted via adding code to three hooks:
+% - \sphinxtabletoprulehook (implicit from \sphinxtoprule expansion)
+% - \sphinxtableatstartofbodyhook (explicit from table templates)
+% - \sphinxtableafterendhook (explicit from table templates)
+% additionally special adjustment must be made in \sphinxcline
+%
+\def\sphinxtoprule{\spx@toprule\sphinxtabletoprulehook}
+% \spx@toprule is what is defined by the standard, booktabs and borderless
+% styles.
+% The colorrows class will prepend \spx@table@toprule@rowcolorON into
+% \sphinxtabletoprulehook which a priori is \@empty but can contain user added
+% extra code, and is executed after \spx@toprule.
+\let\sphinxtabletoprulehook \@empty
+\let\sphinxtableatstartofbodyhook\@empty
+\let\sphinxtableafterendhook \@empty
+%
+% 1) we manage these three hooks in a way allowing a custom user extra wrapper
+% environment from a container class to use them as entry point for some
+% custom code. The container code is done first, prior to table templates.
+% So, the style macros will *prepend* the needed color-code to the existing
+% custom user code, so the custom user code can override them. The custom
+% user code should not redefine any of the 3 \sphinxtable...hook macros via a
+% \global\def, but their contents can use \gdef. In fact they probably need
+% to for the first two hooks which are executed from inside the table and
+% a priori need their code to be in a \noalign which limits scope.
+%
+% 2) the table templates and LaTeX writer code make it so that only
+% one of either
+% \sphinxthistablewithcolorrowsstyle,
+% or \sphinxthistablewithnocolorrowsstyle
+% will be inserted explicitly depending on local :class: for table.
+% The global 'colorrows' style in latex_table_style translates at bottom
+% of this file into code for inserting \sphinxthistablewithcolorrowsstyle
+% at end of \sphinxthistablewithglobalstyle. So it is impossible
+% to have first \sphinxthistablewithnocolorrowsstyle, then
+% \sphinxthistablewithcolorrowsstyle. Nevertheless we have written
+% the code so that in this case colorrows would indeed activate (except
+% if it was already executed before as it self-annihilates).
+
+% standard style
+\def\sphinxthistablewithstandardstyle{%
+ % Those two are produced by the latex writer
+ \def\sphinxhline {\hline}%
+ % \sphinxtabledecrementrownum is a no-op which is redefined by colorrows
+ % to correct the \rownum increment induced by \cline in colorrows regime
+ \def\sphinxcline {\sphinxtabledecrementrownum\cline}%
+ % LaTeX's \cline needs fixing
+ \let\sphinxvlinecrossing\sphinxtablevlinecrossing
+ \let\sphinxfixclines \sphinxtablefixclines
+ % Those three are inserted by the table templates
+ \def\spx@toprule {\hline}%
+ \def\sphinxmidrule {\hline}%
+ \def\sphinxbottomrule {\hline}%
+ % Do not tamper with this internal
+ \def\spx@arrayrulewidth{\arrayrulewidth}%
+}
+
+% booktabs style
+% The \@xcmidrule patch below will do beyond its main stuff
+% \sphinxadjustcmidrulebelowsep
+% Indeed the poor booktabs spacing with \cmidrule (if \sphinxbooktabscmidrule
+% defined below is overwritten to use it) is quite awful. Do
+% \let\sphinxadjustcmidrulebelowsep\empty
+% if you prefer booktabs defaults.
+\def\sphinxadjustcmidrulebelowsep{\belowrulesep=\aboverulesep}
+\AtBeginDocument{% patch booktabs to avoid extra vertical space from
+ % consecutive \sphinxcline, if defined to use \cmidrule
+ \ifdefined\@xcmidrule
+ \let\spx@original@@xcmidrule\@xcmidrule
+ \def\@xcmidrule{\sphinxadjustcmidrulebelowsep
+ % if we don't do that, two \sphinxcline in the same row
+ % will cause the second short rule to be shifted down
+ \ifx\@tempa\sphinxcline\let\@tempa\cmidrule\fi
+ \spx@original@@xcmidrule}%
+ \fi
+}
+% wrappers to allow customization, e.g. via a container class
+% the top, mid, bottom definitions are in fact overwritten (later, below)
+% byt more complex ones needed to handle booktabs+colorrows context
+\def\sphinxbooktabstoprule {\toprule}
+\def\sphinxbooktabsmidrule {\midrule}
+\def\sphinxbooktabsbottomrule{\bottomrule}
+%
+\let\sphinxbooktabscmidrule \@gobble % i.e. draw no short rules at all!
+% You can redefine this to use \cmidrule with various options, such
+% as \cmidrule(lr), but:
+% Attention, if you want this to use \cmidrule (or \cline) you must,
+% if the table uses row colours,
+% also include the \sphinxtabledecrementrownum token like e.g. this
+% \def\sphinxbooktabscmidrule{\sphinxtabledecrementrownum\cmidrule(lr)}
+% and it must be first due to internals of the \cmidrule usage of \futurelet.
+
+\def\sphinxthistablewithbooktabsstyle{%
+ \let\sphinxhline\@empty % there is no wrapper macro here so if you want to change that
+ % you will have to redefine \sphinxthistablewithbooktabsstyle
+ \def\sphinxcline {\sphinxbooktabscmidrule}% defaults to give \@gobble
+ \let\sphinxvlinecrossing\@gobble % no | in a booktabs-style table !
+ \let\sphinxfixclines \@gobble % should not be used with booktabs + \cmidrule
+ \def\spx@toprule {\sphinxbooktabstoprule}%
+ \def\sphinxmidrule {\sphinxbooktabsmidrule}%
+ \def\sphinxbottomrule{\sphinxbooktabsbottomrule}%
+ \def\spx@arrayrulewidth{\z@}%
+}
+\AtBeginDocument{\@ifpackageloaded{booktabs}%
+ {}%
+ {\def\sphinxthistablewithbooktabsstyle{%
+ \PackageWarning{sphinx}{%
+Add \string\usepackage{booktabs} to the preamble to allow\MessageBreak
+local use of booktabs table style}%
+ \sphinxbuildwarning{booktabs}%
+ \sphinxthistablewithstandardstyle
+ }}%
+}%
+
+% borderless style
+\def\sphinxthistablewithborderlessstyle{%
+ \let\sphinxhline \@empty
+ \let\sphinxcline \@gobble
+ \let\sphinxvlinecrossing\@gobble
+ \let\sphinxfixclines \@gobble
+ \let\spx@toprule \@empty
+ \let\sphinxmidrule \@empty
+ \let\sphinxbottomrule \@empty
+ \def\spx@arrayrulewidth{\z@}%
+}%
+
+% colorrows style
+%
+\let\sphinxifthistablewithcolorrowsTF\@secondoftwo
+\def\sphinxthistablewithcolorrowsstyle{%
+ \let\sphinxifthistablewithcolorrowsTF\@firstoftwo
+% this is defined to auto-silence itself (in the surrounding scope-limiting
+% environment) after one execution ("colorrows" can never follow "nocolorrows")
+ \let\sphinxthistablewithcolorrowsstyle\@empty
+%
+ \let\spx@table@toprule@rowcolorON \spx@table@@toprule@rowcolorON
+ \let\spx@table@startbodycolorrows \spx@table@@startbodycolorrows
+ \let\sphinxtabledecrementrownum \spx@table@@decrementrownum
+% Is it the best choice to "prepend" to existing code there?
+ \spx@prepend\spx@table@toprule@rowcolorON\to\sphinxtabletoprulehook
+ \spx@prepend\spx@table@startbodycolorrows\to\sphinxtableatstartofbodyhook
+%
+% this one is not set to \@empty by nocolorrows, because it looks harmless
+% to execute it always, as it simply resets to standard colortbl state after
+% the table; so we don't need an @@ version for this one
+ \spx@prepend\spx@table@resetcolortbl\to\sphinxtableafterendhook
+}
+\def\spx@prepend#1\to#2{% attention about using this only with #2 "storage macro"
+ \toks@{#1}%
+ \toks@\expandafter\expandafter\expandafter{\expandafter\the\expandafter\toks@#2}%
+ \edef#2{\the\toks@}%
+}%
+
+\def\sphinxthistablewithnocolorrowsstyle{%
+ \let\sphinxifthistablewithcolorrowsTF\@secondoftwo
+% rather than trying to remove the code added by 'colorrows' style, we
+% simply make it no-op, without even checking if really it was activated.
+ \let\spx@table@toprule@rowcolorON\@empty
+ \let\spx@table@startbodycolorrows\@empty
+ \let\sphinxtabledecrementrownum \@empty
+% we don't worry about \sphinxtableafterendhook as the \spx@table@resetcolortbl
+% done at end can not do harm; and we could also have not bothered with the
+% \sphinxtabledecrementrownum as its \rownum decrement, if active, is harmless
+% in non-colorrows context
+}
+
+% (not so easy) implementation of the booktabscolorgaps option. This option
+% defaults to true and is not officially documented, as already colorrows is
+% only opt-in, so it is there only as a "turn-off" switch, but if nobody
+% complains in next few months, it will probably be removed altogether at
+% 6.0.0. The reason it exists is because of longtable aspeces described
+% below.
+%
+% As it is used via \sphinxsetup booktabscolorgaps status is not known here
+% and may change locally. So it must be implemented via delayed or
+% conditional code.
+%
+% We do not know the order of execution of \sphinxthistablewithbooktabsstyle
+% versus \sphinxthistablewithcolorrows: if booktabs is global option it
+% will be executed first; but if colorrows is global option and not booktabs
+% then colorrows will be executed first via \sphinxthistablewithglobalstyle
+%
+% Modifying things from locations such as \sphinxtabletoprulehook which are
+% executed within the table is not convenient as it must use \global
+% but then we would have to undo this after the table.
+%
+% So what we do is to prepare booktabs specific macros to incorporate
+% a conditional to check the colorrows status. We must each time check
+% both if colorrows is activated and if colorgaps is. We do this via
+% macros without @ so they can be used easily in customization code.
+% When and if booktabscolorgaps option is removed, we can then replace
+% \sphinxifbooktabswithcolorgapsTF by \sphinxifthistablewithcolorrowsTF
+\def\sphinxifbooktabswithcolorgapsTF{%
+ \if1\ifspx@opt@booktabscolorgaps
+ \sphinxifthistablewithcolorrowsTF{1}{0}%
+ \else0\fi
+ \expandafter\@firstoftwo
+ \else\expandafter\@secondoftwo
+ \fi
+}
+% as this is done without "@" it can be relatively easily be overwritten
+% by user in customization code
+\def\sphinxbooktabstoprule{%
+ \sphinxifbooktabswithcolorgapsTF
+ {\sphinxbooktabsspecialtoprule}%
+ {\toprule}%
+}%
+\def\sphinxbooktabscolorgapsoverhang{0.1pt}% avoid pixel/rounding effects
+% auxiliary fork
+\long\def\spx@table@crazyfork
+ #1\endfirsthead\endhead\sphinxtableatstartofbodyhook#2#3\@nil{#2}
+% we fetch the next token to check if there is a header or not
+% this is a bit fragile as it relies on the table templates
+% and it assumes this token #1 is never braced...
+% let's make this \long in case #1 is \par (should not be)
+\long\def\sphinxbooktabsspecialtoprule\sphinxtabletoprulehook#1{%
+ \specialrule{\heavyrulewidth}{\abovetopsep}{\z@}%
+ % this macro contains colour init code (and defines sphinxTableRowColor)
+ \sphinxtabletoprulehook
+ % unfortunately colortbl provides no way to save/restore the
+ % \arrayrulecolor status, we have to code it ourselves
+ \noalign{\global\let\spx@@saved@CT@arc@\CT@arc@
+% \@declaredcolor is not \long. Although #1 can probably never be \par with
+% our templates, let's be cautious and not use the creazyfork inside the \color
+ \spx@table@crazyfork
+% this crazy code checks if #1 is one of \endfirsthead, \endhead or
+% \sphinxtableatstartofbodyhook, as criterion for table with no header
+ #1\endhead\sphinxtableatstartofbodyhook\@secondoftwo
+ \endfirsthead#1\sphinxtableatstartofbodyhook\@secondoftwo
+ \endfirsthead\endhead#1\@secondoftwo
+ \endfirsthead\endhead\sphinxtableatstartofbodyhook\@firstoftwo
+ \@nil
+ {\gdef\CT@arc@{\color{sphinxTableRowColor}}}%
+ {\gdef\CT@arc@{\color{sphinxTableRowColorOdd}}}%
+ }% end of \noalign
+ % \specialrule uses \noalign itself
+ \specialrule{\dimexpr\belowrulesep+\sphinxbooktabscolorgapsoverhang\relax}%
+ {\z@}{-\sphinxbooktabscolorgapsoverhang}%
+ \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}%
+ #1% let's not forget to re-insert this #1 in token stream
+ % fortunately longtable's \endfirsthead/\endhead are not delimiters but
+ % are really tokens awaiting expansion...
+}%
+\def\sphinxbooktabsmidrule{%
+ \sphinxifbooktabswithcolorgapsTF
+ {\sphinxbooktabsspecialmidrule}%
+ {\midrule}%
+}%
+\def\sphinxbooktabsspecialmidrule{%
+ \noalign{\global\let\spx@@saved@CT@arc@\CT@arc@
+ \gdef\CT@arc@{\color{sphinxTableRowColor}}% this is RowColorHeader
+ }%
+ \specialrule{\dimexpr\aboverulesep+\sphinxbooktabscolorgapsoverhang\relax\relax}%
+ {-\sphinxbooktabscolorgapsoverhang}{\z@}%
+ \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}%
+ \specialrule{\lightrulewidth}{\z@}{\z@}%
+ \noalign{\gdef\CT@arc@{\color{sphinxTableRowColorOdd}}}%
+ \specialrule{\dimexpr\belowrulesep+\sphinxbooktabscolorgapsoverhang\relax\relax}%
+ {\z@}{-\sphinxbooktabscolorgapsoverhang}%
+ \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}%
+}%
+\def\sphinxbooktabsbottomrule{%
+ \sphinxifbooktabswithcolorgapsTF
+ {\sphinxbooktabsspecialbottomrule}%
+ {\bottomrule}%
+}%
+% The colour here is already updated because of the \\ before so we must
+% execute again the colour selection code, but this is not too complicated.
+% What is annoying though is that \sphinxbottomrule in the longtable context
+% appears both in the "foot" part and after the last body row. For the first
+% occurrence the \rownum could be arbitrary if it had not been reset by each
+% table using it via the \sphinxtableafterendhook (see above). This avoids
+% having to modify the longtable template. But as \rownum is thus 0 in the
+% "foot", the \sphinxSwitchCaseRowColor has to know how to handle negative
+% inputs (in fact the -1 value), the Sphinx definition has no issue with that
+% but any redefinition must be aware of this constraint.
+\def\sphinxbooktabsspecialbottomrule{%
+ \noalign{\global\let\spx@@saved@CT@arc@\CT@arc@
+ \sphinxSwitchCaseRowColor{\numexpr\rownum-\@ne\relax}%
+ \gdef\CT@arc@{\color{sphinxTableRowColor}}%
+ }%
+ \specialrule{\dimexpr\aboverulesep+\sphinxbooktabscolorgapsoverhang\relax}%
+ {-\sphinxbooktabscolorgapsoverhang}{\z@}%
+ \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}%
+ \specialrule{\heavyrulewidth}{\z@}{\belowbottomsep}%
+}%
+%
+% MEMO: with longtable \sphinxtoprule, \sphinxmidrule and \sphinxbottomrule
+% are evaluated at time of constructing the headers and footers as boxes
+% (already typeset material and expanded macros; \sphinxbottomrule is also
+% evaluated at very end of table body, i.e. "normally"). So the used colour
+% to fill the booktabs gaps is decided during the headers and footers
+% construction by longtable. Actually they are expanded twice: in firsthead
+% then in head, respectively in foot and lastfoot. But in current design the
+% header row colours are fixed, not alternating, so there is at least no
+% coherence issue there.
+
+% The \spx@arrayrulewidth is used for some complex matters of merged
+% cells size computations.
+% tabularcolumns argument will override any global or local style and
+% trigger the appropriate adjustment of \spx@arrayrulewidth.
+% Notice that this will be bad if the table uses booktabs style
+% but anyhow table with booktabs should not use any | separator.
+\def\sphinxthistablewithvlinesstyle{%
+ \def\spx@arrayrulewidth{\arrayrulewidth}%
+ \let\sphinxvlinecrossing\sphinxtablevlinecrossing
+ \let\sphinxfixclines \sphinxtablefixclines
+}%
+\def\sphinxthistablewithnovlinesstyle{%
+ \def\spx@arrayrulewidth{\z@}%
+ \let\sphinxvlinecrossing\@gobble
+ % let's not bother to modify \sphinxfixclines, it works fine and is
+ % useful in standard style + no vline (only hlines and clines);
+ % besides, only one of vline or novline style macro is executed
+}%
+
+% default is the standard style
+\def\sphinxthistablewithglobalstyle{\sphinxthistablewithstandardstyle}
+
+\ifspx@opt@booktabs
+ \RequirePackage{booktabs}
+ \def\sphinxthistablewithglobalstyle{\sphinxthistablewithbooktabsstyle}
+\fi
+\ifspx@opt@borderless
+ \def\sphinxthistablewithglobalstyle{\sphinxthistablewithborderlessstyle}
+\fi
+% colorrows appends to the current globalstyle (standard, booktabs, or borderless)
+\ifspx@opt@colorrows % let the globalstyle trigger the colorrows style on top of it
+ \expandafter\def\expandafter\sphinxthistablewithglobalstyle\expandafter
+ {\sphinxthistablewithglobalstyle
+ \sphinxthistablewithcolorrowsstyle
+ }
+\fi
+
+
+\endinput
diff --git a/sphinx/texinputs/sphinxmanual.cls b/sphinx/texinputs/sphinxmanual.cls
new file mode 100644
index 0000000..2e4b30d
--- /dev/null
+++ b/sphinx/texinputs/sphinxmanual.cls
@@ -0,0 +1,128 @@
+%
+% sphinxmanual.cls for Sphinx (https://www.sphinx-doc.org/)
+%
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{sphinxmanual}[2019/12/01 v2.3.0 Document class (Sphinx manual)]
+
+% chapters starting at odd pages (overridden by 'openany' document option)
+\PassOptionsToClass{openright}{\sphinxdocclass}
+
+% 'oneside' option overriding the 'twoside' default
+\newif\if@oneside
+\DeclareOption{oneside}{\@onesidetrue}
+% Pass remaining document options to the parent class.
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}}
+\ProcessOptions\relax
+
+% Defaults two-side document
+\if@oneside
+% nothing to do (oneside is the default)
+\else
+\PassOptionsToClass{twoside}{\sphinxdocclass}
+\fi
+
+\LoadClass{\sphinxdocclass}
+
+% Set some sane defaults for section numbering depth and TOC depth. You can
+% reset these counters in your preamble.
+%
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{1}
+
+% Adapt \and command to the flushright context of \sphinxmaketitle, to
+% avoid ragged line endings if author names do not fit all on one single line
+\DeclareRobustCommand{\and}{%
+ \end{tabular}\kern-\tabcolsep
+ \allowbreak
+ \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}%
+}%
+% If it is desired that each author name be on its own line, use in preamble:
+%\DeclareRobustCommand{\and}{%
+% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}%
+%}%
+% Change the title page to look a bit better, and fit in with the fncychap
+% ``Bjarne'' style a bit better.
+%
+\newcommand{\sphinxmaketitle}{%
+ \let\sphinxrestorepageanchorsetting\relax
+ \ifHy@pageanchor\def\sphinxrestorepageanchorsetting{\Hy@pageanchortrue}\fi
+ \hypersetup{pageanchor=false}% avoid duplicate destination warnings
+ \begin{titlepage}%
+ \let\footnotesize\small
+ \let\footnoterule\relax
+ \noindent\rule{\textwidth}{1pt}\par
+ \begingroup % for PDF information dictionary
+ \def\endgraf{ }\def\and{\& }%
+ \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup
+ \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}%
+ \endgroup
+ \begin{flushright}%
+ \sphinxlogo
+ \py@HeaderFamily
+ {\Huge \@title \par}
+ {\itshape\LARGE \py@release\releaseinfo \par}
+ \vfill
+ {\LARGE
+ \begin{tabular}[t]{c}
+ \@author
+ \end{tabular}\kern-\tabcolsep
+ \par}
+ \vfill\vfill
+ {\large
+ \@date \par
+ \vfill
+ \py@authoraddress \par
+ }%
+ \end{flushright}%\par
+ \@thanks
+ \end{titlepage}%
+ \setcounter{footnote}{0}%
+ \let\thanks\relax\let\maketitle\relax
+ %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
+ \clearpage
+ \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi
+ \if@openright\cleardoublepage\else\clearpage\fi
+ \sphinxrestorepageanchorsetting
+}
+
+\newcommand{\sphinxtableofcontents}{%
+ \pagenumbering{roman}%
+ \begingroup
+ \parskip \z@skip
+ \sphinxtableofcontentshook
+ \tableofcontents
+ \endgroup
+ % before resetting page counter, let's do the right thing.
+ \if@openright\cleardoublepage\else\clearpage\fi
+ \pagenumbering{arabic}%
+}
+
+% This is needed to get the width of the section # area wide enough in the
+% library reference. Doing it here keeps it the same for all the manuals.
+%
+\newcommand{\sphinxtableofcontentshook}{%
+ \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}%
+ \renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}%
+}
+
+% Fix the bibliography environment to add an entry to the Table of
+% Contents.
+% For a report document class this environment is a chapter.
+%
+\newenvironment{sphinxthebibliography}[1]{%
+ \if@openright\cleardoublepage\else\clearpage\fi
+ % \phantomsection % not needed here since TeXLive 2010's hyperref
+ \begin{thebibliography}{#1}%
+ \addcontentsline{toc}{chapter}{\bibname}}{\end{thebibliography}}
+
+% Same for the indices.
+% The memoir class already does this, so we don't duplicate it in that case.
+%
+\@ifclassloaded{memoir}
+ {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}
+ {\newenvironment{sphinxtheindex}{%
+ \if@openright\cleardoublepage\else\clearpage\fi
+ \phantomsection % needed as no chapter, section, ... created
+ \begin{theindex}%
+ \addcontentsline{toc}{chapter}{\indexname}}{\end{theindex}}}
diff --git a/sphinx/texinputs/sphinxoptionsgeometry.sty b/sphinx/texinputs/sphinxoptionsgeometry.sty
new file mode 100644
index 0000000..af5a804
--- /dev/null
+++ b/sphinx/texinputs/sphinxoptionsgeometry.sty
@@ -0,0 +1,54 @@
+%% OPTIONS FOR GEOMETRY
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxoptionsgeometry.sty}[2021/01/27 geometry]
+
+% geometry
+\ifx\kanjiskip\@undefined
+ \PassOptionsToPackage{%
+ hmargin={\unexpanded{\spx@opt@hmargin}},%
+ vmargin={\unexpanded{\spx@opt@vmargin}},%
+ marginpar=\unexpanded{\spx@opt@marginpar}}
+ {geometry}
+\else
+ % set text width for Japanese documents to be integer multiple of 1zw
+ % and text height to be integer multiple of \baselineskip
+ % the execution is delayed to \sphinxsetup then geometry.sty
+ \normalsize\normalfont
+ \newcommand*\sphinxtextwidthja[1]{%
+ \if@twocolumn\tw@\fi
+ \dimexpr
+ \numexpr\dimexpr\paperwidth-\tw@\dimexpr#1\relax\relax/
+ \dimexpr\if@twocolumn\tw@\else\@ne\fi zw\relax
+ zw\relax}%
+ \newcommand*\sphinxmarginparwidthja[1]{%
+ \dimexpr\numexpr\dimexpr#1\relax/\dimexpr1zw\relax zw\relax}%
+ \newcommand*\sphinxtextlinesja[1]{%
+ \numexpr\@ne+\dimexpr\paperheight-\topskip-\tw@\dimexpr#1\relax\relax/
+ \baselineskip\relax}%
+ \ifx\@jsc@uplatextrue\@undefined\else
+ % the way we found in order for the papersize special written by
+ % geometry in the dvi file to be correct in case of jsbook class
+ \ifnum\mag=\@m\else % do nothing special if nomag class option or 10pt
+ \PassOptionsToPackage{truedimen}{geometry}%
+ \fi
+ \fi
+ \PassOptionsToPackage{%
+ hmarginratio={1:1},%
+ textwidth=\unexpanded{\sphinxtextwidthja{\spx@opt@hmargin}},%
+ vmarginratio={1:1},%
+ lines=\unexpanded{\sphinxtextlinesja{\spx@opt@vmargin}},%
+ marginpar=\unexpanded{\sphinxmarginparwidthja{\spx@opt@marginpar}},%
+ footskip=2\baselineskip,%
+ }{geometry}%
+ \AtBeginDocument
+ {% update a dimension used by the jsclasses
+ \ifx\@jsc@uplatextrue\@undefined\else\fullwidth\textwidth\fi
+ % for some reason, jreport normalizes all dimensions with \@settopoint
+ \@ifclassloaded{jreport}
+ {\@settopoint\textwidth\@settopoint\textheight\@settopoint\marginparwidth}
+ {}% <-- "false" clause of \@ifclassloaded
+ }%
+\fi
+
+\endinput
diff --git a/sphinx/texinputs/sphinxoptionshyperref.sty b/sphinx/texinputs/sphinxoptionshyperref.sty
new file mode 100644
index 0000000..b88f108
--- /dev/null
+++ b/sphinx/texinputs/sphinxoptionshyperref.sty
@@ -0,0 +1,35 @@
+%% Bookmarks and hyperlinks
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxoptionshyperref.sty}[2021/01/27 hyperref]
+
+% to make pdf with correct encoded bookmarks in Japanese
+% this should precede the hyperref package
+\ifx\kanjiskip\@undefined
+% for non-Japanese: make sure bookmarks are ok also with lualatex
+ \PassOptionsToPackage{pdfencoding=unicode}{hyperref}
+\else
+ \RequirePackage{atbegshi}
+ \ifx\ucs\@undefined
+ \ifnum 42146=\euc"A4A2
+ \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}}
+ \else
+ \AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}}
+ \fi
+ \else
+ \AtBeginShipoutFirst{\special{pdf:tounicode UTF8-UCS2}}
+ \fi
+\fi
+
+\ifx\@jsc@uplatextrue\@undefined\else
+ \PassOptionsToPackage{setpagesize=false}{hyperref}
+\fi
+
+% These options can be overridden inside 'hyperref' key
+% or by later use of \hypersetup.
+\PassOptionsToPackage{colorlinks,breaklinks,%
+ linkcolor=InnerLinkColor,filecolor=OuterLinkColor,%
+ menucolor=OuterLinkColor,urlcolor=OuterLinkColor,%
+ citecolor=InnerLinkColor}{hyperref}
+
+\endinput
diff --git a/sphinx/texinputs/sphinxpackageboxes.sty b/sphinx/texinputs/sphinxpackageboxes.sty
new file mode 100644
index 0000000..b0d3707
--- /dev/null
+++ b/sphinx/texinputs/sphinxpackageboxes.sty
@@ -0,0 +1,854 @@
+%% COLOURED BOXES
+%
+% change this info string if making any custom modification
+\ProvidesPackage{sphinxpackageboxes}[2023/03/19 v6.2.0 advanced colored boxes]
+% Optionally executes \RequirePackage for:
+%
+% - pict2e. Ideally we would like to use the v0.4a 2020/08/16 release of this
+% package as it allows dimensional arguments to its \moveto, \lineto, etc...
+% Or we could use extra package "picture". We opt for custom wrappers
+% \spx@moveto, \spx@lineto, ..., working with old versions.
+%
+% - ellipse. This package extends pict2e with elliptical arcs. Its author
+% Daan Leijen also has contributed package longfbox which is part of
+% TeXLive. Had I known about it, I would perhaps have based Sphinx CSS on
+% top of longfbox at least partly. But this would not have spared me all
+% the work in sphinx.sty, which was a long walk until 6.2.0 version.
+% Besides I don't need the breakable boxes from longfbox, as Sphinx has
+% its own rather advanced layer on top of framed. I would need to check if
+% some thorny color issues solved by Sphinx (and not by tcolorbox) at page
+% breaks are solved by longfbox as well. (I have not tested)
+
+% At 6.2.0 refactoring, we do not wait for at begin document to try to load
+% pict2e. Actually since 6.0.0 the default is for code-blocks to use
+% rounded boxes, and the only reason since then to wait "at begin document"
+% was to check if user had reverted that default and in fact pict2e was not
+% needed. But with \sphinxbox, we can not know for sure even in that case
+% that pict2e is not needed. And even back then it would have been possible
+% to user to try to employ \sphinxsetup via raw directive in document body
+% and require some rounded corners (which was thus impossible to satisfy).
+% Time to be much simpler and attempt unconditionally to load pict2e
+% immediately. This will also have advantage that we can use
+% \@ifpackageloaded{pict2e} and not have to query and save its setting later
+% at begin document.
+\IfFileExists{pict2e.sty}
+ {\RequirePackage{pict2e}}
+ {\PackageWarningNoLine{sphinx}{%
+ The package pict2e is required for rounded boxes.\MessageBreak
+ It does not seem to be available on your system.\MessageBreak
+ Options for setting radii will be ignored%
+ }%
+ % Formerly a \sphinxbuildwarning was issued but if we did that now it
+ % would mean that the produced PDF will always have a red banner near its
+ % end about pict2e not being available if indeed it is not available, even
+ % if user has reverted the default and dropped rounded corners. Formerly
+ % the serious warning was done after having checked at begin document that
+ % indeed a rounded corner option had been used. As we drop the check now,
+ % let's be more discrete and simply duplicate the earlier warning to make
+ % it visible near end of compilation log and console output.
+ \AtEndDocument{\PackageWarningNoLine{sphinx}{%
+ The package pict2e is required for rounded boxes.\MessageBreak
+ As it does not seem to be available on your system,\MessageBreak
+ options setting radii have all been ignored}}%
+ }%
+
+\IfFileExists{ellipse.sty}
+ {\RequirePackage{ellipse}}
+ {\PackageWarningNoLine{sphinx}{%
+ The package ellipse is required for elliptical corners.\MessageBreak
+ It does not seem to be available on your system.\MessageBreak
+ All non-straight corners will use circle arcs.%
+ }%
+ \AtEndDocument{\PackageWarningNoLine{sphinx}{%
+ The package ellipse is required for elliptical corners.\MessageBreak
+ As it does not seem to be available on your system,\MessageBreak
+ all non-straight corners have used circle arcs.}}%
+ }%
+
+% The pict2e release v0.4b of 2020/09/30 does not allocate scratch dimen
+% register \@tempdimd which ellipse package uses. Thus ellipse package is
+% broken since (written on March 20, 2023). Simply allocate the register
+% ourself to fix that, pending some upstream fix.
+\@ifpackageloaded{ellipse}{\ifdefined\@tempdimd\else\newdimen\@tempdimd\fi}{}
+
+% Provides box registers \spx@tempboxa, \spx@tempboxb usable in other places
+\newbox\spx@tempboxa
+\newbox\spx@tempboxb
+
+%%%%%%%%%%%%%%%%
+% Internal registers, conditionals, colors to be configured by each caller
+% via a preliminary "setup" call
+%
+\newif\ifspx@boxes@withshadow
+\newif\ifspx@boxes@insetshadow
+\newif\ifspx@boxes@withbackgroundcolor
+\newif\ifspx@boxes@withshadowcolor
+\newif\ifspx@boxes@withbordercolor
+\newif\ifspx@boxes@shadowinbbox
+%
+\newdimen\spx@boxes@border
+\newdimen\spx@boxes@border@top
+\newdimen\spx@boxes@border@right
+\newdimen\spx@boxes@border@bottom
+\newdimen\spx@boxes@border@left
+%
+\newdimen\spx@boxes@padding@top
+\newdimen\spx@boxes@padding@right
+\newdimen\spx@boxes@padding@bottom
+\newdimen\spx@boxes@padding@left
+%
+\newdimen\spx@boxes@shadow@xoffset
+\newdimen\spx@boxes@shadow@yoffset
+%
+\newdimen\spx@boxes@radius@topleft@x
+\newdimen\spx@boxes@radius@topright@x
+\newdimen\spx@boxes@radius@bottomright@x
+\newdimen\spx@boxes@radius@bottomleft@x
+\newdimen\spx@boxes@radius@topleft@y
+\newdimen\spx@boxes@radius@topright@y
+\newdimen\spx@boxes@radius@bottomright@y
+\newdimen\spx@boxes@radius@bottomleft@y
+%
+% These colors will be set to colors defined appropriately by caller of
+% \spx@boxes@fcolorbox@setup macro
+% spx@boxes@bordercolor
+% spx@boxes@backgroundcolor
+% spx@boxes@shadowcolor
+% spx@boxes@textcolor
+
+%%%%%%%%%%%%%%%%
+% "setup" macro
+%
+% It must be called prior to \spx@boxes@fcolorbox for parameters of the latter
+% to be initialized.
+%
+% It also prepares \spx@boxes@fcolorbox to expand to one of
+% \spx@boxes@fcolorbox@rectangle or \spx@boxes@fcolorbox@rounded depending on
+% the configuration and availability of the pict2e package.
+%
+% The #1 is one of: pre, topic, warning, danger, etc....
+%
+% We delay until here the parsing of radii options to extract x and y
+% components.
+\def\spx@boxes@setradii#1 #2 #3\@nnil#4#5{%
+ #4\dimexpr#1\relax
+ #5\dimexpr#2\relax
+ \ifdim#5=-\maxdimen#5#4\fi
+ % if one of them is zero or negative set both to zero
+ \ifdim#4>\z@\else#4\z@#5\z@\fi
+ \ifdim#5>\z@\else#4\z@#5\z@\fi
+}%
+% if ellipse.sty is not available ignore the second component of all radii
+% specifications, use circle arcs with radius the x component
+\@ifpackageloaded{ellipse}
+ {}
+ {\def\spx@boxes@setradii#1 #2 #3\@nnil#4#5{#4\dimexpr#1\relax #5#4}}
+
+% Using \dimexpr for maximal user input flexibility.
+\def\spx@boxes@fcolorbox@setup#1{%
+ \spx@boxes@border@top \dimexpr\@nameuse{spx@#1@border@top}\relax
+ \spx@boxes@border@right \dimexpr\@nameuse{spx@#1@border@right}\relax
+ \spx@boxes@border@bottom\dimexpr\@nameuse{spx@#1@border@bottom}\relax
+ \spx@boxes@border@left \dimexpr\@nameuse{spx@#1@border@left}\relax
+ \spx@boxes@border \dimexpr\@nameuse{spx@#1@border}\relax
+ %
+ \spx@boxes@padding@top \dimexpr\@nameuse{spx@#1@padding@top}\relax
+ \spx@boxes@padding@right \dimexpr\@nameuse{spx@#1@padding@right}\relax
+ \spx@boxes@padding@bottom\dimexpr\@nameuse{spx@#1@padding@bottom}\relax
+ \spx@boxes@padding@left \dimexpr\@nameuse{spx@#1@padding@left}\relax
+ %
+ \edef\spx@temp{\csname spx@#1@radius@topleft\endcsname\space}%
+ \expandafter
+ \spx@boxes@setradii
+ \spx@temp
+ {-\maxdimen}
+ \@nnil
+ \spx@boxes@radius@topleft@x\spx@boxes@radius@topleft@y
+ \edef\spx@temp{\csname spx@#1@radius@topright\endcsname\space}%
+ \expandafter
+ \spx@boxes@setradii
+ \spx@temp
+ {-\maxdimen}
+ \@nnil
+ \spx@boxes@radius@topright@x\spx@boxes@radius@topright@y
+ \edef\spx@temp{\csname spx@#1@radius@bottomright\endcsname\space}%
+ \expandafter
+ \spx@boxes@setradii
+ \spx@temp
+ {-\maxdimen}
+ \@nnil
+ \spx@boxes@radius@bottomright@x\spx@boxes@radius@bottomright@y
+ \edef\spx@temp{\csname spx@#1@radius@bottomleft\endcsname\space}%
+ \expandafter
+ \spx@boxes@setradii
+ \spx@temp
+ {-\maxdimen}
+ \@nnil
+ \spx@boxes@radius@bottomleft@x\spx@boxes@radius@bottomleft@y
+ %
+ \@nameuse{ifspx@#1@withshadow}%
+ \spx@boxes@withshadowtrue
+ \spx@boxes@shadow@xoffset \dimexpr\@nameuse{spx@#1@shadow@xoffset}\relax
+ \spx@boxes@shadow@yoffset \dimexpr\@nameuse{spx@#1@shadow@yoffset}\relax
+ \else
+ \spx@boxes@withshadowfalse
+ \fi
+ % not nesting in previous to avoid TeX conditional subtleties
+ \@nameuse{ifspx@#1@insetshadow}%
+ \spx@boxes@insetshadowtrue
+ \else
+ \spx@boxes@insetshadowfalse
+ \fi
+ %
+ \@nameuse{ifspx@#1@withbordercolor}%
+ \spx@boxes@withbordercolortrue
+ \sphinxcolorlet{spx@boxes@bordercolor}{sphinx#1BorderColor}%
+ \else
+ \spx@boxes@withbordercolorfalse
+ \fi
+ %
+ \@nameuse{ifspx@#1@withbackgroundcolor}%
+ \spx@boxes@withbackgroundcolortrue
+ \sphinxcolorlet{spx@boxes@backgroundcolor}{sphinx#1BgColor}%
+ \else
+ \spx@boxes@withbackgroundcolorfalse
+ \fi
+ %
+ \@nameuse{ifspx@#1@withshadowcolor}%
+ \spx@boxes@withshadowcolortrue
+ \sphinxcolorlet{spx@boxes@shadowcolor}{sphinx#1ShadowColor}%
+ \else
+ \spx@boxes@withshadowcolorfalse
+ \fi
+ % Display elements pre, topic, warning et al. by default do not include
+ % shadow in box (legacy; and only topic actually uses a shadow per default)
+ % This may be refactored still more in future, but this 6.2.0 extra helped
+ % reduce workload from code-blocks (pre), contents (topic) and admonitions.
+ % As this conditional is a priori false and should only be changed locally
+ % (by \sphinxbox), this line is actually superfluous.
+ \spx@boxes@shadowinbboxfalse
+ \spx@boxes@fcolorbox@setup@fcolorbox
+}
+\@ifpackageloaded{pict2e}
+{% pict2e is available and loaded
+ \def\spx@boxes@fcolorbox@setup@fcolorbox{%
+ \if1% use rounded boxes only if needed (rx>0 iff ry>0)
+ \ifdim\spx@boxes@radius@topleft@x >\z@0\fi
+ \ifdim\spx@boxes@radius@topright@x >\z@0\fi
+ \ifdim\spx@boxes@radius@bottomright@x>\z@0\fi
+ \ifdim\spx@boxes@radius@bottomleft@x >\z@0\fi
+ 1\def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle}%
+ \else
+ \def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rounded}%
+ \fi
+ }% end of definition of setup@fcolorbox in case of presence of pict2e
+}%
+{% pict2e could not be loaded, we must always use fcolorbox@rectangle
+ \def\spx@boxes@fcolorbox@setup@fcolorbox{%
+ \def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle}%
+ }% end of definition of setup@fcolorbox in case of absence of pict2e
+}% end of "no pict2e" branch
+
+%%%%%%%%%%%%%%%%
+% Support of box-decoration-break=slice
+%
+% 6.2.0 has renamed and moved this here from sphinxlatexliterals.sty,
+% to facilitate supporting box-decoration-break=slice for all directives,
+% not only code-block.
+%
+% It also modified when these post actions are executed, in order
+% for openboth to be able to trigger usage of fcolorbox@rectangle.
+% So now openbottom and opentop also take advantage of this possible
+% optimization.
+\def\spx@boxes@fcolorbox@setup@openbottom{%
+ \spx@boxes@border@bottom \z@
+ \spx@boxes@radius@bottomright@x\z@ \spx@boxes@radius@bottomright@y\z@
+ \spx@boxes@radius@bottomleft@x \z@ \spx@boxes@radius@bottomleft@y \z@
+ \spx@boxes@fcolorbox@setup@fcolorbox
+}%
+\def\spx@boxes@fcolorbox@setup@opentop{%
+ \spx@boxes@border@top \z@
+ \spx@boxes@radius@topright@x\z@ \spx@boxes@radius@topright@y\z@
+ \spx@boxes@radius@topleft@x \z@ \spx@boxes@radius@topleft@y \z@
+ \spx@boxes@fcolorbox@setup@fcolorbox
+}%
+\def\spx@boxes@fcolorbox@setup@openboth{%
+ \spx@boxes@border@top \z@
+ \spx@boxes@border@bottom \z@
+ \spx@boxes@radius@bottomright@x\z@ \spx@boxes@radius@bottomright@y\z@
+ \spx@boxes@radius@bottomleft@x \z@ \spx@boxes@radius@bottomleft@y \z@
+ \spx@boxes@radius@topright@x\z@ \spx@boxes@radius@topright@y\z@
+ \spx@boxes@radius@topleft@x \z@ \spx@boxes@radius@topleft@y \z@
+ \def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle}%
+}%
+
+%%%%%%%%%%%%%%%%
+% \sphinxbox (added at 6.2.0)
+%
+% For an inline box, possibly rounded.
+\newcommand\sphinxbox[1][]{% #1 stands for the options, they are... optional!
+ % \leavevmode makes sure TeX switches to paragraph mode, which is necessary
+ % if this is first in a paragraph or a list element. The \sphinxAtStartPar
+ % mechanism also ensures this automatically, if not redefined, but not with
+ % lualatex as then it is by default doing nothing.
+ \leavevmode
+ \begingroup
+ \ifcsname spx@boxes@sphinxbox@isnested\endcsname
+ % nested boxes reset all box options to be as the \sphinxboxsetup
+ % defaults, before applying their specific options
+ \spx@boxes@sphinxbox@reset
+ \else
+ % top layer box, toggle the nested flag
+ \csname spx@boxes@sphinxbox@isnested\endcsname
+ \fi
+ % we do not use \sphinxboxsetup as it is a user command extending the
+ % "reset" storage
+ \setkeys{sphinxbox}{#1}%
+ \spx@boxes@fcolorbox@setup{box}%
+ \spx@boxes@shadowinbboxtrue% inline sphinx boxes include shadow in bbox
+ \ifspx@box@withtextcolor\color{sphinxboxTextColor}\fi
+ %
+ % MEMO: the fcolorbox@{rectangle,rounded} draw the contents (which here
+ % will be encapsulated as \box\z@) last, i.e. after shadow, background,
+ % and border and their color commands. The \reset@color from naked
+ % top-level \color commands in argument (which can not arise from Sphinx
+ % mark-up anyhow) would end up being placed via color.sty \aftergroup core
+ % mechanism in token stream after \spx@boxes@sphinxbox@a (which is the
+ % first \aftergroup) hence after the box contents with its unbalanced
+ % color pushes is shipped to PDF. So the missing color pop specials are
+ % inserted then in correct order at correct place (after the \endgroup at
+ % end of \spx@boxes@sphinxbox@a but this is not relevant) and do not end
+ % up causing havoc in push/pop pairs (and all this happens on same page).
+ %
+ % There is thus no reason here to go to the trouble to add an extra
+ % \color@begingroup/\color@endgroup or like pair to encapsulate the caught
+ % contents in order for the \box\z@ to contain as many color pop's as it
+ % has color pushes. But as this is subtle, this comment was added for
+ % future maintenance. Actually even if the contents were not drawn last,
+ % their (purely theoretical, as Sphinx mark-up can not create it) missing
+ % color pop's would not have caused trouble I guess as long as the color
+ % insertions for shadow, background, border are correctly balanced.
+ \setbox0\hbox\bgroup\aftergroup\spx@boxes@sphinxbox@a
+ \afterassignment\spx@box@TeXextras
+ \let\next=%
+}
+\def\spx@boxes@sphinxbox@a{\spx@boxes@fcolorbox{%
+ \ifspx@opt@box@addstrut\strut\fi\box\z@}\endgroup}
+
+\newcommand\newsphinxbox[2][]{%
+ \newcommand#2[1][]{\sphinxbox[#1,##1]}%
+}
+% Let's catch \renewsphinxbox[...]{\sphinxbox} which would cause \sphinxbox
+% to fall into infinite looping on use.
+\newcommand\renewsphinxbox[2][]{%
+ \in@{#2}{\sphinxbox}%
+ \ifin@
+ \PackageWarning{sphinx}{Attempt to \string\renewsphinxbox\space
+ the \string\sphinxbox\space command\MessageBreak
+ itself. This is not allowed and will be ignored.\MessageBreak
+ Reported}%
+ \else
+ \renewcommand#2[1][]{\sphinxbox[#1,##1]}%
+ \fi
+}
+
+%%%%%%%%%%%%%%%%
+% MACROS
+%
+% \spx@boxes@fcolorbox expands either to \spx@boxes@fcolorbox@rectangle
+% or \spx@boxes@fcolorbox@rounded depending on preliminary set-up.
+%
+% This is decided by the "setup" which must have been executed by the caller.
+% Let's give it some (thus unneeded) default fall-back for clarity.
+\def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle}
+%
+% A macro \spx@boxes@fcolorbox@setuphook used to be executed at start of the
+% \hbox constructs (rectangle or rounded). This was used until 6.2.0 for the
+% support of pre_box-decoration-break option, hence was really an internal
+% non-public macro. As it is not needed anymore, with some hesitation it got
+% entirely removed at 6.2.0 on the occasion of a refactoring of interactions of
+% this file with sphinxlatexliterals.sty. Besides its name should have been
+% rather something such as \spx@boxes@fcolorbox@atstartofhbox.
+%
+% After "setup", \spx@boxes@fcolorbox expands to one of:
+%
+% - \spx@boxes@fcolorbox@rectangle (4 padding parameters, 4 border widths, 2 shadow widths,
+% and three colours: background, border and shadow; same as in CSS styling)
+%
+% It branches to one of:
+% - \spx@boxes@fcolorbox@externalshadow
+% - \spx@boxes@fcolorbox@insetshadow (same concept of "inset" as in CSS styling)
+%
+% - \spx@boxes@fcolorbox@rounded: rounded corners using the picture environment
+% and pict2e package for its low-weight interface to PDF graphics operations
+
+% MEMO: we have also successfully tested usage of tcolorbox.sty (its \tcbox) but
+% decided to use pict2e.sty for the following reasons:
+% 1- PDF build was observed to be an order of magnitude faster,
+% 2- the boxes we can do with pict2e appear to be fancy enough,
+% almost matching what one can see in HTML renderings,
+% 2- orders of magnitude smaller dependency (tcolorbox uses the pgf TeX
+% framework), although on Ubuntu it seems texlive-pictures is
+% needed which also contains the whole of pgf/TikZ... so this point
+% is a bit moot...
+
+% For code-blocks, attachments of caption and continuation hints are done
+% exactly as prior to extension of Sphinx via this package, whether the box
+% has straight or rounded corners. The vertical space occupied is the same,
+% if nothing else is changed (perhaps in future the title itself could be also
+% rendered in a rounded box?)
+
+%%%%%%%%
+%//// \spx@boxes@fcolorbox@rectangle
+%
+% This box will have the same baseline as its argument (which is typeset in
+% horizontal mode). It takes into account four border widths parameters, four
+% padding parameters, two shadow widths (each possibly negative), and three
+% colors: background, border and shadow. Its boundary box takes into account
+% border and padding. Width of shadow is taken into account if the boolean
+% \ifspx@boxes@shadowinbbox is \iftrue. The "setup" sets it to \iffalse.
+% Prior to 6.2.0, shadow size was included in bbox but the callers manually
+% removed it by extra steps. The \sphinxbox command sets it to \iftrue after
+% the "setup".
+%
+% It is up to the caller to take extra steps if the border and padding must go
+% into margin as well (see sphinxlatexliterals.sty for how this is done in
+% \spx@verb@FrameCommand).
+%
+% In usage as a "FrameCommand" with framed.sty, the argument will already be a
+% collection of TeX boxes (and interline glues).
+%
+% This was designed so that the parameters configured by "setup" are
+% interpreted as they would be as CSS properties in an HTML context.
+\long\def\spx@boxes@fcolorbox@rectangle#1{%
+ \hbox\bgroup
+ \setbox\spx@tempboxa
+ \hbox{\kern\dimexpr\spx@boxes@border@left+\spx@boxes@padding@left\relax
+ {#1}%
+ \kern\dimexpr\spx@boxes@padding@right+\spx@boxes@border@right\relax}%
+ \ht\spx@tempboxa
+ \dimexpr\ht\spx@tempboxa+\spx@boxes@border@top+\spx@boxes@padding@top\relax
+ \dp\spx@tempboxa
+ \dimexpr\dp\spx@tempboxa+\spx@boxes@padding@bottom+\spx@boxes@border@bottom\relax
+ \ifspx@boxes@insetshadow
+ \expandafter\spx@boxes@fcolorbox@insetshadow
+ \else
+ \expandafter\spx@boxes@fcolorbox@externalshadow
+ \fi
+}
+
+% external shadow
+\def\spx@boxes@fcolorbox@externalshadow{%
+ % reserve space to external shadow if on left
+ \ifspx@boxes@withshadow
+ \ifspx@boxes@shadowinbbox
+ \ifdim\spx@boxes@shadow@xoffset<\z@\kern-\spx@boxes@shadow@xoffset\fi
+ \fi
+ \fi
+ % BACKGROUND
+ % draw background and move back to reference point
+ \ifspx@boxes@withbackgroundcolor
+ {\color{spx@boxes@backgroundcolor}%
+ \vrule\@height\ht\spx@tempboxa
+ \@depth\dp\spx@tempboxa
+ \@width\wd\spx@tempboxa
+ \kern-\wd\spx@tempboxa
+ }%
+ \fi
+ % BOX SHADOW
+ % draw shadow and move back to reference point
+ \ifspx@boxes@withshadow
+ \vbox{%
+ \moveright\spx@boxes@shadow@xoffset
+ \hbox{\lower\spx@boxes@shadow@yoffset
+ \vbox{\ifspx@boxes@withshadowcolor
+ \color{spx@boxes@shadowcolor}%
+ \else
+ % 6.2.0: guard against a manually inserted \color command in
+ % contents which could leak at a page break to the shadow
+ \normalcolor
+ \fi
+ \ifdim\spx@boxes@shadow@yoffset<\z@
+ \hrule\@height-\spx@boxes@shadow@yoffset
+ \kern\spx@boxes@shadow@yoffset
+ \fi
+ \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa{%
+ \ifdim\spx@boxes@shadow@xoffset<\z@\vrule\@width-\spx@boxes@shadow@xoffset\fi
+ \hss
+ \ifdim\spx@boxes@shadow@xoffset>\z@\vrule\@width\spx@boxes@shadow@xoffset\fi
+ }%
+ \ht\spx@tempboxb\ht\spx@tempboxa
+ \dp\spx@tempboxb\dp\spx@tempboxa
+ \box\spx@tempboxb
+ \ifdim\spx@boxes@shadow@yoffset>\z@
+ \kern-\spx@boxes@shadow@yoffset
+ \hrule\@height\spx@boxes@shadow@yoffset
+ \fi
+ \kern-\dp\spx@tempboxa
+ }% end of \vbox, attention it will have zero depth if yoffset>0
+ \kern-\wd\spx@tempboxa
+ \ifdim\spx@boxes@shadow@xoffset>\z@
+ \kern-\spx@boxes@shadow@xoffset
+ \fi
+ }% end of \hbox, attention its depth is only yoffset if yoffset>0
+ }% end of \vbox
+ \fi % end of shadow drawing, and we are back to horizontal reference point
+ % BOX BORDER
+ \vbox{\ifspx@boxes@withbordercolor
+ \color{spx@boxes@bordercolor}%
+ \else
+ % 6.2.0: guard against a \color command in contents whose effect
+ % could leak to border at a pagebreak
+ \normalcolor
+ \fi
+ \hrule\@height\spx@boxes@border@top
+ \kern-\spx@boxes@border@top
+ \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa
+ {\vrule\@width\spx@boxes@border@left
+ \hss\vrule\@width\spx@boxes@border@right
+ }%
+ \ht\spx@tempboxb\ht\spx@tempboxa
+ \dp\spx@tempboxb\dp\spx@tempboxa
+ \box\spx@tempboxb
+ \kern-\spx@boxes@border@bottom
+ \hrule\@height\spx@boxes@border@bottom
+ \kern-\dp\spx@tempboxa
+ }% attention this box has zero depth due to \hrule at bottom
+ % step back to horizontal reference point
+ \kern-\wd\spx@tempboxa
+ % end of border drawing
+ % CONTENTS
+ % adjust the total depth to include the bottom shadow
+ \ifspx@boxes@withshadow
+ \ifdim\spx@boxes@shadow@yoffset>\z@
+ \dp\spx@tempboxa\dimexpr\dp\spx@tempboxa+\spx@boxes@shadow@yoffset\relax
+ \fi
+ \fi
+ \box\spx@tempboxa
+ % include lateral shadow in total width
+ \ifspx@boxes@withshadow
+ \ifspx@boxes@shadowinbbox
+ \ifdim\spx@boxes@shadow@xoffset>\z@\kern\spx@boxes@shadow@xoffset\fi
+ \fi
+ \fi
+ \egroup
+}
+
+% inset shadow
+%
+% The parameters signs are interpreted as in CSS styling.
+\def\spx@boxes@fcolorbox@insetshadow{%
+ % BACKGROUND
+ % draw background and move back to reference point
+ \ifspx@boxes@withbackgroundcolor
+ {\color{spx@boxes@backgroundcolor}%
+ \vrule\@height\ht\spx@tempboxa
+ \@depth\dp\spx@tempboxa
+ \@width\wd\spx@tempboxa
+ \kern-\wd\spx@tempboxa
+ }%
+ \fi
+ % BOX SHADOW
+ % draw shadow and move back to reference point
+ \ifspx@boxes@withshadow
+ \hbox{\vbox{\ifspx@boxes@withshadowcolor
+ \color{spx@boxes@shadowcolor}%
+ \else
+ % 6.2.0: guard against a manually inserted \color command in
+ % contents which could leak at a page break to the shadow
+ \normalcolor
+ \fi
+% NOTA BENE
+% We deliberately draw shadow partially under an area later covered by frame
+% with the idea to avoid anti-aliasing problems but in fact this may be a bad
+% idea with border is thin.
+% This may need some extra testing with PDF viewers... reports welcome!
+ \ifdim\spx@boxes@shadow@yoffset>\z@
+ \hrule\@height\dimexpr\spx@boxes@border@top+\spx@boxes@shadow@yoffset\relax
+ \kern-\spx@boxes@shadow@yoffset
+ \kern-\spx@boxes@border@top
+ \fi
+ \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa{%
+ \ifdim\spx@boxes@shadow@xoffset>\z@
+ \vrule\@width\dimexpr\spx@boxes@border@left+\spx@boxes@shadow@xoffset\relax\fi
+ \hss
+ \ifdim\spx@boxes@shadow@xoffset<\z@
+ \vrule\@width\dimexpr-\spx@boxes@shadow@xoffset+\spx@boxes@border@right\relax\fi
+ }%
+ \ht\spx@tempboxb\ht\spx@tempboxa
+ \dp\spx@tempboxb\dp\spx@tempboxa
+ \box\spx@tempboxb
+ \ifdim\spx@boxes@shadow@yoffset<\z@
+ \kern\spx@boxes@shadow@yoffset
+ \kern-\spx@boxes@border@bottom
+ \hrule\@height\dimexpr-\spx@boxes@shadow@yoffset+\spx@boxes@border@bottom\relax
+ \fi
+ \kern-\dp\spx@tempboxa
+ }% end of \vbox, attention it will have zero depth if yoffset<0
+ \kern-\wd\spx@tempboxa
+ }% end of \hbox, attention its depth is only |yoffset| if yoffset<0
+ \fi % end of inset shadow drawing, and we are back to horizontal reference point
+ % BOX BORDER
+ \vbox{\ifspx@boxes@withbordercolor
+ \color{spx@boxes@bordercolor}%
+ \else
+ % 6.2.0: guard against a \color command in contents whose effect
+ % could leak to border at a pagebreak
+ \normalcolor
+ \fi
+ \hrule\@height\spx@boxes@border@top
+ \kern-\spx@boxes@border@top
+ \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa
+ {\vrule\@width\spx@boxes@border@left
+ \hss\vrule\@width\spx@boxes@border@right
+ }%
+ \ht\spx@tempboxb\ht\spx@tempboxa
+ \dp\spx@tempboxb\dp\spx@tempboxa
+ \box\spx@tempboxb
+ \kern-\spx@boxes@border@bottom
+ \hrule\@height\spx@boxes@border@bottom
+ \kern-\dp\spx@tempboxa
+ }% attention this box has zero depth due to \hrule at bottom
+ % step back to horizontal reference point
+ \kern-\wd\spx@tempboxa
+ % end of border drawing
+ % CONTENTS
+ \box\spx@tempboxa
+ \egroup
+}
+
+% let's abort input if pict2e package could not be loaded.
+% To be extra safe we also alias @rounded to @rectangle but
+% a priori the architecture is done so that @rounded will never
+% be called in that case by other Sphinx LaTeX components.
+\@ifpackageloaded{pict2e}
+ {}
+ {\def\spx@boxes@fcolorbox@rounded{\spx@boxes@fcolorbox@rectangle}%
+ \endinput
+ }
+
+% we proceed now in the context of pict2e being available and loaded
+% (TeX being a macro-expansion based language it would have
+% swallowed all the coming definitions even if pict2e
+% had in fact not been loaded... but we aborted the input above)
+%%%%%%%%
+%//// \spx@boxes@fcolorbox@rounded
+%
+% Prior to 6.2.0, a constant border-width was applied as the border was
+% obtained as a \strokepath. This allowed 4 distinct radii but not to vary the
+% border widths. Now the border is drawn by two \fillpath operation, the first
+% one filling up to external border, the second one actually filling for the
+% background paradoxically on top of it, up to internal border path.
+%
+% This 6.2.0 abandonment of \strokepath allowed great simplification in
+% supporting opentop, openbottom and openboth situations, and it can
+% allow automatic support of openleft and openright analogs.
+%
+% And 6.2.0 also implements elliptical arcs thanks to ellipse package,
+% which extends pict2e.
+
+% Currently, inset shadow is not supported.
+%
+% Prior to 6.2.0 an inset shadow triggered the rectangle variant, so we never
+% ended here, but now it is simply ignored. This change does not appear to me
+% to be breaking, as it changes output only for conf.py's specifying both
+% rounded corners and an inset shadow and the documentation said it was
+% incompatible.
+
+% wrappers for pict2e usage if old
+% Better not to copy over 2020 pict2e definitions in case
+% something internal changes
+% However our wrappers will work ONLY with dimensional inputs
+% No need to pre-expand the arguments
+% Braces in case the expression uses parentheses
+\def\spx@moveto(#1,#2){\moveto({\strip@pt\dimexpr#1\relax},{\strip@pt\dimexpr#2\relax})}
+\def\spx@lineto(#1,#2){\lineto({\strip@pt\dimexpr#1\relax},{\strip@pt\dimexpr#2\relax})}
+% attention here the [N] becomes mandatory
+% \circlearc[<N>]{<X>}{<Y>}{<RAD>}{<ANGLE1>}{<ANGLE2>}
+\def\spx@circlearc[#1]#2#3#4%#5#6
+ {\circlearc[#1]{\strip@pt\dimexpr#2\relax}%
+ {\strip@pt\dimexpr#3\relax}%
+ {\strip@pt\dimexpr#4\relax}%
+ }
+% attention here too the [N] becomes mandatory
+% the core path macro of ellipse.sty. Thanks to Daan Leijen, author of this
+% package.
+% \elliparc [<initial>]{<center-x>}{<center-y>}{<x-rad>}{<y-rad>}{<start-angle>}{<end-angle>}
+% maybe this wrapper is unneeded but I don't have real time to check
+\def\spx@elliparc[#1]#2#3#4#5%#6#7
+ {\elliparc[#1]{\strip@pt\dimexpr#2\relax}%
+ {\strip@pt\dimexpr#3\relax}%
+ {\strip@pt\dimexpr#4\relax}%
+ {\strip@pt\dimexpr#5\relax}%
+ }
+
+% Macro whose execution prepares a path to be either stroked or filled
+% Only fill operation is used at 6.2.0. The radii are given by the set box
+% parameters, but the width and height are in \spx@width and \spx@height. A
+% \put command will be used for appropriate shifts.
+% 6.2.0 adds elliptical corners!
+% But I feel perhaps I need to think about how x-radius and y-radius should
+% interact with border-width. So consider output WIP for time being.
+\def\spx@boxes@border@defpath{%
+ \spx@moveto(\spx@boxes@radius@bottomleft@x,\z@)% our \spx@moveto is a bit rigid
+ % and we must use \z@ not 0 here
+ \spx@lineto(\spx@width-\spx@boxes@radius@bottomright@x,\z@)%
+ % x and y radii are either both positive or both zero
+ % probably not needed to actually guard against the latter case,
+ % let's do it nevertheless
+ \ifdim\spx@boxes@radius@bottomright@x>\z@
+ \ifdim\spx@boxes@radius@bottomright@x=\spx@boxes@radius@bottomright@y
+ \spx@circlearc[2]{\spx@width-\spx@boxes@radius@bottomright@x}%
+ {\spx@boxes@radius@bottomright@y}%
+ {\spx@boxes@radius@bottomright@x}{-90}{0}%
+ \else
+ \spx@elliparc[2]{\spx@width-\spx@boxes@radius@bottomright@x}%
+ {\spx@boxes@radius@bottomright@y}%
+ {\spx@boxes@radius@bottomright@x}
+ {\spx@boxes@radius@bottomright@y}{-90}{0}%
+ \fi
+ \fi
+ \spx@lineto(\spx@width,%
+ \spx@height-\spx@boxes@radius@topright@y)%
+ \ifdim\spx@boxes@radius@topright@x>\z@
+ \ifdim\spx@boxes@radius@topright@x=\spx@boxes@radius@topright@y
+ \spx@circlearc[2]{\spx@width-\spx@boxes@radius@topright@x}
+ {\spx@height-\spx@boxes@radius@topright@y}%
+ {\spx@boxes@radius@topright@x}{0}{90}%
+ \else
+ \spx@elliparc[2]{\spx@width-\spx@boxes@radius@topright@x}
+ {\spx@height-\spx@boxes@radius@topright@y}%
+ {\spx@boxes@radius@topright@x}%
+ {\spx@boxes@radius@topright@y}{0}{90}%
+ \fi
+ \fi
+ \spx@lineto(\spx@boxes@radius@topleft@x,\spx@height)%
+ \ifdim\spx@boxes@radius@topleft@x>\z@
+ \ifdim\spx@boxes@radius@topleft@x=\spx@boxes@radius@topleft@y
+ \spx@circlearc[2]{\spx@boxes@radius@topleft@x}%
+ {\spx@height-\spx@boxes@radius@topleft@y}%
+ {\spx@boxes@radius@topleft@x}{90}{180}%
+ \else
+ \spx@elliparc[2]{\spx@boxes@radius@topleft@x}%
+ {\spx@height-\spx@boxes@radius@topleft@y}%
+ {\spx@boxes@radius@topleft@x}%
+ {\spx@boxes@radius@topleft@y}{90}{180}%
+ \fi
+ \fi
+ \spx@lineto(\z@,\spx@boxes@radius@bottomleft@y)%
+ \ifdim\spx@boxes@radius@bottomleft@x>\z@
+ \ifdim\spx@boxes@radius@bottomleft@x=\spx@boxes@radius@bottomleft@y
+ \spx@circlearc[2]{\spx@boxes@radius@bottomleft@x}%
+ {\spx@boxes@radius@bottomleft@y}%
+ {\spx@boxes@radius@bottomleft@x}{180}{270}%
+ \else
+ \spx@elliparc[2]{\spx@boxes@radius@bottomleft@x}%
+ {\spx@boxes@radius@bottomleft@y}%
+ {\spx@boxes@radius@bottomleft@x}%
+ {\spx@boxes@radius@bottomleft@y}{180}{270}%
+ \fi
+ \fi
+}% end of definition of \spx@boxes@border@defpath
+
+% The customization of the various parameters must have been done via an
+% appropriate call to \spx@boxes@fcolorbox@setup, which will have set up
+% \spx@boxes@fcolorbox to expand to \spx@boxes@fcolorbox@rounded, and will
+% have set its various parameters.
+%
+\long\def\spx@boxes@fcolorbox@rounded #1{%
+ \hbox{%
+ \ifspx@boxes@withshadow
+ \ifspx@boxes@insetshadow
+ \spx@boxes@withshadowfalse % ignore inset shadow
+ \fi
+ \fi
+ % reserve space to external shadow if on left
+ \ifspx@boxes@withshadow
+ \ifspx@boxes@shadowinbbox
+ \ifdim\spx@boxes@shadow@xoffset<\z@\kern-\spx@boxes@shadow@xoffset\fi
+ \fi
+ \fi
+ \vbox{%
+ % adjust vertical bbox
+ \ifspx@boxes@withshadow
+ \ifdim\spx@boxes@shadow@yoffset<\z@
+ \kern-\spx@boxes@shadow@yoffset
+ \fi
+ \fi
+ \setlength{\unitlength}{1pt}%
+ \setbox\spx@tempboxa
+ \hbox{\kern\dimexpr\spx@boxes@border@left+\spx@boxes@padding@left\relax
+ {#1}%
+ \kern\dimexpr\spx@boxes@padding@right+\spx@boxes@border@right\relax}%
+ \ht\spx@tempboxa
+ \dimexpr\ht\spx@tempboxa+\spx@boxes@border@top+\spx@boxes@padding@top\relax
+ \dp\spx@tempboxa
+ \dimexpr\dp\spx@tempboxa+\spx@boxes@padding@bottom+\spx@boxes@border@bottom\relax
+ \edef\spx@width{\number\wd\spx@tempboxa sp}%
+ \edef\spx@height{\number\dimexpr\ht\spx@tempboxa+\dp\spx@tempboxa sp}%
+ \hbox{%
+ \begin{picture}%
+ % \strip@pt\dimexpr to work around "old" LaTeX picture limitation
+ % (we could use the "picture" package, this would add another dependency)
+ (\strip@pt\dimexpr\spx@width\relax,\strip@pt\dimexpr\spx@height\relax)%
+ \spx@boxes@border@defpath
+ \ifspx@boxes@withshadow
+ \ifspx@boxes@withshadowcolor
+ \color{spx@boxes@shadowcolor}%
+ \else
+ % 6.2.0: here and elsewhere guard against a manually inserted
+ % \color command in contents which could leak to the shadow
+ % to the shadow
+ \normalcolor
+ \fi
+ \put(\strip@pt\spx@boxes@shadow@xoffset,%
+ \strip@pt\dimexpr-\spx@boxes@shadow@yoffset\relax)
+ {\fillpath}%
+ \fi
+ \spx@boxes@border@defpath% must be redone after each \fillpath! (even if
+ % was in a \put)
+ \ifspx@boxes@withbordercolor
+ \color{spx@boxes@bordercolor}%
+ \else
+ \normalcolor
+ \fi
+ \fillpath
+ \ifspx@boxes@withbackgroundcolor
+ \color{spx@boxes@backgroundcolor}%
+ \else
+ \color{white}%
+ \fi
+ \edef\spx@width{\number\dimexpr\spx@width-\spx@boxes@border@left
+ -\spx@boxes@border@right sp}%
+ \edef\spx@height{\number\dimexpr\spx@height-\spx@boxes@border@top
+ -\spx@boxes@border@bottom sp}%
+ % redefine a path (in relative coordinates) matching the area delimited
+ % by the internal borders
+ \spx@boxes@border@defpath
+ % use \put to shift, and fill it with background color
+ \put(\strip@pt\spx@boxes@border@left,\strip@pt\spx@boxes@border@bottom)
+ {\fillpath}%
+ \end{picture}}% end of picture \hbox in \vbox
+ % back-up vertically for outputting the contents
+ \kern-\dimexpr\ht\spx@tempboxa+\dp\spx@tempboxa\relax
+ % adjust vertical bbox
+ \ifspx@boxes@withshadow
+ \ifdim\spx@boxes@shadow@yoffset>\z@
+ \dp\spx@tempboxa\dimexpr\dp\spx@tempboxa+\spx@boxes@shadow@yoffset\relax
+ \fi
+ \fi
+ % inhibit TeX's "line skip" adjustment when piling up hboxes in a vbox
+ \nointerlineskip
+ \box\spx@tempboxa
+ }% end of \vbox
+ % include lateral shadow in total width
+ \ifspx@boxes@withshadow
+ \ifspx@boxes@shadowinbbox
+ \ifdim\spx@boxes@shadow@xoffset>\z@\kern\spx@boxes@shadow@xoffset\fi
+ \fi
+ \fi
+ }% end of \hbox
+}%
+
+
+\endinput
diff --git a/sphinx/texinputs/sphinxpackagecyrillic.sty b/sphinx/texinputs/sphinxpackagecyrillic.sty
new file mode 100644
index 0000000..9aa62fc
--- /dev/null
+++ b/sphinx/texinputs/sphinxpackagecyrillic.sty
@@ -0,0 +1,55 @@
+%% CYRILLIC IN NON-CYRILLIC DOCUMENTS (pdflatex only)
+%
+% refs: https://tex.stackexchange.com/q/460271/
+\ProvidesPackage{sphinxpackagecyrillic}%
+ [2018/11/21 v2.0 support for Cyrillic in non-Cyrillic documents]
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{prefix=spx@cyropt@} % use \spx@cyropt@ prefix
+\DeclareBoolOption[false]{Xtwo}
+\DeclareBoolOption[false]{TtwoA}
+\DeclareDefaultOption{\@unknownoptionerror}
+\ProcessLocalKeyvalOptions* % ignore class options
+
+\ifspx@cyropt@Xtwo
+% original code by tex.sx user egreg (updated 2019/10/28):
+% https://tex.stackexchange.com/a/460325/
+% 159 Cyrillic glyphs as available in X2 TeX 8bit font encoding
+% This assumes inputenc loaded with utf8 option, or LaTeX release
+% as recent as 2018/04/01 which does it automatically.
+ \@tfor\next:=%
+ {Ð}{Ђ}{Є}{Ð…}{І}{Ј}{Љ}{Њ}{Ћ}{ÐŽ}{Ð}{Ð}{Б}{Ð’}{Г}{Д}{Е}{Ж}{З}{И}{Й}%
+ {К}{Л}{Ðœ}{Ð}{О}{П}{Р}{С}{Т}{У}{Ф}{Ð¥}{Ц}{Ч}{Ш}{Щ}{Ъ}{Ы}{Ь}{Э}{Ю}%
+ {Я}{а}{б}{в}{г}{д}{е}{ж}{з}{и}{й}{к}{л}{м}{н}{о}{п}{Ñ€}{Ñ}{Ñ‚}{у}%
+ {Ñ„}{Ñ…}{ц}{ч}{ш}{щ}{ÑŠ}{Ñ‹}{ÑŒ}{Ñ}{ÑŽ}{Ñ}{Ñ‘}{Ñ’}{Ñ”}{Ñ•}{Ñ–}{ј}{Ñ™}{Ñš}{Ñ›}%
+ {Ñž}{ÑŸ}{Ñ¢}{Ñ£}{Ѫ}{Ñ«}{Ñ´}{ѵ}{Ò}{Ò‘}{Ò’}{Ò“}{Ò”}{Ò•}{Ò–}{Ò—}{Ò˜}{Ò™}{Òš}{Ò›}{Òœ}{Ò}%
+ {Òž}{ÒŸ}{Ò }{Ò¡}{Ò¢}{Ò£}{Ò¤}{Ò¥}{Ò¦}{Ò§}{Ò¨}{Ò©}{Òª}{Ò«}{Ò¬}{Ò­}{Ò®}{Ò¯}{Ò°}{Ò±}{Ò²}{Ò³}%
+ {Ҵ}{ҵ}{Ҷ}{ҷ}{Ҹ}{ҹ}{Һ}{һ}{Ҽ}{ҽ}{Ҿ}{ҿ}{Ӏ}{Ӄ}{ӄ}{Ӆ}{ӆ}{Ӈ}{ӈ}{Ӌ}{ӌ}%
+ {Ó}{ÓŽ}{Ó”}{Ó•}{Ó˜}{Ó™}{Ó }{Ó¡}{Ó¨}{Ó©}\do
+ {%
+ \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}%
+ \protected@edef\@temp{\endgroup
+ \@ifl@t@r{\fmtversion}{2019/10/01}{\csname u8:\next\endcsname}{\next}}%
+ \@temp{X2}%
+ }%
+\else
+\ifspx@cyropt@TtwoA
+% original code by tex.sx user jfbu:
+% https://tex.stackexchange.com/a/460305/
+% 63*2+1=127 Cyrillic glyphs as found in T2A 8bit TeX font-encoding
+ \@tfor\@tempa:=%
+ {ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}%
+ {f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}%
+ {kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}%
+ {schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}%
+ {ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do
+ {%
+ \expandafter\DeclareTextSymbolDefault\expandafter
+ {\csname cyr\@tempa\endcsname}{T2A}%
+ \expandafter\uppercase\expandafter{\expandafter
+ \def\expandafter\@tempa\expandafter{\@tempa}}%
+ \expandafter\DeclareTextSymbolDefault\expandafter
+ {\csname CYR\@tempa\endcsname}{T2A}%
+ }%
+ \DeclareTextSymbolDefault{\CYRpalochka}{T2A}%
+\fi\fi
+\endinput
diff --git a/sphinx/texinputs/sphinxpackagefootnote.sty b/sphinx/texinputs/sphinxpackagefootnote.sty
new file mode 100644
index 0000000..5590123
--- /dev/null
+++ b/sphinx/texinputs/sphinxpackagefootnote.sty
@@ -0,0 +1,433 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{sphinxpackagefootnote}%
+ [2022/08/15 v5.3.0 Sphinx custom footnotehyper package (Sphinx team)]
+%%
+%% Package: sphinxpackagefootnote
+%% Version: based on footnotehyper.sty 2021/02/04 v1.1d
+%% https://www.ctan.org/pkg/footnotehyper
+%% License: the one applying to Sphinx
+%%
+% Provides support for footnote mark-up from Sphinx latex writer:
+% - "footnote" and "footnotetext" environments allowing verbatim material
+% - "savenotes" environment for wrapping environments, such as for tables
+% which have problems with LaTeX footnotes
+% - hyperlinks
+%
+% Sphinx uses exclusively this mark-up for footnotes:
+% - \begin{footnote}[N]
+% - \begin{footnotetext}[N]
+% - \sphinxfootnotemark[N]
+% where N is a number.
+%
+%% Some small differences from upstream footnotehyper.sty:
+%% - a tabulary compatibility layer (partial but enough for Sphinx),
+%% - usage of \spx@opt@BeforeFootnote
+%% - usage of \sphinxunactivateextrasandspace from sphinx.sty,
+%% - \sphinxlongtablepatch
+%%
+%% Starting with Sphinx v4.5.0, inherited footnotehyper macros for
+%% footnote/footnotetext receive some Sphinx specific extras to
+%% implement "intelligent" footnote marks checking page numbers.
+%%
+%% All footnotes output from Sphinx are hyperlinked. With "savenotes"
+%% footnotes may appear on page distinct from footnote mark, the latter
+%% will indicate page number of the footnote.
+\newif\iffootnotehyperparse\footnotehyperparsetrue
+\DeclareOption*{\PackageWarning{sphinxpackagefootnote}{Option `\CurrentOption' is unknown}}%
+\ProcessOptions\relax
+\newbox\FNH@notes
+\newtoks\FNH@toks % 1.1c
+\newdimen\FNH@width
+\let\FNH@colwidth\columnwidth
+\newif\ifFNH@savingnotes
+\AtBeginDocument {%
+ \let\FNH@latex@footnote \footnote
+ \let\FNH@latex@footnotetext\footnotetext
+ \let\FNH@H@@footnotetext \@footnotetext
+ \let\FNH@H@@mpfootnotetext \@mpfootnotetext
+ \newenvironment{savenotes}
+ {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}%
+ \let\spewnotes \FNH@spewnotes
+ \let\footnote \FNH@footnote
+ \let\footnotetext \FNH@footnotetext
+ \let\endfootnote \FNH@endfntext
+ \let\endfootnotetext\FNH@endfntext
+ % always True branch taken with Sphinx
+ \@ifpackageloaded{hyperref}
+ {\ifHy@hyperfootnotes
+ \let\FNH@H@@footnotetext\H@@footnotetext
+ \let\FNH@H@@mpfootnotetext\H@@mpfootnotetext
+ \else
+ \let\FNH@hyper@fntext\FNH@nohyp@fntext
+ \fi}%
+ {\let\FNH@hyper@fntext\FNH@nohyp@fntext}%
+}%
+\def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}%
+\def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}%
+\def\FNH@fntext #1{%
+ \ifx\ifmeasuring@\@undefined
+ \expandafter\@secondoftwo\else\expandafter\@firstofone\fi
+% these two lines modified for Sphinx (tabulary compatibility):
+ {\ifmeasuring@\expandafter\@gobbletwo\else\expandafter\@firstofone\fi}%
+ {\ifx\equation$\expandafter\@gobbletwo\fi #1}%$
+}%
+\long\def\FNH@hyper@fntext@i#1{%
+ \global\setbox\FNH@notes\vbox
+ {\unvbox\FNH@notes
+ \FNH@startnote
+ \@makefntext
+ {\rule\z@\footnotesep\ignorespaces
+ \ifHy@nesting\expandafter\ltx@firstoftwo
+ \else\expandafter\ltx@secondoftwo
+ \fi
+ {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}%
+ {\Hy@raisedlink
+ {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}%
+ {\relax}}%
+ \let\@currentHref\Hy@footnote@currentHref
+ \let\@currentlabelname\@empty
+ #1}%
+ \@finalstrut\strutbox
+ }%
+ \FNH@endnote
+ }%
+}%
+\long\def\FNH@nohyp@fntext@i#1{%
+ \global\setbox\FNH@notes\vbox
+ {\unvbox\FNH@notes
+ \FNH@startnote
+ \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \FNH@endnote
+ }%
+}%
+\def\FNH@startnote{%
+ \hsize\FNH@colwidth
+ \interlinepenalty\interfootnotelinepenalty
+ \reset@font\footnotesize
+ \floatingpenalty\@MM
+ \@parboxrestore
+ \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}%
+ \color@begingroup
+}%
+\def\FNH@endnote{\color@endgroup}%
+\def\FNH@savenotes{%
+ \begingroup
+ \ifFNH@savingnotes\else
+ \FNH@savingnotestrue
+ \let\@footnotetext \FNH@hyper@fntext
+ \let\@mpfootnotetext \FNH@hyper@fntext
+ \let\H@@mpfootnotetext\FNH@nohyp@fntext
+ \FNH@width\columnwidth
+ \let\FNH@colwidth\FNH@width
+ \global\setbox\FNH@notes\box\voidb@x
+ \let\FNH@thempfn\thempfn
+ \let\FNH@mpfn\@mpfn
+ \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi
+ \expandafter\def\expandafter\@minipagerestore\expandafter{%
+ \@minipagerestore
+ \let\thempfn\FNH@thempfn
+ \let\@mpfn\FNH@mpfn
+ }%
+ \fi
+}%
+\def\FNH@spewnotes {%
+ \if@endpe\ifx\par\@@par\FNH@toks{}\else
+ \FNH@toks\expandafter{\expandafter
+ \def\expandafter\par\expandafter{\par}\@endpetrue}%
+ \expandafter\expandafter\expandafter
+ \FNH@toks
+ \expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\FNH@toks
+ \expandafter\def\expandafter\@par\expandafter{\@par}}%
+ \expandafter\expandafter\expandafter
+ \FNH@toks
+ \expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\FNH@toks
+ \expandafter\everypar\expandafter{\the\everypar}}\fi
+ \else\FNH@toks{}\fi
+ \expandafter
+ \endgroup\the\FNH@toks
+ \ifFNH@savingnotes\else
+ \ifvoid\FNH@notes\else
+ \begingroup
+ \let\@makefntext\@empty
+ \let\@finalstrut\@gobble
+ \let\rule\@gobbletwo
+ \ifx\@footnotetext\@mpfootnotetext
+ \expandafter\FNH@H@@mpfootnotetext
+ \else
+ \expandafter\FNH@H@@footnotetext
+ \fi{\unvbox\FNH@notes}%
+ \endgroup
+ \fi
+ \fi
+}%
+\def\FNH@footnote@envname {footnote}%
+\def\FNH@footnotetext@envname{footnotetext}%
+\def\FNH@footnote{%
+% this line added for Sphinx:
+ \spx@opt@BeforeFootnote
+ \ifx\@currenvir\FNH@footnote@envname
+ \expandafter\FNH@footnoteenv
+ \else
+ \expandafter\FNH@latex@footnote
+ \fi
+}%
+\def\FNH@footnoteenv{%
+% this line added for Sphinx (footnotes in parsed literal blocks):
+ \catcode13=5 \sphinxunactivateextrasandspace
+ \@ifnextchar[%
+ \FNH@footnoteenv@i %]
+ {\stepcounter\@mpfn
+ \protected@xdef\@thefnmark{\thempfn}%
+ \@footnotemark
+ \def\FNH@endfntext@fntext{\@footnotetext}%
+ \FNH@startfntext}%
+}%
+\def\FNH@footnoteenv@i[#1]{%
+ \begingroup
+ % This legacy code from LaTeX core restricts #1 to be digits only
+ % This limitation could be lifted but legacy Sphinx anyhow obeys it
+ \csname c@\@mpfn\endcsname #1\relax
+ \unrestored@protected@xdef\@thefnmark{\thempfn}%
+ \endgroup
+% -- Sphinx specific:
+% currently commented out due to
+% https://github.com/sphinx-doc/sphinx/pull/10191#issuecomment-1038807448
+% Memo: memoir class detection of successive footnote marks (to separate them
+% by commas) is broken by \refstepcounter and also by \label, and some
+% mitigation such as in \sphinxfootref would be needed
+ % \global\let\spx@saved@thefnmark\@thefnmark
+ % % this is done to access robustly the page number where footnote mark is
+ % \refstepcounter{sphinxfootnotemark}\label{footnotemark.\thesphinxfootnotemark}%
+ % % if possible, compare page numbers of mark and footnote to define \@thefnmark
+ % \ltx@ifundefined{r@\thesphinxscope.footnote.#1}%
+ % {}% one more latex run is needed
+ % {\sphinx@xdef@thefnmark{#1}}% check of page numbers possible
+% --
+ \@footnotemark
+ \def\FNH@endfntext@fntext{\@footnotetext}%
+% -- Sphinx specific:
+ % we need to reset \@thefnmark as it is used by \FNH@startfntext via
+ % \FNH@startnote to set \@currentlabel which will be used by \label
+% currently commented out (see above)
+ % \global\let\@thefnmark\spx@saved@thefnmark
+% --
+ \FNH@startfntext
+% -- again Sphinx specific
+ % \@currentlabel as needed by \label got set by \FNH@startnote
+ % insert this at start of footnote text then the label will allow
+ % to robustly know on which page the footnote text ends up
+% currently only of use for extra footnote marks so in case footnote multiply referred
+ \phantomsection\label{\thesphinxscope.footnote.#1}%
+}%
+\def\FNH@footnotetext{%
+ \ifx\@currenvir\FNH@footnotetext@envname
+ \expandafter\FNH@footnotetextenv
+ \else
+ \expandafter\FNH@latex@footnotetext
+ \fi
+}%
+\def\FNH@footnotetextenv{%
+ \@ifnextchar[%
+ \FNH@footnotetextenv@i %]
+ {\protected@xdef\@thefnmark{\thempfn}%
+ \def\FNH@endfntext@fntext{\@footnotetext}%
+ \FNH@startfntext}%
+}%
+\def\FNH@footnotetextenv@i[#1]{%
+ \begingroup
+ \csname c@\@mpfn\endcsname #1\relax
+ \unrestored@protected@xdef\@thefnmark{\thempfn}%
+ \endgroup
+ \ifFNH@savingnotes
+ \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}%
+ \else
+ \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}%
+ \fi
+ \FNH@startfntext
+% -- Sphinx specific addition
+ \phantomsection\label{\thesphinxscope.footnote.#1}%
+}%
+\def\FNH@startfntext{%
+ \setbox\z@\vbox\bgroup
+ \FNH@startnote
+ \FNH@prefntext
+ \rule\z@\footnotesep\ignorespaces
+}%
+\def\FNH@endfntext {%
+ \@finalstrut\strutbox
+ \FNH@postfntext
+ \FNH@endnote
+ \egroup
+ \begingroup
+ \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo
+ \FNH@endfntext@fntext {\unvbox\z@}%
+ \endgroup
+}%
+\let\FNH@prefntext\@empty
+\let\FNH@postfntext\@empty
+\AtBeginDocument{\iffootnotehyperparse\expandafter\FNH@check\fi}%
+\def\FNH@safeif#1{%
+ \iftrue\csname if#1\endcsname\csname fi\endcsname\expandafter\@firstoftwo
+ \else\csname fi\endcsname\expandafter\@secondoftwo
+ \fi
+}%
+\def\FNH@check{%
+ \ifx\@makefntextFB\@undefined\expandafter\FNH@check@
+ \else\expandafter\FNH@frenchb@
+ \fi
+}%
+\def\FNH@frenchb@{%
+ \def\FNH@prefntext{%
+ \localleftbox{}%
+ \let\FBeverypar@save\FBeverypar@quote
+ \let\FBeverypar@quote\relax
+ \FNH@safeif{FB@koma}%
+ {\FNH@safeif{FBFrenchFootnotes}%
+ {\ifx\footnote\thanks
+ \let\@@makefnmark\@@makefnmarkTH
+ \@makefntextTH{} % space as in french.ldf
+ \else
+ \let\@@makefnmark\@@makefnmarkFB
+ \@makefntextFB{} % space as in french.ldf
+ \fi
+ }{\let\@@makefnmark\@@makefnmarkORI
+ \@makefntextORI{}% no space as in french.ldf
+ }%
+ }%
+ {\FNH@safeif{FBFrenchFootnotes}%
+ {\@makefntextFB{}}%
+ {\@makefntextORI{}}%
+ }%
+ }%
+ \def\FNH@postfntext{%
+ \let\FBeverypar@quote\FBeverypar@save
+ \localleftbox{\FBeveryline@quote}%
+ }%
+}%
+\def\FNH@check@{%
+ \expandafter\FNH@check@a\@makefntext{1.2!3?4,}%
+ \FNH@@@1.2!3?4,\FNH@@@\relax
+}%
+\long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{%
+ \ifx\relax#3\expandafter\FNH@checkagain@
+ \else
+ \def\FNH@prefntext{#1}\def\FNH@postfntext{#2}%
+ \expandafter\FNH@check@b
+ \fi
+}%
+\def\FNH@checkagain@{%
+ \expandafter\FNH@checkagain@a
+ \detokenize\expandafter{\@makefntext{1.2!3?4,}}\relax\FNH@@@
+}%
+\edef\FNH@temp{\noexpand\FNH@checkagain@a ##1\string{1.2!3?4,\string}}%
+\expandafter\def\FNH@temp#2#3\FNH@@@{%
+ \ifx\relax#2%
+ \def\FNH@prefntext{\@makefntext{}}%
+ \else\FNH@bad@makefntext@alert
+ \fi
+}%
+\def\FNH@check@b #1\relax{%
+ \expandafter\expandafter\expandafter\FNH@check@c
+ \expandafter\meaning\expandafter\FNH@prefntext
+ \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax
+}%
+\def\FNH@check@c #11.2!3?4,#2#3\relax{%
+ \ifx\FNH@check@c#2\else\FNH@bad@makefntext@alert\fi
+}%
+% slight reformulation for Sphinx
+\def\FNH@bad@makefntext@alert{%
+ \sphinxbuildwarning{badfootnotes}%
+ \PackageWarningNoLine{sphinxpackagefootnote}%
+ {Footnotes will be sub-optimal, sorry. This is due to the document class or^^J
+ some package modifying macro \string\@makefntext.^^J
+ You can try to report this incompatibility at^^J
+ https://github.com/sphinx-doc/sphinx with this info:}%
+ \typeout{\meaning\@makefntext}%
+ \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty
+}%
+% this macro from original footnote.sty is not used anymore by Sphinx
+% but for simplicity sake let's just keep it as is
+\def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%]
+\def\FNH@msne@i #1{%
+ \expandafter\let\csname FNH$#1\expandafter\endcsname %$
+ \csname #1\endcsname
+ \expandafter\let\csname endFNH$#1\expandafter\endcsname %$
+ \csname end#1\endcsname
+ \FNH@msne@ii[#1]{FNH$#1}%$
+}%
+\def\FNH@msne@ii[#1]#2{%
+ \expandafter\edef\csname#1\endcsname{%
+ \noexpand\savenotes
+ \expandafter\noexpand\csname#2\endcsname
+ }%
+ \expandafter\edef\csname end#1\endcsname{%
+ \expandafter\noexpand\csname end#2\endcsname
+ \noexpand\expandafter
+ \noexpand\spewnotes
+ \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi
+ }%
+}%
+%
+% some extras for Sphinx :
+% \sphinxfootnotemark:
+% - if in section titles will auto-remove itself from TOC
+\def\sphinxfootnotemark [#1]%
+ {\ifx\thepage\relax\else\sphinxfootref{#1}\fi}%
+\newcounter{sphinxfootnotemark}
+\renewcommand\thesphinxfootnotemark{\number\value{sphinxfootnotemark}}
+% - compares page number of footnote mark versus the one of footnote text
+\def\sphinx@xdef@thefnmark#1{%
+ \expandafter\expandafter\expandafter\sphinx@footref@get
+ \csname r@\thesphinxscope.footnote.#1\endcsname\relax
+ \expandafter\expandafter\expandafter\sphinx@footmark@getpage
+ \csname r@footnotemark.\thesphinxfootnotemark\endcsname\thepage\relax
+ \protected@xdef\@thefnmark{%
+ \ifx\spx@footmarkpage\spx@footrefpage
+ \spx@footreflabel
+ \else
+ % the macro \sphinxthefootnotemark is in sphinx.sty
+ \sphinxthefootnotemark{\spx@footreflabel}{\spx@footrefpage}%
+ \fi
+ }%
+}%
+\def\sphinx@footref@get #1#2#3#4#5\relax{%
+ \def\spx@footreflabel{#1}%
+ \def\spx@footrefpage {#2}%
+ \def\spx@footrefHref {#4}%
+}%
+\def\sphinx@footmark@getpage #1#2#3\relax{%
+ \edef\spx@footmarkpage{#2}%
+}%
+\protected\def\sphinxfootref#1{% #1 always is explicit number in Sphinx
+ \spx@opt@BeforeFootnote
+ % each of \refstepcounter and \label interferes with memoir class detection
+ % of successive footnote marks, so we move them to inside \@makefnmark
+ \let\spx@saved@makefnmark\@makefnmark
+ \ltx@ifundefined{r@\thesphinxscope.footnote.#1}%
+ {\gdef\@thefnmark{?}% on first LaTeX run
+ \refstepcounter{sphinxfootnotemark}\label{footnotemark.\thesphinxfootnotemark}%
+ }%
+ {\sphinx@xdef@thefnmark{#1}% also defines \spx@footrefHref
+ \def\@makefnmark{% will be used by \H@@footnotemark
+ \refstepcounter{sphinxfootnotemark}\label{footnotemark.\thesphinxfootnotemark}%
+ \hyper@linkstart{link}{\spx@footrefHref}%
+ \spx@saved@makefnmark
+ \hyper@linkend
+ }%
+ }%
+ \H@@footnotemark
+ \let\@makefnmark\spx@saved@makefnmark
+}%
+\AtBeginDocument{%
+ % let hyperref less complain
+ \pdfstringdefDisableCommands{\def\sphinxfootnotemark [#1]{}}%
+ % to obtain hyperlinked footnotes in longtable environment we must replace
+ % hyperref's patch of longtable's patch of \@footnotetext by our own
+ \let\LT@p@ftntext\FNH@hyper@fntext
+ % this *requires* longtable to be used always wrapped in savenotes environment
+}%
+\endinput
+%%
+%% End of file `sphinxpackagefootnote.sty'.
diff --git a/sphinx/texinputs_win/Makefile_t b/sphinx/texinputs_win/Makefile_t
new file mode 100644
index 0000000..4131762
--- /dev/null
+++ b/sphinx/texinputs_win/Makefile_t
@@ -0,0 +1,86 @@
+# Makefile for Sphinx LaTeX output
+
+ALLDOCS = $(basename $(wildcard *.tex))
+ALLPDF = $(addsuffix .pdf,$(ALLDOCS))
+ALLDVI = $(addsuffix .dvi,$(ALLDOCS))
+ALLPS = $(addsuffix .ps,$(ALLDOCS))
+
+# Prefix for archive names
+ARCHIVEPREFIX =
+# Additional LaTeX options
+LATEXOPTS =
+# format: pdf or dvi
+FMT = pdf
+
+LATEX = latex
+PDFLATEX = {{ latex_engine }}
+MAKEINDEX = makeindex
+
+{% if latex_engine in ('platex', 'uplatex') -%}
+all: all-pdf-ja
+all-pdf: all-pdf-ja
+{% else %}
+all: $(ALLPDF)
+all-pdf: $(ALLPDF)
+{% endif -%}
+all-dvi: $(ALLDVI)
+all-ps: $(ALLPS)
+
+all-pdf-ja:
+ for f in *.pdf *.png *.gif *.jpg *.jpeg; do extractbb $$f; done
+ for f in *.tex; do {{ latex_engine }} -kanji=utf8 $(LATEXOPTS) $$f; done
+ for f in *.tex; do {{ latex_engine }} -kanji=utf8 $(LATEXOPTS) $$f; done
+ for f in *.tex; do {{ latex_engine }} -kanji=utf8 $(LATEXOPTS) $$f; done
+ -for f in *.idx; do mendex -U -f -d "`basename $$f .idx`.dic" -s python.ist $$f; done
+ for f in *.tex; do {{ latex_engine }} -kanji=utf8 $(LATEXOPTS) $$f; done
+ for f in *.tex; do {{ latex_engine }} -kanji=utf8 $(LATEXOPTS) $$f; done
+ for f in *.dvi; do dvipdfmx $$f; done
+
+zip: all-$(FMT)
+ mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+ cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+ zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT)
+ rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+tar: all-$(FMT)
+ mkdir $(ARCHIVEPREFIX)docs-$(FMT)
+ cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT)
+ tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT)
+ rm -r $(ARCHIVEPREFIX)docs-$(FMT)
+
+gz: tar
+ gzip -9 < $(ARCHIVEPREFIX)docs-$(FMT).tar > $(ARCHIVEPREFIX)docs-$(FMT).tar.gz
+
+bz2: tar
+ bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+xz: tar
+ xz -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar
+
+# The number of LaTeX runs is quite conservative, but I don't expect it
+# to get run often, so the little extra time won't hurt.
+%.dvi: %.tex
+ $(LATEX) $(LATEXOPTS) '$<'
+ $(LATEX) $(LATEXOPTS) '$<'
+ $(LATEX) $(LATEXOPTS) '$<'
+ -$(MAKEINDEX) -s python.ist '$(basename $<).idx'
+ $(LATEX) $(LATEXOPTS) '$<'
+ $(LATEX) $(LATEXOPTS) '$<'
+
+%.pdf: %.tex
+ $(PDFLATEX) $(LATEXOPTS) '$<'
+ $(PDFLATEX) $(LATEXOPTS) '$<'
+ $(PDFLATEX) $(LATEXOPTS) '$<'
+ -$(MAKEINDEX) -s python.ist '$(basename $<).idx'
+ $(PDFLATEX) $(LATEXOPTS) '$<'
+ $(PDFLATEX) $(LATEXOPTS) '$<'
+
+%.ps: %.dvi
+ dvips '$<'
+
+clean:
+ rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI)
+
+.PHONY: all all-pdf all-dvi all-ps clean zip tar gz bz2 xz
+.PHONY: all-pdf-ja
+
diff --git a/sphinx/themes/agogo/layout.html b/sphinx/themes/agogo/layout.html
new file mode 100644
index 0000000..75c21c2
--- /dev/null
+++ b/sphinx/themes/agogo/layout.html
@@ -0,0 +1,104 @@
+{#
+ agogo/layout.html
+ ~~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the agogo theme, originally written
+ by Andi Albrecht.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "basic/layout.html" %}
+
+{% block header %}
+ <div class="header-wrapper" role="banner">
+ <div class="header">
+ {%- if logo_url %}
+ <p class="logo"><a href="{{ pathto(root_doc)|e }}">
+ <img class="logo" src="{{ logo_url|e }}" alt="Logo"/>
+ </a></p>
+ {%- endif %}
+ {%- block headertitle %}
+ <div class="headertitle"><a
+ href="{{ pathto(root_doc)|e }}">{{ shorttitle|e }}</a></div>
+ {%- endblock %}
+ <div class="rel" role="navigation" aria-label="related navigation">
+ {%- for rellink in rellinks|reverse %}
+ <a href="{{ pathto(rellink[0])|e }}" title="{{ rellink[1]|striptags|e }}"
+ {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
+ {%- if not loop.last %}{{ reldelim2 }}{% endif %}
+ {%- endfor %}
+ </div>
+ </div>
+ </div>
+{% endblock %}
+
+{%- macro agogo_sidebar() %}
+ {%- block sidebartoc %}
+ <h3>{{ _('Table of Contents') }}</h3>
+ {{ toctree(includehidden=True) }}
+ {%- endblock %}
+ {%- block sidebarsearch %}
+ <div role="search">
+ <h3 style="margin-top: 1.5em;">{{ _('Search') }}</h3>
+ <form class="search" action="{{ pathto('search') }}" method="get">
+ <input type="text" name="q" />
+ <input type="submit" value="{{ _('Go') }}" />
+ </form>
+ </div>
+ {%- endblock %}
+{% endmacro %}
+
+{% block content %}
+ <div class="content-wrapper">
+ <div class="content">
+ {%- if not theme_rightsidebar|tobool %}
+ <div class="sidebar">
+ {{ agogo_sidebar() }}
+ </div>
+ {%- endif %}
+ <div class="document">
+ {%- block document %}
+ {{ super() }}
+ {%- endblock %}
+ </div>
+ {%- if theme_rightsidebar|tobool %}
+ <div class="sidebar">
+ {{ agogo_sidebar() }}
+ </div>
+ {%- endif %}
+ <div class="clearer"></div>
+ </div>
+ </div>
+{% endblock %}
+
+{% block footer %}
+ <div class="footer-wrapper">
+ <div class="footer">
+ <div class="left">
+ <div role="navigation" aria-label="related navigaton">
+ {%- for rellink in rellinks|reverse %}
+ <a href="{{ pathto(rellink[0])|e }}" title="{{ rellink[1]|striptags|e }}"
+ {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
+ {%- if not loop.last %}{{ reldelim2 }}{% endif %}
+ {%- endfor %}
+ </div>
+ <div role="note" aria-label="source link">
+ {%- if show_source and has_source and sourcename %}
+ <br/>
+ <a href="{{ pathto('_sources/' + sourcename, true)|e }}"
+ rel="nofollow">{{ _('Show Source') }}</a>
+ {%- endif %}
+ </div>
+ </div>
+
+ <div class="right">
+ {{ super() }}
+ </div>
+ <div class="clearer"></div>
+ </div>
+ </div>
+{% endblock %}
+
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}{% endblock %}
diff --git a/sphinx/themes/agogo/static/agogo.css_t b/sphinx/themes/agogo/static/agogo.css_t
new file mode 100644
index 0000000..e885d8c
--- /dev/null
+++ b/sphinx/themes/agogo/static/agogo.css_t
@@ -0,0 +1,563 @@
+/*
+ * agogo.css_t
+ * ~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- agogo theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+* {
+ margin: 0px;
+ padding: 0px;
+}
+
+body {
+ font-family: {{ theme_bodyfont }};
+ line-height: 1.4em;
+ color: black;
+ background-color: {{ theme_bgcolor }};
+
+ /* fix for background colors breaking at horizontal
+ scrolling on smaller devices */
+ min-width: fit-content;
+}
+
+
+/* Page layout */
+
+div.header, div.content, div.footer {
+ width: {{ theme_pagewidth }};
+ margin-left: auto;
+ margin-right: auto;
+}
+
+div.header-wrapper {
+ background: {{ theme_headerbg }};
+ border-bottom: 3px solid #2e3436;
+}
+
+
+/* Default body styles */
+a {
+ color: {{ theme_linkcolor }};
+}
+
+a:visited {
+ color: #551a8b;
+}
+
+div.bodywrapper a, div.footer a {
+ text-decoration: underline;
+}
+
+.clearer {
+ clear: both;
+}
+
+.left {
+ float: left;
+}
+
+.right {
+ float: right;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+h1, h2, h3, h4 {
+ font-family: {{ theme_headerfont }};
+ font-weight: normal;
+ color: {{ theme_headercolor2 }};
+ margin-bottom: .8em;
+}
+
+h1 {
+ color: {{ theme_headercolor1 }};
+}
+
+h2 {
+ padding-bottom: .5em;
+ border-bottom: 1px solid {{ theme_headercolor2 }};
+}
+
+a.headerlink {
+ visibility: hidden;
+ color: #dddddd;
+ padding-left: .3em;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+img {
+ border: 0;
+}
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 2px 7px 1px 7px;
+ border-left: 0.2em solid black;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+dt:target, .highlighted {
+ background-color: #fbe54e;
+}
+
+/* Header */
+
+div.header {
+ padding: 1em;
+}
+
+div.header .headertitle {
+ font-family: {{ theme_headerfont }};
+ font-weight: normal;
+ font-size: 180%;
+ letter-spacing: .08em;
+ margin-bottom: .8em;
+}
+
+div.header .headertitle a {
+ color: white;
+}
+
+div.header div.rel {
+ margin-top: 1em;
+}
+
+div.header div.rel a {
+ color: {{ theme_headerlinkcolor }};
+ letter-spacing: .1em;
+ text-transform: uppercase;
+}
+
+p.logo {
+ float: right;
+}
+
+img.logo {
+ border: 0;
+}
+
+
+/* Content */
+div.content-wrapper {
+ background-color: white;
+ padding: 1em;
+}
+
+div.document {
+ width: {{ theme_documentwidth }};
+ float: left;
+}
+
+div.body {
+ {%- if theme_rightsidebar|tobool %}
+ padding-right: 2em;
+ {%- else %}
+ padding-left: 2em;
+ {% endif %}
+ text-align: {{ theme_textalign }};
+}
+
+div.document h1 {
+ line-height: 120%;
+}
+
+div.document ul {
+ margin: 1.5em;
+ list-style-type: square;
+}
+
+div.document dd {
+ margin-left: 1.2em;
+ margin-top: .4em;
+ margin-bottom: 1em;
+}
+
+div.document .section {
+ margin-top: 1.7em;
+}
+div.document .section:first-child {
+ margin-top: 0px;
+}
+
+div.document div.highlight {
+ padding: 3px;
+ border-top: 2px solid #dddddd;
+ border-bottom: 2px solid #dddddd;
+ margin-top: .8em;
+ margin-bottom: .8em;
+}
+
+div.document div.literal-block-wrapper {
+ margin-top: .8em;
+ margin-bottom: .8em;
+}
+
+div.document div.literal-block-wrapper div.highlight {
+ margin: 0;
+}
+
+div.document div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.document div.code-block-caption span.caption-text {
+}
+
+div.document h2 {
+ margin-top: .7em;
+}
+
+div.document p {
+ margin-bottom: .5em;
+}
+
+div.document li.toctree-l1 {
+ margin-bottom: 1em;
+}
+
+div.document .descname {
+ font-weight: bold;
+}
+
+div.document .sig-paren {
+ font-size: larger;
+}
+
+div.document .docutils.literal {
+ background-color: #eeeeec;
+ padding: 1px;
+}
+
+div.document .docutils.xref.literal {
+ background-color: transparent;
+ padding: 0px;
+}
+
+div.document blockquote {
+ margin: 1em;
+}
+
+div.document ol {
+ margin: 1.5em;
+}
+
+
+/* Sidebar */
+
+div.sidebar,
+aside.sidebar {
+ width: {{ theme_sidebarwidth|todim }};
+ {%- if theme_rightsidebar|tobool %}
+ float: right;
+ {%- else %}
+ float: left;
+ {%- endif %}
+ font-size: .9em;
+}
+
+div.sidebar a, aside.sidebar a, div.header a {
+ text-decoration: none;
+}
+
+div.sidebar a:hover, aside.sidebar a:hover, div.header a:hover {
+ text-decoration: underline;
+}
+
+div.sidebar h3,
+aside.sidebar h3 {
+ color: #2e3436;
+ text-transform: uppercase;
+ font-size: 130%;
+ letter-spacing: .1em;
+}
+
+div.sidebar ul,
+aside.sidebar ul {
+ list-style-type: none;
+}
+
+div.sidebar li.toctree-l1 a,
+aside.sidebar li.toctree-l1 a {
+ display: block;
+ padding: 1px;
+ border: 1px solid #dddddd;
+ background-color: #eeeeec;
+ margin-bottom: .4em;
+ padding-left: 3px;
+ color: #2e3436;
+}
+
+div.sidebar li.toctree-l2 a,
+aside.sidebar li.toctree-l2 a {
+ background-color: transparent;
+ border: none;
+ margin-left: 1em;
+ border-bottom: 1px solid #dddddd;
+}
+
+div.sidebar li.toctree-l3 a,
+aside.sidebar li.toctree-l3 a {
+ background-color: transparent;
+ border: none;
+ margin-left: 2em;
+ border-bottom: 1px solid #dddddd;
+}
+
+div.sidebar li.toctree-l2:last-child a,
+aside.sidebar li.toctree-l2:last-child a {
+ border-bottom: none;
+}
+
+div.sidebar li.toctree-l1.current a,
+aside.sidebar li.toctree-l1.current a {
+ border-right: 5px solid {{ theme_headerlinkcolor }};
+}
+
+div.sidebar li.toctree-l1.current li.toctree-l2 a,
+aside.sidebar li.toctree-l1.current li.toctree-l2 a {
+ border-right: none;
+}
+
+div.sidebar input[type="text"],
+aside.sidebar input[type="text"] {
+ width: 170px;
+}
+
+div.sidebar input[type="submit"],
+aside.sidebar input[type="submit"] {
+ width: 30px;
+}
+
+
+/* Footer */
+
+div.footer-wrapper {
+ background: {{ theme_footerbg }};
+ border-top: 4px solid #babdb6;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ min-height: 80px;
+}
+
+div.footer, div.footer a {
+ color: #888a85;
+}
+
+div.footer .right {
+ text-align: right;
+}
+
+div.footer .left {
+ text-transform: uppercase;
+}
+
+
+/* Styles copied from basic theme */
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- viewcode extension ---------------------------------------------------- */
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family:: {{ theme_bodyfont }};
+}
+
+div.viewcode-block:target {
+ margin: -1px -3px;
+ padding: 0 3px;
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
+
+div.code-block-caption {
+ background-color: #ddd;
+ color: #333;
+ padding: 2px 5px;
+ font-size: small;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
diff --git a/sphinx/themes/agogo/static/bgfooter.png b/sphinx/themes/agogo/static/bgfooter.png
new file mode 100644
index 0000000..b7c7cad
--- /dev/null
+++ b/sphinx/themes/agogo/static/bgfooter.png
Binary files differ
diff --git a/sphinx/themes/agogo/static/bgtop.png b/sphinx/themes/agogo/static/bgtop.png
new file mode 100644
index 0000000..0574088
--- /dev/null
+++ b/sphinx/themes/agogo/static/bgtop.png
Binary files differ
diff --git a/sphinx/themes/agogo/theme.conf b/sphinx/themes/agogo/theme.conf
new file mode 100644
index 0000000..6a4457e
--- /dev/null
+++ b/sphinx/themes/agogo/theme.conf
@@ -0,0 +1,20 @@
+[theme]
+inherit = basic
+stylesheet = agogo.css
+pygments_style = tango
+
+[options]
+bodyfont = "Verdana", Arial, sans-serif
+headerfont = "Georgia", "Times New Roman", serif
+pagewidth = 70em
+documentwidth = 50em
+rightsidebar = true
+sidebarwidth = 20em
+bgcolor = #eeeeec
+headerbg = #555573 url(bgtop.png) top left repeat-x
+footerbg = url(bgfooter.png) top left repeat-x
+linkcolor = #ce5c00
+headercolor1 = #204a87
+headercolor2 = #3465a4
+headerlinkcolor = #fcaf3e
+textalign = justify
diff --git a/sphinx/themes/basic/changes/frameset.html b/sphinx/themes/basic/changes/frameset.html
new file mode 100644
index 0000000..2331ec1
--- /dev/null
+++ b/sphinx/themes/basic/changes/frameset.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
+ "http://www.w3.org/TR/html4/frameset.dtd">
+<html{% if language is not none %} lang="{{ language }}"{% endif %}>
+ <head>
+ <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &#8212; {{ docstitle }}{% endtrans %}</title>
+ </head>
+ <frameset cols="45%,*">
+ <frame name="main" src="changes.html">
+ <frame name="src" src="about:blank">
+ </frameset>
+</html>
diff --git a/sphinx/themes/basic/changes/rstsource.html b/sphinx/themes/basic/changes/rstsource.html
new file mode 100644
index 0000000..c93a28d
--- /dev/null
+++ b/sphinx/themes/basic/changes/rstsource.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html{% if language is not none %} lang="{{ language }}"{% endif %}>
+ <head>
+ <title>{% trans filename=filename, docstitle=docstitle|e %}{{ filename }} &#8212; {{ docstitle }}{% endtrans %}</title>
+ <style type="text/css">
+ .hl { background-color: yellow }
+ </style>
+ </head>
+ <body style="font-size: 90%">
+ <pre>
+ {{ text }}
+ </pre>
+ </body>
+</html>
diff --git a/sphinx/themes/basic/changes/versionchanges.html b/sphinx/themes/basic/changes/versionchanges.html
new file mode 100644
index 0000000..c42cef4
--- /dev/null
+++ b/sphinx/themes/basic/changes/versionchanges.html
@@ -0,0 +1,33 @@
+{% macro entries(changes) %}
+<ul>{% for entry, docname, lineno in changes %}
+<li><a href="rst/{{ docname }}.html#L{{ lineno-10 }}" target="src">{{ entry }}</a></li>
+{% endfor %}</ul>
+{% endmacro -%}
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html{% if language is not none %} lang="{{ language }}"{% endif %}>
+ <head>
+ <link rel="stylesheet" href="default.css">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <title>{% trans version=version|e, docstitle=docstitle|e %}Changes in Version {{ version }} &#8212; {{ docstitle }}{% endtrans %}</title>
+ </head>
+ <body>
+ <div class="document">
+ <div class="body">
+ <h1>{% trans version=version|e %}Automatically generated list of changes in version {{ version }}{% endtrans %}</h1>
+ <h2>{{ _('Library changes') }}</h2>
+ {% for modname, changes in libchanges %}
+ <h4>{{ modname }}</h4>
+ {{ entries(changes) }}
+ {% endfor %}
+ <h2>{{ _('C API changes') }}</h2>
+ {{ entries(apichanges) }}
+ <h2>{{ _('Other changes') }}</h2>
+ {% for (fn, title), changes in otherchanges %}
+ <h4>{{ title }} <span style="font-size: 50%">({{ fn }})</span></h4>
+ {{ entries(changes) }}
+ {% endfor %}
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/sphinx/themes/basic/defindex.html b/sphinx/themes/basic/defindex.html
new file mode 100644
index 0000000..6fcdb9c
--- /dev/null
+++ b/sphinx/themes/basic/defindex.html
@@ -0,0 +1,35 @@
+{#
+ basic/defindex.html
+ ~~~~~~~~~~~~~~~~~~~
+
+ Default template for the "index" page.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}{{ warn('Now base template defindex.html is deprecated.') }}
+{%- extends "layout.html" %}
+{% set title = _('Overview') %}
+{% block body %}
+ <h1>{{ docstitle|e }}</h1>
+ <p>
+ {{ _('Welcome! This is') }}
+ {% block description %}{{ _('the documentation for') }} {{ project|e }}
+ {{ release|e }}{% if last_updated %}, {{ _('last updated') }} {{ last_updated|e }}{% endif %}{% endblock %}.
+ </p>
+ {% block tables %}
+ <p><strong>{{ _('Indices and tables:') }}</strong></p>
+ <table class="contentstable"><tr>
+ <td style="width: 50%">
+ <p class="biglink"><a class="biglink" href="{{ pathto("contents") }}">{{ _('Complete Table of Contents') }}</a><br>
+ <span class="linkdescr">{{ _('lists all sections and subsections') }}</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("search") }}">{{ _('Search Page') }}</a><br>
+ <span class="linkdescr">{{ _('search this documentation') }}</span></p>
+ </td><td style="width: 50%">
+ <p class="biglink"><a class="biglink" href="{{ pathto("modindex") }}">{{ _('Global Module Index') }}</a><br>
+ <span class="linkdescr">{{ _('quick access to all modules') }}</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("genindex") }}">{{ _('General Index') }}</a><br>
+ <span class="linkdescr">{{ _('all functions, classes, terms') }}</span></p>
+ </td></tr>
+ </table>
+ {% endblock %}
+{% endblock %}
diff --git a/sphinx/themes/basic/domainindex.html b/sphinx/themes/basic/domainindex.html
new file mode 100644
index 0000000..c5b0dad
--- /dev/null
+++ b/sphinx/themes/basic/domainindex.html
@@ -0,0 +1,56 @@
+{#
+ basic/domainindex.html
+ ~~~~~~~~~~~~~~~~~~~~~~
+
+ Template for domain indices (module index, ...).
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "layout.html" %}
+{% set title = indextitle %}
+{% block extrahead %}
+{{ super() }}
+{% if not embedded and collapse_index %}
+ <script>
+ DOCUMENTATION_OPTIONS.COLLAPSE_INDEX = true;
+ </script>
+{% endif %}
+{% endblock %}
+{% block body %}
+
+ {%- set groupid = idgen() %}
+
+ <h1>{{ indextitle }}</h1>
+
+ <div class="modindex-jumpbox">
+ {%- for (letter, entries) in content %}
+ <a href="#cap-{{ letter }}"><strong>{{ letter }}</strong></a>
+ {%- if not loop.last %} | {% endif %}
+ {%- endfor %}
+ </div>
+
+ <table class="indextable modindextable">
+ {%- for letter, entries in content %}
+ <tr class="pcap"><td></td><td>&#160;</td><td></td></tr>
+ <tr class="cap" id="cap-{{ letter }}"><td></td><td>
+ <strong>{{ letter }}</strong></td><td></td></tr>
+ {%- for (name, grouptype, page, anchor, extra, qualifier, description)
+ in entries %}
+ <tr{% if grouptype == 2 %} class="cg-{{ groupid.current() }}"{% endif %}>
+ <td>{% if grouptype == 1 -%}
+ <img src="{{ pathto('_static/minus.png', 1) }}" class="toggler"
+ id="toggle-{{ groupid.next() }}" style="display: none" alt="-" />
+ {%- endif %}</td>
+ <td>{% if grouptype == 2 %}&#160;&#160;&#160;{% endif %}
+ {% if page %}<a href="{{ pathto(page)|e }}#{{ anchor }}">{% endif -%}
+ <code class="xref">{{ name|e }}</code>
+ {%- if page %}</a>{% endif %}
+ {%- if extra %} <em>({{ extra|e }})</em>{% endif -%}
+ </td><td>{% if qualifier %}<strong>{{ qualifier|e }}:</strong>{% endif %}
+ <em>{{ description|e }}</em></td></tr>
+ {%- endfor %}
+ {%- endfor %}
+ </table>
+
+{% endblock %}
diff --git a/sphinx/themes/basic/genindex-single.html b/sphinx/themes/basic/genindex-single.html
new file mode 100644
index 0000000..dd1d1f0
--- /dev/null
+++ b/sphinx/themes/basic/genindex-single.html
@@ -0,0 +1,63 @@
+{#
+ basic/genindex-single.html
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Template for a "single" page of a split index.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{% macro indexentries(firstname, links) %}
+ {%- 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 %}
+{% endmacro %}
+
+{%- extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+<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%; vertical-align: top;"><ul>
+ {%- for entryname, (links, subitems, _) in column %}
+ <li>{{ indexentries(entryname, links) }}
+ {%- if subitems %}
+ <ul>
+ {%- for subentryname, subentrylinks in subitems %}
+ <li>{{ indexentries(subentryname, subentrylinks) }}</li>
+ {%- endfor %}
+ </ul>
+ {%- endif -%}</li>
+ {%- endfor %}
+ </ul></td>
+ {%- endfor %}
+</tr></table>
+
+{% endblock %}
+
+{% block sidebarrel %}
+ <h4>{{ _('Index') }}</h4>
+ <p>{% for key, dummy in genindexentries -%}
+ <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+ {% if not loop.last %}| {% endif %}
+ {%- endfor %}</p>
+
+ <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+ {{ super() }}
+{% endblock %}
diff --git a/sphinx/themes/basic/genindex-split.html b/sphinx/themes/basic/genindex-split.html
new file mode 100644
index 0000000..df2c2c2
--- /dev/null
+++ b/sphinx/themes/basic/genindex-split.html
@@ -0,0 +1,41 @@
+{#
+ basic/genindex-split.html
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Template for a "split" index overview page.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "layout.html" %}
+{% set title = _('Index') %}
+{% block body %}
+
+ <h1 id="index">{{ _('Index') }}</h1>
+
+ <p>{{ _('Index pages by letter') }}:</p>
+
+ <div class="genindex-jumpbox">
+ <p>{% for key, dummy in genindexentries -%}
+ <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+ {% if not loop.last %}| {% endif %}
+ {%- endfor %}</p>
+
+ <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong>
+ ({{ _('can be huge') }})</a></p>
+ </div>
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+ <h4>Index</h4>
+ <p>{% for key, dummy in genindexentries -%}
+ <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+ {% if not loop.last %}| {% endif %}
+ {%- endfor %}</p>
+
+ <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+ {{ super() }}
+{% endblock %}
diff --git a/sphinx/themes/basic/genindex.html b/sphinx/themes/basic/genindex.html
new file mode 100644
index 0000000..465b612
--- /dev/null
+++ b/sphinx/themes/basic/genindex.html
@@ -0,0 +1,76 @@
+{#
+ basic/genindex.html
+ ~~~~~~~~~~~~~~~~~~~
+
+ Template for an "all-in-one" index.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "layout.html" %}
+{% set title = _('Index') %}
+
+{% macro indexentries(firstname, links) %}
+ {%- 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 %}
+{% endmacro %}
+
+{% block body %}
+
+<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>
+
+{%- for key, entries in genindexentries %}
+<h2 id="{{ key }}">{{ key }}</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ {%- for column in entries|slice_index(2) if column %}
+ <td style="width: 33%; vertical-align: top;"><ul>
+ {%- for entryname, (links, subitems, _) in column %}
+ <li>{{ indexentries(entryname, links) }}
+ {%- if subitems %}
+ <ul>
+ {%- for subentryname, subentrylinks in subitems %}
+ <li>{{ indexentries(subentryname, subentrylinks) }}</li>
+ {%- endfor %}
+ </ul>
+ {%- endif -%}</li>
+ {%- endfor %}
+ </ul></td>
+ {%- endfor %}
+</tr></table>
+{% endfor %}
+
+{% endblock %}
+
+{% block sidebarrel %}
+{% if split_index %}
+ <h4>{{ _('Index') }}</h4>
+ <p>{% for key, dummy in genindexentries -%}
+ <a href="{{ pathto('genindex-' + key) }}"><strong>{{ key }}</strong></a>
+ {% if not loop.last %}| {% endif %}
+ {%- endfor %}</p>
+
+ <p><a href="{{ pathto('genindex-all') }}"><strong>{{ _('Full index on one page') }}</strong></a></p>
+{% endif %}
+ {{ super() }}
+{% endblock %}
diff --git a/sphinx/themes/basic/globaltoc.html b/sphinx/themes/basic/globaltoc.html
new file mode 100644
index 0000000..dd5cd6f
--- /dev/null
+++ b/sphinx/themes/basic/globaltoc.html
@@ -0,0 +1,11 @@
+{#
+ basic/globaltoc.html
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx sidebar template: global table of contents.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+<h3><a href="{{ pathto(root_doc)|e }}">{{ _('Table of Contents') }}</a></h3>
+{{ toctree(includehidden=theme_globaltoc_includehidden, collapse=theme_globaltoc_collapse, maxdepth=theme_globaltoc_maxdepth) }}
diff --git a/sphinx/themes/basic/layout.html b/sphinx/themes/basic/layout.html
new file mode 100644
index 0000000..156ebcd
--- /dev/null
+++ b/sphinx/themes/basic/layout.html
@@ -0,0 +1,220 @@
+{#
+ basic/layout.html
+ ~~~~~~~~~~~~~~~~~
+
+ Master layout template for Sphinx themes.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- block doctype -%}
+<!DOCTYPE html>
+{%- endblock %}
+{%- set reldelim1 = reldelim1 is not defined and ' &#187;' or reldelim1 %}
+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
+{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
+ (sidebars != []) %}
+{# URL root should never be #, then all links are fragments #}
+{%- if not embedded and docstitle %}
+ {%- set titlesuffix = " &#8212; "|safe + docstitle|e %}
+{%- else %}
+ {%- set titlesuffix = "" %}
+{%- endif %}
+
+{%- macro relbar() %}
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>{{ _('Navigation') }}</h3>
+ <ul>
+ {%- for rellink in rellinks %}
+ <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
+ <a href="{{ pathto(rellink[0])|e }}" title="{{ rellink[1]|striptags|e }}"
+ {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
+ {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
+ {%- endfor %}
+ {%- block rootrellink %}
+ <li class="nav-item nav-item-0"><a href="{{ pathto(root_doc)|e }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
+ {%- endblock %}
+ {%- for parent in parents %}
+ <li class="nav-item nav-item-{{ loop.index }}"><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
+ {%- endfor %}
+ <li class="nav-item nav-item-this"><a href="{{ link|e }}">{{ title }}</a></li>
+ {%- block relbaritems %} {% endblock %}
+ </ul>
+ </div>
+{%- endmacro %}
+
+{%- macro sidebar() %}
+ {%- if render_sidebar %}
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+ {%- block sidebarlogo %}
+ {%- if logo_url %}
+ <p class="logo"><a href="{{ pathto(root_doc)|e }}">
+ <img class="logo" src="{{ logo_url|e }}" alt="Logo"/>
+ </a></p>
+ {%- endif %}
+ {%- endblock %}
+ {%- if sidebars != None %}
+ {#- new style sidebar: explicitly include/exclude templates #}
+ {%- for sidebartemplate in sidebars %}
+ {%- include sidebartemplate %}
+ {%- endfor %}
+ {%- else %}
+ {#- old style sidebars: using blocks -- should be deprecated #}
+ {%- block sidebartoc %}
+ {%- include "localtoc.html" %}
+ {%- endblock %}
+ {%- block sidebarrel %}
+ {%- include "relations.html" %}
+ {%- endblock %}
+ {%- block sidebarsourcelink %}
+ {%- include "sourcelink.html" %}
+ {%- endblock %}
+ {%- if customsidebar %}
+ {%- include customsidebar %}
+ {%- endif %}
+ {%- block sidebarsearch %}
+ {%- include "searchbox.html" %}
+ {%- endblock %}
+ {%- endif %}
+ </div>
+ {%- block sidebarextra %}{%- endblock %}
+ </div>
+ {%- endif %}
+{%- endmacro %}
+
+{%- macro script() %}
+ {%- for js in script_files %}
+ {{ js_tag(js) }}
+ {%- endfor %}
+{%- endmacro %}
+
+{%- macro css() %}
+ {%- for css in css_files %}
+ {%- if css|attr("filename") %}
+ {{ css_tag(css) }}
+ {%- else %}
+ <link rel="stylesheet" href="{{ pathto(css, 1)|e }}" type="text/css" />
+ {%- endif %}
+ {%- endfor %}
+{%- endmacro %}
+
+{%- if html_tag %}
+{{ html_tag }}
+{%- else %}
+<html{% if language is not none %} lang="{{ language }}"{% endif %} data-content_root="{{ content_root }}">
+{%- endif %}
+ <head>
+ <meta charset="{{ encoding }}" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ {{- metatags }}
+ {%- block htmltitle %}
+ <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
+ {%- endblock %}
+ {%- block css %}
+ {{- css() }}
+ {%- endblock %}
+ {%- if not embedded %}
+ {%- block scripts %}
+ {{- script() }}
+ {%- endblock %}
+ {%- if pageurl %}
+ <link rel="canonical" href="{{ pageurl|e }}" />
+ {%- endif %}
+ {%- if use_opensearch %}
+ <link rel="search" type="application/opensearchdescription+xml"
+ title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
+ href="{{ pathto('_static/opensearch.xml', 1) }}"/>
+ {%- endif %}
+ {%- if favicon_url %}
+ <link rel="icon" href="{{ favicon_url|e }}"/>
+ {%- endif %}
+ {%- endif %}
+{%- block linktags %}
+ {%- if hasdoc('about') %}
+ <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
+ {%- endif %}
+ {%- if hasdoc('genindex') %}
+ <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
+ {%- endif %}
+ {%- if hasdoc('search') %}
+ <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
+ {%- endif %}
+ {%- if hasdoc('copyright') %}
+ <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
+ {%- endif %}
+ {%- if next %}
+ <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
+ {%- endif %}
+ {%- if prev %}
+ <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
+ {%- endif %}
+{%- endblock %}
+{%- block extrahead %} {% endblock %}
+ </head>
+ {%- block body_tag %}<body>{% endblock %}
+{%- block header %}{% endblock %}
+
+{%- block relbar1 %}{{ relbar() }}{% endblock %}
+
+{%- block content %}
+ {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
+
+ <div class="document">
+ {%- block document %}
+ <div class="documentwrapper">
+ {%- if render_sidebar %}
+ <div class="bodywrapper">
+ {%- endif %}
+ <div class="body" role="main">
+ {% block body %} {% endblock %}
+ <div class="clearer"></div>
+ </div>
+ {%- if render_sidebar %}
+ </div>
+ {%- endif %}
+ </div>
+ {%- endblock %}
+
+ {%- block sidebar2 %}{{ sidebar() }}{% endblock %}
+ <div class="clearer"></div>
+ </div>
+{%- endblock %}
+
+{%- block relbar2 %}{{ relbar() }}{% endblock %}
+
+{%- macro copyright_block() %}
+ {%- if hasdoc('copyright') %}
+ {%- set copyright_prefix = '<a href="' + pathto('copyright') + '">' + _('Copyright') + '</a>' -%}
+ {%- else %}
+ {%- set copyright_prefix = _('Copyright') %}
+ {%- endif %}
+ {%- if copyright is iterable and copyright is not string %}
+ {% for copyright_line in copyright %}
+ {% trans trimmed copyright_prefix=copyright_prefix, copyright=copyright_line|e %}
+ &#169; {{ copyright_prefix }} {{ copyright }}.
+ {% endtrans %}
+ {%- if not loop.last %}<br/>{%- endif %}
+ {% endfor %}
+ {%- else %}
+ {% trans trimmed copyright_prefix=copyright_prefix, copyright=copyright|e %}
+ &#169; {{ copyright_prefix }} {{ copyright }}.
+ {% endtrans %}
+ {%- endif %}
+{%- endmacro %}
+
+{%- block footer %}
+ <div class="footer" role="contentinfo">
+ {%- if show_copyright %}
+ {{- copyright_block() -}}
+ {%- endif %}
+ {%- if last_updated %}
+ {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+ {%- endif %}
+ {%- if show_sphinx %}
+ {% trans sphinx_version=sphinx_version|e %}Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+ {%- endif %}
+ </div>
+{%- endblock %}
+ </body>
+</html>
diff --git a/sphinx/themes/basic/localtoc.html b/sphinx/themes/basic/localtoc.html
new file mode 100644
index 0000000..f53db07
--- /dev/null
+++ b/sphinx/themes/basic/localtoc.html
@@ -0,0 +1,15 @@
+{#
+ basic/localtoc.html
+ ~~~~~~~~~~~~~~~~~~~
+
+ Sphinx sidebar template: local table of contents.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- if display_toc %}
+ <div>
+ <h3><a href="{{ pathto(root_doc)|e }}">{{ _('Table of Contents') }}</a></h3>
+ {{ toc }}
+ </div>
+{%- endif %}
diff --git a/sphinx/themes/basic/opensearch.xml b/sphinx/themes/basic/opensearch.xml
new file mode 100644
index 0000000..ca7bb59
--- /dev/null
+++ b/sphinx/themes/basic/opensearch.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+ <ShortName>{{ project|e }}</ShortName>
+ <Description>{% trans docstitle=docstitle|e %}Search {{ docstitle }}{% endtrans %}</Description>
+ <InputEncoding>utf-8</InputEncoding>
+ <Url type="text/html" method="get"
+ template="{{ use_opensearch }}/{{ pathto('search') }}?q={searchTerms}"/>
+ <LongName>{{ docstitle|e }}</LongName>
+{%- if favicon_url %}
+ <Image height="16" width="16" type="image/x-icon">{{ use_opensearch }}/{{ favicon_url|e }}</Image>
+{%- endif %}
+{% block extra %} {# Put e.g. an <Image> element here. #} {% endblock %}
+</OpenSearchDescription>
diff --git a/sphinx/themes/basic/page.html b/sphinx/themes/basic/page.html
new file mode 100644
index 0000000..a490fc6
--- /dev/null
+++ b/sphinx/themes/basic/page.html
@@ -0,0 +1,13 @@
+{#
+ basic/page.html
+ ~~~~~~~~~~~~~~~
+
+ Master template for simple pages.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "layout.html" %}
+{% block body %}
+ {{ body }}
+{% endblock %}
diff --git a/sphinx/themes/basic/relations.html b/sphinx/themes/basic/relations.html
new file mode 100644
index 0000000..86ed02e
--- /dev/null
+++ b/sphinx/themes/basic/relations.html
@@ -0,0 +1,23 @@
+{#
+ basic/relations.html
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx sidebar template: relation links.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- if prev %}
+ <div>
+ <h4>{{ _('Previous topic') }}</h4>
+ <p class="topless"><a href="{{ prev.link|e }}"
+ title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
+ </div>
+{%- endif %}
+{%- if next %}
+ <div>
+ <h4>{{ _('Next topic') }}</h4>
+ <p class="topless"><a href="{{ next.link|e }}"
+ title="{{ _('next chapter') }}">{{ next.title }}</a></p>
+ </div>
+{%- endif %}
diff --git a/sphinx/themes/basic/search.html b/sphinx/themes/basic/search.html
new file mode 100644
index 0000000..f29d9db
--- /dev/null
+++ b/sphinx/themes/basic/search.html
@@ -0,0 +1,65 @@
+{#
+ basic/search.html
+ ~~~~~~~~~~~~~~~~~
+
+ Template for the search page.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "layout.html" %}
+{% set title = _('Search') %}
+{%- block scripts %}
+ {{ super() }}
+ <script src="{{ pathto('_static/searchtools.js', 1) }}"></script>
+ <script src="{{ pathto('_static/language_data.js', 1) }}"></script>
+{%- endblock %}
+{% block extrahead %}
+ <script src="{{ pathto('searchindex.js', 1) }}" defer></script>
+ {{ super() }}
+{% endblock %}
+{% block body %}
+ <h1 id="search-documentation">{{ _('Search') }}</h1>
+ {% block scriptwarning %}
+ <noscript>
+ <div class="admonition warning">
+ <p>
+ {% trans %}Please activate JavaScript to enable the search
+ functionality.{% endtrans %}
+ </p>
+ </div>
+ </noscript>
+ {% endblock %}
+ {% block searchtext %}
+ <p>
+ {% trans %}Searching for multiple words only shows matches that contain
+ all words.{% endtrans %}
+ </p>
+ {% endblock %}
+ {% block searchbox %}
+ <form action="" method="get">
+ <input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="{{ _('search') }}" />
+ <span id="search-progress" style="padding-left: 10px"></span>
+ </form>
+ {% endblock %}
+ {% block searchresults %}
+ {% if search_performed %}
+ <h2>{{ _('Search Results') }}</h2>
+ {% if not search_results %}
+ <p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
+ {% endif %}
+ {% endif %}
+ <div id="search-results">
+ {% if search_results %}
+ <ul>
+ {% for href, caption, context in search_results %}
+ <li><a href="{{ pathto(item.href) }}">{{ caption }}</a>
+ <div class="context">{{ context|e }}</div>
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </div>
+ {% endblock %}
+{% endblock %}
diff --git a/sphinx/themes/basic/searchbox.html b/sphinx/themes/basic/searchbox.html
new file mode 100644
index 0000000..0cd4523
--- /dev/null
+++ b/sphinx/themes/basic/searchbox.html
@@ -0,0 +1,21 @@
+{#
+ basic/searchbox.html
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx sidebar template: quick search box.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- if pagename != "search" and builder != "singlehtml" %}
+<div id="searchbox" style="display: none" role="search">
+ <h3 id="searchlabel">{{ _('Quick search') }}</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="{{ pathto('search') }}" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
+ <input type="submit" value="{{ _('Go') }}" />
+ </form>
+ </div>
+</div>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+{%- endif %}
diff --git a/sphinx/themes/basic/searchfield.html b/sphinx/themes/basic/searchfield.html
new file mode 100644
index 0000000..1286be0
--- /dev/null
+++ b/sphinx/themes/basic/searchfield.html
@@ -0,0 +1,23 @@
+{#
+ basic/searchfield.html
+ ~~~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx sidebar template: search field.
+ This component is similar to searchbox.html but does not include an
+ extra heading ("Quick search"). Instead, it uses a placeholder text
+ in the search field.
+
+ :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- if pagename != "search" and builder != "singlehtml" %}
+<div id="searchbox" style="display: none" role="search">
+ <div class="searchformwrapper">
+ <form class="search" action="{{ pathto('search') }}" method="get">
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
+ <input type="submit" value="{{ _('Go') }}" />
+ </form>
+ </div>
+</div>
+<script>document.getElementById('searchbox').style.display = "block"</script>
+{%- endif %}
diff --git a/sphinx/themes/basic/sourcelink.html b/sphinx/themes/basic/sourcelink.html
new file mode 100644
index 0000000..2ff0f00
--- /dev/null
+++ b/sphinx/themes/basic/sourcelink.html
@@ -0,0 +1,18 @@
+{#
+ basic/sourcelink.html
+ ~~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx sidebar template: "show source" link.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- if show_source and has_source and sourcename %}
+ <div role="note" aria-label="source link">
+ <h3>{{ _('This Page') }}</h3>
+ <ul class="this-page-menu">
+ <li><a href="{{ pathto('_sources/' + sourcename, true)|e }}"
+ rel="nofollow">{{ _('Show Source') }}</a></li>
+ </ul>
+ </div>
+{%- endif %}
diff --git a/sphinx/themes/basic/static/basic.css_t b/sphinx/themes/basic/static/basic.css_t
new file mode 100644
index 0000000..53f5eb4
--- /dev/null
+++ b/sphinx/themes/basic/static/basic.css_t
@@ -0,0 +1,925 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+div.section::after {
+ display: block;
+ content: '';
+ clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: {{ theme_sidebarwidth|todim }};
+ margin-left: -100%;
+ font-size: 90%;
+ word-wrap: break-word;
+ overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+ overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ float: left;
+ width: 80%;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ float: left;
+ width: 20%;
+ border-left: none;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li p.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+ min-width: {{ theme_body_min_width|todim }};
+ max-width: {{ theme_body_max_width|todim }};
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+
+a.headerlink {
+ visibility: hidden;
+}
+
+a:visited {
+ color: #551A8B;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-default {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+ clear: right;
+ overflow-x: auto;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+nav.contents,
+aside.topic,
+div.admonition, div.topic, blockquote {
+ clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+nav.contents > :last-child,
+aside.topic > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+ margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+nav.contents::after,
+aside.topic::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+ display: block;
+ content: '';
+ clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.align-default {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+ margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+ margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+ margin: 0.5em;
+ padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+ padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+ margin: 1em 0;
+}
+
+table.hlist td {
+ vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.sig-name {
+ font-size: 1.1em;
+}
+
+code.descname {
+ font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.sig-param.n {
+ font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+ font-family: unset;
+}
+
+.sig.c .k, .sig.c .kt,
+.sig.cpp .k, .sig.cpp .kt {
+ color: #0033B3;
+}
+
+.sig.c .m,
+.sig.cpp .m {
+ color: #1750EB;
+}
+
+.sig.c .s, .sig.c .sc,
+.sig.cpp .s, .sig.cpp .sc {
+ color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+ margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+ margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+ margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+ margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+ margin-bottom: 0;
+}
+
+aside.footnote > span,
+div.citation > span {
+ float: left;
+}
+aside.footnote > span:last-of-type,
+div.citation > span:last-of-type {
+ padding-right: 0.5em;
+}
+aside.footnote > p {
+ margin-left: 2em;
+}
+div.citation > p {
+ margin-left: 4em;
+}
+aside.footnote > p:last-of-type,
+div.citation > p:last-of-type {
+ margin-bottom: 0em;
+}
+aside.footnote > p:last-of-type:after,
+div.citation > p:last-of-type:after {
+ content: "";
+ clear: both;
+}
+
+dl.field-list {
+ display: grid;
+ grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+ font-weight: bold;
+ word-break: break-word;
+ padding-left: 0.5em;
+ padding-right: 5px;
+}
+
+dl.field-list > dd {
+ padding-left: 0.5em;
+ margin-top: 0em;
+ margin-left: 0em;
+ margin-bottom: 0em;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd > :first-child {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+.sig dd {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.sig dl {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+ background-color: #fbe54e;
+}
+
+rect.highlighted {
+ fill: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+.classifier:before {
+ font-style: normal;
+ margin: 0 0.5em;
+ content: ":";
+ display: inline-block;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+.translated {
+ background-color: rgba(207, 255, 207, 0.2)
+}
+
+.untranslated {
+ background-color: rgba(255, 207, 207, 0.2)
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+ clear: both;
+}
+
+span.pre {
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ -webkit-hyphens: none;
+ hyphens: none;
+ white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+ margin: 1em 0;
+}
+
+td.linenos pre {
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ display: block;
+}
+
+table.highlighttable tbody {
+ display: block;
+}
+
+table.highlighttable tr {
+ display: flex;
+}
+
+table.highlighttable td {
+ margin: 0;
+ padding: 0;
+}
+
+table.highlighttable td.linenos {
+ padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+ flex: 1;
+ overflow: hidden;
+}
+
+.highlight .hll {
+ display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+ margin: 0;
+}
+
+div.code-block-caption + div {
+ margin-top: 0;
+}
+
+div.code-block-caption {
+ margin-top: 1em;
+ padding: 2px 5px;
+ font-size: small;
+}
+
+div.code-block-caption code {
+ background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp { /* gp: Generic.Prompt */
+ user-select: none;
+ -webkit-user-select: text; /* Safari fallback only */
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ margin: 1em 0;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+span.eqno a.headerlink {
+ position: absolute;
+ z-index: 1;
+}
+
+div.math:hover a.headerlink {
+ visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
diff --git a/sphinx/themes/basic/static/doctools.js b/sphinx/themes/basic/static/doctools.js
new file mode 100644
index 0000000..d06a71d
--- /dev/null
+++ b/sphinx/themes/basic/static/doctools.js
@@ -0,0 +1,156 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Base JavaScript utilities for all Sphinx HTML documentation.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
+ "TEXTAREA",
+ "INPUT",
+ "SELECT",
+ "BUTTON",
+]);
+
+const _ready = (callback) => {
+ if (document.readyState !== "loading") {
+ callback();
+ } else {
+ document.addEventListener("DOMContentLoaded", callback);
+ }
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const Documentation = {
+ init: () => {
+ Documentation.initDomainIndexTable();
+ Documentation.initOnKeyListeners();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS: {},
+ PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
+ LOCALE: "unknown",
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext: (string) => {
+ const translated = Documentation.TRANSLATIONS[string];
+ switch (typeof translated) {
+ case "undefined":
+ return string; // no translation
+ case "string":
+ return translated; // translation exists
+ default:
+ return translated[0]; // (singular, plural) translation tuple exists
+ }
+ },
+
+ ngettext: (singular, plural, n) => {
+ const translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated !== "undefined")
+ return translated[Documentation.PLURAL_EXPR(n)];
+ return n === 1 ? singular : plural;
+ },
+
+ addTranslations: (catalog) => {
+ Object.assign(Documentation.TRANSLATIONS, catalog.messages);
+ Documentation.PLURAL_EXPR = new Function(
+ "n",
+ `return (${catalog.plural_expr})`
+ );
+ Documentation.LOCALE = catalog.locale;
+ },
+
+ /**
+ * helper function to focus on search bar
+ */
+ focusSearchBar: () => {
+ document.querySelectorAll("input[name=q]")[0]?.focus();
+ },
+
+ /**
+ * Initialise the domain index toggle buttons
+ */
+ initDomainIndexTable: () => {
+ const toggler = (el) => {
+ const idNumber = el.id.substr(7);
+ const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
+ if (el.src.substr(-9) === "minus.png") {
+ el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
+ toggledRows.forEach((el) => (el.style.display = "none"));
+ } else {
+ el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
+ toggledRows.forEach((el) => (el.style.display = ""));
+ }
+ };
+
+ const togglerElements = document.querySelectorAll("img.toggler");
+ togglerElements.forEach((el) =>
+ el.addEventListener("click", (event) => toggler(event.currentTarget))
+ );
+ togglerElements.forEach((el) => (el.style.display = ""));
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
+ },
+
+ initOnKeyListeners: () => {
+ // only install a listener if it is really needed
+ if (
+ !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
+ !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
+ )
+ return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
+
+ if (!event.shiftKey) {
+ switch (event.key) {
+ case "ArrowLeft":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const prevLink = document.querySelector('link[rel="prev"]');
+ if (prevLink && prevLink.href) {
+ window.location.href = prevLink.href;
+ event.preventDefault();
+ }
+ break;
+ case "ArrowRight":
+ if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
+
+ const nextLink = document.querySelector('link[rel="next"]');
+ if (nextLink && nextLink.href) {
+ window.location.href = nextLink.href;
+ event.preventDefault();
+ }
+ break;
+ }
+ }
+
+ // some keyboard layouts may need Shift to get /
+ switch (event.key) {
+ case "/":
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
+ Documentation.focusSearchBar();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+// quick alias for translations
+const _ = Documentation.gettext;
+
+_ready(Documentation.init);
diff --git a/sphinx/themes/basic/static/documentation_options.js_t b/sphinx/themes/basic/static/documentation_options.js_t
new file mode 100644
index 0000000..b66690a
--- /dev/null
+++ b/sphinx/themes/basic/static/documentation_options.js_t
@@ -0,0 +1,13 @@
+const DOCUMENTATION_OPTIONS = {
+ VERSION: '{{ release|e }}',
+ LANGUAGE: '{{ language }}',
+ COLLAPSE_INDEX: false,
+ BUILDER: '{{ builder }}',
+ FILE_SUFFIX: '{{ file_suffix }}',
+ LINK_SUFFIX: '{{ link_suffix }}',
+ HAS_SOURCE: {{ has_source|lower }},
+ SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}',
+ NAVIGATION_WITH_KEYS: {{ 'true' if theme_navigation_with_keys|tobool else 'false'}},
+ SHOW_SEARCH_SUMMARY: {{ 'true' if show_search_summary else 'false' }},
+ ENABLE_SEARCH_SHORTCUTS: {{ 'true' if theme_enable_search_shortcuts|tobool else 'false'}},
+};
diff --git a/sphinx/themes/basic/static/file.png b/sphinx/themes/basic/static/file.png
new file mode 100644
index 0000000..a858a41
--- /dev/null
+++ b/sphinx/themes/basic/static/file.png
Binary files differ
diff --git a/sphinx/themes/basic/static/language_data.js_t b/sphinx/themes/basic/static/language_data.js_t
new file mode 100644
index 0000000..80f2a4f
--- /dev/null
+++ b/sphinx/themes/basic/static/language_data.js_t
@@ -0,0 +1,26 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = {{ search_language_stop_words }};
+
+{% if search_language_stemming_code %}
+/* Non-minified version is copied as a separate JS file, is available */
+{{ search_language_stemming_code|safe }}
+{% endif -%}
+
+{% if search_scorer_tool %}
+{{ search_scorer_tool|safe }}
+{% endif -%}
+
+{% if search_word_splitter_code %}
+{{ search_word_splitter_code }}
+{% endif -%}
diff --git a/sphinx/themes/basic/static/minus.png b/sphinx/themes/basic/static/minus.png
new file mode 100644
index 0000000..d96755f
--- /dev/null
+++ b/sphinx/themes/basic/static/minus.png
Binary files differ
diff --git a/sphinx/themes/basic/static/plus.png b/sphinx/themes/basic/static/plus.png
new file mode 100644
index 0000000..7107cec
--- /dev/null
+++ b/sphinx/themes/basic/static/plus.png
Binary files differ
diff --git a/sphinx/themes/basic/static/searchtools.js b/sphinx/themes/basic/static/searchtools.js
new file mode 100644
index 0000000..7918c3f
--- /dev/null
+++ b/sphinx/themes/basic/static/searchtools.js
@@ -0,0 +1,574 @@
+/*
+ * searchtools.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for the full-text search.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+"use strict";
+
+/**
+ * Simple result scoring code.
+ */
+if (typeof Scorer === "undefined") {
+ var Scorer = {
+ // Implement the following function to further tweak the score for each result
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
+ // and returns the new score.
+ /*
+ score: result => {
+ const [docname, title, anchor, descr, score, filename] = result
+ return score
+ },
+ */
+
+ // query matches the full name of an object
+ objNameMatch: 11,
+ // or matches in the last dotted part of the object name
+ objPartialMatch: 6,
+ // Additive scores depending on the priority of the object
+ objPrio: {
+ 0: 15, // used to be importantResults
+ 1: 5, // used to be objectResults
+ 2: -5, // used to be unimportantResults
+ },
+ // Used when the priority is not in the mapping.
+ objPrioDefault: 0,
+
+ // query found in title
+ title: 15,
+ partialTitle: 7,
+ // query found in terms
+ term: 5,
+ partialTerm: 2,
+ };
+}
+
+const _removeChildren = (element) => {
+ while (element && element.lastChild) element.removeChild(element.lastChild);
+};
+
+/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ */
+const _escapeRegExp = (string) =>
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+
+const _displayItem = (item, searchTerms, highlightTerms) => {
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
+ const contentRoot = document.documentElement.dataset.content_root;
+
+ const [docName, title, anchor, descr, score, _filename] = item;
+
+ let listItem = document.createElement("li");
+ let requestUrl;
+ let linkUrl;
+ if (docBuilder === "dirhtml") {
+ // dirhtml builder
+ let dirname = docName + "/";
+ if (dirname.match(/\/index\/$/))
+ dirname = dirname.substring(0, dirname.length - 6);
+ else if (dirname === "index/") dirname = "";
+ requestUrl = contentRoot + dirname;
+ linkUrl = requestUrl;
+ } else {
+ // normal html builders
+ requestUrl = contentRoot + docName + docFileSuffix;
+ linkUrl = docName + docLinkSuffix;
+ }
+ let linkEl = listItem.appendChild(document.createElement("a"));
+ linkEl.href = linkUrl + anchor;
+ linkEl.dataset.score = score;
+ linkEl.innerHTML = title;
+ if (descr) {
+ listItem.appendChild(document.createElement("span")).innerHTML =
+ " (" + descr + ")";
+ // highlight search terms in the description
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+ }
+ else if (showSearchSummary)
+ fetch(requestUrl)
+ .then((responseData) => responseData.text())
+ .then((data) => {
+ if (data)
+ listItem.appendChild(
+ Search.makeSearchSummary(data, searchTerms)
+ );
+ // highlight search terms in the summary
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
+ });
+ Search.output.appendChild(listItem);
+};
+const _finishSearch = (resultCount) => {
+ Search.stopPulse();
+ Search.title.innerText = _("Search Results");
+ if (!resultCount)
+ Search.status.innerText = Documentation.gettext(
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
+ );
+ else
+ Search.status.innerText = _(
+ `Search finished, found ${resultCount} page(s) matching the search query.`
+ );
+};
+const _displayNextItem = (
+ results,
+ resultCount,
+ searchTerms,
+ highlightTerms,
+) => {
+ // results left, load the summary and display it
+ // this is intended to be dynamic (don't sub resultsCount)
+ if (results.length) {
+ _displayItem(results.pop(), searchTerms, highlightTerms);
+ setTimeout(
+ () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
+ 5
+ );
+ }
+ // search finished, update title and status message
+ else _finishSearch(resultCount);
+};
+
+/**
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
+ * custom function per language.
+ *
+ * The regular expression works by splitting the string on consecutive characters
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
+ */
+if (typeof splitQuery === "undefined") {
+ var splitQuery = (query) => query
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
+ .filter(term => term) // remove remaining empty strings
+}
+
+/**
+ * Search Module
+ */
+const Search = {
+ _index: null,
+ _queued_query: null,
+ _pulse_status: -1,
+
+ htmlToText: (htmlString) => {
+ const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+ htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+ const docContent = htmlElement.querySelector('[role="main"]');
+ if (docContent !== undefined) return docContent.textContent;
+ console.warn(
+ "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+ );
+ return "";
+ },
+
+ init: () => {
+ const query = new URLSearchParams(window.location.search).get("q");
+ document
+ .querySelectorAll('input[name="q"]')
+ .forEach((el) => (el.value = query));
+ if (query) Search.performSearch(query);
+ },
+
+ loadIndex: (url) =>
+ (document.body.appendChild(document.createElement("script")).src = url),
+
+ setIndex: (index) => {
+ Search._index = index;
+ if (Search._queued_query !== null) {
+ const query = Search._queued_query;
+ Search._queued_query = null;
+ Search.query(query);
+ }
+ },
+
+ hasIndex: () => Search._index !== null,
+
+ deferQuery: (query) => (Search._queued_query = query),
+
+ stopPulse: () => (Search._pulse_status = -1),
+
+ startPulse: () => {
+ if (Search._pulse_status >= 0) return;
+
+ const pulse = () => {
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
+ };
+ pulse();
+ },
+
+ /**
+ * perform a search for something (or wait until index is loaded)
+ */
+ performSearch: (query) => {
+ // create the required interface elements
+ const searchText = document.createElement("h2");
+ searchText.textContent = _("Searching");
+ const searchSummary = document.createElement("p");
+ searchSummary.classList.add("search-summary");
+ searchSummary.innerText = "";
+ const searchList = document.createElement("ul");
+ searchList.classList.add("search");
+
+ const out = document.getElementById("search-results");
+ Search.title = out.appendChild(searchText);
+ Search.dots = Search.title.appendChild(document.createElement("span"));
+ Search.status = out.appendChild(searchSummary);
+ Search.output = out.appendChild(searchList);
+
+ const searchProgress = document.getElementById("search-progress");
+ // Some themes don't use the search progress node
+ if (searchProgress) {
+ searchProgress.innerText = _("Preparing search...");
+ }
+ Search.startPulse();
+
+ // index already loaded, the browser was quick!
+ if (Search.hasIndex()) Search.query(query);
+ else Search.deferQuery(query);
+ },
+
+ /**
+ * execute search (requires search index to be loaded)
+ */
+ query: (query) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+ const allTitles = Search._index.alltitles;
+ const indexEntries = Search._index.indexentries;
+
+ // stem the search terms and add them to the correct list
+ const stemmer = new Stemmer();
+ const searchTerms = new Set();
+ const excludedTerms = new Set();
+ const highlightTerms = new Set();
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
+ splitQuery(query.trim()).forEach((queryTerm) => {
+ const queryTermLower = queryTerm.toLowerCase();
+
+ // maybe skip this "word"
+ // stopwords array is from language_data.js
+ if (
+ stopwords.indexOf(queryTermLower) !== -1 ||
+ queryTerm.match(/^\d+$/)
+ )
+ return;
+
+ // stem the word
+ let word = stemmer.stemWord(queryTermLower);
+ // select the correct list
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
+ else {
+ searchTerms.add(word);
+ highlightTerms.add(queryTermLower);
+ }
+ });
+
+ if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
+ localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
+ }
+
+ // console.debug("SEARCH: searching for:");
+ // console.info("required: ", [...searchTerms]);
+ // console.info("excluded: ", [...excludedTerms]);
+
+ // array of [docname, title, anchor, descr, score, filename]
+ let results = [];
+ _removeChildren(document.getElementById("search-progress"));
+
+ const queryLower = query.toLowerCase();
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
+ if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+ for (const [file, id] of foundTitles) {
+ let score = Math.round(100 * queryLower.length / title.length)
+ results.push([
+ docNames[file],
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
+ id !== null ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ }
+ }
+
+ // search for explicit entries in index directives
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
+ if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
+ for (const [file, id] of foundEntries) {
+ let score = Math.round(100 * queryLower.length / entry.length)
+ results.push([
+ docNames[file],
+ titles[file],
+ id ? "#" + id : "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ }
+ }
+
+ // lookup as object
+ objectTerms.forEach((term) =>
+ results.push(...Search.performObjectSearch(term, objectTerms))
+ );
+
+ // lookup as search terms in fulltext
+ results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+
+ // let the scorer override scores with a custom scoring function
+ if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
+
+ // now sort the results by score (in opposite order of appearance, since the
+ // display function below uses pop() to retrieve items) and then
+ // alphabetically
+ results.sort((a, b) => {
+ const leftScore = a[4];
+ const rightScore = b[4];
+ if (leftScore === rightScore) {
+ // same score: sort alphabetically
+ const leftTitle = a[1].toLowerCase();
+ const rightTitle = b[1].toLowerCase();
+ if (leftTitle === rightTitle) return 0;
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+ }
+ return leftScore > rightScore ? 1 : -1;
+ });
+
+ // remove duplicate search results
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
+ let seen = new Set();
+ results = results.reverse().reduce((acc, result) => {
+ let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
+ if (!seen.has(resultStr)) {
+ acc.push(result);
+ seen.add(resultStr);
+ }
+ return acc;
+ }, []);
+
+ results = results.reverse();
+
+ // for debugging
+ //Search.lastresults = results.slice(); // a copy
+ // console.info("search results:", Search.lastresults);
+
+ // print the results
+ _displayNextItem(results, results.length, searchTerms, highlightTerms);
+ },
+
+ /**
+ * search for object names
+ */
+ performObjectSearch: (object, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const objects = Search._index.objects;
+ const objNames = Search._index.objnames;
+ const titles = Search._index.titles;
+
+ const results = [];
+
+ const objectSearchCallback = (prefix, match) => {
+ const name = match[4]
+ const fullname = (prefix ? prefix + "." : "") + name;
+ const fullnameLower = fullname.toLowerCase();
+ if (fullnameLower.indexOf(object) < 0) return;
+
+ let score = 0;
+ const parts = fullnameLower.split(".");
+
+ // check for different match types: exact matches of full name or
+ // "last name" (i.e. last dotted part)
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
+ score += Scorer.objNameMatch;
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
+ score += Scorer.objPartialMatch; // matches in last name
+
+ const objName = objNames[match[1]][2];
+ const title = titles[match[0]];
+
+ // If more than one term searched for, we require other words to be
+ // found in the name/title/description
+ const otherTerms = new Set(objectTerms);
+ otherTerms.delete(object);
+ if (otherTerms.size > 0) {
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
+ if (
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
+ )
+ return;
+ }
+
+ let anchor = match[3];
+ if (anchor === "") anchor = fullname;
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
+
+ const descr = objName + _(", in ") + title;
+
+ // add custom score for some objects according to scorer
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
+ score += Scorer.objPrio[match[2]];
+ else score += Scorer.objPrioDefault;
+
+ results.push([
+ docNames[match[0]],
+ fullname,
+ "#" + anchor,
+ descr,
+ score,
+ filenames[match[0]],
+ ]);
+ };
+ Object.keys(objects).forEach((prefix) =>
+ objects[prefix].forEach((array) =>
+ objectSearchCallback(prefix, array)
+ )
+ );
+ return results;
+ },
+
+ /**
+ * search for full-text terms in the index
+ */
+ performTermsSearch: (searchTerms, excludedTerms) => {
+ // prepare search
+ const terms = Search._index.terms;
+ const titleTerms = Search._index.titleterms;
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+
+ const scoreMap = new Map();
+ const fileMap = new Map();
+
+ // perform the search on the required terms
+ searchTerms.forEach((word) => {
+ const files = [];
+ const arr = [
+ { files: terms[word], score: Scorer.term },
+ { files: titleTerms[word], score: Scorer.title },
+ ];
+ // add support for partial matches
+ if (word.length > 2) {
+ const escapedWord = _escapeRegExp(word);
+ Object.keys(terms).forEach((term) => {
+ if (term.match(escapedWord) && !terms[word])
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
+ });
+ Object.keys(titleTerms).forEach((term) => {
+ if (term.match(escapedWord) && !titleTerms[word])
+ arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
+ });
+ }
+
+ // no match but word was a required one
+ if (arr.every((record) => record.files === undefined)) return;
+
+ // found search word in contents
+ arr.forEach((record) => {
+ if (record.files === undefined) return;
+
+ let recordFiles = record.files;
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
+ files.push(...recordFiles);
+
+ // set score for the word in each file
+ recordFiles.forEach((file) => {
+ if (!scoreMap.has(file)) scoreMap.set(file, {});
+ scoreMap.get(file)[word] = record.score;
+ });
+ });
+
+ // create the mapping
+ files.forEach((file) => {
+ if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
+ fileMap.get(file).push(word);
+ else fileMap.set(file, [word]);
+ });
+ });
+
+ // now check if the files don't contain excluded terms
+ const results = [];
+ for (const [file, wordList] of fileMap) {
+ // check if all requirements are matched
+
+ // as search terms with length < 3 are discarded
+ const filteredTermCount = [...searchTerms].filter(
+ (term) => term.length > 2
+ ).length;
+ if (
+ wordList.length !== searchTerms.size &&
+ wordList.length !== filteredTermCount
+ )
+ continue;
+
+ // ensure that none of the excluded terms is in the search result
+ if (
+ [...excludedTerms].some(
+ (term) =>
+ terms[term] === file ||
+ titleTerms[term] === file ||
+ (terms[term] || []).includes(file) ||
+ (titleTerms[term] || []).includes(file)
+ )
+ )
+ break;
+
+ // select one (max) score for the file.
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+ // add result to the result list
+ results.push([
+ docNames[file],
+ titles[file],
+ "",
+ null,
+ score,
+ filenames[file],
+ ]);
+ }
+ return results;
+ },
+
+ /**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words.
+ */
+ makeSearchSummary: (htmlText, keywords) => {
+ const text = Search.htmlToText(htmlText);
+ if (text === "") return null;
+
+ const textLower = text.toLowerCase();
+ const actualStartPosition = [...keywords]
+ .map((k) => textLower.indexOf(k.toLowerCase()))
+ .filter((i) => i > -1)
+ .slice(-1)[0];
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
+
+ const top = startWithContext === 0 ? "" : "...";
+ const tail = startWithContext + 240 < text.length ? "..." : "";
+
+ let summary = document.createElement("p");
+ summary.classList.add("context");
+ summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
+
+ return summary;
+ },
+};
+
+_ready(Search.init);
diff --git a/sphinx/themes/basic/static/sphinx_highlight.js b/sphinx/themes/basic/static/sphinx_highlight.js
new file mode 100644
index 0000000..8a96c69
--- /dev/null
+++ b/sphinx/themes/basic/static/sphinx_highlight.js
@@ -0,0 +1,154 @@
+/* Highlighting utilities for Sphinx HTML documentation. */
+"use strict";
+
+const SPHINX_HIGHLIGHT_ENABLED = true
+
+/**
+ * highlight a given string on a node by wrapping it in
+ * span elements with the given class name.
+ */
+const _highlight = (node, addItems, text, className) => {
+ if (node.nodeType === Node.TEXT_NODE) {
+ const val = node.nodeValue;
+ const parent = node.parentNode;
+ const pos = val.toLowerCase().indexOf(text);
+ if (
+ pos >= 0 &&
+ !parent.classList.contains(className) &&
+ !parent.classList.contains("nohighlight")
+ ) {
+ let span;
+
+ const closestNode = parent.closest("body, svg, foreignObject");
+ const isInSVG = closestNode && closestNode.matches("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.classList.add(className);
+ }
+
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ const rest = document.createTextNode(val.substr(pos + text.length));
+ parent.insertBefore(
+ span,
+ parent.insertBefore(
+ rest,
+ node.nextSibling
+ )
+ );
+ node.nodeValue = val.substr(0, pos);
+ /* There may be more occurrences of search term in this node. So call this
+ * function recursively on the remaining fragment.
+ */
+ _highlight(rest, addItems, text, className);
+
+ if (isInSVG) {
+ const rect = document.createElementNS(
+ "http://www.w3.org/2000/svg",
+ "rect"
+ );
+ const bbox = parent.getBBox();
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute("class", className);
+ addItems.push({ parent: parent, target: rect });
+ }
+ }
+ } else if (node.matches && !node.matches("button, select, textarea")) {
+ node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
+ }
+};
+const _highlightText = (thisNode, text, className) => {
+ let addItems = [];
+ _highlight(thisNode, addItems, text, className);
+ addItems.forEach((obj) =>
+ obj.parent.insertAdjacentElement("beforebegin", obj.target)
+ );
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+const SphinxHighlight = {
+
+ /**
+ * highlight the search words provided in localstorage in the text
+ */
+ highlightSearchWords: () => {
+ if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
+
+ // get and clear terms from localstorage
+ const url = new URL(window.location);
+ const highlight =
+ localStorage.getItem("sphinx_highlight_terms")
+ || url.searchParams.get("highlight")
+ || "";
+ localStorage.removeItem("sphinx_highlight_terms")
+ url.searchParams.delete("highlight");
+ window.history.replaceState({}, "", url);
+
+ // get individual terms from highlight string
+ const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
+ if (terms.length === 0) return; // nothing to do
+
+ // There should never be more than one element matching "div.body"
+ const divBody = document.querySelectorAll("div.body");
+ const body = divBody.length ? divBody[0] : document.querySelector("body");
+ window.setTimeout(() => {
+ terms.forEach((term) => _highlightText(body, term, "highlighted"));
+ }, 10);
+
+ const searchBox = document.getElementById("searchbox");
+ if (searchBox === null) return;
+ searchBox.appendChild(
+ document
+ .createRange()
+ .createContextualFragment(
+ '<p class="highlight-link">' +
+ '<a href="javascript:SphinxHighlight.hideSearchWords()">' +
+ _("Hide Search Matches") +
+ "</a></p>"
+ )
+ );
+ },
+
+ /**
+ * helper function to hide the search marks again
+ */
+ hideSearchWords: () => {
+ document
+ .querySelectorAll("#searchbox .highlight-link")
+ .forEach((el) => el.remove());
+ document
+ .querySelectorAll("span.highlighted")
+ .forEach((el) => el.classList.remove("highlighted"));
+ localStorage.removeItem("sphinx_highlight_terms")
+ },
+
+ initEscapeListener: () => {
+ // only install a listener if it is really needed
+ if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
+
+ document.addEventListener("keydown", (event) => {
+ // bail for input elements
+ if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
+ // bail with special keys
+ if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
+ if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
+ SphinxHighlight.hideSearchWords();
+ event.preventDefault();
+ }
+ });
+ },
+};
+
+_ready(() => {
+ /* Do not call highlightSearchWords() when we are on the search page.
+ * It will highlight words from the *previous* search query.
+ */
+ if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
+ SphinxHighlight.initEscapeListener();
+});
diff --git a/sphinx/themes/basic/theme.conf b/sphinx/themes/basic/theme.conf
new file mode 100644
index 0000000..f8e7b26
--- /dev/null
+++ b/sphinx/themes/basic/theme.conf
@@ -0,0 +1,16 @@
+[theme]
+inherit = none
+stylesheet = basic.css
+pygments_style = none
+sidebars = localtoc.html, relations.html, sourcelink.html, searchbox.html
+
+[options]
+nosidebar = false
+sidebarwidth = 230
+body_min_width = 360
+body_max_width = 800
+navigation_with_keys = False
+enable_search_shortcuts = True
+globaltoc_collapse = true
+globaltoc_includehidden = false
+globaltoc_maxdepth =
diff --git a/sphinx/themes/bizstyle/layout.html b/sphinx/themes/bizstyle/layout.html
new file mode 100644
index 0000000..6fd1e18
--- /dev/null
+++ b/sphinx/themes/bizstyle/layout.html
@@ -0,0 +1,27 @@
+{#
+ bizstyle/layout.html
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the bizstyle theme.
+
+ :copyright: Copyright 2007-2023 by Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{% extends "basic/layout.html" %}
+
+{%- block scripts %}
+ {{ super() }}
+ <script src="{{ pathto('_static/bizstyle.js', 1) }}"></script>
+{%- endblock %}
+
+{# doctype override #}
+{%- block doctype %}
+<!doctype html>
+{%- endblock %}
+
+{%- block extrahead %}
+ <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+ <!--[if lt IE 9]>
+ <script src="_static/css3-mediaqueries.js"></script>
+ <![endif]-->
+{%- endblock %}
diff --git a/sphinx/themes/bizstyle/static/background_b01.png b/sphinx/themes/bizstyle/static/background_b01.png
new file mode 100644
index 0000000..353f26d
--- /dev/null
+++ b/sphinx/themes/bizstyle/static/background_b01.png
Binary files differ
diff --git a/sphinx/themes/bizstyle/static/bizstyle.css_t b/sphinx/themes/bizstyle/static/bizstyle.css_t
new file mode 100644
index 0000000..3cf7832
--- /dev/null
+++ b/sphinx/themes/bizstyle/static/bizstyle.css_t
@@ -0,0 +1,523 @@
+/*
+ * bizstyle.css_t
+ * ~~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- business style theme.
+ *
+ * :copyright: Copyright 2007-2023 by Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+ font-size: 14px;
+ letter-spacing: -0.01em;
+ line-height: 150%;
+ text-align: center;
+ background-color: white;
+ background-image: url(background_b01.png);
+ color: black;
+ padding: 0;
+ border-right: 1px solid {{ theme_maincolor }};
+ border-left: 1px solid {{ theme_maincolor }};
+
+ margin: 0px 40px 0px 40px;
+}
+
+div.document {
+ background-color: white;
+ text-align: left;
+ background-repeat: repeat-x;
+
+ -moz-box-shadow: 2px 2px 5px #000;
+ -webkit-box-shadow: 2px 2px 5px #000;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 240px;
+ border-left: 1px solid #ccc;
+}
+
+div.body {
+ margin: 0;
+ padding: 0.5em 20px 20px 20px;
+}
+
+{%- if theme_rightsidebar|tobool %}
+div.bodywrapper {
+ margin: 0 calc({{ theme_sidebarwidth|todim }} + 30px) 0 0;
+ border-right: 1px solid #ccc;
+}
+{%- else %}
+div.bodywrapper {
+ margin: 0 0 0 calc({{ theme_sidebarwidth|todim }} + 30px);
+}
+{%- endif %}
+
+div.related {
+ font-size: 1em;
+
+ -moz-box-shadow: 2px 2px 5px #000;
+ -webkit-box-shadow: 2px 2px 5px #000;
+}
+
+div.related ul {
+ background-color: {{ theme_maincolor }};
+ height: 100%;
+ overflow: hidden;
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+
+div.related ul li {
+ color: white;
+ margin: 0;
+ padding: 0;
+ height: 2em;
+ float: left;
+}
+
+div.related ul li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+div.related ul li a {
+ margin: 0;
+ padding: 0 5px 0 5px;
+ line-height: 1.75em;
+ color: #fff;
+}
+
+div.related ul li a:hover {
+ color: #fff;
+ text-decoration: underline;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 0;
+}
+
+div.sphinxsidebar {
+ padding: 0.5em 12px 12px 12px;
+ width: {{ theme_sidebarwidth|todim }};
+ {%- if theme_rightsidebar|tobool %}
+ float: right;
+ {%- endif %}
+ font-size: 1em;
+ text-align: left;
+}
+
+div.sphinxsidebar h3, div.sphinxsidebar h4 {
+ margin: 1em 0 0.5em 0;
+ font-size: 1em;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border: 1px solid {{ theme_maincolor }};
+ background-color: {{ theme_maincolor }};
+}
+
+div.sphinxsidebar h3 a {
+ color: white;
+}
+
+div.sphinxsidebar ul {
+ padding-left: 1.5em;
+ margin-top: 7px;
+ padding: 0;
+ line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+ margin-left: 20px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid {{ theme_maincolor }};
+}
+
+div.footer {
+ background-color: white;
+ color: {{ theme_maincolor }};
+ padding: 3px 8px 3px 0;
+ clear: both;
+ font-size: 0.8em;
+ text-align: right;
+ border-bottom: 1px solid {{ theme_maincolor }};
+
+ -moz-box-shadow: 2px 2px 5px #000;
+ -webkit-box-shadow: 2px 2px 5px #000;
+}
+
+div.footer a {
+ color: {{ theme_maincolor }};
+ text-decoration: underline;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+p {
+ margin: 0.8em 0 0.5em 0;
+}
+
+a {
+ color: {{ theme_maincolor }};
+ text-decoration: none;
+}
+
+a:hover {
+ color: {{ theme_maincolor }};
+ text-decoration: underline;
+}
+
+a:visited {
+ color: #551a8b;
+}
+
+div.body a {
+ text-decoration: underline;
+}
+
+h1, h2, h3 {
+ color: {{ theme_maincolor }};
+}
+
+h1 {
+ margin: 0;
+ padding: 0.7em 0 0.3em 0;
+ font-size: 1.5em;
+}
+
+h2 {
+ margin: 1.3em 0 0.2em 0;
+ font-size: 1.35em;
+ padding-bottom: .5em;
+ border-bottom: 1px solid {{ theme_maincolor }};
+}
+
+h3 {
+ margin: 1em 0 -0.3em 0;
+ font-size: 1.2em;
+ padding-bottom: .3em;
+ border-bottom: 1px solid #CCCCCC;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a,
+div.body h4 a, div.body h5 a, div.body h6 a {
+ color: black!important;
+}
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor,
+h4 a.anchor, h5 a.anchor, h6 a.anchor {
+ display: none;
+ margin: 0 0 0 0.3em;
+ padding: 0 0.2em 0 0.2em;
+ color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+ display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+ color: #777;
+ background-color: #eee;
+}
+
+a.headerlink {
+ color: #c60f0f!important;
+ font-size: 1em;
+ margin-left: 6px;
+ padding: 0 4px 0 4px;
+ text-decoration: none!important;
+}
+
+a.headerlink:hover {
+ background-color: #ccc;
+ color: white!important;
+}
+
+cite, code, tt {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.01em;
+}
+
+code {
+ background-color: #F2F2F2;
+ border-bottom: 1px solid #ddd;
+ color: #333;
+}
+
+code.descname, code.descclassname, code.xref {
+ border: 0;
+}
+
+hr {
+ border: 1px solid #abc;
+ margin: 2em;
+}
+
+a code {
+ border: 0;
+ color: #CA7900;
+}
+
+a code:hover {
+ color: #2491CF;
+}
+
+pre {
+ background-color: transparent !important;
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.015em;
+ line-height: 120%;
+ padding: 0.5em;
+ border-right: 5px solid #ccc;
+ border-left: 5px solid #ccc;
+}
+
+pre a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td.linenos pre {
+ padding: 0.5em 0;
+}
+
+div.quotebar {
+ background-color: #f8f8f8;
+ max-width: 250px;
+ float: right;
+ padding: 2px 7px;
+ border: 1px solid #ccc;
+}
+
+nav.contents,
+aside.topic,
+div.topic {
+ background-color: #f8f8f8;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+ padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.admonition {
+ font-size: 0.9em;
+ margin: 1em 0 1em 0;
+ border: 3px solid #cccccc;
+ background-color: #f7f7f7;
+ padding: 0;
+}
+
+div.admonition p {
+ margin: 0.5em 1em 0.5em 1em;
+ padding: 0;
+}
+
+div.admonition li p {
+ margin-left: 0;
+}
+
+div.admonition pre, div.warning pre {
+ margin: 0;
+}
+
+div.highlight {
+ margin: 0.4em 1em;
+}
+
+div.admonition p.admonition-title {
+ margin: 0;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border-bottom: 3px solid #cccccc;
+ font-weight: bold;
+ background-color: #165e83;
+}
+
+div.danger { border: 3px solid #f0908d; background-color: #f0cfa0; }
+div.error { border: 3px solid #f0908d; background-color: #ede4cd; }
+div.warning { border: 3px solid #f8b862; background-color: #f0cfa0; }
+div.caution { border: 3px solid #f8b862; background-color: #ede4cd; }
+div.attention { border: 3px solid #f8b862; background-color: #f3f3f3; }
+div.important { border: 3px solid #f0cfa0; background-color: #ede4cd; }
+div.note { border: 3px solid #f0cfa0; background-color: #f3f3f3; }
+div.hint { border: 3px solid #bed2c3; background-color: #f3f3f3; }
+div.tip { border: 3px solid #bed2c3; background-color: #f3f3f3; }
+
+div.danger p.admonition-title, div.error p.admonition-title {
+ background-color: #b7282e;
+ border-bottom: 3px solid #f0908d;
+}
+
+div.caution p.admonition-title,
+div.warning p.admonition-title,
+div.attention p.admonition-title {
+ background-color: #f19072;
+ border-bottom: 3px solid #f8b862;
+}
+
+div.note p.admonition-title, div.important p.admonition-title {
+ background-color: #f8b862;
+ border-bottom: 3px solid #f0cfa0;
+}
+
+div.hint p.admonition-title, div.tip p.admonition-title {
+ background-color: #7ebea5;
+ border-bottom: 3px solid #bed2c3;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+ margin: 0.1em 0.5em 0.5em 3em;
+ padding: 0;
+}
+
+div.versioninfo {
+ margin: 1em 0 0 0;
+ border: 1px solid #ccc;
+ background-color: #DDEAF0;
+ padding: 8px;
+ line-height: 1.3em;
+ font-size: 0.9em;
+}
+
+.viewcode-back {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
+
+p.versionchanged span.versionmodified {
+ font-size: 0.9em;
+ margin-right: 0.2em;
+ padding: 0.1em;
+ background-color: #DCE6A0;
+}
+
+dl.field-list > dt {
+ color: white;
+ background-color: #82A0BE;
+}
+
+dl.field-list > dd {
+ background-color: #f7f7f7;
+}
+
+/* -- table styles ---------------------------------------------------------- */
+
+table.docutils {
+ margin: 1em 0;
+ padding: 0;
+ border: 1px solid white;
+ background-color: #f7f7f7;
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 1px solid white;
+ border-bottom: 1px solid white;
+}
+
+table.docutils td p {
+ margin-top: 0;
+ margin-bottom: 0.3em;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+ word-break: break-word;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ color: white;
+ text-align: left;
+ padding-right: 5px;
+ background-color: #82A0BE;
+}
+
+div.literal-block-wrapper div.code-block-caption {
+ background-color: #EEE;
+ border-style: solid;
+ border-color: #CCC;
+ border-width: 1px 5px;
+}
+
+/* WIDE DESKTOP STYLE */
+@media only screen and (min-width: 1176px) {
+body {
+ margin: 0 40px 0 40px;
+}
+}
+
+/* TABLET STYLE */
+@media only screen and (min-width: 768px) and (max-width: 991px) {
+body {
+ margin: 0 40px 0 40px;
+}
+}
+
+/* MOBILE LAYOUT (PORTRAIT/320px) */
+@media only screen and (max-width: 767px) {
+body {
+ margin: 0;
+}
+div.bodywrapper {
+ margin: 0;
+ width: 100%;
+ border: none;
+}
+div.sphinxsidebar {
+ display: none;
+}
+}
+
+/* MOBILE LAYOUT (LANDSCAPE/480px) */
+@media only screen and (min-width: 480px) and (max-width: 767px) {
+body {
+ margin: 0 20px 0 20px;
+}
+}
+
+/* RETINA OVERRIDES */
+@media
+only screen and (-webkit-min-device-pixel-ratio: 2),
+only screen and (min-device-pixel-ratio: 2) {
+}
+
+/* -- end ------------------------------------------------------------------- */
diff --git a/sphinx/themes/bizstyle/static/bizstyle.js_t b/sphinx/themes/bizstyle/static/bizstyle.js_t
new file mode 100644
index 0000000..fd0865e
--- /dev/null
+++ b/sphinx/themes/bizstyle/static/bizstyle.js_t
@@ -0,0 +1,30 @@
+//
+// bizstyle.js
+// ~~~~~~~~~~~
+//
+// Sphinx javascript -- for bizstyle theme.
+//
+// This theme was created by referring to 'sphinxdoc'
+//
+// :copyright: Copyright 2007-2023 by Sphinx team, see AUTHORS.
+// :license: BSD, see LICENSE for details.
+//
+const initialiseBizStyle = () => {
+ if (navigator.userAgent.indexOf("iPhone") > 0 || navigator.userAgent.indexOf("Android") > 0) {
+ document.querySelector("li.nav-item-0 a").innerText = "Top"
+ }
+ const truncator = item => {if (item.textContent.length > 20) {
+ item.title = item.innerText
+ item.innerText = item.innerText.substr(0, 17) + "..."
+ }
+ }
+ document.querySelectorAll("div.related:first ul li:not(.right) a").slice(1).forEach(truncator);
+ document.querySelectorAll("div.related:last ul li:not(.right) a").slice(1).forEach(truncator);
+}
+
+window.addEventListener("resize",
+ () => (document.querySelector("li.nav-item-0 a").innerText = (window.innerWidth <= 776) ? "Top" : "{{ shorttitle|e }}")
+)
+
+if (document.readyState !== "loading") initialiseBizStyle()
+else document.addEventListener("DOMContentLoaded", initialiseBizStyle)
diff --git a/sphinx/themes/bizstyle/static/css3-mediaqueries.js b/sphinx/themes/bizstyle/static/css3-mediaqueries.js
new file mode 100644
index 0000000..59735f5
--- /dev/null
+++ b/sphinx/themes/bizstyle/static/css3-mediaqueries.js
@@ -0,0 +1 @@
+if(typeof Object.create!=="function"){Object.create=function(e){function t(){}t.prototype=e;return new t}}var ua={toString:function(){return navigator.userAgent},test:function(e){return this.toString().toLowerCase().indexOf(e.toLowerCase())>-1}};ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];ua.webkit=ua.test("webkit");ua.gecko=ua.test("gecko")&&!ua.webkit;ua.opera=ua.test("opera");ua.ie=ua.test("msie")&&!ua.opera;ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";var domReady=function(){var e=[];var t=function(){if(!arguments.callee.done){arguments.callee.done=true;for(var t=0;t<e.length;t++){e[t]()}}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",t,false)}if(ua.ie){(function(){try{document.documentElement.doScroll("left")}catch(e){setTimeout(arguments.callee,50);return}t()})();document.onreadystatechange=function(){if(document.readyState==="complete"){document.onreadystatechange=null;t()}}}if(ua.webkit&&document.readyState){(function(){if(document.readyState!=="loading"){t()}else{setTimeout(arguments.callee,10)}})()}window.onload=t;return function(t){if(typeof t==="function"){e[e.length]=t}return t}}();var cssHelper=function(){var e={BLOCKS:/[^\s{;][^{;]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,BLOCKS_INSIDE:/[^\s{][^{]*\{[^{}]*\}/g,DECLARATIONS:/[a-zA-Z\-]+[^;]*:[^;]+;/g,RELATIVE_URLS:/url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,REDUNDANT_COMPONENTS:/(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,REDUNDANT_WHITESPACE:/\s*(,|:|;|\{|\})\s*/g,WHITESPACE_IN_PARENTHESES:/\(\s*(\S*)\s*\)/g,MORE_WHITESPACE:/\s{2,}/g,FINAL_SEMICOLONS:/;\}/g,NOT_WHITESPACE:/\S+/g};var t,n=false;var r=[];var s=function(e){if(typeof e==="function"){r[r.length]=e}};var o=function(){for(var e=0;e<r.length;e++){r[e](t)}};var u={};var a=function(e,t){if(u[e]){var n=u[e].listeners;if(n){for(var r=0;r<n.length;r++){n[r](t)}}}};var f=function(e,t,n){if(ua.ie&&!window.XMLHttpRequest){window.XMLHttpRequest=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}if(!XMLHttpRequest){return""}var r=new XMLHttpRequest;try{r.open("get",e,true);r.setRequestHeader("X_REQUESTED_WITH","XMLHttpRequest")}catch(i){n();return}var s=false;setTimeout(function(){s=true},5e3);document.documentElement.style.cursor="progress";r.onreadystatechange=function(){if(r.readyState===4&&!s){if(!r.status&&location.protocol==="file:"||r.status>=200&&r.status<300||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){t(r.responseText)}else{n()}document.documentElement.style.cursor="";r=null}};r.send("")};var l=function(t){t=t.replace(e.REDUNDANT_COMPONENTS,"");t=t.replace(e.REDUNDANT_WHITESPACE,"$1");t=t.replace(e.WHITESPACE_IN_PARENTHESES,"($1)");t=t.replace(e.MORE_WHITESPACE," ");t=t.replace(e.FINAL_SEMICOLONS,"}");return t};var c={stylesheet:function(t){var n={};var r=[],i=[],s=[],o=[];var u=t.cssHelperText;var a=t.getAttribute("media");if(a){var f=a.toLowerCase().split(",")}else{var f=["all"]}for(var l=0;l<f.length;l++){r[r.length]=c.mediaQuery(f[l],n)}var h=u.match(e.BLOCKS);if(h!==null){for(var l=0;l<h.length;l++){if(h[l].substring(0,7)==="@media "){var p=c.mediaQueryList(h[l],n);s=s.concat(p.getRules());i[i.length]=p}else{s[s.length]=o[o.length]=c.rule(h[l],n,null)}}}n.element=t;n.getCssText=function(){return u};n.getAttrMediaQueries=function(){return r};n.getMediaQueryLists=function(){return i};n.getRules=function(){return s};n.getRulesWithoutMQ=function(){return o};return n},mediaQueryList:function(t,n){var r={};var i=t.indexOf("{");var s=t.substring(0,i);t=t.substring(i+1,t.length-1);var o=[],u=[];var a=s.toLowerCase().substring(7).split(",");for(var f=0;f<a.length;f++){o[o.length]=c.mediaQuery(a[f],r)}var l=t.match(e.BLOCKS_INSIDE);if(l!==null){for(f=0;f<l.length;f++){u[u.length]=c.rule(l[f],n,r)}}r.type="mediaQueryList";r.getMediaQueries=function(){return o};r.getRules=function(){return u};r.getListText=function(){return s};r.getCssText=function(){return t};return r},mediaQuery:function(t,n){t=t||"";var r,i;if(n.type==="mediaQueryList"){r=n}else{i=n}var s=false,o;var u=[];var a=true;var f=t.match(e.NOT_WHITESPACE);for(var l=0;l<f.length;l++){var c=f[l];if(!o&&(c==="not"||c==="only")){if(c==="not"){s=true}}else if(!o){o=c}else if(c.charAt(0)==="("){var h=c.substring(1,c.length-1).split(":");u[u.length]={mediaFeature:h[0],value:h[1]||null}}}return{getQueryText:function(){return t},getAttrStyleSheet:function(){return i||null},getList:function(){return r||null},getValid:function(){return a},getNot:function(){return s},getMediaType:function(){return o},getExpressions:function(){return u}}},rule:function(e,t,n){var r={};var i=e.indexOf("{");var s=e.substring(0,i);var o=s.split(",");var u=[];var a=e.substring(i+1,e.length-1).split(";");for(var f=0;f<a.length;f++){u[u.length]=c.declaration(a[f],r)}r.getStylesheet=function(){return t||null};r.getMediaQueryList=function(){return n||null};r.getSelectors=function(){return o};r.getSelectorText=function(){return s};r.getDeclarations=function(){return u};r.getPropertyValue=function(e){for(var t=0;t<u.length;t++){if(u[t].getProperty()===e){return u[t].getValue()}}return null};return r},declaration:function(e,t){var n=e.indexOf(":");var r=e.substring(0,n);var i=e.substring(n+1);return{getRule:function(){return t||null},getProperty:function(){return r},getValue:function(){return i}}}};var h=function(e){if(typeof e.cssHelperText!=="string"){return}var n={stylesheet:null,mediaQueryLists:[],rules:[],selectors:{},declarations:[],properties:{}};var r=n.stylesheet=c.stylesheet(e);var s=n.mediaQueryLists=r.getMediaQueryLists();var o=n.rules=r.getRules();var u=n.selectors;var a=function(e){var t=e.getSelectors();for(var n=0;n<t.length;n++){var r=t[n];if(!u[r]){u[r]=[]}u[r][u[r].length]=e}};for(i=0;i<o.length;i++){a(o[i])}var f=n.declarations;for(i=0;i<o.length;i++){f=n.declarations=f.concat(o[i].getDeclarations())}var l=n.properties;for(i=0;i<f.length;i++){var h=f[i].getProperty();if(!l[h]){l[h]=[]}l[h][l[h].length]=f[i]}e.cssHelperParsed=n;t[t.length]=e;return n};var p=function(e,t){return;e.cssHelperText=l(t||e.innerHTML);return h(e)};var d=function(){n=true;t=[];var r=[];var i=function(){for(var e=0;e<r.length;e++){h(r[e])}var t=document.getElementsByTagName("style");for(e=0;e<t.length;e++){p(t[e])}n=false;o()};var s=document.getElementsByTagName("link");for(var u=0;u<s.length;u++){var a=s[u];if(a.getAttribute("rel").indexOf("style")>-1&&a.href&&a.href.length!==0&&!a.disabled){r[r.length]=a}}if(r.length>0){var c=0;var d=function(){c++;if(c===r.length){i()}};var v=function(t){var n=t.href;f(n,function(r){r=l(r).replace(e.RELATIVE_URLS,"url("+n.substring(0,n.lastIndexOf("/"))+"/$1)");t.cssHelperText=r;d()},d)};for(u=0;u<r.length;u++){v(r[u])}}else{i()}};var v={stylesheets:"array",mediaQueryLists:"array",rules:"array",selectors:"object",declarations:"array",properties:"object"};var m={stylesheets:null,mediaQueryLists:null,rules:null,selectors:null,declarations:null,properties:null};var g=function(e,t){if(m[e]!==null){if(v[e]==="array"){return m[e]=m[e].concat(t)}else{var n=m[e];for(var r in t){if(t.hasOwnProperty(r)){if(!n[r]){n[r]=t[r]}else{n[r]=n[r].concat(t[r])}}}return n}}};var y=function(e){m[e]=v[e]==="array"?[]:{};for(var n=0;n<t.length;n++){var r=e==="stylesheets"?"stylesheet":e;g(e,t[n].cssHelperParsed[r])}return m[e]};var b=function(e){if(typeof window.innerWidth!="undefined"){return window["inner"+e]}else if(typeof document.documentElement!=="undefined"&&typeof document.documentElement.clientWidth!=="undefined"&&document.documentElement.clientWidth!=0){return document.documentElement["client"+e]}};return{addStyle:function(e,t,n){var r=document.createElement("style");r.setAttribute("type","text/css");if(t&&t.length>0){r.setAttribute("media",t.join(","))}document.getElementsByTagName("head")[0].appendChild(r);if(r.styleSheet){r.styleSheet.cssText=e}else{r.appendChild(document.createTextNode(e))}r.addedWithCssHelper=true;if(typeof n==="undefined"||n===true){cssHelper.parsed(function(t){var n=p(r,e);for(var i in n){if(n.hasOwnProperty(i)){g(i,n[i])}}a("newStyleParsed",r)})}else{r.parsingDisallowed=true}return r},removeStyle:function(e){return e.parentNode.removeChild(e)},parsed:function(e){if(n){s(e)}else{if(typeof t!=="undefined"){if(typeof e==="function"){e(t)}}else{s(e);d()}}},stylesheets:function(e){cssHelper.parsed(function(t){e(m.stylesheets||y("stylesheets"))})},mediaQueryLists:function(e){cssHelper.parsed(function(t){e(m.mediaQueryLists||y("mediaQueryLists"))})},rules:function(e){cssHelper.parsed(function(t){e(m.rules||y("rules"))})},selectors:function(e){cssHelper.parsed(function(t){e(m.selectors||y("selectors"))})},declarations:function(e){cssHelper.parsed(function(t){e(m.declarations||y("declarations"))})},properties:function(e){cssHelper.parsed(function(t){e(m.properties||y("properties"))})},broadcast:a,addListener:function(e,t){if(typeof t==="function"){if(!u[e]){u[e]={listeners:[]}}u[e].listeners[u[e].listeners.length]=t}},removeListener:function(e,t){if(typeof t==="function"&&u[e]){var n=u[e].listeners;for(var r=0;r<n.length;r++){if(n[r]===t){n.splice(r,1);r-=1}}}},getViewportWidth:function(){return b("Width")},getViewportHeight:function(){return b("Height")}}}();domReady(function(){var t;var n={LENGTH_UNIT:/[0-9]+(em|ex|px|in|cm|mm|pt|pc)$/,RESOLUTION_UNIT:/[0-9]+(dpi|dpcm)$/,ASPECT_RATIO:/^[0-9]+\/[0-9]+$/,ABSOLUTE_VALUE:/^[0-9]*(\.[0-9]+)*$/};var r=[];var i=function(){var e="css3-mediaqueries-test";var t=document.createElement("div");t.id=e;var n=cssHelper.addStyle("@media all and (width) { #"+e+" { width: 1px !important; } }",[],false);document.body.appendChild(t);var r=t.offsetWidth===1;n.parentNode.removeChild(n);t.parentNode.removeChild(t);i=function(){return r};return r};var s=function(){t=document.createElement("div");t.style.cssText="position:absolute;top:-9999em;left:-9999em;"+"margin:0;border:none;padding:0;width:1em;font-size:1em;";document.body.appendChild(t);if(t.offsetWidth!==16){t.style.fontSize=16/t.offsetWidth+"em"}t.style.width=""};var o=function(e){t.style.width=e;var n=t.offsetWidth;t.style.width="";return n};var u=function(e,t){var r=e.length;var i=e.substring(0,4)==="min-";var s=!i&&e.substring(0,4)==="max-";if(t!==null){var u;var a;if(n.LENGTH_UNIT.exec(t)){u="length";a=o(t)}else if(n.RESOLUTION_UNIT.exec(t)){u="resolution";a=parseInt(t,10);var f=t.substring((a+"").length)}else if(n.ASPECT_RATIO.exec(t)){u="aspect-ratio";a=t.split("/")}else if(n.ABSOLUTE_VALUE){u="absolute";a=t}else{u="unknown"}}var l,c;if("device-width"===e.substring(r-12,r)){l=screen.width;if(t!==null){if(u==="length"){return i&&l>=a||s&&l<a||!i&&!s&&l===a}else{return false}}else{return l>0}}else if("device-height"===e.substring(r-13,r)){c=screen.height;if(t!==null){if(u==="length"){return i&&c>=a||s&&c<a||!i&&!s&&c===a}else{return false}}else{return c>0}}else if("width"===e.substring(r-5,r)){l=document.documentElement.clientWidth||document.body.clientWidth;if(t!==null){if(u==="length"){return i&&l>=a||s&&l<a||!i&&!s&&l===a}else{return false}}else{return l>0}}else if("height"===e.substring(r-6,r)){c=document.documentElement.clientHeight||document.body.clientHeight;if(t!==null){if(u==="length"){return i&&c>=a||s&&c<a||!i&&!s&&c===a}else{return false}}else{return c>0}}else if("device-aspect-ratio"===e.substring(r-19,r)){return u==="aspect-ratio"&&screen.width*a[1]===screen.height*a[0]}else if("color-index"===e.substring(r-11,r)){var h=Math.pow(2,screen.colorDepth);if(t!==null){if(u==="absolute"){return i&&h>=a||s&&h<a||!i&&!s&&h===a}else{return false}}else{return h>0}}else if("color"===e.substring(r-5,r)){var p=screen.colorDepth;if(t!==null){if(u==="absolute"){return i&&p>=a||s&&p<a||!i&&!s&&p===a}else{return false}}else{return p>0}}else if("resolution"===e.substring(r-10,r)){var d;if(f==="dpcm"){d=o("1cm")}else{d=o("1in")}if(t!==null){if(u==="resolution"){return i&&d>=a||s&&d<a||!i&&!s&&d===a}else{return false}}else{return d>0}}else{return false}};var a=function(e){var t=e.getValid();var n=e.getExpressions();var r=n.length;if(r>0){for(var i=0;i<r&&t;i++){t=u(n[i].mediaFeature,n[i].value)}var s=e.getNot();return t&&!s||s&&!t}return t};var f=function(e,t){var n=e.getMediaQueries();var i={};for(var s=0;s<n.length;s++){var o=n[s].getMediaType();if(n[s].getExpressions().length===0){continue}var u=true;if(o!=="all"&&t&&t.length>0){u=false;for(var f=0;f<t.length;f++){if(t[f]===o){u=true}}}if(u&&a(n[s])){i[o]=true}}var l=[],c=0;for(var h in i){if(i.hasOwnProperty(h)){if(c>0){l[c++]=","}l[c++]=h}}if(l.length>0){r[r.length]=cssHelper.addStyle("@media "+l.join("")+"{"+e.getCssText()+"}",t,false)}};var l=function(e,t){for(var n=0;n<e.length;n++){f(e[n],t)}};var c=function(e){var t=e.getAttrMediaQueries();var n=false;var i={};for(var s=0;s<t.length;s++){if(a(t[s])){i[t[s].getMediaType()]=t[s].getExpressions().length>0}}var o=[],u=[];for(var f in i){if(i.hasOwnProperty(f)){o[o.length]=f;if(i[f]){u[u.length]=f}if(f==="all"){n=true}}}if(u.length>0){r[r.length]=cssHelper.addStyle(e.getCssText(),u,false)}var c=e.getMediaQueryLists();if(n){l(c)}else{l(c,o)}};var h=function(e){for(var t=0;t<e.length;t++){c(e[t])}if(ua.ie){document.documentElement.style.display="block";setTimeout(function(){document.documentElement.style.display=""},0);setTimeout(function(){cssHelper.broadcast("cssMediaQueriesTested")},100)}else{cssHelper.broadcast("cssMediaQueriesTested")}};var p=function(){for(var e=0;e<r.length;e++){cssHelper.removeStyle(r[e])}r=[];cssHelper.stylesheets(h)};var d=0;var v=function(){var e=cssHelper.getViewportWidth();var t=cssHelper.getViewportHeight();if(ua.ie){var n=document.createElement("div");n.style.position="absolute";n.style.top="-9999em";n.style.overflow="scroll";document.body.appendChild(n);d=n.offsetWidth-n.clientWidth;document.body.removeChild(n)}var r;var s=function(){var n=cssHelper.getViewportWidth();var s=cssHelper.getViewportHeight();if(Math.abs(n-e)>d||Math.abs(s-t)>d){e=n;t=s;clearTimeout(r);r=setTimeout(function(){if(!i()){p()}else{cssHelper.broadcast("cssMediaQueriesTested")}},500)}};window.onresize=function(){var e=window.onresize||function(){};return function(){e();s()}}()};var m=document.documentElement;m.style.marginLeft="-32767px";setTimeout(function(){m.style.marginLeft=""},5e3);return function(){if(!i()){cssHelper.addListener("newStyleParsed",function(e){c(e.cssHelperParsed.stylesheet)});cssHelper.addListener("cssMediaQueriesTested",function(){if(ua.ie){m.style.width="1px"}setTimeout(function(){m.style.width="";m.style.marginLeft=""},0);cssHelper.removeListener("cssMediaQueriesTested",arguments.callee)});s();p()}else{m.style.marginLeft=""}v()}}());try{document.execCommand("BackgroundImageCache",false,true)}catch(e){}
diff --git a/sphinx/themes/bizstyle/static/css3-mediaqueries_src.js b/sphinx/themes/bizstyle/static/css3-mediaqueries_src.js
new file mode 100644
index 0000000..7878620
--- /dev/null
+++ b/sphinx/themes/bizstyle/static/css3-mediaqueries_src.js
@@ -0,0 +1,1104 @@
+/*
+css3-mediaqueries.js - CSS Helper and CSS3 Media Queries Enabler
+
+author: Wouter van der Graaf <wouter at dynora nl>
+version: 1.0 (20110330)
+license: MIT
+website: http://code.google.com/p/css3-mediaqueries-js/
+
+W3C spec: http://www.w3.org/TR/css3-mediaqueries/
+
+Note: use of embedded <style> is not recommended when using media queries, because IE has no way of returning the raw literal css text from a <style> element.
+*/
+
+
+// true prototypal inheritance (http://javascript.crockford.com/prototypal.html)
+if (typeof Object.create !== 'function') {
+ Object.create = function (o) {
+ function F() {}
+ F.prototype = o;
+ return new F();
+ };
+}
+
+
+// user agent sniffing shortcuts
+var ua = {
+ toString: function () {
+ return navigator.userAgent;
+ },
+ test: function (s) {
+ return this.toString().toLowerCase().indexOf(s.toLowerCase()) > -1;
+ }
+};
+ua.version = (ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1];
+ua.webkit = ua.test('webkit');
+ua.gecko = ua.test('gecko') && !ua.webkit;
+ua.opera = ua.test('opera');
+ua.ie = ua.test('msie') && !ua.opera;
+ua.ie6 = ua.ie && document.compatMode && typeof document.documentElement.style.maxHeight === 'undefined';
+ua.ie7 = ua.ie && document.documentElement && typeof document.documentElement.style.maxHeight !== 'undefined' && typeof XDomainRequest === 'undefined';
+ua.ie8 = ua.ie && typeof XDomainRequest !== 'undefined';
+
+
+
+// initialize when DOM content is loaded
+var domReady = function () {
+ var fns = [];
+ var init = function () {
+ if (!arguments.callee.done) { // run init functions once
+ arguments.callee.done = true;
+ for (var i = 0; i < fns.length; i++) {
+ fns[i]();
+ }
+ }
+ };
+
+ // listeners for different browsers
+ if (document.addEventListener) {
+ document.addEventListener('DOMContentLoaded', init, false);
+ }
+ if (ua.ie) {
+ (function () {
+ try {
+ // throws errors until after ondocumentready
+ document.documentElement.doScroll('left');
+ }
+ catch (e) {
+ setTimeout(arguments.callee, 50);
+ return;
+ }
+ // no errors, fire
+ init();
+ })();
+ // trying to always fire before onload
+ document.onreadystatechange = function () {
+ if (document.readyState === 'complete') {
+ document.onreadystatechange = null;
+ init();
+ }
+ };
+ }
+ if (ua.webkit && document.readyState) {
+ (function () {
+ if (document.readyState !== 'loading') {
+ init();
+ }
+ else {
+ setTimeout(arguments.callee, 10);
+ }
+ })();
+ }
+ window.onload = init; // fallback
+
+ return function (fn) { // add fn to init functions
+ if (typeof fn === 'function') {
+ fns[fns.length] = fn;
+ }
+ return fn;
+ };
+}();
+
+
+
+// helper library for parsing css to objects
+var cssHelper = function () {
+
+ var regExp = {
+ BLOCKS: /[^\s{;][^{;]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,
+ BLOCKS_INSIDE: /[^\s{][^{]*\{[^{}]*\}/g,
+ DECLARATIONS: /[a-zA-Z\-]+[^;]*:[^;]+;/g,
+ RELATIVE_URLS: /url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,
+ // strip whitespace and comments, @import is evil
+ REDUNDANT_COMPONENTS: /(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,
+ REDUNDANT_WHITESPACE: /\s*(,|:|;|\{|\})\s*/g,
+ WHITESPACE_IN_PARENTHESES: /\(\s*(\S*)\s*\)/g,
+ MORE_WHITESPACE: /\s{2,}/g,
+ FINAL_SEMICOLONS: /;\}/g,
+ NOT_WHITESPACE: /\S+/g
+ };
+
+ var parsed, parsing = false;
+
+ var waiting = [];
+ var wait = function (fn) {
+ if (typeof fn === 'function') {
+ waiting[waiting.length] = fn;
+ }
+ };
+ var ready = function () {
+ for (var i = 0; i < waiting.length; i++) {
+ waiting[i](parsed);
+ }
+ };
+ var events = {};
+ var broadcast = function (n, v) {
+ if (events[n]) {
+ var listeners = events[n].listeners;
+ if (listeners) {
+ for (var i = 0; i < listeners.length; i++) {
+ listeners[i](v);
+ }
+ }
+ }
+ };
+
+ var requestText = function (url, fnSuccess, fnFailure) {
+ if (ua.ie && !window.XMLHttpRequest) {
+ window.XMLHttpRequest = function () {
+ return new ActiveXObject('Microsoft.XMLHTTP');
+ };
+ }
+ if (!XMLHttpRequest) {
+ return '';
+ }
+ var r = new XMLHttpRequest();
+ try {
+ r.open('get', url, true);
+ r.setRequestHeader('X_REQUESTED_WITH', 'XMLHttpRequest');
+ }
+ catch (e) {
+ fnFailure();
+ return;
+ }
+ var done = false;
+ setTimeout(function () {
+ done = true;
+ }, 5000);
+ document.documentElement.style.cursor = 'progress';
+ r.onreadystatechange = function () {
+ if (r.readyState === 4 && !done) {
+ if (!r.status && location.protocol === 'file:' ||
+ (r.status >= 200 && r.status < 300) ||
+ r.status === 304 ||
+ navigator.userAgent.indexOf('Safari') > -1 && typeof r.status === 'undefined') {
+ fnSuccess(r.responseText);
+ }
+ else {
+ fnFailure();
+ }
+ document.documentElement.style.cursor = '';
+ r = null; // avoid memory leaks
+ }
+ };
+ r.send('');
+ };
+
+ var sanitize = function (text) {
+ text = text.replace(regExp.REDUNDANT_COMPONENTS, '');
+ text = text.replace(regExp.REDUNDANT_WHITESPACE, '$1');
+ text = text.replace(regExp.WHITESPACE_IN_PARENTHESES, '($1)');
+ text = text.replace(regExp.MORE_WHITESPACE, ' ');
+ text = text.replace(regExp.FINAL_SEMICOLONS, '}'); // optional final semicolons
+ return text;
+ };
+
+ var objects = {
+ stylesheet: function (el) {
+ var o = {};
+ var amqs = [], mqls = [], rs = [], rsw = [];
+ var s = el.cssHelperText;
+
+ // add attribute media queries
+ var attr = el.getAttribute('media');
+ if (attr) {
+ var qts = attr.toLowerCase().split(',')
+ }
+ else {
+ var qts = ['all'] // imply 'all'
+ }
+ for (var i = 0; i < qts.length; i++) {
+ amqs[amqs.length] = objects.mediaQuery(qts[i], o);
+ }
+
+ // add media query lists and rules (top down order)
+ var blocks = s.match(regExp.BLOCKS); // @charset is not a block
+ if (blocks !== null) {
+ for (var i = 0; i < blocks.length; i++) {
+ if (blocks[i].substring(0, 7) === '@media ') { // media query (list)
+ var mql = objects.mediaQueryList(blocks[i], o);
+ rs = rs.concat(mql.getRules());
+ mqls[mqls.length] = mql;
+ }
+ else { // regular rule set, page context (@page) or font description (@font-face)
+ rs[rs.length] = rsw[rsw.length] = objects.rule(blocks[i], o, null);
+ }
+ }
+ }
+
+ o.element = el;
+ o.getCssText = function () {
+ return s;
+ };
+ o.getAttrMediaQueries = function () {
+ return amqs;
+ };
+ o.getMediaQueryLists = function () {
+ return mqls;
+ };
+ o.getRules = function () {
+ return rs;
+ };
+ o.getRulesWithoutMQ = function () {
+ return rsw;
+ };
+ return o;
+ },
+
+ mediaQueryList: function (s, stsh) {
+ var o = {};
+ var idx = s.indexOf('{');
+ var lt = s.substring(0, idx);
+ s = s.substring(idx + 1, s.length - 1);
+ var mqs = [], rs = [];
+
+ // add media queries
+ var qts = lt.toLowerCase().substring(7).split(',');
+ for (var i = 0; i < qts.length; i++) { // parse each media query
+ mqs[mqs.length] = objects.mediaQuery(qts[i], o);
+ }
+
+ // add rule sets
+ var rts = s.match(regExp.BLOCKS_INSIDE);
+ if (rts !== null) {
+ for (i = 0; i < rts.length; i++) {
+ rs[rs.length] = objects.rule(rts[i], stsh, o);
+ }
+ }
+
+ o.type = 'mediaQueryList';
+ o.getMediaQueries = function () {
+ return mqs;
+ };
+ o.getRules = function () {
+ return rs;
+ };
+ o.getListText = function () {
+ return lt;
+ };
+ o.getCssText = function () {
+ return s;
+ };
+ return o;
+ },
+
+ mediaQuery: function (s, listOrSheet) {
+ s = s || '';
+ var mql, stsh;
+ if (listOrSheet.type === 'mediaQueryList') {
+ mql = listOrSheet;
+ }
+ else {
+ stsh = listOrSheet;
+ }
+ var not = false, type;
+ var expr = [];
+ var valid = true;
+ var tokens = s.match(regExp.NOT_WHITESPACE);
+
+
+
+ for (var i = 0; i < tokens.length; i++) {
+ var token = tokens[i];
+ if (!type && (token === 'not' || token === 'only')) { // 'not' and 'only' keywords
+ // keyword 'only' does nothing, as if it was not present
+ if (token === 'not') {
+ not = true;
+ }
+ }
+ else if (!type) { // media type
+ type = token;
+ }
+ else if (token.charAt(0) === '(') { // media feature expression
+ var pair = token.substring(1, token.length - 1).split(':');
+ expr[expr.length] = {
+ mediaFeature: pair[0],
+ value: pair[1] || null
+ };
+ }
+ }
+
+ return {
+ getQueryText: function () {
+ return s;
+ },
+ getAttrStyleSheet: function () {
+ return stsh || null;
+ },
+ getList: function () {
+ return mql || null;
+ },
+ getValid: function () {
+ return valid;
+ },
+ getNot: function () {
+ return not;
+ },
+ getMediaType: function () {
+ return type;
+ },
+ getExpressions: function () {
+ return expr;
+ }
+ };
+ },
+
+ rule: function (s, stsh, mql) {
+ var o = {};
+ var idx = s.indexOf('{');
+ var st = s.substring(0, idx);
+ var ss = st.split(',');
+ var ds = [];
+ var dts = s.substring(idx + 1, s.length - 1).split(';');
+ for (var i = 0; i < dts.length; i++) {
+ ds[ds.length] = objects.declaration(dts[i], o);
+ }
+
+ o.getStylesheet = function () {
+ return stsh || null;
+ };
+ o.getMediaQueryList = function () {
+ return mql || null;
+ };
+ o.getSelectors = function () {
+ return ss;
+ };
+ o.getSelectorText = function () {
+ return st;
+ };
+ o.getDeclarations = function () {
+ return ds;
+ };
+ o.getPropertyValue = function (n) {
+ for (var i = 0; i < ds.length; i++) {
+ if (ds[i].getProperty() === n) {
+ return ds[i].getValue();
+ }
+ }
+ return null;
+ };
+ return o;
+ },
+
+ declaration: function (s, r) {
+ var idx = s.indexOf(':');
+ var p = s.substring(0, idx);
+ var v = s.substring(idx + 1);
+ return {
+ getRule: function () {
+ return r || null;
+ },
+ getProperty: function () {
+ return p;
+ },
+ getValue: function () {
+ return v;
+ }
+ };
+ }
+ };
+
+ var parseText = function (el) {
+ if (typeof el.cssHelperText !== 'string') {
+ return;
+ }
+ var o = {
+ stylesheet: null,
+ mediaQueryLists: [],
+ rules: [],
+ selectors: {},
+ declarations: [],
+ properties: {}
+ };
+
+ // build stylesheet object
+ var stsh = o.stylesheet = objects.stylesheet(el);
+
+ // collect media query lists
+ var mqls = o.mediaQueryLists = stsh.getMediaQueryLists();
+
+ // collect all rules
+ var ors = o.rules = stsh.getRules();
+
+ // collect all selectors
+ var oss = o.selectors;
+ var collectSelectors = function (r) {
+ var ss = r.getSelectors();
+ for (var i = 0; i < ss.length; i++) {
+ var n = ss[i];
+ if (!oss[n]) {
+ oss[n] = [];
+ }
+ oss[n][oss[n].length] = r;
+ }
+ };
+ for (var i = 0; i < ors.length; i++) {
+ collectSelectors(ors[i]);
+ }
+
+ // collect all declarations
+ var ods = o.declarations;
+ for (i = 0; i < ors.length; i++) {
+ ods = o.declarations = ods.concat(ors[i].getDeclarations());
+ }
+
+ // collect all properties
+ var ops = o.properties;
+ for (i = 0; i < ods.length; i++) {
+ var n = ods[i].getProperty();
+ if (!ops[n]) {
+ ops[n] = [];
+ }
+ ops[n][ops[n].length] = ods[i];
+ }
+
+ el.cssHelperParsed = o;
+ parsed[parsed.length] = el;
+ return o;
+ };
+
+ var parseEmbedded = function (el, s) {
+ return;
+ // This function doesn't work because of a bug in IE, where innerHTML gives us parsed css instead of raw literal.
+ el.cssHelperText = sanitize(s || el.innerHTML);
+ return parseText(el);
+ };
+
+ var parse = function () {
+ parsing = true;
+ parsed = [];
+ var linked = [];
+ var finish = function () {
+ for (var i = 0; i < linked.length; i++) {
+ parseText(linked[i]);
+ }
+ var styles = document.getElementsByTagName('style');
+ for (i = 0; i < styles.length; i++) {
+ parseEmbedded(styles[i]);
+ }
+ parsing = false;
+ ready();
+ };
+ var links = document.getElementsByTagName('link');
+ for (var i = 0; i < links.length; i++) {
+ var link = links[i];
+ if (link.getAttribute('rel').indexOf('style') > -1 && link.href && link.href.length !== 0 && !link.disabled) {
+ linked[linked.length] = link;
+ }
+ }
+ if (linked.length > 0) {
+ var c = 0;
+ var checkForFinish = function () {
+ c++;
+ if (c === linked.length) { // parse in right order, so after last link is read
+ finish();
+ }
+ };
+ var processLink = function (link) {
+ var href = link.href;
+ requestText(href, function (text) {
+ // fix url's
+ text = sanitize(text).replace(regExp.RELATIVE_URLS, 'url(' + href.substring(0, href.lastIndexOf('/')) + '/$1)');
+ link.cssHelperText = text;
+ checkForFinish();
+ }, checkForFinish);
+ };
+ for (i = 0; i < linked.length; i++) {
+ processLink(linked[i]);
+ }
+ }
+ else {
+ finish();
+ }
+ };
+
+ var types = {
+ stylesheets: 'array',
+ mediaQueryLists: 'array',
+ rules: 'array',
+ selectors: 'object',
+ declarations: 'array',
+ properties: 'object'
+ };
+
+ var collections = {
+ stylesheets: null,
+ mediaQueryLists: null,
+ rules: null,
+ selectors: null,
+ declarations: null,
+ properties: null
+ };
+
+ var addToCollection = function (name, v) {
+ if (collections[name] !== null) {
+ if (types[name] === 'array') {
+ return (collections[name] = collections[name].concat(v));
+ }
+ else {
+ var c = collections[name];
+ for (var n in v) {
+ if (v.hasOwnProperty(n)) {
+ if (!c[n]) {
+ c[n] = v[n];
+ }
+ else {
+ c[n] = c[n].concat(v[n]);
+ }
+ }
+ }
+ return c;
+ }
+ }
+ };
+
+ var collect = function (name) {
+ collections[name] = (types[name] === 'array') ? [] : {};
+ for (var i = 0; i < parsed.length; i++) {
+ var pname = name === 'stylesheets' ? 'stylesheet' : name; // the exception
+ addToCollection(name, parsed[i].cssHelperParsed[pname]);
+ }
+ return collections[name];
+ };
+
+ // viewport size
+ var getViewportSize = function (d) {
+ if (typeof window.innerWidth != 'undefined') {
+ return window['inner' + d];
+ }
+ else if (typeof document.documentElement !== 'undefined'
+ && typeof document.documentElement.clientWidth !== 'undefined'
+ && document.documentElement.clientWidth != 0) {
+ return document.documentElement['client' + d];
+ }
+ };
+
+ // public static functions
+ return {
+ addStyle: function (s, mediaTypes, process) {
+ var el = document.createElement('style');
+ el.setAttribute('type', 'text/css');
+ if (mediaTypes && mediaTypes.length > 0) {
+ el.setAttribute('media', mediaTypes.join(','));
+ }
+ document.getElementsByTagName('head')[0].appendChild(el);
+ if (el.styleSheet) { // IE
+ el.styleSheet.cssText = s;
+ }
+ else {
+ el.appendChild(document.createTextNode(s));
+ }
+ el.addedWithCssHelper = true;
+ if (typeof process === 'undefined' || process === true) {
+ cssHelper.parsed(function (parsed) {
+ var o = parseEmbedded(el, s);
+ for (var n in o) {
+ if (o.hasOwnProperty(n)) {
+ addToCollection(n, o[n]);
+ }
+ }
+ broadcast('newStyleParsed', el);
+ });
+ }
+ else {
+ el.parsingDisallowed = true;
+ }
+ return el;
+ },
+
+ removeStyle: function (el) {
+ return el.parentNode.removeChild(el);
+ },
+
+ parsed: function (fn) {
+ if (parsing) {
+ wait(fn);
+ }
+ else {
+ if (typeof parsed !== 'undefined') {
+ if (typeof fn === 'function') {
+ fn(parsed);
+ }
+ }
+ else {
+ wait(fn);
+ parse();
+ }
+ }
+ },
+
+ stylesheets: function (fn) {
+ cssHelper.parsed(function (parsed) {
+ fn(collections.stylesheets || collect('stylesheets'));
+ });
+ },
+
+ mediaQueryLists: function (fn) {
+ cssHelper.parsed(function (parsed) {
+ fn(collections.mediaQueryLists || collect('mediaQueryLists'));
+ });
+ },
+
+ rules: function (fn) {
+ cssHelper.parsed(function (parsed) {
+ fn(collections.rules || collect('rules'));
+ });
+ },
+
+ selectors: function (fn) {
+ cssHelper.parsed(function (parsed) {
+ fn(collections.selectors || collect('selectors'));
+ });
+ },
+
+ declarations: function (fn) {
+ cssHelper.parsed(function (parsed) {
+ fn(collections.declarations || collect('declarations'));
+ });
+ },
+
+ properties: function (fn) {
+ cssHelper.parsed(function (parsed) {
+ fn(collections.properties || collect('properties'));
+ });
+ },
+
+ broadcast: broadcast,
+
+ addListener: function (n, fn) { // in case n is 'styleadd': added function is called everytime style is added and parsed
+ if (typeof fn === 'function') {
+ if (!events[n]) {
+ events[n] = {
+ listeners: []
+ };
+ }
+ events[n].listeners[events[n].listeners.length] = fn;
+ }
+ },
+
+ removeListener: function (n, fn) {
+ if (typeof fn === 'function' && events[n]) {
+ var ls = events[n].listeners;
+ for (var i = 0; i < ls.length; i++) {
+ if (ls[i] === fn) {
+ ls.splice(i, 1);
+ i -= 1;
+ }
+ }
+ }
+ },
+
+ getViewportWidth: function () {
+ return getViewportSize('Width');
+ },
+
+ getViewportHeight: function () {
+ return getViewportSize('Height');
+ }
+ };
+}();
+
+
+
+// function to test and apply parsed media queries against browser capabilities
+domReady(function enableCssMediaQueries() {
+ var meter;
+
+ var regExp = {
+ LENGTH_UNIT: /[0-9]+(em|ex|px|in|cm|mm|pt|pc)$/,
+ RESOLUTION_UNIT: /[0-9]+(dpi|dpcm)$/,
+ ASPECT_RATIO: /^[0-9]+\/[0-9]+$/,
+ ABSOLUTE_VALUE: /^[0-9]*(\.[0-9]+)*$/
+ };
+
+ var styles = [];
+
+ var nativeSupport = function () {
+ // check support for media queries
+ var id = 'css3-mediaqueries-test';
+ var el = document.createElement('div');
+ el.id = id;
+ var style = cssHelper.addStyle('@media all and (width) { #' + id +
+ ' { width: 1px !important; } }', [], false); // false means don't parse this temp style
+ document.body.appendChild(el);
+ var ret = el.offsetWidth === 1;
+ style.parentNode.removeChild(style);
+ el.parentNode.removeChild(el);
+ nativeSupport = function () {
+ return ret;
+ };
+ return ret;
+ };
+
+ var createMeter = function () { // create measuring element
+ meter = document.createElement('div');
+ meter.style.cssText = 'position:absolute;top:-9999em;left:-9999em;' +
+ 'margin:0;border:none;padding:0;width:1em;font-size:1em;'; // cssText is needed for IE, works for the others
+ document.body.appendChild(meter);
+ // meter must have browser default font size of 16px
+ if (meter.offsetWidth !== 16) {
+ meter.style.fontSize = 16 / meter.offsetWidth + 'em';
+ }
+ meter.style.width = '';
+ };
+
+ var measure = function (value) {
+ meter.style.width = value;
+ var amount = meter.offsetWidth;
+ meter.style.width = '';
+ return amount;
+ };
+
+ var testMediaFeature = function (feature, value) {
+ // non-testable features: monochrome|min-monochrome|max-monochrome|scan|grid
+ var l = feature.length;
+ var min = (feature.substring(0, 4) === 'min-');
+ var max = (!min && feature.substring(0, 4) === 'max-');
+
+ if (value !== null) { // determine value type and parse to usable amount
+ var valueType;
+ var amount;
+ if (regExp.LENGTH_UNIT.exec(value)) {
+ valueType = 'length';
+ amount = measure(value);
+ }
+ else if (regExp.RESOLUTION_UNIT.exec(value)) {
+ valueType = 'resolution';
+ amount = parseInt(value, 10);
+ var unit = value.substring((amount + '').length);
+ }
+ else if (regExp.ASPECT_RATIO.exec(value)) {
+ valueType = 'aspect-ratio';
+ amount = value.split('/');
+ }
+ else if (regExp.ABSOLUTE_VALUE) {
+ valueType = 'absolute';
+ amount = value;
+ }
+ else {
+ valueType = 'unknown';
+ }
+ }
+
+ var width, height;
+ if ('device-width' === feature.substring(l - 12, l)) { // screen width
+ width = screen.width;
+ if (value !== null) {
+ if (valueType === 'length') {
+ return ((min && width >= amount) || (max && width < amount) || (!min && !max && width === amount));
+ }
+ else {
+ return false;
+ }
+ }
+ else { // test width without value
+ return width > 0;
+ }
+ }
+ else if ('device-height' === feature.substring(l - 13, l)) { // screen height
+ height = screen.height;
+ if (value !== null) {
+ if (valueType === 'length') {
+ return ((min && height >= amount) || (max && height < amount) || (!min && !max && height === amount));
+ }
+ else {
+ return false;
+ }
+ }
+ else { // test height without value
+ return height > 0;
+ }
+ }
+ else if ('width' === feature.substring(l - 5, l)) { // viewport width
+ width = document.documentElement.clientWidth || document.body.clientWidth; // the latter for IE quirks mode
+ if (value !== null) {
+ if (valueType === 'length') {
+ return ((min && width >= amount) || (max && width < amount) || (!min && !max && width === amount));
+ }
+ else {
+ return false;
+ }
+ }
+ else { // test width without value
+ return width > 0;
+ }
+ }
+ else if ('height' === feature.substring(l - 6, l)) { // viewport height
+ height = document.documentElement.clientHeight || document.body.clientHeight; // the latter for IE quirks mode
+ if (value !== null) {
+ if (valueType === 'length') {
+ return ((min && height >= amount) || (max && height < amount) || (!min && !max && height === amount));
+ }
+ else {
+ return false;
+ }
+ }
+ else { // test height without value
+ return height > 0;
+ }
+ }
+ else if ('device-aspect-ratio' === feature.substring(l - 19, l)) { // screen aspect ratio
+ return valueType === 'aspect-ratio' && screen.width * amount[1] === screen.height * amount[0];
+ }
+ else if ('color-index' === feature.substring(l - 11, l)) { // number of colors
+ var colors = Math.pow(2, screen.colorDepth);
+ if (value !== null) {
+ if (valueType === 'absolute') {
+ return ((min && colors >= amount) || (max && colors < amount) || (!min && !max && colors === amount));
+ }
+ else {
+ return false;
+ }
+ }
+ else { // test height without value
+ return colors > 0;
+ }
+ }
+ else if ('color' === feature.substring(l - 5, l)) { // bits per color component
+ var color = screen.colorDepth;
+ if (value !== null) {
+ if (valueType === 'absolute') {
+ return ((min && color >= amount) || (max && color < amount) || (!min && !max && color === amount));
+ }
+ else {
+ return false;
+ }
+ }
+ else { // test height without value
+ return color > 0;
+ }
+ }
+ else if ('resolution' === feature.substring(l - 10, l)) {
+ var res;
+ if (unit === 'dpcm') {
+ res = measure('1cm');
+ }
+ else {
+ res = measure('1in');
+ }
+ if (value !== null) {
+ if (valueType === 'resolution') {
+ return ((min && res >= amount) || (max && res < amount) || (!min && !max && res === amount));
+ }
+ else {
+ return false;
+ }
+ }
+ else { // test height without value
+ return res > 0;
+ }
+ }
+ else {
+ return false;
+ }
+ };
+
+ var testMediaQuery = function (mq) {
+ var test = mq.getValid();
+ var expressions = mq.getExpressions();
+ var l = expressions.length;
+ if (l > 0) {
+ for (var i = 0; i < l && test; i++) {
+ test = testMediaFeature(expressions[i].mediaFeature, expressions[i].value);
+ }
+ var not = mq.getNot();
+ return (test && !not || not && !test);
+ }
+ return test;
+ };
+
+ var testMediaQueryList = function (mql, ts) {
+ // ts is null or an array with any media type but 'all'.
+ var mqs = mql.getMediaQueries();
+ var t = {};
+ for (var i = 0; i < mqs.length; i++) {
+ var type = mqs[i].getMediaType();
+ if (mqs[i].getExpressions().length === 0) {
+ continue;
+ // TODO: Browser check! Assuming old browsers do apply the bare media types, even in a list with media queries.
+ }
+ var typeAllowed = true;
+ if (type !== 'all' && ts && ts.length > 0) {
+ typeAllowed = false;
+ for (var j = 0; j < ts.length; j++) {
+ if (ts[j] === type) {
+ typeAllowed = true;
+ }
+ }
+ }
+ if (typeAllowed && testMediaQuery(mqs[i])) {
+ t[type] = true;
+ }
+ }
+ var s = [], c = 0;
+ for (var n in t) {
+ if (t.hasOwnProperty(n)) {
+ if (c > 0) {
+ s[c++] = ',';
+ }
+ s[c++] = n;
+ }
+ }
+ if (s.length > 0) {
+ styles[styles.length] = cssHelper.addStyle('@media ' + s.join('') + '{' + mql.getCssText() + '}', ts, false);
+ }
+ };
+
+ var testMediaQueryLists = function (mqls, ts) {
+ for (var i = 0; i < mqls.length; i++) {
+ testMediaQueryList(mqls[i], ts);
+ }
+ };
+
+ var testStylesheet = function (stsh) {
+ var amqs = stsh.getAttrMediaQueries();
+ var allPassed = false;
+ var t = {};
+ for (var i = 0; i < amqs.length; i++) {
+ if (testMediaQuery(amqs[i])) {
+ t[amqs[i].getMediaType()] = amqs[i].getExpressions().length > 0;
+ }
+ }
+ var ts = [], tswe = [];
+ for (var n in t) {
+ if (t.hasOwnProperty(n)) {
+ ts[ts.length] = n;
+ if (t[n]) {
+ tswe[tswe.length] = n
+ }
+ if (n === 'all') {
+ allPassed = true;
+ }
+ }
+ }
+ if (tswe.length > 0) { // types with query expressions that passed the test
+ styles[styles.length] = cssHelper.addStyle(stsh.getCssText(), tswe, false);
+ }
+ var mqls = stsh.getMediaQueryLists();
+ if (allPassed) {
+ // If 'all' in media attribute passed the test, then test all @media types in linked CSS and create style with those types.
+ testMediaQueryLists(mqls);
+ }
+ else {
+ // Or else, test only media attribute types that passed the test and also 'all'.
+ // For positive '@media all', create style with attribute types that passed their test.
+ testMediaQueryLists(mqls, ts);
+ }
+ };
+
+ var testStylesheets = function (stshs) {
+ for (var i = 0; i < stshs.length; i++) {
+ testStylesheet(stshs[i]);
+ }
+ if (ua.ie) {
+ // force repaint in IE
+ document.documentElement.style.display = 'block';
+ setTimeout(function () {
+ document.documentElement.style.display = '';
+ }, 0);
+ // delay broadcast somewhat for IE
+ setTimeout(function () {
+ cssHelper.broadcast('cssMediaQueriesTested');
+ }, 100);
+ }
+ else {
+ cssHelper.broadcast('cssMediaQueriesTested');
+ }
+ };
+
+ var test = function () {
+ for (var i = 0; i < styles.length; i++) {
+ cssHelper.removeStyle(styles[i]);
+ }
+ styles = [];
+ cssHelper.stylesheets(testStylesheets);
+ };
+
+ var scrollbarWidth = 0;
+ var checkForResize = function () {
+ var cvpw = cssHelper.getViewportWidth();
+ var cvph = cssHelper.getViewportHeight();
+
+ // determine scrollbar width in IE, see resizeHandler
+ if (ua.ie) {
+ var el = document.createElement('div');
+ el.style.position = 'absolute';
+ el.style.top = '-9999em';
+ el.style.overflow = 'scroll';
+ document.body.appendChild(el);
+ scrollbarWidth = el.offsetWidth - el.clientWidth;
+ document.body.removeChild(el);
+ }
+
+ var timer;
+ var resizeHandler = function () {
+ var vpw = cssHelper.getViewportWidth();
+ var vph = cssHelper.getViewportHeight();
+ // check whether vp size has really changed, because IE also triggers resize event when body size changes
+ // 20px allowance to accommodate short appearance of scrollbars in IE in some cases
+ if (Math.abs(vpw - cvpw) > scrollbarWidth || Math.abs(vph - cvph) > scrollbarWidth) {
+ cvpw = vpw;
+ cvph = vph;
+ clearTimeout(timer);
+ timer = setTimeout(function () {
+ if (!nativeSupport()) {
+ test();
+ }
+ else {
+ cssHelper.broadcast('cssMediaQueriesTested');
+ }
+ }, 500);
+ }
+ };
+
+ window.onresize = function () {
+ var x = window.onresize || function () {}; // save original
+ return function () {
+ x();
+ resizeHandler();
+ };
+ }();
+ };
+
+ // prevent jumping of layout by hiding everything before painting <body>
+ var docEl = document.documentElement;
+ docEl.style.marginLeft = '-32767px';
+
+ // make sure it comes back after a while
+ setTimeout(function () {
+ docEl.style.marginLeft = '';
+ }, 5000);
+
+ return function () {
+ if (!nativeSupport()) { // if browser doesn't support media queries
+ cssHelper.addListener('newStyleParsed', function (el) {
+ testStylesheet(el.cssHelperParsed.stylesheet);
+ });
+ // return visibility after media queries are tested
+ cssHelper.addListener('cssMediaQueriesTested', function () {
+ // force repaint in IE by changing width
+ if (ua.ie) {
+ docEl.style.width = '1px';
+ }
+ setTimeout(function () {
+ docEl.style.width = ''; // undo width
+ docEl.style.marginLeft = ''; // undo hide
+ }, 0);
+ // remove this listener to prevent following execution
+ cssHelper.removeListener('cssMediaQueriesTested', arguments.callee);
+ });
+ createMeter();
+ test();
+ }
+ else {
+ docEl.style.marginLeft = ''; // undo visibility hidden
+ }
+ checkForResize();
+ };
+}());
+
+
+// bonus: hotfix for IE6 SP1 (bug KB823727)
+try {
+ document.execCommand('BackgroundImageCache', false, true);
+} catch (e) {}
diff --git a/sphinx/themes/bizstyle/theme.conf b/sphinx/themes/bizstyle/theme.conf
new file mode 100644
index 0000000..3c21b0f
--- /dev/null
+++ b/sphinx/themes/bizstyle/theme.conf
@@ -0,0 +1,10 @@
+[theme]
+inherit = basic
+stylesheet = bizstyle.css
+pygments_style = friendly
+
+[options]
+rightsidebar = false
+sidebarwidth = 210
+
+maincolor = #336699
diff --git a/sphinx/themes/classic/layout.html b/sphinx/themes/classic/layout.html
new file mode 100644
index 0000000..e6a5c43
--- /dev/null
+++ b/sphinx/themes/classic/layout.html
@@ -0,0 +1,23 @@
+{#
+ classic/layout.html
+ ~~~~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the classic theme.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "basic/layout.html" %}
+
+{%- block scripts %}
+ {{ super() }}
+ {% if theme_collapsiblesidebar|tobool %}
+ <script src="{{ pathto('_static/sidebar.js', 1) }}"></script>
+ {% endif %}
+{%- endblock %}
+
+{%- block sidebarextra %}{% if theme_collapsiblesidebar|tobool %}
+<div id="sidebarbutton" title="{{ _('Collapse sidebar') }}">
+<span>{{ '»' if theme_rightsidebar|tobool else '«' }}</span>
+</div>
+{% endif %}{% endblock %}
diff --git a/sphinx/themes/classic/static/classic.css_t b/sphinx/themes/classic/static/classic.css_t
new file mode 100644
index 0000000..8a903e8
--- /dev/null
+++ b/sphinx/themes/classic/static/classic.css_t
@@ -0,0 +1,353 @@
+/*
+ * classic.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- classic theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+html {
+ /* CSS hack for macOS's scrollbar (see #1125) */
+ background-color: #FFFFFF;
+}
+
+body {
+ font-family: {{ theme_bodyfont }};
+ font-size: 100%;
+ background-color: {{ theme_footerbgcolor }};
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+div.document {
+ display: flex;
+ background-color: {{ theme_sidebarbgcolor }};
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 {{ theme_sidebarwidth|todim }};
+}
+
+div.body {
+ background-color: {{ theme_bgcolor }};
+ color: {{ theme_textcolor }};
+ padding: 0 20px 30px 20px;
+}
+
+{%- if theme_rightsidebar|tobool %}
+div.bodywrapper {
+ margin: 0 {{ theme_sidebarwidth|todim }} 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 %}
+{% if theme_rightsidebar|tobool %}
+ {% set side = 'right' %}
+ {% set opposite = 'left' %}
+{% else %}
+ {% set side = 'left' %}
+ {% set opposite = 'right' %}
+{% endif %}
+/* for collapsible sidebar */
+#sidebarbutton {
+ height: 100%;
+ background-color: {{ theme_sidebarbtncolor }};
+ margin-{{side}}: 0;
+ color: #FFFFFF;
+ border-{{side}}: 1px solid {{ theme_relbarbgcolor }};
+ font-size: 1.2em;
+ cursor: pointer;
+ padding-top: 1px;
+ float: {{ 'left' if theme_rightsidebar|tobool else 'right' }};
+ display: table; /* for vertically centering the <span> */
+}
+
+#sidebarbutton:hover {
+ background-color: {{ theme_relbarbgcolor }};
+}
+
+#sidebarbutton span {
+ display: table-cell;
+ vertical-align: middle;
+}
+
+div.sphinxsidebarwrapper {
+ float: {{side}};
+ margin-{{opposite}}: 0;
+}
+{% 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, div.body blockquote {
+ 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;
+}
+
+nav.contents,
+aside.topic,
+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;
+}
+
+code {
+ background-color: #ecf0f3;
+ padding: 0 1px 0 1px;
+ font-size: 0.95em;
+}
+
+th, dl.field-list > dt {
+ background-color: #ede;
+}
+
+.warning code {
+ background: #efc2c2;
+}
+
+.note code {
+ 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;
+}
+
+div.code-block-caption {
+ color: #efefef;
+ background-color: #1c4e63;
+}
diff --git a/sphinx/themes/classic/static/sidebar.js_t b/sphinx/themes/classic/static/sidebar.js_t
new file mode 100644
index 0000000..32ae506
--- /dev/null
+++ b/sphinx/themes/classic/static/sidebar.js_t
@@ -0,0 +1,72 @@
+/*
+ * sidebar.js
+ * ~~~~~~~~~~
+ *
+ * This script makes the Sphinx sidebar collapsible.
+ *
+ * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
+ * used to collapse and expand the sidebar.
+ *
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
+ * and the width of the sidebar and the margin-left of the document
+ * are decreased. When the sidebar is expanded the opposite happens.
+ * This script saves a per-browser/per-session cookie used to
+ * remember the position of the sidebar among the pages.
+ * Once the browser is closed the cookie is deleted and the position
+ * reset to the default (expanded).
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+const initialiseSidebar = () => {
+ {% if theme_rightsidebar|tobool %}
+ {% set side = 'Right' %}
+ {% else %}
+ {% set side = 'Left' %}
+ {% endif %}
+
+ // global elements used by the functions.
+ const bodyWrapper = document.getElementsByClassName("bodywrapper")[0]
+ const sidebar = document.getElementsByClassName("sphinxsidebar")[0]
+ const sidebarWrapper = document.getElementsByClassName('sphinxsidebarwrapper')[0]
+ const sidebarButton = document.getElementById("sidebarbutton")
+ const sidebarArrow = sidebarButton.querySelector('span')
+
+ // for some reason, the document has no sidebar; do not run into errors
+ if (typeof sidebar === "undefined") return;
+
+ const flipArrow = element => element.innerText = (element.innerText === "»") ? "«" : "»"
+
+ const collapse_sidebar = () => {
+ bodyWrapper.style.margin{{side}} = ".8em";
+ sidebar.style.width = ".8em"
+ sidebarWrapper.style.display = "none"
+ flipArrow(sidebarArrow)
+ sidebarButton.title = _('Expand sidebar')
+ window.localStorage.setItem("sidebar", "collapsed")
+ }
+
+ const expand_sidebar = () => {
+ bodyWrapper.style.margin{{side}} = ""
+ sidebar.style.removeProperty("width")
+ sidebarWrapper.style.display = ""
+ flipArrow(sidebarArrow)
+ sidebarButton.title = _('Collapse sidebar')
+ window.localStorage.setItem("sidebar", "expanded")
+ }
+
+ sidebarButton.addEventListener("click", () => {
+ (sidebarWrapper.style.display === "none") ? expand_sidebar() : collapse_sidebar()
+ })
+
+ if (!window.localStorage.getItem("sidebar")) return
+ const value = window.localStorage.getItem("sidebar")
+ if (value === "collapsed") collapse_sidebar();
+ else if (value === "expanded") expand_sidebar();
+}
+
+if (document.readyState !== "loading") initialiseSidebar()
+else document.addEventListener("DOMContentLoaded", initialiseSidebar)
diff --git a/sphinx/themes/classic/theme.conf b/sphinx/themes/classic/theme.conf
new file mode 100644
index 0000000..5963d04
--- /dev/null
+++ b/sphinx/themes/classic/theme.conf
@@ -0,0 +1,32 @@
+[theme]
+inherit = basic
+stylesheet = classic.css
+pygments_style = sphinx
+
+[options]
+rightsidebar = false
+stickysidebar = false
+collapsiblesidebar = false
+externalrefs = false
+
+footerbgcolor = #11303d
+footertextcolor = #ffffff
+sidebarbgcolor = #1c4e63
+sidebarbtncolor = #3c6e83
+sidebartextcolor = #ffffff
+sidebarlinkcolor = #98dbcc
+relbarbgcolor = #133f52
+relbartextcolor = #ffffff
+relbarlinkcolor = #ffffff
+bgcolor = #ffffff
+textcolor = #000000
+headbgcolor = #f2f2f2
+headtextcolor = #20435c
+headlinkcolor = #c60f0f
+linkcolor = #355f7c
+visitedlinkcolor = #551a8b
+codebgcolor = unset
+codetextcolor = unset
+
+bodyfont = sans-serif
+headfont = 'Trebuchet MS', sans-serif
diff --git a/sphinx/themes/default/static/default.css b/sphinx/themes/default/static/default.css
new file mode 100644
index 0000000..81b9363
--- /dev/null
+++ b/sphinx/themes/default/static/default.css
@@ -0,0 +1 @@
+@import url("classic.css");
diff --git a/sphinx/themes/default/theme.conf b/sphinx/themes/default/theme.conf
new file mode 100644
index 0000000..0d8403f
--- /dev/null
+++ b/sphinx/themes/default/theme.conf
@@ -0,0 +1,2 @@
+[theme]
+inherit = classic
diff --git a/sphinx/themes/epub/epub-cover.html b/sphinx/themes/epub/epub-cover.html
new file mode 100644
index 0000000..bb348bb
--- /dev/null
+++ b/sphinx/themes/epub/epub-cover.html
@@ -0,0 +1,25 @@
+{#
+ epub/epub-cover.html
+ ~~~~~~~~~~~~~~~~~~~~
+
+ Sample template for the html cover page.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "layout.html" %}
+{%- block header %}{% endblock %}
+{%- 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/epub/layout.html b/sphinx/themes/epub/layout.html
new file mode 100644
index 0000000..f4bcf97
--- /dev/null
+++ b/sphinx/themes/epub/layout.html
@@ -0,0 +1,21 @@
+{#
+ epub/layout.html
+ ~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the epub theme.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "basic/layout.html" %}
+
+{%- block doctype -%}
+{{ doctype }}
+{%- endblock -%}
+{# add only basic navigation links #}
+{% block sidebar1 %}{% endblock %}
+{% block sidebar2 %}{% endblock %}
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}{% endblock %}
+{% block linktags %}{% endblock %}
+{% block footer %}{% endblock %}
diff --git a/sphinx/themes/epub/static/epub.css_t b/sphinx/themes/epub/static/epub.css_t
new file mode 100644
index 0000000..1afb150
--- /dev/null
+++ b/sphinx/themes/epub/static/epub.css_t
@@ -0,0 +1,734 @@
+/*
+ * epub.css_t
+ * ~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- epub theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+{% if theme_writing_mode is defined %}
+body{
+ writing-mode: {{ theme_writing_mode }};
+ line-break: normal;
+ -epub-writing-mode: {{ theme_writing_mode }};
+ -webkit-writing-mode: {{ theme_writing_mode }};
+ -epub-line-break: normal;
+ -webkit-line-break: normal;
+}
+{% endif %}
+
+div.clearer {
+ clear: both;
+}
+
+a:link {
+ color: #3333ff;
+ text-decoration: underline;
+}
+
+a:visited {
+ color: #551a8b;
+ text-decoration: underline;
+}
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-family: sans-serif;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 100%;
+}
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 130%;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+ visibility: hidden;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar, aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px 7px 0 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 110%;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ border: 0;
+ border-collapse: collapse;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+/* -- for html4 -- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+/* -- for html5 -- */
+
+/* bold field name, content starts on the same line */
+
+dl.field-list > dt,
+dl.option-list > dt,
+dl.docinfo > dt,
+dl.footnote > dt,
+dl.citation > dt {
+ font-weight: bold;
+ clear: left;
+ float: left;
+ margin: 0;
+ padding: 0;
+ padding-right: 0.5em;
+}
+
+/* Offset for field content (corresponds to the --field-name-limit option) */
+
+dl.field-list > dd,
+dl.option-list > dd,
+dl.docinfo > dd {
+ margin-left: 9em; /* ca. 14 chars in the test examples */
+}
+
+/* start field-body on a new line after long field names */
+
+dl.field-list > dd > *:first-child,
+dl.option-list > dd > *:first-child
+{
+ display: inline-block;
+ width: 100%;
+ margin: 0;
+}
+
+dl.field-list > dt:after,
+dl.docinfo > dt:after {
+ content: ":";
+}
+
+/* -- option lists ---------------------------------------------------------- */
+
+dl.option-list {
+ margin-left: 40px;
+}
+
+dl.option-list > dt {
+ font-weight: normal;
+}
+
+span.option {
+ white-space: nowrap;
+}
+
+/* -- lists ----------------------------------------------------------------- */
+
+/* -- compact and simple lists: no margin between items -- */
+
+.simple li, .compact li,
+.simple ul, .compact ul,
+.simple ol, .compact ol,
+.simple > li p, .compact > li p,
+dl.simple > dd, dl.compact > dd {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+/* -- enumerated lists ------------------------------------------------------ */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+dt span.classifier {
+ font-style: italic;
+}
+
+dt span.classifier:before {
+ font-style: normal;
+ margin: 0.5em;
+ content: ":";
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+dl {
+ margin-bottom: 15px;
+}
+
+.sig dl {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+.sig dd {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+dt:target, .highlighted {
+ background-color: #ddd;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 110%;
+}
+
+.optional {
+ font-size: 130%;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+/* -- footnotes and citations ----------------------------------------------- */
+
+/* -- for html4 -- */
+.footnote:target {
+ background-color: #dddddd;
+}
+
+/* -- for html5 -- */
+
+dl.footnote.superscript > dd {
+ margin-left: 1em;
+}
+
+dl.footnote.brackets > dd {
+ margin-left: 2em;
+}
+
+dl > dt.label {
+ font-weight: normal;
+}
+
+a.footnote-reference.brackets:before,
+dt.label > span.brackets:before {
+ content: "[";
+}
+
+a.footnote-reference.brackets:after,
+dt.label > span.brackets:after {
+ content: "]";
+}
+
+a.footnote-reference.superscript,
+dl.footnote.superscript > dt.label {
+ vertical-align: super;
+ font-size: smaller;
+}
+
+dt.label > span.fn-backref {
+ margin-left: 0.2em;
+}
+
+dt.label > span.fn-backref > a {
+ font-style: italic;
+}
+
+/* -- line blocks ----------------------------------------------------------- */
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-style: italic;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ font-family: monospace;
+ overflow: auto;
+ overflow-y: hidden;
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+code {
+ font-family: monospace;
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ padding: 1em 1em 0;
+}
+
+div.literal-block-wrapper div.highlight {
+ margin: 0;
+}
+
+code.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+code.descclassname {
+ background-color: transparent;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+/* -- special divs --------------------------------------------------------- */
+
+div.quotebar {
+ background-color: #e3eff1;
+ max-width: 250px;
+ float: right;
+ font-family: sans-serif;
+ padding: 7px 7px;
+ border: 1px solid #ccc;
+}
+div.footer {
+ background-color: #e3eff1;
+ padding: 3px 8px 3px 0;
+ clear: both;
+ font-family: sans-serif;
+ font-size: 80%;
+ text-align: right;
+}
+
+div.footer a {
+ text-decoration: underline;
+}
+
+/* -- link-target ----------------------------------------------------------- */
+
+.link-target {
+ font-size: 80%;
+}
+
+table .link-target {
+ /* Do not show links in tables, there is not enough space */
+ display: none;
+}
+
+/* -- font-face ------------------------------------------------------------- */
+
+/*
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: normal;
+ font-weight: normal;
+ src: url("res:///Data/fonts/LiberationNarrow-Regular.otf")
+ format("opentype");
+}
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: oblique, italic;
+ font-weight: normal;
+ src: url("res:///Data/fonts/LiberationNarrow-Italic.otf")
+ format("opentype");
+}
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: normal;
+ font-weight: bold;
+ src: url("res:///Data/fonts/LiberationNarrow-Bold.otf")
+ format("opentype");
+}
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: oblique, italic;
+ font-weight: bold;
+ src: url("res:///Data/fonts/LiberationNarrow-BoldItalic.otf")
+ format("opentype");
+}
+*/
diff --git a/sphinx/themes/epub/theme.conf b/sphinx/themes/epub/theme.conf
new file mode 100644
index 0000000..11f098e
--- /dev/null
+++ b/sphinx/themes/epub/theme.conf
@@ -0,0 +1,8 @@
+[theme]
+inherit = basic
+stylesheet = epub.css
+pygments_style = none
+
+[options]
+relbar1 = true
+footer = true
diff --git a/sphinx/themes/haiku/layout.html b/sphinx/themes/haiku/layout.html
new file mode 100644
index 0000000..4e14826
--- /dev/null
+++ b/sphinx/themes/haiku/layout.html
@@ -0,0 +1,66 @@
+{#
+ haiku/layout.html
+ ~~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the haiku theme.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "basic/layout.html" %}
+
+{# do not display relbars #}
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}{% endblock %}
+
+{% macro nav() %}
+ <p>
+ {%- block haikurel1 %}
+ {%- endblock %}
+ {%- if prev %}
+ «&#160;&#160;<a href="{{ prev.link|e }}">{{ prev.title }}</a>
+ &#160;&#160;::&#160;&#160;
+ {%- endif %}
+ <a class="uplink" href="{{ pathto(root_doc)|e }}">{{ _('Contents') }}</a>
+ {%- if next %}
+ &#160;&#160;::&#160;&#160;
+ <a href="{{ next.link|e }}">{{ next.title }}</a>&#160;&#160;»
+ {%- endif %}
+ {%- block haikurel2 %}
+ {%- endblock %}
+ </p>
+{% endmacro %}
+
+{% block content %}
+ <div class="header" role="banner">
+ {%- block haikuheader %}
+ {%- if theme_full_logo != "false" %}
+ <a href="{{ pathto('index') }}">
+ <img class="logo" src="{{ logo_url|e }}" alt="Logo"/>
+ </a>
+ {%- else %}
+ {%- if logo -%}
+ <img class="rightlogo" src="{{ logo_url|e }}" alt="Logo"/>
+ {%- endif -%}
+ <h1 class="heading"><a href="{{ pathto('index') }}">
+ <span>{{ shorttitle|e }}</span></a></h1>
+ <h2 class="heading"><span>{{ title|striptags|e }}</span></h2>
+ {%- endif %}
+ {%- endblock %}
+ </div>
+ <div class="topnav" role="navigation" aria-label="top navigation">
+ {{ nav() }}
+ </div>
+ <div class="content" role="main">
+ {#{%- if display_toc %}
+ <div id="toc">
+ <h3>{{ _('Table of Contents') }}</h3>
+ {{ toc }}
+ </div>
+ {%- endif %}#}
+ {% block body %}{% endblock %}
+ </div>
+ <div class="bottomnav" role="navigation" aria-label="bottom navigation">
+ {{ nav() }}
+ </div>
+{% endblock %}
diff --git a/sphinx/themes/haiku/static/alert_info_32.png b/sphinx/themes/haiku/static/alert_info_32.png
new file mode 100644
index 0000000..ea4d1ba
--- /dev/null
+++ b/sphinx/themes/haiku/static/alert_info_32.png
Binary files differ
diff --git a/sphinx/themes/haiku/static/alert_warning_32.png b/sphinx/themes/haiku/static/alert_warning_32.png
new file mode 100644
index 0000000..a687c3d
--- /dev/null
+++ b/sphinx/themes/haiku/static/alert_warning_32.png
Binary files differ
diff --git a/sphinx/themes/haiku/static/bg-page.png b/sphinx/themes/haiku/static/bg-page.png
new file mode 100644
index 0000000..fe0a6dc
--- /dev/null
+++ b/sphinx/themes/haiku/static/bg-page.png
Binary files differ
diff --git a/sphinx/themes/haiku/static/bullet_orange.png b/sphinx/themes/haiku/static/bullet_orange.png
new file mode 100644
index 0000000..1cb8097
--- /dev/null
+++ b/sphinx/themes/haiku/static/bullet_orange.png
Binary files differ
diff --git a/sphinx/themes/haiku/static/haiku.css_t b/sphinx/themes/haiku/static/haiku.css_t
new file mode 100644
index 0000000..bccc3ea
--- /dev/null
+++ b/sphinx/themes/haiku/static/haiku.css_t
@@ -0,0 +1,375 @@
+/*
+ * haiku.css_t
+ * ~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- haiku theme.
+ *
+ * Adapted from http://haiku-os.org/docs/Haiku-doc.css.
+ * Original copyright message:
+ *
+ * Copyright 2008-2009, Haiku. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ * Francois Revol <revol@free.fr>
+ * Stephan Assmus <superstippi@gmx.de>
+ * Braden Ewing <brewin@gmail.com>
+ * Humdinger <humdingerb@gmail.com>
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+html {
+ margin: 0px;
+ padding: 0px;
+ background: #FFF url(bg-page.png) top left repeat-x;
+}
+
+body {
+ line-height: 1.5;
+ margin: auto;
+ padding: 0px;
+ font-family: "DejaVu Sans", Arial, Helvetica, sans-serif;
+ min-width: {{ theme_body_min_width|todim }};
+ max-width: {{ theme_body_max_width|todim }};
+ color: {{ theme_textcolor }};
+}
+
+div.footer {
+ padding: 8px;
+ font-size: 11px;
+ text-align: center;
+ letter-spacing: 0.5px;
+}
+
+/* link colors and text decoration */
+
+a:link {
+ font-weight: bold;
+ text-decoration: none;
+ color: {{ theme_linkcolor }};
+}
+
+a:visited {
+ font-weight: bold;
+ text-decoration: none;
+ color: {{ theme_visitedlinkcolor }};
+}
+
+a:hover, a:active {
+ text-decoration: underline;
+ color: {{ theme_hoverlinkcolor }};
+}
+
+/* Some headers act as anchors, don't give them a hover effect */
+
+h1 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+h2 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+h3 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+h4 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+a.headerlink {
+ color: #a7ce38;
+ padding-left: 5px;
+}
+
+a.headerlink:hover {
+ color: #a7ce38;
+}
+
+/* basic text elements */
+
+div.content {
+ margin-top: 20px;
+ margin-left: 40px;
+ margin-right: 40px;
+ margin-bottom: 50px;
+ font-size: 0.9em;
+}
+
+/* heading and navigation */
+
+div.header {
+ position: relative;
+ left: 0px;
+ top: 0px;
+ height: 85px;
+ /* background: #eeeeee; */
+ padding: 0 40px;
+}
+div.header h1 {
+ font-size: 1.6em;
+ font-weight: normal;
+ letter-spacing: 1px;
+ color: {{ theme_headingcolor }};
+ border: 0;
+ margin: 0;
+ padding-top: 15px;
+}
+div.header h1 a {
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+}
+div.header h2 {
+ font-size: 1.3em;
+ font-weight: normal;
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ color: #aaa;
+ border: 0;
+ margin-top: -3px;
+ padding: 0;
+}
+
+div.header img.rightlogo {
+ float: right;
+}
+
+
+div.title {
+ font-size: 1.3em;
+ font-weight: bold;
+ color: {{ theme_headingcolor }};
+ border-bottom: dotted thin #e0e0e0;
+ margin-bottom: 25px;
+}
+div.topnav {
+ /* background: #e0e0e0; */
+}
+div.topnav p {
+ margin-top: 0;
+ margin-left: 40px;
+ margin-right: 40px;
+ margin-bottom: 0px;
+ text-align: right;
+ font-size: 0.8em;
+}
+div.bottomnav {
+ background: #eeeeee;
+}
+div.bottomnav p {
+ margin-right: 40px;
+ text-align: right;
+ font-size: 0.8em;
+}
+
+a.uplink {
+ font-weight: normal;
+}
+
+
+/* contents box */
+
+table.index {
+ margin: 0px 0px 30px 30px;
+ padding: 1px;
+ border-width: 1px;
+ border-style: dotted;
+ border-color: #e0e0e0;
+}
+table.index tr.heading {
+ background-color: #e0e0e0;
+ text-align: center;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+table.index tr.index {
+ background-color: #eeeeee;
+}
+table.index td {
+ padding: 5px 20px;
+}
+
+table.index a:link, table.index a:visited {
+ font-weight: normal;
+ text-decoration: none;
+ color: {{ theme_linkcolor }};
+}
+table.index a:hover, table.index a:active {
+ text-decoration: underline;
+ color: {{ theme_hoverlinkcolor }};
+}
+
+
+/* Haiku User Guide styles and layout */
+
+/* Rounded corner boxes */
+/* Common declarations */
+div.admonition {
+ -webkit-border-radius: 10px;
+ -khtml-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+ border-style: dotted;
+ border-width: thin;
+ border-color: #dcdcdc;
+ padding: 10px 15px 10px 15px;
+ margin-bottom: 15px;
+ margin-top: 15px;
+}
+div.note {
+ padding: 10px 15px 10px 80px;
+ background: #e4ffde url(alert_info_32.png) 15px 15px no-repeat;
+ min-height: 42px;
+}
+div.warning {
+ padding: 10px 15px 10px 80px;
+ background: #fffbc6 url(alert_warning_32.png) 15px 15px no-repeat;
+ min-height: 42px;
+}
+div.seealso {
+ background: #e4ffde;
+}
+
+/* More layout and styles */
+h1 {
+ font-size: 1.3em;
+ font-weight: bold;
+ color: {{ theme_headingcolor }};
+ border-bottom: dotted thin #e0e0e0;
+ margin-top: 30px;
+}
+
+h2 {
+ font-size: 1.2em;
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+ border-bottom: dotted thin #e0e0e0;
+ margin-top: 30px;
+}
+
+h3 {
+ font-size: 1.1em;
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+ margin-top: 30px;
+}
+
+h4 {
+ font-size: 1.0em;
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+ margin-top: 30px;
+}
+
+p {
+ text-align: justify;
+}
+
+p.last {
+ margin-bottom: 0;
+}
+
+ol {
+ padding-left: 20px;
+}
+
+ul {
+ padding-left: 5px;
+ margin-top: 3px;
+}
+
+li {
+ line-height: 1.3;
+}
+
+div.content ul > li {
+ -moz-background-clip:border;
+ -moz-background-inline-policy:continuous;
+ -moz-background-origin:padding;
+ background: transparent url(bullet_orange.png) no-repeat scroll left 0.45em;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0 0 0 1.666em;
+ margin-bottom: 3px;
+}
+
+td {
+ vertical-align: top;
+}
+
+code {
+ background-color: #e2e2e2;
+ font-size: 1.0em;
+ font-family: monospace;
+}
+
+pre {
+ border-color: #0c3762;
+ border-style: dotted;
+ border-width: thin;
+ margin: 0 0 12px 0;
+ padding: 0.8em;
+}
+
+hr {
+ border-top: 1px solid #ccc;
+ border-bottom: 0;
+ border-right: 0;
+ border-left: 0;
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+
+/* printer only pretty stuff */
+@media print {
+ .noprint {
+ display: none;
+ }
+ /* for acronyms we want their definitions inlined at print time */
+ acronym[title]:after {
+ font-size: small;
+ content: " (" attr(title) ")";
+ font-style: italic;
+ }
+ /* and not have mozilla dotted underline */
+ acronym {
+ border: none;
+ }
+ div.topnav, div.bottomnav, div.header, table.index {
+ display: none;
+ }
+ div.content {
+ margin: 0px;
+ padding: 0px;
+ }
+ html {
+ background: #FFF;
+ }
+}
+
+.viewcode-back {
+ font-family: "DejaVu Sans", Arial, Helvetica, sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+ margin: -1px -10px;
+ padding: 0 12px;
+}
+
+/* math display */
+div.math p {
+ text-align: center;
+}
diff --git a/sphinx/themes/haiku/theme.conf b/sphinx/themes/haiku/theme.conf
new file mode 100644
index 0000000..77dd7c7
--- /dev/null
+++ b/sphinx/themes/haiku/theme.conf
@@ -0,0 +1,14 @@
+[theme]
+inherit = basic
+stylesheet = haiku.css
+pygments_style = autumn
+
+[options]
+full_logo = false
+body_min_width = 59em
+body_max_width = 70em
+textcolor = #333333
+headingcolor = #0c3762
+linkcolor = #dc3c01
+visitedlinkcolor = #551a8b
+hoverlinkcolor = #ff4500
diff --git a/sphinx/themes/nature/static/nature.css_t b/sphinx/themes/nature/static/nature.css_t
new file mode 100644
index 0000000..fe95c35
--- /dev/null
+++ b/sphinx/themes/nature/static/nature.css_t
@@ -0,0 +1,252 @@
+/*
+ * nature.css_t
+ * ~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- nature theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: Arial, sans-serif;
+ font-size: 100%;
+ background-color: #fff;
+ color: #555;
+ margin: 0;
+ padding: 0;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 {{ theme_sidebarwidth|todim }};
+}
+
+hr {
+ border: 1px solid #B1B4B6;
+}
+
+div.document {
+ background-color: #eee;
+}
+
+div.body {
+ background-color: #ffffff;
+ color: #3E4349;
+ padding: 0 30px 30px 30px;
+ font-size: 0.9em;
+}
+
+div.footer {
+ color: #555;
+ width: 100%;
+ padding: 13px 0;
+ text-align: center;
+ font-size: 75%;
+}
+
+div.footer a {
+ color: #444;
+ text-decoration: underline;
+}
+
+div.related {
+ background-color: #6BA81E;
+ line-height: 32px;
+ color: #fff;
+ text-shadow: 0px 1px 0 #444;
+ font-size: 0.9em;
+}
+
+div.related a {
+ color: #E2F3CC;
+}
+
+div.sphinxsidebar {
+ font-size: 0.75em;
+ line-height: 1.5em;
+}
+
+div.sphinxsidebarwrapper{
+ padding: 20px 0;
+}
+
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+ font-family: Arial, sans-serif;
+ color: #222;
+ font-size: 1.2em;
+ font-weight: normal;
+ margin: 0;
+ padding: 5px 10px;
+ background-color: #ddd;
+ text-shadow: 1px 1px 0 white
+}
+
+div.sphinxsidebar h4{
+ font-size: 1.1em;
+}
+
+div.sphinxsidebar h3 a {
+ color: #444;
+}
+
+
+div.sphinxsidebar p {
+ color: #888;
+ padding: 5px 20px;
+}
+
+div.sphinxsidebar p.topless {
+}
+
+div.sphinxsidebar ul {
+ margin: 10px 20px;
+ padding: 0;
+ color: #000;
+}
+
+div.sphinxsidebar a {
+ color: #444;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #ccc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar .searchformwrapper {
+ margin-left: 20px;
+ margin-right: 20px;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+a {
+ color: #005B81;
+ text-decoration: none;
+}
+
+a:hover {
+ color: #E32E00;
+ text-decoration: underline;
+}
+
+a:visited {
+ color: #551A8B;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: Arial, sans-serif;
+ background-color: #BED4EB;
+ font-weight: normal;
+ color: #212224;
+ margin: 30px 0px 10px 0px;
+ padding: 5px 0 5px 10px;
+ text-shadow: 0px 1px 0 white
+}
+
+div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 150%; background-color: #C8D5E3; }
+div.body h3 { font-size: 120%; background-color: #D8DEE3; }
+div.body h4 { font-size: 110%; background-color: #D8DEE3; }
+div.body h5 { font-size: 100%; background-color: #D8DEE3; }
+div.body h6 { font-size: 100%; background-color: #D8DEE3; }
+
+a.headerlink {
+ color: #c60f0f;
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none;
+}
+
+a.headerlink:hover {
+ background-color: #c60f0f;
+ color: white;
+}
+
+div.body p, div.body dd, div.body li {
+ line-height: 1.5em;
+}
+
+div.admonition p.admonition-title + p {
+ display: inline;
+}
+
+div.note {
+ background-color: #eee;
+ border: 1px solid #ccc;
+}
+
+div.seealso {
+ background-color: #ffc;
+ border: 1px solid #ff6;
+}
+
+nav.contents,
+aside.topic,
+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: 10px;
+ line-height: 1.2em;
+ border: 1px solid #C6C9CB;
+ font-size: 1.1em;
+ margin: 1.5em 0 1.5em 0;
+ -webkit-box-shadow: 1px 1px 1px #d8d8d8;
+ -moz-box-shadow: 1px 1px 1px #d8d8d8;
+}
+
+code {
+ background-color: #ecf0f3;
+ color: #222;
+ /* padding: 1px 2px; */
+ font-size: 1.1em;
+ font-family: monospace;
+}
+
+.viewcode-back {
+ font-family: Arial, sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
+
+div.code-block-caption {
+ background-color: #ddd;
+ color: #222;
+ border: 1px solid #C6C9CB;
+}
diff --git a/sphinx/themes/nature/theme.conf b/sphinx/themes/nature/theme.conf
new file mode 100644
index 0000000..1cc4004
--- /dev/null
+++ b/sphinx/themes/nature/theme.conf
@@ -0,0 +1,4 @@
+[theme]
+inherit = basic
+stylesheet = nature.css
+pygments_style = tango
diff --git a/sphinx/themes/nonav/layout.html b/sphinx/themes/nonav/layout.html
new file mode 100644
index 0000000..06607f4
--- /dev/null
+++ b/sphinx/themes/nonav/layout.html
@@ -0,0 +1,23 @@
+{#
+ nonav/layout.html
+ ~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the any help system theme.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "basic/layout.html" %}
+
+{%- block doctype -%}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+{%- endblock -%}
+{# add only basic navigation links #}
+{% block sidebar1 %}{% endblock %}
+{% block sidebar2 %}{% endblock %}
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}{% endblock %}
+{% block linktags %}{% endblock %}
+{% block footer %}{% endblock %}
+
diff --git a/sphinx/themes/nonav/static/nonav.css_t b/sphinx/themes/nonav/static/nonav.css_t
new file mode 100644
index 0000000..b4d26cc
--- /dev/null
+++ b/sphinx/themes/nonav/static/nonav.css_t
@@ -0,0 +1,589 @@
+/*
+ * nonav.css
+ * ~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- nonav theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+a:link {
+ color: #3333ff;
+ text-decoration: underline;
+}
+
+a:visited {
+ color: #551a8b;
+ text-decoration: underline;
+}
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-family: sans-serif;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 100%;
+}
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 130%;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+ visibility: hidden;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar, aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px 7px 0 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+nav.contents,
+aside.topic,
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 110%;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ border: 0;
+ border-collapse: collapse;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dt:target, .highlighted {
+ background-color: #ddd;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 110%;
+}
+
+.optional {
+ font-size: 130%;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #dddddd;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-style: italic;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ font-family: monospace;
+ overflow: auto;
+ overflow-y: hidden;
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+code {
+ font-family: monospace;
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ padding: 1em 1em 0;
+}
+
+div.literal-block-wrapper div.highlight {
+ margin: 0;
+}
+
+code.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+code.descclassname {
+ background-color: transparent;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+/* -- special divs --------------------------------------------------------- */
+
+div.quotebar {
+ background-color: #e3eff1;
+ max-width: 250px;
+ float: right;
+ font-family: sans-serif;
+ padding: 7px 7px;
+ border: 1px solid #ccc;
+}
+div.footer {
+ background-color: #e3eff1;
+ padding: 3px 8px 3px 0;
+ clear: both;
+ font-family: sans-serif;
+ font-size: 80%;
+ text-align: right;
+}
+
+div.footer a {
+ text-decoration: underline;
+}
+
+/* -- link-target ----------------------------------------------------------- */
+
+.link-target {
+ font-size: 80%;
+}
+
+table .link-target {
+ /* Do not show links in tables, there is not enough space */
+ display: none;
+}
+
+/* -- font-face ------------------------------------------------------------- */
+
+/*
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: normal;
+ font-weight: normal;
+ src: url("res:///Data/fonts/LiberationNarrow-Regular.otf")
+ format("opentype");
+}
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: oblique, italic;
+ font-weight: normal;
+ src: url("res:///Data/fonts/LiberationNarrow-Italic.otf")
+ format("opentype");
+}
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: normal;
+ font-weight: bold;
+ src: url("res:///Data/fonts/LiberationNarrow-Bold.otf")
+ format("opentype");
+}
+@font-face {
+ font-family: "LiberationNarrow";
+ font-style: oblique, italic;
+ font-weight: bold;
+ src: url("res:///Data/fonts/LiberationNarrow-BoldItalic.otf")
+ format("opentype");
+}
+*/
diff --git a/sphinx/themes/nonav/theme.conf b/sphinx/themes/nonav/theme.conf
new file mode 100644
index 0000000..d4799c7
--- /dev/null
+++ b/sphinx/themes/nonav/theme.conf
@@ -0,0 +1,8 @@
+[theme]
+inherit = basic
+stylesheet = nonav.css
+pygments_style = none
+
+[options]
+relbar1 = true
+footer = true
diff --git a/sphinx/themes/pyramid/layout.html b/sphinx/themes/pyramid/layout.html
new file mode 100644
index 0000000..ffa9313
--- /dev/null
+++ b/sphinx/themes/pyramid/layout.html
@@ -0,0 +1,24 @@
+{%- extends "basic/layout.html" %}
+
+{%- block extrahead %}
+<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Neuton&amp;subset=latin" type="text/css" media="screen" charset="utf-8" />
+<link rel="stylesheet" href="https://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_url %}
+<div class="header" role="banner">
+ <div class="logo">
+ <a href="{{ pathto(root_doc)|e }}">
+ <img class="logo" src="{{ logo_url|e }}" 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 0000000..5a6336d
--- /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 0000000..97553a8
--- /dev/null
+++ b/sphinx/themes/pyramid/static/dialog-seealso.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/dialog-todo.png b/sphinx/themes/pyramid/static/dialog-todo.png
new file mode 100644
index 0000000..cfbc280
--- /dev/null
+++ b/sphinx/themes/pyramid/static/dialog-todo.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 0000000..a75afea
--- /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 0000000..8bb7d8d
--- /dev/null
+++ b/sphinx/themes/pyramid/static/dialog-warning.png
Binary files differ
diff --git a/sphinx/themes/pyramid/static/epub.css_t b/sphinx/themes/pyramid/static/epub.css_t
new file mode 100644
index 0000000..798054b
--- /dev/null
+++ b/sphinx/themes/pyramid/static/epub.css_t
@@ -0,0 +1,312 @@
+/*
+ * default.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- default theme.
+ *
+ * :copyright: Copyright 2007-2023 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;
+}
+
+nav.contents,
+aside.topic,
+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;
+}
+
+code {
+ background-color: #ecf0f3;
+ padding: 0 1px 0 1px;
+ font-size: 0.95em;
+}
+
+th {
+ background-color: #ede;
+}
+
+.warning code {
+ background: #efc2c2;
+}
+
+.note code {
+ 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 0000000..1fbc873
--- /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 0000000..e1051af
--- /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 0000000..74baa5d
--- /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 0000000..5ee55db
--- /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 0000000..560093c
--- /dev/null
+++ b/sphinx/themes/pyramid/static/pyramid.css_t
@@ -0,0 +1,348 @@
+/*
+ * pyramid.css_t
+ * ~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- pylons theme.
+ *
+ * :copyright: Copyright 2007-2023 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|todim }};
+}
+
+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: calc({{ theme_sidebarwidth|todim }} + 10px);
+}
+
+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 .searchformwrapper {
+ margin-left: 20px;
+ margin-right: 20px;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar, aside.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;
+}
+
+a:visited {
+ color: #551a8b;
+}
+
+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.admonition {
+ background: #eeeeec;
+ border: 2px solid #babdb6;
+ border-right-style: none;
+ border-left-style: none;
+ padding: 10px 20px 10px 60px;
+}
+
+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;
+}
+
+nav.contents,
+aside.topic,
+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;
+}
+
+div.admonition-todo {
+ background: #f2d9b4 url(dialog-todo.png) no-repeat 10px 8px;
+ border: 2px solid #e9b96e;
+ border-right-style: none;
+ border-left-style: none;
+ padding: 10px 20px 10px 60px;
+}
+
+div.note p.admonition-title,
+div.warning p.admonition-title,
+div.seealso p.admonition-title,
+div.admonition-todo p.admonition-title {
+ display: none;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+pre {
+ padding: 10px;
+ 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;
+}
+
+code {
+ 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;
+}
+
+code.xref {
+ font-weight: normal;
+ font-style: normal;
+}
+
+div.code-block-caption {
+ background-color: #ddd;
+ color: #222;
+}
diff --git a/sphinx/themes/pyramid/static/transparent.gif b/sphinx/themes/pyramid/static/transparent.gif
new file mode 100644
index 0000000..0341802
--- /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 0000000..409579f
--- /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/scrolls/artwork/logo.svg b/sphinx/themes/scrolls/artwork/logo.svg
new file mode 100644
index 0000000..0907a4e
--- /dev/null
+++ b/sphinx/themes/scrolls/artwork/logo.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="200"
+ height="80"
+ id="svg2766"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ version="1.0"
+ sodipodi:docname="logo.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs2768">
+ <linearGradient
+ id="linearGradient6558">
+ <stop
+ style="stop-color:#575757;stop-opacity:1;"
+ offset="0"
+ id="stop6560" />
+ <stop
+ style="stop-color:#2f2f2f;stop-opacity:1;"
+ offset="1"
+ id="stop6562" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2774" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6558"
+ id="radialGradient2797"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.7160081,0,0,0.6767021,-34.98413,-3.3035294e-2)"
+ cx="61.297766"
+ cy="60.910986"
+ fx="61.297766"
+ fy="60.910986"
+ r="44.688254" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="6.1848684"
+ inkscape:cx="95.923838"
+ inkscape:cy="34.518668"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1440"
+ inkscape:window-height="852"
+ inkscape:window-x="0"
+ inkscape:window-y="0" />
+ <metadata
+ id="metadata2771">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="opacity:1;fill:url(#radialGradient2797);fill-opacity:1;fill-rule:evenodd;stroke:#323232;stroke-width:0.71600807000000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 72.4375 8.6875 L 3.0625 18.71875 L 20.84375 29.0625 L 20.6875 44.09375 L 7.75 36.1875 L 8.40625 71.75 L 17.125 65.625 L 29.09375 67.5625 L 33.15625 39.90625 L 25.875 43.78125 L 26.1875 33.59375 L 46.875 31.34375 L 47.21875 42.96875 L 39.28125 40.5625 L 42.6875 67.71875 L 52.375 66.75 L 60.3125 71.75 L 62.90625 33.4375 L 53.03125 43.625 L 53.03125 28.25 L 72.4375 8.6875 z M 48.03125 22.125 L 47.0625 26.46875 L 28.46875 28.09375 L 28.46875 25.1875 L 48.03125 22.125 z M 58.375 45.0625 L 57.40625 62.875 L 51.40625 60.59375 L 45.90625 61.71875 L 43 46.21875 L 53.84375 49.9375 L 58.375 45.0625 z M 12.125 46.53125 L 22 49.75 L 26.53125 47.03125 L 25.21875 62.0625 L 16.96875 60.4375 L 12.125 63.65625 L 12.125 46.53125 z "
+ id="path2783" />
+ <path
+ style="opacity:1;fill:#e7eef6;fill-opacity:1;fill-rule:nonzero;stroke:#e1e8f3;stroke-width:0.52748101999999997;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 75.632462,22.265877 L 64.489624,64.880679 L 92.7889,40.941187 L 91.373937,61.872575 L 128.87048,23.519253 L 116.84328,58.36312 L 144.25821,44.450641 L 145.49631,65.632704 L 169.02007,38.183758 L 170.78877,60.493861 L 193.07447,18.631085 L 176.09491,36.554369 L 176.44864,19.633786 L 152.0405,44.701316 L 156.81601,27.655396 L 128.87048,44.325304 L 137.00652,14.494942 L 99.863721,44.325304 L 100.74807,27.028707 L 76.163076,45.829355 L 75.632462,22.265877 z"
+ id="path2804" />
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;opacity:1;fill:#1752b4;fill-opacity:1;fill-rule:nonzero;stroke:#28437f;stroke-width:0.71600807000000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
+ x="68.40242"
+ y="54.03759"
+ id="text2800"><tspan
+ sodipodi:role="line"
+ id="tspan2802"
+ x="68.40242"
+ y="54.03759"
+ style="font-size:36px;fill:#1752b4;fill-opacity:1;fill-rule:nonzero;stroke:#28437f;stroke-width:0.71600807000000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate">Project</tspan></text>
+ </g>
+</svg>
diff --git a/sphinx/themes/scrolls/layout.html b/sphinx/themes/scrolls/layout.html
new file mode 100644
index 0000000..da91ee9
--- /dev/null
+++ b/sphinx/themes/scrolls/layout.html
@@ -0,0 +1,50 @@
+{#
+ scrolls/layout.html
+ ~~~~~~~~~~~~~~~~~~~
+
+ Sphinx layout template for the scrolls theme, originally written
+ by Armin Ronacher.
+
+ :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- extends "basic/layout.html" %}
+{%- block css %}
+ {{ super() }}
+ <link rel="stylesheet" href="_static/print.css" type="text/css" />
+{%- endblock %}
+{%- block scripts %}
+ {{ super() }}
+ <script src="{{ pathto('_static/theme_extras.js', 1) }}"></script>
+{%- endblock %}
+{# do not display relbars #}
+{% block relbar1 %}{% endblock %}
+{% block relbar2 %}{% endblock %}
+{% block content %}
+ <div id="content">
+ <div class="header">
+ <h1 class="heading"><a href="{{ pathto('index') }}"
+ title="back to the documentation overview"><span>{{ title|striptags|e }}</span></a></h1>
+ </div>
+ <div class="relnav" role="navigation" aria-label="related navigation">
+ {%- if prev %}
+ <a href="{{ prev.link|e }}">&laquo; {{ prev.title }}</a> |
+ {%- endif %}
+ <a href="{{ pathto(current_page_name)|e if current_page_name else '#' }}">{{ title }}</a>
+ {%- if next %}
+ | <a href="{{ next.link|e }}">{{ next.title }} &raquo;</a>
+ {%- endif %}
+ </div>
+ <div id="contentwrapper">
+ {%- if display_toc %}
+ <div id="toc" role="navigation" aria-label="table of contents navigation">
+ <h3>{{ _('Table of Contents') }}</h3>
+ {{ toc }}
+ </div>
+ {%- endif %}
+ <div role="main">
+ {% block body %}{% endblock %}
+ </div>
+ </div>
+ </div>
+{% endblock %}
diff --git a/sphinx/themes/scrolls/static/darkmetal.png b/sphinx/themes/scrolls/static/darkmetal.png
new file mode 100644
index 0000000..49c82f3
--- /dev/null
+++ b/sphinx/themes/scrolls/static/darkmetal.png
Binary files differ
diff --git a/sphinx/themes/scrolls/static/headerbg.png b/sphinx/themes/scrolls/static/headerbg.png
new file mode 100644
index 0000000..ef15cc0
--- /dev/null
+++ b/sphinx/themes/scrolls/static/headerbg.png
Binary files differ
diff --git a/sphinx/themes/scrolls/static/logo.png b/sphinx/themes/scrolls/static/logo.png
new file mode 100644
index 0000000..354aded
--- /dev/null
+++ b/sphinx/themes/scrolls/static/logo.png
Binary files differ
diff --git a/sphinx/themes/scrolls/static/metal.png b/sphinx/themes/scrolls/static/metal.png
new file mode 100644
index 0000000..c29cd9e
--- /dev/null
+++ b/sphinx/themes/scrolls/static/metal.png
Binary files differ
diff --git a/sphinx/themes/scrolls/static/navigation.png b/sphinx/themes/scrolls/static/navigation.png
new file mode 100644
index 0000000..89c447a
--- /dev/null
+++ b/sphinx/themes/scrolls/static/navigation.png
Binary files differ
diff --git a/sphinx/themes/scrolls/static/print.css b/sphinx/themes/scrolls/static/print.css
new file mode 100644
index 0000000..715d90a
--- /dev/null
+++ b/sphinx/themes/scrolls/static/print.css
@@ -0,0 +1,7 @@
+@media print {
+ div.header, div.relnav, #toc { display: none; }
+ #contentwrapper { padding: 0; margin: 0; border: none; }
+ body { color: black; background-color: white; }
+ div.footer { border-top: 1px solid #888; color: #888; margin-top: 1cm; }
+ div.footer a { text-decoration: none; }
+}
diff --git a/sphinx/themes/scrolls/static/scrolls.css_t b/sphinx/themes/scrolls/static/scrolls.css_t
new file mode 100644
index 0000000..ae6eb0a
--- /dev/null
+++ b/sphinx/themes/scrolls/static/scrolls.css_t
@@ -0,0 +1,502 @@
+/*
+ * scrolls.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- scrolls theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+body {
+ background-color: #222;
+ margin: 0;
+ padding: 0;
+ font-family: 'Georgia', serif;
+ font-size: 15px;
+ color: #eee;
+}
+
+div.footer {
+ border-top: 1px solid #111;
+ padding: 8px;
+ font-size: 11px;
+ text-align: center;
+ letter-spacing: 0.5px;
+}
+
+div.footer a {
+ color: #eee;
+}
+
+div.header {
+ margin: 0 -15px 0 -15px;
+ background: url(headerbg.png) repeat-x;
+ border-top: 6px solid {{ theme_headerbordercolor }};
+}
+
+div.relnav {
+ border-bottom: 1px solid #111;
+ background: url(navigation.png);
+ margin: 0 -15px 0 -15px;
+ padding: 2px 20px 0 28px;
+ line-height: 25px;
+ color: #aaa;
+ font-size: 12px;
+ text-align: center;
+}
+
+div.relnav a {
+ color: #eee;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+div.relnav a:hover {
+ text-decoration: underline;
+}
+
+#content {
+ background-color: white;
+ color: #111;
+ border-bottom: 1px solid black;
+ background: url(watermark.png) center 0;
+ padding: 0 15px 0 15px;
+ margin: 0;
+}
+
+h1 {
+ margin: 0;
+ padding: 15px 0 0 0;
+}
+
+h1.heading {
+ margin: 0;
+ padding: 0;
+ height: 80px;
+}
+
+h1.heading:hover {
+ background: #222;
+}
+
+h1.heading a {
+ background: url({{ logo if logo else 'logo.png' }}) no-repeat center 0;
+ display: block;
+ width: 100%;
+ height: 80px;
+}
+
+h1.heading a:focus {
+ -moz-outline: none;
+ outline: none;
+}
+
+h1.heading span {
+ display: none;
+}
+
+#contentwrapper {
+ min-width: {{ theme_body_min_width|todim }};
+ max-width: {{ theme_body_max_width|todim }};
+ padding: 0 18px 20px 18px;
+ margin: 0 auto 0 auto;
+ border-right: 1px solid #eee;
+ border-left: 1px solid #eee;
+ background: url(watermark_blur.png) center -114px;
+}
+
+#contentwrapper h2,
+#contentwrapper h2 a {
+ color: #222;
+ font-size: 24px;
+ margin: 20px 0 0 0;
+}
+
+#contentwrapper h3,
+#contentwrapper h3 a {
+ color: {{ theme_subheadlinecolor }};
+ font-size: 20px;
+ margin: 20px 0 0 0;
+}
+
+table.docutils {
+ border-collapse: collapse;
+ border: 2px solid #aaa;
+ margin: 0.5em 1.5em 0.5em 1.5em;
+}
+
+table.docutils td {
+ padding: 2px;
+ border: 1px solid #ddd;
+}
+
+p, li, dd, dt, blockquote {
+ color: #333;
+}
+
+blockquote {
+ margin: 10px 0 10px 20px;
+}
+
+p {
+ line-height: 20px;
+ margin-bottom: 0;
+ margin-top: 10px;
+}
+
+hr {
+ border-top: 1px solid #ccc;
+ border-bottom: 0;
+ border-right: 0;
+ border-left: 0;
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+
+dl {
+ margin-left: 10px;
+}
+
+li, dt {
+ margin-top: 5px;
+}
+
+dt {
+ font-weight: bold;
+ color: #000;
+}
+
+dd {
+ margin-top: 10px;
+ line-height: 20px;
+}
+
+th {
+ text-align: left;
+ padding: 3px;
+ background-color: #f2f2f2;
+}
+
+a {
+ color: {{ theme_linkcolor }};
+}
+
+a:hover {
+ color: {{ theme_visitedlinkcolor }};
+}
+
+a:visited {
+ color: {{ theme_visitedlinkcolor }};
+}
+
+pre {
+ background-image: url(metal.png);
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ padding: 5px;
+ font-size: 13px;
+ font-family: 'Bitstream Vera Sans Mono', 'Monaco', monospace;
+}
+
+code {
+ font-size: 13px;
+ font-family: 'Bitstream Vera Sans Mono', 'Monaco', monospace;
+ color: black;
+ padding: 1px 2px 1px 2px;
+ background-color: #fafafa;
+ border-bottom: 1px solid #eee;
+}
+
+div.code-block-caption {
+ color: #efefef;
+ background-color: #888;
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ padding: 1em 1em 0;
+}
+
+div.literal-block-wrapper pre {
+ margin: 0;
+}
+
+a.reference:hover code {
+ border-bottom-color: #aaa;
+}
+
+cite {
+ /* abusing <cite>, it's generated by ReST for `x` */
+ font-size: 13px;
+ font-family: 'Bitstream Vera Sans Mono', 'Monaco', monospace;
+ font-weight: bold;
+ font-style: normal;
+}
+
+div.admonition {
+ margin: 10px 0 10px 0;
+ padding: 10px;
+ border: 1px solid #ccc;
+}
+
+div.admonition p.admonition-title {
+ background-color: {{ theme_admonitioncolor }};
+ color: white;
+ margin: -10px -10px 10px -10px;
+ padding: 4px 10px 4px 10px;
+ font-weight: bold;
+ font-size: 15px;
+}
+
+div.admonition p.admonition-title a {
+ color: white!important;
+}
+
+a.headerlink {
+ color: #B4B4B4!important;
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none!important;
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+a.headerlink:hover {
+ background-color: #B4B4B4;
+ color: #F0F0F0!important;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.indextable {
+ width: 100%;
+}
+
+table.genindextable td {
+ vertical-align: top;
+ width: 50%;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+ font-size: 11px;
+}
+
+table.indextable ul a {
+ color: #000;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+table.modindextable {
+ width: 100%;
+ border: none;
+}
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+table.modindextable img.toggler {
+ margin-right: 10px;
+}
+
+dl.function dt,
+dl.class dt,
+dl.exception dt,
+dl.method dt,
+dl.attribute dt {
+ font-weight: normal;
+}
+
+dt .descname {
+ font-weight: bold;
+ margin-right: 4px;
+}
+
+dt .sig-paren {
+ font-size: larger;
+}
+
+dt .descname, dt .descclassname {
+ padding: 0;
+ background: transparent;
+ border-bottom: 1px solid #111;
+}
+
+dt .descclassname {
+ margin-left: 2px;
+}
+
+dl dt big {
+ font-size: 100%;
+}
+
+ul.search {
+ margin: 10px 0 0 30px;
+ padding: 0;
+}
+
+ul.search li {
+ margin: 10px 0 0 0;
+ padding: 0;
+}
+
+ul.search div.context {
+ font-size: 12px;
+ padding: 4px 0 0 20px;
+ color: #888;
+}
+
+span.highlight {
+ background-color: #eee;
+ border: 1px solid #ccc;
+}
+
+#toc {
+ margin: 0 -17px 0 -17px;
+ display: none;
+}
+
+#toc h3 {
+ float: right;
+ margin: 5px 5px 0 0;
+ padding: 0;
+ font-size: 12px;
+ color: #777;
+}
+
+#toc h3:hover {
+ color: #333;
+ cursor: pointer;
+}
+
+.expandedtoc {
+ background: #222 url(darkmetal.png);
+ border-bottom: 1px solid #111;
+ outline-bottom: 1px solid #000;
+ padding: 5px;
+}
+
+.expandedtoc h3 {
+ color: #aaa;
+ margin: 0!important;
+}
+
+.expandedtoc h3:hover {
+ color: white!important;
+}
+
+#tod h3:hover {
+ color: white;
+}
+
+#toc a {
+ color: #ddd;
+ text-decoration: none;
+}
+
+#toc a:hover {
+ color: white;
+ text-decoration: underline;
+}
+
+#toc ul {
+ margin: 5px 0 12px 17px;
+ padding: 0 7px 0 7px;
+}
+
+#toc ul ul {
+ margin-bottom: 0;
+}
+
+#toc ul li {
+ margin: 2px 0 0 0;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: 'Georgia', serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+ margin: -1px -5px;
+ padding: 0 5px;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* math display */
+
+div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
diff --git a/sphinx/themes/scrolls/static/theme_extras.js b/sphinx/themes/scrolls/static/theme_extras.js
new file mode 100644
index 0000000..df2be40
--- /dev/null
+++ b/sphinx/themes/scrolls/static/theme_extras.js
@@ -0,0 +1,12 @@
+const initialiseThemeExtras = () => {
+ const toc = document.getElementById("toc")
+ toc.style.display = ""
+ const items = toc.getElementsByTagName("ul")[0]
+ items.style.display = "none"
+ toc.getElementsByTagName("h3").addEventListener("click", () => {
+ if (items.style.display !== "none") toc.classList.remove("expandedtoc")
+ else toc.classList.add("expandedtoc");
+ })
+}
+if (document.readyState !== "loading") initialiseThemeExtras()
+else document.addEventListener("DOMContentLoaded", initialiseThemeExtras)
diff --git a/sphinx/themes/scrolls/static/watermark.png b/sphinx/themes/scrolls/static/watermark.png
new file mode 100644
index 0000000..d71dc4b
--- /dev/null
+++ b/sphinx/themes/scrolls/static/watermark.png
Binary files differ
diff --git a/sphinx/themes/scrolls/static/watermark_blur.png b/sphinx/themes/scrolls/static/watermark_blur.png
new file mode 100644
index 0000000..9fc0b6d
--- /dev/null
+++ b/sphinx/themes/scrolls/static/watermark_blur.png
Binary files differ
diff --git a/sphinx/themes/scrolls/theme.conf b/sphinx/themes/scrolls/theme.conf
new file mode 100644
index 0000000..7e83de1
--- /dev/null
+++ b/sphinx/themes/scrolls/theme.conf
@@ -0,0 +1,13 @@
+[theme]
+inherit = basic
+stylesheet = scrolls.css
+pygments_style = tango
+
+[options]
+body_min_width = 0
+body_max_width = 680
+headerbordercolor = #1752b4
+subheadlinecolor = #0d306b
+linkcolor = #1752b4
+visitedlinkcolor = #551a8b
+admonitioncolor = #28437f
diff --git a/sphinx/themes/sphinxdoc/static/contents.png b/sphinx/themes/sphinxdoc/static/contents.png
new file mode 100644
index 0000000..6c59aa1
--- /dev/null
+++ b/sphinx/themes/sphinxdoc/static/contents.png
Binary files differ
diff --git a/sphinx/themes/sphinxdoc/static/navigation.png b/sphinx/themes/sphinxdoc/static/navigation.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/sphinx/themes/sphinxdoc/static/navigation.png
Binary files differ
diff --git a/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t
new file mode 100644
index 0000000..bf4d254
--- /dev/null
+++ b/sphinx/themes/sphinxdoc/static/sphinxdoc.css_t
@@ -0,0 +1,354 @@
+/*
+ * sphinxdoc.css_t
+ * ~~~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- sphinxdoc theme. Originally created by
+ * Armin Ronacher for Werkzeug.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+ font-size: 14px;
+ letter-spacing: -0.01em;
+ line-height: 150%;
+ text-align: center;
+ background-color: #BFD1D4;
+ color: black;
+ padding: 0;
+ border: 1px solid #aaa;
+
+ margin: 0px 80px 0px 80px;
+ min-width: 740px;
+}
+
+div.document {
+ background-color: white;
+ text-align: left;
+ background-image: url(contents.png);
+ background-repeat: repeat-x;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 calc({{ theme_sidebarwidth|todim }} + 10px) 0 0;
+ border-right: 1px solid #ccc;
+}
+
+div.body {
+ margin: 0;
+ padding: 0.5em 20px 20px 20px;
+}
+
+div.related {
+ font-size: 1em;
+}
+
+div.related ul {
+ background-image: url(navigation.png);
+ height: 2em;
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+}
+
+div.related ul li {
+ margin: 0;
+ padding: 0;
+ height: 2em;
+ float: left;
+}
+
+div.related ul li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+div.related ul li a {
+ margin: 0;
+ padding: 0 5px 0 5px;
+ line-height: 1.75em;
+ color: #EE9816;
+}
+
+div.related ul li a:hover {
+ color: #3CA8E7;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 0;
+}
+
+div.sphinxsidebar {
+ padding: 0.5em 15px 15px 0;
+ width: calc({{ theme_sidebarwidth|todim }} - 20px);
+ float: right;
+ font-size: 1em;
+ text-align: left;
+}
+
+div.sphinxsidebar h3, div.sphinxsidebar h4 {
+ margin: 1em 0 0.5em 0;
+ font-size: 1em;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border: 1px solid #86989B;
+ background-color: #AFC1C4;
+}
+
+div.sphinxsidebar h3 a {
+ color: white;
+}
+
+div.sphinxsidebar ul {
+ padding-left: 1.5em;
+ margin-top: 7px;
+ padding: 0;
+ line-height: 130%;
+}
+
+div.sphinxsidebar ul ul {
+ margin-left: 20px;
+}
+
+div.footer {
+ background-color: #E3EFF1;
+ color: #86989B;
+ padding: 3px 8px 3px 0;
+ clear: both;
+ font-size: 0.8em;
+ text-align: right;
+}
+
+div.footer a {
+ color: #86989B;
+ text-decoration: underline;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+p {
+ margin: 0.8em 0 0.5em 0;
+}
+
+a {
+ color: #CA7900;
+ text-decoration: none;
+}
+
+a:hover {
+ color: #2491CF;
+}
+
+a:visited {
+ color: #551A8B;
+}
+
+div.body a {
+ text-decoration: underline;
+}
+
+h1 {
+ margin: 0;
+ padding: 0.7em 0 0.3em 0;
+ font-size: 1.5em;
+ color: #11557C;
+}
+
+h2 {
+ margin: 1.3em 0 0.2em 0;
+ font-size: 1.35em;
+ padding: 0;
+}
+
+h3 {
+ margin: 1em 0 -0.3em 0;
+ font-size: 1.2em;
+}
+
+div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
+ color: black!important;
+}
+
+h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
+ display: none;
+ margin: 0 0 0 0.3em;
+ padding: 0 0.2em 0 0.2em;
+ color: #aaa!important;
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+ display: inline;
+}
+
+h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
+h5 a.anchor:hover, h6 a.anchor:hover {
+ color: #777;
+ background-color: #eee;
+}
+
+a.headerlink {
+ color: #c60f0f!important;
+ font-size: 1em;
+ margin-left: 6px;
+ padding: 0 4px 0 4px;
+ text-decoration: none!important;
+}
+
+a.headerlink:hover {
+ background-color: #ccc;
+ color: white!important;
+}
+
+cite, code, code {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.01em;
+}
+
+code {
+ background-color: #f2f2f2;
+ border-bottom: 1px solid #ddd;
+ color: #333;
+}
+
+code.descname, code.descclassname, code.xref {
+ border: 0;
+}
+
+hr {
+ border: 1px solid #abc;
+ margin: 2em;
+}
+
+a code {
+ border: 0;
+ color: #CA7900;
+}
+
+a code:hover {
+ color: #2491CF;
+}
+
+pre {
+ font-family: 'Consolas', 'Deja Vu Sans Mono',
+ 'Bitstream Vera Sans Mono', monospace;
+ font-size: 0.95em;
+ letter-spacing: 0.015em;
+ line-height: 120%;
+ padding: 0.5em;
+ border: 1px solid #ccc;
+}
+
+pre a {
+ color: inherit;
+ text-decoration: underline;
+}
+
+td.linenos pre {
+ padding: 0.5em 0;
+}
+
+div.quotebar {
+ background-color: #f8f8f8;
+ max-width: 250px;
+ float: right;
+ padding: 2px 7px;
+ border: 1px solid #ccc;
+}
+
+nav.contents,
+aside.topic,
+div.topic {
+ background-color: #f8f8f8;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 0 -0.5em 0 -0.5em;
+}
+
+table td, table th {
+ padding: 0.2em 0.5em 0.2em 0.5em;
+}
+
+div.admonition, div.warning {
+ font-size: 0.9em;
+ margin: 1em 0 1em 0;
+ border: 1px solid #86989B;
+ background-color: #f7f7f7;
+ padding: 0;
+}
+
+div.admonition p, div.warning p {
+ margin: 0.5em 1em 0.5em 1em;
+ padding: 0;
+}
+
+div.admonition pre, div.warning pre {
+ margin: 0.4em 1em 0.4em 1em;
+}
+
+div.admonition p.admonition-title,
+div.warning p.admonition-title {
+ margin: 0;
+ padding: 0.1em 0 0.1em 0.5em;
+ color: white;
+ border-bottom: 1px solid #86989B;
+ font-weight: bold;
+ background-color: #AFC1C4;
+}
+
+div.warning {
+ border: 1px solid #940000;
+}
+
+div.warning p.admonition-title {
+ background-color: #CF0000;
+ border-bottom-color: #940000;
+}
+
+div.admonition ul, div.admonition ol,
+div.warning ul, div.warning ol {
+ margin: 0.1em 0.5em 0.5em 3em;
+ padding: 0;
+}
+
+div.versioninfo {
+ margin: 1em 0 0 0;
+ border: 1px solid #ccc;
+ background-color: #DDEAF0;
+ padding: 8px;
+ line-height: 1.3em;
+ font-size: 0.9em;
+}
+
+.viewcode-back {
+ font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
+ 'Verdana', sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+}
+
+div.code-block-caption {
+ background-color: #ddd;
+ color: #222;
+ border: 1px solid #ccc;
+}
diff --git a/sphinx/themes/sphinxdoc/theme.conf b/sphinx/themes/sphinxdoc/theme.conf
new file mode 100644
index 0000000..9a22fef
--- /dev/null
+++ b/sphinx/themes/sphinxdoc/theme.conf
@@ -0,0 +1,4 @@
+[theme]
+inherit = basic
+stylesheet = sphinxdoc.css
+pygments_style = friendly
diff --git a/sphinx/themes/traditional/static/traditional.css_t b/sphinx/themes/traditional/static/traditional.css_t
new file mode 100644
index 0000000..085c98a
--- /dev/null
+++ b/sphinx/themes/traditional/static/traditional.css_t
@@ -0,0 +1,765 @@
+/*
+ * traditional.css
+ * ~~~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- traditional docs.python.org theme.
+ *
+ * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+body {
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 {{ theme_sidebarwidth|todim }} 0 0;
+}
+
+div.body {
+ min-width: {{ theme_body_min_width|todim }};
+ max-width: {{ theme_body_max_width|todim }};
+ background-color: white;
+ padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+ border: 1px solid #99ccff;
+ padding: 10px;
+ margin: 10px 15px 10px 0;
+}
+
+div.sphinxsidebar {
+ float: right;
+ margin-left: -100%;
+ width: {{ theme_sidebarwidth|todim }};
+}
+
+div.clearer {
+ clear: both;
+}
+
+div.footer {
+ clear: both;
+ width: 100%;
+ background-color: #99ccff;
+ padding: 9px 0 9px 0;
+ text-align: center;
+}
+
+div.related {
+ background-color: #99ccff;
+ color: #333;
+ width: 100%;
+ height: 30px;
+ line-height: 30px;
+ border-bottom: 5px solid white;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+ font-weight: bold;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* ::: SIDEBAR :::: */
+div.sphinxsidebar h3 {
+ margin: 0;
+}
+
+div.sphinxsidebar h4 {
+ margin: 5px 0 0 0;
+}
+
+div.sphinxsidebar p.topless {
+ margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px;
+ margin-left: 15px;
+ padding: 0;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+
+/* :::: SEARCH :::: */
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+ border-top: 1px solid #aaa;
+ background-color: #ddd;
+ margin: 10px 0 0 -20px;
+ padding: 5px 0 5px 20px;
+}
+
+form dl {
+ color: #333;
+}
+
+form dt {
+ clear: both;
+ float: left;
+ min-width: 110px;
+ margin-right: 10px;
+ padding-top: 2px;
+}
+
+input#homepage {
+ display: none;
+}
+
+div.error {
+ margin: 5px 20px 0 0;
+ padding: 5px;
+ border: 1px solid #d00;
+ /*border: 2px solid #05171e;
+ background-color: #092835;
+ color: white;*/
+ font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecommentswrapper {
+ float: right;
+ max-width: 40%;
+}
+
+div.commentmarker {
+ float: right;
+ background-image: url(style/comment.png);
+ background-repeat: no-repeat;
+ width: 25px;
+ height: 25px;
+ text-align: center;
+ padding-top: 3px;
+}
+
+div.nocommentmarker {
+ float: right;
+ background-image: url(style/nocomment.png);
+ background-repeat: no-repeat;
+ width: 25px;
+ height: 25px;
+}
+
+div.inlinecomments {
+ margin-left: 10px;
+ margin-bottom: 5px;
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 5px;
+}
+
+div.inlinecomment {
+ border-top: 1px solid #ccc;
+ padding-top: 5px;
+ margin-top: 5px;
+}
+
+.inlinecomments p {
+ margin: 5px 0 5px 0;
+}
+
+.inlinecomments .head {
+ font-weight: bold;
+}
+
+.inlinecomments .meta {
+ font-style: italic;
+}
+
+
+/* :::: COMMENTS :::: */
+
+div#comments h3 {
+ border-top: 1px solid #aaa;
+ padding: 5px 20px 5px 20px;
+ margin: 20px -20px 20px -20px;
+ background-color: #ddd;
+}
+
+/*
+div#comments {
+ background-color: #ccc;
+ margin: 40px -20px -30px -20px;
+ padding: 0 0 1px 0;
+}
+
+div#comments h4 {
+ margin: 30px 0 20px 0;
+ background-color: #aaa;
+ border-bottom: 1px solid #09232e;
+ color: #333;
+}
+
+div#comments form {
+ display: block;
+ margin: 0 0 0 20px;
+}
+
+div#comments textarea {
+ width: 98%;
+ height: 160px;
+}
+
+div#comments div.help {
+ margin: 20px 20px 10px 0;
+ background-color: #ccc;
+ color: #333;
+}
+
+div#comments div.help p {
+ margin: 0;
+ padding: 0 0 10px 0;
+}
+
+div#comments input, div#comments textarea {
+ font-family: 'Bitstream Vera Sans', 'Arial', sans-serif;
+ font-size: 13px;
+ color: black;
+ background-color: #aaa;
+ border: 1px solid #092835;
+}
+
+div#comments input[type="reset"],
+div#comments input[type="submit"] {
+ cursor: pointer;
+ font-weight: bold;
+ padding: 2px;
+ margin: 5px 5px 5px 0;
+ background-color: #666;
+ color: white;
+}
+
+div#comments div.comment {
+ margin: 10px 10px 10px 20px;
+ padding: 10px;
+ border: 1px solid #0f3646;
+ background-color: #aaa;
+ color: #333;
+}
+
+div#comments div.comment p {
+ margin: 5px 0 5px 0;
+}
+
+div#comments div.comment p.meta {
+ font-style: italic;
+ color: #444;
+ text-align: right;
+ margin: -5px 0 -5px 0;
+}
+
+div#comments div.comment h4 {
+ margin: -10px -10px 5px -10px;
+ padding: 3px;
+ font-size: 15px;
+ background-color: #888;
+ color: white;
+ border: 0;
+}
+
+div#comments div.comment pre,
+div#comments div.comment code {
+ background-color: #ddd;
+ color: #111;
+ border: none;
+}
+
+div#comments div.comment a {
+ color: #fff;
+ text-decoration: underline;
+}
+
+div#comments div.comment blockquote {
+ margin: 10px;
+ padding: 10px;
+ border-left: 1px solid #0f3646;
+ /*border: 1px solid #0f3646;
+ background-color: #071c25;*/
+}
+
+div#comments em.important {
+ color: #d00;
+ font-weight: bold;
+ font-style: normal;
+}*/
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+ border: 1px solid #ccc;
+ background-color: white;
+ color: black;
+}
+
+div#suggest-changes-box textarea {
+ width: 99%;
+ height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview {
+ background-image: url(style/preview.png);
+ padding: 0 20px 20px 20px;
+ margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.5em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+}
+
+/* :::: GENINDEX STYLES :::: */
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+/* :::: DOMAIN MODULE INDEX STYLES :::: */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+p.subhead {
+ font-weight: bold;
+ margin-top: 20px;
+}
+
+a:link:active { color: #ff0000; }
+a:link:hover { background-color: #bbeeff; }
+a:visited:hover { background-color: #bbeeff; }
+a:visited { color: #551a8b; }
+a:link { color: #0000bb; }
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: avantgarde, sans-serif;
+ font-weight: bold;
+}
+
+div.body h1 { font-size: 180%; }
+div.body h2 { font-size: 150%; }
+div.body h3 { font-size: 120%; }
+div.body h4 { font-size: 120%; }
+
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink,
+a.headerlink {
+ color: #c60f0f;
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none;
+ visibility: hidden;
+}
+
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink,
+*:hover > a.headerlink {
+ visibility: visible;
+}
+
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover,
+a.headerlink:hover {
+ background-color: #c60f0f;
+ color: white;
+}
+
+div.body p, div.body dd, div.body li {
+ text-align: justify;
+}
+
+div.body td {
+ text-align: left;
+}
+
+ul.fakelist {
+ list-style: none;
+ margin: 10px 0 10px 20px;
+ padding: 0;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+/* "Topics" */
+
+nav.contents,
+aside.topic,
+div.topic {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 0 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dd {
+ margin-bottom: 10px;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+div.admonition p {
+ display: inline;
+}
+
+div.seealso {
+ background-color: #ffc;
+ border: 1px solid #ff6;
+}
+
+div.warning {
+ background-color: #ffe4e4;
+ border: 1px solid #f66;
+}
+
+div.note {
+ background-color: #eee;
+ border: 1px solid #ccc;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+ display: inline;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+table.docutils {
+ border: 0;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 0 8px 2px 0;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+dl {
+ margin-bottom: 15px;
+ clear: both;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+pre {
+ font-family: monospace;
+ padding: 5px;
+ border-left: none;
+ border-right: none;
+}
+
+code {
+ font-family: monospace;
+ background-color: #ecf0f3;
+ padding: 0 1px 0 1px;
+}
+
+code.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+code.descclassname {
+ background-color: transparent;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.footnote:target { background-color: #ffa }
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+/* :::: PRINT :::: */
+@media print {
+ div.documentwrapper {
+ width: 100%;
+ }
+
+ div.body {
+ margin: 0;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ div#comments div.new-comment-box,
+ #top-link {
+ display: none;
+ }
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+div.code-block-caption {
+ background-color: #cceeff;
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ padding: 1em 1em 0;
+}
+
+div.literal-block-wrapper pre {
+ margin: 0;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* :::: MATH DISPLAY :::: */
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
diff --git a/sphinx/themes/traditional/theme.conf b/sphinx/themes/traditional/theme.conf
new file mode 100644
index 0000000..acc6bc7
--- /dev/null
+++ b/sphinx/themes/traditional/theme.conf
@@ -0,0 +1,7 @@
+[theme]
+inherit = basic
+stylesheet = traditional.css
+
+[options]
+body_min_width = 0
+body_max_width = none
diff --git a/sphinx/theming.py b/sphinx/theming.py
new file mode 100644
index 0000000..a8a3f83
--- /dev/null
+++ b/sphinx/theming.py
@@ -0,0 +1,232 @@
+"""Theming support for HTML builders."""
+
+from __future__ import annotations
+
+import configparser
+import os
+import shutil
+import sys
+import tempfile
+from os import path
+from typing import TYPE_CHECKING, Any
+from zipfile import ZipFile
+
+if sys.version_info >= (3, 10):
+ from importlib.metadata import entry_points
+else:
+ from importlib_metadata import entry_points
+
+import contextlib
+
+from sphinx import package_dir
+from sphinx.errors import ThemeError
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.osutil import ensuredir
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+
+logger = logging.getLogger(__name__)
+
+NODEFAULT = object()
+THEMECONF = 'theme.conf'
+
+
+def extract_zip(filename: str, targetdir: str) -> None:
+ """Extract zip file to target directory."""
+ ensuredir(targetdir)
+
+ with ZipFile(filename) as archive:
+ for name in archive.namelist():
+ if name.endswith('/'):
+ continue
+ entry = path.join(targetdir, name)
+ ensuredir(path.dirname(entry))
+ with open(path.join(entry), 'wb') as fp:
+ fp.write(archive.read(name))
+
+
+class Theme:
+ """A Theme is a set of HTML templates and configurations.
+
+ This class supports both theme directory and theme archive (zipped theme)."""
+
+ def __init__(self, name: str, theme_path: str, factory: HTMLThemeFactory) -> None:
+ self.name = name
+ self.base = None
+ self.rootdir = None
+
+ if path.isdir(theme_path):
+ # already a directory, do nothing
+ self.rootdir = None
+ self.themedir = theme_path
+ else:
+ # extract the theme to a temp directory
+ self.rootdir = tempfile.mkdtemp('sxt')
+ self.themedir = path.join(self.rootdir, name)
+ extract_zip(theme_path, self.themedir)
+
+ self.config = configparser.RawConfigParser()
+ self.config.read(path.join(self.themedir, THEMECONF), encoding='utf-8')
+
+ try:
+ inherit = self.config.get('theme', 'inherit')
+ except configparser.NoSectionError as exc:
+ raise ThemeError(__('theme %r doesn\'t have "theme" setting') % name) from exc
+ except configparser.NoOptionError as exc:
+ raise ThemeError(__('theme %r doesn\'t have "inherit" setting') % name) from exc
+
+ if inherit != 'none':
+ try:
+ self.base = factory.create(inherit)
+ except ThemeError as exc:
+ raise ThemeError(__('no theme named %r found, inherited by %r') %
+ (inherit, name)) from exc
+
+ def get_theme_dirs(self) -> list[str]:
+ """Return a list of theme directories, beginning with this theme's,
+ then the base theme's, then that one's base theme's, etc.
+ """
+ if self.base is None:
+ return [self.themedir]
+ else:
+ return [self.themedir] + self.base.get_theme_dirs()
+
+ def get_config(self, section: str, name: str, default: Any = NODEFAULT) -> Any:
+ """Return the value for a theme configuration setting, searching the
+ base theme chain.
+ """
+ try:
+ return self.config.get(section, name)
+ except (configparser.NoOptionError, configparser.NoSectionError) as exc:
+ if self.base:
+ return self.base.get_config(section, name, default)
+
+ if default is NODEFAULT:
+ raise ThemeError(__('setting %s.%s occurs in none of the '
+ 'searched theme configs') % (section, name)) from exc
+ return default
+
+ def get_options(self, overrides: dict[str, Any] | None = None) -> dict[str, Any]:
+ """Return a dictionary of theme options and their values."""
+ if overrides is None:
+ overrides = {}
+
+ if self.base:
+ options = self.base.get_options()
+ else:
+ options = {}
+
+ with contextlib.suppress(configparser.NoSectionError):
+ options.update(self.config.items('options'))
+
+ for option, value in overrides.items():
+ if option not in options:
+ logger.warning(__('unsupported theme option %r given') % option)
+ else:
+ options[option] = value
+
+ return options
+
+ def cleanup(self) -> None:
+ """Remove temporary directories."""
+ if self.rootdir:
+ with contextlib.suppress(Exception):
+ shutil.rmtree(self.rootdir)
+
+ if self.base:
+ self.base.cleanup()
+
+
+def is_archived_theme(filename: str) -> bool:
+ """Check whether the specified file is an archived theme file or not."""
+ try:
+ with ZipFile(filename) as f:
+ return THEMECONF in f.namelist()
+ except Exception:
+ return False
+
+
+class HTMLThemeFactory:
+ """A factory class for HTML Themes."""
+
+ def __init__(self, app: Sphinx) -> None:
+ self.app = app
+ self.themes = app.registry.html_themes
+ self.load_builtin_themes()
+ if getattr(app.config, 'html_theme_path', None):
+ self.load_additional_themes(app.config.html_theme_path)
+
+ def load_builtin_themes(self) -> None:
+ """Load built-in themes."""
+ themes = self.find_themes(path.join(package_dir, 'themes'))
+ for name, theme in themes.items():
+ self.themes[name] = theme
+
+ def load_additional_themes(self, theme_paths: str) -> None:
+ """Load additional themes placed at specified directories."""
+ for theme_path in theme_paths:
+ abs_theme_path = path.abspath(path.join(self.app.confdir, theme_path))
+ themes = self.find_themes(abs_theme_path)
+ for name, theme in themes.items():
+ self.themes[name] = theme
+
+ def load_extra_theme(self, name: str) -> None:
+ """Try to load a theme with the specified name."""
+ if name == 'alabaster':
+ self.load_alabaster_theme()
+ else:
+ self.load_external_theme(name)
+
+ def load_alabaster_theme(self) -> None:
+ """Load alabaster theme."""
+ import alabaster
+ self.themes['alabaster'] = path.join(alabaster.get_path(), 'alabaster')
+
+ def load_external_theme(self, name: str) -> None:
+ """Try to load a theme using entry_points.
+
+ Sphinx refers to ``sphinx_themes`` entry_points.
+ """
+ # look up for new styled entry_points at first
+ theme_entry_points = entry_points(group='sphinx.html_themes')
+ try:
+ entry_point = theme_entry_points[name]
+ self.app.registry.load_extension(self.app, entry_point.module)
+ self.app.config.post_init_values()
+ return
+ except KeyError:
+ pass
+
+ def find_themes(self, theme_path: str) -> dict[str, str]:
+ """Search themes from specified directory."""
+ themes: dict[str, str] = {}
+ if not path.isdir(theme_path):
+ return themes
+
+ for entry in os.listdir(theme_path):
+ pathname = path.join(theme_path, entry)
+ if path.isfile(pathname) and entry.lower().endswith('.zip'):
+ if is_archived_theme(pathname):
+ name = entry[:-4]
+ themes[name] = pathname
+ else:
+ logger.warning(__('file %r on theme path is not a valid '
+ 'zipfile or contains no theme'), entry)
+ else:
+ if path.isfile(path.join(pathname, THEMECONF)):
+ themes[entry] = pathname
+
+ return themes
+
+ def create(self, name: str) -> Theme:
+ """Create an instance of theme."""
+ if name not in self.themes:
+ self.load_extra_theme(name)
+
+ if name not in self.themes:
+ raise ThemeError(__('no theme named %r found (missing theme.conf?)') % name)
+
+ return Theme(name, self.themes[name], factory=self)
diff --git a/sphinx/transforms/__init__.py b/sphinx/transforms/__init__.py
new file mode 100644
index 0000000..8a806cd
--- /dev/null
+++ b/sphinx/transforms/__init__.py
@@ -0,0 +1,516 @@
+"""Docutils transforms used by Sphinx when reading documents."""
+
+from __future__ import annotations
+
+import re
+import unicodedata
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.transforms import Transform, Transformer
+from docutils.transforms.parts import ContentsFilter
+from docutils.transforms.universal import SmartQuotes
+from docutils.utils import normalize_language_tag
+from docutils.utils.smartquotes import smartchars
+
+from sphinx import addnodes
+from sphinx.locale import _, __
+from sphinx.util import logging
+from sphinx.util.docutils import new_document
+from sphinx.util.i18n import format_date
+from sphinx.util.nodes import apply_source_workaround, is_smartquotable
+
+if TYPE_CHECKING:
+ from collections.abc import Generator
+
+ from docutils.nodes import Node, Text
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+ from sphinx.domains.std import StandardDomain
+ from sphinx.environment import BuildEnvironment
+
+
+logger = logging.getLogger(__name__)
+
+default_substitutions = {
+ 'version',
+ 'release',
+ 'today',
+ 'translation progress',
+}
+
+
+class SphinxTransform(Transform):
+ """A base class of Transforms.
+
+ Compared with ``docutils.transforms.Transform``, this class improves accessibility to
+ Sphinx APIs.
+ """
+
+ @property
+ def app(self) -> Sphinx:
+ """Reference to the :class:`.Sphinx` object."""
+ return self.env.app
+
+ @property
+ def env(self) -> BuildEnvironment:
+ """Reference to the :class:`.BuildEnvironment` object."""
+ return self.document.settings.env
+
+ @property
+ def config(self) -> Config:
+ """Reference to the :class:`.Config` object."""
+ return self.env.config
+
+
+class SphinxTransformer(Transformer):
+ """
+ A transformer for Sphinx.
+ """
+
+ document: nodes.document
+ env: BuildEnvironment | None = None
+
+ def set_environment(self, env: BuildEnvironment) -> None:
+ self.env = env
+
+ def apply_transforms(self) -> None:
+ if isinstance(self.document, nodes.document):
+ if not hasattr(self.document.settings, 'env') and self.env:
+ self.document.settings.env = self.env
+
+ super().apply_transforms()
+ else:
+ # wrap the target node by document node during transforming
+ try:
+ document = new_document('')
+ if self.env:
+ document.settings.env = self.env
+ document += self.document
+ self.document = document
+ super().apply_transforms()
+ finally:
+ self.document = self.document[0]
+
+
+class DefaultSubstitutions(SphinxTransform):
+ """
+ Replace some substitutions if they aren't defined in the document.
+ """
+ # run before the default Substitutions
+ default_priority = 210
+
+ def apply(self, **kwargs: Any) -> None:
+ # only handle those not otherwise defined in the document
+ to_handle = default_substitutions - set(self.document.substitution_defs)
+ for ref in self.document.findall(nodes.substitution_reference):
+ refname = ref['refname']
+ if refname in to_handle:
+ if refname == 'translation progress':
+ # special handling: calculate translation progress
+ text = _calculate_translation_progress(self.document)
+ else:
+ text = self.config[refname]
+ if refname == 'today' and not text:
+ # special handling: can also specify a strftime format
+ text = format_date(self.config.today_fmt or _('%b %d, %Y'),
+ language=self.config.language)
+ ref.replace_self(nodes.Text(text))
+
+
+def _calculate_translation_progress(document: nodes.document) -> str:
+ try:
+ translation_progress = document['translation_progress']
+ except KeyError:
+ return _('could not calculate translation progress!')
+
+ total = translation_progress['total']
+ translated = translation_progress['translated']
+ if total <= 0:
+ return _('no translated elements!')
+ return f'{translated / total:.2%}'
+
+
+class MoveModuleTargets(SphinxTransform):
+ """
+ Move module targets that are the first thing in a section to the section
+ title.
+
+ XXX Python specific
+ """
+ default_priority = 210
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in list(self.document.findall(nodes.target)):
+ if not node['ids']:
+ continue
+ if (
+ 'ismod' in node
+ and type(node.parent) is nodes.section
+ # index 0: section title node
+ # index 1: index node
+ # index 2: target node
+ and node.parent.index(node) == 2
+ ):
+ node.parent['ids'][0:0] = node['ids']
+ node.parent.remove(node)
+
+
+class HandleCodeBlocks(SphinxTransform):
+ """
+ Several code block related transformations.
+ """
+ default_priority = 210
+
+ def apply(self, **kwargs: Any) -> None:
+ # move doctest blocks out of blockquotes
+ for node in self.document.findall(nodes.block_quote):
+ if all(isinstance(child, nodes.doctest_block) for child
+ in node.children):
+ node.replace_self(node.children)
+ # combine successive doctest blocks
+ # for node in self.document.findall(nodes.doctest_block):
+ # if node not in node.parent.children:
+ # continue
+ # parindex = node.parent.index(node)
+ # while len(node.parent) > parindex+1 and \
+ # isinstance(node.parent[parindex+1], nodes.doctest_block):
+ # node[0] = nodes.Text(node[0] + '\n\n' +
+ # node.parent[parindex+1][0])
+ # del node.parent[parindex+1]
+
+
+class AutoNumbering(SphinxTransform):
+ """
+ Register IDs of tables, figures and literal_blocks to assign numbers.
+ """
+ default_priority = 210
+
+ def apply(self, **kwargs: Any) -> None:
+ domain: StandardDomain = self.env.domains['std']
+
+ for node in self.document.findall(nodes.Element):
+ if (domain.is_enumerable_node(node) and
+ domain.get_numfig_title(node) is not None and
+ node['ids'] == []):
+ self.document.note_implicit_target(node)
+
+
+class SortIds(SphinxTransform):
+ """
+ Sort section IDs so that the "id[0-9]+" one comes last.
+ """
+ default_priority = 261
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(nodes.section):
+ if len(node['ids']) > 1 and node['ids'][0].startswith('id'):
+ node['ids'] = node['ids'][1:] + [node['ids'][0]]
+
+
+TRANSLATABLE_NODES = {
+ 'literal-block': nodes.literal_block,
+ 'doctest-block': nodes.doctest_block,
+ 'raw': nodes.raw,
+ 'index': addnodes.index,
+ 'image': nodes.image,
+}
+
+
+class ApplySourceWorkaround(SphinxTransform):
+ """
+ Update source and rawsource attributes
+ """
+ default_priority = 10
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(): # type: Node
+ if isinstance(node, (nodes.TextElement, nodes.image, nodes.topic)):
+ apply_source_workaround(node)
+
+
+class AutoIndexUpgrader(SphinxTransform):
+ """
+ Detect old style (4 column based indices) and automatically upgrade to new style.
+ """
+ default_priority = 210
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(addnodes.index):
+ if 'entries' in node and any(len(entry) == 4 for entry in node['entries']):
+ msg = __('4 column based index found. '
+ 'It might be a bug of extensions you use: %r') % node['entries']
+ logger.warning(msg, location=node)
+ for i, entry in enumerate(node['entries']):
+ if len(entry) == 4:
+ node['entries'][i] = entry + (None,)
+
+
+class ExtraTranslatableNodes(SphinxTransform):
+ """
+ Make nodes translatable
+ """
+ default_priority = 10
+
+ def apply(self, **kwargs: Any) -> None:
+ targets = self.config.gettext_additional_targets
+ target_nodes = [v for k, v in TRANSLATABLE_NODES.items() if k in targets]
+ if not target_nodes:
+ return
+
+ def is_translatable_node(node: Node) -> bool:
+ return isinstance(node, tuple(target_nodes))
+
+ for node in self.document.findall(is_translatable_node): # type: nodes.Element
+ node['translatable'] = True
+
+
+class UnreferencedFootnotesDetector(SphinxTransform):
+ """
+ Detect unreferenced footnotes and emit warnings
+ """
+ default_priority = 200
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.footnotes:
+ if node['names'] == []:
+ # footnote having duplicated number. It is already warned at parser.
+ pass
+ elif node['names'][0] not in self.document.footnote_refs:
+ logger.warning(__('Footnote [%s] is not referenced.'), node['names'][0],
+ type='ref', subtype='footnote',
+ location=node)
+
+ for node in self.document.autofootnotes:
+ if not any(ref['auto'] == node['auto'] for ref in self.document.autofootnote_refs):
+ logger.warning(__('Footnote [#] is not referenced.'),
+ type='ref', subtype='footnote',
+ location=node)
+
+
+class DoctestTransform(SphinxTransform):
+ """Set "doctest" style to each doctest_block node"""
+ default_priority = 500
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(nodes.doctest_block):
+ node['classes'].append('doctest')
+
+
+class FilterSystemMessages(SphinxTransform):
+ """Filter system messages from a doctree."""
+ default_priority = 999
+
+ def apply(self, **kwargs: Any) -> None:
+ filterlevel = 2 if self.config.keep_warnings else 5
+ for node in list(self.document.findall(nodes.system_message)):
+ if node['level'] < filterlevel:
+ logger.debug('%s [filtered system message]', node.astext())
+ node.parent.remove(node)
+
+
+class SphinxContentsFilter(ContentsFilter):
+ """
+ Used with BuildEnvironment.add_toc_from() to discard cross-file links
+ within table-of-contents link nodes.
+ """
+ visit_pending_xref = ContentsFilter.ignore_node_but_process_children
+
+ def visit_image(self, node: nodes.image) -> None:
+ raise nodes.SkipNode
+
+
+class SphinxSmartQuotes(SmartQuotes, SphinxTransform):
+ """
+ Customized SmartQuotes to avoid transform for some extra node types.
+
+ refs: sphinx.parsers.RSTParser
+ """
+ default_priority = 750
+
+ def apply(self, **kwargs: Any) -> None:
+ if not self.is_available():
+ return
+
+ # override default settings with :confval:`smartquotes_action`
+ self.smartquotes_action = self.config.smartquotes_action
+
+ super().apply()
+
+ def is_available(self) -> bool:
+ builders = self.config.smartquotes_excludes.get('builders', [])
+ languages = self.config.smartquotes_excludes.get('languages', [])
+
+ if self.document.settings.smart_quotes is False:
+ # disabled by 3rd party extension (workaround)
+ return False
+ if self.config.smartquotes is False:
+ # disabled by confval smartquotes
+ return False
+ if self.app.builder.name in builders:
+ # disabled by confval smartquotes_excludes['builders']
+ return False
+ if self.config.language in languages:
+ # disabled by confval smartquotes_excludes['languages']
+ return False
+
+ # confirm selected language supports smart_quotes or not
+ language = self.env.settings['language_code']
+ return any(
+ tag in smartchars.quotes
+ for tag in normalize_language_tag(language)
+ )
+
+ def get_tokens(self, txtnodes: list[Text]) -> Generator[tuple[str, str], None, None]:
+ # A generator that yields ``(texttype, nodetext)`` tuples for a list
+ # of "Text" nodes (interface to ``smartquotes.educate_tokens()``).
+ for txtnode in txtnodes:
+ if is_smartquotable(txtnode):
+ # SmartQuotes uses backslash escapes instead of null-escapes
+ text = re.sub(r'(?<=\x00)([-\\\'".`])', r'\\\1', str(txtnode))
+ yield 'plain', text
+ else:
+ # skip smart quotes
+ yield 'literal', txtnode.astext()
+
+
+class DoctreeReadEvent(SphinxTransform):
+ """Emit :event:`doctree-read` event."""
+ default_priority = 880
+
+ def apply(self, **kwargs: Any) -> None:
+ self.app.emit('doctree-read', self.document)
+
+
+class ManpageLink(SphinxTransform):
+ """Find manpage section numbers and names"""
+ default_priority = 999
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(addnodes.manpage):
+ manpage = ' '.join([str(x) for x in node.children
+ if isinstance(x, nodes.Text)])
+ pattern = r'^(?P<path>(?P<page>.+)[\(\.](?P<section>[1-9]\w*)?\)?)$'
+ info = {'path': manpage,
+ 'page': manpage,
+ 'section': ''}
+ r = re.match(pattern, manpage)
+ if r:
+ info = r.groupdict()
+ node.attributes.update(info)
+
+
+class GlossarySorter(SphinxTransform):
+ """Sort glossaries that have the ``sorted`` flag."""
+ # This must be done after i18n, therefore not right
+ # away in the glossary directive.
+ default_priority = 500
+
+ def apply(self, **kwargs: Any) -> None:
+ for glossary in self.document.findall(addnodes.glossary):
+ if glossary["sorted"]:
+ definition_list = cast(nodes.definition_list, glossary[0])
+ definition_list[:] = sorted(
+ definition_list,
+ key=lambda item: unicodedata.normalize(
+ 'NFD',
+ cast(nodes.term, item)[0].astext().lower()),
+ )
+
+
+class ReorderConsecutiveTargetAndIndexNodes(SphinxTransform):
+ """Index nodes interspersed between target nodes prevent other
+ Transformations from combining those target nodes,
+ e.g. ``PropagateTargets``. This transformation reorders them:
+
+ Given the following ``document`` as input::
+
+ <document>
+ <target ids="id1" ...>
+ <index entries="...1...">
+ <target ids="id2" ...>
+ <target ids="id3" ...>
+ <index entries="...2...">
+ <target ids="id4" ...>
+
+ The transformed result will be::
+
+ <document>
+ <index entries="...1...">
+ <index entries="...2...">
+ <target ids="id1" ...>
+ <target ids="id2" ...>
+ <target ids="id3" ...>
+ <target ids="id4" ...>
+ """
+
+ # This transform MUST run before ``PropagateTargets``.
+ default_priority = 220
+
+ def apply(self, **kwargs: Any) -> None:
+ for target in self.document.findall(nodes.target):
+ _reorder_index_target_nodes(target)
+
+
+def _reorder_index_target_nodes(start_node: nodes.target) -> None:
+ """Sort target and index nodes.
+
+ Find all consecutive target and index nodes starting from ``start_node``,
+ and move all index nodes to before the first target node.
+ """
+ nodes_to_reorder: list[nodes.target | addnodes.index] = []
+
+ # Note that we cannot use 'condition' to filter,
+ # as we want *consecutive* target & index nodes.
+ node: nodes.Node
+ for node in start_node.findall(descend=False, siblings=True):
+ if isinstance(node, (nodes.target, addnodes.index)):
+ nodes_to_reorder.append(node)
+ continue
+ break # must be a consecutive run of target or index nodes
+
+ if len(nodes_to_reorder) < 2:
+ return # Nothing to reorder
+
+ parent = nodes_to_reorder[0].parent
+ if parent == nodes_to_reorder[-1].parent:
+ first_idx = parent.index(nodes_to_reorder[0])
+ last_idx = parent.index(nodes_to_reorder[-1])
+ if first_idx + len(nodes_to_reorder) - 1 == last_idx:
+ parent[first_idx:last_idx + 1] = sorted(nodes_to_reorder, key=_sort_key)
+
+
+def _sort_key(node: nodes.Node) -> int:
+ # Must be a stable sort.
+ if isinstance(node, addnodes.index):
+ return 0
+ if isinstance(node, nodes.target):
+ return 1
+ msg = f'_sort_key called with unexpected node type {type(node)!r}'
+ raise ValueError(msg)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_transform(ApplySourceWorkaround)
+ app.add_transform(ExtraTranslatableNodes)
+ app.add_transform(DefaultSubstitutions)
+ app.add_transform(MoveModuleTargets)
+ app.add_transform(HandleCodeBlocks)
+ app.add_transform(SortIds)
+ app.add_transform(DoctestTransform)
+ app.add_transform(AutoNumbering)
+ app.add_transform(AutoIndexUpgrader)
+ app.add_transform(FilterSystemMessages)
+ app.add_transform(UnreferencedFootnotesDetector)
+ app.add_transform(SphinxSmartQuotes)
+ app.add_transform(DoctreeReadEvent)
+ app.add_transform(ManpageLink)
+ app.add_transform(GlossarySorter)
+ app.add_transform(ReorderConsecutiveTargetAndIndexNodes)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/transforms/compact_bullet_list.py b/sphinx/transforms/compact_bullet_list.py
new file mode 100644
index 0000000..149b5e0
--- /dev/null
+++ b/sphinx/transforms/compact_bullet_list.py
@@ -0,0 +1,91 @@
+"""Docutils transforms used by Sphinx when reading documents."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.transforms import SphinxTransform
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+
+class RefOnlyListChecker(nodes.GenericNodeVisitor):
+ """Raise `nodes.NodeFound` if non-simple list item is encountered.
+
+ Here 'simple' means a list item containing only a paragraph with a
+ single reference in it.
+ """
+
+ def default_visit(self, node: Node) -> None:
+ raise nodes.NodeFound
+
+ def visit_bullet_list(self, node: nodes.bullet_list) -> None:
+ pass
+
+ def visit_list_item(self, node: nodes.list_item) -> None:
+ children: list[Node] = []
+ for child in node.children:
+ if not isinstance(child, nodes.Invisible):
+ children.append(child)
+ if len(children) != 1:
+ raise nodes.NodeFound
+ if not isinstance(children[0], nodes.paragraph):
+ raise nodes.NodeFound
+ para = children[0]
+ if len(para) != 1:
+ raise nodes.NodeFound
+ if not isinstance(para[0], addnodes.pending_xref):
+ raise nodes.NodeFound
+ raise nodes.SkipChildren
+
+ def invisible_visit(self, node: Node) -> None:
+ """Invisible nodes should be ignored."""
+ pass
+
+
+class RefOnlyBulletListTransform(SphinxTransform):
+ """Change refonly bullet lists to use compact_paragraphs.
+
+ Specifically implemented for 'Indices and Tables' section, which looks
+ odd when html_compact_lists is false.
+ """
+ default_priority = 100
+
+ def apply(self, **kwargs: Any) -> None:
+ if self.config.html_compact_lists:
+ return
+
+ def check_refonly_list(node: Node) -> bool:
+ """Check for list with only references in it."""
+ visitor = RefOnlyListChecker(self.document)
+ try:
+ node.walk(visitor)
+ except nodes.NodeFound:
+ return False
+ else:
+ return True
+
+ for node in self.document.findall(nodes.bullet_list):
+ if check_refonly_list(node):
+ for item in node.findall(nodes.list_item):
+ para = cast(nodes.paragraph, item[0])
+ ref = cast(nodes.reference, para[0])
+ compact_para = addnodes.compact_paragraph()
+ compact_para += ref
+ item.replace(para, compact_para)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_transform(RefOnlyBulletListTransform)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/transforms/i18n.py b/sphinx/transforms/i18n.py
new file mode 100644
index 0000000..d26c279
--- /dev/null
+++ b/sphinx/transforms/i18n.py
@@ -0,0 +1,624 @@
+"""Docutils transforms used by Sphinx when reading documents."""
+
+from __future__ import annotations
+
+import contextlib
+from os import path
+from re import DOTALL, match
+from textwrap import indent
+from typing import TYPE_CHECKING, Any, TypeVar
+
+from docutils import nodes
+from docutils.io import StringInput
+
+from sphinx import addnodes
+from sphinx.domains.std import make_glossary_term, split_term_classifiers
+from sphinx.errors import ConfigError
+from sphinx.locale import __
+from sphinx.locale import init as init_locale
+from sphinx.transforms import SphinxTransform
+from sphinx.util import get_filetype, logging
+from sphinx.util.i18n import docname_to_domain
+from sphinx.util.index_entries import split_index_msg
+from sphinx.util.nodes import (
+ IMAGE_TYPE_NODES,
+ LITERAL_TYPE_NODES,
+ NodeMatcher,
+ extract_messages,
+ traverse_translatable_index,
+)
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from sphinx.application import Sphinx
+ from sphinx.config import Config
+
+
+logger = logging.getLogger(__name__)
+
+# The attributes not copied to the translated node
+#
+# * refexplict: For allow to give (or not to give) an explicit title
+# to the pending_xref on translation
+EXCLUDED_PENDING_XREF_ATTRIBUTES = ('refexplicit',)
+
+
+N = TypeVar('N', bound=nodes.Node)
+
+
+def publish_msgstr(app: Sphinx, source: str, source_path: str, source_line: int,
+ config: Config, settings: Any) -> nodes.Element:
+ """Publish msgstr (single line) into docutils document
+
+ :param sphinx.application.Sphinx app: sphinx application
+ :param str source: source text
+ :param str source_path: source path for warning indication
+ :param source_line: source line for warning indication
+ :param sphinx.config.Config config: sphinx config
+ :param docutils.frontend.Values settings: docutils settings
+ :return: document
+ :rtype: docutils.nodes.document
+ """
+ try:
+ # clear rst_prolog temporarily
+ rst_prolog = config.rst_prolog
+ config.rst_prolog = None # type: ignore[attr-defined]
+
+ from sphinx.io import SphinxI18nReader
+ reader = SphinxI18nReader()
+ reader.setup(app)
+ filetype = get_filetype(config.source_suffix, source_path)
+ parser = app.registry.create_source_parser(app, filetype)
+ doc = reader.read(
+ source=StringInput(source=source,
+ source_path=f"{source_path}:{source_line}:<translated>"),
+ parser=parser,
+ settings=settings,
+ )
+ with contextlib.suppress(IndexError): # empty node
+ return doc[0] # type: ignore[return-value]
+ return doc
+ finally:
+ config.rst_prolog = rst_prolog # type: ignore[attr-defined]
+
+
+def parse_noqa(source: str) -> tuple[str, bool]:
+ m = match(r"(.*)(?<!\\)#\s*noqa\s*$", source, DOTALL)
+ if m:
+ return m.group(1), True
+ else:
+ return source, False
+
+
+class PreserveTranslatableMessages(SphinxTransform):
+ """
+ Preserve original translatable messages before translation
+ """
+ default_priority = 10 # this MUST be invoked before Locale transform
+
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(addnodes.translatable):
+ node.preserve_original_messages()
+
+
+class _NodeUpdater:
+ """Contains logic for updating one node with the translated content."""
+
+ def __init__(
+ self, node: nodes.Element, patch: nodes.Element, document: nodes.document, noqa: bool,
+ ) -> None:
+ self.node: nodes.Element = node
+ self.patch: nodes.Element = patch
+ self.document: nodes.document = document
+ self.noqa: bool = noqa
+
+ def compare_references(self, old_refs: Sequence[nodes.Element],
+ new_refs: Sequence[nodes.Element],
+ warning_msg: str) -> None:
+ """Warn about mismatches between references in original and translated content."""
+ # FIXME: could use a smarter strategy than len(old_refs) == len(new_refs)
+ if not self.noqa and len(old_refs) != len(new_refs):
+ old_ref_rawsources = [ref.rawsource for ref in old_refs]
+ new_ref_rawsources = [ref.rawsource for ref in new_refs]
+ logger.warning(warning_msg.format(old_ref_rawsources, new_ref_rawsources),
+ location=self.node, type='i18n', subtype='inconsistent_references')
+
+ def update_title_mapping(self) -> bool:
+ processed = False # skip flag
+
+ # update title(section) target name-id mapping
+ if isinstance(self.node, nodes.title) and isinstance(self.node.parent, nodes.section):
+ section_node = self.node.parent
+ new_name = nodes.fully_normalize_name(self.patch.astext())
+ old_name = nodes.fully_normalize_name(self.node.astext())
+
+ if old_name != new_name:
+ # if name would be changed, replace node names and
+ # document nameids mapping with new name.
+ names = section_node.setdefault('names', [])
+ names.append(new_name)
+ # Original section name (reference target name) should be kept to refer
+ # from other nodes which is still not translated or uses explicit target
+ # name like "`text to display <explicit target name_>`_"..
+ # So, `old_name` is still exist in `names`.
+
+ _id = self.document.nameids.get(old_name, None)
+ explicit = self.document.nametypes.get(old_name, None)
+
+ # * if explicit: _id is label. title node need another id.
+ # * if not explicit:
+ #
+ # * if _id is None:
+ #
+ # _id is None means:
+ #
+ # 1. _id was not provided yet.
+ #
+ # 2. _id was duplicated.
+ #
+ # old_name entry still exists in nameids and
+ # nametypes for another duplicated entry.
+ #
+ # * if _id is provided: below process
+ if _id:
+ if not explicit:
+ # _id was not duplicated.
+ # remove old_name entry from document ids database
+ # to reuse original _id.
+ self.document.nameids.pop(old_name, None)
+ self.document.nametypes.pop(old_name, None)
+ self.document.ids.pop(_id, None)
+
+ # re-entry with new named section node.
+ #
+ # Note: msgnode that is a second parameter of the
+ # `note_implicit_target` is not necessary here because
+ # section_node has been noted previously on rst parsing by
+ # `docutils.parsers.rst.states.RSTState.new_subsection()`
+ # and already has `system_message` if needed.
+ self.document.note_implicit_target(section_node)
+
+ # replace target's refname to new target name
+ matcher = NodeMatcher(nodes.target, refname=old_name)
+ for old_target in self.document.findall(matcher): # type: nodes.target
+ old_target['refname'] = new_name
+
+ processed = True
+
+ return processed
+
+ def update_autofootnote_references(self) -> None:
+ # auto-numbered foot note reference should use original 'ids'.
+ def list_replace_or_append(lst: list[N], old: N, new: N) -> None:
+ if old in lst:
+ lst[lst.index(old)] = new
+ else:
+ lst.append(new)
+
+ is_autofootnote_ref = NodeMatcher(nodes.footnote_reference, auto=Any)
+ old_foot_refs: list[nodes.footnote_reference] = [
+ *self.node.findall(is_autofootnote_ref)]
+ new_foot_refs: list[nodes.footnote_reference] = [
+ *self.patch.findall(is_autofootnote_ref)]
+ self.compare_references(old_foot_refs, new_foot_refs,
+ __('inconsistent footnote references in translated message.' +
+ ' original: {0}, translated: {1}'))
+ old_foot_namerefs: dict[str, list[nodes.footnote_reference]] = {}
+ for r in old_foot_refs:
+ old_foot_namerefs.setdefault(r.get('refname'), []).append(r)
+ for newf in new_foot_refs:
+ refname = newf.get('refname')
+ refs = old_foot_namerefs.get(refname, [])
+ if not refs:
+ newf.parent.remove(newf)
+ continue
+
+ oldf = refs.pop(0)
+ newf['ids'] = oldf['ids']
+ for id in newf['ids']:
+ self.document.ids[id] = newf
+
+ if newf['auto'] == 1:
+ # autofootnote_refs
+ list_replace_or_append(self.document.autofootnote_refs, oldf, newf)
+ else:
+ # symbol_footnote_refs
+ list_replace_or_append(self.document.symbol_footnote_refs, oldf, newf)
+
+ if refname:
+ footnote_refs = self.document.footnote_refs.setdefault(refname, [])
+ list_replace_or_append(footnote_refs, oldf, newf)
+
+ refnames = self.document.refnames.setdefault(refname, [])
+ list_replace_or_append(refnames, oldf, newf)
+
+ def update_refnamed_references(self) -> None:
+ # reference should use new (translated) 'refname'.
+ # * reference target ".. _Python: ..." is not translatable.
+ # * use translated refname for section refname.
+ # * inline reference "`Python <...>`_" has no 'refname'.
+ is_refnamed_ref = NodeMatcher(nodes.reference, refname=Any)
+ old_refs: list[nodes.reference] = [*self.node.findall(is_refnamed_ref)]
+ new_refs: list[nodes.reference] = [*self.patch.findall(is_refnamed_ref)]
+ self.compare_references(old_refs, new_refs,
+ __('inconsistent references in translated message.' +
+ ' original: {0}, translated: {1}'))
+ old_ref_names = [r['refname'] for r in old_refs]
+ new_ref_names = [r['refname'] for r in new_refs]
+ orphans = [*({*old_ref_names} - {*new_ref_names})]
+ for newr in new_refs:
+ if not self.document.has_name(newr['refname']):
+ # Maybe refname is translated but target is not translated.
+ # Note: multiple translated refnames break link ordering.
+ if orphans:
+ newr['refname'] = orphans.pop(0)
+ else:
+ # orphan refnames is already empty!
+ # reference number is same in new_refs and old_refs.
+ pass
+
+ self.document.note_refname(newr)
+
+ def update_refnamed_footnote_references(self) -> None:
+ # refnamed footnote should use original 'ids'.
+ is_refnamed_footnote_ref = NodeMatcher(nodes.footnote_reference, refname=Any)
+ old_foot_refs: list[nodes.footnote_reference] = [*self.node.findall(
+ is_refnamed_footnote_ref)]
+ new_foot_refs: list[nodes.footnote_reference] = [*self.patch.findall(
+ is_refnamed_footnote_ref)]
+ refname_ids_map: dict[str, list[str]] = {}
+ self.compare_references(old_foot_refs, new_foot_refs,
+ __('inconsistent footnote references in translated message.' +
+ ' original: {0}, translated: {1}'))
+ for oldf in old_foot_refs:
+ refname_ids_map.setdefault(oldf["refname"], []).append(oldf["ids"])
+ for newf in new_foot_refs:
+ refname = newf["refname"]
+ if refname_ids_map.get(refname):
+ newf["ids"] = refname_ids_map[refname].pop(0)
+
+ def update_citation_references(self) -> None:
+ # citation should use original 'ids'.
+ is_citation_ref = NodeMatcher(nodes.citation_reference, refname=Any)
+ old_cite_refs: list[nodes.citation_reference] = [*self.node.findall(is_citation_ref)]
+ new_cite_refs: list[nodes.citation_reference] = [*self.patch.findall(is_citation_ref)]
+ self.compare_references(old_cite_refs, new_cite_refs,
+ __('inconsistent citation references in translated message.' +
+ ' original: {0}, translated: {1}'))
+ refname_ids_map: dict[str, list[str]] = {}
+ for oldc in old_cite_refs:
+ refname_ids_map.setdefault(oldc["refname"], []).append(oldc["ids"])
+ for newc in new_cite_refs:
+ refname = newc["refname"]
+ if refname_ids_map.get(refname):
+ newc["ids"] = refname_ids_map[refname].pop()
+
+ def update_pending_xrefs(self) -> None:
+ # Original pending_xref['reftarget'] contain not-translated
+ # target name, new pending_xref must use original one.
+ # This code restricts to change ref-targets in the translation.
+ old_xrefs = [*self.node.findall(addnodes.pending_xref)]
+ new_xrefs = [*self.patch.findall(addnodes.pending_xref)]
+ self.compare_references(old_xrefs, new_xrefs,
+ __('inconsistent term references in translated message.' +
+ ' original: {0}, translated: {1}'))
+
+ xref_reftarget_map: dict[tuple[str, str, str] | None, dict[str, Any]] = {}
+
+ def get_ref_key(node: addnodes.pending_xref) -> tuple[str, str, str] | None:
+ case = node["refdomain"], node["reftype"]
+ if case == ('std', 'term'):
+ return None
+ else:
+ return (
+ node["refdomain"],
+ node["reftype"],
+ node['reftarget'],
+ )
+
+ for old in old_xrefs:
+ key = get_ref_key(old)
+ if key:
+ xref_reftarget_map[key] = old.attributes
+ for new in new_xrefs:
+ key = get_ref_key(new)
+ # Copy attributes to keep original node behavior. Especially
+ # copying 'reftarget', 'py:module', 'py:class' are needed.
+ for k, v in xref_reftarget_map.get(key, {}).items():
+ if k not in EXCLUDED_PENDING_XREF_ATTRIBUTES:
+ new[k] = v
+
+ def update_leaves(self) -> None:
+ for child in self.patch.children:
+ child.parent = self.node
+ self.node.children = self.patch.children
+
+
+class Locale(SphinxTransform):
+ """
+ Replace translatable nodes with their translated doctree.
+ """
+ default_priority = 20
+
+ def apply(self, **kwargs: Any) -> None:
+ settings, source = self.document.settings, self.document['source']
+ msgstr = ''
+
+ textdomain = docname_to_domain(self.env.docname, self.config.gettext_compact)
+
+ # fetch translations
+ dirs = [path.join(self.env.srcdir, directory)
+ for directory in self.config.locale_dirs]
+ catalog, has_catalog = init_locale(dirs, self.config.language, textdomain)
+ if not has_catalog:
+ return
+
+ catalogues = [getattr(catalog, '_catalog', None)]
+ while (catalog := catalog._fallback) is not None: # type: ignore[attr-defined]
+ catalogues.append(getattr(catalog, '_catalog', None))
+ merged: dict[str, str] = {}
+ for catalogue in filter(None, reversed(catalogues)): # type: dict[str, str]
+ merged |= catalogue
+
+ # phase1: replace reference ids with translated names
+ for node, msg in extract_messages(self.document):
+ msgstr = merged.get(msg, '')
+
+ # There is no point in having #noqa on literal blocks because
+ # they cannot contain references. Recognizing it would just
+ # completely prevent escaping the #noqa. Outside of literal
+ # blocks, one can always write \#noqa.
+ if not isinstance(node, LITERAL_TYPE_NODES):
+ msgstr, _ = parse_noqa(msgstr)
+
+ if msgstr.strip() == '':
+ # as-of-yet untranslated
+ node['translated'] = False
+ continue
+ if msgstr == msg:
+ # identical source and translated messages
+ node['translated'] = True
+ continue
+
+ # Avoid "Literal block expected; none found." warnings.
+ # If msgstr ends with '::' then it cause warning message at
+ # parser.parse() processing.
+ # literal-block-warning is only appear in avobe case.
+ if msgstr.strip().endswith('::'):
+ msgstr += '\n\n dummy literal'
+ # dummy literal node will discard by 'patch = patch[0]'
+
+ # literalblock need literal block notation to avoid it become
+ # paragraph.
+ if isinstance(node, LITERAL_TYPE_NODES):
+ msgstr = '::\n\n' + indent(msgstr, ' ' * 3)
+
+ patch = publish_msgstr(self.app, msgstr, source,
+ node.line, self.config, settings)
+ # FIXME: no warnings about inconsistent references in this part
+ # XXX doctest and other block markup
+ if not isinstance(patch, nodes.paragraph):
+ continue # skip for now
+
+ updater = _NodeUpdater(node, patch, self.document, noqa=False)
+ processed = updater.update_title_mapping()
+
+ # glossary terms update refid
+ if isinstance(node, nodes.term):
+ for _id in node['ids']:
+ parts = split_term_classifiers(msgstr)
+ patch = publish_msgstr(
+ self.app, parts[0] or '', source, node.line, self.config, settings,
+ )
+ updater.patch = make_glossary_term(
+ self.env, patch, parts[1] or '', source, node.line, _id, self.document,
+ )
+ processed = True
+
+ # update leaves with processed nodes
+ if processed:
+ updater.update_leaves()
+ node['translated'] = True # to avoid double translation
+ else:
+ node['translated'] = False
+
+ # phase2: translation
+ for node, msg in extract_messages(self.document):
+ if node.setdefault('translated', False): # to avoid double translation
+ continue # skip if the node is already translated by phase1
+
+ msgstr = merged.get(msg, '')
+ noqa = False
+
+ # See above.
+ if not isinstance(node, LITERAL_TYPE_NODES):
+ msgstr, noqa = parse_noqa(msgstr)
+
+ if not msgstr or msgstr == msg: # as-of-yet untranslated
+ node['translated'] = False
+ continue
+
+ # update translatable nodes
+ if isinstance(node, addnodes.translatable):
+ node.apply_translated_message(msg, msgstr) # type: ignore[attr-defined]
+ continue
+
+ # update meta nodes
+ if isinstance(node, nodes.meta): # type: ignore[attr-defined]
+ node['content'] = msgstr
+ node['translated'] = True
+ continue
+
+ if isinstance(node, nodes.image) and node.get('alt') == msg:
+ node['alt'] = msgstr
+ continue
+
+ # Avoid "Literal block expected; none found." warnings.
+ # If msgstr ends with '::' then it cause warning message at
+ # parser.parse() processing.
+ # literal-block-warning is only appear in avobe case.
+ if msgstr.strip().endswith('::'):
+ msgstr += '\n\n dummy literal'
+ # dummy literal node will discard by 'patch = patch[0]'
+
+ # literalblock need literal block notation to avoid it become
+ # paragraph.
+ if isinstance(node, LITERAL_TYPE_NODES):
+ msgstr = '::\n\n' + indent(msgstr, ' ' * 3)
+
+ # Structural Subelements phase1
+ # There is a possibility that only the title node is created.
+ # see: https://docutils.sourceforge.io/docs/ref/doctree.html#structural-subelements
+ if isinstance(node, nodes.title):
+ # This generates: <section ...><title>msgstr</title></section>
+ msgstr = msgstr + '\n' + '=' * len(msgstr) * 2
+
+ patch = publish_msgstr(self.app, msgstr, source,
+ node.line, self.config, settings)
+ # Structural Subelements phase2
+ if isinstance(node, nodes.title):
+ # get <title> node that placed as a first child
+ patch = patch.next_node()
+
+ # ignore unexpected markups in translation message
+ unexpected: tuple[type[nodes.Element], ...] = (
+ nodes.paragraph, # expected form of translation
+ nodes.title, # generated by above "Subelements phase2"
+ )
+
+ # following types are expected if
+ # config.gettext_additional_targets is configured
+ unexpected += LITERAL_TYPE_NODES
+ unexpected += IMAGE_TYPE_NODES
+
+ if not isinstance(patch, unexpected):
+ continue # skip
+
+ updater = _NodeUpdater(node, patch, self.document, noqa)
+ updater.update_autofootnote_references()
+ updater.update_refnamed_references()
+ updater.update_refnamed_footnote_references()
+ updater.update_citation_references()
+ updater.update_pending_xrefs()
+ updater.update_leaves()
+
+ # for highlighting that expects .rawsource and .astext() are same.
+ if isinstance(node, LITERAL_TYPE_NODES):
+ node.rawsource = node.astext()
+
+ if isinstance(node, nodes.image) and node.get('alt') != msg:
+ node['uri'] = patch['uri']
+ node['translated'] = False
+ continue # do not mark translated
+
+ node['translated'] = True # to avoid double translation
+
+ if 'index' in self.config.gettext_additional_targets:
+ # Extract and translate messages for index entries.
+ for node, entries in traverse_translatable_index(self.document):
+ new_entries: list[tuple[str, str, str, str, str | None]] = []
+ for entry_type, value, target_id, main, _category_key in entries:
+ msg_parts = split_index_msg(entry_type, value)
+ msgstr_parts = []
+ for part in msg_parts:
+ msgstr = merged.get(part, '')
+ if not msgstr:
+ msgstr = part
+ msgstr_parts.append(msgstr)
+
+ new_entry = entry_type, ';'.join(msgstr_parts), target_id, main, None
+ new_entries.append(new_entry)
+
+ node['raw_entries'] = entries
+ node['entries'] = new_entries
+
+
+class TranslationProgressTotaliser(SphinxTransform):
+ """
+ Calculate the number of translated and untranslated nodes.
+ """
+ default_priority = 25 # MUST happen after Locale
+
+ def apply(self, **kwargs: Any) -> None:
+ from sphinx.builders.gettext import MessageCatalogBuilder
+ if isinstance(self.app.builder, MessageCatalogBuilder):
+ return
+
+ total = translated = 0
+ for node in self.document.findall(NodeMatcher(translated=Any)): # type: nodes.Element
+ total += 1
+ if node['translated']:
+ translated += 1
+
+ self.document['translation_progress'] = {
+ 'total': total,
+ 'translated': translated,
+ }
+
+
+class AddTranslationClasses(SphinxTransform):
+ """
+ Add ``translated`` or ``untranslated`` classes to indicate translation status.
+ """
+ default_priority = 950
+
+ def apply(self, **kwargs: Any) -> None:
+ from sphinx.builders.gettext import MessageCatalogBuilder
+ if isinstance(self.app.builder, MessageCatalogBuilder):
+ return
+
+ if not self.config.translation_progress_classes:
+ return
+
+ if self.config.translation_progress_classes is True:
+ add_translated = add_untranslated = True
+ elif self.config.translation_progress_classes == 'translated':
+ add_translated = True
+ add_untranslated = False
+ elif self.config.translation_progress_classes == 'untranslated':
+ add_translated = False
+ add_untranslated = True
+ else:
+ msg = ('translation_progress_classes must be '
+ 'True, False, "translated" or "untranslated"')
+ raise ConfigError(msg)
+
+ for node in self.document.findall(NodeMatcher(translated=Any)): # type: nodes.Element
+ if node['translated']:
+ if add_translated:
+ node.setdefault('classes', []).append('translated')
+ else:
+ if add_untranslated:
+ node.setdefault('classes', []).append('untranslated')
+
+
+class RemoveTranslatableInline(SphinxTransform):
+ """
+ Remove inline nodes used for translation as placeholders.
+ """
+ default_priority = 999
+
+ def apply(self, **kwargs: Any) -> None:
+ from sphinx.builders.gettext import MessageCatalogBuilder
+ if isinstance(self.app.builder, MessageCatalogBuilder):
+ return
+
+ matcher = NodeMatcher(nodes.inline, translatable=Any)
+ for inline in list(self.document.findall(matcher)): # type: nodes.inline
+ inline.parent.remove(inline)
+ inline.parent += inline.children
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_transform(PreserveTranslatableMessages)
+ app.add_transform(Locale)
+ app.add_transform(TranslationProgressTotaliser)
+ app.add_transform(AddTranslationClasses)
+ app.add_transform(RemoveTranslatableInline)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/transforms/post_transforms/__init__.py b/sphinx/transforms/post_transforms/__init__.py
new file mode 100644
index 0000000..485f1f1
--- /dev/null
+++ b/sphinx/transforms/post_transforms/__init__.py
@@ -0,0 +1,297 @@
+"""Docutils transforms used by Sphinx."""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.nodes import Element, Node
+
+from sphinx import addnodes
+from sphinx.errors import NoUri
+from sphinx.locale import __
+from sphinx.transforms import SphinxTransform
+from sphinx.util import logging
+from sphinx.util.docutils import SphinxTranslator
+from sphinx.util.nodes import find_pending_xref_condition, process_only_nodes
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from sphinx.addnodes import pending_xref
+ from sphinx.application import Sphinx
+ from sphinx.domains import Domain
+
+logger = logging.getLogger(__name__)
+
+
+class SphinxPostTransform(SphinxTransform):
+ """A base class of post-transforms.
+
+ Post transforms are invoked to modify the document to restructure it for outputting.
+ They resolve references, convert images, do special transformation for each output
+ formats and so on. This class helps to implement these post transforms.
+ """
+ builders: tuple[str, ...] = ()
+ formats: tuple[str, ...] = ()
+
+ def apply(self, **kwargs: Any) -> None:
+ if self.is_supported():
+ self.run(**kwargs)
+
+ def is_supported(self) -> bool:
+ """Check this transform working for current builder."""
+ if self.builders and self.app.builder.name not in self.builders:
+ return False
+ if self.formats and self.app.builder.format not in self.formats:
+ return False
+
+ return True
+
+ def run(self, **kwargs: Any) -> None:
+ """Main method of post transforms.
+
+ Subclasses should override this method instead of ``apply()``.
+ """
+ raise NotImplementedError
+
+
+class ReferencesResolver(SphinxPostTransform):
+ """
+ Resolves cross-references on doctrees.
+ """
+
+ default_priority = 10
+
+ def run(self, **kwargs: Any) -> None:
+ for node in self.document.findall(addnodes.pending_xref):
+ content = self.find_pending_xref_condition(node, ("resolved", "*"))
+ if content:
+ contnode = cast(Element, content[0].deepcopy())
+ else:
+ contnode = cast(Element, node[0].deepcopy())
+
+ newnode = None
+
+ typ = node['reftype']
+ target = node['reftarget']
+ node.setdefault('refdoc', self.env.docname)
+ refdoc = node.get('refdoc')
+ domain = None
+
+ try:
+ if 'refdomain' in node and node['refdomain']:
+ # let the domain try to resolve the reference
+ try:
+ domain = self.env.domains[node['refdomain']]
+ except KeyError as exc:
+ raise NoUri(target, typ) from exc
+ newnode = domain.resolve_xref(self.env, refdoc, self.app.builder,
+ typ, target, node, contnode)
+ # really hardwired reference types
+ elif typ == 'any':
+ newnode = self.resolve_anyref(refdoc, node, contnode)
+ # no new node found? try the missing-reference event
+ if newnode is None:
+ newnode = self.app.emit_firstresult('missing-reference', self.env,
+ node, contnode,
+ allowed_exceptions=(NoUri,))
+ # still not found? warn if node wishes to be warned about or
+ # we are in nit-picky mode
+ if newnode is None:
+ self.warn_missing_reference(refdoc, typ, target, node, domain)
+ except NoUri:
+ newnode = None
+
+ if newnode:
+ newnodes: list[Node] = [newnode]
+ else:
+ newnodes = [contnode]
+ if newnode is None and isinstance(node[0], addnodes.pending_xref_condition):
+ matched = self.find_pending_xref_condition(node, ("*",))
+ if matched:
+ newnodes = matched
+ else:
+ logger.warning(__('Could not determine the fallback text for the '
+ 'cross-reference. Might be a bug.'), location=node)
+
+ node.replace_self(newnodes)
+
+ def resolve_anyref(
+ self, refdoc: str, node: pending_xref, contnode: Element,
+ ) -> Element | None:
+ """Resolve reference generated by the "any" role."""
+ stddomain = self.env.get_domain('std')
+ target = node['reftarget']
+ results: list[tuple[str, Element]] = []
+ # first, try resolving as :doc:
+ doc_ref = stddomain.resolve_xref(self.env, refdoc, self.app.builder,
+ 'doc', target, node, contnode)
+ if doc_ref:
+ results.append(('doc', doc_ref))
+ # next, do the standard domain (makes this a priority)
+ results.extend(stddomain.resolve_any_xref(self.env, refdoc, self.app.builder,
+ target, node, contnode))
+ for domain in self.env.domains.values():
+ if domain.name == 'std':
+ continue # we did this one already
+ try:
+ results.extend(domain.resolve_any_xref(self.env, refdoc, self.app.builder,
+ target, node, contnode))
+ except NotImplementedError:
+ # the domain doesn't yet support the new interface
+ # we have to manually collect possible references (SLOW)
+ for role in domain.roles:
+ res = domain.resolve_xref(self.env, refdoc, self.app.builder,
+ role, target, node, contnode)
+ if res and len(res) > 0 and isinstance(res[0], nodes.Element):
+ results.append((f'{domain.name}:{role}', res))
+ # now, see how many matches we got...
+ if not results:
+ return None
+ if len(results) > 1:
+ def stringify(name: str, node: Element) -> str:
+ reftitle = node.get('reftitle', node.astext())
+ return f':{name}:`{reftitle}`'
+ candidates = ' or '.join(stringify(name, role) for name, role in results)
+ logger.warning(__("more than one target found for 'any' cross-"
+ 'reference %r: could be %s'), target, candidates,
+ location=node)
+ res_role, newnode = results[0]
+ # Override "any" class with the actual role type to get the styling
+ # approximately correct.
+ res_domain = res_role.split(':')[0]
+ if (len(newnode) > 0 and
+ isinstance(newnode[0], nodes.Element) and
+ newnode[0].get('classes')):
+ newnode[0]['classes'].append(res_domain)
+ newnode[0]['classes'].append(res_role.replace(':', '-'))
+ return newnode
+
+ def warn_missing_reference(self, refdoc: str, typ: str, target: str,
+ node: pending_xref, domain: Domain | None) -> None:
+ warn = node.get('refwarn')
+ if self.config.nitpicky:
+ warn = True
+ dtype = f'{domain.name}:{typ}' if domain else typ
+ if self.config.nitpick_ignore:
+ if (dtype, target) in self.config.nitpick_ignore:
+ warn = False
+ # for "std" types also try without domain name
+ if (not domain or domain.name == 'std') and \
+ (typ, target) in self.config.nitpick_ignore:
+ warn = False
+ if self.config.nitpick_ignore_regex:
+ def matches_ignore(entry_type: str, entry_target: str) -> bool:
+ return any(
+ (
+ re.fullmatch(ignore_type, entry_type)
+ and re.fullmatch(ignore_target, entry_target)
+ )
+ for ignore_type, ignore_target
+ in self.config.nitpick_ignore_regex
+ )
+ if matches_ignore(dtype, target):
+ warn = False
+ # for "std" types also try without domain name
+ if (not domain or domain.name == 'std') and \
+ matches_ignore(typ, target):
+ warn = False
+ if not warn:
+ return
+
+ if self.app.emit_firstresult('warn-missing-reference', domain, node):
+ return
+ elif domain and typ in domain.dangling_warnings:
+ msg = domain.dangling_warnings[typ] % {'target': target}
+ elif node.get('refdomain', 'std') not in ('', 'std'):
+ msg = (__('%s:%s reference target not found: %s') %
+ (node['refdomain'], typ, target))
+ else:
+ msg = __('%r reference target not found: %s') % (typ, target)
+ logger.warning(msg, location=node, type='ref', subtype=typ)
+
+ def find_pending_xref_condition(self, node: pending_xref, conditions: Sequence[str],
+ ) -> list[Node] | None:
+ for condition in conditions:
+ matched = find_pending_xref_condition(node, condition)
+ if matched:
+ return matched.children
+ return None
+
+
+class OnlyNodeTransform(SphinxPostTransform):
+ default_priority = 50
+
+ def run(self, **kwargs: Any) -> None:
+ # A comment on the comment() nodes being inserted: replacing by [] would
+ # result in a "Losing ids" exception if there is a target node before
+ # the only node, so we make sure docutils can transfer the id to
+ # something, even if it's just a comment and will lose the id anyway...
+ process_only_nodes(self.document, self.app.builder.tags)
+
+
+class SigElementFallbackTransform(SphinxPostTransform):
+ """Fallback various desc_* nodes to inline if translator does not support them."""
+ default_priority = 200
+
+ def run(self, **kwargs: Any) -> None:
+ def has_visitor(translator: type[nodes.NodeVisitor], node: type[Element]) -> bool:
+ return hasattr(translator, "visit_%s" % node.__name__)
+
+ try:
+ translator = self.app.builder.get_translator_class()
+ except AttributeError:
+ # do nothing if no translator class is specified (e.g., on a dummy builder)
+ return
+
+ if issubclass(translator, SphinxTranslator):
+ # subclass of SphinxTranslator supports desc_sig_element nodes automatically.
+ return
+
+ # for the leaf elements (desc_sig_element), the translator should support _all_,
+ # unless there exists a generic visit_desc_sig_element default visitor
+ if (not all(has_visitor(translator, node) for node in addnodes.SIG_ELEMENTS)
+ and not has_visitor(translator, addnodes.desc_sig_element)):
+ self.fallback(addnodes.desc_sig_element)
+
+ if not has_visitor(translator, addnodes.desc_inline):
+ self.fallback(addnodes.desc_inline)
+
+ def fallback(self, node_type: Any) -> None:
+ """Translate nodes of type *node_type* to docutils inline nodes.
+
+ The original node type name is stored as a string in a private
+ ``_sig_node_type`` attribute if the latter did not exist.
+ """
+ for node in self.document.findall(node_type):
+ newnode = nodes.inline()
+ newnode.update_all_atts(node)
+ newnode.extend(node)
+ # Only set _sig_node_type if not defined by the user
+ newnode.setdefault('_sig_node_type', node.tagname)
+ node.replace_self(newnode)
+
+
+class PropagateDescDomain(SphinxPostTransform):
+ """Add the domain name of the parent node as a class in each desc_signature node."""
+ default_priority = 200
+
+ def run(self, **kwargs: Any) -> None:
+ for node in self.document.findall(addnodes.desc_signature):
+ if node.parent.get('domain'):
+ node['classes'].append(node.parent['domain'])
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_post_transform(ReferencesResolver)
+ app.add_post_transform(OnlyNodeTransform)
+ app.add_post_transform(SigElementFallbackTransform)
+ app.add_post_transform(PropagateDescDomain)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/transforms/post_transforms/code.py b/sphinx/transforms/post_transforms/code.py
new file mode 100644
index 0000000..cd8abcc
--- /dev/null
+++ b/sphinx/transforms/post_transforms/code.py
@@ -0,0 +1,139 @@
+"""transforms for code-blocks."""
+
+from __future__ import annotations
+
+import sys
+from typing import TYPE_CHECKING, Any, NamedTuple
+
+from docutils import nodes
+from pygments.lexers import PythonConsoleLexer, guess_lexer
+
+from sphinx import addnodes
+from sphinx.ext import doctest
+from sphinx.transforms import SphinxTransform
+
+if TYPE_CHECKING:
+ from docutils.nodes import Node, TextElement
+
+ from sphinx.application import Sphinx
+
+
+class HighlightSetting(NamedTuple):
+ language: str
+ force: bool
+ lineno_threshold: int
+
+
+class HighlightLanguageTransform(SphinxTransform):
+ """
+ Apply highlight_language to all literal_block nodes.
+
+ This refers both :confval:`highlight_language` setting and
+ :rst:dir:`highlight` directive. After processing, this transform
+ removes ``highlightlang`` node from doctree.
+ """
+ default_priority = 400
+
+ def apply(self, **kwargs: Any) -> None:
+ visitor = HighlightLanguageVisitor(self.document,
+ self.config.highlight_language)
+ self.document.walkabout(visitor)
+
+ for node in list(self.document.findall(addnodes.highlightlang)):
+ node.parent.remove(node)
+
+
+class HighlightLanguageVisitor(nodes.NodeVisitor):
+ def __init__(self, document: nodes.document, default_language: str) -> None:
+ self.default_setting = HighlightSetting(default_language, False, sys.maxsize)
+ self.settings: list[HighlightSetting] = []
+ super().__init__(document)
+
+ def unknown_visit(self, node: Node) -> None:
+ pass
+
+ def unknown_departure(self, node: Node) -> None:
+ pass
+
+ def visit_document(self, node: Node) -> None:
+ self.settings.append(self.default_setting)
+
+ def depart_document(self, node: Node) -> None:
+ self.settings.pop()
+
+ def visit_start_of_file(self, node: Node) -> None:
+ self.settings.append(self.default_setting)
+
+ def depart_start_of_file(self, node: Node) -> None:
+ self.settings.pop()
+
+ def visit_highlightlang(self, node: addnodes.highlightlang) -> None:
+ self.settings[-1] = HighlightSetting(node['lang'],
+ node['force'],
+ node['linenothreshold'])
+
+ def visit_literal_block(self, node: nodes.literal_block) -> None:
+ setting = self.settings[-1]
+ if 'language' not in node:
+ node['language'] = setting.language
+ node['force'] = setting.force
+ if 'linenos' not in node:
+ lines = node.astext().count('\n')
+ node['linenos'] = (lines >= setting.lineno_threshold - 1)
+
+
+class TrimDoctestFlagsTransform(SphinxTransform):
+ """
+ Trim doctest flags like ``# doctest: +FLAG`` from python code-blocks.
+
+ see :confval:`trim_doctest_flags` for more information.
+ """
+ default_priority = HighlightLanguageTransform.default_priority + 1
+
+ def apply(self, **kwargs: Any) -> None:
+ for lbnode in self.document.findall(nodes.literal_block):
+ if self.is_pyconsole(lbnode):
+ self.strip_doctest_flags(lbnode)
+
+ for dbnode in self.document.findall(nodes.doctest_block):
+ self.strip_doctest_flags(dbnode)
+
+ def strip_doctest_flags(self, node: TextElement) -> None:
+ if not node.get('trim_flags', self.config.trim_doctest_flags):
+ return
+
+ source = node.rawsource
+ source = doctest.blankline_re.sub('', source)
+ source = doctest.doctestopt_re.sub('', source)
+ node.rawsource = source
+ node[:] = [nodes.Text(source)]
+
+ @staticmethod
+ def is_pyconsole(node: nodes.literal_block) -> bool:
+ if node.rawsource != node.astext():
+ return False # skip parsed-literal node
+
+ language = node.get('language')
+ if language in {'pycon', 'pycon3'}:
+ return True
+ elif language in {'py', 'python', 'py3', 'python3', 'default'}:
+ return node.rawsource.startswith('>>>')
+ elif language == 'guess':
+ try:
+ lexer = guess_lexer(node.rawsource)
+ return isinstance(lexer, PythonConsoleLexer)
+ except Exception:
+ pass
+
+ return False
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_post_transform(HighlightLanguageTransform)
+ app.add_post_transform(TrimDoctestFlagsTransform)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/transforms/post_transforms/images.py b/sphinx/transforms/post_transforms/images.py
new file mode 100644
index 0000000..e220df0
--- /dev/null
+++ b/sphinx/transforms/post_transforms/images.py
@@ -0,0 +1,280 @@
+"""Docutils transforms used by Sphinx."""
+
+from __future__ import annotations
+
+import os
+import re
+from hashlib import sha1
+from math import ceil
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+
+from sphinx.locale import __
+from sphinx.transforms import SphinxTransform
+from sphinx.util import logging, requests
+from sphinx.util.http_date import epoch_to_rfc1123, rfc1123_to_epoch
+from sphinx.util.images import get_image_extension, guess_mimetype, parse_data_uri
+from sphinx.util.osutil import ensuredir
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+MAX_FILENAME_LEN = 32
+CRITICAL_PATH_CHAR_RE = re.compile('[:;<>|*" ]')
+
+
+class BaseImageConverter(SphinxTransform):
+ def apply(self, **kwargs: Any) -> None:
+ for node in self.document.findall(nodes.image):
+ if self.match(node):
+ self.handle(node)
+
+ def match(self, node: nodes.image) -> bool:
+ return True
+
+ def handle(self, node: nodes.image) -> None:
+ pass
+
+ @property
+ def imagedir(self) -> str:
+ return os.path.join(self.app.doctreedir, 'images')
+
+
+class ImageDownloader(BaseImageConverter):
+ default_priority = 100
+
+ def match(self, node: nodes.image) -> bool:
+ if self.app.builder.supported_image_types == []:
+ return False
+ if self.app.builder.supported_remote_images:
+ return False
+ return '://' in node['uri']
+
+ def handle(self, node: nodes.image) -> None:
+ try:
+ basename = os.path.basename(node['uri'])
+ if '?' in basename:
+ basename = basename.split('?')[0]
+ if basename == '' or len(basename) > MAX_FILENAME_LEN:
+ filename, ext = os.path.splitext(node['uri'])
+ basename = sha1(filename.encode(), usedforsecurity=False).hexdigest() + ext
+ basename = re.sub(CRITICAL_PATH_CHAR_RE, "_", basename)
+
+ dirname = node['uri'].replace('://', '/').translate({ord("?"): "/",
+ ord("&"): "/"})
+ if len(dirname) > MAX_FILENAME_LEN:
+ dirname = sha1(dirname.encode(), usedforsecurity=False).hexdigest()
+ ensuredir(os.path.join(self.imagedir, dirname))
+ path = os.path.join(self.imagedir, dirname, basename)
+
+ headers = {}
+ if os.path.exists(path):
+ timestamp: float = ceil(os.stat(path).st_mtime)
+ headers['If-Modified-Since'] = epoch_to_rfc1123(timestamp)
+
+ r = requests.get(node['uri'], headers=headers)
+ if r.status_code >= 400:
+ logger.warning(__('Could not fetch remote image: %s [%d]') %
+ (node['uri'], r.status_code))
+ else:
+ self.app.env.original_image_uri[path] = node['uri']
+
+ if r.status_code == 200:
+ with open(path, 'wb') as f:
+ f.write(r.content)
+
+ last_modified = r.headers.get('last-modified')
+ if last_modified:
+ timestamp = rfc1123_to_epoch(last_modified)
+ os.utime(path, (timestamp, timestamp))
+
+ mimetype = guess_mimetype(path, default='*')
+ if mimetype != '*' and os.path.splitext(basename)[1] == '':
+ # append a suffix if URI does not contain suffix
+ ext = get_image_extension(mimetype)
+ newpath = os.path.join(self.imagedir, dirname, basename + ext)
+ os.replace(path, newpath)
+ self.app.env.original_image_uri.pop(path)
+ self.app.env.original_image_uri[newpath] = node['uri']
+ path = newpath
+ node['candidates'].pop('?')
+ node['candidates'][mimetype] = path
+ node['uri'] = path
+ self.app.env.images.add_file(self.env.docname, path)
+ except Exception as exc:
+ logger.warning(__('Could not fetch remote image: %s [%s]') % (node['uri'], exc))
+
+
+class DataURIExtractor(BaseImageConverter):
+ default_priority = 150
+
+ def match(self, node: nodes.image) -> bool:
+ if self.app.builder.supported_remote_images == []:
+ return False
+ if self.app.builder.supported_data_uri_images is True:
+ return False
+ return node['uri'].startswith('data:')
+
+ def handle(self, node: nodes.image) -> None:
+ image = parse_data_uri(node['uri'])
+ assert image is not None
+ ext = get_image_extension(image.mimetype)
+ if ext is None:
+ logger.warning(__('Unknown image format: %s...'), node['uri'][:32],
+ location=node)
+ return
+
+ ensuredir(os.path.join(self.imagedir, 'embeded'))
+ digest = sha1(image.data, usedforsecurity=False).hexdigest()
+ path = os.path.join(self.imagedir, 'embeded', digest + ext)
+ self.app.env.original_image_uri[path] = node['uri']
+
+ with open(path, 'wb') as f:
+ f.write(image.data)
+
+ node['candidates'].pop('?')
+ node['candidates'][image.mimetype] = path
+ node['uri'] = path
+ self.app.env.images.add_file(self.env.docname, path)
+
+
+def get_filename_for(filename: str, mimetype: str) -> str:
+ basename = os.path.basename(filename)
+ basename = re.sub(CRITICAL_PATH_CHAR_RE, "_", basename)
+ return os.path.splitext(basename)[0] + (get_image_extension(mimetype) or '')
+
+
+class ImageConverter(BaseImageConverter):
+ """A base class for image converters.
+
+ An image converter is kind of Docutils transform module. It is used to
+ convert image files which are not supported by a builder to the
+ appropriate format for that builder.
+
+ For example, :py:class:`LaTeX builder <.LaTeXBuilder>` supports PDF,
+ PNG and JPEG as image formats. However it does not support SVG images.
+ For such case, using image converters allows to embed these
+ unsupported images into the document. One of the image converters;
+ :ref:`sphinx.ext.imgconverter <sphinx.ext.imgconverter>` can convert
+ a SVG image to PNG format using Imagemagick internally.
+
+ There are three steps to make your custom image converter:
+
+ 1. Make a subclass of ``ImageConverter`` class
+ 2. Override ``conversion_rules``, ``is_available()`` and ``convert()``
+ 3. Register your image converter to Sphinx using
+ :py:meth:`.Sphinx.add_post_transform`
+ """
+ default_priority = 200
+
+ #: The converter is available or not. Will be filled at the first call of
+ #: the build. The result is shared in the same process.
+ #:
+ #: .. todo:: This should be refactored not to store the state without class
+ #: variable.
+ available: bool | None = None
+
+ #: A conversion rules the image converter supports.
+ #: It is represented as a list of pair of source image format (mimetype) and
+ #: destination one::
+ #:
+ #: conversion_rules = [
+ #: ('image/svg+xml', 'image/png'),
+ #: ('image/gif', 'image/png'),
+ #: ('application/pdf', 'image/png'),
+ #: ]
+ conversion_rules: list[tuple[str, str]] = []
+
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ super().__init__(*args, **kwargs)
+
+ def match(self, node: nodes.image) -> bool:
+ if not self.app.builder.supported_image_types:
+ return False
+ if '?' in node['candidates']:
+ return False
+ if set(self.guess_mimetypes(node)) & set(self.app.builder.supported_image_types):
+ # builder supports the image; no need to convert
+ return False
+ if self.available is None:
+ # store the value to the class variable to share it during the build
+ self.__class__.available = self.is_available()
+
+ if not self.available:
+ return False
+ else:
+ try:
+ self.get_conversion_rule(node)
+ except ValueError:
+ return False
+ else:
+ return True
+
+ def get_conversion_rule(self, node: nodes.image) -> tuple[str, str]:
+ for candidate in self.guess_mimetypes(node):
+ for supported in self.app.builder.supported_image_types:
+ rule = (candidate, supported)
+ if rule in self.conversion_rules:
+ return rule
+
+ msg = 'No conversion rule found'
+ raise ValueError(msg)
+
+ def is_available(self) -> bool:
+ """Return the image converter is available or not."""
+ raise NotImplementedError
+
+ def guess_mimetypes(self, node: nodes.image) -> list[str]:
+ if '?' in node['candidates']:
+ return []
+ elif '*' in node['candidates']:
+ guessed = guess_mimetype(node['uri'])
+ return [guessed] if guessed is not None else []
+ else:
+ return node['candidates'].keys()
+
+ def handle(self, node: nodes.image) -> None:
+ _from, _to = self.get_conversion_rule(node)
+
+ if _from in node['candidates']:
+ srcpath = node['candidates'][_from]
+ else:
+ srcpath = node['candidates']['*']
+
+ filename = self.env.images[srcpath][1]
+ filename = get_filename_for(filename, _to)
+ ensuredir(self.imagedir)
+ destpath = os.path.join(self.imagedir, filename)
+
+ abs_srcpath = os.path.join(self.app.srcdir, srcpath)
+ if self.convert(abs_srcpath, destpath):
+ if '*' in node['candidates']:
+ node['candidates']['*'] = destpath
+ else:
+ node['candidates'][_to] = destpath
+ node['uri'] = destpath
+
+ self.env.original_image_uri[destpath] = srcpath
+ self.env.images.add_file(self.env.docname, destpath)
+
+ def convert(self, _from: str, _to: str) -> bool:
+ """Convert an image file to the expected format.
+
+ *_from* is a path of the source image file, and *_to* is a path
+ of the destination file.
+ """
+ raise NotImplementedError
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_post_transform(ImageDownloader)
+ app.add_post_transform(DataURIExtractor)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/transforms/references.py b/sphinx/transforms/references.py
new file mode 100644
index 0000000..5de3a95
--- /dev/null
+++ b/sphinx/transforms/references.py
@@ -0,0 +1,47 @@
+"""Docutils transforms used by Sphinx."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils.transforms.references import DanglingReferences
+
+from sphinx.transforms import SphinxTransform
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+
+class SphinxDanglingReferences(DanglingReferences):
+ """DanglingReferences transform which does not output info messages."""
+
+ def apply(self, **kwargs: Any) -> None:
+ try:
+ reporter = self.document.reporter
+ report_level = reporter.report_level
+
+ # suppress INFO level messages for a while
+ reporter.report_level = max(reporter.WARNING_LEVEL, reporter.report_level)
+ super().apply()
+ finally:
+ reporter.report_level = report_level
+
+
+class SphinxDomains(SphinxTransform):
+ """Collect objects to Sphinx domains for cross references."""
+ default_priority = 850
+
+ def apply(self, **kwargs: Any) -> None:
+ for domain in self.env.domains.values():
+ domain.process_doc(self.env, self.env.docname, self.document)
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_transform(SphinxDanglingReferences)
+ app.add_transform(SphinxDomains)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py
new file mode 100644
index 0000000..69b2848
--- /dev/null
+++ b/sphinx/util/__init__.py
@@ -0,0 +1,297 @@
+"""Utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import hashlib
+import os
+import posixpath
+import re
+from importlib import import_module
+from os import path
+from typing import IO, Any
+from urllib.parse import parse_qsl, quote_plus, urlencode, urlsplit, urlunsplit
+
+from sphinx.errors import ExtensionError, FiletypeNotFoundError
+from sphinx.locale import __
+from sphinx.util import display as _display
+from sphinx.util import exceptions as _exceptions
+from sphinx.util import http_date as _http_date
+from sphinx.util import index_entries as _index_entries
+from sphinx.util import logging
+from sphinx.util import osutil as _osutil
+from sphinx.util.console import strip_colors # NoQA: F401
+from sphinx.util.matching import patfilter # noqa: F401
+from sphinx.util.nodes import ( # noqa: F401
+ caption_ref_re,
+ explicit_title_re,
+ nested_parse_with_titles,
+ split_explicit_title,
+)
+
+# import other utilities; partly for backwards compatibility, so don't
+# prune unused ones indiscriminately
+from sphinx.util.osutil import ( # noqa: F401
+ SEP,
+ copyfile,
+ copytimes,
+ ensuredir,
+ make_filename,
+ mtimes_of_files,
+ os_path,
+ relative_uri,
+)
+
+logger = logging.getLogger(__name__)
+
+# Generally useful regular expressions.
+ws_re: re.Pattern[str] = re.compile(r'\s+')
+url_re: re.Pattern[str] = re.compile(r'(?P<schema>.+)://.*')
+
+
+# High-level utility functions.
+
+def docname_join(basedocname: str, docname: str) -> str:
+ return posixpath.normpath(posixpath.join('/' + basedocname, '..', docname))[1:]
+
+
+def get_filetype(source_suffix: dict[str, str], filename: str) -> str:
+ for suffix, filetype in source_suffix.items():
+ if filename.endswith(suffix):
+ # If default filetype (None), considered as restructuredtext.
+ return filetype or 'restructuredtext'
+ raise FiletypeNotFoundError
+
+
+class FilenameUniqDict(dict):
+ """
+ A dictionary that automatically generates unique names for its keys,
+ interpreted as filenames, and keeps track of a set of docnames they
+ appear in. Used for images and downloadable files in the environment.
+ """
+ def __init__(self) -> None:
+ self._existing: set[str] = set()
+
+ def add_file(self, docname: str, newfile: str) -> str:
+ if newfile in self:
+ self[newfile][0].add(docname)
+ return self[newfile][1]
+ uniquename = path.basename(newfile)
+ base, ext = path.splitext(uniquename)
+ i = 0
+ while uniquename in self._existing:
+ i += 1
+ uniquename = f'{base}{i}{ext}'
+ self[newfile] = ({docname}, uniquename)
+ self._existing.add(uniquename)
+ return uniquename
+
+ def purge_doc(self, docname: str) -> None:
+ for filename, (docs, unique) in list(self.items()):
+ docs.discard(docname)
+ if not docs:
+ del self[filename]
+ self._existing.discard(unique)
+
+ def merge_other(self, docnames: set[str], other: dict[str, tuple[set[str], Any]]) -> None:
+ for filename, (docs, _unique) in other.items():
+ for doc in docs & set(docnames):
+ self.add_file(doc, filename)
+
+ def __getstate__(self) -> set[str]:
+ return self._existing
+
+ def __setstate__(self, state: set[str]) -> None:
+ self._existing = state
+
+
+def _md5(data=b'', **_kw):
+ """Deprecated wrapper around hashlib.md5
+
+ To be removed in Sphinx 9.0
+ """
+ return hashlib.md5(data, usedforsecurity=False)
+
+
+def _sha1(data=b'', **_kw):
+ """Deprecated wrapper around hashlib.sha1
+
+ To be removed in Sphinx 9.0
+ """
+ return hashlib.sha1(data, usedforsecurity=False)
+
+
+class DownloadFiles(dict):
+ """A special dictionary for download files.
+
+ .. important:: This class would be refactored in nearly future.
+ Hence don't hack this directly.
+ """
+
+ def add_file(self, docname: str, filename: str) -> str:
+ if filename not in self:
+ digest = hashlib.md5(filename.encode(), usedforsecurity=False).hexdigest()
+ dest = f'{digest}/{os.path.basename(filename)}'
+ self[filename] = (set(), dest)
+
+ self[filename][0].add(docname)
+ return self[filename][1]
+
+ def purge_doc(self, docname: str) -> None:
+ for filename, (docs, _dest) in list(self.items()):
+ docs.discard(docname)
+ if not docs:
+ del self[filename]
+
+ def merge_other(self, docnames: set[str], other: dict[str, tuple[set[str], Any]]) -> None:
+ for filename, (docs, _dest) in other.items():
+ for docname in docs & set(docnames):
+ self.add_file(docname, filename)
+
+
+# a regex to recognize coding cookies
+_coding_re = re.compile(r'coding[:=]\s*([-\w.]+)')
+
+
+class UnicodeDecodeErrorHandler:
+ """Custom error handler for open() that warns and replaces."""
+
+ def __init__(self, docname: str) -> None:
+ self.docname = docname
+
+ def __call__(self, error: UnicodeDecodeError) -> tuple[str, int]:
+ linestart = error.object.rfind(b'\n', 0, error.start)
+ lineend = error.object.find(b'\n', error.start)
+ if lineend == -1:
+ lineend = len(error.object)
+ lineno = error.object.count(b'\n', 0, error.start) + 1
+ logger.warning(__('undecodable source characters, replacing with "?": %r'),
+ (error.object[linestart + 1:error.start] + b'>>>' +
+ error.object[error.start:error.end] + b'<<<' +
+ error.object[error.end:lineend]),
+ location=(self.docname, lineno))
+ return ('?', error.end)
+
+
+# Low-level utility functions and classes.
+
+class Tee:
+ """
+ File-like object writing to two streams.
+ """
+ def __init__(self, stream1: IO, stream2: IO) -> None:
+ self.stream1 = stream1
+ self.stream2 = stream2
+
+ def write(self, text: str) -> None:
+ self.stream1.write(text)
+ self.stream2.write(text)
+
+ def flush(self) -> None:
+ if hasattr(self.stream1, 'flush'):
+ self.stream1.flush()
+ if hasattr(self.stream2, 'flush'):
+ self.stream2.flush()
+
+
+def parselinenos(spec: str, total: int) -> list[int]:
+ """Parse a line number spec (such as "1,2,4-6") and return a list of
+ wanted line numbers.
+ """
+ items = []
+ parts = spec.split(',')
+ for part in parts:
+ try:
+ begend = part.strip().split('-')
+ if ['', ''] == begend:
+ raise ValueError
+ if len(begend) == 1:
+ items.append(int(begend[0]) - 1)
+ elif len(begend) == 2:
+ start = int(begend[0] or 1) # left half open (cf. -10)
+ end = int(begend[1] or max(start, total)) # right half open (cf. 10-)
+ if start > end: # invalid range (cf. 10-1)
+ raise ValueError
+ items.extend(range(start - 1, end))
+ else:
+ raise ValueError
+ except ValueError as exc:
+ msg = f'invalid line number spec: {spec!r}'
+ raise ValueError(msg) from exc
+
+ return items
+
+
+def import_object(objname: str, source: str | None = None) -> Any:
+ """Import python object by qualname."""
+ try:
+ objpath = objname.split('.')
+ modname = objpath.pop(0)
+ obj = import_module(modname)
+ for name in objpath:
+ modname += '.' + name
+ try:
+ obj = getattr(obj, name)
+ except AttributeError:
+ obj = import_module(modname)
+
+ return obj
+ except (AttributeError, ImportError) as exc:
+ if source:
+ raise ExtensionError('Could not import %s (needed for %s)' %
+ (objname, source), exc) from exc
+ raise ExtensionError('Could not import %s' % objname, exc) from exc
+
+
+def encode_uri(uri: str) -> str:
+ split = list(urlsplit(uri))
+ split[1] = split[1].encode('idna').decode('ascii')
+ split[2] = quote_plus(split[2].encode(), '/')
+ query = [(q, v.encode()) for (q, v) in parse_qsl(split[3])]
+ split[3] = urlencode(query)
+ return urlunsplit(split)
+
+
+def isurl(url: str) -> bool:
+ """Check *url* is URL or not."""
+ return bool(url) and '://' in url
+
+
+def _xml_name_checker():
+ # to prevent import cycles
+ from sphinx.builders.epub3 import _XML_NAME_PATTERN
+
+ return _XML_NAME_PATTERN
+
+
+# deprecated name -> (object to return, canonical path or empty string)
+_DEPRECATED_OBJECTS = {
+ 'path_stabilize': (_osutil.path_stabilize, 'sphinx.util.osutil.path_stabilize'),
+ 'display_chunk': (_display.display_chunk, 'sphinx.util.display.display_chunk'),
+ 'status_iterator': (_display.status_iterator, 'sphinx.util.display.status_iterator'),
+ 'SkipProgressMessage': (_display.SkipProgressMessage,
+ 'sphinx.util.display.SkipProgressMessage'),
+ 'progress_message': (_display.progress_message, 'sphinx.util.display.progress_message'),
+ 'epoch_to_rfc1123': (_http_date.epoch_to_rfc1123, 'sphinx.http_date.epoch_to_rfc1123'),
+ 'rfc1123_to_epoch': (_http_date.rfc1123_to_epoch, 'sphinx.http_date.rfc1123_to_epoch'),
+ 'save_traceback': (_exceptions.save_traceback, 'sphinx.exceptions.save_traceback'),
+ 'format_exception_cut_frames': (_exceptions.format_exception_cut_frames,
+ 'sphinx.exceptions.format_exception_cut_frames'),
+ 'xmlname_checker': (_xml_name_checker, 'sphinx.builders.epub3._XML_NAME_PATTERN'),
+ 'split_index_msg': (_index_entries.split_index_msg,
+ 'sphinx.util.index_entries.split_index_msg'),
+ 'split_into': (_index_entries.split_index_msg, 'sphinx.util.index_entries.split_into'),
+ 'md5': (_md5, ''),
+ 'sha1': (_sha1, ''),
+}
+
+
+def __getattr__(name):
+ if name not in _DEPRECATED_OBJECTS:
+ msg = f'module {__name__!r} has no attribute {name!r}'
+ raise AttributeError(msg)
+
+ from sphinx.deprecation import _deprecation_warning
+
+ deprecated_object, canonical_name = _DEPRECATED_OBJECTS[name]
+ _deprecation_warning(__name__, name, canonical_name, remove=(8, 0))
+ return deprecated_object
diff --git a/sphinx/util/_pathlib.py b/sphinx/util/_pathlib.py
new file mode 100644
index 0000000..59980e9
--- /dev/null
+++ b/sphinx/util/_pathlib.py
@@ -0,0 +1,115 @@
+"""What follows is awful and will be gone in Sphinx 8"""
+
+from __future__ import annotations
+
+import sys
+import warnings
+from pathlib import Path, PosixPath, PurePath, WindowsPath
+
+from sphinx.deprecation import RemovedInSphinx80Warning
+
+_STR_METHODS = frozenset(str.__dict__)
+_PATH_NAME = Path().__class__.__name__
+
+_MSG = (
+ 'Sphinx 8 will drop support for representing paths as strings. '
+ 'Use "pathlib.Path" or "os.fspath" instead.'
+)
+
+# https://docs.python.org/3/library/stdtypes.html#typesseq-common
+# https://docs.python.org/3/library/stdtypes.html#string-methods
+
+if sys.platform == 'win32':
+ class _StrPath(WindowsPath):
+ def replace(self, old, new, count=-1, /):
+ # replace exists in both Path and str;
+ # in Path it makes filesystem changes, so we use the safer str version
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__().replace(old, new, count)
+
+ def __getattr__(self, item):
+ if item in _STR_METHODS:
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return getattr(self.__str__(), item)
+ msg = f'{_PATH_NAME!r} has no attribute {item!r}'
+ raise AttributeError(msg)
+
+ def __add__(self, other):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__() + other
+
+ def __bool__(self):
+ if not self.__str__():
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return False
+ return True
+
+ def __contains__(self, item):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return item in self.__str__()
+
+ def __eq__(self, other):
+ if isinstance(other, PurePath):
+ return super().__eq__(other)
+ if isinstance(other, str):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__() == other
+ return NotImplemented
+
+ def __hash__(self):
+ return super().__hash__()
+
+ def __getitem__(self, item):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__()[item]
+
+ def __len__(self):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return len(self.__str__())
+else:
+ class _StrPath(PosixPath):
+ def replace(self, old, new, count=-1, /):
+ # replace exists in both Path and str;
+ # in Path it makes filesystem changes, so we use the safer str version
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__().replace(old, new, count)
+
+ def __getattr__(self, item):
+ if item in _STR_METHODS:
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return getattr(self.__str__(), item)
+ msg = f'{_PATH_NAME!r} has no attribute {item!r}'
+ raise AttributeError(msg)
+
+ def __add__(self, other):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__() + other
+
+ def __bool__(self):
+ if not self.__str__():
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return False
+ return True
+
+ def __contains__(self, item):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return item in self.__str__()
+
+ def __eq__(self, other):
+ if isinstance(other, PurePath):
+ return super().__eq__(other)
+ if isinstance(other, str):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__() == other
+ return NotImplemented
+
+ def __hash__(self):
+ return super().__hash__()
+
+ def __getitem__(self, item):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return self.__str__()[item]
+
+ def __len__(self):
+ warnings.warn(_MSG, RemovedInSphinx80Warning, stacklevel=2)
+ return len(self.__str__())
diff --git a/sphinx/util/build_phase.py b/sphinx/util/build_phase.py
new file mode 100644
index 0000000..7f80aa5
--- /dev/null
+++ b/sphinx/util/build_phase.py
@@ -0,0 +1,12 @@
+"""Build phase of Sphinx application."""
+
+from enum import IntEnum
+
+
+class BuildPhase(IntEnum):
+ """Build phase of Sphinx application."""
+ INITIALIZATION = 1
+ READING = 2
+ CONSISTENCY_CHECK = 3
+ RESOLVING = 3
+ WRITING = 4
diff --git a/sphinx/util/cfamily.py b/sphinx/util/cfamily.py
new file mode 100644
index 0000000..a3fdbe3
--- /dev/null
+++ b/sphinx/util/cfamily.py
@@ -0,0 +1,464 @@
+"""Utility functions common to the C and C++ domains."""
+
+from __future__ import annotations
+
+import re
+from copy import deepcopy
+from typing import TYPE_CHECKING, Any, Callable
+
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from docutils.nodes import TextElement
+
+ from sphinx.config import Config
+
+logger = logging.getLogger(__name__)
+
+StringifyTransform = Callable[[Any], str]
+
+
+_whitespace_re = re.compile(r'\s+')
+anon_identifier_re = re.compile(r'(@[a-zA-Z0-9_])[a-zA-Z0-9_]*\b')
+identifier_re = re.compile(r'''
+ ( # This 'extends' _anon_identifier_re with the ordinary identifiers,
+ # make sure they are in sync.
+ (~?\b[a-zA-Z_]) # ordinary identifiers
+ | (@[a-zA-Z0-9_]) # our extension for names of anonymous entities
+ )
+ [a-zA-Z0-9_]*\b
+''', flags=re.VERBOSE)
+integer_literal_re = re.compile(r'[1-9][0-9]*(\'[0-9]+)*')
+octal_literal_re = re.compile(r'0[0-7]*(\'[0-7]+)*')
+hex_literal_re = re.compile(r'0[xX][0-9a-fA-F]+(\'[0-9a-fA-F]+)*')
+binary_literal_re = re.compile(r'0[bB][01]+(\'[01]+)*')
+integers_literal_suffix_re = re.compile(r'''
+ # unsigned and/or (long) long, in any order, but at least one of them
+ (
+ ([uU] ([lL] | (ll) | (LL))?)
+ |
+ (([lL] | (ll) | (LL)) [uU]?)
+ )\b
+ # the ending word boundary is important for distinguishing
+ # between suffixes and UDLs in C++
+''', flags=re.VERBOSE)
+float_literal_re = re.compile(r'''
+ [+-]?(
+ # decimal
+ ([0-9]+(\'[0-9]+)*[eE][+-]?[0-9]+(\'[0-9]+)*)
+ | (([0-9]+(\'[0-9]+)*)?\.[0-9]+(\'[0-9]+)*([eE][+-]?[0-9]+(\'[0-9]+)*)?)
+ | ([0-9]+(\'[0-9]+)*\.([eE][+-]?[0-9]+(\'[0-9]+)*)?)
+ # hex
+ | (0[xX][0-9a-fA-F]+(\'[0-9a-fA-F]+)*[pP][+-]?[0-9a-fA-F]+(\'[0-9a-fA-F]+)*)
+ | (0[xX]([0-9a-fA-F]+(\'[0-9a-fA-F]+)*)?\.
+ [0-9a-fA-F]+(\'[0-9a-fA-F]+)*([pP][+-]?[0-9a-fA-F]+(\'[0-9a-fA-F]+)*)?)
+ | (0[xX][0-9a-fA-F]+(\'[0-9a-fA-F]+)*\.([pP][+-]?[0-9a-fA-F]+(\'[0-9a-fA-F]+)*)?)
+ )
+''', flags=re.VERBOSE)
+float_literal_suffix_re = re.compile(r'[fFlL]\b')
+# the ending word boundary is important for distinguishing between suffixes and UDLs in C++
+char_literal_re = re.compile(r'''
+ ((?:u8)|u|U|L)?
+ '(
+ (?:[^\\'])
+ | (\\(
+ (?:['"?\\abfnrtv])
+ | (?:[0-7]{1,3})
+ | (?:x[0-9a-fA-F]{2})
+ | (?:u[0-9a-fA-F]{4})
+ | (?:U[0-9a-fA-F]{8})
+ ))
+ )'
+''', flags=re.VERBOSE)
+
+
+def verify_description_mode(mode: str) -> None:
+ if mode not in ('lastIsName', 'noneIsName', 'markType', 'markName', 'param', 'udl'):
+ raise Exception("Description mode '%s' is invalid." % mode)
+
+
+class NoOldIdError(Exception):
+ # Used to avoid implementing unneeded id generation for old id schemes.
+ pass
+
+
+class ASTBaseBase:
+ def __eq__(self, other: Any) -> bool:
+ if type(self) is not type(other):
+ return False
+ try:
+ for key, value in self.__dict__.items():
+ if value != getattr(other, key):
+ return False
+ except AttributeError:
+ return False
+ return True
+
+ # Defining __hash__ = None is not strictly needed when __eq__ is defined.
+ __hash__ = None # type: ignore[assignment]
+
+ def clone(self) -> Any:
+ return deepcopy(self)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ raise NotImplementedError(repr(self))
+
+ def __str__(self) -> str:
+ return self._stringify(lambda ast: str(ast))
+
+ def get_display_string(self) -> str:
+ return self._stringify(lambda ast: ast.get_display_string())
+
+ def __repr__(self) -> str:
+ return '<%s>' % self.__class__.__name__
+
+
+################################################################################
+# Attributes
+################################################################################
+
+class ASTAttribute(ASTBaseBase):
+ def describe_signature(self, signode: TextElement) -> None:
+ raise NotImplementedError(repr(self))
+
+
+class ASTCPPAttribute(ASTAttribute):
+ def __init__(self, arg: str) -> None:
+ self.arg = arg
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return "[[" + self.arg + "]]"
+
+ def describe_signature(self, signode: TextElement) -> None:
+ signode.append(addnodes.desc_sig_punctuation('[[', '[['))
+ signode.append(nodes.Text(self.arg))
+ signode.append(addnodes.desc_sig_punctuation(']]', ']]'))
+
+
+class ASTGnuAttribute(ASTBaseBase):
+ def __init__(self, name: str, args: ASTBaseParenExprList | None) -> None:
+ self.name = name
+ self.args = args
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = [self.name]
+ if self.args:
+ res.append(transform(self.args))
+ return ''.join(res)
+
+
+class ASTGnuAttributeList(ASTAttribute):
+ def __init__(self, attrs: list[ASTGnuAttribute]) -> None:
+ self.attrs = attrs
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ res = ['__attribute__((']
+ first = True
+ for attr in self.attrs:
+ if not first:
+ res.append(', ')
+ first = False
+ res.append(transform(attr))
+ res.append('))')
+ return ''.join(res)
+
+ def describe_signature(self, signode: TextElement) -> None:
+ txt = str(self)
+ signode.append(nodes.Text(txt))
+
+
+class ASTIdAttribute(ASTAttribute):
+ """For simple attributes defined by the user."""
+
+ def __init__(self, id: str) -> None:
+ self.id = id
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.id
+
+ def describe_signature(self, signode: TextElement) -> None:
+ signode.append(nodes.Text(self.id))
+
+
+class ASTParenAttribute(ASTAttribute):
+ """For paren attributes defined by the user."""
+
+ def __init__(self, id: str, arg: str) -> None:
+ self.id = id
+ self.arg = arg
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return self.id + '(' + self.arg + ')'
+
+ def describe_signature(self, signode: TextElement) -> None:
+ txt = str(self)
+ signode.append(nodes.Text(txt))
+
+
+class ASTAttributeList(ASTBaseBase):
+ def __init__(self, attrs: list[ASTAttribute]) -> None:
+ self.attrs = attrs
+
+ def __len__(self) -> int:
+ return len(self.attrs)
+
+ def __add__(self, other: ASTAttributeList) -> ASTAttributeList:
+ return ASTAttributeList(self.attrs + other.attrs)
+
+ def _stringify(self, transform: StringifyTransform) -> str:
+ return ' '.join(transform(attr) for attr in self.attrs)
+
+ def describe_signature(self, signode: TextElement) -> None:
+ if len(self.attrs) == 0:
+ return
+ self.attrs[0].describe_signature(signode)
+ if len(self.attrs) == 1:
+ return
+ for attr in self.attrs[1:]:
+ signode.append(addnodes.desc_sig_space())
+ attr.describe_signature(signode)
+
+
+################################################################################
+
+class ASTBaseParenExprList(ASTBaseBase):
+ pass
+
+
+################################################################################
+
+class UnsupportedMultiCharacterCharLiteral(Exception):
+ pass
+
+
+class DefinitionError(Exception):
+ pass
+
+
+class BaseParser:
+ def __init__(self, definition: str, *,
+ location: nodes.Node | tuple[str, int] | str,
+ config: Config) -> None:
+ self.definition = definition.strip()
+ self.location = location # for warnings
+ self.config = config
+
+ self.pos = 0
+ self.end = len(self.definition)
+ self.last_match: re.Match[str] | None = None
+ self._previous_state: tuple[int, re.Match[str] | None] = (0, None)
+ self.otherErrors: list[DefinitionError] = []
+
+ # in our tests the following is set to False to capture bad parsing
+ self.allowFallbackExpressionParsing = True
+
+ def _make_multi_error(self, errors: list[Any], header: str) -> DefinitionError:
+ if len(errors) == 1:
+ if len(header) > 0:
+ return DefinitionError(header + '\n' + str(errors[0][0]))
+ else:
+ return DefinitionError(str(errors[0][0]))
+ result = [header, '\n']
+ for e in errors:
+ if len(e[1]) > 0:
+ indent = ' '
+ result.append(e[1])
+ result.append(':\n')
+ for line in str(e[0]).split('\n'):
+ if len(line) == 0:
+ continue
+ result.append(indent)
+ result.append(line)
+ result.append('\n')
+ else:
+ result.append(str(e[0]))
+ return DefinitionError(''.join(result))
+
+ @property
+ def language(self) -> str:
+ raise NotImplementedError
+
+ def status(self, msg: str) -> None:
+ # for debugging
+ indicator = '-' * self.pos + '^'
+ logger.debug(f"{msg}\n{self.definition}\n{indicator}") # NoQA: G004
+
+ def fail(self, msg: str) -> None:
+ errors = []
+ indicator = '-' * self.pos + '^'
+ exMain = DefinitionError(
+ 'Invalid %s declaration: %s [error at %d]\n %s\n %s' %
+ (self.language, msg, self.pos, self.definition, indicator))
+ errors.append((exMain, "Main error"))
+ for err in self.otherErrors:
+ errors.append((err, "Potential other error"))
+ self.otherErrors = []
+ raise self._make_multi_error(errors, '')
+
+ def warn(self, msg: str) -> None:
+ logger.warning(msg, location=self.location)
+
+ def match(self, regex: re.Pattern[str]) -> bool:
+ match = regex.match(self.definition, self.pos)
+ if match is not None:
+ self._previous_state = (self.pos, self.last_match)
+ self.pos = match.end()
+ self.last_match = match
+ return True
+ return False
+
+ def skip_string(self, string: str) -> bool:
+ strlen = len(string)
+ if self.definition[self.pos:self.pos + strlen] == string:
+ self.pos += strlen
+ return True
+ return False
+
+ def skip_word(self, word: str) -> bool:
+ return self.match(re.compile(r'\b%s\b' % re.escape(word)))
+
+ def skip_ws(self) -> bool:
+ return self.match(_whitespace_re)
+
+ def skip_word_and_ws(self, word: str) -> bool:
+ if self.skip_word(word):
+ self.skip_ws()
+ return True
+ return False
+
+ def skip_string_and_ws(self, string: str) -> bool:
+ if self.skip_string(string):
+ self.skip_ws()
+ return True
+ return False
+
+ @property
+ def eof(self) -> bool:
+ return self.pos >= self.end
+
+ @property
+ def current_char(self) -> str:
+ try:
+ return self.definition[self.pos]
+ except IndexError:
+ return 'EOF'
+
+ @property
+ def matched_text(self) -> str:
+ if self.last_match is not None:
+ return self.last_match.group()
+ return ''
+
+ def read_rest(self) -> str:
+ rv = self.definition[self.pos:]
+ self.pos = self.end
+ return rv
+
+ def assert_end(self, *, allowSemicolon: bool = False) -> None:
+ self.skip_ws()
+ if allowSemicolon:
+ if not self.eof and self.definition[self.pos:] != ';':
+ self.fail('Expected end of definition or ;.')
+ else:
+ if not self.eof:
+ self.fail('Expected end of definition.')
+
+ ################################################################################
+
+ @property
+ def id_attributes(self):
+ raise NotImplementedError
+
+ @property
+ def paren_attributes(self):
+ raise NotImplementedError
+
+ def _parse_balanced_token_seq(self, end: list[str]) -> str:
+ # TODO: add handling of string literals and similar
+ brackets = {'(': ')', '[': ']', '{': '}'}
+ startPos = self.pos
+ symbols: list[str] = []
+ while not self.eof:
+ if len(symbols) == 0 and self.current_char in end:
+ break
+ if self.current_char in brackets:
+ symbols.append(brackets[self.current_char])
+ elif len(symbols) > 0 and self.current_char == symbols[-1]:
+ symbols.pop()
+ elif self.current_char in ")]}":
+ self.fail("Unexpected '%s' in balanced-token-seq." % self.current_char)
+ self.pos += 1
+ if self.eof:
+ self.fail("Could not find end of balanced-token-seq starting at %d."
+ % startPos)
+ return self.definition[startPos:self.pos]
+
+ def _parse_attribute(self) -> ASTAttribute | None:
+ self.skip_ws()
+ # try C++11 style
+ startPos = self.pos
+ if self.skip_string_and_ws('['):
+ if not self.skip_string('['):
+ self.pos = startPos
+ else:
+ # TODO: actually implement the correct grammar
+ arg = self._parse_balanced_token_seq(end=[']'])
+ if not self.skip_string_and_ws(']'):
+ self.fail("Expected ']' in end of attribute.")
+ if not self.skip_string_and_ws(']'):
+ self.fail("Expected ']' in end of attribute after [[...]")
+ return ASTCPPAttribute(arg)
+
+ # try GNU style
+ if self.skip_word_and_ws('__attribute__'):
+ if not self.skip_string_and_ws('('):
+ self.fail("Expected '(' after '__attribute__'.")
+ if not self.skip_string_and_ws('('):
+ self.fail("Expected '(' after '__attribute__('.")
+ attrs = []
+ while 1:
+ if self.match(identifier_re):
+ name = self.matched_text
+ exprs = self._parse_paren_expression_list()
+ attrs.append(ASTGnuAttribute(name, exprs))
+ if self.skip_string_and_ws(','):
+ continue
+ if self.skip_string_and_ws(')'):
+ break
+ self.fail("Expected identifier, ')', or ',' in __attribute__.")
+ if not self.skip_string_and_ws(')'):
+ self.fail("Expected ')' after '__attribute__((...)'")
+ return ASTGnuAttributeList(attrs)
+
+ # try the simple id attributes defined by the user
+ for id in self.id_attributes:
+ if self.skip_word_and_ws(id):
+ return ASTIdAttribute(id)
+
+ # try the paren attributes defined by the user
+ for id in self.paren_attributes:
+ if not self.skip_string_and_ws(id):
+ continue
+ if not self.skip_string('('):
+ self.fail("Expected '(' after user-defined paren-attribute.")
+ arg = self._parse_balanced_token_seq(end=[')'])
+ if not self.skip_string(')'):
+ self.fail("Expected ')' to end user-defined paren-attribute.")
+ return ASTParenAttribute(id, arg)
+
+ return None
+
+ def _parse_attribute_list(self) -> ASTAttributeList:
+ res = []
+ while True:
+ attr = self._parse_attribute()
+ if attr is None:
+ break
+ res.append(attr)
+ return ASTAttributeList(res)
+
+ def _parse_paren_expression_list(self) -> ASTBaseParenExprList | None:
+ raise NotImplementedError
diff --git a/sphinx/util/console.py b/sphinx/util/console.py
new file mode 100644
index 0000000..0fc9450
--- /dev/null
+++ b/sphinx/util/console.py
@@ -0,0 +1,129 @@
+"""Format colored console output."""
+
+from __future__ import annotations
+
+import os
+import re
+import shutil
+import sys
+
+try:
+ # check if colorama is installed to support color on Windows
+ import colorama
+except ImportError:
+ colorama = None
+
+
+_ansi_re: re.Pattern[str] = re.compile('\x1b\\[(\\d\\d;){0,2}\\d\\dm')
+codes: dict[str, str] = {}
+
+
+def terminal_safe(s: str) -> str:
+ """Safely encode a string for printing to the terminal."""
+ return s.encode('ascii', 'backslashreplace').decode('ascii')
+
+
+def get_terminal_width() -> int:
+ """Return the width of the terminal in columns."""
+ return shutil.get_terminal_size().columns - 1
+
+
+_tw: int = get_terminal_width()
+
+
+def term_width_line(text: str) -> str:
+ if not codes:
+ # if no coloring, don't output fancy backspaces
+ return text + '\n'
+ else:
+ # codes are not displayed, this must be taken into account
+ return text.ljust(_tw + len(text) - len(_ansi_re.sub('', text))) + '\r'
+
+
+def color_terminal() -> bool:
+ if 'NO_COLOR' in os.environ:
+ return False
+ if sys.platform == 'win32' and colorama is not None:
+ colorama.init()
+ return True
+ if 'FORCE_COLOR' in os.environ:
+ return True
+ if not hasattr(sys.stdout, 'isatty'):
+ return False
+ if not sys.stdout.isatty():
+ return False
+ if 'COLORTERM' in os.environ:
+ return True
+ term = os.environ.get('TERM', 'dumb').lower()
+ if term in ('xterm', 'linux') or 'color' in term:
+ return True
+ return False
+
+
+def nocolor() -> None:
+ if sys.platform == 'win32' and colorama is not None:
+ colorama.deinit()
+ codes.clear()
+
+
+def coloron() -> None:
+ codes.update(_orig_codes)
+
+
+def colorize(name: str, text: str, input_mode: bool = False) -> str:
+ def escseq(name: str) -> str:
+ # Wrap escape sequence with ``\1`` and ``\2`` to let readline know
+ # it is non-printable characters
+ # ref: https://tiswww.case.edu/php/chet/readline/readline.html
+ #
+ # Note: This hack does not work well in Windows (see #5059)
+ escape = codes.get(name, '')
+ if input_mode and escape and sys.platform != 'win32':
+ return '\1' + escape + '\2'
+ else:
+ return escape
+
+ return escseq(name) + text + escseq('reset')
+
+
+def strip_colors(s: str) -> str:
+ return re.compile('\x1b.*?m').sub('', s)
+
+
+def create_color_func(name: str) -> None:
+ def inner(text: str) -> str:
+ return colorize(name, text)
+ globals()[name] = inner
+
+
+_attrs = {
+ 'reset': '39;49;00m',
+ 'bold': '01m',
+ 'faint': '02m',
+ 'standout': '03m',
+ 'underline': '04m',
+ 'blink': '05m',
+}
+
+for _name, _value in _attrs.items():
+ codes[_name] = '\x1b[' + _value
+
+_colors = [
+ ('black', 'darkgray'),
+ ('darkred', 'red'),
+ ('darkgreen', 'green'),
+ ('brown', 'yellow'),
+ ('darkblue', 'blue'),
+ ('purple', 'fuchsia'),
+ ('turquoise', 'teal'),
+ ('lightgray', 'white'),
+]
+
+for i, (dark, light) in enumerate(_colors, 30):
+ codes[dark] = '\x1b[%im' % i
+ codes[light] = '\x1b[%im' % (i + 60)
+
+_orig_codes = codes.copy()
+
+for _name in codes:
+ create_color_func(_name)
diff --git a/sphinx/util/display.py b/sphinx/util/display.py
new file mode 100644
index 0000000..199119c
--- /dev/null
+++ b/sphinx/util/display.py
@@ -0,0 +1,94 @@
+from __future__ import annotations
+
+import functools
+from typing import Any, Callable, TypeVar
+
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.console import bold # type: ignore[attr-defined]
+
+if False:
+ from collections.abc import Iterable, Iterator
+ from types import TracebackType
+
+logger = logging.getLogger(__name__)
+
+
+def display_chunk(chunk: Any) -> str:
+ if isinstance(chunk, (list, tuple)):
+ if len(chunk) == 1:
+ return str(chunk[0])
+ return f'{chunk[0]} .. {chunk[-1]}'
+ return str(chunk)
+
+
+T = TypeVar('T')
+
+
+def status_iterator(
+ iterable: Iterable[T],
+ summary: str,
+ color: str = 'darkgreen',
+ length: int = 0,
+ verbosity: int = 0,
+ stringify_func: Callable[[Any], str] = display_chunk,
+) -> Iterator[T]:
+ single_line = verbosity < 1
+ bold_summary = bold(summary)
+ if length == 0:
+ logger.info(bold_summary, nonl=True)
+ for item in iterable:
+ logger.info(stringify_func(item) + ' ', nonl=True, color=color)
+ yield item
+ else:
+ for i, item in enumerate(iterable, start=1):
+ if single_line:
+ # clear the entire line ('Erase in Line')
+ logger.info('\x1b[2K', nonl=True)
+ logger.info(f'{bold_summary}[{i / length: >4.0%}] ', nonl=True) # NoQA: G004
+ # Emit the string representation of ``item``
+ logger.info(stringify_func(item), nonl=True, color=color)
+ # If in single-line mode, emit a carriage return to move the cursor
+ # to the start of the line.
+ # If not, emit a newline to move the cursor to the next line.
+ logger.info('\r' * single_line, nonl=single_line)
+ yield item
+ logger.info('')
+
+
+class SkipProgressMessage(Exception):
+ pass
+
+
+class progress_message:
+ def __init__(self, message: str) -> None:
+ self.message = message
+
+ def __enter__(self) -> None:
+ logger.info(bold(self.message + '... '), nonl=True)
+
+ def __exit__(
+ self,
+ typ: type[BaseException] | None,
+ val: BaseException | None,
+ tb: TracebackType | None,
+ ) -> bool:
+ if isinstance(val, SkipProgressMessage):
+ logger.info(__('skipped'))
+ if val.args:
+ logger.info(*val.args)
+ return True
+ elif val:
+ logger.info(__('failed'))
+ else:
+ logger.info(__('done'))
+
+ return False
+
+ def __call__(self, f: Callable) -> Callable:
+ @functools.wraps(f)
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
+ with self:
+ return f(*args, **kwargs)
+
+ return wrapper
diff --git a/sphinx/util/docfields.py b/sphinx/util/docfields.py
new file mode 100644
index 0000000..c48c3be
--- /dev/null
+++ b/sphinx/util/docfields.py
@@ -0,0 +1,408 @@
+"""Utility code for "Doc fields".
+
+"Doc fields" are reST field lists in object descriptions that will
+be domain-specifically transformed to a more appealing presentation.
+"""
+from __future__ import annotations
+
+import contextlib
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.nodes import Element, Node
+
+from sphinx import addnodes
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.nodes import get_node_line
+
+if TYPE_CHECKING:
+ from docutils.parsers.rst.states import Inliner
+
+ from sphinx.directives import ObjectDescription
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import TextlikeNode
+
+logger = logging.getLogger(__name__)
+
+
+def _is_single_paragraph(node: nodes.field_body) -> bool:
+ """True if the node only contains one paragraph (and system messages)."""
+ if len(node) == 0:
+ return False
+ elif len(node) > 1:
+ for subnode in node[1:]: # type: Node
+ if not isinstance(subnode, nodes.system_message):
+ return False
+ if isinstance(node[0], nodes.paragraph):
+ return True
+ return False
+
+
+class Field:
+ """A doc field that is never grouped. It can have an argument or not, the
+ argument can be linked using a specified *rolename*. Field should be used
+ for doc fields that usually don't occur more than once.
+
+ The body can be linked using a specified *bodyrolename* if the content is
+ just a single inline or text node.
+
+ Example::
+
+ :returns: description of the return value
+ :rtype: description of the return type
+ """
+ is_grouped = False
+ is_typed = False
+
+ def __init__(
+ self,
+ name: str,
+ names: tuple[str, ...] = (),
+ label: str = '',
+ has_arg: bool = True,
+ rolename: str = '',
+ bodyrolename: str = '',
+ ) -> None:
+ self.name = name
+ self.names = names
+ self.label = label
+ self.has_arg = has_arg
+ self.rolename = rolename
+ self.bodyrolename = bodyrolename
+
+ def make_xref(self, rolename: str, domain: str, target: str,
+ innernode: type[TextlikeNode] = addnodes.literal_emphasis,
+ contnode: Node | None = None, env: BuildEnvironment | None = None,
+ inliner: Inliner | None = None, location: Element | None = None) -> Node:
+ # note: for backwards compatibility env is last, but not optional
+ assert env is not None
+ assert (inliner is None) == (location is None), (inliner, location)
+ if not rolename:
+ return contnode or innernode(target, target)
+ # The domain is passed from DocFieldTransformer. So it surely exists.
+ # So we don't need to take care the env.get_domain() raises an exception.
+ role = env.get_domain(domain).role(rolename)
+ if role is None or inliner is None:
+ if role is None and inliner is not None:
+ msg = __("Problem in %s domain: field is supposed "
+ "to use role '%s', but that role is not in the domain.")
+ logger.warning(__(msg), domain, rolename, location=location)
+ refnode = addnodes.pending_xref('', refdomain=domain, refexplicit=False,
+ reftype=rolename, reftarget=target)
+ refnode += contnode or innernode(target, target)
+ env.get_domain(domain).process_field_xref(refnode)
+ return refnode
+ lineno = -1
+ if location is not None:
+ with contextlib.suppress(ValueError):
+ lineno = get_node_line(location)
+ ns, messages = role(rolename, target, target, lineno, inliner, {}, [])
+ return nodes.inline(target, '', *ns)
+
+ def make_xrefs(self, rolename: str, domain: str, target: str,
+ innernode: type[TextlikeNode] = addnodes.literal_emphasis,
+ contnode: Node | None = None, env: BuildEnvironment | None = None,
+ inliner: Inliner | None = None, location: Element | None = None,
+ ) -> list[Node]:
+ return [self.make_xref(rolename, domain, target, innernode, contnode,
+ env, inliner, location)]
+
+ def make_entry(self, fieldarg: str, content: list[Node]) -> tuple[str, list[Node]]:
+ return (fieldarg, content)
+
+ def make_field(
+ self,
+ types: dict[str, list[Node]],
+ domain: str,
+ item: tuple,
+ env: BuildEnvironment | None = None,
+ inliner: Inliner | None = None,
+ location: Element | None = None,
+ ) -> nodes.field:
+ fieldarg, content = item
+ fieldname = nodes.field_name('', self.label)
+ if fieldarg:
+ fieldname += nodes.Text(' ')
+ fieldname.extend(self.make_xrefs(self.rolename, domain,
+ fieldarg, nodes.Text,
+ env=env, inliner=inliner, location=location))
+
+ if len(content) == 1 and (
+ isinstance(content[0], nodes.Text) or
+ (isinstance(content[0], nodes.inline) and len(content[0]) == 1 and
+ isinstance(content[0][0], nodes.Text))):
+ content = self.make_xrefs(self.bodyrolename, domain,
+ content[0].astext(), contnode=content[0],
+ env=env, inliner=inliner, location=location)
+ fieldbody = nodes.field_body('', nodes.paragraph('', '', *content))
+ return nodes.field('', fieldname, fieldbody)
+
+
+class GroupedField(Field):
+ """
+ A doc field that is grouped; i.e., all fields of that type will be
+ transformed into one field with its body being a bulleted list. It always
+ has an argument. The argument can be linked using the given *rolename*.
+ GroupedField should be used for doc fields that can occur more than once.
+ If *can_collapse* is true, this field will revert to a Field if only used
+ once.
+
+ Example::
+
+ :raises ErrorClass: description when it is raised
+ """
+ is_grouped = True
+ list_type = nodes.bullet_list
+
+ def __init__(self, name: str, names: tuple[str, ...] = (), label: str = '',
+ rolename: str = '', can_collapse: bool = False) -> None:
+ super().__init__(name, names, label, True, rolename)
+ self.can_collapse = can_collapse
+
+ def make_field(
+ self,
+ types: dict[str, list[Node]],
+ domain: str,
+ items: tuple,
+ env: BuildEnvironment | None = None,
+ inliner: Inliner | None = None,
+ location: Element | None = None,
+ ) -> nodes.field:
+ fieldname = nodes.field_name('', self.label)
+ listnode = self.list_type()
+ for fieldarg, content in items:
+ par = nodes.paragraph()
+ par.extend(self.make_xrefs(self.rolename, domain, fieldarg,
+ addnodes.literal_strong,
+ env=env, inliner=inliner, location=location))
+ par += nodes.Text(' -- ')
+ par += content
+ listnode += nodes.list_item('', par)
+
+ if len(items) == 1 and self.can_collapse:
+ list_item = cast(nodes.list_item, listnode[0])
+ fieldbody = nodes.field_body('', list_item[0])
+ return nodes.field('', fieldname, fieldbody)
+
+ fieldbody = nodes.field_body('', listnode)
+ return nodes.field('', fieldname, fieldbody)
+
+
+class TypedField(GroupedField):
+ """
+ A doc field that is grouped and has type information for the arguments. It
+ always has an argument. The argument can be linked using the given
+ *rolename*, the type using the given *typerolename*.
+
+ Two uses are possible: either parameter and type description are given
+ separately, using a field from *names* and one from *typenames*,
+ respectively, or both are given using a field from *names*, see the example.
+
+ Example::
+
+ :param foo: description of parameter foo
+ :type foo: SomeClass
+
+ -- or --
+
+ :param SomeClass foo: description of parameter foo
+ """
+ is_typed = True
+
+ def __init__(
+ self,
+ name: str,
+ names: tuple[str, ...] = (),
+ typenames: tuple[str, ...] = (),
+ label: str = '',
+ rolename: str = '',
+ typerolename: str = '',
+ can_collapse: bool = False,
+ ) -> None:
+ super().__init__(name, names, label, rolename, can_collapse)
+ self.typenames = typenames
+ self.typerolename = typerolename
+
+ def make_field(
+ self,
+ types: dict[str, list[Node]],
+ domain: str,
+ items: tuple,
+ env: BuildEnvironment | None = None,
+ inliner: Inliner | None = None,
+ location: Element | None = None,
+ ) -> nodes.field:
+ def handle_item(fieldarg: str, content: str) -> nodes.paragraph:
+ par = nodes.paragraph()
+ par.extend(self.make_xrefs(self.rolename, domain, fieldarg,
+ addnodes.literal_strong, env=env))
+ if fieldarg in types:
+ par += nodes.Text(' (')
+ # NOTE: using .pop() here to prevent a single type node to be
+ # inserted twice into the doctree, which leads to
+ # inconsistencies later when references are resolved
+ fieldtype = types.pop(fieldarg)
+ if len(fieldtype) == 1 and isinstance(fieldtype[0], nodes.Text):
+ typename = fieldtype[0].astext()
+ par.extend(self.make_xrefs(self.typerolename, domain, typename,
+ addnodes.literal_emphasis, env=env,
+ inliner=inliner, location=location))
+ else:
+ par += fieldtype
+ par += nodes.Text(')')
+ par += nodes.Text(' -- ')
+ par += content
+ return par
+
+ fieldname = nodes.field_name('', self.label)
+ if len(items) == 1 and self.can_collapse:
+ fieldarg, content = items[0]
+ bodynode: Node = handle_item(fieldarg, content)
+ else:
+ bodynode = self.list_type()
+ for fieldarg, content in items:
+ bodynode += nodes.list_item('', handle_item(fieldarg, content))
+ fieldbody = nodes.field_body('', bodynode)
+ return nodes.field('', fieldname, fieldbody)
+
+
+class DocFieldTransformer:
+ """
+ Transforms field lists in "doc field" syntax into better-looking
+ equivalents, using the field type definitions given on a domain.
+ """
+ typemap: dict[str, tuple[Field, bool]]
+
+ def __init__(self, directive: ObjectDescription) -> None:
+ self.directive = directive
+
+ self.typemap = directive.get_field_type_map()
+
+ def transform_all(self, node: addnodes.desc_content) -> None:
+ """Transform all field list children of a node."""
+ # don't traverse, only handle field lists that are immediate children
+ for child in node:
+ if isinstance(child, nodes.field_list):
+ self.transform(child)
+
+ def transform(self, node: nodes.field_list) -> None:
+ """Transform a single field list *node*."""
+ typemap = self.typemap
+
+ entries: list[nodes.field | tuple[Field, Any, Element]] = []
+ groupindices: dict[str, int] = {}
+ types: dict[str, dict] = {}
+
+ # step 1: traverse all fields and collect field types and content
+ for field in cast(list[nodes.field], node):
+ assert len(field) == 2
+ field_name = cast(nodes.field_name, field[0])
+ field_body = cast(nodes.field_body, field[1])
+ try:
+ # split into field type and argument
+ fieldtype_name, fieldarg = field_name.astext().split(None, 1)
+ except ValueError:
+ # maybe an argument-less field type?
+ fieldtype_name, fieldarg = field_name.astext(), ''
+ typedesc, is_typefield = typemap.get(fieldtype_name, (None, None))
+
+ # collect the content, trying not to keep unnecessary paragraphs
+ if _is_single_paragraph(field_body):
+ paragraph = cast(nodes.paragraph, field_body[0])
+ content = paragraph.children
+ else:
+ content = field_body.children
+
+ # sort out unknown fields
+ if typedesc is None or typedesc.has_arg != bool(fieldarg):
+ # either the field name is unknown, or the argument doesn't
+ # match the spec; capitalize field name and be done with it
+ new_fieldname = fieldtype_name[0:1].upper() + fieldtype_name[1:]
+ if fieldarg:
+ new_fieldname += ' ' + fieldarg
+ field_name[0] = nodes.Text(new_fieldname)
+ entries.append(field)
+
+ # but if this has a type then we can at least link it
+ if (typedesc and is_typefield and content and
+ len(content) == 1 and isinstance(content[0], nodes.Text)):
+ typed_field = cast(TypedField, typedesc)
+ target = content[0].astext()
+ xrefs = typed_field.make_xrefs(
+ typed_field.typerolename,
+ self.directive.domain or '',
+ target,
+ contnode=content[0],
+ env=self.directive.state.document.settings.env,
+ )
+ if _is_single_paragraph(field_body):
+ paragraph = cast(nodes.paragraph, field_body[0])
+ paragraph.clear()
+ paragraph.extend(xrefs)
+ else:
+ field_body.clear()
+ field_body += nodes.paragraph('', '', *xrefs)
+
+ continue
+
+ typename = typedesc.name
+
+ # if the field specifies a type, put it in the types collection
+ if is_typefield:
+ # filter out only inline nodes; others will result in invalid
+ # markup being written out
+ content = [n for n in content if isinstance(n, (nodes.Inline, nodes.Text))]
+ if content:
+ types.setdefault(typename, {})[fieldarg] = content
+ continue
+
+ # also support syntax like ``:param type name:``
+ if typedesc.is_typed:
+ try:
+ argtype, argname = fieldarg.rsplit(None, 1)
+ except ValueError:
+ pass
+ else:
+ types.setdefault(typename, {})[argname] = \
+ [nodes.Text(argtype)]
+ fieldarg = argname
+
+ translatable_content = nodes.inline(field_body.rawsource,
+ translatable=True)
+ translatable_content.document = field_body.parent.document
+ translatable_content.source = field_body.parent.source
+ translatable_content.line = field_body.parent.line
+ translatable_content += content
+
+ # grouped entries need to be collected in one entry, while others
+ # get one entry per field
+ if typedesc.is_grouped:
+ if typename in groupindices:
+ group = cast(tuple[Field, list, Node], entries[groupindices[typename]])
+ else:
+ groupindices[typename] = len(entries)
+ group = (typedesc, [], field)
+ entries.append(group)
+ new_entry = typedesc.make_entry(fieldarg, [translatable_content])
+ group[1].append(new_entry)
+ else:
+ new_entry = typedesc.make_entry(fieldarg, [translatable_content])
+ entries.append((typedesc, new_entry, field))
+
+ # step 2: all entries are collected, construct the new field list
+ new_list = nodes.field_list()
+ for entry in entries:
+ if isinstance(entry, nodes.field):
+ # pass-through old field
+ new_list += entry
+ else:
+ fieldtype, items, location = entry
+ fieldtypes = types.get(fieldtype.name, {})
+ env = self.directive.state.document.settings.env
+ inliner = self.directive.state.inliner
+ domain = self.directive.domain or ''
+ new_list += fieldtype.make_field(fieldtypes, domain, items,
+ env=env, inliner=inliner, location=location)
+
+ node.replace_self(new_list)
diff --git a/sphinx/util/docstrings.py b/sphinx/util/docstrings.py
new file mode 100644
index 0000000..6ccc538
--- /dev/null
+++ b/sphinx/util/docstrings.py
@@ -0,0 +1,88 @@
+"""Utilities for docstring processing."""
+
+from __future__ import annotations
+
+import re
+import sys
+
+from docutils.parsers.rst.states import Body
+
+field_list_item_re = re.compile(Body.patterns['field_marker'])
+
+
+def separate_metadata(s: str | None) -> tuple[str | None, dict[str, str]]:
+ """Separate docstring into metadata and others."""
+ in_other_element = False
+ metadata: dict[str, str] = {}
+ lines = []
+
+ if not s:
+ return s, metadata
+
+ for line in prepare_docstring(s):
+ if line.strip() == '':
+ in_other_element = False
+ lines.append(line)
+ else:
+ matched = field_list_item_re.match(line)
+ if matched and not in_other_element:
+ field_name = matched.group()[1:].split(':', 1)[0]
+ if field_name.startswith('meta '):
+ name = field_name[5:].strip()
+ metadata[name] = line[matched.end():].strip()
+ else:
+ lines.append(line)
+ else:
+ in_other_element = True
+ lines.append(line)
+
+ return '\n'.join(lines), metadata
+
+
+def prepare_docstring(s: str, tabsize: int = 8) -> list[str]:
+ """Convert a docstring into lines of parseable reST. Remove common leading
+ indentation, where the indentation of the first line 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(tabsize).splitlines()
+ # Find minimum indentation of any non-blank lines after ignored lines.
+ margin = sys.maxsize
+ for line in lines[1:]:
+ content = len(line.lstrip())
+ if content:
+ indent = len(line) - content
+ margin = min(margin, indent)
+ # Remove indentation from the first line.
+ if len(lines):
+ lines[0] = lines[0].lstrip()
+ if margin < sys.maxsize:
+ for i in range(1, len(lines)):
+ lines[i] = lines[i][margin:]
+ # Remove any leading blank lines.
+ while lines and not lines[0]:
+ lines.pop(0)
+ # make sure there is an empty line at the end
+ if lines and lines[-1]:
+ lines.append('')
+ return lines
+
+
+def prepare_commentdoc(s: str) -> list[str]:
+ """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()]
+ for line in lines:
+ if line.startswith('#:'):
+ line = line[2:]
+ # the first space after the comment is ignored
+ if line and line[0] == ' ':
+ line = line[1:]
+ result.append(line)
+ if result and result[-1]:
+ result.append('')
+ return result
diff --git a/sphinx/util/docutils.py b/sphinx/util/docutils.py
new file mode 100644
index 0000000..a862417
--- /dev/null
+++ b/sphinx/util/docutils.py
@@ -0,0 +1,635 @@
+"""Utility functions for docutils."""
+
+from __future__ import annotations
+
+import os
+import re
+from collections.abc import Sequence # NoQA: TCH003
+from contextlib import contextmanager
+from copy import copy
+from os import path
+from typing import IO, TYPE_CHECKING, Any, Callable, cast
+
+import docutils
+from docutils import nodes
+from docutils.io import FileOutput
+from docutils.parsers.rst import Directive, directives, roles
+from docutils.parsers.rst.states import Inliner # NoQA: TCH002
+from docutils.statemachine import State, StateMachine, StringList
+from docutils.utils import Reporter, unescape
+from docutils.writers._html_base import HTMLTranslator
+
+from sphinx.errors import SphinxError
+from sphinx.locale import _, __
+from sphinx.util import logging
+
+logger = logging.getLogger(__name__)
+report_re = re.compile('^(.+?:(?:\\d+)?): \\((DEBUG|INFO|WARNING|ERROR|SEVERE)/(\\d+)?\\) ')
+
+if TYPE_CHECKING:
+ from collections.abc import Generator
+ from types import ModuleType
+
+ from docutils.frontend import Values
+ from docutils.nodes import Element, Node, system_message
+
+ from sphinx.builders import Builder
+ from sphinx.config import Config
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import RoleFunction
+
+# deprecated name -> (object to return, canonical path or empty string)
+_DEPRECATED_OBJECTS = {
+ '__version_info__': (docutils.__version_info__, 'docutils.__version_info__'),
+}
+
+
+def __getattr__(name):
+ if name not in _DEPRECATED_OBJECTS:
+ msg = f'module {__name__!r} has no attribute {name!r}'
+ raise AttributeError(msg)
+
+ from sphinx.deprecation import _deprecation_warning
+
+ deprecated_object, canonical_name = _DEPRECATED_OBJECTS[name]
+ _deprecation_warning(__name__, name, canonical_name, remove=(7, 0))
+ return deprecated_object
+
+
+additional_nodes: set[type[Element]] = set()
+
+
+@contextmanager
+def docutils_namespace() -> Generator[None, None, None]:
+ """Create namespace for reST parsers."""
+ try:
+ _directives = copy(directives._directives) # type: ignore[attr-defined]
+ _roles = copy(roles._roles) # type: ignore[attr-defined]
+
+ yield
+ finally:
+ directives._directives = _directives # type: ignore[attr-defined]
+ roles._roles = _roles # type: ignore[attr-defined]
+
+ for node in list(additional_nodes):
+ unregister_node(node)
+ additional_nodes.discard(node)
+
+
+def is_directive_registered(name: str) -> bool:
+ """Check the *name* directive is already registered."""
+ return name in directives._directives # type: ignore[attr-defined]
+
+
+def register_directive(name: str, directive: type[Directive]) -> None:
+ """Register a directive to docutils.
+
+ This modifies global state of docutils. So it is better to use this
+ inside ``docutils_namespace()`` to prevent side-effects.
+ """
+ directives.register_directive(name, directive)
+
+
+def is_role_registered(name: str) -> bool:
+ """Check the *name* role is already registered."""
+ return name in roles._roles # type: ignore[attr-defined]
+
+
+def register_role(name: str, role: RoleFunction) -> None:
+ """Register a role to docutils.
+
+ This modifies global state of docutils. So it is better to use this
+ inside ``docutils_namespace()`` to prevent side-effects.
+ """
+ roles.register_local_role(name, role)
+
+
+def unregister_role(name: str) -> None:
+ """Unregister a role from docutils."""
+ roles._roles.pop(name, None) # type: ignore[attr-defined]
+
+
+def is_node_registered(node: type[Element]) -> bool:
+ """Check the *node* is already registered."""
+ return hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__)
+
+
+def register_node(node: type[Element]) -> None:
+ """Register a node to docutils.
+
+ This modifies global state of some visitors. So it is better to use this
+ inside ``docutils_namespace()`` to prevent side-effects.
+ """
+ if not hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__):
+ nodes._add_node_class_names([node.__name__]) # type: ignore[attr-defined]
+ additional_nodes.add(node)
+
+
+def unregister_node(node: type[Element]) -> None:
+ """Unregister a node from docutils.
+
+ This is inverse of ``nodes._add_nodes_class_names()``.
+ """
+ if hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__):
+ delattr(nodes.GenericNodeVisitor, "visit_" + node.__name__)
+ delattr(nodes.GenericNodeVisitor, "depart_" + node.__name__)
+ delattr(nodes.SparseNodeVisitor, 'visit_' + node.__name__)
+ delattr(nodes.SparseNodeVisitor, 'depart_' + node.__name__)
+
+
+@contextmanager
+def patched_get_language() -> Generator[None, None, None]:
+ """Patch docutils.languages.get_language() temporarily.
+
+ This ignores the second argument ``reporter`` to suppress warnings.
+ refs: https://github.com/sphinx-doc/sphinx/issues/3788
+ """
+ from docutils.languages import get_language
+
+ def patched_get_language(language_code: str, reporter: Reporter | None = None) -> Any:
+ return get_language(language_code)
+
+ try:
+ docutils.languages.get_language = patched_get_language
+ yield
+ finally:
+ # restore original implementations
+ docutils.languages.get_language = get_language
+
+
+@contextmanager
+def patched_rst_get_language() -> Generator[None, None, None]:
+ """Patch docutils.parsers.rst.languages.get_language().
+ Starting from docutils 0.17, get_language() in ``rst.languages``
+ also has a reporter, which needs to be disabled temporarily.
+
+ This should also work for old versions of docutils,
+ because reporter is none by default.
+
+ refs: https://github.com/sphinx-doc/sphinx/issues/10179
+ """
+ from docutils.parsers.rst.languages import get_language
+
+ def patched_get_language(language_code: str, reporter: Reporter | None = None) -> Any:
+ return get_language(language_code)
+
+ try:
+ docutils.parsers.rst.languages.get_language = patched_get_language
+ yield
+ finally:
+ # restore original implementations
+ docutils.parsers.rst.languages.get_language = get_language
+
+
+@contextmanager
+def using_user_docutils_conf(confdir: str | None) -> Generator[None, None, None]:
+ """Let docutils know the location of ``docutils.conf`` for Sphinx."""
+ try:
+ docutilsconfig = os.environ.get('DOCUTILSCONFIG', None)
+ if confdir:
+ os.environ['DOCUTILSCONFIG'] = path.join(path.abspath(confdir), 'docutils.conf')
+
+ yield
+ finally:
+ if docutilsconfig is None:
+ os.environ.pop('DOCUTILSCONFIG', None)
+ else:
+ os.environ['DOCUTILSCONFIG'] = docutilsconfig
+
+
+@contextmanager
+def du19_footnotes() -> Generator[None, None, None]:
+ def visit_footnote(self, node):
+ label_style = self.settings.footnote_references
+ if not isinstance(node.previous_sibling(), type(node)):
+ self.body.append(f'<aside class="footnote-list {label_style}">\n')
+ self.body.append(self.starttag(node, 'aside',
+ classes=[node.tagname, label_style],
+ role="note"))
+
+ def depart_footnote(self, node):
+ self.body.append('</aside>\n')
+ if not isinstance(node.next_node(descend=False, siblings=True),
+ type(node)):
+ self.body.append('</aside>\n')
+
+ old_visit_footnote = HTMLTranslator.visit_footnote
+ old_depart_footnote = HTMLTranslator.depart_footnote
+
+ # Only apply on Docutils 0.18 or 0.18.1, as 0.17 and earlier used a <dl> based
+ # approach, and 0.19 and later use the fixed approach by default.
+ if docutils.__version_info__[:2] == (0, 18):
+ HTMLTranslator.visit_footnote = visit_footnote # type: ignore[method-assign]
+ HTMLTranslator.depart_footnote = depart_footnote # type: ignore[method-assign]
+
+ try:
+ yield
+ finally:
+ if docutils.__version_info__[:2] == (0, 18):
+ HTMLTranslator.visit_footnote = old_visit_footnote # type: ignore[method-assign]
+ HTMLTranslator.depart_footnote = old_depart_footnote # type: ignore[method-assign]
+
+
+@contextmanager
+def patch_docutils(confdir: str | None = None) -> Generator[None, None, None]:
+ """Patch to docutils temporarily."""
+ with patched_get_language(), \
+ patched_rst_get_language(), \
+ using_user_docutils_conf(confdir), \
+ du19_footnotes():
+ yield
+
+
+class CustomReSTDispatcher:
+ """Custom reST's mark-up dispatcher.
+
+ This replaces docutils's directives and roles dispatch mechanism for reST parser
+ by original one temporarily.
+ """
+
+ def __init__(self) -> None:
+ self.directive_func: Callable = lambda *args: (None, [])
+ self.roles_func: Callable = lambda *args: (None, [])
+
+ def __enter__(self) -> None:
+ self.enable()
+
+ def __exit__(
+ self, exc_type: type[Exception], exc_value: Exception, traceback: Any,
+ ) -> None:
+ self.disable()
+
+ def enable(self) -> None:
+ self.directive_func = directives.directive
+ self.role_func = roles.role
+
+ directives.directive = self.directive
+ roles.role = self.role
+
+ def disable(self) -> None:
+ directives.directive = self.directive_func
+ roles.role = self.role_func
+
+ def directive(self,
+ directive_name: str, language_module: ModuleType, document: nodes.document,
+ ) -> tuple[type[Directive] | None, list[system_message]]:
+ return self.directive_func(directive_name, language_module, document)
+
+ def role(
+ self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter,
+ ) -> tuple[RoleFunction, list[system_message]]:
+ return self.role_func(role_name, language_module, # type: ignore[return-value]
+ lineno, reporter)
+
+
+class ElementLookupError(Exception):
+ pass
+
+
+class sphinx_domains(CustomReSTDispatcher):
+ """Monkey-patch directive and role dispatch, so that domain-specific
+ markup takes precedence.
+ """
+ def __init__(self, env: BuildEnvironment) -> None:
+ self.env = env
+ super().__init__()
+
+ def lookup_domain_element(self, type: str, name: str) -> Any:
+ """Lookup a markup element (directive or role), given its name which can
+ be a full name (with domain).
+ """
+ name = name.lower()
+ # explicit domain given?
+ if ':' in name:
+ domain_name, name = name.split(':', 1)
+ if domain_name in self.env.domains:
+ domain = self.env.get_domain(domain_name)
+ element = getattr(domain, type)(name)
+ if element is not None:
+ return element, []
+ else:
+ logger.warning(_('unknown directive or role name: %s:%s'), domain_name, name)
+ # else look in the default domain
+ else:
+ def_domain = self.env.temp_data.get('default_domain')
+ if def_domain is not None:
+ element = getattr(def_domain, type)(name)
+ if element is not None:
+ return element, []
+
+ # always look in the std domain
+ element = getattr(self.env.get_domain('std'), type)(name)
+ if element is not None:
+ return element, []
+
+ raise ElementLookupError
+
+ def directive(self,
+ directive_name: str, language_module: ModuleType, document: nodes.document,
+ ) -> tuple[type[Directive] | None, list[system_message]]:
+ try:
+ return self.lookup_domain_element('directive', directive_name)
+ except ElementLookupError:
+ return super().directive(directive_name, language_module, document)
+
+ def role(
+ self, role_name: str, language_module: ModuleType, lineno: int, reporter: Reporter,
+ ) -> tuple[RoleFunction, list[system_message]]:
+ try:
+ return self.lookup_domain_element('role', role_name)
+ except ElementLookupError:
+ return super().role(role_name, language_module, lineno, reporter)
+
+
+class WarningStream:
+ def write(self, text: str) -> None:
+ matched = report_re.search(text)
+ if not matched:
+ logger.warning(text.rstrip("\r\n"))
+ else:
+ location, type, level = matched.groups()
+ message = report_re.sub('', text).rstrip()
+ logger.log(type, message, location=location)
+
+
+class LoggingReporter(Reporter):
+ @classmethod
+ def from_reporter(cls, reporter: Reporter) -> LoggingReporter:
+ """Create an instance of LoggingReporter from other reporter object."""
+ return cls(reporter.source, reporter.report_level, reporter.halt_level,
+ reporter.debug_flag, reporter.error_handler)
+
+ def __init__(self, source: str, report_level: int = Reporter.WARNING_LEVEL,
+ halt_level: int = Reporter.SEVERE_LEVEL, debug: bool = False,
+ error_handler: str = 'backslashreplace') -> None:
+ stream = cast(IO, WarningStream())
+ super().__init__(source, report_level, halt_level,
+ stream, debug, error_handler=error_handler)
+
+
+class NullReporter(Reporter):
+ """A dummy reporter; write nothing."""
+
+ def __init__(self) -> None:
+ super().__init__('', 999, 4)
+
+
+@contextmanager
+def switch_source_input(state: State, content: StringList) -> Generator[None, None, None]:
+ """Switch current source input of state temporarily."""
+ try:
+ # remember the original ``get_source_and_line()`` method
+ gsal = state.memo.reporter.get_source_and_line # type: ignore[attr-defined]
+
+ # replace it by new one
+ state_machine = StateMachine([], None) # type: ignore[arg-type]
+ state_machine.input_lines = content
+ state.memo.reporter.get_source_and_line = state_machine.get_source_and_line # type: ignore[attr-defined] # noqa: E501
+
+ yield
+ finally:
+ # restore the method
+ state.memo.reporter.get_source_and_line = gsal # type: ignore[attr-defined]
+
+
+class SphinxFileOutput(FileOutput):
+ """Better FileOutput class for Sphinx."""
+
+ def __init__(self, **kwargs: Any) -> None:
+ self.overwrite_if_changed = kwargs.pop('overwrite_if_changed', False)
+ kwargs.setdefault('encoding', 'utf-8')
+ super().__init__(**kwargs)
+
+ def write(self, data: str) -> str:
+ if (self.destination_path and self.autoclose and 'b' not in self.mode and
+ self.overwrite_if_changed and os.path.exists(self.destination_path)):
+ with open(self.destination_path, encoding=self.encoding) as f:
+ # skip writing: content not changed
+ if f.read() == data:
+ return data
+
+ return super().write(data)
+
+
+class SphinxDirective(Directive):
+ """A base class for Sphinx directives.
+
+ This class provides helper methods for Sphinx directives.
+
+ .. note:: The subclasses of this class might not work with docutils.
+ This class is strongly coupled with Sphinx.
+ """
+
+ @property
+ def env(self) -> BuildEnvironment:
+ """Reference to the :class:`.BuildEnvironment` object."""
+ return self.state.document.settings.env
+
+ @property
+ def config(self) -> Config:
+ """Reference to the :class:`.Config` object."""
+ return self.env.config
+
+ def get_source_info(self) -> tuple[str, int]:
+ """Get source and line number."""
+ return self.state_machine.get_source_and_line(self.lineno)
+
+ def set_source_info(self, node: Node) -> None:
+ """Set source and line number to the node."""
+ node.source, node.line = self.get_source_info()
+
+ def get_location(self) -> str:
+ """Get current location info for logging."""
+ return ':'.join(str(s) for s in self.get_source_info())
+
+
+class SphinxRole:
+ """A base class for Sphinx roles.
+
+ This class provides helper methods for Sphinx roles.
+
+ .. note:: The subclasses of this class might not work with docutils.
+ This class is strongly coupled with Sphinx.
+ """
+ name: str #: The role name actually used in the document.
+ rawtext: str #: A string containing the entire interpreted text input.
+ text: str #: The interpreted text content.
+ lineno: int #: The line number where the interpreted text begins.
+ inliner: Inliner #: The ``docutils.parsers.rst.states.Inliner`` object.
+ #: A dictionary of directive options for customisation
+ #: (from the "role" directive).
+ options: dict[str, Any]
+ #: A list of strings, the directive content for customisation
+ #: (from the "role" directive).
+ content: Sequence[str]
+
+ def __call__(self, name: str, rawtext: str, text: str, lineno: int,
+ inliner: Inliner, options: dict | None = None, content: Sequence[str] = (),
+ ) -> tuple[list[Node], list[system_message]]:
+ self.rawtext = rawtext
+ self.text = unescape(text)
+ self.lineno = lineno
+ self.inliner = inliner
+ self.options = options if options is not None else {}
+ self.content = content
+
+ # guess role type
+ if name:
+ self.name = name.lower()
+ else:
+ self.name = self.env.temp_data.get('default_role', '')
+ if not self.name:
+ self.name = self.env.config.default_role
+ if not self.name:
+ msg = 'cannot determine default role!'
+ raise SphinxError(msg)
+
+ return self.run()
+
+ def run(self) -> tuple[list[Node], list[system_message]]:
+ raise NotImplementedError
+
+ @property
+ def env(self) -> BuildEnvironment:
+ """Reference to the :class:`.BuildEnvironment` object."""
+ return self.inliner.document.settings.env
+
+ @property
+ def config(self) -> Config:
+ """Reference to the :class:`.Config` object."""
+ return self.env.config
+
+ def get_source_info(self, lineno: int | None = None) -> tuple[str, int]:
+ if lineno is None:
+ lineno = self.lineno
+ return self.inliner.reporter.get_source_and_line(lineno) # type: ignore[attr-defined]
+
+ def set_source_info(self, node: Node, lineno: int | None = None) -> None:
+ node.source, node.line = self.get_source_info(lineno)
+
+ def get_location(self) -> str:
+ """Get current location info for logging."""
+ return ':'.join(str(s) for s in self.get_source_info())
+
+
+class ReferenceRole(SphinxRole):
+ """A base class for reference roles.
+
+ The reference roles can accept ``link title <target>`` style as a text for
+ the role. The parsed result; link title and target will be stored to
+ ``self.title`` and ``self.target``.
+ """
+ has_explicit_title: bool #: A boolean indicates the role has explicit title or not.
+ disabled: bool #: A boolean indicates the reference is disabled.
+ title: str #: The link title for the interpreted text.
+ target: str #: The link target for the interpreted text.
+
+ # \x00 means the "<" was backslash-escaped
+ explicit_title_re = re.compile(r'^(.+?)\s*(?<!\x00)<(.*?)>$', re.DOTALL)
+
+ def __call__(self, name: str, rawtext: str, text: str, lineno: int,
+ inliner: Inliner, options: dict | None = None, content: Sequence[str] = (),
+ ) -> tuple[list[Node], list[system_message]]:
+ if options is None:
+ options = {}
+
+ # if the first character is a bang, don't cross-reference at all
+ self.disabled = text.startswith('!')
+
+ matched = self.explicit_title_re.match(text)
+ if matched:
+ self.has_explicit_title = True
+ self.title = unescape(matched.group(1))
+ self.target = unescape(matched.group(2))
+ else:
+ self.has_explicit_title = False
+ self.title = unescape(text)
+ self.target = unescape(text)
+
+ return super().__call__(name, rawtext, text, lineno, inliner, options, content)
+
+
+class SphinxTranslator(nodes.NodeVisitor):
+ """A base class for Sphinx translators.
+
+ This class adds a support for visitor/departure method for super node class
+ if visitor/departure method for node class is not found.
+
+ It also provides helper methods for Sphinx translators.
+
+ .. note:: The subclasses of this class might not work with docutils.
+ This class is strongly coupled with Sphinx.
+ """
+
+ def __init__(self, document: nodes.document, builder: Builder) -> None:
+ super().__init__(document)
+ self.builder = builder
+ self.config = builder.config
+ self.settings = document.settings
+
+ def dispatch_visit(self, node: Node) -> None:
+ """
+ Dispatch node to appropriate visitor method.
+ The priority of visitor method is:
+
+ 1. ``self.visit_{node_class}()``
+ 2. ``self.visit_{super_node_class}()``
+ 3. ``self.unknown_visit()``
+ """
+ for node_class in node.__class__.__mro__:
+ method = getattr(self, 'visit_%s' % (node_class.__name__), None)
+ if method:
+ method(node)
+ break
+ else:
+ super().dispatch_visit(node)
+
+ def dispatch_departure(self, node: Node) -> None:
+ """
+ Dispatch node to appropriate departure method.
+ The priority of departure method is:
+
+ 1. ``self.depart_{node_class}()``
+ 2. ``self.depart_{super_node_class}()``
+ 3. ``self.unknown_departure()``
+ """
+ for node_class in node.__class__.__mro__:
+ method = getattr(self, 'depart_%s' % (node_class.__name__), None)
+ if method:
+ method(node)
+ break
+ else:
+ super().dispatch_departure(node)
+
+ def unknown_visit(self, node: Node) -> None:
+ logger.warning(__('unknown node type: %r'), node, location=node)
+
+
+# cache a vanilla instance of nodes.document
+# Used in new_document() function
+__document_cache__: tuple[Values, Reporter]
+
+
+def new_document(source_path: str, settings: Any = None) -> nodes.document:
+ """Return a new empty document object. This is an alternative of docutils'.
+
+ This is a simple wrapper for ``docutils.utils.new_document()``. It
+ caches the result of docutils' and use it on second call for instantiation.
+ This makes an instantiation of document nodes much faster.
+ """
+ global __document_cache__
+ try:
+ cached_settings, reporter = __document_cache__
+ except NameError:
+ doc = docutils.utils.new_document(source_path)
+ __document_cache__ = cached_settings, reporter = doc.settings, doc.reporter
+
+ if settings is None:
+ # Make a copy of the cached settings to accelerate instantiation
+ settings = copy(cached_settings)
+
+ # Create a new instance of nodes.document using cached reporter
+ from sphinx import addnodes
+ document = addnodes.document(settings, reporter, source=source_path)
+ document.note_source(source_path, -1)
+ return document
diff --git a/sphinx/util/exceptions.py b/sphinx/util/exceptions.py
new file mode 100644
index 0000000..9e25695
--- /dev/null
+++ b/sphinx/util/exceptions.py
@@ -0,0 +1,67 @@
+from __future__ import annotations
+
+import sys
+import traceback
+from tempfile import NamedTemporaryFile
+from typing import TYPE_CHECKING
+
+from sphinx.errors import SphinxParallelError
+from sphinx.util.console import strip_colors
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+
+def save_traceback(app: Sphinx | None, exc: BaseException) -> str:
+ """Save the given exception's traceback in a temporary file."""
+ import platform
+
+ import docutils
+ import jinja2
+ import pygments
+
+ import sphinx
+
+ if isinstance(exc, SphinxParallelError):
+ exc_format = '(Error in parallel process)\n' + exc.traceback
+ else:
+ exc_format = traceback.format_exc()
+
+ if app is None:
+ last_msgs = exts_list = ''
+ else:
+ extensions = app.extensions.values()
+ last_msgs = '\n'.join(f'# {strip_colors(s).strip()}' for s in app.messagelog)
+ exts_list = '\n'.join(f'# {ext.name} ({ext.version})' for ext in extensions
+ if ext.version != 'builtin')
+
+ with NamedTemporaryFile('w', suffix='.log', prefix='sphinx-err-', delete=False) as f:
+ f.write(f"""\
+# Platform: {sys.platform}; ({platform.platform()})
+# Sphinx version: {sphinx.__display_version__}
+# Python version: {platform.python_version()} ({platform.python_implementation()})
+# Docutils version: {docutils.__version__}
+# Jinja2 version: {jinja2.__version__}
+# Pygments version: {pygments.__version__}
+
+# Last messages:
+{last_msgs}
+
+# Loaded extensions:
+{exts_list}
+
+# Traceback:
+{exc_format}
+""")
+ return f.name
+
+
+def format_exception_cut_frames(x: int = 1) -> str:
+ """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: list[str] = []
+ tbres = traceback.format_tb(tb)
+ res += tbres[-x:]
+ res += traceback.format_exception_only(typ, val)
+ return ''.join(res)
diff --git a/sphinx/util/fileutil.py b/sphinx/util/fileutil.py
new file mode 100644
index 0000000..316ec39
--- /dev/null
+++ b/sphinx/util/fileutil.py
@@ -0,0 +1,100 @@
+"""File utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import os
+import posixpath
+from typing import TYPE_CHECKING, Callable
+
+from docutils.utils import relative_path
+
+from sphinx.util.osutil import copyfile, ensuredir
+
+if TYPE_CHECKING:
+ from sphinx.util.template import BaseRenderer
+ from sphinx.util.typing import PathMatcher
+
+
+def copy_asset_file(source: str | os.PathLike[str], destination: str | os.PathLike[str],
+ context: dict | None = None,
+ renderer: BaseRenderer | None = None) -> None:
+ """Copy an asset file to destination.
+
+ On copying, it expands the template variables if context argument is given and
+ the asset is a template file.
+
+ :param source: The path to source file
+ :param destination: The path to destination file or directory
+ :param context: The template variables. If not given, template files are simply copied
+ :param renderer: The template engine. If not given, SphinxRenderer is used by default
+ """
+ if not os.path.exists(source):
+ return
+
+ if os.path.isdir(destination):
+ # Use source filename if destination points a directory
+ destination = os.path.join(destination, os.path.basename(source))
+ else:
+ destination = str(destination)
+
+ if os.path.basename(source).endswith(('_t', '_T')) and context is not None:
+ if renderer is None:
+ from sphinx.util.template import SphinxRenderer
+ renderer = SphinxRenderer()
+
+ with open(source, encoding='utf-8') as fsrc:
+ if destination.endswith(('_t', '_T')):
+ destination = destination[:-2]
+ with open(destination, 'w', encoding='utf-8') as fdst:
+ fdst.write(renderer.render_string(fsrc.read(), context))
+ else:
+ copyfile(source, destination)
+
+
+def copy_asset(source: str | os.PathLike[str], destination: str | os.PathLike[str],
+ excluded: PathMatcher = lambda path: False,
+ context: dict | None = None, renderer: BaseRenderer | None = None,
+ onerror: Callable[[str, Exception], None] | None = None) -> None:
+ """Copy asset files to destination recursively.
+
+ On copying, it expands the template variables if context argument is given and
+ the asset is a template file.
+
+ :param source: The path to source file or directory
+ :param destination: The path to destination directory
+ :param excluded: The matcher to determine the given path should be copied or not
+ :param context: The template variables. If not given, template files are simply copied
+ :param renderer: The template engine. If not given, SphinxRenderer is used by default
+ :param onerror: The error handler.
+ """
+ if not os.path.exists(source):
+ return
+
+ if renderer is None:
+ from sphinx.util.template import SphinxRenderer
+ renderer = SphinxRenderer()
+
+ ensuredir(destination)
+ if os.path.isfile(source):
+ copy_asset_file(source, destination, context, renderer)
+ return
+
+ for root, dirs, files in os.walk(source, followlinks=True):
+ reldir = relative_path(source, root) # type: ignore[arg-type]
+ for dir in dirs[:]:
+ if excluded(posixpath.join(reldir, dir)):
+ dirs.remove(dir)
+ else:
+ ensuredir(posixpath.join(destination, reldir, dir))
+
+ for filename in files:
+ if not excluded(posixpath.join(reldir, filename)):
+ try:
+ copy_asset_file(posixpath.join(root, filename),
+ posixpath.join(destination, reldir),
+ context, renderer)
+ except Exception as exc:
+ if onerror:
+ onerror(posixpath.join(root, filename), exc)
+ else:
+ raise
diff --git a/sphinx/util/http_date.py b/sphinx/util/http_date.py
new file mode 100644
index 0000000..8e245cb
--- /dev/null
+++ b/sphinx/util/http_date.py
@@ -0,0 +1,39 @@
+"""Convert times to and from HTTP-date serialisations.
+
+Reference: https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1
+"""
+
+import time
+import warnings
+from email.utils import formatdate, parsedate_tz
+
+from sphinx.deprecation import RemovedInSphinx90Warning
+
+_GMT_OFFSET = float(time.localtime().tm_gmtoff)
+
+
+def epoch_to_rfc1123(epoch: float) -> str:
+ """Return HTTP-date string from epoch offset."""
+ return formatdate(epoch, usegmt=True)
+
+
+def rfc1123_to_epoch(rfc1123: str) -> float:
+ """Return epoch offset from HTTP-date string."""
+ t = parsedate_tz(rfc1123)
+ if t is None:
+ raise ValueError
+ if not rfc1123.endswith(" GMT"):
+ warnings.warn(
+ "HTTP-date string does not meet RFC 7231 requirements "
+ f"(must end with 'GMT'): {rfc1123!r}",
+ RemovedInSphinx90Warning, stacklevel=3,
+ )
+ epoch_secs = time.mktime(time.struct_time(t[:9])) + _GMT_OFFSET
+ if (gmt_offset := t[9]) != 0:
+ warnings.warn(
+ "HTTP-date string does not meet RFC 7231 requirements "
+ f"(must be GMT time): {rfc1123!r}",
+ RemovedInSphinx90Warning, stacklevel=3,
+ )
+ return epoch_secs - (gmt_offset or 0)
+ return epoch_secs
diff --git a/sphinx/util/i18n.py b/sphinx/util/i18n.py
new file mode 100644
index 0000000..b820884
--- /dev/null
+++ b/sphinx/util/i18n.py
@@ -0,0 +1,253 @@
+"""Builder superclass for all builders."""
+
+from __future__ import annotations
+
+import os
+import re
+from datetime import datetime, timezone
+from os import path
+from typing import TYPE_CHECKING, Callable, NamedTuple
+
+import babel.dates
+from babel.messages.mofile import write_mo
+from babel.messages.pofile import read_po
+
+from sphinx.errors import SphinxError
+from sphinx.locale import __
+from sphinx.util import logging
+from sphinx.util.osutil import SEP, canon_path, relpath
+
+if TYPE_CHECKING:
+ from collections.abc import Generator
+
+ from sphinx.environment import BuildEnvironment
+
+
+logger = logging.getLogger(__name__)
+
+
+class LocaleFileInfoBase(NamedTuple):
+ base_dir: str
+ domain: str
+ charset: str
+
+
+class CatalogInfo(LocaleFileInfoBase):
+
+ @property
+ def po_file(self) -> str:
+ return self.domain + '.po'
+
+ @property
+ def mo_file(self) -> str:
+ return self.domain + '.mo'
+
+ @property
+ def po_path(self) -> str:
+ return path.join(self.base_dir, self.po_file)
+
+ @property
+ def mo_path(self) -> str:
+ return path.join(self.base_dir, self.mo_file)
+
+ def is_outdated(self) -> bool:
+ return (
+ not path.exists(self.mo_path) or
+ path.getmtime(self.mo_path) < path.getmtime(self.po_path))
+
+ def write_mo(self, locale: str, use_fuzzy: bool = False) -> None:
+ with open(self.po_path, encoding=self.charset) as file_po:
+ try:
+ po = read_po(file_po, locale)
+ except Exception as exc:
+ logger.warning(__('reading error: %s, %s'), self.po_path, exc)
+ return
+
+ with open(self.mo_path, 'wb') as file_mo:
+ try:
+ write_mo(file_mo, po, use_fuzzy)
+ except Exception as exc:
+ logger.warning(__('writing error: %s, %s'), self.mo_path, exc)
+
+
+class CatalogRepository:
+ """A repository for message catalogs."""
+
+ def __init__(self, basedir: str | os.PathLike[str], locale_dirs: list[str],
+ language: str, encoding: str) -> None:
+ self.basedir = basedir
+ self._locale_dirs = locale_dirs
+ self.language = language
+ self.encoding = encoding
+
+ @property
+ def locale_dirs(self) -> Generator[str, None, None]:
+ if not self.language:
+ return
+
+ for locale_dir in self._locale_dirs:
+ locale_dir = path.join(self.basedir, locale_dir)
+ locale_path = path.join(locale_dir, self.language, 'LC_MESSAGES')
+ if path.exists(locale_path):
+ yield locale_dir
+ else:
+ logger.verbose(__('locale_dir %s does not exist'), locale_path)
+
+ @property
+ def pofiles(self) -> Generator[tuple[str, str], None, None]:
+ for locale_dir in self.locale_dirs:
+ basedir = path.join(locale_dir, self.language, 'LC_MESSAGES')
+ for root, dirnames, filenames in os.walk(basedir):
+ # skip dot-directories
+ for dirname in dirnames:
+ if dirname.startswith('.'):
+ dirnames.remove(dirname)
+
+ for filename in filenames:
+ if filename.endswith('.po'):
+ fullpath = path.join(root, filename)
+ yield basedir, relpath(fullpath, basedir)
+
+ @property
+ def catalogs(self) -> Generator[CatalogInfo, None, None]:
+ for basedir, filename in self.pofiles:
+ domain = canon_path(path.splitext(filename)[0])
+ yield CatalogInfo(basedir, domain, self.encoding)
+
+
+def docname_to_domain(docname: str, compaction: bool | str) -> str:
+ """Convert docname to domain for catalogs."""
+ if isinstance(compaction, str):
+ return compaction
+ if compaction:
+ return docname.split(SEP, 1)[0]
+ else:
+ return docname
+
+
+# date_format mappings: ustrftime() to babel.dates.format_datetime()
+date_format_mappings = {
+ '%a': 'EEE', # Weekday as locale’s abbreviated name.
+ '%A': 'EEEE', # Weekday as locale’s full name.
+ '%b': 'MMM', # Month as locale’s abbreviated name.
+ '%B': 'MMMM', # Month as locale’s full name.
+ '%c': 'medium', # Locale’s appropriate date and time representation.
+ '%-d': 'd', # Day of the month as a decimal number.
+ '%d': 'dd', # Day of the month as a zero-padded decimal number.
+ '%-H': 'H', # Hour (24-hour clock) as a decimal number [0,23].
+ '%H': 'HH', # Hour (24-hour clock) as a zero-padded decimal number [00,23].
+ '%-I': 'h', # Hour (12-hour clock) as a decimal number [1,12].
+ '%I': 'hh', # Hour (12-hour clock) as a zero-padded decimal number [01,12].
+ '%-j': 'D', # Day of the year as a decimal number.
+ '%j': 'DDD', # Day of the year as a zero-padded decimal number.
+ '%-m': 'M', # Month as a decimal number.
+ '%m': 'MM', # Month as a zero-padded decimal number.
+ '%-M': 'm', # Minute as a decimal number [0,59].
+ '%M': 'mm', # Minute as a zero-padded decimal number [00,59].
+ '%p': 'a', # Locale’s equivalent of either AM or PM.
+ '%-S': 's', # Second as a decimal number.
+ '%S': 'ss', # Second as a zero-padded decimal number.
+ '%U': 'WW', # Week number of the year (Sunday as the first day of the week)
+ # as a zero padded decimal number. All days in a new year preceding
+ # the first Sunday are considered to be in week 0.
+ '%w': 'e', # Weekday as a decimal number, where 0 is Sunday and 6 is Saturday.
+ '%-W': 'W', # Week number of the year (Monday as the first day of the week)
+ # as a decimal number. All days in a new year preceding the first
+ # Monday are considered to be in week 0.
+ '%W': 'WW', # Week number of the year (Monday as the first day of the week)
+ # as a zero-padded decimal number.
+ '%x': 'medium', # Locale’s appropriate date representation.
+ '%X': 'medium', # Locale’s appropriate time representation.
+ '%y': 'YY', # Year without century as a zero-padded decimal number.
+ '%Y': 'yyyy', # Year with century as a decimal number.
+ '%Z': 'zzz', # Time zone name (no characters if no time zone exists).
+ '%z': 'ZZZ', # UTC offset in the form ±HHMM[SS[.ffffff]]
+ # (empty string if the object is naive).
+ '%%': '%',
+}
+
+date_format_re = re.compile('(%s)' % '|'.join(date_format_mappings))
+
+
+def babel_format_date(date: datetime, format: str, locale: str,
+ formatter: Callable = babel.dates.format_date) -> str:
+ # Check if we have the tzinfo attribute. If not we cannot do any time
+ # related formats.
+ if not hasattr(date, 'tzinfo'):
+ formatter = babel.dates.format_date
+
+ try:
+ return formatter(date, format, locale=locale)
+ except (ValueError, babel.core.UnknownLocaleError):
+ # fallback to English
+ return formatter(date, format, locale='en')
+ except AttributeError:
+ logger.warning(__('Invalid date format. Quote the string by single quote '
+ 'if you want to output it directly: %s'), format)
+ return format
+
+
+def format_date(
+ format: str, *, date: datetime | None = None, language: str,
+) -> str:
+ if date is None:
+ # If time is not specified, try to use $SOURCE_DATE_EPOCH variable
+ # See https://wiki.debian.org/ReproducibleBuilds/TimestampsProposal
+ source_date_epoch = os.getenv('SOURCE_DATE_EPOCH')
+ if source_date_epoch is not None:
+ date = datetime.fromtimestamp(float(source_date_epoch), tz=timezone.utc)
+ else:
+ date = datetime.now(tz=timezone.utc).astimezone()
+
+ result = []
+ tokens = date_format_re.split(format)
+ for token in tokens:
+ if token in date_format_mappings:
+ babel_format = date_format_mappings.get(token, '')
+
+ # Check if we have to use a different babel formatter then
+ # format_datetime, because we only want to format a date
+ # or a time.
+ if token == '%x':
+ function = babel.dates.format_date
+ elif token == '%X':
+ function = babel.dates.format_time
+ else:
+ function = babel.dates.format_datetime
+
+ result.append(babel_format_date(date, babel_format, locale=language,
+ formatter=function))
+ else:
+ result.append(token)
+
+ return "".join(result)
+
+
+def get_image_filename_for_language(
+ filename: str | os.PathLike[str],
+ env: BuildEnvironment,
+) -> str:
+ root, ext = path.splitext(filename)
+ dirname = path.dirname(root)
+ docpath = path.dirname(env.docname)
+ try:
+ return env.config.figure_language_filename.format(
+ root=root,
+ ext=ext,
+ path=dirname and dirname + SEP,
+ basename=path.basename(root),
+ docpath=docpath and docpath + SEP,
+ language=env.config.language,
+ )
+ except KeyError as exc:
+ msg = f'Invalid figure_language_filename: {exc!r}'
+ raise SphinxError(msg) from exc
+
+
+def search_image_for_language(filename: str, env: BuildEnvironment) -> str:
+ translated = get_image_filename_for_language(filename, env)
+ _, abspath = env.relfn2path(translated)
+ if path.exists(abspath):
+ return translated
+ else:
+ return filename
diff --git a/sphinx/util/images.py b/sphinx/util/images.py
new file mode 100644
index 0000000..ac0e7f4
--- /dev/null
+++ b/sphinx/util/images.py
@@ -0,0 +1,146 @@
+"""Image utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import base64
+from os import path
+from typing import TYPE_CHECKING, NamedTuple, overload
+
+import imagesize
+
+if TYPE_CHECKING:
+ from os import PathLike
+
+try:
+ from PIL import Image
+except ImportError:
+ Image = None
+
+mime_suffixes = {
+ '.gif': 'image/gif',
+ '.jpg': 'image/jpeg',
+ '.png': 'image/png',
+ '.pdf': 'application/pdf',
+ '.svg': 'image/svg+xml',
+ '.svgz': 'image/svg+xml',
+ '.ai': 'application/illustrator',
+}
+_suffix_from_mime = {v: k for k, v in reversed(mime_suffixes.items())}
+
+
+class DataURI(NamedTuple):
+ mimetype: str
+ charset: str
+ data: bytes
+
+
+def get_image_size(filename: str) -> tuple[int, int] | None:
+ try:
+ size = imagesize.get(filename)
+ if size[0] == -1:
+ size = None
+ elif isinstance(size[0], float) or isinstance(size[1], float):
+ size = (int(size[0]), int(size[1]))
+
+ if size is None and Image: # fallback to Pillow
+ with Image.open(filename) as im:
+ size = im.size
+
+ return size
+ except Exception:
+ return None
+
+
+@overload
+def guess_mimetype(filename: PathLike[str] | str, default: str) -> str:
+ ...
+
+
+@overload
+def guess_mimetype(filename: PathLike[str] | str, default: None = None) -> str | None:
+ ...
+
+
+def guess_mimetype(
+ filename: PathLike[str] | str = '',
+ default: str | None = None,
+) -> str | None:
+ ext = path.splitext(filename)[1].lower()
+ if ext in mime_suffixes:
+ return mime_suffixes[ext]
+ if path.exists(filename):
+ try:
+ imgtype = _image_type_from_file(filename)
+ except ValueError:
+ pass
+ else:
+ return 'image/' + imgtype
+ return default
+
+
+def get_image_extension(mimetype: str) -> str | None:
+ return _suffix_from_mime.get(mimetype)
+
+
+def parse_data_uri(uri: str) -> DataURI | None:
+ if not uri.startswith('data:'):
+ return None
+
+ # data:[<MIME-type>][;charset=<encoding>][;base64],<data>
+ mimetype = 'text/plain'
+ charset = 'US-ASCII'
+
+ properties, data = uri[5:].split(',', 1)
+ for prop in properties.split(';'):
+ if prop == 'base64':
+ pass # skip
+ elif prop.startswith('charset='):
+ charset = prop[8:]
+ elif prop:
+ mimetype = prop
+
+ image_data = base64.b64decode(data)
+ return DataURI(mimetype, charset, image_data)
+
+
+def _image_type_from_file(filename: PathLike[str] | str) -> str:
+ with open(filename, 'rb') as f:
+ header = f.read(32) # 32 bytes
+
+ # Bitmap
+ # https://en.wikipedia.org/wiki/BMP_file_format#Bitmap_file_header
+ if header.startswith(b'BM'):
+ return 'bmp'
+
+ # GIF
+ # https://en.wikipedia.org/wiki/GIF#File_format
+ if header.startswith((b'GIF87a', b'GIF89a')):
+ return 'gif'
+
+ # JPEG data
+ # https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format#File_format_structure
+ if header.startswith(b'\xFF\xD8'):
+ return 'jpeg'
+
+ # Portable Network Graphics
+ # https://en.wikipedia.org/wiki/PNG#File_header
+ if header.startswith(b'\x89PNG\r\n\x1A\n'):
+ return 'png'
+
+ # Scalable Vector Graphics
+ # https://svgwg.org/svg2-draft/struct.html
+ if b'<svg' in header.lower():
+ return 'svg+xml'
+
+ # TIFF
+ # https://en.wikipedia.org/wiki/TIFF#Byte_order
+ if header.startswith((b'MM', b'II')):
+ return 'tiff'
+
+ # WebP
+ # https://en.wikipedia.org/wiki/WebP#Technology
+ if header.startswith(b'RIFF') and header[8:12] == b'WEBP':
+ return 'webp'
+
+ msg = 'Could not detect image type!'
+ raise ValueError(msg)
diff --git a/sphinx/util/index_entries.py b/sphinx/util/index_entries.py
new file mode 100644
index 0000000..1004684
--- /dev/null
+++ b/sphinx/util/index_entries.py
@@ -0,0 +1,27 @@
+from __future__ import annotations
+
+
+def split_index_msg(entry_type: str, value: str) -> list[str]:
+ # new entry types must be listed in util/nodes.py!
+ if entry_type == 'single':
+ try:
+ return _split_into(2, 'single', value)
+ except ValueError:
+ return _split_into(1, 'single', value)
+ if entry_type == 'pair':
+ return _split_into(2, 'pair', value)
+ if entry_type == 'triple':
+ return _split_into(3, 'triple', value)
+ if entry_type in {'see', 'seealso'}:
+ return _split_into(2, 'see', value)
+ msg = f'invalid {entry_type} index entry {value!r}'
+ raise ValueError(msg)
+
+
+def _split_into(n: int, type: str, value: str) -> list[str]:
+ """Split an index entry into a given number of parts at semicolons."""
+ parts = [x.strip() for x in value.split(';', n - 1)]
+ if len(list(filter(None, parts))) < n:
+ msg = f'invalid {type} index entry {value!r}'
+ raise ValueError(msg)
+ return parts
diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py
new file mode 100644
index 0000000..7d7fbb8
--- /dev/null
+++ b/sphinx/util/inspect.py
@@ -0,0 +1,833 @@
+"""Helpers for inspecting Python modules."""
+
+from __future__ import annotations
+
+import ast
+import builtins
+import contextlib
+import enum
+import inspect
+import re
+import sys
+import types
+import typing
+from collections.abc import Mapping, Sequence
+from functools import cached_property, partial, partialmethod, singledispatchmethod
+from importlib import import_module
+from inspect import ( # noqa: F401
+ Parameter,
+ isasyncgenfunction,
+ isclass,
+ ismethod,
+ ismethoddescriptor,
+ ismodule,
+)
+from io import StringIO
+from types import (
+ ClassMethodDescriptorType,
+ MethodDescriptorType,
+ MethodType,
+ ModuleType,
+ WrapperDescriptorType,
+)
+from typing import Any, Callable, cast
+
+from sphinx.pycode.ast import unparse as ast_unparse
+from sphinx.util import logging
+from sphinx.util.typing import ForwardRef, stringify_annotation
+
+logger = logging.getLogger(__name__)
+
+memory_address_re = re.compile(r' at 0x[0-9a-f]{8,16}(?=>)', re.IGNORECASE)
+
+
+def unwrap(obj: Any) -> Any:
+ """Get an original object from wrapped object (wrapped functions)."""
+ if hasattr(obj, '__sphinx_mock__'):
+ # Skip unwrapping mock object to avoid RecursionError
+ return obj
+ try:
+ return inspect.unwrap(obj)
+ except ValueError:
+ # might be a mock object
+ return obj
+
+
+def unwrap_all(obj: Any, *, stop: Callable | None = None) -> Any:
+ """
+ Get an original object from wrapped object (unwrapping partials, wrapped
+ functions, and other decorators).
+ """
+ while True:
+ if stop and stop(obj):
+ return obj
+ if ispartial(obj):
+ obj = obj.func
+ elif inspect.isroutine(obj) and hasattr(obj, '__wrapped__'):
+ obj = obj.__wrapped__
+ elif isclassmethod(obj) or isstaticmethod(obj):
+ obj = obj.__func__
+ else:
+ return obj
+
+
+def getall(obj: Any) -> Sequence[str] | None:
+ """Get __all__ attribute of the module as dict.
+
+ Return None if given *obj* does not have __all__.
+ Raises ValueError if given *obj* have invalid __all__.
+ """
+ __all__ = safe_getattr(obj, '__all__', None)
+ if __all__ is None:
+ return None
+ if isinstance(__all__, (list, tuple)) and all(isinstance(e, str) for e in __all__):
+ return __all__
+ raise ValueError(__all__)
+
+
+def getannotations(obj: Any) -> Mapping[str, Any]:
+ """Get __annotations__ from given *obj* safely."""
+ __annotations__ = safe_getattr(obj, '__annotations__', None)
+ if isinstance(__annotations__, Mapping):
+ return __annotations__
+ else:
+ return {}
+
+
+def getglobals(obj: Any) -> Mapping[str, Any]:
+ """Get __globals__ from given *obj* safely."""
+ __globals__ = safe_getattr(obj, '__globals__', None)
+ if isinstance(__globals__, Mapping):
+ return __globals__
+ else:
+ return {}
+
+
+def getmro(obj: Any) -> tuple[type, ...]:
+ """Get __mro__ from given *obj* safely."""
+ __mro__ = safe_getattr(obj, '__mro__', None)
+ if isinstance(__mro__, tuple):
+ return __mro__
+ else:
+ return ()
+
+
+def getorigbases(obj: Any) -> tuple[Any, ...] | None:
+ """Get __orig_bases__ from *obj* safely."""
+ if not inspect.isclass(obj):
+ return None
+
+ # Get __orig_bases__ from obj.__dict__ to avoid accessing the parent's __orig_bases__.
+ # refs: https://github.com/sphinx-doc/sphinx/issues/9607
+ __dict__ = safe_getattr(obj, '__dict__', {})
+ __orig_bases__ = __dict__.get('__orig_bases__')
+ if isinstance(__orig_bases__, tuple) and len(__orig_bases__) > 0:
+ return __orig_bases__
+ else:
+ return None
+
+
+def getslots(obj: Any) -> dict[str, Any] | None:
+ """Get __slots__ attribute of the class as dict.
+
+ Return None if gienv *obj* does not have __slots__.
+ Raises TypeError if given *obj* is not a class.
+ Raises ValueError if given *obj* have invalid __slots__.
+ """
+ if not inspect.isclass(obj):
+ raise TypeError
+
+ __slots__ = safe_getattr(obj, '__slots__', None)
+ if __slots__ is None:
+ return None
+ elif isinstance(__slots__, dict):
+ return __slots__
+ elif isinstance(__slots__, str):
+ return {__slots__: None}
+ elif isinstance(__slots__, (list, tuple)):
+ return dict.fromkeys(__slots__)
+ else:
+ raise ValueError
+
+
+def isNewType(obj: Any) -> bool:
+ """Check the if object is a kind of NewType."""
+ if sys.version_info[:2] >= (3, 10):
+ return isinstance(obj, typing.NewType)
+ __module__ = safe_getattr(obj, '__module__', None)
+ __qualname__ = safe_getattr(obj, '__qualname__', None)
+ return __module__ == 'typing' and __qualname__ == 'NewType.<locals>.new_type'
+
+
+def isenumclass(x: Any) -> bool:
+ """Check if the object is subclass of enum."""
+ return inspect.isclass(x) and issubclass(x, enum.Enum)
+
+
+def isenumattribute(x: Any) -> bool:
+ """Check if the object is attribute of enum."""
+ return isinstance(x, enum.Enum)
+
+
+def unpartial(obj: Any) -> Any:
+ """Get an original object from partial object.
+
+ This returns given object itself if not partial.
+ """
+ while ispartial(obj):
+ obj = obj.func
+
+ return obj
+
+
+def ispartial(obj: Any) -> bool:
+ """Check if the object is partial."""
+ return isinstance(obj, (partial, partialmethod))
+
+
+def isclassmethod(obj: Any, cls: Any = None, name: str | None = None) -> bool:
+ """Check if the object is classmethod."""
+ if isinstance(obj, classmethod):
+ return True
+ if inspect.ismethod(obj) and obj.__self__ is not None and isclass(obj.__self__):
+ return True
+ if cls and name:
+ placeholder = object()
+ for basecls in getmro(cls):
+ meth = basecls.__dict__.get(name, placeholder)
+ if meth is not placeholder:
+ return isclassmethod(meth)
+
+ return False
+
+
+def isstaticmethod(obj: Any, cls: Any = None, name: str | None = None) -> bool:
+ """Check if the object is staticmethod."""
+ if isinstance(obj, staticmethod):
+ return True
+ if cls and name:
+ # trace __mro__ if the method is defined in parent class
+ #
+ # .. note:: This only works well with new style classes.
+ for basecls in getattr(cls, '__mro__', [cls]):
+ meth = basecls.__dict__.get(name)
+ if meth:
+ return isinstance(meth, staticmethod)
+ return False
+
+
+def isdescriptor(x: Any) -> bool:
+ """Check if the object is some kind of descriptor."""
+ return any(
+ callable(safe_getattr(x, item, None))
+ for item in ['__get__', '__set__', '__delete__']
+ )
+
+
+def isabstractmethod(obj: Any) -> bool:
+ """Check if the object is an abstractmethod."""
+ return safe_getattr(obj, '__isabstractmethod__', False) is True
+
+
+def isboundmethod(method: MethodType) -> bool:
+ """Check if the method is a bound method."""
+ return safe_getattr(method, '__self__', None) is not None
+
+
+def is_cython_function_or_method(obj: Any) -> bool:
+ """Check if the object is a function or method in cython."""
+ try:
+ return obj.__class__.__name__ == 'cython_function_or_method'
+ except AttributeError:
+ return False
+
+
+def isattributedescriptor(obj: Any) -> bool:
+ """Check if the object is an attribute like descriptor."""
+ if inspect.isdatadescriptor(obj):
+ # data descriptor is kind of attribute
+ return True
+ if isdescriptor(obj):
+ # non data descriptor
+ unwrapped = unwrap(obj)
+ if isfunction(unwrapped) or isbuiltin(unwrapped) or inspect.ismethod(unwrapped):
+ # attribute must not be either function, builtin and method
+ return False
+ if is_cython_function_or_method(unwrapped):
+ # attribute must not be either function and method (for cython)
+ return False
+ if inspect.isclass(unwrapped):
+ # attribute must not be a class
+ return False
+ if isinstance(unwrapped, (ClassMethodDescriptorType,
+ MethodDescriptorType,
+ WrapperDescriptorType)):
+ # attribute must not be a method descriptor
+ return False
+ if type(unwrapped).__name__ == "instancemethod":
+ # attribute must not be an instancemethod (C-API)
+ return False
+ return True
+ return False
+
+
+def is_singledispatch_function(obj: Any) -> bool:
+ """Check if the object is singledispatch function."""
+ return (inspect.isfunction(obj) and
+ hasattr(obj, 'dispatch') and
+ hasattr(obj, 'register') and
+ obj.dispatch.__module__ == 'functools')
+
+
+def is_singledispatch_method(obj: Any) -> bool:
+ """Check if the object is singledispatch method."""
+ return isinstance(obj, singledispatchmethod)
+
+
+def isfunction(obj: Any) -> bool:
+ """Check if the object is function."""
+ return inspect.isfunction(unpartial(obj))
+
+
+def isbuiltin(obj: Any) -> bool:
+ """Check if the object is function."""
+ return inspect.isbuiltin(unpartial(obj))
+
+
+def isroutine(obj: Any) -> bool:
+ """Check is any kind of function or method."""
+ return inspect.isroutine(unpartial(obj))
+
+
+def iscoroutinefunction(obj: Any) -> bool:
+ """Check if the object is coroutine-function."""
+ def iswrappedcoroutine(obj: Any) -> bool:
+ """Check if the object is wrapped coroutine-function."""
+ if isstaticmethod(obj) or isclassmethod(obj) or ispartial(obj):
+ # staticmethod, classmethod and partial method are not a wrapped coroutine-function
+ # Note: Since 3.10, staticmethod and classmethod becomes a kind of wrappers
+ return False
+ return hasattr(obj, '__wrapped__')
+
+ obj = unwrap_all(obj, stop=iswrappedcoroutine)
+ return inspect.iscoroutinefunction(obj)
+
+
+def isproperty(obj: Any) -> bool:
+ """Check if the object is property."""
+ return isinstance(obj, (property, cached_property))
+
+
+def isgenericalias(obj: Any) -> bool:
+ """Check if the object is GenericAlias."""
+ return isinstance(
+ obj, (types.GenericAlias, typing._BaseGenericAlias)) # type: ignore[attr-defined]
+
+
+def safe_getattr(obj: Any, name: str, *defargs: Any) -> Any:
+ """A getattr() that turns all exceptions into AttributeErrors."""
+ try:
+ return getattr(obj, name, *defargs)
+ except Exception as exc:
+ # sometimes accessing a property raises an exception (e.g.
+ # NotImplementedError), so let's try to read the attribute directly
+ try:
+ # In case the object does weird things with attribute access
+ # such that accessing `obj.__dict__` may raise an exception
+ return obj.__dict__[name]
+ except Exception:
+ pass
+
+ # this is a catch-all for all the weird things that some modules do
+ # with attribute access
+ if defargs:
+ return defargs[0]
+
+ raise AttributeError(name) from exc
+
+
+def object_description(obj: Any, *, _seen: frozenset = frozenset()) -> str:
+ """A repr() implementation that returns text safe to use in reST context.
+
+ Maintains a set of 'seen' object IDs to detect and avoid infinite recursion.
+ """
+ seen = _seen
+ if isinstance(obj, dict):
+ if id(obj) in seen:
+ return 'dict(...)'
+ seen |= {id(obj)}
+ try:
+ sorted_keys = sorted(obj)
+ except TypeError:
+ # Cannot sort dict keys, fall back to using descriptions as a sort key
+ sorted_keys = sorted(obj, key=lambda k: object_description(k, _seen=seen))
+
+ items = ((object_description(key, _seen=seen),
+ object_description(obj[key], _seen=seen)) for key in sorted_keys)
+ return '{%s}' % ', '.join(f'{key}: {value}' for (key, value) in items)
+ elif isinstance(obj, set):
+ if id(obj) in seen:
+ return 'set(...)'
+ seen |= {id(obj)}
+ try:
+ sorted_values = sorted(obj)
+ except TypeError:
+ # Cannot sort set values, fall back to using descriptions as a sort key
+ sorted_values = sorted(obj, key=lambda x: object_description(x, _seen=seen))
+ return '{%s}' % ', '.join(object_description(x, _seen=seen) for x in sorted_values)
+ elif isinstance(obj, frozenset):
+ if id(obj) in seen:
+ return 'frozenset(...)'
+ seen |= {id(obj)}
+ try:
+ sorted_values = sorted(obj)
+ except TypeError:
+ # Cannot sort frozenset values, fall back to using descriptions as a sort key
+ sorted_values = sorted(obj, key=lambda x: object_description(x, _seen=seen))
+ return 'frozenset({%s})' % ', '.join(object_description(x, _seen=seen)
+ for x in sorted_values)
+ elif isinstance(obj, enum.Enum):
+ return f'{obj.__class__.__name__}.{obj.name}'
+ elif isinstance(obj, tuple):
+ if id(obj) in seen:
+ return 'tuple(...)'
+ seen |= frozenset([id(obj)])
+ return '(%s%s)' % (
+ ', '.join(object_description(x, _seen=seen) for x in obj),
+ ',' * (len(obj) == 1),
+ )
+ elif isinstance(obj, list):
+ if id(obj) in seen:
+ return 'list(...)'
+ seen |= {id(obj)}
+ return '[%s]' % ', '.join(object_description(x, _seen=seen) for x in obj)
+
+ try:
+ s = repr(obj)
+ except Exception as exc:
+ raise ValueError from exc
+ # Strip non-deterministic memory addresses such as
+ # ``<__main__.A at 0x7f68cb685710>``
+ s = memory_address_re.sub('', s)
+ return s.replace('\n', ' ')
+
+
+def is_builtin_class_method(obj: Any, attr_name: str) -> bool:
+ """If attr_name is implemented at builtin class, return True.
+
+ >>> is_builtin_class_method(int, '__init__')
+ True
+
+ Why this function needed? CPython implements int.__init__ by Descriptor
+ but PyPy implements it by pure Python code.
+ """
+ try:
+ mro = getmro(obj)
+ cls = next(c for c in mro if attr_name in safe_getattr(c, '__dict__', {}))
+ except StopIteration:
+ return False
+
+ try:
+ name = safe_getattr(cls, '__name__')
+ except AttributeError:
+ return False
+
+ return getattr(builtins, name, None) is cls
+
+
+class DefaultValue:
+ """A simple wrapper for default value of the parameters of overload functions."""
+
+ def __init__(self, value: str) -> None:
+ self.value = value
+
+ def __eq__(self, other: object) -> bool:
+ return self.value == other
+
+ def __repr__(self) -> str:
+ return self.value
+
+
+class TypeAliasForwardRef:
+ """Pseudo typing class for autodoc_type_aliases.
+
+ This avoids the error on evaluating the type inside `get_type_hints()`.
+ """
+ def __init__(self, name: str) -> None:
+ self.name = name
+
+ def __call__(self) -> None:
+ # Dummy method to imitate special typing classes
+ pass
+
+ def __eq__(self, other: Any) -> bool:
+ return self.name == other
+
+ def __hash__(self) -> int:
+ return hash(self.name)
+
+ def __repr__(self) -> str:
+ return self.name
+
+
+class TypeAliasModule:
+ """Pseudo module class for autodoc_type_aliases."""
+
+ def __init__(self, modname: str, mapping: dict[str, str]) -> None:
+ self.__modname = modname
+ self.__mapping = mapping
+
+ self.__module: ModuleType | None = None
+
+ def __getattr__(self, name: str) -> Any:
+ fullname = '.'.join(filter(None, [self.__modname, name]))
+ if fullname in self.__mapping:
+ # exactly matched
+ return TypeAliasForwardRef(self.__mapping[fullname])
+ else:
+ prefix = fullname + '.'
+ nested = {k: v for k, v in self.__mapping.items() if k.startswith(prefix)}
+ if nested:
+ # sub modules or classes found
+ return TypeAliasModule(fullname, nested)
+ else:
+ # no sub modules or classes found.
+ try:
+ # return the real submodule if exists
+ return import_module(fullname)
+ except ImportError:
+ # return the real class
+ if self.__module is None:
+ self.__module = import_module(self.__modname)
+
+ return getattr(self.__module, name)
+
+
+class TypeAliasNamespace(dict[str, Any]):
+ """Pseudo namespace class for autodoc_type_aliases.
+
+ This enables to look up nested modules and classes like `mod1.mod2.Class`.
+ """
+
+ def __init__(self, mapping: dict[str, str]) -> None:
+ self.__mapping = mapping
+
+ def __getitem__(self, key: str) -> Any:
+ if key in self.__mapping:
+ # exactly matched
+ return TypeAliasForwardRef(self.__mapping[key])
+ else:
+ prefix = key + '.'
+ nested = {k: v for k, v in self.__mapping.items() if k.startswith(prefix)}
+ if nested:
+ # sub modules or classes found
+ return TypeAliasModule(key, nested)
+ else:
+ raise KeyError
+
+
+def _should_unwrap(subject: Callable) -> bool:
+ """Check the function should be unwrapped on getting signature."""
+ __globals__ = getglobals(subject)
+ if (__globals__.get('__name__') == 'contextlib' and
+ __globals__.get('__file__') == contextlib.__file__):
+ # contextmanger should be unwrapped
+ return True
+
+ return False
+
+
+def signature(subject: Callable, bound_method: bool = False, type_aliases: dict | None = None,
+ ) -> inspect.Signature:
+ """Return a Signature object for the given *subject*.
+
+ :param bound_method: Specify *subject* is a bound method or not
+ """
+ if type_aliases is None:
+ type_aliases = {}
+
+ try:
+ if _should_unwrap(subject):
+ signature = inspect.signature(subject)
+ else:
+ signature = inspect.signature(subject, follow_wrapped=True)
+ except ValueError:
+ # follow built-in wrappers up (ex. functools.lru_cache)
+ signature = inspect.signature(subject)
+ parameters = list(signature.parameters.values())
+ return_annotation = signature.return_annotation
+
+ try:
+ # Resolve annotations using ``get_type_hints()`` and type_aliases.
+ localns = TypeAliasNamespace(type_aliases)
+ annotations = typing.get_type_hints(subject, None, localns)
+ for i, param in enumerate(parameters):
+ if param.name in annotations:
+ annotation = annotations[param.name]
+ if isinstance(annotation, TypeAliasForwardRef):
+ annotation = annotation.name
+ parameters[i] = param.replace(annotation=annotation)
+ if 'return' in annotations:
+ if isinstance(annotations['return'], TypeAliasForwardRef):
+ return_annotation = annotations['return'].name
+ else:
+ return_annotation = annotations['return']
+ except Exception:
+ # ``get_type_hints()`` does not support some kind of objects like partial,
+ # ForwardRef and so on.
+ pass
+
+ if bound_method:
+ if inspect.ismethod(subject):
+ # ``inspect.signature()`` considers the subject is a bound method and removes
+ # first argument from signature. Therefore no skips are needed here.
+ pass
+ else:
+ if len(parameters) > 0:
+ parameters.pop(0)
+
+ # To allow to create signature object correctly for pure python functions,
+ # pass an internal parameter __validate_parameters__=False to Signature
+ #
+ # For example, this helps a function having a default value `inspect._empty`.
+ # refs: https://github.com/sphinx-doc/sphinx/issues/7935
+ return inspect.Signature(parameters, return_annotation=return_annotation,
+ __validate_parameters__=False)
+
+
+def evaluate_signature(sig: inspect.Signature, globalns: dict | None = None,
+ localns: dict | None = None,
+ ) -> inspect.Signature:
+ """Evaluate unresolved type annotations in a signature object."""
+ def evaluate_forwardref(ref: ForwardRef, globalns: dict, localns: dict) -> Any:
+ """Evaluate a forward reference."""
+ return ref._evaluate(globalns, localns, frozenset())
+
+ def evaluate(annotation: Any, globalns: dict, localns: dict) -> Any:
+ """Evaluate unresolved type annotation."""
+ try:
+ if isinstance(annotation, str):
+ ref = ForwardRef(annotation, True)
+ annotation = evaluate_forwardref(ref, globalns, localns)
+
+ if isinstance(annotation, ForwardRef):
+ annotation = evaluate_forwardref(ref, globalns, localns)
+ elif isinstance(annotation, str):
+ # might be a ForwardRef'ed annotation in overloaded functions
+ ref = ForwardRef(annotation, True)
+ annotation = evaluate_forwardref(ref, globalns, localns)
+ except (NameError, TypeError):
+ # failed to evaluate type. skipped.
+ pass
+
+ return annotation
+
+ if globalns is None:
+ globalns = {}
+ if localns is None:
+ localns = globalns
+
+ parameters = list(sig.parameters.values())
+ for i, param in enumerate(parameters):
+ if param.annotation:
+ annotation = evaluate(param.annotation, globalns, localns)
+ parameters[i] = param.replace(annotation=annotation)
+
+ return_annotation = sig.return_annotation
+ if return_annotation:
+ return_annotation = evaluate(return_annotation, globalns, localns)
+
+ return sig.replace(parameters=parameters, return_annotation=return_annotation)
+
+
+def stringify_signature(sig: inspect.Signature, show_annotation: bool = True,
+ show_return_annotation: bool = True,
+ unqualified_typehints: bool = False) -> str:
+ """Stringify a Signature object.
+
+ :param show_annotation: If enabled, show annotations on the signature
+ :param show_return_annotation: If enabled, show annotation of the return value
+ :param unqualified_typehints: If enabled, show annotations as unqualified
+ (ex. io.StringIO -> StringIO)
+ """
+ if unqualified_typehints:
+ mode = 'smart'
+ else:
+ mode = 'fully-qualified'
+
+ args = []
+ last_kind = None
+ for param in sig.parameters.values():
+ if param.kind != param.POSITIONAL_ONLY and last_kind == param.POSITIONAL_ONLY:
+ # PEP-570: Separator for Positional Only Parameter: /
+ args.append('/')
+ if param.kind == param.KEYWORD_ONLY and last_kind in (param.POSITIONAL_OR_KEYWORD,
+ param.POSITIONAL_ONLY,
+ None):
+ # PEP-3102: Separator for Keyword Only Parameter: *
+ args.append('*')
+
+ arg = StringIO()
+ if param.kind == param.VAR_POSITIONAL:
+ arg.write('*' + param.name)
+ elif param.kind == param.VAR_KEYWORD:
+ arg.write('**' + param.name)
+ else:
+ arg.write(param.name)
+
+ if show_annotation and param.annotation is not param.empty:
+ arg.write(': ')
+ arg.write(stringify_annotation(param.annotation, mode))
+ if param.default is not param.empty:
+ if show_annotation and param.annotation is not param.empty:
+ arg.write(' = ')
+ else:
+ arg.write('=')
+ arg.write(object_description(param.default))
+
+ args.append(arg.getvalue())
+ last_kind = param.kind
+
+ if last_kind == Parameter.POSITIONAL_ONLY:
+ # PEP-570: Separator for Positional Only Parameter: /
+ args.append('/')
+
+ concatenated_args = ', '.join(args)
+ if (sig.return_annotation is Parameter.empty or
+ show_annotation is False or
+ show_return_annotation is False):
+ return f'({concatenated_args})'
+ else:
+ annotation = stringify_annotation(sig.return_annotation, mode)
+ return f'({concatenated_args}) -> {annotation}'
+
+
+def signature_from_str(signature: str) -> inspect.Signature:
+ """Create a Signature object from string."""
+ code = 'def func' + signature + ': pass'
+ module = ast.parse(code)
+ function = cast(ast.FunctionDef, module.body[0])
+
+ return signature_from_ast(function, code)
+
+
+def signature_from_ast(node: ast.FunctionDef, code: str = '') -> inspect.Signature:
+ """Create a Signature object from AST *node*."""
+ args = node.args
+ defaults = list(args.defaults)
+ params = []
+ if hasattr(args, "posonlyargs"):
+ posonlyargs = len(args.posonlyargs)
+ positionals = posonlyargs + len(args.args)
+ else:
+ posonlyargs = 0
+ positionals = len(args.args)
+
+ for _ in range(len(defaults), positionals):
+ defaults.insert(0, Parameter.empty) # type: ignore[arg-type]
+
+ if hasattr(args, "posonlyargs"):
+ for i, arg in enumerate(args.posonlyargs):
+ if defaults[i] is Parameter.empty:
+ default = Parameter.empty
+ else:
+ default = DefaultValue(
+ ast_unparse(defaults[i], code)) # type: ignore[assignment]
+
+ annotation = ast_unparse(arg.annotation, code) or Parameter.empty
+ params.append(Parameter(arg.arg, Parameter.POSITIONAL_ONLY,
+ default=default, annotation=annotation))
+
+ for i, arg in enumerate(args.args):
+ if defaults[i + posonlyargs] is Parameter.empty:
+ default = Parameter.empty
+ else:
+ default = DefaultValue(
+ ast_unparse(defaults[i + posonlyargs], code), # type: ignore[assignment]
+ )
+
+ annotation = ast_unparse(arg.annotation, code) or Parameter.empty
+ params.append(Parameter(arg.arg, Parameter.POSITIONAL_OR_KEYWORD,
+ default=default, annotation=annotation))
+
+ if args.vararg:
+ annotation = ast_unparse(args.vararg.annotation, code) or Parameter.empty
+ params.append(Parameter(args.vararg.arg, Parameter.VAR_POSITIONAL,
+ annotation=annotation))
+
+ for i, arg in enumerate(args.kwonlyargs):
+ if args.kw_defaults[i] is None:
+ default = Parameter.empty
+ else:
+ default = DefaultValue(
+ ast_unparse(args.kw_defaults[i], code)) # type: ignore[arg-type,assignment]
+ annotation = ast_unparse(arg.annotation, code) or Parameter.empty
+ params.append(Parameter(arg.arg, Parameter.KEYWORD_ONLY, default=default,
+ annotation=annotation))
+
+ if args.kwarg:
+ annotation = ast_unparse(args.kwarg.annotation, code) or Parameter.empty
+ params.append(Parameter(args.kwarg.arg, Parameter.VAR_KEYWORD,
+ annotation=annotation))
+
+ return_annotation = ast_unparse(node.returns, code) or Parameter.empty
+
+ return inspect.Signature(params, return_annotation=return_annotation)
+
+
+def getdoc(
+ obj: Any,
+ attrgetter: Callable = safe_getattr,
+ allow_inherited: bool = False,
+ cls: Any = None,
+ name: str | None = None,
+) -> str | None:
+ """Get the docstring for the object.
+
+ This tries to obtain the docstring for some kind of objects additionally:
+
+ * partial functions
+ * inherited docstring
+ * inherited decorated methods
+ """
+ def getdoc_internal(obj: Any, attrgetter: Callable = safe_getattr) -> str | None:
+ doc = attrgetter(obj, '__doc__', None)
+ if isinstance(doc, str):
+ return doc
+ else:
+ return None
+
+ if cls and name and isclassmethod(obj, cls, name):
+ for basecls in getmro(cls):
+ meth = basecls.__dict__.get(name)
+ if meth and hasattr(meth, '__func__'):
+ doc: str | None = getdoc(meth.__func__)
+ if doc is not None or not allow_inherited:
+ return doc
+
+ doc = getdoc_internal(obj)
+ if ispartial(obj) and doc == obj.__class__.__doc__:
+ return getdoc(obj.func)
+ elif doc is None and allow_inherited:
+ if cls and name:
+ # Check a docstring of the attribute or method from super classes.
+ for basecls in getmro(cls):
+ meth = safe_getattr(basecls, name, None)
+ if meth is not None:
+ doc = getdoc_internal(meth)
+ if doc is not None:
+ break
+
+ if doc is None:
+ # retry using `inspect.getdoc()`
+ for basecls in getmro(cls):
+ meth = safe_getattr(basecls, name, None)
+ if meth is not None:
+ doc = inspect.getdoc(meth)
+ if doc is not None:
+ break
+
+ if doc is None:
+ doc = inspect.getdoc(obj)
+
+ return doc
diff --git a/sphinx/util/inventory.py b/sphinx/util/inventory.py
new file mode 100644
index 0000000..89f0070
--- /dev/null
+++ b/sphinx/util/inventory.py
@@ -0,0 +1,172 @@
+"""Inventory utility functions for Sphinx."""
+from __future__ import annotations
+
+import os
+import re
+import zlib
+from typing import IO, TYPE_CHECKING, Callable
+
+from sphinx.util import logging
+
+BUFSIZE = 16 * 1024
+logger = logging.getLogger(__name__)
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.typing import Inventory, InventoryItem
+
+
+class InventoryFileReader:
+ """A file reader for an inventory file.
+
+ This reader supports mixture of texts and compressed texts.
+ """
+
+ def __init__(self, stream: IO) -> None:
+ self.stream = stream
+ self.buffer = b''
+ self.eof = False
+
+ def read_buffer(self) -> None:
+ chunk = self.stream.read(BUFSIZE)
+ if chunk == b'':
+ self.eof = True
+ self.buffer += chunk
+
+ def readline(self) -> str:
+ pos = self.buffer.find(b'\n')
+ if pos != -1:
+ line = self.buffer[:pos].decode()
+ self.buffer = self.buffer[pos + 1:]
+ elif self.eof:
+ line = self.buffer.decode()
+ self.buffer = b''
+ else:
+ self.read_buffer()
+ line = self.readline()
+
+ return line
+
+ def readlines(self) -> Iterator[str]:
+ while not self.eof:
+ line = self.readline()
+ if line:
+ yield line
+
+ def read_compressed_chunks(self) -> Iterator[bytes]:
+ decompressor = zlib.decompressobj()
+ while not self.eof:
+ self.read_buffer()
+ yield decompressor.decompress(self.buffer)
+ self.buffer = b''
+ yield decompressor.flush()
+
+ def read_compressed_lines(self) -> Iterator[str]:
+ buf = b''
+ for chunk in self.read_compressed_chunks():
+ buf += chunk
+ pos = buf.find(b'\n')
+ while pos != -1:
+ yield buf[:pos].decode()
+ buf = buf[pos + 1:]
+ pos = buf.find(b'\n')
+
+
+class InventoryFile:
+ @classmethod
+ def load(cls, stream: IO, uri: str, joinfunc: Callable) -> Inventory:
+ reader = InventoryFileReader(stream)
+ line = reader.readline().rstrip()
+ if line == '# Sphinx inventory version 1':
+ return cls.load_v1(reader, uri, joinfunc)
+ elif line == '# Sphinx inventory version 2':
+ return cls.load_v2(reader, uri, joinfunc)
+ else:
+ raise ValueError('invalid inventory header: %s' % line)
+
+ @classmethod
+ def load_v1(cls, stream: InventoryFileReader, uri: str, join: Callable) -> Inventory:
+ invdata: Inventory = {}
+ projname = stream.readline().rstrip()[11:]
+ version = stream.readline().rstrip()[11:]
+ for line in stream.readlines():
+ name, type, location = line.rstrip().split(None, 2)
+ location = join(uri, location)
+ # version 1 did not add anchors to the location
+ if type == 'mod':
+ type = 'py:module'
+ location += '#module-' + name
+ else:
+ type = 'py:' + type
+ location += '#' + name
+ invdata.setdefault(type, {})[name] = (projname, version, location, '-')
+ return invdata
+
+ @classmethod
+ def load_v2(cls, stream: InventoryFileReader, uri: str, join: Callable) -> Inventory:
+ invdata: Inventory = {}
+ projname = stream.readline().rstrip()[11:]
+ version = stream.readline().rstrip()[11:]
+ line = stream.readline()
+ if 'zlib' not in line:
+ raise ValueError('invalid inventory header (not compressed): %s' % line)
+
+ for line in stream.read_compressed_lines():
+ # be careful to handle names with embedded spaces correctly
+ m = re.match(r'(.+?)\s+(\S+)\s+(-?\d+)\s+?(\S*)\s+(.*)',
+ line.rstrip(), flags=re.VERBOSE)
+ if not m:
+ continue
+ name, type, prio, location, dispname = m.groups()
+ if ':' not in type:
+ # wrong type value. type should be in the form of "{domain}:{objtype}"
+ #
+ # Note: To avoid the regex DoS, this is implemented in python (refs: #8175)
+ continue
+ if type == 'py:module' and type in invdata and name in invdata[type]:
+ # due to a bug in 1.1 and below,
+ # two inventory entries are created
+ # for Python modules, and the first
+ # one is correct
+ continue
+ if location.endswith('$'):
+ location = location[:-1] + name
+ location = join(uri, location)
+ inv_item: InventoryItem = projname, version, location, dispname
+ invdata.setdefault(type, {})[name] = inv_item
+ return invdata
+
+ @classmethod
+ def dump(cls, filename: str, env: BuildEnvironment, builder: Builder) -> None:
+ def escape(string: str) -> str:
+ return re.sub("\\s+", " ", string)
+
+ with open(os.path.join(filename), 'wb') as f:
+ # header
+ f.write(('# Sphinx inventory version 2\n'
+ '# Project: %s\n'
+ '# Version: %s\n'
+ '# The remainder of this file is compressed using zlib.\n' %
+ (escape(env.config.project),
+ escape(env.config.version))).encode())
+
+ # body
+ compressor = zlib.compressobj(9)
+ for domainname, domain in sorted(env.domains.items()):
+ for name, dispname, typ, docname, anchor, prio in \
+ sorted(domain.get_objects()):
+ if anchor.endswith(name):
+ # this can shorten the inventory by as much as 25%
+ anchor = anchor[:-len(name)] + '$'
+ uri = builder.get_target_uri(docname)
+ if anchor:
+ uri += '#' + anchor
+ if dispname == name:
+ dispname = '-'
+ entry = ('%s %s:%s %s %s %s\n' %
+ (name, domainname, typ, prio, uri, dispname))
+ f.write(compressor.compress(entry.encode()))
+ f.write(compressor.flush())
diff --git a/sphinx/util/logging.py b/sphinx/util/logging.py
new file mode 100644
index 0000000..429018a
--- /dev/null
+++ b/sphinx/util/logging.py
@@ -0,0 +1,602 @@
+"""Logging utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import logging
+import logging.handlers
+from collections import defaultdict
+from contextlib import contextmanager
+from typing import IO, TYPE_CHECKING, Any
+
+from docutils import nodes
+from docutils.utils import get_source_line
+
+from sphinx.errors import SphinxWarning
+from sphinx.util.console import colorize
+from sphinx.util.osutil import abspath
+
+if TYPE_CHECKING:
+ from collections.abc import Generator
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+
+NAMESPACE = 'sphinx'
+VERBOSE = 15
+
+LEVEL_NAMES: defaultdict[str, int] = defaultdict(lambda: logging.WARNING, {
+ 'CRITICAL': logging.CRITICAL,
+ 'SEVERE': logging.CRITICAL,
+ 'ERROR': logging.ERROR,
+ 'WARNING': logging.WARNING,
+ 'INFO': logging.INFO,
+ 'VERBOSE': VERBOSE,
+ 'DEBUG': logging.DEBUG,
+})
+
+VERBOSITY_MAP: defaultdict[int, int] = defaultdict(lambda: logging.NOTSET, {
+ 0: logging.INFO,
+ 1: VERBOSE,
+ 2: logging.DEBUG,
+})
+
+COLOR_MAP: defaultdict[int, str] = defaultdict(lambda: 'blue', {
+ logging.ERROR: 'darkred',
+ logging.WARNING: 'red',
+ logging.DEBUG: 'darkgray',
+})
+
+
+def getLogger(name: str) -> SphinxLoggerAdapter:
+ """Get logger wrapped by :class:`sphinx.util.logging.SphinxLoggerAdapter`.
+
+ Sphinx logger always uses ``sphinx.*`` namespace to be independent from
+ settings of root logger. It ensures logging is consistent even if a
+ third-party extension or imported application resets logger settings.
+
+ Example usage::
+
+ >>> from sphinx.util import logging
+ >>> logger = logging.getLogger(__name__)
+ >>> logger.info('Hello, this is an extension!')
+ Hello, this is an extension!
+ """
+ # add sphinx prefix to name forcely
+ logger = logging.getLogger(NAMESPACE + '.' + name)
+ # Forcely enable logger
+ logger.disabled = False
+ # wrap logger by SphinxLoggerAdapter
+ return SphinxLoggerAdapter(logger, {})
+
+
+def convert_serializable(records: list[logging.LogRecord]) -> None:
+ """Convert LogRecord serializable."""
+ for r in records:
+ # extract arguments to a message and clear them
+ r.msg = r.getMessage()
+ r.args = ()
+
+ location = getattr(r, 'location', None)
+ if isinstance(location, nodes.Node):
+ r.location = get_node_location(location)
+
+
+class SphinxLogRecord(logging.LogRecord):
+ """Log record class supporting location"""
+ prefix = ''
+ location: Any = None
+
+ def getMessage(self) -> str:
+ message = super().getMessage()
+ location = getattr(self, 'location', None)
+ if location:
+ message = f'{location}: {self.prefix}{message}'
+ elif self.prefix not in message:
+ message = self.prefix + message
+
+ return message
+
+
+class SphinxInfoLogRecord(SphinxLogRecord):
+ """Info log record class supporting location"""
+ prefix = '' # do not show any prefix for INFO messages
+
+
+class SphinxWarningLogRecord(SphinxLogRecord):
+ """Warning log record class supporting location"""
+ @property
+ def prefix(self) -> str: # type: ignore[override]
+ if self.levelno >= logging.CRITICAL:
+ return 'CRITICAL: '
+ elif self.levelno >= logging.ERROR:
+ return 'ERROR: '
+ else:
+ return 'WARNING: '
+
+
+class SphinxLoggerAdapter(logging.LoggerAdapter):
+ """LoggerAdapter allowing ``type`` and ``subtype`` keywords."""
+ KEYWORDS = ['type', 'subtype', 'location', 'nonl', 'color', 'once']
+
+ def log( # type: ignore[override]
+ self, level: int | str, msg: str, *args: Any, **kwargs: Any,
+ ) -> None:
+ if isinstance(level, int):
+ super().log(level, msg, *args, **kwargs)
+ else:
+ levelno = LEVEL_NAMES[level]
+ super().log(levelno, msg, *args, **kwargs)
+
+ def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None:
+ self.log(VERBOSE, msg, *args, **kwargs)
+
+ def process(self, msg: str, kwargs: dict) -> tuple[str, dict]: # type: ignore[override]
+ extra = kwargs.setdefault('extra', {})
+ for keyword in self.KEYWORDS:
+ if keyword in kwargs:
+ extra[keyword] = kwargs.pop(keyword)
+
+ return msg, kwargs
+
+ def handle(self, record: logging.LogRecord) -> None:
+ self.logger.handle(record)
+
+
+class WarningStreamHandler(logging.StreamHandler):
+ """StreamHandler for warnings."""
+ pass
+
+
+class NewLineStreamHandler(logging.StreamHandler):
+ """StreamHandler which switches line terminator by record.nonl flag."""
+
+ def emit(self, record: logging.LogRecord) -> None:
+ try:
+ self.acquire()
+ if getattr(record, 'nonl', False):
+ # skip appending terminator when nonl=True
+ self.terminator = ''
+ super().emit(record)
+ finally:
+ self.terminator = '\n'
+ self.release()
+
+
+class MemoryHandler(logging.handlers.BufferingHandler):
+ """Handler buffering all logs."""
+
+ buffer: list[logging.LogRecord]
+
+ def __init__(self) -> None:
+ super().__init__(-1)
+
+ def shouldFlush(self, record: logging.LogRecord) -> bool:
+ return False # never flush
+
+ def flush(self) -> None:
+ # suppress any flushes triggered by importing packages that flush
+ # all handlers at initialization time
+ pass
+
+ def flushTo(self, logger: logging.Logger) -> None:
+ self.acquire()
+ try:
+ for record in self.buffer:
+ logger.handle(record)
+ self.buffer = []
+ finally:
+ self.release()
+
+ def clear(self) -> list[logging.LogRecord]:
+ buffer, self.buffer = self.buffer, []
+ return buffer
+
+
+@contextmanager
+def pending_warnings() -> Generator[logging.Handler, None, None]:
+ """Context manager to postpone logging warnings temporarily.
+
+ Similar to :func:`pending_logging`.
+ """
+ logger = logging.getLogger(NAMESPACE)
+ memhandler = MemoryHandler()
+ memhandler.setLevel(logging.WARNING)
+
+ try:
+ handlers = []
+ for handler in logger.handlers[:]:
+ if isinstance(handler, WarningStreamHandler):
+ logger.removeHandler(handler)
+ handlers.append(handler)
+
+ logger.addHandler(memhandler)
+ yield memhandler
+ finally:
+ logger.removeHandler(memhandler)
+
+ for handler in handlers:
+ logger.addHandler(handler)
+
+ memhandler.flushTo(logger)
+
+
+@contextmanager
+def suppress_logging() -> Generator[MemoryHandler, None, None]:
+ """Context manager to suppress logging all logs temporarily.
+
+ For example::
+
+ >>> with suppress_logging():
+ >>> logger.warning('Warning message!') # suppressed
+ >>> some_long_process()
+ >>>
+ """
+ logger = logging.getLogger(NAMESPACE)
+ memhandler = MemoryHandler()
+
+ try:
+ handlers = []
+ for handler in logger.handlers[:]:
+ logger.removeHandler(handler)
+ handlers.append(handler)
+
+ logger.addHandler(memhandler)
+ yield memhandler
+ finally:
+ logger.removeHandler(memhandler)
+
+ for handler in handlers:
+ logger.addHandler(handler)
+
+
+@contextmanager
+def pending_logging() -> Generator[MemoryHandler, None, None]:
+ """Context manager to postpone logging all logs temporarily.
+
+ For example::
+
+ >>> with pending_logging():
+ >>> logger.warning('Warning message!') # not flushed yet
+ >>> some_long_process()
+ >>>
+ Warning message! # the warning is flushed here
+ """
+ logger = logging.getLogger(NAMESPACE)
+ try:
+ with suppress_logging() as memhandler:
+ yield memhandler
+ finally:
+ memhandler.flushTo(logger)
+
+
+@contextmanager
+def skip_warningiserror(skip: bool = True) -> Generator[None, None, None]:
+ """Context manager to skip WarningIsErrorFilter temporarily."""
+ logger = logging.getLogger(NAMESPACE)
+
+ if skip is False:
+ yield
+ else:
+ try:
+ disabler = DisableWarningIsErrorFilter()
+ for handler in logger.handlers:
+ # use internal method; filters.insert() directly to install disabler
+ # before WarningIsErrorFilter
+ handler.filters.insert(0, disabler)
+ yield
+ finally:
+ for handler in logger.handlers:
+ handler.removeFilter(disabler)
+
+
+@contextmanager
+def prefixed_warnings(prefix: str) -> Generator[None, None, None]:
+ """Context manager to prepend prefix to all warning log records temporarily.
+
+ For example::
+
+ >>> with prefixed_warnings("prefix:"):
+ >>> logger.warning('Warning message!') # => prefix: Warning message!
+
+ .. versionadded:: 2.0
+ """
+ logger = logging.getLogger(NAMESPACE)
+ warning_handler = None
+ for handler in logger.handlers:
+ if isinstance(handler, WarningStreamHandler):
+ warning_handler = handler
+ break
+ else:
+ # warning stream not found
+ yield
+ return
+
+ prefix_filter = None
+ for _filter in warning_handler.filters:
+ if isinstance(_filter, MessagePrefixFilter):
+ prefix_filter = _filter
+ break
+
+ if prefix_filter:
+ # already prefixed
+ try:
+ previous = prefix_filter.prefix
+ prefix_filter.prefix = prefix
+ yield
+ finally:
+ prefix_filter.prefix = previous
+ else:
+ # not prefixed yet
+ prefix_filter = MessagePrefixFilter(prefix)
+ try:
+ warning_handler.addFilter(prefix_filter)
+ yield
+ finally:
+ warning_handler.removeFilter(prefix_filter)
+
+
+class LogCollector:
+ def __init__(self) -> None:
+ self.logs: list[logging.LogRecord] = []
+
+ @contextmanager
+ def collect(self) -> Generator[None, None, None]:
+ with pending_logging() as memhandler:
+ yield
+
+ self.logs = memhandler.clear()
+
+
+class InfoFilter(logging.Filter):
+ """Filter error and warning messages."""
+
+ def filter(self, record: logging.LogRecord) -> bool:
+ return record.levelno < logging.WARNING
+
+
+def is_suppressed_warning(type: str, subtype: str, suppress_warnings: list[str]) -> bool:
+ """Check whether the warning is suppressed or not."""
+ if type is None:
+ return False
+
+ subtarget: str | None
+
+ for warning_type in suppress_warnings:
+ if '.' in warning_type:
+ target, subtarget = warning_type.split('.', 1)
+ else:
+ target, subtarget = warning_type, None
+
+ if target == type and subtarget in (None, subtype, "*"):
+ return True
+
+ return False
+
+
+class WarningSuppressor(logging.Filter):
+ """Filter logs by `suppress_warnings`."""
+
+ def __init__(self, app: Sphinx) -> None:
+ self.app = app
+ super().__init__()
+
+ def filter(self, record: logging.LogRecord) -> bool:
+ type = getattr(record, 'type', '')
+ subtype = getattr(record, 'subtype', '')
+
+ try:
+ suppress_warnings = self.app.config.suppress_warnings
+ except AttributeError:
+ # config is not initialized yet (ex. in conf.py)
+ suppress_warnings = []
+
+ if is_suppressed_warning(type, subtype, suppress_warnings):
+ return False
+ else:
+ self.app._warncount += 1
+ return True
+
+
+class WarningIsErrorFilter(logging.Filter):
+ """Raise exception if warning emitted."""
+
+ def __init__(self, app: Sphinx) -> None:
+ self.app = app
+ super().__init__()
+
+ def filter(self, record: logging.LogRecord) -> bool:
+ if getattr(record, 'skip_warningsiserror', False):
+ # disabled by DisableWarningIsErrorFilter
+ return True
+ elif self.app.warningiserror:
+ location = getattr(record, 'location', '')
+ try:
+ message = record.msg % record.args
+ except (TypeError, ValueError):
+ message = record.msg # use record.msg itself
+
+ if location:
+ exc = SphinxWarning(location + ":" + str(message))
+ else:
+ exc = SphinxWarning(message)
+ if record.exc_info is not None:
+ raise exc from record.exc_info[1]
+ else:
+ raise exc
+ else:
+ return True
+
+
+class DisableWarningIsErrorFilter(logging.Filter):
+ """Disable WarningIsErrorFilter if this filter installed."""
+
+ def filter(self, record: logging.LogRecord) -> bool:
+ record.skip_warningsiserror = True
+ return True
+
+
+class MessagePrefixFilter(logging.Filter):
+ """Prepend prefix to all log records."""
+
+ def __init__(self, prefix: str) -> None:
+ self.prefix = prefix
+ super().__init__()
+
+ def filter(self, record: logging.LogRecord) -> bool:
+ if self.prefix:
+ record.msg = self.prefix + ' ' + record.msg
+ return True
+
+
+class OnceFilter(logging.Filter):
+ """Show the message only once."""
+
+ def __init__(self, name: str = '') -> None:
+ super().__init__(name)
+ self.messages: dict[str, list] = {}
+
+ def filter(self, record: logging.LogRecord) -> bool:
+ once = getattr(record, 'once', '')
+ if not once:
+ return True
+ else:
+ params = self.messages.setdefault(record.msg, [])
+ if record.args in params:
+ return False
+
+ params.append(record.args)
+ return True
+
+
+class SphinxLogRecordTranslator(logging.Filter):
+ """Converts a log record to one Sphinx expects
+
+ * Make a instance of SphinxLogRecord
+ * docname to path if location given
+ """
+ LogRecordClass: type[logging.LogRecord]
+
+ def __init__(self, app: Sphinx) -> None:
+ self.app = app
+ super().__init__()
+
+ def filter(self, record: SphinxWarningLogRecord) -> bool: # type: ignore[override]
+ if isinstance(record, logging.LogRecord):
+ # force subclassing to handle location
+ record.__class__ = self.LogRecordClass # type: ignore[assignment]
+
+ location = getattr(record, 'location', None)
+ if isinstance(location, tuple):
+ docname, lineno = location
+ if docname:
+ if lineno:
+ record.location = f'{self.app.env.doc2path(docname)}:{lineno}'
+ else:
+ record.location = f'{self.app.env.doc2path(docname)}'
+ else:
+ record.location = None
+ elif isinstance(location, nodes.Node):
+ record.location = get_node_location(location)
+ elif location and ':' not in location:
+ record.location = f'{self.app.env.doc2path(location)}'
+
+ return True
+
+
+class InfoLogRecordTranslator(SphinxLogRecordTranslator):
+ """LogRecordTranslator for INFO level log records."""
+ LogRecordClass = SphinxInfoLogRecord
+
+
+class WarningLogRecordTranslator(SphinxLogRecordTranslator):
+ """LogRecordTranslator for WARNING level log records."""
+ LogRecordClass = SphinxWarningLogRecord
+
+
+def get_node_location(node: Node) -> str | None:
+ source, line = get_source_line(node)
+ if source:
+ source = abspath(source)
+ if source and line:
+ return f"{source}:{line}"
+ if source:
+ return f"{source}:"
+ if line:
+ return f"<unknown>:{line}"
+ return None
+
+
+class ColorizeFormatter(logging.Formatter):
+ def format(self, record: logging.LogRecord) -> str:
+ message = super().format(record)
+ color = getattr(record, 'color', None)
+ if color is None:
+ color = COLOR_MAP.get(record.levelno)
+
+ if color:
+ return colorize(color, message)
+ else:
+ return message
+
+
+class SafeEncodingWriter:
+ """Stream writer which ignores UnicodeEncodeError silently"""
+ def __init__(self, stream: IO) -> None:
+ self.stream = stream
+ self.encoding = getattr(stream, 'encoding', 'ascii') or 'ascii'
+
+ def write(self, data: str) -> None:
+ try:
+ self.stream.write(data)
+ except UnicodeEncodeError:
+ # stream accept only str, not bytes. So, we encode and replace
+ # non-encodable characters, then decode them.
+ self.stream.write(data.encode(self.encoding, 'replace').decode(self.encoding))
+
+ def flush(self) -> None:
+ if hasattr(self.stream, 'flush'):
+ self.stream.flush()
+
+
+class LastMessagesWriter:
+ """Stream writer storing last 10 messages in memory to save trackback"""
+ def __init__(self, app: Sphinx, stream: IO) -> None:
+ self.app = app
+
+ def write(self, data: str) -> None:
+ self.app.messagelog.append(data)
+
+
+def setup(app: Sphinx, status: IO, warning: IO) -> None:
+ """Setup root logger for Sphinx"""
+ logger = logging.getLogger(NAMESPACE)
+ logger.setLevel(logging.DEBUG)
+ logger.propagate = False
+
+ # clear all handlers
+ for handler in logger.handlers[:]:
+ logger.removeHandler(handler)
+
+ info_handler = NewLineStreamHandler(SafeEncodingWriter(status))
+ info_handler.addFilter(InfoFilter())
+ info_handler.addFilter(InfoLogRecordTranslator(app))
+ info_handler.setLevel(VERBOSITY_MAP[app.verbosity])
+ info_handler.setFormatter(ColorizeFormatter())
+
+ warning_handler = WarningStreamHandler(SafeEncodingWriter(warning))
+ warning_handler.addFilter(WarningSuppressor(app))
+ warning_handler.addFilter(WarningLogRecordTranslator(app))
+ warning_handler.addFilter(WarningIsErrorFilter(app))
+ warning_handler.addFilter(OnceFilter())
+ warning_handler.setLevel(logging.WARNING)
+ warning_handler.setFormatter(ColorizeFormatter())
+
+ messagelog_handler = logging.StreamHandler(LastMessagesWriter(app, status))
+ messagelog_handler.addFilter(InfoFilter())
+ messagelog_handler.setLevel(VERBOSITY_MAP[app.verbosity])
+
+ logger.addHandler(info_handler)
+ logger.addHandler(warning_handler)
+ logger.addHandler(messagelog_handler)
diff --git a/sphinx/util/matching.py b/sphinx/util/matching.py
new file mode 100644
index 0000000..dd91905
--- /dev/null
+++ b/sphinx/util/matching.py
@@ -0,0 +1,169 @@
+"""Pattern-matching utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import os.path
+import re
+from typing import TYPE_CHECKING, Callable
+
+from sphinx.util.osutil import canon_path, path_stabilize
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable, Iterator
+
+
+def _translate_pattern(pat: str) -> str:
+ """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.
+ """
+ i, n = 0, len(pat)
+ res = ''
+ while i < n:
+ c = pat[i]
+ i += 1
+ if c == '*':
+ if i < n and pat[i] == '*':
+ # double star matches slashes too
+ i += 1
+ res = res + '.*'
+ else:
+ # single star doesn't match slashes
+ res = res + '[^/]*'
+ elif c == '?':
+ # question mark doesn't match slashes too
+ res = res + '[^/]'
+ elif c == '[':
+ j = i
+ if j < n and pat[j] == '!':
+ j += 1
+ if j < n and pat[j] == ']':
+ j += 1
+ while j < n and pat[j] != ']':
+ j += 1
+ if j >= n:
+ res = res + '\\['
+ else:
+ stuff = pat[i:j].replace('\\', '\\\\')
+ i = j + 1
+ if stuff[0] == '!':
+ # negative pattern mustn't match slashes too
+ stuff = '^/' + stuff[1:]
+ elif stuff[0] == '^':
+ stuff = '\\' + stuff
+ res = f'{res}[{stuff}]'
+ else:
+ res += re.escape(c)
+ return res + '$'
+
+
+def compile_matchers(
+ patterns: Iterable[str],
+) -> list[Callable[[str], re.Match[str] | None]]:
+ return [re.compile(_translate_pattern(pat)).match for pat in patterns]
+
+
+class Matcher:
+ """A pattern matcher for Multiple shell-style glob patterns.
+
+ Note: this modifies the patterns to work with copy_asset().
+ For example, "**/index.rst" matches with "index.rst"
+ """
+
+ def __init__(self, exclude_patterns: Iterable[str]) -> None:
+ expanded = [pat[3:] for pat in exclude_patterns if pat.startswith('**/')]
+ self.patterns = compile_matchers(list(exclude_patterns) + expanded)
+
+ def __call__(self, string: str) -> bool:
+ return self.match(string)
+
+ def match(self, string: str) -> bool:
+ string = canon_path(string)
+ return any(pat(string) for pat in self.patterns)
+
+
+DOTFILES = Matcher(['**/.*'])
+
+
+_pat_cache: dict[str, re.Pattern[str]] = {}
+
+
+def patmatch(name: str, pat: str) -> re.Match[str] | None:
+ """Return if name matches the regular expression (pattern)
+ ``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: Iterable[str], pat: str) -> list[str]:
+ """Return the subset of the list ``names`` that match
+ the regular expression (pattern) ``pat``.
+
+ Adapted from fnmatch module.
+ """
+ if pat not in _pat_cache:
+ _pat_cache[pat] = re.compile(_translate_pattern(pat))
+ match = _pat_cache[pat].match
+ return list(filter(match, names))
+
+
+def get_matching_files(
+ dirname: str | os.PathLike[str],
+ include_patterns: Iterable[str] = ("**",),
+ exclude_patterns: Iterable[str] = (),
+) -> Iterator[str]:
+ """Get all file names in a directory, recursively.
+
+ Filter file names by the glob-style include_patterns and exclude_patterns.
+ The default values include all files ("**") and exclude nothing ("").
+
+ Only files matching some pattern in *include_patterns* are included, and
+ exclusions from *exclude_patterns* take priority over inclusions.
+
+ """
+ # dirname is a normalized absolute path.
+ dirname = os.path.normpath(os.path.abspath(dirname))
+
+ exclude_matchers = compile_matchers(exclude_patterns)
+ include_matchers = compile_matchers(include_patterns)
+
+ for root, dirs, files in os.walk(dirname, followlinks=True):
+ relative_root = os.path.relpath(root, dirname)
+ if relative_root == ".":
+ relative_root = "" # suppress dirname for files on the target dir
+
+ # Filter files
+ included_files = []
+ for entry in sorted(files):
+ entry = path_stabilize(os.path.join(relative_root, entry))
+ keep = False
+ for matcher in include_matchers:
+ if matcher(entry):
+ keep = True
+ break # break the inner loop
+
+ for matcher in exclude_matchers:
+ if matcher(entry):
+ keep = False
+ break # break the inner loop
+
+ if keep:
+ included_files.append(entry)
+
+ # Filter directories
+ filtered_dirs = []
+ for dir_name in sorted(dirs):
+ normalised = path_stabilize(os.path.join(relative_root, dir_name))
+ for matcher in exclude_matchers:
+ if matcher(normalised):
+ break # break the inner loop
+ else:
+ # if the loop didn't break
+ filtered_dirs.append(dir_name)
+
+ dirs[:] = filtered_dirs
+
+ # Yield filtered files
+ yield from included_files
diff --git a/sphinx/util/math.py b/sphinx/util/math.py
new file mode 100644
index 0000000..ef0eb39
--- /dev/null
+++ b/sphinx/util/math.py
@@ -0,0 +1,61 @@
+"""Utility functions for math."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+ from docutils import nodes
+
+ from sphinx.builders.html import HTML5Translator
+
+
+def get_node_equation_number(writer: HTML5Translator, node: nodes.math_block) -> str:
+ if writer.builder.config.math_numfig and writer.builder.config.numfig:
+ figtype = 'displaymath'
+ if writer.builder.name == 'singlehtml':
+ key = f"{writer.docnames[-1]}/{figtype}" # type: ignore[has-type]
+ else:
+ key = figtype
+
+ id = node['ids'][0]
+ number = writer.builder.fignumbers.get(key, {}).get(id, ())
+ return '.'.join(map(str, number))
+ else:
+ return node['number']
+
+
+def wrap_displaymath(text: str, label: str | None, numbering: bool) -> str:
+ def is_equation(part: str) -> str:
+ return part.strip()
+
+ if label is None:
+ labeldef = ''
+ else:
+ labeldef = r'\label{%s}' % label
+ numbering = True
+
+ parts = list(filter(is_equation, text.split('\n\n')))
+ equations = []
+ if len(parts) == 0:
+ return ''
+ elif len(parts) == 1:
+ if numbering:
+ begin = r'\begin{equation}' + labeldef
+ end = r'\end{equation}'
+ else:
+ begin = r'\begin{equation*}' + labeldef
+ end = r'\end{equation*}'
+ equations.append('\\begin{split}%s\\end{split}\n' % parts[0])
+ else:
+ if numbering:
+ begin = r'\begin{align}%s\!\begin{aligned}' % labeldef
+ end = r'\end{aligned}\end{align}'
+ else:
+ begin = r'\begin{align*}%s\!\begin{aligned}' % labeldef
+ end = r'\end{aligned}\end{align*}'
+ for part in parts:
+ equations.append('%s\\\\\n' % part.strip())
+
+ concatenated_equations = ''.join(equations)
+ return f'{begin}\n{concatenated_equations}{end}'
diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py
new file mode 100644
index 0000000..b68b7fd
--- /dev/null
+++ b/sphinx/util/nodes.py
@@ -0,0 +1,672 @@
+"""Docutils node-related utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import contextlib
+import re
+import unicodedata
+from typing import TYPE_CHECKING, Any, Callable
+
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.locale import __
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+
+ from docutils.nodes import Element, Node
+ from docutils.parsers.rst import Directive
+ from docutils.parsers.rst.states import Inliner
+ from docutils.statemachine import StringList
+
+ from sphinx.builders import Builder
+ from sphinx.environment import BuildEnvironment
+ from sphinx.util.tags import Tags
+
+logger = logging.getLogger(__name__)
+
+
+# \x00 means the "<" was backslash-escaped
+explicit_title_re = re.compile(r'^(.+?)\s*(?<!\x00)<([^<]*?)>$', re.DOTALL)
+caption_ref_re = explicit_title_re # b/w compat alias
+
+
+class NodeMatcher:
+ """A helper class for Node.findall().
+
+ It checks that the given node is an instance of the specified node-classes and
+ has the specified node-attributes.
+
+ For example, following example searches ``reference`` node having ``refdomain``
+ and ``reftype`` attributes::
+
+ matcher = NodeMatcher(nodes.reference, refdomain='std', reftype='citation')
+ doctree.findall(matcher)
+ # => [<reference ...>, <reference ...>, ...]
+
+ A special value ``typing.Any`` matches any kind of node-attributes. For example,
+ following example searches ``reference`` node having ``refdomain`` attributes::
+
+ from __future__ import annotations
+from typing import TYPE_CHECKING, Any
+ matcher = NodeMatcher(nodes.reference, refdomain=Any)
+ doctree.findall(matcher)
+ # => [<reference ...>, <reference ...>, ...]
+ """
+
+ def __init__(self, *node_classes: type[Node], **attrs: Any) -> None:
+ self.classes = node_classes
+ self.attrs = attrs
+
+ def match(self, node: Node) -> bool:
+ try:
+ if self.classes and not isinstance(node, self.classes):
+ return False
+
+ if self.attrs:
+ if not isinstance(node, nodes.Element):
+ return False
+
+ for key, value in self.attrs.items():
+ if key not in node:
+ return False
+ elif value is Any:
+ continue
+ elif node.get(key) != value:
+ return False
+
+ return True
+ except Exception:
+ # for non-Element nodes
+ return False
+
+ def __call__(self, node: Node) -> bool:
+ return self.match(node)
+
+
+def get_full_module_name(node: Node) -> str:
+ """
+ Return full module dotted path like: 'docutils.nodes.paragraph'
+
+ :param nodes.Node node: target node
+ :return: full module dotted path
+ """
+ return f'{node.__module__}.{node.__class__.__name__}'
+
+
+def repr_domxml(node: Node, length: int = 80) -> str:
+ """
+ return DOM XML representation of the specified node like:
+ '<paragraph translatable="False"><inline classes="versionmodified">New in version...'
+
+ :param nodes.Node node: target node
+ :param int length:
+ length of return value to be striped. if false-value is specified, repr_domxml
+ returns full of DOM XML representation.
+ :return: DOM XML representation
+ """
+ try:
+ text = node.asdom().toxml()
+ except Exception:
+ text = str(node)
+ if length and len(text) > length:
+ text = text[:length] + '...'
+ return text
+
+
+def apply_source_workaround(node: Element) -> None:
+ # workaround: nodes.term have wrong rawsource if classifier is specified.
+ # The behavior of docutils-0.11, 0.12 is:
+ # * when ``term text : classifier1 : classifier2`` is specified,
+ # * rawsource of term node will have: ``term text : classifier1 : classifier2``
+ # * rawsource of classifier node will be None
+ if isinstance(node, nodes.classifier) and not node.rawsource:
+ logger.debug('[i18n] PATCH: %r to have source, line and rawsource: %s',
+ get_full_module_name(node), repr_domxml(node))
+ definition_list_item = node.parent
+ node.source = definition_list_item.source
+ node.line = definition_list_item.line - 1
+ node.rawsource = node.astext() # set 'classifier1' (or 'classifier2')
+ elif isinstance(node, nodes.classifier) and not node.source:
+ # docutils-0.15 fills in rawsource attribute, but not in source.
+ node.source = node.parent.source
+ if isinstance(node, nodes.image) and node.source is None:
+ logger.debug('[i18n] PATCH: %r to have source, line: %s',
+ get_full_module_name(node), repr_domxml(node))
+ node.source, node.line = node.parent.source, node.parent.line
+ if isinstance(node, nodes.title) and node.source is None:
+ logger.debug('[i18n] PATCH: %r to have source: %s',
+ get_full_module_name(node), repr_domxml(node))
+ node.source, node.line = node.parent.source, node.parent.line
+ if isinstance(node, nodes.term):
+ logger.debug('[i18n] PATCH: %r to have rawsource: %s',
+ get_full_module_name(node), repr_domxml(node))
+ # strip classifier from rawsource of term
+ for classifier in reversed(list(node.parent.findall(nodes.classifier))):
+ node.rawsource = re.sub(r'\s*:\s*%s' % re.escape(classifier.astext()),
+ '', node.rawsource)
+ if isinstance(node, nodes.topic) and node.source is None:
+ # docutils-0.18 does not fill the source attribute of topic
+ logger.debug('[i18n] PATCH: %r to have source, line: %s',
+ get_full_module_name(node), repr_domxml(node))
+ node.source, node.line = node.parent.source, node.parent.line
+
+ # workaround: literal_block under bullet list (#4913)
+ if isinstance(node, nodes.literal_block) and node.source is None:
+ with contextlib.suppress(ValueError):
+ node.source = get_node_source(node)
+
+ # workaround: recommonmark-0.2.0 doesn't set rawsource attribute
+ if not node.rawsource:
+ node.rawsource = node.astext()
+
+ if node.source and node.rawsource:
+ return
+
+ # workaround: some docutils nodes doesn't have source, line.
+ if (isinstance(node, (
+ nodes.rubric, # #1305 rubric directive
+ nodes.line, # #1477 line node
+ nodes.image, # #3093 image directive in substitution
+ nodes.field_name, # #3335 field list syntax
+ ))):
+ logger.debug('[i18n] PATCH: %r to have source and line: %s',
+ get_full_module_name(node), repr_domxml(node))
+ try:
+ node.source = get_node_source(node)
+ except ValueError:
+ node.source = ''
+ node.line = 0 # need fix docutils to get `node.line`
+ return
+
+
+IGNORED_NODES = (
+ nodes.Invisible,
+ nodes.literal_block,
+ nodes.doctest_block,
+ addnodes.versionmodified,
+ # XXX there are probably more
+)
+
+
+def is_translatable(node: Node) -> bool:
+ if isinstance(node, addnodes.translatable):
+ return True
+
+ # image node marked as translatable or having alt text
+ if isinstance(node, nodes.image) and (node.get('translatable') or node.get('alt')):
+ return True
+
+ if isinstance(node, nodes.Inline) and 'translatable' not in node: # type: ignore[operator]
+ # inline node must not be translated if 'translatable' is not set
+ return False
+
+ if isinstance(node, nodes.TextElement):
+ if not node.source:
+ logger.debug('[i18n] SKIP %r because no node.source: %s',
+ get_full_module_name(node), repr_domxml(node))
+ return False # built-in message
+ if isinstance(node, IGNORED_NODES) and 'translatable' not in node:
+ logger.debug("[i18n] SKIP %r because node is in IGNORED_NODES "
+ "and no node['translatable']: %s",
+ get_full_module_name(node), repr_domxml(node))
+ return False
+ if not node.get('translatable', True):
+ # not(node['translatable'] == True or node['translatable'] is None)
+ logger.debug("[i18n] SKIP %r because not node['translatable']: %s",
+ get_full_module_name(node), repr_domxml(node))
+ return False
+ # <field_name>orphan</field_name>
+ # XXX ignore all metadata (== docinfo)
+ if isinstance(node, nodes.field_name) and node.children[0] == 'orphan':
+ logger.debug('[i18n] SKIP %r because orphan node: %s',
+ get_full_module_name(node), repr_domxml(node))
+ return False
+ return True
+
+ if isinstance(node, nodes.meta): # type: ignore[attr-defined]
+ return True
+
+ return False
+
+
+LITERAL_TYPE_NODES = (
+ nodes.literal_block,
+ nodes.doctest_block,
+ nodes.math_block,
+ nodes.raw,
+)
+IMAGE_TYPE_NODES = (
+ nodes.image,
+)
+
+
+def extract_messages(doctree: Element) -> Iterable[tuple[Element, str]]:
+ """Extract translatable messages from a document tree."""
+ for node in doctree.findall(is_translatable): # type: Element
+ if isinstance(node, addnodes.translatable):
+ for msg in node.extract_original_messages():
+ yield node, msg
+ continue
+ if isinstance(node, LITERAL_TYPE_NODES):
+ msg = node.rawsource
+ if not msg:
+ msg = node.astext()
+ elif isinstance(node, nodes.image):
+ if node.get('alt'):
+ yield node, node['alt']
+ if node.get('translatable'):
+ image_uri = node.get('original_uri', node['uri'])
+ msg = f'.. image:: {image_uri}'
+ else:
+ msg = ''
+ elif isinstance(node, nodes.meta): # type: ignore[attr-defined]
+ msg = node["content"]
+ else:
+ msg = node.rawsource.replace('\n', ' ').strip()
+
+ # XXX nodes rendering empty are likely a bug in sphinx.addnodes
+ if msg:
+ yield node, msg
+
+
+def get_node_source(node: Element) -> str:
+ for pnode in traverse_parent(node):
+ if pnode.source:
+ return pnode.source
+ msg = 'node source not found'
+ raise ValueError(msg)
+
+
+def get_node_line(node: Element) -> int:
+ for pnode in traverse_parent(node):
+ if pnode.line:
+ return pnode.line
+ msg = 'node line not found'
+ raise ValueError(msg)
+
+
+def traverse_parent(node: Element, cls: Any = None) -> Iterable[Element]:
+ while node:
+ if cls is None or isinstance(node, cls):
+ yield node
+ node = node.parent
+
+
+def get_prev_node(node: Node) -> Node | None:
+ pos = node.parent.index(node)
+ if pos > 0:
+ return node.parent[pos - 1]
+ else:
+ return None
+
+
+def traverse_translatable_index(
+ doctree: Element,
+) -> Iterable[tuple[Element, list[tuple[str, str, str, str, str | None]]]]:
+ """Traverse translatable index node from a document tree."""
+ matcher = NodeMatcher(addnodes.index, inline=False)
+ for node in doctree.findall(matcher): # type: addnodes.index
+ if 'raw_entries' in node:
+ entries = node['raw_entries']
+ else:
+ entries = node['entries']
+ yield node, entries
+
+
+def nested_parse_with_titles(state: Any, content: StringList, node: Node,
+ content_offset: int = 0) -> str:
+ """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
+ state.memo.title_styles = []
+ state.memo.section_level = 0
+ try:
+ return state.nested_parse(content, content_offset, node, match_titles=1)
+ finally:
+ state.memo.title_styles = surrounding_title_styles
+ state.memo.section_level = surrounding_section_level
+
+
+def clean_astext(node: Element) -> str:
+ """Like node.astext(), but ignore images."""
+ node = node.deepcopy()
+ for img in node.findall(nodes.image):
+ img['alt'] = ''
+ for raw in list(node.findall(nodes.raw)):
+ raw.parent.remove(raw)
+ return node.astext()
+
+
+def split_explicit_title(text: str) -> tuple[bool, str, str]:
+ """Split role content into title and target, if given."""
+ match = explicit_title_re.match(text)
+ if match:
+ return True, match.group(1), match.group(2)
+ return False, text, text
+
+
+indextypes = [
+ 'single', 'pair', 'double', 'triple', 'see', 'seealso',
+]
+
+
+def process_index_entry(entry: str, targetid: str,
+ ) -> list[tuple[str, str, str, str, str | None]]:
+ from sphinx.domains.python import pairindextypes
+
+ indexentries: list[tuple[str, str, str, str, str | None]] = []
+ entry = entry.strip()
+ oentry = entry
+ main = ''
+ if entry.startswith('!'):
+ main = 'main'
+ entry = entry[1:].lstrip()
+ for index_type in pairindextypes:
+ if entry.startswith(f'{index_type}:'):
+ value = entry[len(index_type) + 1:].strip()
+ value = f'{pairindextypes[index_type]}; {value}'
+ # xref RemovedInSphinx90Warning
+ logger.warning(__('%r is deprecated for index entries (from entry %r). '
+ "Use 'pair: %s' instead."),
+ index_type, entry, value, type='index')
+ indexentries.append(('pair', value, targetid, main, None))
+ break
+ else:
+ for index_type in indextypes:
+ if entry.startswith(f'{index_type}:'):
+ value = entry[len(index_type) + 1:].strip()
+ if index_type == 'double':
+ index_type = 'pair'
+ indexentries.append((index_type, value, targetid, main, None))
+ 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, None))
+ return indexentries
+
+
+def inline_all_toctrees(builder: Builder, docnameset: set[str], docname: str,
+ tree: nodes.document, colorfunc: Callable, traversed: list[str],
+ ) -> nodes.document:
+ """Inline all toctrees in the *tree*.
+
+ Record all docnames in *docnameset*, and output docnames with *colorfunc*.
+ """
+ tree = tree.deepcopy()
+ for toctreenode in list(tree.findall(addnodes.toctree)):
+ newnodes = []
+ includefiles = map(str, toctreenode['includefiles'])
+ for includefile in includefiles:
+ if includefile not in traversed:
+ try:
+ traversed.append(includefile)
+ logger.info(colorfunc(includefile) + " ", nonl=True)
+ subtree = inline_all_toctrees(builder, docnameset, includefile,
+ builder.env.get_doctree(includefile),
+ colorfunc, traversed)
+ docnameset.add(includefile)
+ except Exception:
+ logger.warning(__('toctree contains ref to nonexisting file %r'),
+ includefile, location=docname)
+ else:
+ sof = addnodes.start_of_file(docname=includefile)
+ sof.children = subtree.children
+ for sectionnode in sof.findall(nodes.section):
+ if 'docname' not in sectionnode:
+ sectionnode['docname'] = includefile
+ newnodes.append(sof)
+ toctreenode.parent.replace(toctreenode, newnodes)
+ return tree
+
+
+def _make_id(string: str) -> str:
+ """Convert `string` into an identifier and return it.
+
+ This function is a modified version of ``docutils.nodes.make_id()`` of
+ docutils-0.16.
+
+ Changes:
+
+ * Allow to use capital alphabet characters
+ * Allow to use dots (".") and underscores ("_") for an identifier
+ without a leading character.
+
+ # Author: David Goodger <goodger@python.org>
+ # Maintainer: docutils-develop@lists.sourceforge.net
+ # Copyright: This module has been placed in the public domain.
+ """
+ id = string.translate(_non_id_translate_digraphs)
+ id = id.translate(_non_id_translate)
+ # get rid of non-ascii characters.
+ # 'ascii' lowercase to prevent problems with turkish locale.
+ id = unicodedata.normalize('NFKD', id).encode('ascii', 'ignore').decode('ascii')
+ # shrink runs of whitespace and replace by hyphen
+ id = _non_id_chars.sub('-', ' '.join(id.split()))
+ id = _non_id_at_ends.sub('', id)
+ return str(id)
+
+
+_non_id_chars = re.compile('[^a-zA-Z0-9._]+')
+_non_id_at_ends = re.compile('^[-0-9._]+|-+$')
+_non_id_translate = {
+ 0x00f8: 'o', # o with stroke
+ 0x0111: 'd', # d with stroke
+ 0x0127: 'h', # h with stroke
+ 0x0131: 'i', # dotless i
+ 0x0142: 'l', # l with stroke
+ 0x0167: 't', # t with stroke
+ 0x0180: 'b', # b with stroke
+ 0x0183: 'b', # b with topbar
+ 0x0188: 'c', # c with hook
+ 0x018c: 'd', # d with topbar
+ 0x0192: 'f', # f with hook
+ 0x0199: 'k', # k with hook
+ 0x019a: 'l', # l with bar
+ 0x019e: 'n', # n with long right leg
+ 0x01a5: 'p', # p with hook
+ 0x01ab: 't', # t with palatal hook
+ 0x01ad: 't', # t with hook
+ 0x01b4: 'y', # y with hook
+ 0x01b6: 'z', # z with stroke
+ 0x01e5: 'g', # g with stroke
+ 0x0225: 'z', # z with hook
+ 0x0234: 'l', # l with curl
+ 0x0235: 'n', # n with curl
+ 0x0236: 't', # t with curl
+ 0x0237: 'j', # dotless j
+ 0x023c: 'c', # c with stroke
+ 0x023f: 's', # s with swash tail
+ 0x0240: 'z', # z with swash tail
+ 0x0247: 'e', # e with stroke
+ 0x0249: 'j', # j with stroke
+ 0x024b: 'q', # q with hook tail
+ 0x024d: 'r', # r with stroke
+ 0x024f: 'y', # y with stroke
+}
+_non_id_translate_digraphs = {
+ 0x00df: 'sz', # ligature sz
+ 0x00e6: 'ae', # ae
+ 0x0153: 'oe', # ligature oe
+ 0x0238: 'db', # db digraph
+ 0x0239: 'qp', # qp digraph
+}
+
+
+def make_id(env: BuildEnvironment, document: nodes.document,
+ prefix: str = '', term: str | None = None) -> str:
+ """Generate an appropriate node_id for given *prefix* and *term*."""
+ node_id = None
+ if prefix:
+ idformat = prefix + "-%s"
+ else:
+ idformat = (document.settings.id_prefix or "id") + "%s"
+
+ # try to generate node_id by *term*
+ if prefix and term:
+ node_id = _make_id(idformat % term)
+ if node_id == prefix:
+ # *term* is not good to generate a node_id.
+ node_id = None
+ elif term:
+ node_id = _make_id(term)
+ if node_id == '':
+ node_id = None # fallback to None
+
+ while node_id is None or node_id in document.ids:
+ node_id = idformat % env.new_serialno(prefix)
+
+ return node_id
+
+
+def find_pending_xref_condition(node: addnodes.pending_xref, condition: str,
+ ) -> Element | None:
+ """Pick matched pending_xref_condition node up from the pending_xref."""
+ for subnode in node:
+ if (isinstance(subnode, addnodes.pending_xref_condition) and
+ subnode.get('condition') == condition):
+ return subnode
+ return None
+
+
+def make_refnode(builder: Builder, fromdocname: str, todocname: str, targetid: str | None,
+ child: Node | list[Node], title: str | None = None,
+ ) -> nodes.reference:
+ """Shortcut to create a reference node."""
+ node = nodes.reference('', '', internal=True)
+ if fromdocname == todocname and targetid:
+ node['refid'] = targetid
+ else:
+ if targetid:
+ node['refuri'] = (builder.get_relative_uri(fromdocname, todocname) +
+ '#' + targetid)
+ else:
+ node['refuri'] = builder.get_relative_uri(fromdocname, todocname)
+ if title:
+ node['reftitle'] = title
+ node += child
+ return node
+
+
+def set_source_info(directive: Directive, node: Node) -> None:
+ node.source, node.line = \
+ directive.state_machine.get_source_and_line(directive.lineno)
+
+
+def set_role_source_info(inliner: Inliner, lineno: int, node: Node) -> None:
+ gsal = inliner.reporter.get_source_and_line # type: ignore[attr-defined]
+ node.source, node.line = gsal(lineno)
+
+
+def copy_source_info(src: Element, dst: Element) -> None:
+ with contextlib.suppress(ValueError):
+ dst.source = get_node_source(src)
+ dst.line = get_node_line(src)
+
+
+NON_SMARTQUOTABLE_PARENT_NODES = (
+ nodes.FixedTextElement,
+ nodes.literal,
+ nodes.math,
+ nodes.image,
+ nodes.raw,
+ nodes.problematic,
+ addnodes.not_smartquotable,
+)
+
+
+def is_smartquotable(node: Node) -> bool:
+ """Check whether the node is smart-quotable or not."""
+ for pnode in traverse_parent(node.parent):
+ if isinstance(pnode, NON_SMARTQUOTABLE_PARENT_NODES):
+ return False
+ if pnode.get('support_smartquotes', None) is False:
+ return False
+
+ if getattr(node, 'support_smartquotes', None) is False:
+ return False
+
+ return True
+
+
+def process_only_nodes(document: Node, tags: Tags) -> None:
+ """Filter ``only`` nodes which do not match *tags*."""
+ for node in document.findall(addnodes.only):
+ if _only_node_keep_children(node, tags):
+ node.replace_self(node.children or nodes.comment())
+ else:
+ # A comment on the comment() nodes being inserted: replacing by [] would
+ # result in a "Losing ids" exception if there is a target node before
+ # the only node, so we make sure docutils can transfer the id to
+ # something, even if it's just a comment and will lose the id anyway...
+ node.replace_self(nodes.comment())
+
+
+def _only_node_keep_children(node: addnodes.only, tags: Tags) -> bool:
+ """Keep children if tags match or error."""
+ try:
+ return tags.eval_condition(node['expr'])
+ except Exception as err:
+ logger.warning(
+ __('exception while evaluating only directive expression: %s'),
+ err,
+ location=node)
+ return True
+
+
+def _copy_except__document(el: Element) -> Element:
+ """Monkey-patch ```nodes.Element.copy``` to not copy the ``_document``
+ attribute.
+
+ xref: https://github.com/sphinx-doc/sphinx/issues/11116#issuecomment-1376767086
+ """
+ newnode = object.__new__(el.__class__)
+ # set in Element.__init__()
+ newnode.children = []
+ newnode.rawsource = el.rawsource
+ newnode.tagname = el.tagname
+ # copied in Element.copy()
+ newnode.attributes = {k: (v
+ if k not in {'ids', 'classes', 'names', 'dupnames', 'backrefs'}
+ else v[:])
+ for k, v in el.attributes.items()}
+ newnode.line = el.line
+ newnode.source = el.source
+ return newnode
+
+
+nodes.Element.copy = _copy_except__document # type: ignore[assignment]
+
+
+def _deepcopy(el: Element) -> Element:
+ """Monkey-patch ```nodes.Element.deepcopy``` for speed."""
+ newnode = el.copy()
+ newnode.children = [child.deepcopy() for child in el.children]
+ for child in newnode.children:
+ child.parent = newnode
+ if el.document:
+ child.document = el.document
+ if child.source is None:
+ child.source = el.document.current_source
+ if child.line is None:
+ child.line = el.document.current_line
+ return newnode
+
+
+nodes.Element.deepcopy = _deepcopy # type: ignore[assignment]
diff --git a/sphinx/util/osutil.py b/sphinx/util/osutil.py
new file mode 100644
index 0000000..c6adbe4
--- /dev/null
+++ b/sphinx/util/osutil.py
@@ -0,0 +1,217 @@
+"""Operating system-related utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import contextlib
+import filecmp
+import os
+import re
+import shutil
+import sys
+import unicodedata
+from io import StringIO
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from sphinx.deprecation import _deprecation_warning
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+# SEP separates path elements in the canonical file names
+#
+# Define SEP as a manifest constant, not so much because we expect it to change
+# in the future as to avoid the suspicion that a stray "/" in the code is a
+# hangover from more *nix-oriented origins.
+SEP = "/"
+
+
+def os_path(canonical_path: str, /) -> str:
+ return canonical_path.replace(SEP, path.sep)
+
+
+def canon_path(native_path: str | os.PathLike[str], /) -> str:
+ """Return path in OS-independent form"""
+ return os.fspath(native_path).replace(path.sep, SEP)
+
+
+def path_stabilize(filepath: str | os.PathLike[str], /) -> str:
+ "Normalize path separator and unicode string"
+ new_path = canon_path(filepath)
+ return unicodedata.normalize('NFC', new_path)
+
+
+def relative_uri(base: str, to: str) -> str:
+ """Return a relative URL from ``base`` to ``to``."""
+ if to.startswith(SEP):
+ return to
+ b2 = base.split('#')[0].split(SEP)
+ t2 = to.split('#')[0].split(SEP)
+ # remove common segments (except the last segment)
+ for x, y in zip(b2[:-1], t2[:-1]):
+ if x != y:
+ break
+ b2.pop(0)
+ t2.pop(0)
+ if b2 == t2:
+ # Special case: relative_uri('f/index.html','f/index.html')
+ # returns '', not 'index.html'
+ return ''
+ if len(b2) == 1 and t2 == ['']:
+ # Special case: relative_uri('f/index.html','f/') should
+ # return './', not ''
+ return '.' + SEP
+ return ('..' + SEP) * (len(b2) - 1) + SEP.join(t2)
+
+
+def ensuredir(file: str | os.PathLike[str]) -> None:
+ """Ensure that a path exists."""
+ os.makedirs(file, exist_ok=True)
+
+
+def mtimes_of_files(dirnames: list[str], suffix: str) -> Iterator[float]:
+ for dirname in dirnames:
+ for root, _dirs, files in os.walk(dirname):
+ for sfile in files:
+ if sfile.endswith(suffix):
+ with contextlib.suppress(OSError):
+ yield path.getmtime(path.join(root, sfile))
+
+
+def copytimes(source: str | os.PathLike[str], dest: str | os.PathLike[str]) -> None:
+ """Copy a file's modification times."""
+ st = os.stat(source)
+ if hasattr(os, 'utime'):
+ os.utime(dest, (st.st_atime, st.st_mtime))
+
+
+def copyfile(source: str | os.PathLike[str], dest: str | os.PathLike[str]) -> None:
+ """Copy a file and its modification times, if possible.
+
+ Note: ``copyfile`` skips copying if the file has not been changed"""
+ if not path.exists(dest) or not filecmp.cmp(source, dest):
+ shutil.copyfile(source, dest)
+ with contextlib.suppress(OSError):
+ # don't do full copystat because the source may be read-only
+ copytimes(source, dest)
+
+
+no_fn_re = re.compile(r'[^a-zA-Z0-9_-]')
+project_suffix_re = re.compile(' Documentation$')
+
+
+def make_filename(string: str) -> str:
+ return no_fn_re.sub('', string) or 'sphinx'
+
+
+def make_filename_from_project(project: str) -> str:
+ return make_filename(project_suffix_re.sub('', project)).lower()
+
+
+def relpath(path: str | os.PathLike[str],
+ start: str | os.PathLike[str] | None = os.curdir) -> str:
+ """Return a relative filepath to *path* either from the current directory or
+ from an optional *start* directory.
+
+ This is an alternative of ``os.path.relpath()``. This returns original path
+ if *path* and *start* are on different drives (for Windows platform).
+ """
+ try:
+ return os.path.relpath(path, start)
+ except ValueError:
+ return str(path)
+
+
+safe_relpath = relpath # for compatibility
+fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
+
+
+abspath = path.abspath
+
+
+class _chdir:
+ """Remove this fall-back once support for Python 3.10 is removed."""
+ def __init__(self, target_dir: str, /):
+ self.path = target_dir
+ self._dirs: list[str] = []
+
+ def __enter__(self):
+ self._dirs.append(os.getcwd())
+ os.chdir(self.path)
+
+ def __exit__(self, _exc_type, _exc_value, _traceback, /):
+ os.chdir(self._dirs.pop())
+
+
+@contextlib.contextmanager
+def cd(target_dir: str) -> Iterator[None]:
+ if sys.version_info[:2] >= (3, 11):
+ _deprecation_warning(__name__, 'cd', 'contextlib.chdir', remove=(8, 0))
+ with _chdir(target_dir):
+ yield
+
+
+class FileAvoidWrite:
+ """File-like object that buffers output and only writes if content changed.
+
+ Use this class like when writing to a file to avoid touching the original
+ file if the content hasn't changed. This is useful in scenarios where file
+ mtime is used to invalidate caches or trigger new behavior.
+
+ When writing to this file handle, all writes are buffered until the object
+ is closed.
+
+ Objects can be used as context managers.
+ """
+ def __init__(self, path: str) -> None:
+ self._path = path
+ self._io: StringIO | None = None
+
+ def write(self, data: str) -> None:
+ if not self._io:
+ self._io = StringIO()
+ self._io.write(data)
+
+ def close(self) -> None:
+ """Stop accepting writes and write file, if needed."""
+ if not self._io:
+ msg = 'FileAvoidWrite does not support empty files.'
+ raise Exception(msg)
+
+ buf = self.getvalue()
+ self._io.close()
+
+ try:
+ with open(self._path, encoding='utf-8') as old_f:
+ old_content = old_f.read()
+ if old_content == buf:
+ return
+ except OSError:
+ pass
+
+ with open(self._path, 'w', encoding='utf-8') as f:
+ f.write(buf)
+
+ def __enter__(self) -> FileAvoidWrite:
+ return self
+
+ def __exit__(
+ self, exc_type: type[Exception], exc_value: Exception, traceback: Any,
+ ) -> bool:
+ self.close()
+ return True
+
+ def __getattr__(self, name: str) -> Any:
+ # Proxy to _io instance.
+ if not self._io:
+ msg = 'Must write to FileAvoidWrite before other methods can be used'
+ raise Exception(msg)
+
+ return getattr(self._io, name)
+
+
+def rmtree(path: str) -> None:
+ if os.path.isdir(path):
+ shutil.rmtree(path)
+ else:
+ os.remove(path)
diff --git a/sphinx/util/parallel.py b/sphinx/util/parallel.py
new file mode 100644
index 0000000..0afdff9
--- /dev/null
+++ b/sphinx/util/parallel.py
@@ -0,0 +1,154 @@
+"""Parallel building utilities."""
+
+from __future__ import annotations
+
+import os
+import time
+import traceback
+from math import sqrt
+from typing import TYPE_CHECKING, Any, Callable
+
+try:
+ import multiprocessing
+ HAS_MULTIPROCESSING = True
+except ImportError:
+ HAS_MULTIPROCESSING = False
+
+from sphinx.errors import SphinxParallelError
+from sphinx.util import logging
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+logger = logging.getLogger(__name__)
+
+# our parallel functionality only works for the forking Process
+parallel_available = multiprocessing and os.name == 'posix'
+
+
+class SerialTasks:
+ """Has the same interface as ParallelTasks, but executes tasks directly."""
+
+ def __init__(self, nproc: int = 1) -> None:
+ pass
+
+ def add_task(
+ self, task_func: Callable, arg: Any = None, result_func: Callable | None = None,
+ ) -> None:
+ if arg is not None:
+ res = task_func(arg)
+ else:
+ res = task_func()
+ if result_func:
+ result_func(res)
+
+ def join(self) -> None:
+ pass
+
+
+class ParallelTasks:
+ """Executes *nproc* tasks in parallel after forking."""
+
+ def __init__(self, nproc: int) -> None:
+ self.nproc = nproc
+ # (optional) function performed by each task on the result of main task
+ self._result_funcs: dict[int, Callable] = {}
+ # task arguments
+ self._args: dict[int, list[Any] | None] = {}
+ # list of subprocesses (both started and waiting)
+ self._procs: dict[int, Any] = {}
+ # list of receiving pipe connections of running subprocesses
+ self._precvs: dict[int, Any] = {}
+ # list of receiving pipe connections of waiting subprocesses
+ self._precvsWaiting: dict[int, Any] = {}
+ # number of working subprocesses
+ self._pworking = 0
+ # task number of each subprocess
+ self._taskid = 0
+
+ def _process(self, pipe: Any, func: Callable, arg: Any) -> None:
+ try:
+ collector = logging.LogCollector()
+ with collector.collect():
+ if arg is None:
+ ret = func()
+ else:
+ ret = func(arg)
+ failed = False
+ except BaseException as err:
+ failed = True
+ errmsg = traceback.format_exception_only(err.__class__, err)[0].strip()
+ ret = (errmsg, traceback.format_exc())
+ logging.convert_serializable(collector.logs)
+ pipe.send((failed, collector.logs, ret))
+
+ def add_task(
+ self, task_func: Callable, arg: Any = None, result_func: Callable | None = None,
+ ) -> None:
+ tid = self._taskid
+ self._taskid += 1
+ self._result_funcs[tid] = result_func or (lambda arg, result: None)
+ self._args[tid] = arg
+ precv, psend = multiprocessing.Pipe(False)
+ context: Any = multiprocessing.get_context('fork')
+ proc = context.Process(target=self._process, args=(psend, task_func, arg))
+ self._procs[tid] = proc
+ self._precvsWaiting[tid] = precv
+ self._join_one()
+
+ def join(self) -> None:
+ try:
+ while self._pworking:
+ if not self._join_one():
+ time.sleep(0.02)
+ finally:
+ # shutdown other child processes on failure
+ self.terminate()
+
+ def terminate(self) -> None:
+ for tid in list(self._precvs):
+ self._procs[tid].terminate()
+ self._result_funcs.pop(tid)
+ self._procs.pop(tid)
+ self._precvs.pop(tid)
+ self._pworking -= 1
+
+ def _join_one(self) -> bool:
+ joined_any = False
+ for tid, pipe in self._precvs.items():
+ if pipe.poll():
+ exc, logs, result = pipe.recv()
+ if exc:
+ raise SphinxParallelError(*result)
+ for log in logs:
+ logger.handle(log)
+ self._result_funcs.pop(tid)(self._args.pop(tid), result)
+ self._procs[tid].join()
+ self._precvs.pop(tid)
+ self._pworking -= 1
+ joined_any = True
+ break
+
+ while self._precvsWaiting and self._pworking < self.nproc:
+ newtid, newprecv = self._precvsWaiting.popitem()
+ self._precvs[newtid] = newprecv
+ self._procs[newtid].start()
+ self._pworking += 1
+
+ return joined_any
+
+
+def make_chunks(arguments: Sequence[str], nproc: int, maxbatch: int = 10) -> list[Any]:
+ # determine how many documents to read in one go
+ nargs = len(arguments)
+ chunksize = nargs // nproc
+ if chunksize >= maxbatch:
+ # try to improve batch size vs. number of batches
+ chunksize = int(sqrt(nargs / nproc * maxbatch))
+ if chunksize == 0:
+ chunksize = 1
+ nchunks, rest = divmod(nargs, chunksize)
+ if rest:
+ nchunks += 1
+ # partition documents in "chunks" that will be written by one Process
+ return [arguments[i * chunksize:(i + 1) * chunksize] for i in range(nchunks)]
diff --git a/sphinx/util/png.py b/sphinx/util/png.py
new file mode 100644
index 0000000..6c94219
--- /dev/null
+++ b/sphinx/util/png.py
@@ -0,0 +1,43 @@
+"""PNG image manipulation helpers."""
+
+from __future__ import annotations
+
+import binascii
+import struct
+
+LEN_IEND = 12
+LEN_DEPTH = 22
+
+DEPTH_CHUNK_LEN = struct.pack('!i', 10)
+DEPTH_CHUNK_START = b'tEXtDepth\x00'
+IEND_CHUNK = b'\x00\x00\x00\x00IEND\xAE\x42\x60\x82'
+
+
+def read_png_depth(filename: str) -> int | None:
+ """Read the special tEXt chunk indicating the depth from a PNG file."""
+ with open(filename, 'rb') as f:
+ f.seek(- (LEN_IEND + LEN_DEPTH), 2)
+ depthchunk = f.read(LEN_DEPTH)
+ if not depthchunk.startswith(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START):
+ # either not a PNG file or not containing the depth chunk
+ return None
+ else:
+ return struct.unpack('!i', depthchunk[14:18])[0]
+
+
+def write_png_depth(filename: str, depth: int) -> None:
+ """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)
+ with open(filename, 'r+b') as f:
+ # seek to the beginning of the IEND chunk
+ f.seek(-LEN_IEND, 2)
+ # overwrite it with the depth chunk
+ f.write(DEPTH_CHUNK_LEN + DEPTH_CHUNK_START + data)
+ # calculate the checksum over chunk name and data
+ crc = binascii.crc32(DEPTH_CHUNK_START + data) & 0xffffffff
+ f.write(struct.pack('!I', crc))
+ # replace the IEND chunk
+ f.write(IEND_CHUNK)
diff --git a/sphinx/util/requests.py b/sphinx/util/requests.py
new file mode 100644
index 0000000..ec3d8d2
--- /dev/null
+++ b/sphinx/util/requests.py
@@ -0,0 +1,73 @@
+"""Simple requests package loader"""
+
+from __future__ import annotations
+
+import warnings
+from typing import Any
+from urllib.parse import urlsplit
+
+import requests
+from urllib3.exceptions import InsecureRequestWarning
+
+import sphinx
+
+_USER_AGENT = (f'Mozilla/5.0 (X11; Linux x86_64; rv:100.0) Gecko/20100101 Firefox/100.0 '
+ f'Sphinx/{sphinx.__version__}')
+
+
+def _get_tls_cacert(url: str, certs: str | dict[str, str] | None) -> str | bool:
+ """Get additional CA cert for a specific URL."""
+ if not certs:
+ return True
+ elif isinstance(certs, (str, tuple)):
+ return certs
+ else:
+ hostname = urlsplit(url).netloc
+ if '@' in hostname:
+ _, hostname = hostname.split('@', 1)
+
+ return certs.get(hostname, True)
+
+
+def get(url: str, **kwargs: Any) -> requests.Response:
+ """Sends a GET request like requests.get().
+
+ This sets up User-Agent header and TLS verification automatically."""
+ with _Session() as session:
+ return session.get(url, **kwargs)
+
+
+def head(url: str, **kwargs: Any) -> requests.Response:
+ """Sends a HEAD request like requests.head().
+
+ This sets up User-Agent header and TLS verification automatically."""
+ with _Session() as session:
+ return session.head(url, **kwargs)
+
+
+class _Session(requests.Session):
+ def request( # type: ignore[override]
+ self, method: str, url: str,
+ _user_agent: str = '',
+ _tls_info: tuple[bool, str | dict[str, str] | None] = (), # type: ignore[assignment]
+ **kwargs: Any,
+ ) -> requests.Response:
+ """Sends a request with an HTTP verb and url.
+
+ This sets up User-Agent header and TLS verification automatically."""
+ headers = kwargs.setdefault('headers', {})
+ headers.setdefault('User-Agent', _user_agent or _USER_AGENT)
+ if _tls_info:
+ tls_verify, tls_cacerts = _tls_info
+ verify = bool(kwargs.get('verify', tls_verify))
+ kwargs.setdefault('verify', verify and _get_tls_cacert(url, tls_cacerts))
+ else:
+ verify = kwargs.get('verify', True)
+
+ if verify:
+ return super().request(method, url, **kwargs)
+
+ with warnings.catch_warnings():
+ # ignore InsecureRequestWarning if verify=False
+ warnings.filterwarnings("ignore", category=InsecureRequestWarning)
+ return super().request(method, url, **kwargs)
diff --git a/sphinx/util/rst.py b/sphinx/util/rst.py
new file mode 100644
index 0000000..1e8fd66
--- /dev/null
+++ b/sphinx/util/rst.py
@@ -0,0 +1,110 @@
+"""reST helper functions."""
+
+from __future__ import annotations
+
+import re
+from collections import defaultdict
+from contextlib import contextmanager
+from typing import TYPE_CHECKING
+from unicodedata import east_asian_width
+
+from docutils.parsers.rst import roles
+from docutils.parsers.rst.languages import en as english
+from docutils.parsers.rst.states import Body
+from docutils.utils import Reporter
+from jinja2 import Environment, pass_environment
+
+from sphinx.locale import __
+from sphinx.util import docutils, logging
+
+if TYPE_CHECKING:
+ from collections.abc import Generator
+
+ from docutils.statemachine import StringList
+
+logger = logging.getLogger(__name__)
+
+FIELD_NAME_RE = re.compile(Body.patterns['field_marker'])
+symbols_re = re.compile(r'([!-\-/:-@\[-`{-~])') # symbols without dot(0x2e)
+SECTIONING_CHARS = ['=', '-', '~']
+
+# width of characters
+WIDECHARS: dict[str, str] = defaultdict(lambda: "WF") # WF: Wide + Full-width
+WIDECHARS["ja"] = "WFA" # In Japanese, Ambiguous characters also have double width
+
+
+def escape(text: str) -> str:
+ text = symbols_re.sub(r'\\\1', text)
+ text = re.sub(r'^\.', r'\.', text) # escape a dot at top
+ return text
+
+
+def textwidth(text: str, widechars: str = 'WF') -> int:
+ """Get width of text."""
+ def charwidth(char: str, widechars: str) -> int:
+ if east_asian_width(char) in widechars:
+ return 2
+ else:
+ return 1
+
+ return sum(charwidth(c, widechars) for c in text)
+
+
+@pass_environment
+def heading(env: Environment, text: str, level: int = 1) -> str:
+ """Create a heading for *level*."""
+ assert level <= 3
+ width = textwidth(text, WIDECHARS[env.language])
+ sectioning_char = SECTIONING_CHARS[level - 1]
+ return f'{text}\n{sectioning_char * width}'
+
+
+@contextmanager
+def default_role(docname: str, name: str) -> Generator[None, None, None]:
+ if name:
+ dummy_reporter = Reporter('', 4, 4)
+ role_fn, _ = roles.role(name, english, 0, dummy_reporter)
+ if role_fn: # type: ignore[truthy-function]
+ docutils.register_role('', role_fn) # type: ignore[arg-type]
+ else:
+ logger.warning(__('default role %s not found'), name, location=docname)
+
+ yield
+
+ docutils.unregister_role('')
+
+
+def prepend_prolog(content: StringList, prolog: str) -> None:
+ """Prepend a string to content body as prolog."""
+ if prolog:
+ pos = 0
+ for line in content:
+ if FIELD_NAME_RE.match(line):
+ pos += 1
+ else:
+ break
+
+ if pos > 0:
+ # insert a blank line after docinfo
+ content.insert(pos, '', '<generated>', 0)
+ pos += 1
+
+ # insert prolog (after docinfo if exists)
+ lineno = 0
+ for lineno, line in enumerate(prolog.splitlines()):
+ content.insert(pos + lineno, line, '<rst_prolog>', lineno)
+
+ content.insert(pos + lineno + 1, '', '<generated>', 0)
+
+
+def append_epilog(content: StringList, epilog: str) -> None:
+ """Append a string to content body as epilog."""
+ if epilog:
+ if len(content) > 0:
+ source, lineno = content.info(-1)
+ else:
+ source = '<generated>'
+ lineno = 0
+ content.append('', source, lineno + 1)
+ for lineno, line in enumerate(epilog.splitlines()):
+ content.append(line, '<rst_epilog>', lineno)
diff --git a/sphinx/util/tags.py b/sphinx/util/tags.py
new file mode 100644
index 0000000..73e1a83
--- /dev/null
+++ b/sphinx/util/tags.py
@@ -0,0 +1,88 @@
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
+
+from jinja2 import nodes
+from jinja2.environment import Environment
+from jinja2.parser import Parser
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from jinja2.nodes import Node
+
+
+env = Environment()
+
+
+class BooleanParser(Parser):
+ """
+ Only allow condition exprs and/or/not operations.
+ """
+
+ def parse_compare(self) -> Node:
+ node: Node
+ token = self.stream.current
+ if token.type == 'name':
+ if token.value in ('true', 'false', 'True', 'False'):
+ node = nodes.Const(token.value in ('true', 'True'),
+ lineno=token.lineno)
+ elif token.value in ('none', 'None'):
+ node = nodes.Const(None, lineno=token.lineno)
+ else:
+ node = nodes.Name(token.value, 'load', lineno=token.lineno)
+ next(self.stream)
+ elif token.type == 'lparen':
+ next(self.stream)
+ node = self.parse_expression()
+ self.stream.expect('rparen')
+ else:
+ self.fail(f"unexpected token '{token}'", token.lineno)
+ return node
+
+
+class Tags:
+ def __init__(self, tags: list[str] | None = None) -> None:
+ self.tags = dict.fromkeys(tags or [], True)
+
+ def has(self, tag: str) -> bool:
+ return tag in self.tags
+
+ __contains__ = has
+
+ def __iter__(self) -> Iterator[str]:
+ return iter(self.tags)
+
+ def add(self, tag: str) -> None:
+ self.tags[tag] = True
+
+ def remove(self, tag: str) -> None:
+ self.tags.pop(tag, None)
+
+ def eval_condition(self, condition: str) -> bool:
+ # exceptions are handled by the caller
+ parser = BooleanParser(env, condition, state='variable')
+ expr = parser.parse_expression()
+ if not parser.stream.eos:
+ msg = 'chunk after expression'
+ raise ValueError(msg)
+
+ def eval_node(node: Node) -> bool:
+ if isinstance(node, nodes.CondExpr):
+ if eval_node(node.test):
+ return eval_node(node.expr1)
+ else:
+ return eval_node(node.expr2)
+ elif isinstance(node, nodes.And):
+ return eval_node(node.left) and eval_node(node.right)
+ elif isinstance(node, nodes.Or):
+ return eval_node(node.left) or eval_node(node.right)
+ elif isinstance(node, nodes.Not):
+ return not eval_node(node.node)
+ elif isinstance(node, nodes.Name):
+ return self.tags.get(node.name, False)
+ else:
+ msg = 'invalid node, check parsing'
+ raise ValueError(msg)
+
+ return eval_node(expr)
diff --git a/sphinx/util/template.py b/sphinx/util/template.py
new file mode 100644
index 0000000..a16a7a1
--- /dev/null
+++ b/sphinx/util/template.py
@@ -0,0 +1,135 @@
+"""Templates utility functions for Sphinx."""
+
+from __future__ import annotations
+
+import os
+from functools import partial
+from os import path
+from typing import TYPE_CHECKING, Any, Callable
+
+from jinja2 import TemplateNotFound
+from jinja2.loaders import BaseLoader
+from jinja2.sandbox import SandboxedEnvironment
+
+from sphinx import package_dir
+from sphinx.jinja2glue import SphinxFileSystemLoader
+from sphinx.locale import get_translator
+from sphinx.util import rst, texescape
+
+if TYPE_CHECKING:
+ from collections.abc import Sequence
+
+ from jinja2.environment import Environment
+
+
+class BaseRenderer:
+ def __init__(self, loader: BaseLoader | None = None) -> None:
+ self.env = SandboxedEnvironment(loader=loader, extensions=['jinja2.ext.i18n'])
+ self.env.filters['repr'] = repr
+ self.env.install_gettext_translations(get_translator())
+
+ def render(self, template_name: str, context: dict[str, Any]) -> str:
+ return self.env.get_template(template_name).render(context)
+
+ def render_string(self, source: str, context: dict[str, Any]) -> str:
+ return self.env.from_string(source).render(context)
+
+
+class FileRenderer(BaseRenderer):
+ def __init__(self, search_path: Sequence[str | os.PathLike[str]]) -> None:
+ if isinstance(search_path, (str, os.PathLike)):
+ search_path = [search_path]
+ else:
+ # filter "None" paths
+ search_path = list(filter(None, search_path))
+
+ loader = SphinxFileSystemLoader(search_path)
+ super().__init__(loader)
+
+ @classmethod
+ def render_from_file(cls, filename: str, context: dict[str, Any]) -> str:
+ dirname = os.path.dirname(filename)
+ basename = os.path.basename(filename)
+ return cls(dirname).render(basename, context)
+
+
+class SphinxRenderer(FileRenderer):
+ def __init__(self, template_path: Sequence[str | os.PathLike[str]] | None = None) -> None:
+ if template_path is None:
+ template_path = os.path.join(package_dir, 'templates')
+ super().__init__(template_path)
+
+ @classmethod
+ def render_from_file(cls, filename: str, context: dict[str, Any]) -> str:
+ return FileRenderer.render_from_file(filename, context)
+
+
+class LaTeXRenderer(SphinxRenderer):
+ def __init__(self, template_path: Sequence[str | os.PathLike[str]] | None = None,
+ latex_engine: str | None = None) -> None:
+ if template_path is None:
+ template_path = [os.path.join(package_dir, 'templates', 'latex')]
+ super().__init__(template_path)
+
+ # use texescape as escape filter
+ escape = partial(texescape.escape, latex_engine=latex_engine)
+ self.env.filters['e'] = escape
+ self.env.filters['escape'] = escape
+ self.env.filters['eabbr'] = texescape.escape_abbr
+
+ # use JSP/eRuby like tagging instead because curly bracket; the default
+ # tagging of jinja2 is not good for LaTeX sources.
+ self.env.variable_start_string = '<%='
+ self.env.variable_end_string = '%>'
+ self.env.block_start_string = '<%'
+ self.env.block_end_string = '%>'
+ self.env.comment_start_string = '<#'
+ self.env.comment_end_string = '#>'
+
+
+class ReSTRenderer(SphinxRenderer):
+ def __init__(self, template_path: Sequence[str | os.PathLike[str]] | None = None,
+ language: str | None = None) -> None:
+ super().__init__(template_path)
+
+ # add language to environment
+ self.env.extend(language=language)
+
+ # use texescape as escape filter
+ self.env.filters['e'] = rst.escape
+ self.env.filters['escape'] = rst.escape
+ self.env.filters['heading'] = rst.heading
+
+
+class SphinxTemplateLoader(BaseLoader):
+ """A loader supporting template inheritance"""
+
+ def __init__(self, confdir: str | os.PathLike[str],
+ templates_paths: Sequence[str | os.PathLike[str]],
+ system_templates_paths: Sequence[str | os.PathLike[str]]) -> None:
+ self.loaders = []
+ self.sysloaders = []
+
+ for templates_path in templates_paths:
+ loader = SphinxFileSystemLoader(path.join(confdir, templates_path))
+ self.loaders.append(loader)
+
+ for templates_path in system_templates_paths:
+ loader = SphinxFileSystemLoader(templates_path)
+ self.loaders.append(loader)
+ self.sysloaders.append(loader)
+
+ def get_source(self, environment: Environment, template: str) -> tuple[str, str, Callable]:
+ if template.startswith('!'):
+ # search a template from ``system_templates_paths``
+ loaders = self.sysloaders
+ template = template[1:]
+ else:
+ loaders = self.loaders
+
+ for loader in loaders:
+ try:
+ return loader.get_source(environment, template)
+ except TemplateNotFound:
+ pass
+ raise TemplateNotFound(template)
diff --git a/sphinx/util/texescape.py b/sphinx/util/texescape.py
new file mode 100644
index 0000000..8527441
--- /dev/null
+++ b/sphinx/util/texescape.py
@@ -0,0 +1,153 @@
+"""TeX escaping helper."""
+
+from __future__ import annotations
+
+import re
+
+tex_replacements = [
+ # map TeX special chars
+ ('$', r'\$'),
+ ('%', r'\%'),
+ ('&', r'\&'),
+ ('#', r'\#'),
+ ('_', r'\_'),
+ ('{', r'\{'),
+ ('}', r'\}'),
+ ('\\', r'\textbackslash{}'),
+ ('~', r'\textasciitilde{}'),
+ ('^', r'\textasciicircum{}'),
+ # map chars to avoid mis-interpretation in LaTeX
+ ('[', r'{[}'),
+ (']', r'{]}'),
+ # map special Unicode characters to TeX commands
+ ('✓', r'\(\checkmark\)'),
+ ('✔', r'\(\pmb{\checkmark}\)'),
+ ('✕', r'\(\times\)'),
+ ('✖', r'\(\pmb{\times}\)'),
+ # used to separate -- in options
+ ('', r'{}'),
+ # map some special Unicode characters to similar ASCII ones
+ # (even for Unicode LaTeX as may not be supported by OpenType font)
+ ('⎽', r'\_'),
+ ('ℯ', r'e'),
+ ('â…ˆ', r'i'),
+ # Greek alphabet not escaped: pdflatex handles it via textalpha and inputenc
+ # OHM SIGN U+2126 is handled by LaTeX textcomp package
+]
+
+# A map to avoid TeX ligatures or character replacements in PDF output
+# xelatex/lualatex/uplatex are handled differently (#5790, #6888)
+ascii_tex_replacements = [
+ # Note: the " renders curly in OT1 encoding but straight in T1, T2A, LY1...
+ # escaping it to \textquotedbl would break documents using OT1
+ # Sphinx does \shorthandoff{"} to avoid problems with some languages
+ # There is no \text... LaTeX escape for the hyphen character -
+ ('-', r'\sphinxhyphen{}'), # -- and --- are TeX ligatures
+ # ,, is a TeX ligature in T1 encoding, but escaping the comma adds
+ # complications (whether by {}, or a macro) and is not done
+ # the next two require textcomp package
+ ("'", r'\textquotesingle{}'), # else ' renders curly, and '' is a ligature
+ ('`', r'\textasciigrave{}'), # else \` and \`\` render curly
+ ('<', r'\textless{}'), # < is inv. exclam in OT1, << is a T1-ligature
+ ('>', r'\textgreater{}'), # > is inv. quest. mark in 0T1, >> a T1-ligature
+]
+
+# A map Unicode characters to LaTeX representation
+# (for LaTeX engines which don't support unicode)
+unicode_tex_replacements = [
+ # map some more common Unicode characters to TeX commands
+ ('¶', r'\P{}'),
+ ('§', r'\S{}'),
+ ('€', r'\texteuro{}'),
+ ('∞', r'\(\infty\)'),
+ ('±', r'\(\pm\)'),
+ ('→', r'\(\rightarrow\)'),
+ ('‣', r'\(\rightarrow\)'),
+ ('–', r'\textendash{}'),
+ # superscript
+ ('â°', r'\(\sp{\text{0}}\)'),
+ ('¹', r'\(\sp{\text{1}}\)'),
+ ('²', r'\(\sp{\text{2}}\)'),
+ ('³', r'\(\sp{\text{3}}\)'),
+ ('â´', r'\(\sp{\text{4}}\)'),
+ ('âµ', r'\(\sp{\text{5}}\)'),
+ ('â¶', r'\(\sp{\text{6}}\)'),
+ ('â·', r'\(\sp{\text{7}}\)'),
+ ('â¸', r'\(\sp{\text{8}}\)'),
+ ('â¹', r'\(\sp{\text{9}}\)'),
+ # subscript
+ ('â‚€', r'\(\sb{\text{0}}\)'),
+ ('â‚', r'\(\sb{\text{1}}\)'),
+ ('â‚‚', r'\(\sb{\text{2}}\)'),
+ ('₃', r'\(\sb{\text{3}}\)'),
+ ('â‚„', r'\(\sb{\text{4}}\)'),
+ ('â‚…', r'\(\sb{\text{5}}\)'),
+ ('₆', r'\(\sb{\text{6}}\)'),
+ ('₇', r'\(\sb{\text{7}}\)'),
+ ('₈', r'\(\sb{\text{8}}\)'),
+ ('₉', r'\(\sb{\text{9}}\)'),
+]
+
+# TODO: this should be called tex_idescape_map because its only use is in
+# sphinx.writers.latex.LaTeXTranslator.idescape()
+# %, {, }, \, #, and ~ are the only ones which must be replaced by _ character
+# It would be simpler to define it entirely here rather than in init().
+# Unicode replacements are superfluous, as idescape() uses backslashreplace
+tex_replace_map: dict[int, str] = {}
+
+_tex_escape_map: dict[int, str] = {}
+_tex_escape_map_without_unicode: dict[int, str] = {}
+_tex_hlescape_map: dict[int, str] = {}
+_tex_hlescape_map_without_unicode: dict[int, str] = {}
+
+
+def escape(s: str, latex_engine: str | None = None) -> str:
+ """Escape text for LaTeX output."""
+ if latex_engine in ('lualatex', 'xelatex'):
+ # unicode based LaTeX engine
+ return s.translate(_tex_escape_map_without_unicode)
+ else:
+ return s.translate(_tex_escape_map)
+
+
+def hlescape(s: str, latex_engine: str | None = None) -> str:
+ """Escape text for LaTeX highlighter."""
+ if latex_engine in ('lualatex', 'xelatex'):
+ # unicode based LaTeX engine
+ return s.translate(_tex_hlescape_map_without_unicode)
+ else:
+ return s.translate(_tex_hlescape_map)
+
+
+def escape_abbr(text: str) -> str:
+ """Adjust spacing after abbreviations. Works with @ letter or other."""
+ return re.sub(r'\.(?=\s|$)', r'.\@{}', text)
+
+
+def init() -> None:
+ for a, b in tex_replacements:
+ _tex_escape_map[ord(a)] = b
+ _tex_escape_map_without_unicode[ord(a)] = b
+ tex_replace_map[ord(a)] = '_'
+
+ # no reason to do this for _tex_escape_map_without_unicode
+ for a, b in ascii_tex_replacements:
+ _tex_escape_map[ord(a)] = b
+
+ # but the hyphen has a specific PDF bookmark problem
+ # https://github.com/latex3/hyperref/issues/112
+ _tex_escape_map_without_unicode[ord('-')] = r'\sphinxhyphen{}'
+
+ for a, b in unicode_tex_replacements:
+ _tex_escape_map[ord(a)] = b
+ # This is actually unneeded:
+ tex_replace_map[ord(a)] = '_'
+
+ for a, b in tex_replacements:
+ if a in '[]{}\\':
+ continue
+ _tex_hlescape_map[ord(a)] = b
+ _tex_hlescape_map_without_unicode[ord(a)] = b
+
+ for a, b in unicode_tex_replacements:
+ _tex_hlescape_map[ord(a)] = b
diff --git a/sphinx/util/typing.py b/sphinx/util/typing.py
new file mode 100644
index 0000000..171420d
--- /dev/null
+++ b/sphinx/util/typing.py
@@ -0,0 +1,402 @@
+"""The composite types for Sphinx."""
+
+from __future__ import annotations
+
+import sys
+import typing
+from collections.abc import Sequence
+from struct import Struct
+from types import TracebackType
+from typing import TYPE_CHECKING, Any, Callable, ForwardRef, TypeVar, Union
+
+from docutils import nodes
+from docutils.parsers.rst.states import Inliner
+
+if TYPE_CHECKING:
+ import enum
+
+try:
+ from types import UnionType # type: ignore[attr-defined] # python 3.10 or above
+except ImportError:
+ UnionType = None
+
+# classes that have incorrect __module__
+INVALID_BUILTIN_CLASSES = {
+ Struct: 'struct.Struct', # Struct.__module__ == '_struct'
+ TracebackType: 'types.TracebackType', # TracebackType.__module__ == 'builtins'
+}
+
+
+def is_invalid_builtin_class(obj: Any) -> bool:
+ """Check *obj* is an invalid built-in class."""
+ try:
+ return obj in INVALID_BUILTIN_CLASSES
+ except TypeError: # unhashable type
+ return False
+
+
+# Text like nodes which are initialized with text and rawsource
+TextlikeNode = Union[nodes.Text, nodes.TextElement]
+
+# type of None
+NoneType = type(None)
+
+# path matcher
+PathMatcher = Callable[[str], bool]
+
+# common role functions
+RoleFunction = Callable[[str, str, str, int, Inliner, dict[str, Any], Sequence[str]],
+ tuple[list[nodes.Node], list[nodes.system_message]]]
+
+# A option spec for directive
+OptionSpec = dict[str, Callable[[str], Any]]
+
+# title getter functions for enumerable nodes (see sphinx.domains.std)
+TitleGetter = Callable[[nodes.Node], str]
+
+# inventory data on memory
+InventoryItem = tuple[
+ str, # project name
+ str, # project version
+ str, # URL
+ str, # display name
+]
+Inventory = dict[str, dict[str, InventoryItem]]
+
+
+def get_type_hints(
+ obj: Any, globalns: dict[str, Any] | None = None, localns: dict[str, Any] | None = None,
+) -> dict[str, Any]:
+ """Return a dictionary containing type hints for a function, method, module or class
+ object.
+
+ This is a simple wrapper of `typing.get_type_hints()` that does not raise an error on
+ runtime.
+ """
+ from sphinx.util.inspect import safe_getattr # lazy loading
+
+ try:
+ return typing.get_type_hints(obj, globalns, localns)
+ except NameError:
+ # Failed to evaluate ForwardRef (maybe TYPE_CHECKING)
+ return safe_getattr(obj, '__annotations__', {})
+ except AttributeError:
+ # Failed to evaluate ForwardRef (maybe not runtime checkable)
+ return safe_getattr(obj, '__annotations__', {})
+ except TypeError:
+ # Invalid object is given. But try to get __annotations__ as a fallback.
+ return safe_getattr(obj, '__annotations__', {})
+ except KeyError:
+ # a broken class found (refs: https://github.com/sphinx-doc/sphinx/issues/8084)
+ return {}
+
+
+def is_system_TypeVar(typ: Any) -> bool:
+ """Check *typ* is system defined TypeVar."""
+ modname = getattr(typ, '__module__', '')
+ return modname == 'typing' and isinstance(typ, TypeVar)
+
+
+def restify(cls: type | None, mode: str = 'fully-qualified-except-typing') -> str:
+ """Convert python class to a reST reference.
+
+ :param mode: Specify a method how annotations will be stringified.
+
+ 'fully-qualified-except-typing'
+ Show the module name and qualified name of the annotation except
+ the "typing" module.
+ 'smart'
+ Show the name of the annotation.
+ """
+ from sphinx.ext.autodoc.mock import ismock, ismockmodule # lazy loading
+ from sphinx.util import inspect # lazy loading
+
+ if mode == 'smart':
+ modprefix = '~'
+ else:
+ modprefix = ''
+
+ try:
+ if cls is None or cls is NoneType:
+ return ':py:obj:`None`'
+ elif cls is Ellipsis:
+ return '...'
+ elif isinstance(cls, str):
+ return cls
+ elif ismockmodule(cls):
+ return f':py:class:`{modprefix}{cls.__name__}`'
+ elif ismock(cls):
+ return f':py:class:`{modprefix}{cls.__module__}.{cls.__name__}`'
+ elif is_invalid_builtin_class(cls):
+ return f':py:class:`{modprefix}{INVALID_BUILTIN_CLASSES[cls]}`'
+ elif inspect.isNewType(cls):
+ if sys.version_info[:2] >= (3, 10):
+ # newtypes have correct module info since Python 3.10+
+ return f':py:class:`{modprefix}{cls.__module__}.{cls.__name__}`'
+ else:
+ return ':py:class:`%s`' % cls.__name__
+ elif UnionType and isinstance(cls, UnionType):
+ if len(cls.__args__) > 1 and None in cls.__args__:
+ args = ' | '.join(restify(a, mode) for a in cls.__args__ if a)
+ return 'Optional[%s]' % args
+ else:
+ return ' | '.join(restify(a, mode) for a in cls.__args__)
+ elif cls.__module__ in ('__builtin__', 'builtins'):
+ if hasattr(cls, '__args__'):
+ if not cls.__args__: # Empty tuple, list, ...
+ return fr':py:class:`{cls.__name__}`\ [{cls.__args__!r}]'
+
+ concatenated_args = ', '.join(restify(arg, mode) for arg in cls.__args__)
+ return fr':py:class:`{cls.__name__}`\ [{concatenated_args}]'
+ else:
+ return ':py:class:`%s`' % cls.__name__
+ elif (inspect.isgenericalias(cls)
+ and cls.__module__ == 'typing'
+ and cls.__origin__ is Union): # type: ignore[attr-defined]
+ if (len(cls.__args__) > 1 # type: ignore[attr-defined]
+ and cls.__args__[-1] is NoneType): # type: ignore[attr-defined]
+ if len(cls.__args__) > 2: # type: ignore[attr-defined]
+ args = ', '.join(restify(a, mode)
+ for a in cls.__args__[:-1]) # type: ignore[attr-defined]
+ return ':py:obj:`~typing.Optional`\\ [:obj:`~typing.Union`\\ [%s]]' % args
+ else:
+ return ':py:obj:`~typing.Optional`\\ [%s]' % restify(
+ cls.__args__[0], mode) # type: ignore[attr-defined]
+ else:
+ args = ', '.join(restify(a, mode)
+ for a in cls.__args__) # type: ignore[attr-defined]
+ return ':py:obj:`~typing.Union`\\ [%s]' % args
+ elif inspect.isgenericalias(cls):
+ if isinstance(cls.__origin__, typing._SpecialForm): # type: ignore[attr-defined]
+ text = restify(cls.__origin__, mode) # type: ignore[attr-defined,arg-type]
+ elif getattr(cls, '_name', None):
+ cls_name = cls._name # type: ignore[attr-defined]
+ if cls.__module__ == 'typing':
+ text = f':py:class:`~{cls.__module__}.{cls_name}`'
+ else:
+ text = f':py:class:`{modprefix}{cls.__module__}.{cls_name}`'
+ else:
+ text = restify(cls.__origin__, mode) # type: ignore[attr-defined]
+
+ origin = getattr(cls, '__origin__', None)
+ if not hasattr(cls, '__args__'): # NoQA: SIM114
+ pass
+ elif all(is_system_TypeVar(a) for a in cls.__args__):
+ # Suppress arguments if all system defined TypeVars (ex. Dict[KT, VT])
+ pass
+ elif (cls.__module__ == 'typing'
+ and cls._name == 'Callable'): # type: ignore[attr-defined]
+ args = ', '.join(restify(a, mode) for a in cls.__args__[:-1])
+ text += fr"\ [[{args}], {restify(cls.__args__[-1], mode)}]"
+ elif cls.__module__ == 'typing' and getattr(origin, '_name', None) == 'Literal':
+ literal_args = []
+ for a in cls.__args__:
+ if inspect.isenumattribute(a):
+ literal_args.append(_format_literal_enum_arg(a, mode=mode))
+ else:
+ literal_args.append(repr(a))
+ text += r"\ [%s]" % ', '.join(literal_args)
+ del literal_args
+ elif cls.__args__:
+ text += r"\ [%s]" % ", ".join(restify(a, mode) for a in cls.__args__)
+
+ return text
+ elif isinstance(cls, typing._SpecialForm):
+ return f':py:obj:`~{cls.__module__}.{cls._name}`' # type: ignore[attr-defined]
+ elif sys.version_info[:2] >= (3, 11) and cls is typing.Any:
+ # handle bpo-46998
+ return f':py:obj:`~{cls.__module__}.{cls.__name__}`'
+ elif hasattr(cls, '__qualname__'):
+ if cls.__module__ == 'typing':
+ return f':py:class:`~{cls.__module__}.{cls.__qualname__}`'
+ else:
+ return f':py:class:`{modprefix}{cls.__module__}.{cls.__qualname__}`'
+ elif isinstance(cls, ForwardRef):
+ return ':py:class:`%s`' % cls.__forward_arg__
+ else:
+ # not a class (ex. TypeVar)
+ if cls.__module__ == 'typing':
+ return f':py:obj:`~{cls.__module__}.{cls.__name__}`'
+ else:
+ return f':py:obj:`{modprefix}{cls.__module__}.{cls.__name__}`'
+ except (AttributeError, TypeError):
+ return inspect.object_description(cls)
+
+
+def stringify_annotation(
+ annotation: Any,
+ /,
+ mode: str = 'fully-qualified-except-typing',
+) -> str:
+ """Stringify type annotation object.
+
+ :param annotation: The annotation to stringified.
+ :param mode: Specify a method how annotations will be stringified.
+
+ 'fully-qualified-except-typing'
+ Show the module name and qualified name of the annotation except
+ the "typing" module.
+ 'smart'
+ Show the name of the annotation.
+ 'fully-qualified'
+ Show the module name and qualified name of the annotation.
+ """
+ from sphinx.ext.autodoc.mock import ismock, ismockmodule # lazy loading
+ from sphinx.util.inspect import isNewType # lazy loading
+
+ if mode not in {'fully-qualified-except-typing', 'fully-qualified', 'smart'}:
+ msg = ("'mode' must be one of 'fully-qualified-except-typing', "
+ f"'fully-qualified', or 'smart'; got {mode!r}.")
+ raise ValueError(msg)
+
+ if mode == 'smart':
+ module_prefix = '~'
+ else:
+ module_prefix = ''
+
+ annotation_qualname = getattr(annotation, '__qualname__', '')
+ annotation_module = getattr(annotation, '__module__', '')
+ annotation_name = getattr(annotation, '__name__', '')
+ annotation_module_is_typing = annotation_module == 'typing'
+
+ if isinstance(annotation, str):
+ if annotation.startswith("'") and annotation.endswith("'"):
+ # might be a double Forward-ref'ed type. Go unquoting.
+ return annotation[1:-1]
+ else:
+ return annotation
+ elif isinstance(annotation, TypeVar):
+ if annotation_module_is_typing and mode in {'fully-qualified-except-typing', 'smart'}:
+ return annotation_name
+ else:
+ return module_prefix + f'{annotation_module}.{annotation_name}'
+ elif isNewType(annotation):
+ if sys.version_info[:2] >= (3, 10):
+ # newtypes have correct module info since Python 3.10+
+ return module_prefix + f'{annotation_module}.{annotation_name}'
+ else:
+ return annotation_name
+ elif not annotation:
+ return repr(annotation)
+ elif annotation is NoneType:
+ return 'None'
+ elif ismockmodule(annotation):
+ return module_prefix + annotation_name
+ elif ismock(annotation):
+ return module_prefix + f'{annotation_module}.{annotation_name}'
+ elif is_invalid_builtin_class(annotation):
+ return module_prefix + INVALID_BUILTIN_CLASSES[annotation]
+ elif str(annotation).startswith('typing.Annotated'): # for py310+
+ pass
+ elif annotation_module == 'builtins' and annotation_qualname:
+ if (args := getattr(annotation, '__args__', None)) is not None: # PEP 585 generic
+ if not args: # Empty tuple, list, ...
+ return repr(annotation)
+
+ concatenated_args = ', '.join(stringify_annotation(arg, mode) for arg in args)
+ return f'{annotation_qualname}[{concatenated_args}]'
+ else:
+ return annotation_qualname
+ elif annotation is Ellipsis:
+ return '...'
+
+ module_prefix = f'{annotation_module}.'
+ annotation_forward_arg = getattr(annotation, '__forward_arg__', None)
+ if annotation_qualname or (annotation_module_is_typing and not annotation_forward_arg):
+ if mode == 'smart':
+ module_prefix = '~' + module_prefix
+ if annotation_module_is_typing and mode == 'fully-qualified-except-typing':
+ module_prefix = ''
+ else:
+ module_prefix = ''
+
+ if annotation_module_is_typing:
+ if annotation_forward_arg:
+ # handle ForwardRefs
+ qualname = annotation_forward_arg
+ else:
+ _name = getattr(annotation, '_name', '')
+ if _name:
+ qualname = _name
+ elif annotation_qualname:
+ qualname = annotation_qualname
+ else:
+ qualname = stringify_annotation(
+ annotation.__origin__, 'fully-qualified-except-typing',
+ ).replace('typing.', '') # ex. Union
+ elif annotation_qualname:
+ qualname = annotation_qualname
+ elif hasattr(annotation, '__origin__'):
+ # instantiated generic provided by a user
+ qualname = stringify_annotation(annotation.__origin__, mode)
+ elif UnionType and isinstance(annotation, UnionType): # types.UnionType (for py3.10+)
+ qualname = 'types.UnionType'
+ else:
+ # we weren't able to extract the base type, appending arguments would
+ # only make them appear twice
+ return repr(annotation)
+
+ annotation_args = getattr(annotation, '__args__', None)
+ if annotation_args:
+ if not isinstance(annotation_args, (list, tuple)):
+ # broken __args__ found
+ pass
+ elif qualname in {'Optional', 'Union', 'types.UnionType'}:
+ return ' | '.join(stringify_annotation(a, mode) for a in annotation_args)
+ elif qualname == 'Callable':
+ args = ', '.join(stringify_annotation(a, mode) for a in annotation_args[:-1])
+ returns = stringify_annotation(annotation_args[-1], mode)
+ return f'{module_prefix}Callable[[{args}], {returns}]'
+ elif qualname == 'Literal':
+ from sphinx.util.inspect import isenumattribute # lazy loading
+
+ def format_literal_arg(arg):
+ if isenumattribute(arg):
+ enumcls = arg.__class__
+
+ if mode == 'smart':
+ # MyEnum.member
+ return f'{enumcls.__qualname__}.{arg.name}'
+
+ # module.MyEnum.member
+ return f'{enumcls.__module__}.{enumcls.__qualname__}.{arg.name}'
+ return repr(arg)
+
+ args = ', '.join(map(format_literal_arg, annotation_args))
+ return f'{module_prefix}Literal[{args}]'
+ elif str(annotation).startswith('typing.Annotated'): # for py39+
+ return stringify_annotation(annotation_args[0], mode)
+ elif all(is_system_TypeVar(a) for a in annotation_args):
+ # Suppress arguments if all system defined TypeVars (ex. Dict[KT, VT])
+ return module_prefix + qualname
+ else:
+ args = ', '.join(stringify_annotation(a, mode) for a in annotation_args)
+ return f'{module_prefix}{qualname}[{args}]'
+
+ return module_prefix + qualname
+
+
+def _format_literal_enum_arg(arg: enum.Enum, /, *, mode: str) -> str:
+ enum_cls = arg.__class__
+ if mode == 'smart' or enum_cls.__module__ == 'typing':
+ return f':py:attr:`~{enum_cls.__module__}.{enum_cls.__qualname__}.{arg.name}`'
+ else:
+ return f':py:attr:`{enum_cls.__module__}.{enum_cls.__qualname__}.{arg.name}`'
+
+
+# deprecated name -> (object to return, canonical path or empty string)
+_DEPRECATED_OBJECTS = {
+ 'stringify': (stringify_annotation, 'sphinx.util.typing.stringify_annotation'),
+}
+
+
+def __getattr__(name):
+ if name not in _DEPRECATED_OBJECTS:
+ msg = f'module {__name__!r} has no attribute {name!r}'
+ raise AttributeError(msg)
+
+ from sphinx.deprecation import _deprecation_warning
+
+ deprecated_object, canonical_name = _DEPRECATED_OBJECTS[name]
+ _deprecation_warning(__name__, name, canonical_name, remove=(8, 0))
+ return deprecated_object
diff --git a/sphinx/versioning.py b/sphinx/versioning.py
new file mode 100644
index 0000000..0da3b1e
--- /dev/null
+++ b/sphinx/versioning.py
@@ -0,0 +1,178 @@
+"""Implements the low-level algorithms Sphinx uses for versioning doctrees."""
+from __future__ import annotations
+
+import pickle
+from itertools import product, zip_longest
+from operator import itemgetter
+from os import path
+from typing import TYPE_CHECKING, Any
+from uuid import uuid4
+
+from sphinx.transforms import SphinxTransform
+
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
+ from docutils.nodes import Node
+
+ from sphinx.application import Sphinx
+
+try:
+ import Levenshtein
+ IS_SPEEDUP = True
+except ImportError:
+ IS_SPEEDUP = False
+
+# anything below that ratio is considered equal/changed
+VERSIONING_RATIO = 65
+
+
+def add_uids(doctree: Node, condition: Any) -> Iterator[Node]:
+ """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.findall(condition):
+ node.uid = uuid4().hex
+ yield node
+
+
+def merge_doctrees(old: Node, new: Node, condition: Any) -> Iterator[Node]:
+ """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.findall(condition)
+ new_iter = new.findall(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 not getattr(old_node, 'uid', None):
+ # maybe config.gettext_uuid has been changed.
+ old_node.uid = uuid4().hex
+ 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.items(), key=itemgetter(1)) # type: ignore[assignment]
+ 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: str, new: str) -> float:
+ """Return a "similarity 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
+
+ if IS_SPEEDUP:
+ return Levenshtein.distance(old, new) / (len(old) / 100.0)
+ else:
+ return levenshtein_distance(old, new) / (len(old) / 100.0)
+
+
+def levenshtein_distance(a: str, b: str) -> int:
+ """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 = list(range(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]
+
+
+class UIDTransform(SphinxTransform):
+ """Add UIDs to doctree for versioning."""
+ default_priority = 880
+
+ def apply(self, **kwargs: Any) -> None:
+ env = self.env
+ old_doctree = None
+ if not env.versioning_condition:
+ return
+
+ if env.versioning_compare:
+ # get old doctree
+ try:
+ filename = path.join(env.doctreedir, env.docname + '.doctree')
+ with open(filename, 'rb') as f:
+ old_doctree = pickle.load(f)
+ except OSError:
+ pass
+
+ # add uids for versioning
+ if not env.versioning_compare or old_doctree is None:
+ list(add_uids(self.document, env.versioning_condition))
+ else:
+ list(merge_doctrees(old_doctree, self.document, env.versioning_condition))
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.add_transform(UIDTransform)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/sphinx/writers/__init__.py b/sphinx/writers/__init__.py
new file mode 100644
index 0000000..e90088e
--- /dev/null
+++ b/sphinx/writers/__init__.py
@@ -0,0 +1 @@
+"""Custom docutils writers."""
diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py
new file mode 100644
index 0000000..99d47c9
--- /dev/null
+++ b/sphinx/writers/html.py
@@ -0,0 +1,44 @@
+"""docutils writers handling Sphinx' custom nodes."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, cast
+
+from docutils.writers.html4css1 import Writer
+
+from sphinx.util import logging
+from sphinx.writers.html5 import HTML5Translator
+
+if TYPE_CHECKING:
+ from sphinx.builders.html import StandaloneHTMLBuilder
+
+
+logger = logging.getLogger(__name__)
+HTMLTranslator = HTML5Translator
+
+# A good overview of the purpose behind these classes can be found here:
+# http://www.arnebrodowski.de/blog/write-your-own-restructuredtext-writer.html
+
+
+class HTMLWriter(Writer):
+
+ # override embed-stylesheet default value to False.
+ settings_default_overrides = {"embed_stylesheet": False}
+
+ def __init__(self, builder: StandaloneHTMLBuilder) -> None:
+ super().__init__()
+ self.builder = builder
+
+ def translate(self) -> None:
+ # sadly, this is mostly copied from parent class
+ visitor = self.builder.create_translator(self.document, self.builder)
+ self.visitor = cast(HTML5Translator, visitor)
+ self.document.walkabout(visitor)
+ self.output = self.visitor.astext()
+ for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix',
+ 'body_pre_docinfo', 'docinfo', 'body', 'fragment',
+ 'body_suffix', 'meta', 'title', 'subtitle', 'header',
+ 'footer', 'html_prolog', 'html_head', 'html_title',
+ 'html_subtitle', 'html_body'):
+ setattr(self, attr, getattr(visitor, attr, None))
+ self.clean_meta = ''.join(self.visitor.meta[2:])
diff --git a/sphinx/writers/html5.py b/sphinx/writers/html5.py
new file mode 100644
index 0000000..eb0a1ee
--- /dev/null
+++ b/sphinx/writers/html5.py
@@ -0,0 +1,936 @@
+"""Experimental docutils writers for HTML5 handling Sphinx's custom nodes."""
+
+from __future__ import annotations
+
+import os
+import posixpath
+import re
+import urllib.parse
+from collections.abc import Iterable
+from typing import TYPE_CHECKING, cast
+
+from docutils import nodes
+from docutils.writers.html5_polyglot import HTMLTranslator as BaseTranslator
+
+from sphinx import addnodes
+from sphinx.locale import _, __, admonitionlabels
+from sphinx.util import logging
+from sphinx.util.docutils import SphinxTranslator
+from sphinx.util.images import get_image_size
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node, Text
+
+ from sphinx.builders import Builder
+ from sphinx.builders.html import StandaloneHTMLBuilder
+
+
+logger = logging.getLogger(__name__)
+
+# A good overview of the purpose behind these classes can be found here:
+# http://www.arnebrodowski.de/blog/write-your-own-restructuredtext-writer.html
+
+
+def multiply_length(length: str, scale: int) -> str:
+ """Multiply *length* (width or height) by *scale*."""
+ matched = re.match(r'^(\d*\.?\d*)\s*(\S*)$', length)
+ if not matched:
+ return length
+ if scale == 100:
+ return length
+ amount, unit = matched.groups()
+ result = float(amount) * scale / 100
+ return f"{int(result)}{unit}"
+
+
+class HTML5Translator(SphinxTranslator, BaseTranslator):
+ """
+ Our custom HTML translator.
+ """
+
+ builder: StandaloneHTMLBuilder
+ # Override docutils.writers.html5_polyglot:HTMLTranslator
+ # otherwise, nodes like <inline classes="s">...</inline> will be
+ # converted to <s>...</s> by `visit_inline`.
+ supported_inline_tags: set[str] = set()
+
+ def __init__(self, document: nodes.document, builder: Builder) -> None:
+ super().__init__(document, builder)
+
+ self.highlighter = self.builder.highlighter
+ self.docnames = [self.builder.current_docname] # for singlehtml builder
+ self.manpages_url = self.config.manpages_url
+ self.protect_literal_text = 0
+ self.secnumber_suffix = self.config.html_secnumber_suffix
+ self.param_separator = ''
+ self.optional_param_level = 0
+ self._table_row_indices = [0]
+ self._fieldlist_row_indices = [0]
+ self.required_params_left = 0
+
+ def visit_start_of_file(self, node: Element) -> None:
+ # only occurs in the single-file builder
+ self.docnames.append(node['docname'])
+ self.body.append('<span id="document-%s"></span>' % node['docname'])
+
+ def depart_start_of_file(self, node: Element) -> None:
+ self.docnames.pop()
+
+ #############################################################
+ # Domain-specific object descriptions
+ #############################################################
+
+ # Top-level nodes for descriptions
+ ##################################
+
+ def visit_desc(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'dl'))
+
+ def depart_desc(self, node: Element) -> None:
+ self.body.append('</dl>\n\n')
+
+ def visit_desc_signature(self, node: Element) -> None:
+ # the id is set automatically
+ self.body.append(self.starttag(node, 'dt'))
+ self.protect_literal_text += 1
+
+ def depart_desc_signature(self, node: Element) -> None:
+ self.protect_literal_text -= 1
+ if not node.get('is_multiline'):
+ self.add_permalink_ref(node, _('Link to this definition'))
+ self.body.append('</dt>\n')
+
+ def visit_desc_signature_line(self, node: Element) -> None:
+ pass
+
+ def depart_desc_signature_line(self, node: Element) -> None:
+ if node.get('add_permalink'):
+ # the permalink info is on the parent desc_signature node
+ self.add_permalink_ref(node.parent, _('Link to this definition'))
+ self.body.append('<br />')
+
+ def visit_desc_content(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'dd', ''))
+
+ def depart_desc_content(self, node: Element) -> None:
+ self.body.append('</dd>')
+
+ def visit_desc_inline(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'span', ''))
+
+ def depart_desc_inline(self, node: Element) -> None:
+ self.body.append('</span>')
+
+ # Nodes for high-level structure in signatures
+ ##############################################
+
+ def visit_desc_name(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'span', ''))
+
+ def depart_desc_name(self, node: Element) -> None:
+ self.body.append('</span>')
+
+ def visit_desc_addname(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'span', ''))
+
+ def depart_desc_addname(self, node: Element) -> None:
+ self.body.append('</span>')
+
+ def visit_desc_type(self, node: Element) -> None:
+ pass
+
+ def depart_desc_type(self, node: Element) -> None:
+ pass
+
+ def visit_desc_returns(self, node: Element) -> None:
+ self.body.append(' <span class="sig-return">')
+ self.body.append('<span class="sig-return-icon">&#x2192;</span>')
+ self.body.append(' <span class="sig-return-typehint">')
+
+ def depart_desc_returns(self, node: Element) -> None:
+ self.body.append('</span></span>')
+
+ def _visit_sig_parameter_list(
+ self,
+ node: Element,
+ parameter_group: type[Element],
+ sig_open_paren: str,
+ sig_close_paren: str,
+ ) -> None:
+ """Visit a signature parameters or type parameters list.
+
+ The *parameter_group* value is the type of child nodes acting as required parameters
+ or as a set of contiguous optional parameters.
+ """
+ self.body.append(f'<span class="sig-paren">{sig_open_paren}</span>')
+ self.is_first_param = True
+ self.optional_param_level = 0
+ self.params_left_at_level = 0
+ self.param_group_index = 0
+ # Counts as what we call a parameter group either a required parameter, or a
+ # set of contiguous optional ones.
+ self.list_is_required_param = [isinstance(c, parameter_group) for c in node.children]
+ # How many required parameters are left.
+ self.required_params_left = sum(self.list_is_required_param)
+ self.param_separator = node.child_text_separator
+ self.multi_line_parameter_list = node.get('multi_line_parameter_list', False)
+ if self.multi_line_parameter_list:
+ self.body.append('\n\n')
+ self.body.append(self.starttag(node, 'dl'))
+ self.param_separator = self.param_separator.rstrip()
+ self.context.append(sig_close_paren)
+
+ def _depart_sig_parameter_list(self, node: Element) -> None:
+ if node.get('multi_line_parameter_list'):
+ self.body.append('</dl>\n\n')
+ sig_close_paren = self.context.pop()
+ self.body.append(f'<span class="sig-paren">{sig_close_paren}</span>')
+
+ def visit_desc_parameterlist(self, node: Element) -> None:
+ self._visit_sig_parameter_list(node, addnodes.desc_parameter, '(', ')')
+
+ def depart_desc_parameterlist(self, node: Element) -> None:
+ self._depart_sig_parameter_list(node)
+
+ def visit_desc_type_parameter_list(self, node: Element) -> None:
+ self._visit_sig_parameter_list(node, addnodes.desc_type_parameter, '[', ']')
+
+ def depart_desc_type_parameter_list(self, node: Element) -> None:
+ self._depart_sig_parameter_list(node)
+
+ # If required parameters are still to come, then put the comma after
+ # the parameter. Otherwise, put the comma before. This ensures that
+ # signatures like the following render correctly (see issue #1001):
+ #
+ # foo([a, ]b, c[, d])
+ #
+ def visit_desc_parameter(self, node: Element) -> None:
+ on_separate_line = self.multi_line_parameter_list
+ if on_separate_line and not (self.is_first_param and self.optional_param_level > 0):
+ self.body.append(self.starttag(node, 'dd', ''))
+ if self.is_first_param:
+ self.is_first_param = False
+ elif not on_separate_line and not self.required_params_left:
+ self.body.append(self.param_separator)
+ if self.optional_param_level == 0:
+ self.required_params_left -= 1
+ else:
+ self.params_left_at_level -= 1
+ if not node.hasattr('noemph'):
+ self.body.append('<em class="sig-param">')
+
+ def depart_desc_parameter(self, node: Element) -> None:
+ if not node.hasattr('noemph'):
+ self.body.append('</em>')
+ is_required = self.list_is_required_param[self.param_group_index]
+ if self.multi_line_parameter_list:
+ is_last_group = self.param_group_index + 1 == len(self.list_is_required_param)
+ next_is_required = (
+ not is_last_group
+ and self.list_is_required_param[self.param_group_index + 1]
+ )
+ opt_param_left_at_level = self.params_left_at_level > 0
+ if opt_param_left_at_level or is_required and (is_last_group or next_is_required):
+ self.body.append(self.param_separator)
+ self.body.append('</dd>\n')
+
+ elif self.required_params_left:
+ self.body.append(self.param_separator)
+
+ if is_required:
+ self.param_group_index += 1
+
+ def visit_desc_type_parameter(self, node: Element) -> None:
+ self.visit_desc_parameter(node)
+
+ def depart_desc_type_parameter(self, node: Element) -> None:
+ self.depart_desc_parameter(node)
+
+ def visit_desc_optional(self, node: Element) -> None:
+ self.params_left_at_level = sum([isinstance(c, addnodes.desc_parameter)
+ for c in node.children])
+ self.optional_param_level += 1
+ self.max_optional_param_level = self.optional_param_level
+ if self.multi_line_parameter_list:
+ # If the first parameter is optional, start a new line and open the bracket.
+ if self.is_first_param:
+ self.body.append(self.starttag(node, 'dd', ''))
+ self.body.append('<span class="optional">[</span>')
+ # Else, if there remains at least one required parameter, append the
+ # parameter separator, open a new bracket, and end the line.
+ elif self.required_params_left:
+ self.body.append(self.param_separator)
+ self.body.append('<span class="optional">[</span>')
+ self.body.append('</dd>\n')
+ # Else, open a new bracket, append the parameter separator,
+ # and end the line.
+ else:
+ self.body.append('<span class="optional">[</span>')
+ self.body.append(self.param_separator)
+ self.body.append('</dd>\n')
+ else:
+ self.body.append('<span class="optional">[</span>')
+
+ def depart_desc_optional(self, node: Element) -> None:
+ self.optional_param_level -= 1
+ if self.multi_line_parameter_list:
+ # If it's the first time we go down one level, add the separator
+ # before the bracket.
+ if self.optional_param_level == self.max_optional_param_level - 1:
+ self.body.append(self.param_separator)
+ self.body.append('<span class="optional">]</span>')
+ # End the line if we have just closed the last bracket of this
+ # optional parameter group.
+ if self.optional_param_level == 0:
+ self.body.append('</dd>\n')
+ else:
+ self.body.append('<span class="optional">]</span>')
+ if self.optional_param_level == 0:
+ self.param_group_index += 1
+
+ def visit_desc_annotation(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'em', '', CLASS='property'))
+
+ def depart_desc_annotation(self, node: Element) -> None:
+ self.body.append('</em>')
+
+ ##############################################
+
+ def visit_versionmodified(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'div', CLASS=node['type']))
+
+ def depart_versionmodified(self, node: Element) -> None:
+ self.body.append('</div>\n')
+
+ # overwritten
+ def visit_reference(self, node: Element) -> None:
+ atts = {'class': 'reference'}
+ if node.get('internal') or 'refuri' not in node:
+ atts['class'] += ' internal'
+ else:
+ atts['class'] += ' external'
+ if 'refuri' in node:
+ atts['href'] = node['refuri'] or '#'
+ if self.settings.cloak_email_addresses and atts['href'].startswith('mailto:'):
+ atts['href'] = self.cloak_mailto(atts['href'])
+ self.in_mailto = True
+ else:
+ assert 'refid' in node, \
+ 'References must have "refuri" or "refid" attribute.'
+ atts['href'] = '#' + node['refid']
+ if not isinstance(node.parent, nodes.TextElement):
+ assert len(node) == 1 and isinstance(node[0], nodes.image) # NoQA: PT018
+ atts['class'] += ' image-reference'
+ if 'reftitle' in node:
+ atts['title'] = node['reftitle']
+ if 'target' in node:
+ atts['target'] = node['target']
+ self.body.append(self.starttag(node, 'a', '', **atts))
+
+ if node.get('secnumber'):
+ self.body.append(('%s' + self.secnumber_suffix) %
+ '.'.join(map(str, node['secnumber'])))
+
+ def visit_number_reference(self, node: Element) -> None:
+ self.visit_reference(node)
+
+ def depart_number_reference(self, node: Element) -> None:
+ self.depart_reference(node)
+
+ # overwritten -- we don't want source comments to show up in the HTML
+ def visit_comment(self, node: Element) -> None: # type: ignore[override]
+ raise nodes.SkipNode
+
+ # overwritten
+ def visit_admonition(self, node: Element, name: str = '') -> None:
+ self.body.append(self.starttag(
+ node, 'div', CLASS=('admonition ' + name)))
+ if name:
+ node.insert(0, nodes.title(name, admonitionlabels[name]))
+
+ def depart_admonition(self, node: Element | None = None) -> None:
+ self.body.append('</div>\n')
+
+ def visit_seealso(self, node: Element) -> None:
+ self.visit_admonition(node, 'seealso')
+
+ def depart_seealso(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def get_secnumber(self, node: Element) -> tuple[int, ...] | None:
+ if node.get('secnumber'):
+ return node['secnumber']
+
+ if isinstance(node.parent, nodes.section):
+ if self.builder.name == 'singlehtml':
+ docname = self.docnames[-1]
+ anchorname = "{}/#{}".format(docname, node.parent['ids'][0])
+ if anchorname not in self.builder.secnumbers:
+ anchorname = "%s/" % docname # try first heading which has no anchor
+ else:
+ anchorname = '#' + node.parent['ids'][0]
+ if anchorname not in self.builder.secnumbers:
+ anchorname = '' # try first heading which has no anchor
+
+ if self.builder.secnumbers.get(anchorname):
+ return self.builder.secnumbers[anchorname]
+
+ return None
+
+ def add_secnumber(self, node: Element) -> None:
+ secnumber = self.get_secnumber(node)
+ if secnumber:
+ self.body.append('<span class="section-number">%s</span>' %
+ ('.'.join(map(str, secnumber)) + self.secnumber_suffix))
+
+ def add_fignumber(self, node: Element) -> None:
+ def append_fignumber(figtype: str, figure_id: str) -> None:
+ if self.builder.name == 'singlehtml':
+ key = f"{self.docnames[-1]}/{figtype}"
+ else:
+ key = figtype
+
+ if figure_id in self.builder.fignumbers.get(key, {}):
+ self.body.append('<span class="caption-number">')
+ prefix = self.config.numfig_format.get(figtype)
+ if prefix is None:
+ msg = __('numfig_format is not defined for %s') % figtype
+ logger.warning(msg)
+ else:
+ numbers = self.builder.fignumbers[key][figure_id]
+ self.body.append(prefix % '.'.join(map(str, numbers)) + ' ')
+ self.body.append('</span>')
+
+ figtype = self.builder.env.domains['std'].get_enumerable_node_type(node)
+ if figtype:
+ if len(node['ids']) == 0:
+ msg = __('Any IDs not assigned for %s node') % node.tagname
+ logger.warning(msg, location=node)
+ else:
+ append_fignumber(figtype, node['ids'][0])
+
+ def add_permalink_ref(self, node: Element, title: str) -> None:
+ icon = self.config.html_permalinks_icon
+ if node['ids'] and self.config.html_permalinks and self.builder.add_permalinks:
+ self.body.append(
+ f'<a class="headerlink" href="#{node["ids"][0]}" title="{title}">{icon}</a>',
+ )
+
+ # overwritten
+ def visit_bullet_list(self, node: Element) -> None:
+ if len(node) == 1 and isinstance(node[0], addnodes.toctree):
+ # avoid emitting empty <ul></ul>
+ raise nodes.SkipNode
+ super().visit_bullet_list(node)
+
+ # overwritten
+ def visit_definition(self, node: Element) -> None:
+ # don't insert </dt> here.
+ self.body.append(self.starttag(node, 'dd', ''))
+
+ # overwritten
+ def depart_definition(self, node: Element) -> None:
+ self.body.append('</dd>\n')
+
+ # overwritten
+ def visit_classifier(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'span', '', CLASS='classifier'))
+
+ # overwritten
+ def depart_classifier(self, node: Element) -> None:
+ self.body.append('</span>')
+
+ next_node: Node = node.next_node(descend=False, siblings=True)
+ if not isinstance(next_node, nodes.classifier):
+ # close `<dt>` tag at the tail of classifiers
+ self.body.append('</dt>')
+
+ # overwritten
+ def visit_term(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'dt', ''))
+
+ # overwritten
+ def depart_term(self, node: Element) -> None:
+ next_node: Node = node.next_node(descend=False, siblings=True)
+ if isinstance(next_node, nodes.classifier):
+ # Leave the end tag to `self.depart_classifier()`, in case
+ # there's a classifier.
+ pass
+ else:
+ if isinstance(node.parent.parent.parent, addnodes.glossary):
+ # add permalink if glossary terms
+ self.add_permalink_ref(node, _('Link to this term'))
+
+ self.body.append('</dt>')
+
+ # overwritten
+ def visit_title(self, node: Element) -> None:
+ if isinstance(node.parent, addnodes.compact_paragraph) and node.parent.get('toctree'):
+ self.body.append(self.starttag(node, 'p', '', CLASS='caption', ROLE='heading'))
+ self.body.append('<span class="caption-text">')
+ self.context.append('</span></p>\n')
+ else:
+ super().visit_title(node)
+ self.add_secnumber(node)
+ self.add_fignumber(node.parent)
+ if isinstance(node.parent, nodes.table):
+ self.body.append('<span class="caption-text">')
+
+ def depart_title(self, node: Element) -> None:
+ close_tag = self.context[-1]
+ if (self.config.html_permalinks and self.builder.add_permalinks and
+ node.parent.hasattr('ids') and node.parent['ids']):
+ # add permalink anchor
+ if close_tag.startswith('</h'):
+ self.add_permalink_ref(node.parent, _('Link to this heading'))
+ elif close_tag.startswith('</a></h'):
+ self.body.append('</a><a class="headerlink" href="#%s" ' %
+ node.parent['ids'][0] +
+ 'title="{}">{}'.format(
+ _('Link to this heading'),
+ self.config.html_permalinks_icon))
+ elif isinstance(node.parent, nodes.table):
+ self.body.append('</span>')
+ self.add_permalink_ref(node.parent, _('Link to this table'))
+ elif isinstance(node.parent, nodes.table):
+ self.body.append('</span>')
+
+ super().depart_title(node)
+
+ # overwritten
+ def visit_literal_block(self, node: Element) -> None:
+ if node.rawsource != node.astext():
+ # most probably a parsed-literal block -- don't highlight
+ return super().visit_literal_block(node)
+
+ lang = node.get('language', 'default')
+ linenos = node.get('linenos', False)
+ highlight_args = node.get('highlight_args', {})
+ highlight_args['force'] = node.get('force', False)
+ opts = self.config.highlight_options.get(lang, {})
+
+ if linenos and self.config.html_codeblock_linenos_style:
+ linenos = self.config.html_codeblock_linenos_style
+
+ highlighted = self.highlighter.highlight_block(
+ node.rawsource, lang, opts=opts, linenos=linenos,
+ location=node, **highlight_args,
+ )
+ starttag = self.starttag(node, 'div', suffix='',
+ CLASS='highlight-%s notranslate' % lang)
+ self.body.append(starttag + highlighted + '</div>\n')
+ raise nodes.SkipNode
+
+ def visit_caption(self, node: Element) -> None:
+ if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
+ self.body.append('<div class="code-block-caption">')
+ else:
+ super().visit_caption(node)
+ self.add_fignumber(node.parent)
+ self.body.append(self.starttag(node, 'span', '', CLASS='caption-text'))
+
+ def depart_caption(self, node: Element) -> None:
+ self.body.append('</span>')
+
+ # append permalink if available
+ if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
+ self.add_permalink_ref(node.parent, _('Link to this code'))
+ elif isinstance(node.parent, nodes.figure):
+ self.add_permalink_ref(node.parent, _('Link to this image'))
+ elif node.parent.get('toctree'):
+ self.add_permalink_ref(node.parent.parent, _('Link to this toctree'))
+
+ if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
+ self.body.append('</div>\n')
+ else:
+ super().depart_caption(node)
+
+ def visit_doctest_block(self, node: Element) -> None:
+ self.visit_literal_block(node)
+
+ # overwritten to add the <div> (for XHTML compliance)
+ def visit_block_quote(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'blockquote') + '<div>')
+
+ def depart_block_quote(self, node: Element) -> None:
+ self.body.append('</div></blockquote>\n')
+
+ # overwritten
+ def visit_literal(self, node: Element) -> None:
+ if 'kbd' in node['classes']:
+ self.body.append(self.starttag(node, 'kbd', '',
+ CLASS='docutils literal notranslate'))
+ return
+ lang = node.get("language", None)
+ if 'code' not in node['classes'] or not lang:
+ self.body.append(self.starttag(node, 'code', '',
+ CLASS='docutils literal notranslate'))
+ self.protect_literal_text += 1
+ return
+
+ opts = self.config.highlight_options.get(lang, {})
+ highlighted = self.highlighter.highlight_block(
+ node.astext(), lang, opts=opts, location=node, nowrap=True)
+ starttag = self.starttag(
+ node,
+ "code",
+ suffix="",
+ CLASS="docutils literal highlight highlight-%s" % lang,
+ )
+ self.body.append(starttag + highlighted.strip() + "</code>")
+ raise nodes.SkipNode
+
+ def depart_literal(self, node: Element) -> None:
+ if 'kbd' in node['classes']:
+ self.body.append('</kbd>')
+ else:
+ self.protect_literal_text -= 1
+ self.body.append('</code>')
+
+ def visit_productionlist(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'pre'))
+ names = []
+ productionlist = cast(Iterable[addnodes.production], node)
+ for production in productionlist:
+ names.append(production['tokenname'])
+ maxlen = max(len(name) for name in names)
+ lastname = None
+ for production in productionlist:
+ if production['tokenname']:
+ lastname = production['tokenname'].ljust(maxlen)
+ self.body.append(self.starttag(production, 'strong', ''))
+ self.body.append(lastname + '</strong> ::= ')
+ elif lastname is not None:
+ self.body.append('%s ' % (' ' * len(lastname)))
+ production.walkabout(self)
+ self.body.append('\n')
+ self.body.append('</pre>\n')
+ raise nodes.SkipNode
+
+ def depart_productionlist(self, node: Element) -> None:
+ pass
+
+ def visit_production(self, node: Element) -> None:
+ pass
+
+ def depart_production(self, node: Element) -> None:
+ pass
+
+ def visit_centered(self, node: Element) -> None:
+ self.body.append(self.starttag(node, 'p', CLASS="centered") +
+ '<strong>')
+
+ def depart_centered(self, node: Element) -> None:
+ self.body.append('</strong></p>')
+
+ def visit_compact_paragraph(self, node: Element) -> None:
+ pass
+
+ def depart_compact_paragraph(self, node: Element) -> None:
+ pass
+
+ def visit_download_reference(self, node: Element) -> None:
+ atts = {'class': 'reference download',
+ 'download': ''}
+
+ if not self.builder.download_support:
+ self.context.append('')
+ elif 'refuri' in node:
+ atts['class'] += ' external'
+ atts['href'] = node['refuri']
+ self.body.append(self.starttag(node, 'a', '', **atts))
+ self.context.append('</a>')
+ elif 'filename' in node:
+ atts['class'] += ' internal'
+ atts['href'] = posixpath.join(self.builder.dlpath,
+ urllib.parse.quote(node['filename']))
+ self.body.append(self.starttag(node, 'a', '', **atts))
+ self.context.append('</a>')
+ else:
+ self.context.append('')
+
+ def depart_download_reference(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+
+ # overwritten
+ def visit_figure(self, node: Element) -> None:
+ # set align=default if align not specified to give a default style
+ node.setdefault('align', 'default')
+
+ return super().visit_figure(node)
+
+ # overwritten
+ def visit_image(self, node: Element) -> None:
+ olduri = node['uri']
+ # rewrite the URI if the environment knows about it
+ if olduri in self.builder.images:
+ node['uri'] = posixpath.join(self.builder.imgpath,
+ urllib.parse.quote(self.builder.images[olduri]))
+
+ if 'scale' in node:
+ # Try to figure out image height and width. Docutils does that too,
+ # but it tries the final file name, which does not necessarily exist
+ # yet at the time the HTML file is written.
+ if not ('width' in node and 'height' in node):
+ path = os.path.join(self.builder.srcdir, olduri) # type: ignore[has-type]
+ size = get_image_size(path)
+ if size is None:
+ logger.warning(
+ __('Could not obtain image size. :scale: option is ignored.'),
+ location=node,
+ )
+ else:
+ if 'width' not in node:
+ node['width'] = str(size[0])
+ if 'height' not in node:
+ node['height'] = str(size[1])
+
+ uri = node['uri']
+ if uri.lower().endswith(('svg', 'svgz')):
+ atts = {'src': uri}
+ if 'width' in node:
+ atts['width'] = node['width']
+ if 'height' in node:
+ atts['height'] = node['height']
+ if 'scale' in node:
+ if 'width' in atts:
+ atts['width'] = multiply_length(atts['width'], node['scale'])
+ if 'height' in atts:
+ atts['height'] = multiply_length(atts['height'], node['scale'])
+ atts['alt'] = node.get('alt', uri)
+ if 'align' in node:
+ atts['class'] = 'align-%s' % node['align']
+ self.body.append(self.emptytag(node, 'img', '', **atts))
+ return
+
+ super().visit_image(node)
+
+ # overwritten
+ def depart_image(self, node: Element) -> None:
+ if node['uri'].lower().endswith(('svg', 'svgz')):
+ pass
+ else:
+ super().depart_image(node)
+
+ def visit_toctree(self, node: Element) -> None:
+ # this only happens when formatting a toc from env.tocs -- in this
+ # case we don't want to include the subtree
+ raise nodes.SkipNode
+
+ def visit_index(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_tabular_col_spec(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_glossary(self, node: Element) -> None:
+ pass
+
+ def depart_glossary(self, node: Element) -> None:
+ pass
+
+ def visit_acks(self, node: Element) -> None:
+ pass
+
+ def depart_acks(self, node: Element) -> None:
+ pass
+
+ def visit_hlist(self, node: Element) -> None:
+ self.body.append('<table class="hlist"><tr>')
+
+ def depart_hlist(self, node: Element) -> None:
+ self.body.append('</tr></table>\n')
+
+ def visit_hlistcol(self, node: Element) -> None:
+ self.body.append('<td>')
+
+ def depart_hlistcol(self, node: Element) -> None:
+ self.body.append('</td>')
+
+ # overwritten
+ def visit_Text(self, node: Text) -> None:
+ text = node.astext()
+ encoded = self.encode(text)
+ if self.protect_literal_text:
+ # moved here from base class's visit_literal to support
+ # more formatting in literal nodes
+ for token in self.words_and_spaces.findall(encoded):
+ if token.strip():
+ # protect literal text from line wrapping
+ self.body.append('<span class="pre">%s</span>' % token)
+ elif token in ' \n':
+ # allow breaks at whitespace
+ self.body.append(token)
+ else:
+ # protect runs of multiple spaces; the last one can wrap
+ self.body.append('&#160;' * (len(token) - 1) + ' ')
+ else:
+ if self.in_mailto and self.settings.cloak_email_addresses:
+ encoded = self.cloak_email(encoded)
+ self.body.append(encoded)
+
+ def visit_note(self, node: Element) -> None:
+ self.visit_admonition(node, 'note')
+
+ def depart_note(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_warning(self, node: Element) -> None:
+ self.visit_admonition(node, 'warning')
+
+ def depart_warning(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_attention(self, node: Element) -> None:
+ self.visit_admonition(node, 'attention')
+
+ def depart_attention(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_caution(self, node: Element) -> None:
+ self.visit_admonition(node, 'caution')
+
+ def depart_caution(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_danger(self, node: Element) -> None:
+ self.visit_admonition(node, 'danger')
+
+ def depart_danger(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_error(self, node: Element) -> None:
+ self.visit_admonition(node, 'error')
+
+ def depart_error(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_hint(self, node: Element) -> None:
+ self.visit_admonition(node, 'hint')
+
+ def depart_hint(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_important(self, node: Element) -> None:
+ self.visit_admonition(node, 'important')
+
+ def depart_important(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_tip(self, node: Element) -> None:
+ self.visit_admonition(node, 'tip')
+
+ def depart_tip(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_literal_emphasis(self, node: Element) -> None:
+ return self.visit_emphasis(node)
+
+ def depart_literal_emphasis(self, node: Element) -> None:
+ return self.depart_emphasis(node)
+
+ def visit_literal_strong(self, node: Element) -> None:
+ return self.visit_strong(node)
+
+ def depart_literal_strong(self, node: Element) -> None:
+ return self.depart_strong(node)
+
+ def visit_abbreviation(self, node: Element) -> None:
+ attrs = {}
+ if node.hasattr('explanation'):
+ attrs['title'] = node['explanation']
+ self.body.append(self.starttag(node, 'abbr', '', **attrs))
+
+ def depart_abbreviation(self, node: Element) -> None:
+ self.body.append('</abbr>')
+
+ def visit_manpage(self, node: Element) -> None:
+ self.visit_literal_emphasis(node)
+ if self.manpages_url:
+ node['refuri'] = self.manpages_url.format(**node.attributes)
+ self.visit_reference(node)
+
+ def depart_manpage(self, node: Element) -> None:
+ if self.manpages_url:
+ self.depart_reference(node)
+ self.depart_literal_emphasis(node)
+
+ # overwritten to add even/odd classes
+
+ def visit_table(self, node: Element) -> None:
+ self._table_row_indices.append(0)
+
+ atts = {}
+ classes = [cls.strip(' \t\n') for cls in self.settings.table_style.split(',')]
+ classes.insert(0, "docutils") # compat
+
+ # set align-default if align not specified to give a default style
+ classes.append('align-%s' % node.get('align', 'default'))
+
+ if 'width' in node:
+ atts['style'] = 'width: %s' % node['width']
+ tag = self.starttag(node, 'table', CLASS=' '.join(classes), **atts)
+ self.body.append(tag)
+
+ def depart_table(self, node: Element) -> None:
+ self._table_row_indices.pop()
+ super().depart_table(node)
+
+ def visit_row(self, node: Element) -> None:
+ self._table_row_indices[-1] += 1
+ if self._table_row_indices[-1] % 2 == 0:
+ node['classes'].append('row-even')
+ else:
+ node['classes'].append('row-odd')
+ self.body.append(self.starttag(node, 'tr', ''))
+ node.column = 0 # type: ignore[attr-defined]
+
+ def visit_field_list(self, node: Element) -> None:
+ self._fieldlist_row_indices.append(0)
+ return super().visit_field_list(node)
+
+ def depart_field_list(self, node: Element) -> None:
+ self._fieldlist_row_indices.pop()
+ return super().depart_field_list(node)
+
+ def visit_field(self, node: Element) -> None:
+ self._fieldlist_row_indices[-1] += 1
+ if self._fieldlist_row_indices[-1] % 2 == 0:
+ node['classes'].append('field-even')
+ else:
+ node['classes'].append('field-odd')
+
+ def visit_math(self, node: Element, math_env: str = '') -> None:
+ # see validate_math_renderer
+ name: str = self.builder.math_renderer_name # type: ignore[assignment]
+ visit, _ = self.builder.app.registry.html_inline_math_renderers[name]
+ visit(self, node)
+
+ def depart_math(self, node: Element, math_env: str = '') -> None:
+ # see validate_math_renderer
+ name: str = self.builder.math_renderer_name # type: ignore[assignment]
+ _, depart = self.builder.app.registry.html_inline_math_renderers[name]
+ if depart:
+ depart(self, node)
+
+ def visit_math_block(self, node: Element, math_env: str = '') -> None:
+ # see validate_math_renderer
+ name: str = self.builder.math_renderer_name # type: ignore[assignment]
+ visit, _ = self.builder.app.registry.html_block_math_renderers[name]
+ visit(self, node)
+
+ def depart_math_block(self, node: Element, math_env: str = '') -> None:
+ # see validate_math_renderer
+ name: str = self.builder.math_renderer_name # type: ignore[assignment]
+ _, depart = self.builder.app.registry.html_block_math_renderers[name]
+ if depart:
+ depart(self, node)
+
+ # See Docutils r9413
+ # Re-instate the footnote-reference class
+ def visit_footnote_reference(self, node):
+ href = '#' + node['refid']
+ classes = ['footnote-reference', self.settings.footnote_references]
+ self.body.append(self.starttag(node, 'a', suffix='', classes=classes,
+ role='doc-noteref', href=href))
+ self.body.append('<span class="fn-bracket">[</span>')
diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py
new file mode 100644
index 0000000..89b349a
--- /dev/null
+++ b/sphinx/writers/latex.py
@@ -0,0 +1,2266 @@
+"""Custom docutils writer for LaTeX.
+
+Much of this code is adapted from Dave Kuhlman's "docpy" writer from his
+docutils sandbox.
+"""
+
+from __future__ import annotations
+
+import re
+from collections import defaultdict
+from collections.abc import Iterable
+from os import path
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes, writers
+
+from sphinx import addnodes, highlighting
+from sphinx.domains.std import StandardDomain
+from sphinx.errors import SphinxError
+from sphinx.locale import _, __, admonitionlabels
+from sphinx.util import logging, texescape
+from sphinx.util.docutils import SphinxTranslator
+from sphinx.util.index_entries import split_index_msg
+from sphinx.util.nodes import clean_astext, get_prev_node
+from sphinx.util.template import LaTeXRenderer
+from sphinx.util.texescape import tex_replace_map
+
+try:
+ from docutils.utils.roman import toRoman
+except ImportError:
+ # In Debian/Ubuntu, roman package is provided as roman, not as docutils.utils.roman
+ from roman import toRoman # type: ignore[no-redef]
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node, Text
+
+ from sphinx.builders.latex import LaTeXBuilder
+ from sphinx.builders.latex.theming import Theme
+ from sphinx.domains import IndexEntry
+
+
+logger = logging.getLogger(__name__)
+
+MAX_CITATION_LABEL_LENGTH = 8
+LATEXSECTIONNAMES = ["part", "chapter", "section", "subsection",
+ "subsubsection", "paragraph", "subparagraph"]
+ENUMERATE_LIST_STYLE = defaultdict(lambda: r'\arabic',
+ {
+ 'arabic': r'\arabic',
+ 'loweralpha': r'\alph',
+ 'upperalpha': r'\Alph',
+ 'lowerroman': r'\roman',
+ 'upperroman': r'\Roman',
+ })
+
+CR = '\n'
+BLANKLINE = '\n\n'
+EXTRA_RE = re.compile(r'^(.*\S)\s+\(([^()]*)\)\s*$')
+
+
+class collected_footnote(nodes.footnote):
+ """Footnotes that are collected are assigned this class."""
+
+
+class UnsupportedError(SphinxError):
+ category = 'Markup is unsupported in LaTeX'
+
+
+class LaTeXWriter(writers.Writer):
+
+ supported = ('sphinxlatex',)
+
+ settings_spec = ('LaTeX writer options', '', (
+ ('Document name', ['--docname'], {'default': ''}),
+ ('Document class', ['--docclass'], {'default': 'manual'}),
+ ('Author', ['--author'], {'default': ''}),
+ ))
+ settings_defaults: dict[str, Any] = {}
+
+ theme: Theme
+
+ def __init__(self, builder: LaTeXBuilder) -> None:
+ super().__init__()
+ self.builder = builder
+
+ def translate(self) -> None:
+ visitor = self.builder.create_translator(self.document, self.builder, self.theme)
+ self.document.walkabout(visitor)
+ self.output = cast(LaTeXTranslator, visitor).astext()
+
+
+# Helper classes
+
+class Table:
+ """A table data"""
+
+ def __init__(self, node: Element) -> None:
+ self.header: list[str] = []
+ self.body: list[str] = []
+ self.align = node.get('align', 'default')
+ self.classes: list[str] = node.get('classes', [])
+ self.styles: list[str] = []
+ if 'standard' in self.classes:
+ self.styles.append('standard')
+ elif 'borderless' in self.classes:
+ self.styles.append('borderless')
+ elif 'booktabs' in self.classes:
+ self.styles.append('booktabs')
+ if 'nocolorrows' in self.classes:
+ self.styles.append('nocolorrows')
+ elif 'colorrows' in self.classes:
+ self.styles.append('colorrows')
+ self.colcount = 0
+ self.colspec: str = ''
+ if 'booktabs' in self.styles or 'borderless' in self.styles:
+ self.colsep: str | None = ''
+ elif 'standard' in self.styles:
+ self.colsep = '|'
+ else:
+ self.colsep = None
+ self.colwidths: list[int] = []
+ self.has_problematic = False
+ self.has_oldproblematic = False
+ self.has_verbatim = False
+ self.caption: list[str] = []
+ self.stubs: list[int] = []
+
+ # current position
+ self.col = 0
+ self.row = 0
+
+ # A dict mapping a table location to a cell_id (cell = rectangular area)
+ self.cells: dict[tuple[int, int], int] = defaultdict(int)
+ self.cell_id = 0 # last assigned cell_id
+
+ def is_longtable(self) -> bool:
+ """True if and only if table uses longtable environment."""
+ return self.row > 30 or 'longtable' in self.classes
+
+ def get_table_type(self) -> str:
+ """Returns the LaTeX environment name for the table.
+
+ The class currently supports:
+
+ * longtable
+ * tabular
+ * tabulary
+ """
+ if self.is_longtable():
+ return 'longtable'
+ elif self.has_verbatim:
+ return 'tabular'
+ elif self.colspec:
+ return 'tabulary'
+ elif self.has_problematic or (self.colwidths and 'colwidths-given' in self.classes):
+ return 'tabular'
+ else:
+ return 'tabulary'
+
+ def get_colspec(self) -> str:
+ """Returns a column spec of table.
+
+ This is what LaTeX calls the 'preamble argument' of the used table environment.
+
+ .. note::
+
+ The ``\\X`` and ``T`` column type specifiers are defined in
+ ``sphinxlatextables.sty``.
+ """
+ if self.colspec:
+ return self.colspec
+
+ _colsep = self.colsep
+ assert _colsep is not None
+ if self.colwidths and 'colwidths-given' in self.classes:
+ total = sum(self.colwidths)
+ colspecs = [r'\X{%d}{%d}' % (width, total) for width in self.colwidths]
+ return f'{{{_colsep}{_colsep.join(colspecs)}{_colsep}}}' + CR
+ elif self.has_problematic:
+ return r'{%s*{%d}{\X{1}{%d}%s}}' % (_colsep, self.colcount,
+ self.colcount, _colsep) + CR
+ elif self.get_table_type() == 'tabulary':
+ # sphinx.sty sets T to be J by default.
+ return '{' + _colsep + (('T' + _colsep) * self.colcount) + '}' + CR
+ elif self.has_oldproblematic:
+ return r'{%s*{%d}{\X{1}{%d}%s}}' % (_colsep, self.colcount,
+ self.colcount, _colsep) + CR
+ else:
+ return '{' + _colsep + (('l' + _colsep) * self.colcount) + '}' + CR
+
+ def add_cell(self, height: int, width: int) -> None:
+ """Adds a new cell to a table.
+
+ It will be located at current position: (``self.row``, ``self.col``).
+ """
+ self.cell_id += 1
+ for col in range(width):
+ for row in range(height):
+ assert self.cells[(self.row + row, self.col + col)] == 0
+ self.cells[(self.row + row, self.col + col)] = self.cell_id
+
+ def cell(
+ self, row: int | None = None, col: int | None = None,
+ ) -> TableCell | None:
+ """Returns a cell object (i.e. rectangular area) containing given position.
+
+ If no option arguments: ``row`` or ``col`` are given, the current position;
+ ``self.row`` and ``self.col`` are used to get a cell object by default.
+ """
+ try:
+ if row is None:
+ row = self.row
+ if col is None:
+ col = self.col
+ return TableCell(self, row, col)
+ except IndexError:
+ return None
+
+
+class TableCell:
+ """Data of a cell in a table."""
+
+ def __init__(self, table: Table, row: int, col: int) -> None:
+ if table.cells[(row, col)] == 0:
+ raise IndexError
+
+ self.table = table
+ self.cell_id = table.cells[(row, col)]
+ self.row = row
+ self.col = col
+
+ # adjust position for multirow/multicol cell
+ while table.cells[(self.row - 1, self.col)] == self.cell_id:
+ self.row -= 1
+ while table.cells[(self.row, self.col - 1)] == self.cell_id:
+ self.col -= 1
+
+ @property
+ def width(self) -> int:
+ """Returns the cell width."""
+ width = 0
+ while self.table.cells[(self.row, self.col + width)] == self.cell_id:
+ width += 1
+ return width
+
+ @property
+ def height(self) -> int:
+ """Returns the cell height."""
+ height = 0
+ while self.table.cells[(self.row + height, self.col)] == self.cell_id:
+ height += 1
+ return height
+
+
+def escape_abbr(text: str) -> str:
+ """Adjust spacing after abbreviations."""
+ return re.sub(r'\.(?=\s|$)', r'.\@', text)
+
+
+def rstdim_to_latexdim(width_str: str, scale: int = 100) -> str:
+ """Convert `width_str` with rst length to LaTeX length."""
+ match = re.match(r'^(\d*\.?\d*)\s*(\S*)$', width_str)
+ if not match:
+ raise ValueError
+ res = width_str
+ amount, unit = match.groups()[:2]
+ if scale == 100:
+ float(amount) # validate amount is float
+ if unit in ('', "px"):
+ res = r"%s\sphinxpxdimen" % amount
+ elif unit == 'pt':
+ res = '%sbp' % amount # convert to 'bp'
+ elif unit == "%":
+ res = r"%.3f\linewidth" % (float(amount) / 100.0)
+ else:
+ amount_float = float(amount) * scale / 100.0
+ if unit in ('', "px"):
+ res = r"%.5f\sphinxpxdimen" % amount_float
+ elif unit == 'pt':
+ res = '%.5fbp' % amount_float
+ elif unit == "%":
+ res = r"%.5f\linewidth" % (amount_float / 100.0)
+ else:
+ res = f"{amount_float:.5f}{unit}"
+ return res
+
+
+class LaTeXTranslator(SphinxTranslator):
+ builder: LaTeXBuilder
+
+ secnumdepth = 2 # legacy sphinxhowto.cls uses this, whereas article.cls
+ # default is originally 3. For book/report, 2 is already LaTeX default.
+ ignore_missing_images = False
+
+ def __init__(self, document: nodes.document, builder: LaTeXBuilder,
+ theme: Theme) -> None:
+ super().__init__(document, builder)
+ self.body: list[str] = []
+ self.theme = theme
+
+ # flags
+ self.in_title = 0
+ self.in_production_list = 0
+ self.in_footnote = 0
+ self.in_caption = 0
+ self.in_term = 0
+ self.needs_linetrimming = 0
+ self.in_minipage = 0
+ self.no_latex_floats = 0
+ self.first_document = 1
+ self.this_is_the_title = 1
+ self.literal_whitespace = 0
+ self.in_parsed_literal = 0
+ self.compact_list = 0
+ self.first_param = 0
+ self.in_desc_signature = False
+
+ sphinxpkgoptions = []
+
+ # sort out some elements
+ self.elements = self.builder.context.copy()
+
+ # initial section names
+ self.sectionnames = LATEXSECTIONNAMES[:]
+ if self.theme.toplevel_sectioning == 'section':
+ self.sectionnames.remove('chapter')
+
+ # determine top section level
+ self.top_sectionlevel = 1
+ if self.config.latex_toplevel_sectioning:
+ try:
+ self.top_sectionlevel = \
+ self.sectionnames.index(self.config.latex_toplevel_sectioning)
+ except ValueError:
+ logger.warning(__('unknown %r toplevel_sectioning for class %r') %
+ (self.config.latex_toplevel_sectioning, self.theme.docclass))
+
+ if self.config.numfig:
+ self.numfig_secnum_depth = self.config.numfig_secnum_depth
+ if self.numfig_secnum_depth > 0: # default is 1
+ # numfig_secnum_depth as passed to sphinx.sty indices same names as in
+ # LATEXSECTIONNAMES but with -1 for part, 0 for chapter, 1 for section...
+ if len(self.sectionnames) < len(LATEXSECTIONNAMES) and \
+ self.top_sectionlevel > 0:
+ self.numfig_secnum_depth += self.top_sectionlevel
+ else:
+ self.numfig_secnum_depth += self.top_sectionlevel - 1
+ # this (minus one) will serve as minimum to LaTeX's secnumdepth
+ self.numfig_secnum_depth = min(self.numfig_secnum_depth,
+ len(LATEXSECTIONNAMES) - 1)
+ # if passed key value is < 1 LaTeX will act as if 0; see sphinx.sty
+ sphinxpkgoptions.append('numfigreset=%s' % self.numfig_secnum_depth)
+ else:
+ sphinxpkgoptions.append('nonumfigreset')
+
+ if self.config.numfig and self.config.math_numfig:
+ sphinxpkgoptions.append('mathnumfig')
+
+ if (self.config.language not in {'en', 'ja'} and
+ 'fncychap' not in self.config.latex_elements):
+ # use Sonny style if any language specified (except English)
+ self.elements['fncychap'] = (r'\usepackage[Sonny]{fncychap}' + CR +
+ r'\ChNameVar{\Large\normalfont\sffamily}' + CR +
+ r'\ChTitleVar{\Large\normalfont\sffamily}')
+
+ self.babel = self.builder.babel
+ if not self.babel.is_supported_language():
+ # emit warning if specified language is invalid
+ # (only emitting, nothing changed to processing)
+ logger.warning(__('no Babel option known for language %r'),
+ self.config.language)
+
+ minsecnumdepth = self.secnumdepth # 2 from legacy sphinx manual/howto
+ if self.document.get('tocdepth'):
+ # reduce tocdepth if `part` or `chapter` is used for top_sectionlevel
+ # tocdepth = -1: show only parts
+ # tocdepth = 0: show parts and chapters
+ # tocdepth = 1: show parts, chapters and sections
+ # tocdepth = 2: show parts, chapters, sections and subsections
+ # ...
+ tocdepth = self.document.get('tocdepth', 999) + self.top_sectionlevel - 2
+ if len(self.sectionnames) < len(LATEXSECTIONNAMES) and \
+ self.top_sectionlevel > 0:
+ tocdepth += 1 # because top_sectionlevel is shifted by -1
+ if tocdepth > len(LATEXSECTIONNAMES) - 2: # default is 5 <-> subparagraph
+ logger.warning(__('too large :maxdepth:, ignored.'))
+ tocdepth = len(LATEXSECTIONNAMES) - 2
+
+ self.elements['tocdepth'] = r'\setcounter{tocdepth}{%d}' % tocdepth
+ minsecnumdepth = max(minsecnumdepth, tocdepth)
+
+ if self.config.numfig and (self.config.numfig_secnum_depth > 0):
+ minsecnumdepth = max(minsecnumdepth, self.numfig_secnum_depth - 1)
+
+ if minsecnumdepth > self.secnumdepth:
+ self.elements['secnumdepth'] = r'\setcounter{secnumdepth}{%d}' %\
+ minsecnumdepth
+
+ contentsname = document.get('contentsname')
+ if contentsname:
+ self.elements['contentsname'] = self.babel_renewcommand(r'\contentsname',
+ contentsname)
+
+ if self.elements['maxlistdepth']:
+ sphinxpkgoptions.append('maxlistdepth=%s' % self.elements['maxlistdepth'])
+ if sphinxpkgoptions:
+ self.elements['sphinxpkgoptions'] = '[,%s]' % ','.join(sphinxpkgoptions)
+ if self.elements['sphinxsetup']:
+ self.elements['sphinxsetup'] = (r'\sphinxsetup{%s}' % self.elements['sphinxsetup'])
+ if self.elements['extraclassoptions']:
+ self.elements['classoptions'] += ',' + \
+ self.elements['extraclassoptions']
+
+ self.highlighter = highlighting.PygmentsBridge('latex', self.config.pygments_style,
+ latex_engine=self.config.latex_engine)
+ self.context: list[Any] = []
+ self.descstack: list[str] = []
+ self.tables: list[Table] = []
+ self.next_table_colspec: str | None = None
+ self.bodystack: list[list[str]] = []
+ self.footnote_restricted: Element | None = None
+ self.pending_footnotes: list[nodes.footnote_reference] = []
+ self.curfilestack: list[str] = []
+ self.handled_abbrs: set[str] = set()
+
+ def pushbody(self, newbody: list[str]) -> None:
+ self.bodystack.append(self.body)
+ self.body = newbody
+
+ def popbody(self) -> list[str]:
+ body = self.body
+ self.body = self.bodystack.pop()
+ return body
+
+ def astext(self) -> str:
+ self.elements.update({
+ 'body': ''.join(self.body),
+ 'indices': self.generate_indices(),
+ })
+ return self.render('latex.tex_t', self.elements)
+
+ def hypertarget(self, id: str, withdoc: bool = True, anchor: bool = True) -> str:
+ if withdoc:
+ id = self.curfilestack[-1] + ':' + id
+ return (r'\phantomsection' if anchor else '') + r'\label{%s}' % self.idescape(id)
+
+ def hypertarget_to(self, node: Element, anchor: bool = False) -> str:
+ labels = ''.join(self.hypertarget(node_id, anchor=False) for node_id in node['ids'])
+ if anchor:
+ return r'\phantomsection' + labels
+ else:
+ return labels
+
+ def hyperlink(self, id: str) -> str:
+ return r'{\hyperref[%s]{' % self.idescape(id)
+
+ def hyperpageref(self, id: str) -> str:
+ return r'\autopageref*{%s}' % self.idescape(id)
+
+ def escape(self, s: str) -> str:
+ return texescape.escape(s, self.config.latex_engine)
+
+ def idescape(self, id: str) -> str:
+ return r'\detokenize{%s}' % str(id).translate(tex_replace_map).\
+ encode('ascii', 'backslashreplace').decode('ascii').\
+ replace('\\', '_')
+
+ def babel_renewcommand(self, command: str, definition: str) -> str:
+ if self.elements['multilingual']:
+ prefix = r'\addto\captions%s{' % self.babel.get_language()
+ suffix = '}'
+ else: # babel is disabled (mainly for Japanese environment)
+ prefix = ''
+ suffix = ''
+
+ return fr'{prefix}\renewcommand{{{command}}}{{{definition}}}{suffix}' + CR
+
+ def generate_indices(self) -> str:
+ def generate(content: list[tuple[str, list[IndexEntry]]], collapsed: bool) -> None:
+ ret.append(r'\begin{sphinxtheindex}' + CR)
+ ret.append(r'\let\bigletter\sphinxstyleindexlettergroup' + CR)
+ for i, (letter, entries) in enumerate(content):
+ if i > 0:
+ ret.append(r'\indexspace' + CR)
+ ret.append(r'\bigletter{%s}' % self.escape(letter) + CR)
+ for entry in entries:
+ if not entry[3]:
+ continue
+ ret.append(r'\item\relax\sphinxstyleindexentry{%s}' %
+ self.encode(entry[0]))
+ if entry[4]:
+ # add "extra" info
+ ret.append(r'\sphinxstyleindexextra{%s}' % self.encode(entry[4]))
+ ret.append(r'\sphinxstyleindexpageref{%s:%s}' %
+ (entry[2], self.idescape(entry[3])) + CR)
+ ret.append(r'\end{sphinxtheindex}' + CR)
+
+ ret = []
+ # latex_domain_indices can be False/True or a list of index names
+ indices_config = self.config.latex_domain_indices
+ if indices_config:
+ for domain in self.builder.env.domains.values():
+ for indexcls in domain.indices:
+ indexname = f'{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
+ ret.append(r'\renewcommand{\indexname}{%s}' % indexcls.localname + CR)
+ generate(content, collapsed)
+
+ return ''.join(ret)
+
+ def render(self, template_name: str, variables: dict[str, Any]) -> str:
+ renderer = LaTeXRenderer(latex_engine=self.config.latex_engine)
+ for template_dir in self.config.templates_path:
+ template = path.join(self.builder.confdir, template_dir,
+ template_name)
+ if path.exists(template):
+ return renderer.render(template, variables)
+
+ return renderer.render(template_name, variables)
+
+ @property
+ def table(self) -> Table | None:
+ """Get current table."""
+ if self.tables:
+ return self.tables[-1]
+ else:
+ return None
+
+ def visit_document(self, node: Element) -> None:
+ self.curfilestack.append(node.get('docname', ''))
+ if self.first_document == 1:
+ # the first document is all the regular content ...
+ self.first_document = 0
+ elif self.first_document == 0:
+ # ... and all others are the appendices
+ self.body.append(CR + r'\appendix' + CR)
+ self.first_document = -1
+ 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
+
+ def depart_document(self, node: Element) -> None:
+ pass
+
+ def visit_start_of_file(self, node: Element) -> None:
+ self.curfilestack.append(node['docname'])
+ self.body.append(CR + r'\sphinxstepscope' + CR)
+
+ def depart_start_of_file(self, node: Element) -> None:
+ self.curfilestack.pop()
+
+ def visit_section(self, node: Element) -> None:
+ if not self.this_is_the_title:
+ self.sectionlevel += 1
+ self.body.append(BLANKLINE)
+
+ def depart_section(self, node: Element) -> None:
+ self.sectionlevel = max(self.sectionlevel - 1,
+ self.top_sectionlevel - 1)
+
+ def visit_problematic(self, node: Element) -> None:
+ self.body.append(r'{\color{red}\bfseries{}')
+
+ def depart_problematic(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_topic(self, node: Element) -> None:
+ self.in_minipage = 1
+ self.body.append(CR + r'\begin{sphinxShadowBox}' + CR)
+
+ def depart_topic(self, node: Element) -> None:
+ self.in_minipage = 0
+ self.body.append(r'\end{sphinxShadowBox}' + CR)
+ visit_sidebar = visit_topic
+ depart_sidebar = depart_topic
+
+ def visit_glossary(self, node: Element) -> None:
+ pass
+
+ def depart_glossary(self, node: Element) -> None:
+ pass
+
+ def visit_productionlist(self, node: Element) -> None:
+ self.body.append(BLANKLINE)
+ self.body.append(r'\begin{productionlist}' + CR)
+ self.in_production_list = 1
+
+ def depart_productionlist(self, node: Element) -> None:
+ self.body.append(r'\end{productionlist}' + BLANKLINE)
+ self.in_production_list = 0
+
+ def visit_production(self, node: Element) -> None:
+ if node['tokenname']:
+ tn = node['tokenname']
+ self.body.append(self.hypertarget('grammar-token-' + tn))
+ self.body.append(r'\production{%s}{' % self.encode(tn))
+ else:
+ self.body.append(r'\productioncont{')
+
+ def depart_production(self, node: Element) -> None:
+ self.body.append('}' + CR)
+
+ def visit_transition(self, node: Element) -> None:
+ self.body.append(self.elements['transition'])
+
+ def depart_transition(self, node: Element) -> None:
+ pass
+
+ def visit_title(self, node: Element) -> None:
+ parent = node.parent
+ if isinstance(parent, addnodes.seealso):
+ # the environment already handles this
+ raise nodes.SkipNode
+ if isinstance(parent, nodes.section):
+ if self.this_is_the_title:
+ if len(node.children) != 1 and not isinstance(node.children[0],
+ nodes.Text):
+ logger.warning(__('document title is not a single Text node'),
+ location=node)
+ if not self.elements['title']:
+ # text needs to be escaped since it is inserted into
+ # the output literally
+ self.elements['title'] = self.escape(node.astext())
+ self.this_is_the_title = 0
+ raise nodes.SkipNode
+ short = ''
+ if any(node.findall(nodes.image)):
+ short = ('[%s]' % self.escape(' '.join(clean_astext(node).split())))
+
+ try:
+ self.body.append(fr'\{self.sectionnames[self.sectionlevel]}{short}{{')
+ except IndexError:
+ # just use "subparagraph", it's not numbered anyway
+ self.body.append(fr'\{self.sectionnames[-1]}{short}{{')
+ self.context.append('}' + CR + self.hypertarget_to(node.parent))
+ elif isinstance(parent, nodes.topic):
+ self.body.append(r'\sphinxstyletopictitle{')
+ self.context.append('}' + CR)
+ elif isinstance(parent, nodes.sidebar):
+ self.body.append(r'\sphinxstylesidebartitle{')
+ self.context.append('}' + CR)
+ elif isinstance(parent, nodes.Admonition):
+ self.body.append('{')
+ self.context.append('}' + CR)
+ elif isinstance(parent, nodes.table):
+ # Redirect body output until title is finished.
+ self.pushbody([])
+ else:
+ logger.warning(__('encountered title node not in section, topic, table, '
+ 'admonition or sidebar'),
+ location=node)
+ self.body.append(r'\sphinxstyleothertitle{')
+ self.context.append('}' + CR)
+ self.in_title = 1
+
+ def depart_title(self, node: Element) -> None:
+ self.in_title = 0
+ if isinstance(node.parent, nodes.table):
+ assert self.table is not None
+ self.table.caption = self.popbody()
+ else:
+ self.body.append(self.context.pop())
+
+ def visit_subtitle(self, node: Element) -> None:
+ if isinstance(node.parent, nodes.sidebar):
+ self.body.append(r'\sphinxstylesidebarsubtitle{')
+ self.context.append('}' + CR)
+ else:
+ self.context.append('')
+
+ def depart_subtitle(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+
+ #############################################################
+ # Domain-specific object descriptions
+ #############################################################
+
+ # Top-level nodes for descriptions
+ ##################################
+
+ def visit_desc(self, node: Element) -> None:
+ if self.config.latex_show_urls == 'footnote':
+ self.body.append(BLANKLINE)
+ self.body.append(r'\begin{savenotes}\begin{fulllineitems}' + CR)
+ else:
+ self.body.append(BLANKLINE)
+ self.body.append(r'\begin{fulllineitems}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_desc(self, node: Element) -> None:
+ if self.in_desc_signature:
+ self.body.append(CR + r'\pysigstopsignatures')
+ self.in_desc_signature = False
+ if self.config.latex_show_urls == 'footnote':
+ self.body.append(CR + r'\end{fulllineitems}\end{savenotes}' + BLANKLINE)
+ else:
+ self.body.append(CR + r'\end{fulllineitems}' + BLANKLINE)
+
+ def _visit_signature_line(self, node: Element) -> None:
+ def next_sibling(e: Node) -> Node | None:
+ try:
+ return e.parent[e.parent.index(e) + 1]
+ except (AttributeError, IndexError):
+ return None
+
+ def has_multi_line(e: Element) -> bool:
+ return e.get('multi_line_parameter_list')
+
+ self.has_tp_list = False
+
+ for child in node:
+ if isinstance(child, addnodes.desc_type_parameter_list):
+ self.has_tp_list = True
+ # recall that return annotations must follow an argument list,
+ # so signatures of the form "foo[tp_list] -> retann" will not
+ # be encountered (if they should, the `domains.python.py_sig_re`
+ # pattern must be modified accordingly)
+ arglist = next_sibling(child)
+ assert isinstance(arglist, addnodes.desc_parameterlist)
+ # tp_list + arglist: \macro{name}{tp_list}{arglist}{return}
+ multi_tp_list = has_multi_line(child)
+ multi_arglist = has_multi_line(arglist)
+
+ if multi_tp_list:
+ if multi_arglist:
+ self.body.append(CR + r'\pysigwithonelineperargwithonelinepertparg{')
+ else:
+ self.body.append(CR + r'\pysiglinewithargsretwithonelinepertparg{')
+ else:
+ if multi_arglist:
+ self.body.append(CR + r'\pysigwithonelineperargwithtypelist{')
+ else:
+ self.body.append(CR + r'\pysiglinewithargsretwithtypelist{')
+ break
+
+ if isinstance(child, addnodes.desc_parameterlist):
+ # arglist only: \macro{name}{arglist}{return}
+ if has_multi_line(child):
+ self.body.append(CR + r'\pysigwithonelineperarg{')
+ else:
+ self.body.append(CR + r'\pysiglinewithargsret{')
+ break
+ else:
+ # no tp_list, no arglist: \macro{name}
+ self.body.append(CR + r'\pysigline{')
+
+ def _depart_signature_line(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_desc_signature(self, node: Element) -> None:
+ hyper = ''
+ if node.parent['objtype'] != 'describe' and node['ids']:
+ for id in node['ids']:
+ hyper += self.hypertarget(id)
+ self.body.append(hyper)
+ if not self.in_desc_signature:
+ self.in_desc_signature = True
+ self.body.append(CR + r'\pysigstartsignatures')
+ if not node.get('is_multiline'):
+ self._visit_signature_line(node)
+ else:
+ self.body.append(CR + r'\pysigstartmultiline')
+
+ def depart_desc_signature(self, node: Element) -> None:
+ if not node.get('is_multiline'):
+ self._depart_signature_line(node)
+ else:
+ self.body.append(CR + r'\pysigstopmultiline')
+
+ def visit_desc_signature_line(self, node: Element) -> None:
+ self._visit_signature_line(node)
+
+ def depart_desc_signature_line(self, node: Element) -> None:
+ self._depart_signature_line(node)
+
+ def visit_desc_content(self, node: Element) -> None:
+ assert self.in_desc_signature
+ self.body.append(CR + r'\pysigstopsignatures')
+ self.in_desc_signature = False
+
+ def depart_desc_content(self, node: Element) -> None:
+ pass
+
+ def visit_desc_inline(self, node: Element) -> None:
+ self.body.append(r'\sphinxcode{\sphinxupquote{')
+
+ def depart_desc_inline(self, node: Element) -> None:
+ self.body.append('}}')
+
+ # Nodes for high-level structure in signatures
+ ##############################################
+
+ def visit_desc_name(self, node: Element) -> None:
+ self.body.append(r'\sphinxbfcode{\sphinxupquote{')
+ self.literal_whitespace += 1
+
+ def depart_desc_name(self, node: Element) -> None:
+ self.body.append('}}')
+ self.literal_whitespace -= 1
+
+ def visit_desc_addname(self, node: Element) -> None:
+ self.body.append(r'\sphinxcode{\sphinxupquote{')
+ self.literal_whitespace += 1
+
+ def depart_desc_addname(self, node: Element) -> None:
+ self.body.append('}}')
+ self.literal_whitespace -= 1
+
+ def visit_desc_type(self, node: Element) -> None:
+ pass
+
+ def depart_desc_type(self, node: Element) -> None:
+ pass
+
+ def visit_desc_returns(self, node: Element) -> None:
+ self.body.append(r'{ $\rightarrow$ ')
+
+ def depart_desc_returns(self, node: Element) -> None:
+ self.body.append(r'}')
+
+ def _visit_sig_parameter_list(self, node: Element, parameter_group: type[Element]) -> None:
+ """Visit a signature parameters or type parameters list.
+
+ The *parameter_group* value is the type of a child node acting as a required parameter
+ or as a set of contiguous optional parameters.
+
+ The caller is responsible for closing adding surrounding LaTeX macro argument start
+ and stop tokens.
+ """
+ self.is_first_param = True
+ self.optional_param_level = 0
+ self.params_left_at_level = 0
+ self.param_group_index = 0
+ # Counts as what we call a parameter group either a required parameter, or a
+ # set of contiguous optional ones.
+ self.list_is_required_param = [isinstance(c, parameter_group) for c in node.children]
+ # How many required parameters are left.
+ self.required_params_left = sum(self.list_is_required_param)
+ self.param_separator = r'\sphinxparamcomma '
+ self.multi_line_parameter_list = node.get('multi_line_parameter_list', False)
+
+ def visit_desc_parameterlist(self, node: Element) -> None:
+ if not self.has_tp_list:
+ # close name argument (#1), open parameters list argument (#2)
+ self.body.append('}{')
+ self._visit_sig_parameter_list(node, addnodes.desc_parameter)
+
+ def depart_desc_parameterlist(self, node: Element) -> None:
+ # close parameterlist, open return annotation
+ self.body.append('}{')
+
+ def visit_desc_type_parameter_list(self, node: Element) -> None:
+ # close name argument (#1), open type parameters list argument (#2)
+ self.body.append('}{')
+ self._visit_sig_parameter_list(node, addnodes.desc_type_parameter)
+
+ def depart_desc_type_parameter_list(self, node: Element) -> None:
+ # close type parameters list, open parameters list argument (#3)
+ self.body.append('}{')
+
+ def _visit_sig_parameter(self, node: Element, parameter_macro: str) -> None:
+ if self.is_first_param:
+ self.is_first_param = False
+ elif not self.multi_line_parameter_list and not self.required_params_left:
+ self.body.append(self.param_separator)
+ if self.optional_param_level == 0:
+ self.required_params_left -= 1
+ else:
+ self.params_left_at_level -= 1
+ if not node.hasattr('noemph'):
+ self.body.append(parameter_macro)
+
+ def _depart_sig_parameter(self, node: Element) -> None:
+ if not node.hasattr('noemph'):
+ self.body.append('}')
+ is_required = self.list_is_required_param[self.param_group_index]
+ if self.multi_line_parameter_list:
+ is_last_group = self.param_group_index + 1 == len(self.list_is_required_param)
+ next_is_required = (
+ not is_last_group
+ and self.list_is_required_param[self.param_group_index + 1]
+ )
+ opt_param_left_at_level = self.params_left_at_level > 0
+ if opt_param_left_at_level or is_required and (is_last_group or next_is_required):
+ self.body.append(self.param_separator)
+
+ elif self.required_params_left:
+ self.body.append(self.param_separator)
+
+ if is_required:
+ self.param_group_index += 1
+
+ def visit_desc_parameter(self, node: Element) -> None:
+ self._visit_sig_parameter(node, r'\sphinxparam{')
+
+ def depart_desc_parameter(self, node: Element) -> None:
+ self._depart_sig_parameter(node)
+
+ def visit_desc_type_parameter(self, node: Element) -> None:
+ self._visit_sig_parameter(node, r'\sphinxtypeparam{')
+
+ def depart_desc_type_parameter(self, node: Element) -> None:
+ self._depart_sig_parameter(node)
+
+ def visit_desc_optional(self, node: Element) -> None:
+ self.params_left_at_level = sum([isinstance(c, addnodes.desc_parameter)
+ for c in node.children])
+ self.optional_param_level += 1
+ self.max_optional_param_level = self.optional_param_level
+ if self.multi_line_parameter_list:
+ if self.is_first_param:
+ self.body.append(r'\sphinxoptional{')
+ elif self.required_params_left:
+ self.body.append(self.param_separator)
+ self.body.append(r'\sphinxoptional{')
+ else:
+ self.body.append(r'\sphinxoptional{')
+ self.body.append(self.param_separator)
+ else:
+ self.body.append(r'\sphinxoptional{')
+
+ def depart_desc_optional(self, node: Element) -> None:
+ self.optional_param_level -= 1
+ if self.multi_line_parameter_list:
+ # If it's the first time we go down one level, add the separator before the
+ # bracket.
+ if self.optional_param_level == self.max_optional_param_level - 1:
+ self.body.append(self.param_separator)
+ self.body.append('}')
+ if self.optional_param_level == 0:
+ self.param_group_index += 1
+
+ def visit_desc_annotation(self, node: Element) -> None:
+ self.body.append(r'\sphinxbfcode{\sphinxupquote{')
+
+ def depart_desc_annotation(self, node: Element) -> None:
+ self.body.append('}}')
+
+ ##############################################
+
+ def visit_seealso(self, node: Element) -> None:
+ self.body.append(BLANKLINE)
+ self.body.append(r'\begin{sphinxseealso}{%s:}' % admonitionlabels['seealso'] + CR)
+
+ def depart_seealso(self, node: Element) -> None:
+ self.body.append(BLANKLINE)
+ self.body.append(r'\end{sphinxseealso}')
+ self.body.append(BLANKLINE)
+
+ def visit_rubric(self, node: Element) -> None:
+ if len(node) == 1 and node.astext() in ('Footnotes', _('Footnotes')):
+ raise nodes.SkipNode
+ self.body.append(r'\subsubsection*{')
+ self.context.append('}' + CR)
+ self.in_title = 1
+
+ def depart_rubric(self, node: Element) -> None:
+ self.in_title = 0
+ self.body.append(self.context.pop())
+
+ def visit_footnote(self, node: Element) -> None:
+ self.in_footnote += 1
+ label = cast(nodes.label, node[0])
+ if self.in_parsed_literal:
+ self.body.append(r'\begin{footnote}[%s]' % label.astext())
+ else:
+ self.body.append('%' + CR)
+ self.body.append(r'\begin{footnote}[%s]' % label.astext())
+ if 'referred' in node:
+ # TODO: in future maybe output a latex macro with backrefs here
+ pass
+ self.body.append(r'\sphinxAtStartFootnote' + CR)
+
+ def depart_footnote(self, node: Element) -> None:
+ if self.in_parsed_literal:
+ self.body.append(r'\end{footnote}')
+ else:
+ self.body.append('%' + CR)
+ self.body.append(r'\end{footnote}')
+ self.in_footnote -= 1
+
+ def visit_label(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_tabular_col_spec(self, node: Element) -> None:
+ self.next_table_colspec = node['spec']
+ raise nodes.SkipNode
+
+ def visit_table(self, node: Element) -> None:
+ if len(self.tables) == 1:
+ assert self.table is not None
+ if self.table.get_table_type() == 'longtable':
+ raise UnsupportedError(
+ '%s:%s: longtable does not support nesting a table.' %
+ (self.curfilestack[-1], node.line or ''))
+ # change type of parent table to tabular
+ # see https://groups.google.com/d/msg/sphinx-users/7m3NeOBixeo/9LKP2B4WBQAJ
+ self.table.has_problematic = True
+ elif len(self.tables) > 2:
+ raise UnsupportedError(
+ '%s:%s: deeply nested tables are not implemented.' %
+ (self.curfilestack[-1], node.line or ''))
+
+ table = Table(node)
+ self.tables.append(table)
+ if table.colsep is None:
+ table.colsep = '|' * (
+ 'booktabs' not in self.builder.config.latex_table_style
+ and 'borderless' not in self.builder.config.latex_table_style
+ )
+ if self.next_table_colspec:
+ table.colspec = '{%s}' % self.next_table_colspec + CR
+ if '|' in table.colspec:
+ table.styles.append('vlines')
+ table.colsep = '|'
+ else:
+ table.styles.append('novlines')
+ table.colsep = ''
+ if 'colwidths-given' in node.get('classes', []):
+ logger.info(__('both tabularcolumns and :widths: option are given. '
+ ':widths: is ignored.'), location=node)
+ self.next_table_colspec = None
+
+ def depart_table(self, node: Element) -> None:
+ assert self.table is not None
+ labels = self.hypertarget_to(node)
+ table_type = self.table.get_table_type()
+ table = self.render(table_type + '.tex_t',
+ {'table': self.table, 'labels': labels})
+ self.body.append(BLANKLINE)
+ self.body.append(table)
+ self.body.append(CR)
+
+ self.tables.pop()
+
+ def visit_colspec(self, node: Element) -> None:
+ assert self.table is not None
+ self.table.colcount += 1
+ if 'colwidth' in node:
+ self.table.colwidths.append(node['colwidth'])
+ if 'stub' in node:
+ self.table.stubs.append(self.table.colcount - 1)
+
+ def depart_colspec(self, node: Element) -> None:
+ pass
+
+ def visit_tgroup(self, node: Element) -> None:
+ pass
+
+ def depart_tgroup(self, node: Element) -> None:
+ pass
+
+ def visit_thead(self, node: Element) -> None:
+ assert self.table is not None
+ # Redirect head output until header is finished.
+ self.pushbody(self.table.header)
+
+ def depart_thead(self, node: Element) -> None:
+ if self.body and self.body[-1] == r'\sphinxhline':
+ self.body.pop()
+ self.popbody()
+
+ def visit_tbody(self, node: Element) -> None:
+ assert self.table is not None
+ # Redirect body output until table is finished.
+ self.pushbody(self.table.body)
+
+ def depart_tbody(self, node: Element) -> None:
+ if self.body and self.body[-1] == r'\sphinxhline':
+ self.body.pop()
+ self.popbody()
+
+ def visit_row(self, node: Element) -> None:
+ assert self.table is not None
+ self.table.col = 0
+ _colsep = self.table.colsep
+ # fill columns if the row starts with the bottom of multirow cell
+ while True:
+ cell = self.table.cell(self.table.row, self.table.col)
+ if cell is None: # not a bottom of multirow cell
+ break
+ # a bottom of multirow cell
+ self.table.col += cell.width
+ if cell.col:
+ self.body.append('&')
+ if cell.width == 1:
+ # insert suitable strut for equalizing row heights in given multirow
+ self.body.append(r'\sphinxtablestrut{%d}' % cell.cell_id)
+ else: # use \multicolumn for wide multirow cell
+ self.body.append(r'\multicolumn{%d}{%sl%s}{\sphinxtablestrut{%d}}' %
+ (cell.width, _colsep, _colsep, cell.cell_id))
+
+ def depart_row(self, node: Element) -> None:
+ assert self.table is not None
+ self.body.append(r'\\' + CR)
+ cells = [self.table.cell(self.table.row, i) for i in range(self.table.colcount)]
+ underlined = [cell.row + cell.height == self.table.row + 1 # type: ignore[union-attr]
+ for cell in cells]
+ if all(underlined):
+ self.body.append(r'\sphinxhline')
+ else:
+ i = 0
+ underlined.extend([False]) # sentinel
+ if underlined[0] is False:
+ i = 1
+ while i < self.table.colcount and underlined[i] is False:
+ if cells[i - 1].cell_id != cells[i].cell_id: # type: ignore[union-attr]
+ self.body.append(r'\sphinxvlinecrossing{%d}' % i)
+ i += 1
+ while i < self.table.colcount:
+ # each time here underlined[i] is True
+ j = underlined[i:].index(False)
+ self.body.append(r'\sphinxcline{%d-%d}' % (i + 1, i + j))
+ i += j
+ i += 1
+ while i < self.table.colcount and underlined[i] is False:
+ if cells[i - 1].cell_id != cells[i].cell_id: # type: ignore[union-attr]
+ self.body.append(r'\sphinxvlinecrossing{%d}' % i)
+ i += 1
+ self.body.append(r'\sphinxfixclines{%d}' % self.table.colcount)
+ self.table.row += 1
+
+ def visit_entry(self, node: Element) -> None:
+ assert self.table is not None
+ if self.table.col > 0:
+ self.body.append('&')
+ self.table.add_cell(node.get('morerows', 0) + 1, node.get('morecols', 0) + 1)
+ cell = self.table.cell()
+ assert cell is not None
+ context = ''
+ _colsep = self.table.colsep
+ if cell.width > 1:
+ if self.config.latex_use_latex_multicolumn:
+ if self.table.col == 0:
+ self.body.append(r'\multicolumn{%d}{%sl%s}{%%' %
+ (cell.width, _colsep, _colsep) + CR)
+ else:
+ self.body.append(r'\multicolumn{%d}{l%s}{%%' % (cell.width, _colsep) + CR)
+ context = '}%' + CR
+ else:
+ self.body.append(r'\sphinxstartmulticolumn{%d}%%' % cell.width + CR)
+ context = r'\sphinxstopmulticolumn' + CR
+ if cell.height > 1:
+ # \sphinxmultirow 2nd arg "cell_id" will serve as id for LaTeX macros as well
+ self.body.append(r'\sphinxmultirow{%d}{%d}{%%' % (cell.height, cell.cell_id) + CR)
+ context = '}%' + CR + context
+ if cell.width > 1 or cell.height > 1:
+ self.body.append(r'\begin{varwidth}[t]{\sphinxcolwidth{%d}{%d}}'
+ % (cell.width, self.table.colcount) + CR)
+ context = (r'\par' + CR + r'\vskip-\baselineskip'
+ r'\vbox{\hbox{\strut}}\end{varwidth}%' + CR + context)
+ self.needs_linetrimming = 1
+ if len(list(node.findall(nodes.paragraph))) >= 2:
+ self.table.has_oldproblematic = True
+ if isinstance(node.parent.parent, nodes.thead) or (cell.col in self.table.stubs):
+ if len(node) == 1 and isinstance(node[0], nodes.paragraph) and node.astext() == '':
+ pass
+ else:
+ self.body.append(r'\sphinxstyletheadfamily ')
+ if self.needs_linetrimming:
+ self.pushbody([])
+ self.context.append(context)
+
+ def depart_entry(self, node: Element) -> None:
+ if self.needs_linetrimming:
+ self.needs_linetrimming = 0
+ body = self.popbody()
+
+ # Remove empty lines from top of merged cell
+ while body and body[0] == CR:
+ body.pop(0)
+ self.body.extend(body)
+
+ self.body.append(self.context.pop())
+
+ assert self.table is not None
+ cell = self.table.cell()
+ assert cell is not None
+ self.table.col += cell.width
+ _colsep = self.table.colsep
+
+ # fill columns if next ones are a bottom of wide-multirow cell
+ while True:
+ nextcell = self.table.cell()
+ if nextcell is None: # not a bottom of multirow cell
+ break
+ # a bottom part of multirow cell
+ self.body.append('&')
+ if nextcell.width == 1:
+ # insert suitable strut for equalizing row heights in multirow
+ # they also serve to clear colour panels which would hide the text
+ self.body.append(r'\sphinxtablestrut{%d}' % nextcell.cell_id)
+ else:
+ # use \multicolumn for not first row of wide multirow cell
+ self.body.append(r'\multicolumn{%d}{l%s}{\sphinxtablestrut{%d}}' %
+ (nextcell.width, _colsep, nextcell.cell_id))
+ self.table.col += nextcell.width
+
+ def visit_acks(self, node: Element) -> None:
+ # this is a list in the source, but should be rendered as a
+ # comma-separated list here
+ bullet_list = cast(nodes.bullet_list, node[0])
+ list_items = cast(Iterable[nodes.list_item], bullet_list)
+ self.body.append(BLANKLINE)
+ self.body.append(', '.join(n.astext() for n in list_items) + '.')
+ self.body.append(BLANKLINE)
+ raise nodes.SkipNode
+
+ def visit_bullet_list(self, node: Element) -> None:
+ if not self.compact_list:
+ self.body.append(r'\begin{itemize}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_bullet_list(self, node: Element) -> None:
+ if not self.compact_list:
+ self.body.append(r'\end{itemize}' + CR)
+
+ def visit_enumerated_list(self, node: Element) -> None:
+ def get_enumtype(node: Element) -> str:
+ enumtype = node.get('enumtype', 'arabic')
+ if 'alpha' in enumtype and (node.get('start', 0) + len(node)) > 26:
+ # fallback to arabic if alphabet counter overflows
+ enumtype = 'arabic'
+
+ return enumtype
+
+ def get_nested_level(node: Element) -> int:
+ if node is None:
+ return 0
+ elif isinstance(node, nodes.enumerated_list):
+ return get_nested_level(node.parent) + 1
+ else:
+ return get_nested_level(node.parent)
+
+ enum = "enum%s" % toRoman(get_nested_level(node)).lower()
+ enumnext = "enum%s" % toRoman(get_nested_level(node) + 1).lower()
+ style = ENUMERATE_LIST_STYLE.get(get_enumtype(node))
+ prefix = node.get('prefix', '')
+ suffix = node.get('suffix', '.')
+
+ self.body.append(r'\begin{enumerate}' + CR)
+ self.body.append(r'\sphinxsetlistlabels{%s}{%s}{%s}{%s}{%s}%%' %
+ (style, enum, enumnext, prefix, suffix) + CR)
+ if 'start' in node:
+ self.body.append(r'\setcounter{%s}{%d}' % (enum, node['start'] - 1) + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_enumerated_list(self, node: Element) -> None:
+ self.body.append(r'\end{enumerate}' + CR)
+
+ def visit_list_item(self, node: Element) -> None:
+ # Append "{}" in case the next character is "[", which would break
+ # LaTeX's list environment (no numbering and the "[" is not printed).
+ self.body.append(r'\item {} ')
+
+ def depart_list_item(self, node: Element) -> None:
+ self.body.append(CR)
+
+ def visit_definition_list(self, node: Element) -> None:
+ self.body.append(r'\begin{description}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_definition_list(self, node: Element) -> None:
+ self.body.append(r'\end{description}' + CR)
+
+ def visit_definition_list_item(self, node: Element) -> None:
+ pass
+
+ def depart_definition_list_item(self, node: Element) -> None:
+ pass
+
+ def visit_term(self, node: Element) -> None:
+ self.in_term += 1
+ ctx = ''
+ if node.get('ids'):
+ ctx = r'\phantomsection'
+ for node_id in node['ids']:
+ ctx += self.hypertarget(node_id, anchor=False)
+ ctx += r'}'
+ self.body.append(r'\sphinxlineitem{')
+ self.context.append(ctx)
+
+ def depart_term(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+ self.in_term -= 1
+
+ def visit_classifier(self, node: Element) -> None:
+ self.body.append('{[}')
+
+ def depart_classifier(self, node: Element) -> None:
+ self.body.append('{]}')
+
+ def visit_definition(self, node: Element) -> None:
+ pass
+
+ def depart_definition(self, node: Element) -> None:
+ self.body.append(CR)
+
+ def visit_field_list(self, node: Element) -> None:
+ self.body.append(r'\begin{quote}\begin{description}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_field_list(self, node: Element) -> None:
+ self.body.append(r'\end{description}\end{quote}' + CR)
+
+ def visit_field(self, node: Element) -> None:
+ pass
+
+ def depart_field(self, node: Element) -> None:
+ pass
+
+ visit_field_name = visit_term
+ depart_field_name = depart_term
+
+ visit_field_body = visit_definition
+ depart_field_body = depart_definition
+
+ def visit_paragraph(self, node: Element) -> None:
+ index = node.parent.index(node)
+ if (index > 0 and isinstance(node.parent, nodes.compound) and
+ not isinstance(node.parent[index - 1], nodes.paragraph) and
+ not isinstance(node.parent[index - 1], nodes.compound)):
+ # insert blank line, if the paragraph follows a non-paragraph node in a compound
+ self.body.append(r'\noindent' + CR)
+ elif index == 1 and isinstance(node.parent, (nodes.footnote, footnotetext)):
+ # don't insert blank line, if the paragraph is second child of a footnote
+ # (first one is label node)
+ pass
+ else:
+ # the \sphinxAtStartPar is to allow hyphenation of first word of
+ # a paragraph in narrow contexts such as in a table cell
+ # added as two items (cf. line trimming in depart_entry())
+ self.body.extend([CR, r'\sphinxAtStartPar' + CR])
+
+ def depart_paragraph(self, node: Element) -> None:
+ self.body.append(CR)
+
+ def visit_centered(self, node: Element) -> None:
+ self.body.append(CR + r'\begin{center}')
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_centered(self, node: Element) -> None:
+ self.body.append(CR + r'\end{center}')
+
+ def visit_hlist(self, node: Element) -> None:
+ self.compact_list += 1
+ ncolumns = node['ncolumns']
+ if self.compact_list > 1:
+ self.body.append(r'\setlength{\multicolsep}{0pt}' + CR)
+ self.body.append(r'\begin{multicols}{' + ncolumns + r'}\raggedright' + CR)
+ self.body.append(r'\begin{itemize}\setlength{\itemsep}{0pt}'
+ r'\setlength{\parskip}{0pt}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_hlist(self, node: Element) -> None:
+ self.compact_list -= 1
+ self.body.append(r'\end{itemize}\raggedcolumns\end{multicols}' + CR)
+
+ def visit_hlistcol(self, node: Element) -> None:
+ pass
+
+ def depart_hlistcol(self, node: Element) -> None:
+ # \columnbreak would guarantee same columns as in html output. But
+ # some testing with long items showed that columns may be too uneven.
+ # And in case only of short items, the automatic column breaks should
+ # match the ones pre-computed by the hlist() directive.
+ # self.body.append(r'\columnbreak\n')
+ pass
+
+ def latex_image_length(self, width_str: str, scale: int = 100) -> str | None:
+ try:
+ return rstdim_to_latexdim(width_str, scale)
+ except ValueError:
+ logger.warning(__('dimension unit %s is invalid. Ignored.'), width_str)
+ return None
+
+ def is_inline(self, node: Element) -> bool:
+ """Check whether a node represents an inline element."""
+ return isinstance(node.parent, nodes.TextElement)
+
+ def visit_image(self, node: Element) -> None:
+ pre: list[str] = [] # in reverse order
+ post: list[str] = []
+ include_graphics_options = []
+ has_hyperlink = isinstance(node.parent, nodes.reference)
+ if has_hyperlink:
+ is_inline = self.is_inline(node.parent)
+ else:
+ is_inline = self.is_inline(node)
+ if 'width' in node:
+ if 'scale' in node:
+ w = self.latex_image_length(node['width'], node['scale'])
+ else:
+ w = self.latex_image_length(node['width'])
+ if w:
+ include_graphics_options.append('width=%s' % w)
+ if 'height' in node:
+ if 'scale' in node:
+ h = self.latex_image_length(node['height'], node['scale'])
+ else:
+ h = self.latex_image_length(node['height'])
+ if h:
+ include_graphics_options.append('height=%s' % h)
+ if 'scale' in node:
+ if not include_graphics_options:
+ # if no "width" nor "height", \sphinxincludegraphics will fit
+ # to the available text width if oversized after rescaling.
+ include_graphics_options.append('scale=%s'
+ % (float(node['scale']) / 100.0))
+ if 'align' in node:
+ align_prepost = {
+ # By default latex aligns the top of an image.
+ (1, 'top'): ('', ''),
+ (1, 'middle'): (r'\raisebox{-0.5\height}{', '}'),
+ (1, 'bottom'): (r'\raisebox{-\height}{', '}'),
+ (0, 'center'): (r'{\hspace*{\fill}', r'\hspace*{\fill}}'),
+ # These 2 don't exactly do the right thing. The image should
+ # be floated alongside the paragraph. See
+ # https://www.w3.org/TR/html4/struct/objects.html#adef-align-IMG
+ (0, 'left'): ('{', r'\hspace*{\fill}}'),
+ (0, 'right'): (r'{\hspace*{\fill}', '}'),
+ }
+ try:
+ pre.append(align_prepost[is_inline, node['align']][0])
+ post.append(align_prepost[is_inline, node['align']][1])
+ except KeyError:
+ pass
+ if self.in_parsed_literal:
+ pre.append(r'{\sphinxunactivateextrasandspace ')
+ post.append('}')
+ if not is_inline and not has_hyperlink:
+ pre.append(CR + r'\noindent')
+ post.append(CR)
+ pre.reverse()
+ 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
+ self.body.extend(pre)
+ options = ''
+ if include_graphics_options:
+ options = '[%s]' % ','.join(include_graphics_options)
+ base, ext = path.splitext(uri)
+
+ if self.in_title and base:
+ # Lowercase tokens forcely because some fncychap themes capitalize
+ # the options of \sphinxincludegraphics unexpectedly (ex. WIDTH=...).
+ cmd = fr'\lowercase{{\sphinxincludegraphics{options}}}{{{{{base}}}{ext}}}'
+ else:
+ cmd = fr'\sphinxincludegraphics{options}{{{{{base}}}{ext}}}'
+ # escape filepath for includegraphics, https://tex.stackexchange.com/a/202714/41112
+ if '#' in base:
+ cmd = r'{\catcode`\#=12' + cmd + '}'
+ self.body.append(cmd)
+ self.body.extend(post)
+
+ def depart_image(self, node: Element) -> None:
+ pass
+
+ def visit_figure(self, node: Element) -> None:
+ align = self.elements['figure_align']
+ if self.no_latex_floats:
+ align = "H"
+ if self.table:
+ # TODO: support align option
+ if 'width' in node:
+ length = self.latex_image_length(node['width'])
+ if length:
+ self.body.append(r'\begin{sphinxfigure-in-table}[%s]' % length + CR)
+ self.body.append(r'\centering' + CR)
+ else:
+ self.body.append(r'\begin{sphinxfigure-in-table}' + CR)
+ self.body.append(r'\centering' + CR)
+ if any(isinstance(child, nodes.caption) for child in node):
+ self.body.append(r'\capstart')
+ self.context.append(r'\end{sphinxfigure-in-table}\relax' + CR)
+ elif node.get('align', '') in ('left', 'right'):
+ length = None
+ if 'width' in node:
+ length = self.latex_image_length(node['width'])
+ elif isinstance(node[0], nodes.image) and 'width' in node[0]:
+ length = self.latex_image_length(node[0]['width'])
+ # Insert a blank line to prevent an infinite loop
+ # https://github.com/sphinx-doc/sphinx/issues/7059
+ self.body.append(BLANKLINE)
+ self.body.append(r'\begin{wrapfigure}{%s}{%s}' %
+ ('r' if node['align'] == 'right' else 'l', length or '0pt') + CR)
+ self.body.append(r'\centering')
+ self.context.append(r'\end{wrapfigure}' +
+ BLANKLINE +
+ r'\mbox{}\par\vskip-\dimexpr\baselineskip+\parskip\relax' +
+ CR) # avoid disappearance if no text next issues/11079
+ elif self.in_minipage:
+ self.body.append(CR + r'\begin{center}')
+ self.context.append(r'\end{center}' + CR)
+ else:
+ self.body.append(CR + r'\begin{figure}[%s]' % align + CR)
+ self.body.append(r'\centering' + CR)
+ if any(isinstance(child, nodes.caption) for child in node):
+ self.body.append(r'\capstart' + CR)
+ self.context.append(r'\end{figure}' + CR)
+
+ def depart_figure(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+
+ def visit_caption(self, node: Element) -> None:
+ self.in_caption += 1
+ if isinstance(node.parent, captioned_literal_block):
+ self.body.append(r'\sphinxSetupCaptionForVerbatim{')
+ elif self.in_minipage and isinstance(node.parent, nodes.figure):
+ self.body.append(r'\captionof{figure}{')
+ elif self.table and node.parent.tagname == 'figure':
+ self.body.append(r'\sphinxfigcaption{')
+ else:
+ self.body.append(r'\caption{')
+
+ def depart_caption(self, node: Element) -> None:
+ self.body.append('}')
+ if isinstance(node.parent, nodes.figure):
+ labels = self.hypertarget_to(node.parent)
+ self.body.append(labels)
+ self.in_caption -= 1
+
+ def visit_legend(self, node: Element) -> None:
+ self.body.append(CR + r'\begin{sphinxlegend}')
+
+ def depart_legend(self, node: Element) -> None:
+ self.body.append(r'\end{sphinxlegend}' + CR)
+
+ def visit_admonition(self, node: Element) -> None:
+ self.body.append(CR + r'\begin{sphinxadmonition}{note}')
+ self.no_latex_floats += 1
+
+ def depart_admonition(self, node: Element) -> None:
+ self.body.append(r'\end{sphinxadmonition}' + CR)
+ self.no_latex_floats -= 1
+
+ def _visit_named_admonition(self, node: Element) -> None:
+ label = admonitionlabels[node.tagname]
+ self.body.append(CR + r'\begin{sphinxadmonition}{%s}{%s:}' %
+ (node.tagname, label))
+ self.no_latex_floats += 1
+
+ def _depart_named_admonition(self, node: Element) -> None:
+ self.body.append(r'\end{sphinxadmonition}' + CR)
+ self.no_latex_floats -= 1
+
+ visit_attention = _visit_named_admonition
+ depart_attention = _depart_named_admonition
+ visit_caution = _visit_named_admonition
+ depart_caution = _depart_named_admonition
+ visit_danger = _visit_named_admonition
+ depart_danger = _depart_named_admonition
+ visit_error = _visit_named_admonition
+ depart_error = _depart_named_admonition
+ visit_hint = _visit_named_admonition
+ depart_hint = _depart_named_admonition
+ visit_important = _visit_named_admonition
+ depart_important = _depart_named_admonition
+ visit_note = _visit_named_admonition
+ depart_note = _depart_named_admonition
+ visit_tip = _visit_named_admonition
+ depart_tip = _depart_named_admonition
+ visit_warning = _visit_named_admonition
+ depart_warning = _depart_named_admonition
+
+ def visit_versionmodified(self, node: Element) -> None:
+ pass
+
+ def depart_versionmodified(self, node: Element) -> None:
+ pass
+
+ def visit_target(self, node: Element) -> None:
+ def add_target(id: str) -> None:
+ # indexing uses standard LaTeX index markup, so the targets
+ # will be generated differently
+ if id.startswith('index-'):
+ return
+
+ # equations also need no extra blank line nor hypertarget
+ # TODO: fix this dependency on mathbase extension internals
+ if id.startswith('equation-'):
+ return
+
+ # insert blank line, if the target follows a paragraph node
+ index = node.parent.index(node)
+ if index > 0 and isinstance(node.parent[index - 1], nodes.paragraph):
+ self.body.append(CR)
+
+ # do not generate \phantomsection in \section{}
+ anchor = not self.in_title
+ self.body.append(self.hypertarget(id, anchor=anchor))
+
+ # skip if visitor for next node supports hyperlink
+ next_node: Node = node
+ while isinstance(next_node, nodes.target):
+ next_node = next_node.next_node(ascend=True)
+
+ domain = cast(StandardDomain, self.builder.env.get_domain('std'))
+ if isinstance(next_node, HYPERLINK_SUPPORT_NODES):
+ return
+ if domain.get_enumerable_node_type(next_node) and domain.get_numfig_title(next_node):
+ return
+
+ if 'refuri' in node:
+ return
+ if 'anonymous' in node:
+ return
+ if node.get('refid'):
+ prev_node = get_prev_node(node)
+ if isinstance(prev_node, nodes.reference) and node['refid'] == prev_node['refid']:
+ # a target for a hyperlink reference having alias
+ pass
+ else:
+ add_target(node['refid'])
+ # Temporary fix for https://github.com/sphinx-doc/sphinx/issues/11093
+ # TODO: investigate if a more elegant solution exists (see comments of #11093)
+ if node.get('ismod', False):
+ # Detect if the previous nodes are label targets. If so, remove
+ # the refid thereof from node['ids'] to avoid duplicated ids.
+ def has_dup_label(sib: Node | None) -> bool:
+ return isinstance(sib, nodes.target) and sib.get('refid') in node['ids']
+
+ prev = get_prev_node(node)
+ if has_dup_label(prev):
+ ids = node['ids'][:] # copy to avoid side-effects
+ while has_dup_label(prev):
+ ids.remove(prev['refid']) # type: ignore[index]
+ prev = get_prev_node(prev) # type: ignore[arg-type]
+ else:
+ ids = iter(node['ids']) # read-only iterator
+ else:
+ ids = iter(node['ids']) # read-only iterator
+
+ for id in ids:
+ add_target(id)
+
+ def depart_target(self, node: Element) -> None:
+ pass
+
+ def visit_attribution(self, node: Element) -> None:
+ self.body.append(CR + r'\begin{flushright}' + CR)
+ self.body.append('---')
+
+ def depart_attribution(self, node: Element) -> None:
+ self.body.append(CR + r'\end{flushright}' + CR)
+
+ def visit_index(self, node: Element) -> None:
+ def escape(value: str) -> str:
+ value = self.encode(value)
+ value = value.replace(r'\{', r'\sphinxleftcurlybrace{}')
+ value = value.replace(r'\}', r'\sphinxrightcurlybrace{}')
+ value = value.replace('"', '""')
+ value = value.replace('@', '"@')
+ value = value.replace('!', '"!')
+ value = value.replace('|', r'\textbar{}')
+ return value
+
+ def style(string: str) -> str:
+ match = EXTRA_RE.match(string)
+ if match:
+ return match.expand(r'\\spxentry{\1}\\spxextra{\2}')
+ else:
+ return r'\spxentry{%s}' % string
+
+ if not node.get('inline', True):
+ self.body.append(CR)
+ entries = node['entries']
+ for type, string, _tid, ismain, _key in entries:
+ m = ''
+ if ismain:
+ m = '|spxpagem'
+ try:
+ parts = tuple(map(escape, split_index_msg(type, string)))
+ styled = tuple(map(style, parts))
+ if type == 'single':
+ try:
+ p1, p2 = parts
+ P1, P2 = styled
+ self.body.append(fr'\index{{{p1}@{P1}!{p2}@{P2}{m}}}')
+ except ValueError:
+ p, = parts
+ P, = styled
+ self.body.append(fr'\index{{{p}@{P}{m}}}')
+ elif type == 'pair':
+ p1, p2 = parts
+ P1, P2 = styled
+ self.body.append(fr'\index{{{p1}@{P1}!{p2}@{P2}{m}}}'
+ fr'\index{{{p2}@{P2}!{p1}@{P1}{m}}}')
+ elif type == 'triple':
+ p1, p2, p3 = parts
+ P1, P2, P3 = styled
+ self.body.append(
+ fr'\index{{{p1}@{P1}!{p2} {p3}@{P2} {P3}{m}}}'
+ fr'\index{{{p2}@{P2}!{p3}, {p1}@{P3}, {P1}{m}}}'
+ fr'\index{{{p3}@{P3}!{p1} {p2}@{P1} {P2}{m}}}')
+ elif type in {'see', 'seealso'}:
+ p1, p2 = parts
+ P1, _P2 = styled
+ self.body.append(fr'\index{{{p1}@{P1}|see{{{p2}}}}}')
+ else:
+ logger.warning(__('unknown index entry type %s found'), type)
+ except ValueError as err:
+ logger.warning(str(err))
+ if not node.get('inline', True):
+ self.body.append(r'\ignorespaces ')
+ raise nodes.SkipNode
+
+ def visit_raw(self, node: Element) -> None:
+ if not self.is_inline(node):
+ self.body.append(CR)
+ if 'latex' in node.get('format', '').split():
+ self.body.append(node.astext())
+ if not self.is_inline(node):
+ self.body.append(CR)
+ raise nodes.SkipNode
+
+ def visit_reference(self, node: Element) -> None:
+ if not self.in_title:
+ for id in node.get('ids'):
+ anchor = not self.in_caption
+ self.body += self.hypertarget(id, anchor=anchor)
+ if not self.is_inline(node):
+ self.body.append(CR)
+ uri = node.get('refuri', '')
+ if not uri and node.get('refid'):
+ uri = '%' + self.curfilestack[-1] + '#' + node['refid']
+ if self.in_title or not uri:
+ self.context.append('')
+ elif uri.startswith('#'):
+ # references to labels in the same document
+ id = self.curfilestack[-1] + ':' + uri[1:]
+ self.body.append(self.hyperlink(id))
+ self.body.append(r'\sphinxsamedocref{')
+ if self.config.latex_show_pagerefs and not \
+ self.in_production_list:
+ self.context.append('}}} (%s)' % self.hyperpageref(id))
+ else:
+ self.context.append('}}}')
+ 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.body.append(self.hyperlink(id))
+ if (len(node) and
+ isinstance(node[0], nodes.Element) and
+ 'std-term' in node[0].get('classes', [])):
+ # don't add a pageref for glossary terms
+ self.context.append('}}}')
+ # mark up as termreference
+ self.body.append(r'\sphinxtermref{')
+ else:
+ self.body.append(r'\sphinxcrossref{')
+ if self.config.latex_show_pagerefs and not self.in_production_list:
+ self.context.append('}}} (%s)' % self.hyperpageref(id))
+ else:
+ self.context.append('}}}')
+ else:
+ if len(node) == 1 and uri == node[0]:
+ if node.get('nolinkurl'):
+ self.body.append(r'\sphinxnolinkurl{%s}' % self.encode_uri(uri))
+ else:
+ self.body.append(r'\sphinxurl{%s}' % self.encode_uri(uri))
+ raise nodes.SkipNode
+ else:
+ self.body.append(r'\sphinxhref{%s}{' % self.encode_uri(uri))
+ self.context.append('}')
+
+ def depart_reference(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+ if not self.is_inline(node):
+ self.body.append(CR)
+
+ def visit_number_reference(self, node: Element) -> None:
+ if node.get('refid'):
+ id = self.curfilestack[-1] + ':' + node['refid']
+ else:
+ id = node.get('refuri', '')[1:].replace('#', ':')
+
+ title = self.escape(node.get('title', '%s')).replace(r'\%s', '%s')
+ if r'\{name\}' in title or r'\{number\}' in title:
+ # new style format (cf. "Fig.%{number}")
+ title = title.replace(r'\{name\}', '{name}').replace(r'\{number\}', '{number}')
+ text = escape_abbr(title).format(name=r'\nameref{%s}' % self.idescape(id),
+ number=r'\ref{%s}' % self.idescape(id))
+ else:
+ # old style format (cf. "Fig.%{number}")
+ text = escape_abbr(title) % (r'\ref{%s}' % self.idescape(id))
+ hyperref = fr'\hyperref[{self.idescape(id)}]{{{text}}}'
+ self.body.append(hyperref)
+
+ raise nodes.SkipNode
+
+ def visit_download_reference(self, node: Element) -> None:
+ pass
+
+ def depart_download_reference(self, node: Element) -> None:
+ pass
+
+ def visit_pending_xref(self, node: Element) -> None:
+ pass
+
+ def depart_pending_xref(self, node: Element) -> None:
+ pass
+
+ def visit_emphasis(self, node: Element) -> None:
+ self.body.append(r'\sphinxstyleemphasis{')
+
+ def depart_emphasis(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_literal_emphasis(self, node: Element) -> None:
+ self.body.append(r'\sphinxstyleliteralemphasis{\sphinxupquote{')
+
+ def depart_literal_emphasis(self, node: Element) -> None:
+ self.body.append('}}')
+
+ def visit_strong(self, node: Element) -> None:
+ self.body.append(r'\sphinxstylestrong{')
+
+ def depart_strong(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_literal_strong(self, node: Element) -> None:
+ self.body.append(r'\sphinxstyleliteralstrong{\sphinxupquote{')
+
+ def depart_literal_strong(self, node: Element) -> None:
+ self.body.append('}}')
+
+ def visit_abbreviation(self, node: Element) -> None:
+ abbr = node.astext()
+ self.body.append(r'\sphinxstyleabbreviation{')
+ # spell out the explanation once
+ if node.hasattr('explanation') and abbr not in self.handled_abbrs:
+ self.context.append('} (%s)' % self.encode(node['explanation']))
+ self.handled_abbrs.add(abbr)
+ else:
+ self.context.append('}')
+
+ def depart_abbreviation(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+
+ def visit_manpage(self, node: Element) -> None:
+ return self.visit_literal_emphasis(node)
+
+ def depart_manpage(self, node: Element) -> None:
+ return self.depart_literal_emphasis(node)
+
+ def visit_title_reference(self, node: Element) -> None:
+ self.body.append(r'\sphinxtitleref{')
+
+ def depart_title_reference(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_thebibliography(self, node: Element) -> None:
+ citations = cast(Iterable[nodes.citation], node)
+ labels = (cast(nodes.label, citation[0]) for citation in citations)
+ longest_label = max((label.astext() for label in labels), key=len)
+ if len(longest_label) > MAX_CITATION_LABEL_LENGTH:
+ # adjust max width of citation labels not to break the layout
+ longest_label = longest_label[:MAX_CITATION_LABEL_LENGTH]
+
+ self.body.append(CR + r'\begin{sphinxthebibliography}{%s}' %
+ self.encode(longest_label) + CR)
+
+ def depart_thebibliography(self, node: Element) -> None:
+ self.body.append(r'\end{sphinxthebibliography}' + CR)
+
+ def visit_citation(self, node: Element) -> None:
+ label = cast(nodes.label, node[0])
+ self.body.append(fr'\bibitem[{self.encode(label.astext())}]'
+ fr'{{{node["docname"]}:{node["ids"][0]}}}')
+
+ def depart_citation(self, node: Element) -> None:
+ pass
+
+ def visit_citation_reference(self, node: Element) -> None:
+ if self.in_title:
+ pass
+ else:
+ self.body.append(fr'\sphinxcite{{{node["docname"]}:{node["refname"]}}}')
+ raise nodes.SkipNode
+
+ def depart_citation_reference(self, node: Element) -> None:
+ pass
+
+ def visit_literal(self, node: Element) -> None:
+ if self.in_title:
+ self.body.append(r'\sphinxstyleliteralintitle{\sphinxupquote{')
+ return
+ elif 'kbd' in node['classes']:
+ self.body.append(r'\sphinxkeyboard{\sphinxupquote{')
+ return
+ lang = node.get("language", None)
+ if 'code' not in node['classes'] or not lang:
+ self.body.append(r'\sphinxcode{\sphinxupquote{')
+ return
+
+ opts = self.config.highlight_options.get(lang, {})
+ hlcode = self.highlighter.highlight_block(
+ node.astext(), lang, opts=opts, location=node, nowrap=True)
+ self.body.append(r'\sphinxcode{\sphinxupquote{%' + CR
+ + hlcode.rstrip() + '%' + CR
+ + '}}')
+ raise nodes.SkipNode
+
+ def depart_literal(self, node: Element) -> None:
+ self.body.append('}}')
+
+ def visit_footnote_reference(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_footnotemark(self, node: Element) -> None:
+ self.body.append(r'\sphinxfootnotemark[')
+
+ def depart_footnotemark(self, node: Element) -> None:
+ self.body.append(']')
+
+ def visit_footnotetext(self, node: Element) -> None:
+ label = cast(nodes.label, node[0])
+ self.body.append('%' + CR)
+ self.body.append(r'\begin{footnotetext}[%s]' % label.astext())
+ self.body.append(r'\sphinxAtStartFootnote' + CR)
+
+ def depart_footnotetext(self, node: Element) -> None:
+ # the \ignorespaces in particular for after table header use
+ self.body.append('%' + CR)
+ self.body.append(r'\end{footnotetext}\ignorespaces ')
+
+ def visit_captioned_literal_block(self, node: Element) -> None:
+ pass
+
+ def depart_captioned_literal_block(self, node: Element) -> None:
+ pass
+
+ def visit_literal_block(self, node: Element) -> None:
+ if node.rawsource != node.astext():
+ # most probably a parsed-literal block -- don't highlight
+ self.in_parsed_literal += 1
+ self.body.append(r'\begin{sphinxalltt}' + CR)
+ else:
+ labels = self.hypertarget_to(node)
+ if isinstance(node.parent, captioned_literal_block):
+ labels += self.hypertarget_to(node.parent)
+ if labels and not self.in_footnote:
+ self.body.append(CR + r'\def\sphinxLiteralBlockLabel{' + labels + '}')
+
+ lang = node.get('language', 'default')
+ linenos = node.get('linenos', False)
+ highlight_args = node.get('highlight_args', {})
+ highlight_args['force'] = node.get('force', False)
+ opts = self.config.highlight_options.get(lang, {})
+
+ hlcode = self.highlighter.highlight_block(
+ node.rawsource, lang, opts=opts, linenos=linenos,
+ location=node, **highlight_args,
+ )
+ if self.in_footnote:
+ self.body.append(CR + r'\sphinxSetupCodeBlockInFootnote')
+ hlcode = hlcode.replace(r'\begin{Verbatim}',
+ r'\begin{sphinxVerbatim}')
+ # if in table raise verbatim flag to avoid "tabulary" environment
+ # and opt for sphinxVerbatimintable to handle caption & long lines
+ elif self.table:
+ self.table.has_problematic = True
+ self.table.has_verbatim = True
+ hlcode = hlcode.replace(r'\begin{Verbatim}',
+ r'\begin{sphinxVerbatimintable}')
+ else:
+ hlcode = hlcode.replace(r'\begin{Verbatim}',
+ r'\begin{sphinxVerbatim}')
+ # get consistent trailer
+ hlcode = hlcode.rstrip()[:-14] # strip \end{Verbatim}
+ if self.table and not self.in_footnote:
+ hlcode += r'\end{sphinxVerbatimintable}'
+ else:
+ hlcode += r'\end{sphinxVerbatim}'
+
+ hllines = str(highlight_args.get('hl_lines', []))[1:-1]
+ if hllines:
+ self.body.append(CR + r'\fvset{hllines={, %s,}}%%' % hllines)
+ self.body.append(CR + hlcode + CR)
+ if hllines:
+ self.body.append(r'\sphinxresetverbatimhllines' + CR)
+ raise nodes.SkipNode
+
+ def depart_literal_block(self, node: Element) -> None:
+ self.body.append(CR + r'\end{sphinxalltt}' + CR)
+ self.in_parsed_literal -= 1
+ visit_doctest_block = visit_literal_block
+ depart_doctest_block = depart_literal_block
+
+ def visit_line(self, node: Element) -> None:
+ self.body.append(r'\item[] ')
+
+ def depart_line(self, node: Element) -> None:
+ self.body.append(CR)
+
+ def visit_line_block(self, node: Element) -> None:
+ if isinstance(node.parent, nodes.line_block):
+ self.body.append(r'\item[]' + CR)
+ self.body.append(r'\begin{DUlineblock}{\DUlineblockindent}' + CR)
+ else:
+ self.body.append(CR + r'\begin{DUlineblock}{0em}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_line_block(self, node: Element) -> None:
+ self.body.append(r'\end{DUlineblock}' + CR)
+
+ def visit_block_quote(self, node: Element) -> None:
+ # If the block quote contains a single object and that object
+ # is a list, then generate a list not a block quote.
+ # This lets us indent lists.
+ done = 0
+ if len(node.children) == 1:
+ child = node.children[0]
+ if isinstance(child, (nodes.bullet_list, nodes.enumerated_list)):
+ done = 1
+ if not done:
+ self.body.append(r'\begin{quote}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_block_quote(self, node: Element) -> None:
+ done = 0
+ if len(node.children) == 1:
+ child = node.children[0]
+ if isinstance(child, (nodes.bullet_list, nodes.enumerated_list)):
+ done = 1
+ if not done:
+ self.body.append(r'\end{quote}' + CR)
+
+ # option node handling copied from docutils' latex writer
+
+ def visit_option(self, node: Element) -> None:
+ if self.context[-1]:
+ # this is not the first option
+ self.body.append(', ')
+
+ def depart_option(self, node: Element) -> None:
+ # flag that the first option is done.
+ self.context[-1] += 1
+
+ def visit_option_argument(self, node: Element) -> None:
+ """The delimiter between an option and its argument."""
+ self.body.append(node.get('delimiter', ' '))
+
+ def depart_option_argument(self, node: Element) -> None:
+ pass
+
+ def visit_option_group(self, node: Element) -> None:
+ self.body.append(r'\item [')
+ # flag for first option
+ self.context.append(0)
+
+ def depart_option_group(self, node: Element) -> None:
+ self.context.pop() # the flag
+ self.body.append('] ')
+
+ def visit_option_list(self, node: Element) -> None:
+ self.body.append(r'\begin{optionlist}{3cm}' + CR)
+ if self.table:
+ self.table.has_problematic = True
+
+ def depart_option_list(self, node: Element) -> None:
+ self.body.append(r'\end{optionlist}' + CR)
+
+ def visit_option_list_item(self, node: Element) -> None:
+ pass
+
+ def depart_option_list_item(self, node: Element) -> None:
+ pass
+
+ def visit_option_string(self, node: Element) -> None:
+ ostring = node.astext()
+ self.body.append(self.encode(ostring))
+ raise nodes.SkipNode
+
+ def visit_description(self, node: Element) -> None:
+ self.body.append(' ')
+
+ def depart_description(self, node: Element) -> None:
+ pass
+
+ def visit_superscript(self, node: Element) -> None:
+ self.body.append(r'$^{\text{')
+
+ def depart_superscript(self, node: Element) -> None:
+ self.body.append('}}$')
+
+ def visit_subscript(self, node: Element) -> None:
+ self.body.append(r'$_{\text{')
+
+ def depart_subscript(self, node: Element) -> None:
+ self.body.append('}}$')
+
+ def visit_inline(self, node: Element) -> None:
+ classes = node.get('classes', [])
+ if classes in [['menuselection']]:
+ self.body.append(r'\sphinxmenuselection{')
+ self.context.append('}')
+ elif classes in [['guilabel']]:
+ self.body.append(r'\sphinxguilabel{')
+ self.context.append('}')
+ elif classes in [['accelerator']]:
+ self.body.append(r'\sphinxaccelerator{')
+ self.context.append('}')
+ elif classes and not self.in_title:
+ self.body.append(r'\DUrole{%s}{' % ','.join(classes))
+ self.context.append('}')
+ else:
+ self.context.append('')
+
+ def depart_inline(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+
+ def visit_generated(self, node: Element) -> None:
+ pass
+
+ def depart_generated(self, node: Element) -> None:
+ pass
+
+ def visit_compound(self, node: Element) -> None:
+ pass
+
+ def depart_compound(self, node: Element) -> None:
+ pass
+
+ def visit_container(self, node: Element) -> None:
+ classes = node.get('classes', [])
+ for c in classes:
+ self.body.append('\n\\begin{sphinxuseclass}{%s}' % c)
+
+ def depart_container(self, node: Element) -> None:
+ classes = node.get('classes', [])
+ for _c in classes:
+ self.body.append('\n\\end{sphinxuseclass}')
+
+ def visit_decoration(self, node: Element) -> None:
+ pass
+
+ def depart_decoration(self, node: Element) -> None:
+ pass
+
+ # docutils-generated elements that we don't support
+
+ def visit_header(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_footer(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_docinfo(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ # text handling
+
+ def encode(self, text: str) -> str:
+ text = self.escape(text)
+ if self.literal_whitespace:
+ # Insert a blank before the newline, to avoid
+ # ! LaTeX Error: There's no line here to end.
+ text = text.replace(CR, r'~\\' + CR).replace(' ', '~')
+ return text
+
+ def encode_uri(self, text: str) -> str:
+ # TODO: it is probably wrong that this uses texescape.escape()
+ # this must be checked against hyperref package exact dealings
+ # mainly, %, #, {, } and \ need escaping via a \ escape
+ # in \href, the tilde is allowed and must be represented literally
+ return self.encode(text).replace(r'\textasciitilde{}', '~').\
+ replace(r'\sphinxhyphen{}', '-').\
+ replace(r'\textquotesingle{}', "'")
+
+ def visit_Text(self, node: Text) -> None:
+ text = self.encode(node.astext())
+ self.body.append(text)
+
+ def depart_Text(self, node: Text) -> None:
+ pass
+
+ def visit_comment(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_meta(self, node: Element) -> None:
+ # only valid for HTML
+ raise nodes.SkipNode
+
+ def visit_system_message(self, node: Element) -> None:
+ pass
+
+ def depart_system_message(self, node: Element) -> None:
+ self.body.append(CR)
+
+ def visit_math(self, node: Element) -> None:
+ if self.in_title:
+ self.body.append(r'\protect\(%s\protect\)' % node.astext())
+ else:
+ self.body.append(r'\(%s\)' % node.astext())
+ raise nodes.SkipNode
+
+ def visit_math_block(self, node: Element) -> None:
+ if node.get('label'):
+ label = f"equation:{node['docname']}:{node['label']}"
+ else:
+ label = None
+
+ if node.get('nowrap'):
+ if label:
+ self.body.append(r'\label{%s}' % label)
+ self.body.append(node.astext())
+ else:
+ from sphinx.util.math import wrap_displaymath
+ self.body.append(wrap_displaymath(node.astext(), label,
+ self.config.math_number_all))
+ raise nodes.SkipNode
+
+ def visit_math_reference(self, node: Element) -> None:
+ label = f"equation:{node['docname']}:{node['target']}"
+ eqref_format = self.config.math_eqref_format
+ if eqref_format:
+ try:
+ ref = r'\ref{%s}' % label
+ self.body.append(eqref_format.format(number=ref))
+ except KeyError as exc:
+ logger.warning(__('Invalid math_eqref_format: %r'), exc,
+ location=node)
+ self.body.append(r'\eqref{%s}' % label)
+ else:
+ self.body.append(r'\eqref{%s}' % label)
+
+ def depart_math_reference(self, node: Element) -> None:
+ pass
+
+
+# FIXME: Workaround to avoid circular import
+# refs: https://github.com/sphinx-doc/sphinx/issues/5433
+from sphinx.builders.latex.nodes import ( # noqa: E402 # isort:skip
+ HYPERLINK_SUPPORT_NODES, captioned_literal_block, footnotetext,
+)
diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py
new file mode 100644
index 0000000..108eb5e
--- /dev/null
+++ b/sphinx/writers/manpage.py
@@ -0,0 +1,473 @@
+"""Manual page writer, extended for Sphinx custom nodes."""
+
+from __future__ import annotations
+
+from collections.abc import Iterable
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes
+from docutils.writers.manpage import Translator as BaseTranslator
+from docutils.writers.manpage import Writer
+
+from sphinx import addnodes
+from sphinx.locale import _, admonitionlabels
+from sphinx.util import logging
+from sphinx.util.docutils import SphinxTranslator
+from sphinx.util.i18n import format_date
+from sphinx.util.nodes import NodeMatcher
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element
+
+ from sphinx.builders import Builder
+
+logger = logging.getLogger(__name__)
+
+
+class ManualPageWriter(Writer):
+ def __init__(self, builder: Builder) -> None:
+ super().__init__()
+ self.builder = builder
+
+ def translate(self) -> None:
+ transform = NestedInlineTransform(self.document)
+ transform.apply()
+ visitor = self.builder.create_translator(self.document, self.builder)
+ self.visitor = cast(ManualPageTranslator, visitor)
+ self.document.walkabout(visitor)
+ self.output = self.visitor.astext()
+
+
+class NestedInlineTransform:
+ """
+ Flatten nested inline nodes:
+
+ Before:
+ <strong>foo=<emphasis>1</emphasis>
+ &bar=<emphasis>2</emphasis></strong>
+ After:
+ <strong>foo=</strong><emphasis>var</emphasis>
+ <strong>&bar=</strong><emphasis>2</emphasis>
+ """
+ def __init__(self, document: nodes.document) -> None:
+ self.document = document
+
+ def apply(self, **kwargs: Any) -> None:
+ matcher = NodeMatcher(nodes.literal, nodes.emphasis, nodes.strong)
+ for node in list(self.document.findall(matcher)): # type: nodes.TextElement
+ if any(matcher(subnode) for subnode in node):
+ pos = node.parent.index(node)
+ for subnode in reversed(list(node)):
+ node.remove(subnode)
+ if matcher(subnode):
+ node.parent.insert(pos + 1, subnode)
+ else:
+ newnode = node.__class__('', '', subnode, **node.attributes)
+ node.parent.insert(pos + 1, newnode)
+ # move node if all children became siblings of the node
+ if not len(node):
+ node.parent.remove(node)
+
+
+class ManualPageTranslator(SphinxTranslator, BaseTranslator):
+ """
+ Custom man page translator.
+ """
+
+ _docinfo: dict[str, Any] = {}
+
+ def __init__(self, document: nodes.document, builder: Builder) -> None:
+ super().__init__(document, builder)
+
+ self.in_productionlist = 0
+
+ # first title is the manpage title
+ self.section_level = -1
+
+ # docinfo set by man_pages config value
+ self._docinfo['title'] = self.settings.title
+ self._docinfo['subtitle'] = self.settings.subtitle
+ if self.settings.authors:
+ # don't set it if no author given
+ self._docinfo['author'] = self.settings.authors
+ self._docinfo['manual_section'] = self.settings.section
+
+ # docinfo set by other config values
+ self._docinfo['title_upper'] = self._docinfo['title'].upper()
+ if self.config.today:
+ self._docinfo['date'] = self.config.today
+ else:
+ self._docinfo['date'] = format_date(self.config.today_fmt or _('%b %d, %Y'),
+ language=self.config.language)
+ self._docinfo['copyright'] = self.config.copyright
+ self._docinfo['version'] = self.config.version
+ self._docinfo['manual_group'] = self.config.project
+
+ # Overwrite admonition label translations with our own
+ for label, translation in admonitionlabels.items():
+ self.language.labels[label] = self.deunicode(translation)
+
+ # overwritten -- added quotes around all .TH arguments
+ def header(self) -> str:
+ tmpl = (".TH \"%(title_upper)s\" \"%(manual_section)s\""
+ " \"%(date)s\" \"%(version)s\" \"%(manual_group)s\"\n")
+ if self._docinfo['subtitle']:
+ tmpl += (".SH NAME\n"
+ "%(title)s \\- %(subtitle)s\n")
+ return tmpl % self._docinfo
+
+ def visit_start_of_file(self, node: Element) -> None:
+ pass
+
+ def depart_start_of_file(self, node: Element) -> None:
+ pass
+
+ #############################################################
+ # Domain-specific object descriptions
+ #############################################################
+
+ # Top-level nodes for descriptions
+ ##################################
+
+ def visit_desc(self, node: Element) -> None:
+ self.visit_definition_list(node)
+
+ def depart_desc(self, node: Element) -> None:
+ self.depart_definition_list(node)
+
+ def visit_desc_signature(self, node: Element) -> None:
+ self.visit_definition_list_item(node)
+ self.visit_term(node)
+
+ def depart_desc_signature(self, node: Element) -> None:
+ self.depart_term(node)
+
+ def visit_desc_signature_line(self, node: Element) -> None:
+ pass
+
+ def depart_desc_signature_line(self, node: Element) -> None:
+ self.body.append(' ')
+
+ def visit_desc_content(self, node: Element) -> None:
+ self.visit_definition(node)
+
+ def depart_desc_content(self, node: Element) -> None:
+ self.depart_definition(node)
+
+ def visit_desc_inline(self, node: Element) -> None:
+ pass
+
+ def depart_desc_inline(self, node: Element) -> None:
+ pass
+
+ # Nodes for high-level structure in signatures
+ ##############################################
+
+ def visit_desc_name(self, node: Element) -> None:
+ pass
+
+ def depart_desc_name(self, node: Element) -> None:
+ pass
+
+ def visit_desc_addname(self, node: Element) -> None:
+ pass
+
+ def depart_desc_addname(self, node: Element) -> None:
+ pass
+
+ def visit_desc_type(self, node: Element) -> None:
+ pass
+
+ def depart_desc_type(self, node: Element) -> None:
+ pass
+
+ def visit_desc_returns(self, node: Element) -> None:
+ self.body.append(' -> ')
+
+ def depart_desc_returns(self, node: Element) -> None:
+ pass
+
+ def visit_desc_parameterlist(self, node: Element) -> None:
+ self.body.append('(')
+ self.first_param = 1
+
+ def depart_desc_parameterlist(self, node: Element) -> None:
+ self.body.append(')')
+
+ def visit_desc_type_parameter_list(self, node: Element) -> None:
+ self.body.append('[')
+ self.first_param = 1
+
+ def depart_desc_type_parameter_list(self, node: Element) -> None:
+ self.body.append(']')
+
+ def visit_desc_parameter(self, node: Element) -> None:
+ if not self.first_param:
+ self.body.append(', ')
+ else:
+ self.first_param = 0
+
+ def depart_desc_parameter(self, node: Element) -> None:
+ pass
+
+ def visit_desc_type_parameter(self, node: Element) -> None:
+ self.visit_desc_parameter(node)
+
+ def depart_desc_type_parameter(self, node: Element) -> None:
+ self.depart_desc_parameter(node)
+
+ def visit_desc_optional(self, node: Element) -> None:
+ self.body.append('[')
+
+ def depart_desc_optional(self, node: Element) -> None:
+ self.body.append(']')
+
+ def visit_desc_annotation(self, node: Element) -> None:
+ pass
+
+ def depart_desc_annotation(self, node: Element) -> None:
+ pass
+
+ ##############################################
+
+ def visit_versionmodified(self, node: Element) -> None:
+ self.visit_paragraph(node)
+
+ def depart_versionmodified(self, node: Element) -> None:
+ self.depart_paragraph(node)
+
+ # overwritten -- don't make whole of term bold if it includes strong node
+ def visit_term(self, node: Element) -> None:
+ if any(node.findall(nodes.strong)):
+ self.body.append('\n')
+ else:
+ super().visit_term(node)
+
+ # overwritten -- we don't want source comments to show up
+ def visit_comment(self, node: Element) -> None: # type: ignore[override]
+ raise nodes.SkipNode
+
+ # overwritten -- added ensure_eol()
+ def visit_footnote(self, node: Element) -> None:
+ self.ensure_eol()
+ super().visit_footnote(node)
+
+ # overwritten -- handle footnotes rubric
+ def visit_rubric(self, node: Element) -> None:
+ self.ensure_eol()
+ if len(node) == 1 and node.astext() in ('Footnotes', _('Footnotes')):
+ self.body.append('.SH ' + self.deunicode(node.astext()).upper() + '\n')
+ raise nodes.SkipNode
+ self.body.append('.sp\n')
+
+ def depart_rubric(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def visit_seealso(self, node: Element) -> None:
+ self.visit_admonition(node, 'seealso')
+
+ def depart_seealso(self, node: Element) -> None:
+ self.depart_admonition(node)
+
+ def visit_productionlist(self, node: Element) -> None:
+ self.ensure_eol()
+ names = []
+ self.in_productionlist += 1
+ self.body.append('.sp\n.nf\n')
+ productionlist = cast(Iterable[addnodes.production], node)
+ for production in productionlist:
+ names.append(production['tokenname'])
+ maxlen = max(len(name) for name in names)
+ lastname = None
+ for production in productionlist:
+ if production['tokenname']:
+ lastname = production['tokenname'].ljust(maxlen)
+ self.body.append(self.defs['strong'][0])
+ self.body.append(self.deunicode(lastname))
+ self.body.append(self.defs['strong'][1])
+ self.body.append(' ::= ')
+ elif lastname is not None:
+ self.body.append('%s ' % (' ' * len(lastname)))
+ production.walkabout(self)
+ self.body.append('\n')
+ self.body.append('\n.fi\n')
+ self.in_productionlist -= 1
+ raise nodes.SkipNode
+
+ def visit_production(self, node: Element) -> None:
+ pass
+
+ def depart_production(self, node: Element) -> None:
+ pass
+
+ # overwritten -- don't emit a warning for images
+ def visit_image(self, node: Element) -> None:
+ if 'alt' in node.attributes:
+ self.body.append(_('[image: %s]') % node['alt'] + '\n')
+ self.body.append(_('[image]') + '\n')
+ raise nodes.SkipNode
+
+ # overwritten -- don't visit inner marked up nodes
+ def visit_reference(self, node: Element) -> None:
+ self.body.append(self.defs['reference'][0])
+ # avoid repeating escaping code... fine since
+ # visit_Text calls astext() and only works on that afterwards
+ self.visit_Text(node) # type: ignore[arg-type]
+ self.body.append(self.defs['reference'][1])
+
+ uri = node.get('refuri', '')
+ if uri.startswith(('mailto:', 'http:', 'https:', 'ftp:')):
+ # if configured, put the URL after the link
+ if self.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_number_reference(self, node: Element) -> None:
+ text = nodes.Text(node.get('title', '#'))
+ self.visit_Text(text)
+ raise nodes.SkipNode
+
+ def visit_centered(self, node: Element) -> None:
+ self.ensure_eol()
+ self.body.append('.sp\n.ce\n')
+
+ def depart_centered(self, node: Element) -> None:
+ self.body.append('\n.ce 0\n')
+
+ def visit_compact_paragraph(self, node: Element) -> None:
+ pass
+
+ def depart_compact_paragraph(self, node: Element) -> None:
+ pass
+
+ def visit_download_reference(self, node: Element) -> None:
+ pass
+
+ def depart_download_reference(self, node: Element) -> None:
+ pass
+
+ def visit_toctree(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_index(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_tabular_col_spec(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_glossary(self, node: Element) -> None:
+ pass
+
+ def depart_glossary(self, node: Element) -> None:
+ pass
+
+ def visit_acks(self, node: Element) -> None:
+ bullet_list = cast(nodes.bullet_list, node[0])
+ list_items = cast(Iterable[nodes.list_item], bullet_list)
+ self.ensure_eol()
+ bullet_list = cast(nodes.bullet_list, node[0])
+ list_items = cast(Iterable[nodes.list_item], bullet_list)
+ self.body.append(', '.join(n.astext() for n in list_items) + '.')
+ self.body.append('\n')
+ raise nodes.SkipNode
+
+ def visit_hlist(self, node: Element) -> None:
+ self.visit_bullet_list(node)
+
+ def depart_hlist(self, node: Element) -> None:
+ self.depart_bullet_list(node)
+
+ def visit_hlistcol(self, node: Element) -> None:
+ pass
+
+ def depart_hlistcol(self, node: Element) -> None:
+ pass
+
+ def visit_literal_emphasis(self, node: Element) -> None:
+ return self.visit_emphasis(node)
+
+ def depart_literal_emphasis(self, node: Element) -> None:
+ return self.depart_emphasis(node)
+
+ def visit_literal_strong(self, node: Element) -> None:
+ return self.visit_strong(node)
+
+ def depart_literal_strong(self, node: Element) -> None:
+ return self.depart_strong(node)
+
+ def visit_abbreviation(self, node: Element) -> None:
+ pass
+
+ def depart_abbreviation(self, node: Element) -> None:
+ pass
+
+ def visit_manpage(self, node: Element) -> None:
+ return self.visit_strong(node)
+
+ def depart_manpage(self, node: Element) -> None:
+ return self.depart_strong(node)
+
+ # overwritten: handle section titles better than in 0.6 release
+ def visit_caption(self, node: Element) -> None:
+ if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
+ self.body.append('.sp\n')
+ else:
+ super().visit_caption(node)
+
+ def depart_caption(self, node: Element) -> None:
+ if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
+ self.body.append('\n')
+ else:
+ super().depart_caption(node)
+
+ # overwritten: handle section titles better than in 0.6 release
+ def visit_title(self, node: Element) -> None:
+ if isinstance(node.parent, addnodes.seealso):
+ self.body.append('.IP "')
+ return None
+ elif isinstance(node.parent, nodes.section):
+ if self.section_level == 0:
+ # skip the document title
+ raise nodes.SkipNode
+ elif self.section_level == 1:
+ self.body.append('.SH %s\n' %
+ self.deunicode(node.astext().upper()))
+ raise nodes.SkipNode
+ return super().visit_title(node)
+
+ def depart_title(self, node: Element) -> None:
+ if isinstance(node.parent, addnodes.seealso):
+ self.body.append('"\n')
+ return None
+ return super().depart_title(node)
+
+ def visit_raw(self, node: Element) -> None:
+ if 'manpage' in node.get('format', '').split():
+ self.body.append(node.astext())
+ raise nodes.SkipNode
+
+ def visit_meta(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_inline(self, node: Element) -> None:
+ pass
+
+ def depart_inline(self, node: Element) -> None:
+ pass
+
+ def visit_math(self, node: Element) -> None:
+ pass
+
+ def depart_math(self, node: Element) -> None:
+ pass
+
+ def visit_math_block(self, node: Element) -> None:
+ self.visit_centered(node)
+
+ def depart_math_block(self, node: Element) -> None:
+ self.depart_centered(node)
diff --git a/sphinx/writers/texinfo.py b/sphinx/writers/texinfo.py
new file mode 100644
index 0000000..7032c65
--- /dev/null
+++ b/sphinx/writers/texinfo.py
@@ -0,0 +1,1572 @@
+"""Custom docutils writer for Texinfo."""
+
+from __future__ import annotations
+
+import re
+import textwrap
+from collections.abc import Iterable, Iterator
+from os import path
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes, writers
+
+from sphinx import __display_version__, addnodes
+from sphinx.domains.index import IndexDomain
+from sphinx.errors import ExtensionError
+from sphinx.locale import _, __, admonitionlabels
+from sphinx.util import logging
+from sphinx.util.docutils import SphinxTranslator
+from sphinx.util.i18n import format_date
+from sphinx.writers.latex import collected_footnote
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Node, Text
+
+ from sphinx.builders.texinfo import TexinfoBuilder
+ from sphinx.domains import IndexEntry
+
+
+logger = logging.getLogger(__name__)
+
+
+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 """ + __display_version__ + """.@*
+@end ifinfo
+@settitle %(title)s
+@defindex ge
+@paragraphindent %(paragraphindent)s
+@exampleindent %(exampleindent)s
+@finalout
+%(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: Element) -> list[nodes.section]:
+ """Return a list of subsections for the given ``section``."""
+ result = []
+ for child in section:
+ if isinstance(child, nodes.section):
+ result.append(child)
+ continue
+ if isinstance(child, nodes.Element):
+ result.extend(find_subsections(child))
+ return result
+
+
+def smart_capwords(s: str, sep: str | None = None) -> str:
+ """Like string.capwords() but does not capitalize words that already
+ contain a capital letter."""
+ words = s.split(sep)
+ for i, word in enumerate(words):
+ if all(x.islower() for x in word):
+ words[i] = word.capitalize()
+ return (sep or ' ').join(words)
+
+
+class TexinfoWriter(writers.Writer):
+ """Texinfo writer for generating Texinfo documents."""
+ supported = ('texinfo', 'texi')
+
+ settings_spec: tuple[str, Any, tuple[tuple[str, list[str], dict[str, str]], ...]] = (
+ '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: dict[str, Any] = {}
+
+ output: str
+
+ visitor_attributes = ('output', 'fragment')
+
+ def __init__(self, builder: TexinfoBuilder) -> None:
+ super().__init__()
+ self.builder = builder
+
+ def translate(self) -> None:
+ visitor = self.builder.create_translator(self.document, self.builder)
+ self.visitor = cast(TexinfoTranslator, visitor)
+ self.document.walkabout(visitor)
+ self.visitor.finish()
+ for attr in self.visitor_attributes:
+ setattr(self, attr, getattr(self.visitor, attr))
+
+
+class TexinfoTranslator(SphinxTranslator):
+
+ ignore_missing_images = False
+ builder: TexinfoBuilder
+
+ default_elements = {
+ 'author': '',
+ 'body': '',
+ 'copying': '',
+ 'date': '',
+ 'direntry': '',
+ 'exampleindent': 4,
+ 'filename': '',
+ 'paragraphindent': 0,
+ 'preamble': '',
+ 'project': '',
+ 'release': '',
+ 'title': '',
+ }
+
+ def __init__(self, document: nodes.document, builder: TexinfoBuilder) -> None:
+ super().__init__(document, builder)
+ self.init_settings()
+
+ self.written_ids: set[str] = set() # node names and anchors in output
+ # node names and anchors that should be in output
+ self.referenced_ids: set[str] = set()
+ self.indices: list[tuple[str, str]] = [] # (node name, content)
+ self.short_ids: dict[str, str] = {} # anchors --> short ids
+ self.node_names: dict[str, str] = {} # node name --> node's name to display
+ self.node_menus: dict[str, list[str]] = {} # node name --> node's menu entries
+ self.rellinks: dict[str, list[str]] = {} # node name --> (next, previous, up)
+
+ self.collect_indices()
+ self.collect_node_names()
+ self.collect_node_menus()
+ self.collect_rellinks()
+
+ self.body: list[str] = []
+ self.context: list[str] = []
+ self.descs: list[addnodes.desc] = []
+ self.previous_section: nodes.section | None = None
+ self.section_level = 0
+ self.seen_title = False
+ self.next_section_ids: set[str] = set()
+ self.escape_newlines = 0
+ self.escape_hyphens = 0
+ self.curfilestack: list[str] = []
+ self.footnotestack: list[dict[str, list[collected_footnote | bool]]] = []
+ self.in_footnote = 0
+ self.in_samp = 0
+ self.handled_abbrs: set[str] = set()
+ self.colwidths: list[int] = []
+
+ def finish(self) -> None:
+ 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(f'@unnumbered {name}\n\n{content}\n')
+
+ 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{{{}}}@w{{{}}}\n'.format(r, ' ' * 30))
+ self.ensure_eol()
+ self.fragment = ''.join(self.body)
+ self.elements['body'] = self.fragment
+ self.output = TEMPLATE % self.elements
+
+ # -- Helper routines
+
+ def init_settings(self) -> None:
+ elements = self.elements = self.default_elements.copy()
+ elements.update({
+ # if empty, the title is set to the first section title
+ 'title': self.settings.title,
+ 'author': self.settings.author,
+ # if empty, use basename of input file
+ 'filename': self.settings.texinfo_filename,
+ 'release': self.escape(self.config.release),
+ 'project': self.escape(self.config.project),
+ 'copyright': self.escape(self.config.copyright),
+ 'date': self.escape(self.config.today or
+ format_date(self.config.today_fmt or _('%b %d, %Y'),
+ language=self.config.language)),
+ })
+ # title
+ title: str = self.settings.title
+ if not title:
+ title_node = self.document.next_node(nodes.title)
+ title = title_node.astext() if title_node else '<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'): # type: ignore[index]
+ elements['filename'] = elements['filename'][:-4] # type: ignore[index]
+ elements['filename'] += '.info' # type: ignore[operator]
+ # direntry
+ if self.settings.texinfo_dir_entry:
+ entry = self.format_menu_entry(
+ self.escape_menu(self.settings.texinfo_dir_entry),
+ '(%s)' % elements['filename'],
+ self.escape_arg(self.settings.texinfo_dir_description))
+ elements['direntry'] = ('@dircategory %s\n'
+ '@direntry\n'
+ '%s'
+ '@end direntry\n') % (
+ self.escape_id(self.settings.texinfo_dir_category), entry)
+ elements['copying'] = COPYING % elements
+ # allow the user to override them all
+ elements.update(self.settings.texinfo_elements)
+
+ def collect_node_names(self) -> None:
+ """Generates a unique id for each section.
+
+ Assigns the attribute ``node_name`` to each section."""
+
+ def add_node_name(name: str) -> str:
+ node_id = self.escape_id(name)
+ nth, suffix = 1, ''
+ while node_id + suffix in self.written_ids or \
+ node_id + suffix in self.node_names:
+ nth += 1
+ suffix = '<%s>' % nth
+ node_id += suffix
+ self.written_ids.add(node_id)
+ self.node_names[node_id] = name
+ return node_id
+
+ # must have a "Top" node
+ self.document['node_name'] = 'Top'
+ add_node_name('Top')
+ add_node_name('top')
+ # each index is a node
+ self.indices = [(add_node_name(name), content)
+ for name, content in self.indices]
+ # each section is also a node
+ for section in self.document.findall(nodes.section):
+ title = cast(nodes.TextElement, section.next_node(nodes.Titular))
+ name = title.astext() if title else '<untitled>'
+ section['node_name'] = add_node_name(name)
+
+ def collect_node_menus(self) -> None:
+ """Collect the menu entries for each "node" section."""
+ node_menus = self.node_menus
+ targets: list[Element] = [self.document]
+ targets.extend(self.document.findall(nodes.section))
+ for node in targets:
+ assert 'node_name' in node and node['node_name'] # NoQA: PT018
+ 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.parent if title else 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) -> None:
+ """Collect the relative links (next, previous, up) for each "node"."""
+ rellinks = self.rellinks
+ node_menus = self.node_menus
+ for id in node_menus:
+ 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: str) -> str:
+ """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{'}")
+ return s
+
+ def escape_arg(self, s: str) -> str:
+ """Return an escaped string suitable for use as an argument
+ to a Texinfo command."""
+ s = self.escape(s)
+ # commas are the argument delimiters
+ s = s.replace(',', '@comma{}')
+ # normalize white space
+ s = ' '.join(s.split()).strip()
+ return s
+
+ def escape_id(self, s: str) -> str:
+ """Return an escaped string suitable for node names and anchors."""
+ bad_chars = ',:()'
+ for bc in bad_chars:
+ s = s.replace(bc, ' ')
+ if re.search('[^ .]', s):
+ # remove DOTs if name contains other characters
+ s = s.replace('.', ' ')
+ s = ' '.join(s.split()).strip()
+ return self.escape(s)
+
+ def escape_menu(self, s: str) -> str:
+ """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) -> None:
+ """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: str, node_name: str, desc: str) -> str:
+ if name == node_name:
+ s = f'* {name}:: '
+ else:
+ s = f'* {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: list[str],
+ reg: re.Pattern[str] = re.compile(r'\s+---?\s+'),
+ ) -> None:
+ for entry in entries:
+ name = self.node_names[entry]
+ # special formatting for entries that are divided by an em-dash
+ try:
+ parts = reg.split(name, 1)
+ except TypeError:
+ # could be a gettext proxy
+ parts = [name]
+ 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: str) -> None:
+ entries = self.node_menus[node_name]
+ if not entries:
+ return
+ self.body.append('\n@menu\n')
+ self.add_menu_entries(entries)
+ if (node_name != 'Top' or
+ not self.node_menus[entries[0]] or
+ self.config.texinfo_no_detailmenu):
+ self.body.append('\n@end menu\n')
+ return
+
+ def _add_detailed_menu(name: str) -> None:
+ entries = self.node_menus[name]
+ if not entries:
+ return
+ self.body.append(f'\n{self.escape(self.node_names[name], )}\n\n')
+ self.add_menu_entries(entries)
+ for subentry in entries:
+ _add_detailed_menu(subentry)
+
+ self.body.append('\n@detailmenu\n'
+ ' --- The Detailed Node Listing ---\n')
+ for entry in entries:
+ _add_detailed_menu(entry)
+ self.body.append('\n@end detailmenu\n'
+ '@end menu\n')
+
+ def tex_image_length(self, width_str: str) -> str:
+ match = re.match(r'(\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) -> None:
+ def generate(content: list[tuple[str, list[IndexEntry]]], collapsed: bool) -> str:
+ 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(f'{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.config.texinfo_domain_indices
+ if indices_config:
+ for domain in self.builder.env.domains.values():
+ for indexcls in domain.indices:
+ indexname = f'{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
+ self.indices.append((indexcls.localname,
+ generate(content, collapsed)))
+ # only add the main Index if it's not empty
+ domain = cast(IndexDomain, self.builder.env.get_domain('index'))
+ for docname in self.builder.docnames:
+ if domain.entries[docname]:
+ self.indices.append((_('Index'), '\n@printindex ge\n'))
+ break
+
+ # this is copied from the latex writer
+ # TODO: move this to sphinx.util
+
+ def collect_footnotes(
+ self, node: Element,
+ ) -> dict[str, list[collected_footnote | bool]]:
+ def footnotes_under(n: Element) -> Iterator[nodes.footnote]:
+ if isinstance(n, nodes.footnote):
+ yield n
+ else:
+ for c in n.children:
+ if isinstance(c, addnodes.start_of_file):
+ continue
+ elif isinstance(c, nodes.Element):
+ yield from footnotes_under(c)
+ fnotes: dict[str, list[collected_footnote | bool]] = {}
+ for fn in footnotes_under(node):
+ label = cast(nodes.label, fn[0])
+ num = label.astext().strip()
+ fnotes[num] = [collected_footnote('', *fn.children), False]
+ return fnotes
+
+ # -- xref handling
+
+ def get_short_id(self, id: str) -> str:
+ """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: str, node: Node) -> None:
+ 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: str, name: str, node: Node) -> None:
+ name = self.escape_menu(name)
+ sid = self.get_short_id(id)
+ if self.config.texinfo_cross_references:
+ self.body.append(f'@ref{{{sid},,{name}}}')
+ self.referenced_ids.add(sid)
+ self.referenced_ids.add(self.escape_id(id))
+ else:
+ self.body.append(name)
+
+ # -- Visiting
+
+ def visit_document(self, node: Element) -> None:
+ 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: Element) -> None:
+ self.footnotestack.pop()
+ self.curfilestack.pop()
+
+ def visit_Text(self, node: Text) -> None:
+ s = self.escape(node.astext())
+ if self.escape_newlines:
+ s = s.replace('\n', ' ')
+ if self.escape_hyphens:
+ # prevent "--" and "---" conversion
+ s = s.replace('-', '@w{-}')
+ self.body.append(s)
+
+ def depart_Text(self, node: Text) -> None:
+ pass
+
+ def visit_section(self, node: Element) -> None:
+ 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 sorted(self.next_section_ids):
+ self.add_anchor(id, node)
+
+ self.next_section_ids.clear()
+ self.previous_section = cast(nodes.section, node)
+ self.section_level += 1
+
+ def depart_section(self, node: Element) -> None:
+ self.section_level -= 1
+
+ headings = (
+ '@unnumbered',
+ '@chapter',
+ '@section',
+ '@subsection',
+ '@subsubsection',
+ )
+
+ rubrics = (
+ '@heading',
+ '@subheading',
+ '@subsubheading',
+ )
+
+ def visit_title(self, node: Element) -> None:
+ if not self.seen_title:
+ self.seen_title = True
+ raise nodes.SkipNode
+ parent = node.parent
+ if isinstance(parent, nodes.table):
+ return
+ if isinstance(parent, (nodes.Admonition, nodes.sidebar, nodes.topic)):
+ raise nodes.SkipNode
+ if not isinstance(parent, nodes.section):
+ logger.warning(__('encountered title node not in section, topic, table, '
+ 'admonition or sidebar'),
+ location=node)
+ 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: Element) -> None:
+ self.body.append('\n\n')
+
+ def visit_rubric(self, node: Element) -> None:
+ if len(node) == 1 and node.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)
+ self.escape_newlines += 1
+
+ def depart_rubric(self, node: Element) -> None:
+ self.escape_newlines -= 1
+ self.body.append('\n\n')
+
+ def visit_subtitle(self, node: Element) -> None:
+ self.body.append('\n\n@noindent\n')
+
+ def depart_subtitle(self, node: Element) -> None:
+ self.body.append('\n\n')
+
+ # -- References
+
+ def visit_target(self, node: Element) -> None:
+ # 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, AttributeError):
+ 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: Element) -> None:
+ pass
+
+ def visit_reference(self, node: Element) -> None:
+ # 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(f'@email{{{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(f'@ref{{{id},,,{uri}}}')
+ else:
+ self.body.append(f'@ref{{{id},,{name},{uri}}}')
+ else:
+ uri = self.escape_arg(uri)
+ name = self.escape_arg(name)
+ show_urls = self.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(f'@uref{{{uri},{name}}}')
+ elif show_urls == 'no':
+ self.body.append(f'@uref{{{uri},,{name}}}')
+ else:
+ self.body.append(f'{name}@footnote{{{uri}}}')
+ raise nodes.SkipNode
+
+ def depart_reference(self, node: Element) -> None:
+ pass
+
+ def visit_number_reference(self, node: Element) -> None:
+ text = nodes.Text(node.get('title', '#'))
+ self.visit_Text(text)
+ raise nodes.SkipNode
+
+ def visit_title_reference(self, node: Element) -> None:
+ text = node.astext()
+ self.body.append('@cite{%s}' % self.escape_arg(text))
+ raise nodes.SkipNode
+
+ # -- Blocks
+
+ def visit_paragraph(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def depart_paragraph(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def visit_block_quote(self, node: Element) -> None:
+ self.body.append('\n@quotation\n')
+
+ def depart_block_quote(self, node: Element) -> None:
+ self.ensure_eol()
+ self.body.append('@end quotation\n')
+
+ def visit_literal_block(self, node: Element | None) -> None:
+ self.body.append('\n@example\n')
+
+ def depart_literal_block(self, node: Element | None) -> None:
+ self.ensure_eol()
+ self.body.append('@end example\n')
+
+ visit_doctest_block = visit_literal_block
+ depart_doctest_block = depart_literal_block
+
+ def visit_line_block(self, node: Element) -> None:
+ if not isinstance(node.parent, nodes.line_block):
+ self.body.append('\n\n')
+ self.body.append('@display\n')
+
+ def depart_line_block(self, node: Element) -> None:
+ self.body.append('@end display\n')
+ if not isinstance(node.parent, nodes.line_block):
+ self.body.append('\n\n')
+
+ def visit_line(self, node: Element) -> None:
+ self.escape_newlines += 1
+
+ def depart_line(self, node: Element) -> None:
+ self.body.append('@w{ }\n')
+ self.escape_newlines -= 1
+
+ # -- Inline
+
+ def visit_strong(self, node: Element) -> None:
+ self.body.append('`')
+
+ def depart_strong(self, node: Element) -> None:
+ self.body.append("'")
+
+ def visit_emphasis(self, node: Element) -> None:
+ if self.in_samp:
+ self.body.append('@var{')
+ self.context.append('}')
+ else:
+ self.body.append('`')
+ self.context.append("'")
+
+ def depart_emphasis(self, node: Element) -> None:
+ self.body.append(self.context.pop())
+
+ def is_samp(self, node: Element) -> bool:
+ return 'samp' in node['classes']
+
+ def visit_literal(self, node: Element) -> None:
+ if self.is_samp(node):
+ self.in_samp += 1
+ self.body.append('@code{')
+
+ def depart_literal(self, node: Element) -> None:
+ if self.is_samp(node):
+ self.in_samp -= 1
+ self.body.append('}')
+
+ def visit_superscript(self, node: Element) -> None:
+ self.body.append('@w{^')
+
+ def depart_superscript(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_subscript(self, node: Element) -> None:
+ self.body.append('@w{[')
+
+ def depart_subscript(self, node: Element) -> None:
+ self.body.append(']}')
+
+ # -- Footnotes
+
+ def visit_footnote(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_collected_footnote(self, node: Element) -> None:
+ self.in_footnote += 1
+ self.body.append('@footnote{')
+
+ def depart_collected_footnote(self, node: Element) -> None:
+ self.body.append('}')
+ self.in_footnote -= 1
+
+ def visit_footnote_reference(self, node: Element) -> None:
+ num = node.astext().strip()
+ try:
+ footnode, used = self.footnotestack[-1][num]
+ except (KeyError, IndexError) as exc:
+ raise nodes.SkipNode from exc
+ # footnotes are repeated for each reference
+ footnode.walkabout(self) # type: ignore[union-attr]
+ raise nodes.SkipChildren
+
+ def visit_citation(self, node: Element) -> None:
+ self.body.append('\n')
+ for id in node.get('ids'):
+ self.add_anchor(id, node)
+ self.escape_newlines += 1
+
+ def depart_citation(self, node: Element) -> None:
+ self.escape_newlines -= 1
+
+ def visit_citation_reference(self, node: Element) -> None:
+ self.body.append('@w{[')
+
+ def depart_citation_reference(self, node: Element) -> None:
+ self.body.append(']}')
+
+ # -- Lists
+
+ def visit_bullet_list(self, node: Element) -> None:
+ bullet = node.get('bullet', '*')
+ self.body.append('\n\n@itemize %s\n' % bullet)
+
+ def depart_bullet_list(self, node: Element) -> None:
+ self.ensure_eol()
+ self.body.append('@end itemize\n')
+
+ def visit_enumerated_list(self, node: Element) -> None:
+ # 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: Element) -> None:
+ self.ensure_eol()
+ self.body.append('@end enumerate\n')
+
+ def visit_list_item(self, node: Element) -> None:
+ self.body.append('\n@item ')
+
+ def depart_list_item(self, node: Element) -> None:
+ pass
+
+ # -- Option List
+
+ def visit_option_list(self, node: Element) -> None:
+ self.body.append('\n\n@table @option\n')
+
+ def depart_option_list(self, node: Element) -> None:
+ self.ensure_eol()
+ self.body.append('@end table\n')
+
+ def visit_option_list_item(self, node: Element) -> None:
+ pass
+
+ def depart_option_list_item(self, node: Element) -> None:
+ pass
+
+ def visit_option_group(self, node: Element) -> None:
+ self.at_item_x = '@item'
+
+ def depart_option_group(self, node: Element) -> None:
+ pass
+
+ def visit_option(self, node: Element) -> None:
+ self.escape_hyphens += 1
+ self.body.append('\n%s ' % self.at_item_x)
+ self.at_item_x = '@itemx'
+
+ def depart_option(self, node: Element) -> None:
+ self.escape_hyphens -= 1
+
+ def visit_option_string(self, node: Element) -> None:
+ pass
+
+ def depart_option_string(self, node: Element) -> None:
+ pass
+
+ def visit_option_argument(self, node: Element) -> None:
+ self.body.append(node.get('delimiter', ' '))
+
+ def depart_option_argument(self, node: Element) -> None:
+ pass
+
+ def visit_description(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def depart_description(self, node: Element) -> None:
+ pass
+
+ # -- Definitions
+
+ def visit_definition_list(self, node: Element) -> None:
+ self.body.append('\n\n@table @asis\n')
+
+ def depart_definition_list(self, node: Element) -> None:
+ self.ensure_eol()
+ self.body.append('@end table\n')
+
+ def visit_definition_list_item(self, node: Element) -> None:
+ self.at_item_x = '@item'
+
+ def depart_definition_list_item(self, node: Element) -> None:
+ pass
+
+ def visit_term(self, node: Element) -> None:
+ 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: Element) -> None:
+ pass
+
+ def visit_classifier(self, node: Element) -> None:
+ self.body.append(' : ')
+
+ def depart_classifier(self, node: Element) -> None:
+ pass
+
+ def visit_definition(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def depart_definition(self, node: Element) -> None:
+ pass
+
+ # -- Tables
+
+ def visit_table(self, node: Element) -> None:
+ self.entry_sep = '@item'
+
+ def depart_table(self, node: Element) -> None:
+ self.body.append('\n@end multitable\n\n')
+
+ def visit_tabular_col_spec(self, node: Element) -> None:
+ pass
+
+ def depart_tabular_col_spec(self, node: Element) -> None:
+ pass
+
+ def visit_colspec(self, node: Element) -> None:
+ self.colwidths.append(node['colwidth'])
+ if len(self.colwidths) != self.n_cols:
+ return
+ self.body.append('\n\n@multitable ')
+ for n in self.colwidths:
+ self.body.append('{%s} ' % ('x' * (n + 2)))
+
+ def depart_colspec(self, node: Element) -> None:
+ pass
+
+ def visit_tgroup(self, node: Element) -> None:
+ self.colwidths = []
+ self.n_cols = node['cols']
+
+ def depart_tgroup(self, node: Element) -> None:
+ pass
+
+ def visit_thead(self, node: Element) -> None:
+ self.entry_sep = '@headitem'
+
+ def depart_thead(self, node: Element) -> None:
+ pass
+
+ def visit_tbody(self, node: Element) -> None:
+ pass
+
+ def depart_tbody(self, node: Element) -> None:
+ pass
+
+ def visit_row(self, node: Element) -> None:
+ pass
+
+ def depart_row(self, node: Element) -> None:
+ self.entry_sep = '@item'
+
+ def visit_entry(self, node: Element) -> None:
+ self.body.append('\n%s\n' % self.entry_sep)
+ self.entry_sep = '@tab'
+
+ def depart_entry(self, node: Element) -> None:
+ for _i in range(node.get('morecols', 0)):
+ self.body.append('\n@tab\n')
+
+ # -- Field Lists
+
+ def visit_field_list(self, node: Element) -> None:
+ pass
+
+ def depart_field_list(self, node: Element) -> None:
+ pass
+
+ def visit_field(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def depart_field(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def visit_field_name(self, node: Element) -> None:
+ self.ensure_eol()
+ self.body.append('@*')
+
+ def depart_field_name(self, node: Element) -> None:
+ self.body.append(': ')
+
+ def visit_field_body(self, node: Element) -> None:
+ pass
+
+ def depart_field_body(self, node: Element) -> None:
+ pass
+
+ # -- Admonitions
+
+ def visit_admonition(self, node: Element, name: str = '') -> None:
+ if not name:
+ title = cast(nodes.title, node[0])
+ name = self.escape(title.astext())
+ self.body.append('\n@cartouche\n@quotation %s ' % name)
+
+ def _visit_named_admonition(self, node: Element) -> None:
+ label = admonitionlabels[node.tagname]
+ self.body.append('\n@cartouche\n@quotation %s ' % label)
+
+ def depart_admonition(self, node: Element) -> None:
+ self.ensure_eol()
+ self.body.append('@end quotation\n'
+ '@end cartouche\n')
+
+ visit_attention = _visit_named_admonition
+ depart_attention = depart_admonition
+ visit_caution = _visit_named_admonition
+ depart_caution = depart_admonition
+ visit_danger = _visit_named_admonition
+ depart_danger = depart_admonition
+ visit_error = _visit_named_admonition
+ depart_error = depart_admonition
+ visit_hint = _visit_named_admonition
+ depart_hint = depart_admonition
+ visit_important = _visit_named_admonition
+ depart_important = depart_admonition
+ visit_note = _visit_named_admonition
+ depart_note = depart_admonition
+ visit_tip = _visit_named_admonition
+ depart_tip = depart_admonition
+ visit_warning = _visit_named_admonition
+ depart_warning = depart_admonition
+
+ # -- Misc
+
+ def visit_docinfo(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_generated(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_header(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_footer(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_container(self, node: Element) -> None:
+ if node.get('literal_block'):
+ self.body.append('\n\n@float LiteralBlock\n')
+
+ def depart_container(self, node: Element) -> None:
+ if node.get('literal_block'):
+ self.body.append('\n@end float\n\n')
+
+ def visit_decoration(self, node: Element) -> None:
+ pass
+
+ def depart_decoration(self, node: Element) -> None:
+ pass
+
+ def visit_topic(self, node: Element) -> None:
+ # ignore TOC's since we have to have a "menu" anyway
+ if 'contents' in node.get('classes', []):
+ raise nodes.SkipNode
+ title = cast(nodes.title, node[0])
+ self.visit_rubric(title)
+ self.body.append('%s\n' % self.escape(title.astext()))
+ self.depart_rubric(title)
+
+ def depart_topic(self, node: Element) -> None:
+ pass
+
+ def visit_transition(self, node: Element) -> None:
+ self.body.append('\n\n%s\n\n' % ('_' * 66))
+
+ def depart_transition(self, node: Element) -> None:
+ pass
+
+ def visit_attribution(self, node: Element) -> None:
+ self.body.append('\n\n@center --- ')
+
+ def depart_attribution(self, node: Element) -> None:
+ self.body.append('\n\n')
+
+ def visit_raw(self, node: Element) -> None:
+ 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: Element) -> None:
+ self.body.append('\n\n@float Figure\n')
+
+ def depart_figure(self, node: Element) -> None:
+ self.body.append('\n@end float\n\n')
+
+ def visit_caption(self, node: Element) -> None:
+ if (isinstance(node.parent, nodes.figure) or
+ (isinstance(node.parent, nodes.container) and
+ node.parent.get('literal_block'))):
+ self.body.append('\n@caption{')
+ else:
+ logger.warning(__('caption not inside a figure.'),
+ location=node)
+
+ def depart_caption(self, node: Element) -> None:
+ if (isinstance(node.parent, nodes.figure) or
+ (isinstance(node.parent, nodes.container) and
+ node.parent.get('literal_block'))):
+ self.body.append('}\n')
+
+ def visit_image(self, node: Element) -> None:
+ 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)
+ # width and height ignored in non-tex output
+ width = self.tex_image_length(node.get('width', ''))
+ height = self.tex_image_length(node.get('height', ''))
+ alt = self.escape_arg(node.get('alt', ''))
+ filename = f"{self.elements['filename'][:-5]}-figures/{name}" # type: ignore[index]
+ self.body.append('\n@image{%s,%s,%s,%s,%s}\n' %
+ (filename, width, height, alt, ext[1:]))
+
+ def depart_image(self, node: Element) -> None:
+ pass
+
+ def visit_compound(self, node: Element) -> None:
+ pass
+
+ def depart_compound(self, node: Element) -> None:
+ pass
+
+ def visit_sidebar(self, node: Element) -> None:
+ self.visit_topic(node)
+
+ def depart_sidebar(self, node: Element) -> None:
+ self.depart_topic(node)
+
+ def visit_label(self, node: Element) -> None:
+ # label numbering is automatically generated by Texinfo
+ if self.in_footnote:
+ raise nodes.SkipNode
+ self.body.append('@w{(')
+
+ def depart_label(self, node: Element) -> None:
+ self.body.append(')} ')
+
+ def visit_legend(self, node: Element) -> None:
+ pass
+
+ def depart_legend(self, node: Element) -> None:
+ pass
+
+ def visit_substitution_reference(self, node: Element) -> None:
+ pass
+
+ def depart_substitution_reference(self, node: Element) -> None:
+ pass
+
+ def visit_substitution_definition(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_system_message(self, node: Element) -> None:
+ self.body.append('\n@verbatim\n'
+ '<SYSTEM MESSAGE: %s>\n'
+ '@end verbatim\n' % node.astext())
+ raise nodes.SkipNode
+
+ def visit_comment(self, node: Element) -> None:
+ 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: Element) -> None:
+ self.body.append('>>')
+
+ def depart_problematic(self, node: Element) -> None:
+ self.body.append('<<')
+
+ def unimplemented_visit(self, node: Element) -> None:
+ logger.warning(__("unimplemented node type: %r"), node,
+ location=node)
+
+ def unknown_departure(self, node: Node) -> None:
+ pass
+
+ # -- Sphinx specific
+
+ def visit_productionlist(self, node: Element) -> None:
+ self.visit_literal_block(None)
+ names = []
+ productionlist = cast(Iterable[addnodes.production], node)
+ for production in productionlist:
+ names.append(production['tokenname'])
+ maxlen = max(len(name) for name in names)
+ for production in productionlist:
+ if production['tokenname']:
+ for id in production.get('ids'):
+ self.add_anchor(id, production)
+ s = production['tokenname'].ljust(maxlen) + ' ::='
+ 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: Element) -> None:
+ pass
+
+ def depart_production(self, node: Element) -> None:
+ pass
+
+ def visit_literal_emphasis(self, node: Element) -> None:
+ self.body.append('@code{')
+
+ def depart_literal_emphasis(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_literal_strong(self, node: Element) -> None:
+ self.body.append('@code{')
+
+ def depart_literal_strong(self, node: Element) -> None:
+ self.body.append('}')
+
+ def visit_index(self, node: Element) -> None:
+ # 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_type, value, _target_id, _main, _category_key) in node['entries']:
+ text = self.escape_menu(value)
+ self.body.append('@geindex %s\n' % text)
+
+ def visit_versionmodified(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def depart_versionmodified(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def visit_start_of_file(self, node: Element) -> None:
+ # 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: Element) -> None:
+ self.curfilestack.pop()
+ self.footnotestack.pop()
+
+ def visit_centered(self, node: Element) -> None:
+ txt = self.escape_arg(node.astext())
+ self.body.append('\n\n@center %s\n\n' % txt)
+ raise nodes.SkipNode
+
+ def visit_seealso(self, node: Element) -> None:
+ self.body.append('\n\n@subsubheading %s\n\n' %
+ admonitionlabels['seealso'])
+
+ def depart_seealso(self, node: Element) -> None:
+ self.body.append('\n')
+
+ def visit_meta(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_glossary(self, node: Element) -> None:
+ pass
+
+ def depart_glossary(self, node: Element) -> None:
+ pass
+
+ def visit_acks(self, node: Element) -> None:
+ bullet_list = cast(nodes.bullet_list, node[0])
+ list_items = cast(Iterable[nodes.list_item], bullet_list)
+ self.body.append('\n\n')
+ self.body.append(', '.join(n.astext() for n in list_items) + '.')
+ self.body.append('\n\n')
+ raise nodes.SkipNode
+
+ #############################################################
+ # Domain-specific object descriptions
+ #############################################################
+
+ # Top-level nodes for descriptions
+ ##################################
+
+ def visit_desc(self, node: addnodes.desc) -> None:
+ self.descs.append(node)
+ self.at_deffnx = '@deffn'
+
+ def depart_desc(self, node: addnodes.desc) -> None:
+ self.descs.pop()
+ self.ensure_eol()
+ self.body.append('@end deffn\n')
+
+ def visit_desc_signature(self, node: Element) -> None:
+ self.escape_hyphens += 1
+ 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.get_domain(node.parent['domain'])
+ name = domain.get_type_name(domain.object_types[objtype],
+ self.config.primary_domain == domain.name)
+ except (KeyError, ExtensionError):
+ name = objtype
+ # by convention, the deffn category should be capitalized like a title
+ category = self.escape_arg(smart_capwords(name))
+ self.body.append(f'\n{self.at_deffnx} {{{category}}} ')
+ self.at_deffnx = '@deffnx'
+ self.desc_type_name: str | None = name
+
+ def depart_desc_signature(self, node: Element) -> None:
+ self.body.append("\n")
+ self.escape_hyphens -= 1
+ self.desc_type_name = None
+
+ def visit_desc_signature_line(self, node: Element) -> None:
+ pass
+
+ def depart_desc_signature_line(self, node: Element) -> None:
+ pass
+
+ def visit_desc_content(self, node: Element) -> None:
+ pass
+
+ def depart_desc_content(self, node: Element) -> None:
+ pass
+
+ def visit_desc_inline(self, node: Element) -> None:
+ pass
+
+ def depart_desc_inline(self, node: Element) -> None:
+ pass
+
+ # Nodes for high-level structure in signatures
+ ##############################################
+
+ def visit_desc_name(self, node: Element) -> None:
+ pass
+
+ def depart_desc_name(self, node: Element) -> None:
+ pass
+
+ def visit_desc_addname(self, node: Element) -> None:
+ pass
+
+ def depart_desc_addname(self, node: Element) -> None:
+ pass
+
+ def visit_desc_type(self, node: Element) -> None:
+ pass
+
+ def depart_desc_type(self, node: Element) -> None:
+ pass
+
+ def visit_desc_returns(self, node: Element) -> None:
+ self.body.append(' -> ')
+
+ def depart_desc_returns(self, node: Element) -> None:
+ pass
+
+ def visit_desc_parameterlist(self, node: Element) -> None:
+ self.body.append(' (')
+ self.first_param = 1
+
+ def depart_desc_parameterlist(self, node: Element) -> None:
+ self.body.append(')')
+
+ def visit_desc_type_parameter_list(self, node: Element) -> None:
+ self.body.append(' [')
+ self.first_param = 1
+
+ def depart_desc_type_parameter_list(self, node: Element) -> None:
+ self.body.append(']')
+
+ def visit_desc_parameter(self, node: Element) -> None:
+ 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(' ', '@w{ }')
+ self.body.append(text)
+ raise nodes.SkipNode
+
+ def visit_desc_type_parameter(self, node: Element) -> None:
+ self.visit_desc_parameter(node)
+
+ def visit_desc_optional(self, node: Element) -> None:
+ self.body.append('[')
+
+ def depart_desc_optional(self, node: Element) -> None:
+ self.body.append(']')
+
+ def visit_desc_annotation(self, node: Element) -> None:
+ # Try to avoid duplicating info already displayed by the deffn category.
+ # e.g.
+ # @deffn {Class} Foo
+ # -- instead of --
+ # @deffn {Class} class Foo
+ txt = node.astext().strip()
+ if ((self.descs and txt == self.descs[-1]['objtype']) or
+ (self.desc_type_name and txt in self.desc_type_name.split())):
+ raise nodes.SkipNode
+
+ def depart_desc_annotation(self, node: Element) -> None:
+ pass
+
+ ##############################################
+
+ def visit_inline(self, node: Element) -> None:
+ pass
+
+ def depart_inline(self, node: Element) -> None:
+ pass
+
+ def visit_abbreviation(self, node: Element) -> None:
+ 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: Element) -> None:
+ self.body.append(self.context.pop())
+
+ def visit_manpage(self, node: Element) -> None:
+ return self.visit_literal_emphasis(node)
+
+ def depart_manpage(self, node: Element) -> None:
+ return self.depart_literal_emphasis(node)
+
+ def visit_download_reference(self, node: Element) -> None:
+ pass
+
+ def depart_download_reference(self, node: Element) -> None:
+ pass
+
+ def visit_hlist(self, node: Element) -> None:
+ self.visit_bullet_list(node)
+
+ def depart_hlist(self, node: Element) -> None:
+ self.depart_bullet_list(node)
+
+ def visit_hlistcol(self, node: Element) -> None:
+ pass
+
+ def depart_hlistcol(self, node: Element) -> None:
+ pass
+
+ def visit_pending_xref(self, node: Element) -> None:
+ pass
+
+ def depart_pending_xref(self, node: Element) -> None:
+ pass
+
+ def visit_math(self, node: Element) -> None:
+ self.body.append('@math{' + self.escape_arg(node.astext()) + '}')
+ raise nodes.SkipNode
+
+ def visit_math_block(self, node: Element) -> None:
+ 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.astext()))
+ raise nodes.SkipNode
diff --git a/sphinx/writers/text.py b/sphinx/writers/text.py
new file mode 100644
index 0000000..63df2d7
--- /dev/null
+++ b/sphinx/writers/text.py
@@ -0,0 +1,1305 @@
+"""Custom docutils writer for plain text."""
+from __future__ import annotations
+
+import math
+import os
+import re
+import textwrap
+from collections.abc import Generator, Iterable, Sequence
+from itertools import chain, groupby
+from typing import TYPE_CHECKING, Any, cast
+
+from docutils import nodes, writers
+from docutils.utils import column_width
+
+from sphinx import addnodes
+from sphinx.locale import _, admonitionlabels
+from sphinx.util.docutils import SphinxTranslator
+
+if TYPE_CHECKING:
+ from docutils.nodes import Element, Text
+
+ from sphinx.builders.text import TextBuilder
+
+
+class Cell:
+ """Represents a cell in a table.
+ It can span multiple columns or multiple lines.
+ """
+ def __init__(self, text: str = "", rowspan: int = 1, colspan: int = 1) -> None:
+ self.text = text
+ self.wrapped: list[str] = []
+ self.rowspan = rowspan
+ self.colspan = colspan
+ self.col: int | None = None
+ self.row: int | None = None
+
+ def __repr__(self) -> str:
+ return f"<Cell {self.text!r} {self.row}v{self.rowspan}/{self.col}>{self.colspan}>"
+
+ def __hash__(self) -> int:
+ return hash((self.col, self.row))
+
+ def __bool__(self) -> bool:
+ return self.text != '' and self.col is not None and self.row is not None
+
+ def wrap(self, width: int) -> None:
+ self.wrapped = my_wrap(self.text, width)
+
+
+class Table:
+ """Represents a table, handling cells that can span multiple lines
+ or rows, like::
+
+ +-----------+-----+
+ | AAA | BBB |
+ +-----+-----+ |
+ | | XXX | |
+ | +-----+-----+
+ | DDD | CCC |
+ +-----+-----------+
+
+ This class can be used in two ways, either:
+
+ - With absolute positions: call ``table[line, col] = Cell(...)``,
+ this overwrites any existing cell(s) at these positions.
+
+ - With relative positions: call the ``add_row()`` and
+ ``add_cell(Cell(...))`` as needed.
+
+ Cells spanning multiple rows or multiple columns (having a
+ colspan or rowspan greater than one) are automatically referenced
+ by all the table cells they cover. This is a useful
+ representation as we can simply check
+ ``if self[x, y] is self[x, y+1]`` to recognize a rowspan.
+
+ Colwidth is not automatically computed, it has to be given, either
+ at construction time, or during the table construction.
+
+ Example usage::
+
+ table = Table([6, 6])
+ table.add_cell(Cell("foo"))
+ table.add_cell(Cell("bar"))
+ table.set_separator()
+ table.add_row()
+ table.add_cell(Cell("FOO"))
+ table.add_cell(Cell("BAR"))
+ print(table)
+ +--------+--------+
+ | foo | bar |
+ |========|========|
+ | FOO | BAR |
+ +--------+--------+
+
+ """
+ def __init__(self, colwidth: list[int] | None = None) -> None:
+ self.lines: list[list[Cell]] = []
+ self.separator = 0
+ self.colwidth: list[int] = (colwidth if colwidth is not None else [])
+ self.current_line = 0
+ self.current_col = 0
+
+ def add_row(self) -> None:
+ """Add a row to the table, to use with ``add_cell()``. It is not needed
+ to call ``add_row()`` before the first ``add_cell()``.
+ """
+ self.current_line += 1
+ self.current_col = 0
+
+ def set_separator(self) -> None:
+ """Sets the separator below the current line."""
+ self.separator = len(self.lines)
+
+ def add_cell(self, cell: Cell) -> None:
+ """Add a cell to the current line, to use with ``add_row()``. To add
+ a cell spanning multiple lines or rows, simply set the
+ ``cell.colspan`` or ``cell.rowspan`` BEFORE inserting it into
+ the table.
+ """
+ while self[self.current_line, self.current_col]:
+ self.current_col += 1
+ self[self.current_line, self.current_col] = cell
+ self.current_col += cell.colspan
+
+ def __getitem__(self, pos: tuple[int, int]) -> Cell:
+ line, col = pos
+ self._ensure_has_line(line + 1)
+ self._ensure_has_column(col + 1)
+ return self.lines[line][col]
+
+ def __setitem__(self, pos: tuple[int, int], cell: Cell) -> None:
+ line, col = pos
+ self._ensure_has_line(line + cell.rowspan)
+ self._ensure_has_column(col + cell.colspan)
+ for dline in range(cell.rowspan):
+ for dcol in range(cell.colspan):
+ self.lines[line + dline][col + dcol] = cell
+ cell.row = line
+ cell.col = col
+
+ def _ensure_has_line(self, line: int) -> None:
+ while len(self.lines) < line:
+ self.lines.append([])
+
+ def _ensure_has_column(self, col: int) -> None:
+ for line in self.lines:
+ while len(line) < col:
+ line.append(Cell())
+
+ def __repr__(self) -> str:
+ return "\n".join(repr(line) for line in self.lines)
+
+ def cell_width(self, cell: Cell, source: list[int]) -> int:
+ """Give the cell width, according to the given source (either
+ ``self.colwidth`` or ``self.measured_widths``).
+ This takes into account cells spanning multiple columns.
+ """
+ if cell.row is None or cell.col is None:
+ msg = 'Cell co-ordinates have not been set'
+ raise ValueError(msg)
+ width = 0
+ for i in range(self[cell.row, cell.col].colspan):
+ width += source[cell.col + i]
+ return width + (cell.colspan - 1) * 3
+
+ @property
+ def cells(self) -> Generator[Cell, None, None]:
+ seen: set[Cell] = set()
+ for line in self.lines:
+ for cell in line:
+ if cell and cell not in seen:
+ yield cell
+ seen.add(cell)
+
+ def rewrap(self) -> None:
+ """Call ``cell.wrap()`` on all cells, and measure each column width
+ after wrapping (result written in ``self.measured_widths``).
+ """
+ self.measured_widths = self.colwidth[:]
+ for cell in self.cells:
+ cell.wrap(width=self.cell_width(cell, self.colwidth))
+ if not cell.wrapped:
+ continue
+ if cell.row is None or cell.col is None:
+ msg = 'Cell co-ordinates have not been set'
+ raise ValueError(msg)
+ width = math.ceil(max(column_width(x) for x in cell.wrapped) / cell.colspan)
+ for col in range(cell.col, cell.col + cell.colspan):
+ self.measured_widths[col] = max(self.measured_widths[col], width)
+
+ def physical_lines_for_line(self, line: list[Cell]) -> int:
+ """For a given line, compute the number of physical lines it spans
+ due to text wrapping.
+ """
+ physical_lines = 1
+ for cell in line:
+ physical_lines = max(physical_lines, len(cell.wrapped))
+ return physical_lines
+
+ def __str__(self) -> str:
+ out = []
+ self.rewrap()
+
+ def writesep(char: str = "-", lineno: int | None = None) -> str:
+ """Called on the line *before* lineno.
+ Called with no *lineno* for the last sep.
+ """
+ out: list[str] = []
+ for colno, width in enumerate(self.measured_widths):
+ if (
+ lineno is not None and
+ lineno > 0 and
+ self[lineno, colno] is self[lineno - 1, colno]
+ ):
+ out.append(" " * (width + 2))
+ else:
+ out.append(char * (width + 2))
+ head = "+" if out[0][0] == "-" else "|"
+ tail = "+" if out[-1][0] == "-" else "|"
+ glue = [
+ "+" if left[0] == "-" or right[0] == "-" else "|"
+ for left, right in zip(out, out[1:])
+ ]
+ glue.append(tail)
+ return head + "".join(chain.from_iterable(zip(out, glue)))
+
+ for lineno, line in enumerate(self.lines):
+ if self.separator and lineno == self.separator:
+ out.append(writesep("=", lineno))
+ else:
+ out.append(writesep("-", lineno))
+ for physical_line in range(self.physical_lines_for_line(line)):
+ linestr = ["|"]
+ for colno, cell in enumerate(line):
+ if cell.col != colno:
+ continue
+ if lineno != cell.row: # NoQA: SIM114
+ physical_text = ""
+ elif physical_line >= len(cell.wrapped):
+ physical_text = ""
+ else:
+ physical_text = cell.wrapped[physical_line]
+ adjust_len = len(physical_text) - column_width(physical_text)
+ linestr.append(
+ " " +
+ physical_text.ljust(
+ self.cell_width(cell, self.measured_widths) + 1 + adjust_len,
+ ) + "|",
+ )
+ out.append("".join(linestr))
+ out.append(writesep("-"))
+ return "\n".join(out)
+
+
+class TextWrapper(textwrap.TextWrapper):
+ """Custom subclass that uses a different word separator regex."""
+
+ wordsep_re = re.compile(
+ r'(\s+|' # any whitespace
+ r'(?<=\s)(?::[a-z-]+:)?`\S+|' # interpreted text start
+ r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|' # hyphenated words
+ r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash
+
+ def _wrap_chunks(self, chunks: list[str]) -> list[str]:
+ """_wrap_chunks(chunks : [string]) -> [string]
+
+ The original _wrap_chunks uses len() to calculate width.
+ This method respects wide/fullwidth characters for width adjustment.
+ """
+ lines: list[str] = []
+ if self.width <= 0:
+ raise ValueError("invalid width %r (must be > 0)" % self.width)
+
+ chunks.reverse()
+
+ while chunks:
+ cur_line = []
+ cur_len = 0
+
+ if lines:
+ indent = self.subsequent_indent
+ else:
+ indent = self.initial_indent
+
+ width = self.width - column_width(indent)
+
+ if self.drop_whitespace and chunks[-1].strip() == '' and lines:
+ del chunks[-1]
+
+ while chunks:
+ l = column_width(chunks[-1])
+
+ if cur_len + l <= width:
+ cur_line.append(chunks.pop())
+ cur_len += l
+
+ else:
+ break
+
+ if chunks and column_width(chunks[-1]) > width:
+ self._handle_long_word(chunks, cur_line, cur_len, width)
+
+ if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':
+ del cur_line[-1]
+
+ if cur_line:
+ lines.append(indent + ''.join(cur_line))
+
+ return lines
+
+ def _break_word(self, word: str, space_left: int) -> tuple[str, str]:
+ """_break_word(word : string, space_left : int) -> (string, string)
+
+ Break line by unicode width instead of len(word).
+ """
+ total = 0
+ for i, c in enumerate(word):
+ total += column_width(c)
+ if total > space_left:
+ return word[:i - 1], word[i - 1:]
+ return word, ''
+
+ def _split(self, text: str) -> list[str]:
+ """_split(text : string) -> [string]
+
+ Override original method that only split by 'wordsep_re'.
+ This '_split' splits wide-characters into chunks by one character.
+ """
+ def split(t: str) -> list[str]:
+ return super(TextWrapper, self)._split(t)
+ chunks: list[str] = []
+ for chunk in split(text):
+ for w, g in groupby(chunk, column_width):
+ if w == 1:
+ chunks.extend(split(''.join(g)))
+ else:
+ chunks.extend(list(g))
+ return chunks
+
+ def _handle_long_word(self, reversed_chunks: list[str], cur_line: list[str],
+ cur_len: int, width: int) -> None:
+ """_handle_long_word(chunks : [string],
+ cur_line : [string],
+ cur_len : int, width : int)
+
+ Override original method for using self._break_word() instead of slice.
+ """
+ space_left = max(width - cur_len, 1)
+ if self.break_long_words:
+ l, r = self._break_word(reversed_chunks[-1], space_left)
+ cur_line.append(l)
+ reversed_chunks[-1] = r
+
+ elif not cur_line:
+ cur_line.append(reversed_chunks.pop())
+
+
+MAXWIDTH = 70
+STDINDENT = 3
+
+
+def my_wrap(text: str, width: int = MAXWIDTH, **kwargs: Any) -> list[str]:
+ w = TextWrapper(width=width, **kwargs)
+ return w.wrap(text)
+
+
+class TextWriter(writers.Writer):
+ supported = ('text',)
+ settings_spec = ('No options here.', '', ())
+ settings_defaults: dict[str, Any] = {}
+
+ output: str
+
+ def __init__(self, builder: TextBuilder) -> None:
+ super().__init__()
+ self.builder = builder
+
+ def translate(self) -> None:
+ visitor = self.builder.create_translator(self.document, self.builder)
+ self.document.walkabout(visitor)
+ self.output = cast(TextTranslator, visitor).body
+
+
+class TextTranslator(SphinxTranslator):
+ builder: TextBuilder
+
+ def __init__(self, document: nodes.document, builder: TextBuilder) -> None:
+ super().__init__(document, builder)
+
+ newlines = self.config.text_newlines
+ if newlines == 'windows':
+ self.nl = '\r\n'
+ elif newlines == 'native':
+ self.nl = os.linesep
+ else:
+ self.nl = '\n'
+ self.sectionchars = self.config.text_sectionchars
+ self.add_secnumbers = self.config.text_add_secnumbers
+ self.secnumber_suffix = self.config.text_secnumber_suffix
+ self.states: list[list[tuple[int, str | list[str]]]] = [[]]
+ self.stateindent = [0]
+ self.list_counter: list[int] = []
+ self.sectionlevel = 0
+ self.lineblocklevel = 0
+ self.table: Table
+
+ self.context: list[str] = []
+ """Heterogeneous stack.
+
+ Used by visit_* and depart_* functions in conjunction with the tree
+ traversal. Make sure that the pops correspond to the pushes.
+ """
+
+ def add_text(self, text: str) -> None:
+ self.states[-1].append((-1, text))
+
+ def new_state(self, indent: int = STDINDENT) -> None:
+ self.states.append([])
+ self.stateindent.append(indent)
+
+ def end_state(
+ self, wrap: bool = True, end: Sequence[str] | None = ('',), first: str | None = None,
+ ) -> None:
+ content = self.states.pop()
+ maxindent = sum(self.stateindent)
+ indent = self.stateindent.pop()
+ result: list[tuple[int, list[str]]] = []
+ toformat: list[str] = []
+
+ def do_format() -> None:
+ if not toformat:
+ return
+ if wrap:
+ res = my_wrap(''.join(toformat), width=MAXWIDTH - maxindent)
+ else:
+ res = ''.join(toformat).splitlines()
+ if end:
+ res += end
+ result.append((indent, res))
+ for itemindent, item in content:
+ if itemindent == -1:
+ toformat.append(item) # type: ignore[arg-type]
+ else:
+ do_format()
+ result.append((indent + itemindent, item)) # type: ignore[arg-type]
+ toformat = []
+ do_format()
+ if first is not None and result:
+ # insert prefix into first line (ex. *, [1], See also, etc.)
+ newindent = result[0][0] - indent
+ if result[0][1] == ['']:
+ result.insert(0, (newindent, [first]))
+ else:
+ text = first + result[0][1].pop(0)
+ result.insert(0, (newindent, [text]))
+
+ self.states[-1].extend(result)
+
+ def visit_document(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_document(self, node: Element) -> None:
+ self.end_state()
+ 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_section(self, node: Element) -> None:
+ self._title_char = self.sectionchars[self.sectionlevel]
+ self.sectionlevel += 1
+
+ def depart_section(self, node: Element) -> None:
+ self.sectionlevel -= 1
+
+ def visit_topic(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_topic(self, node: Element) -> None:
+ self.end_state()
+
+ visit_sidebar = visit_topic
+ depart_sidebar = depart_topic
+
+ def visit_rubric(self, node: Element) -> None:
+ self.new_state(0)
+ self.add_text('-[ ')
+
+ def depart_rubric(self, node: Element) -> None:
+ self.add_text(' ]-')
+ self.end_state()
+
+ def visit_compound(self, node: Element) -> None:
+ pass
+
+ def depart_compound(self, node: Element) -> None:
+ pass
+
+ def visit_glossary(self, node: Element) -> None:
+ pass
+
+ def depart_glossary(self, node: Element) -> None:
+ pass
+
+ def visit_title(self, node: Element) -> None:
+ if isinstance(node.parent, nodes.Admonition):
+ self.add_text(node.astext() + ': ')
+ raise nodes.SkipNode
+ self.new_state(0)
+
+ def get_section_number_string(self, node: Element) -> str:
+ if isinstance(node.parent, nodes.section):
+ anchorname = '#' + node.parent['ids'][0]
+ numbers = self.builder.secnumbers.get(anchorname)
+ if numbers is None:
+ numbers = self.builder.secnumbers.get('')
+ if numbers is not None:
+ return '.'.join(map(str, numbers)) + self.secnumber_suffix
+ return ''
+
+ def depart_title(self, node: Element) -> None:
+ if isinstance(node.parent, nodes.section):
+ char = self._title_char
+ else:
+ char = '^'
+ text = ''
+ text = ''.join(x[1] for x in self.states.pop() if x[0] == -1) # type: ignore[misc]
+ if self.add_secnumbers:
+ text = self.get_section_number_string(node) + text
+ self.stateindent.pop()
+ title = ['', text, '%s' % (char * column_width(text)), '']
+ if len(self.states) == 2 and len(self.states[-1]) == 0:
+ # remove an empty line before title if it is first section title in the document
+ title.pop(0)
+ self.states[-1].append((0, title))
+
+ def visit_subtitle(self, node: Element) -> None:
+ pass
+
+ def depart_subtitle(self, node: Element) -> None:
+ pass
+
+ def visit_attribution(self, node: Element) -> None:
+ self.add_text('-- ')
+
+ def depart_attribution(self, node: Element) -> None:
+ pass
+
+ #############################################################
+ # Domain-specific object descriptions
+ #############################################################
+
+ # Top-level nodes
+ #################
+
+ def visit_desc(self, node: Element) -> None:
+ pass
+
+ def depart_desc(self, node: Element) -> None:
+ pass
+
+ def visit_desc_signature(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_desc_signature(self, node: Element) -> None:
+ # XXX: wrap signatures in a way that makes sense
+ self.end_state(wrap=False, end=None)
+
+ def visit_desc_signature_line(self, node: Element) -> None:
+ pass
+
+ def depart_desc_signature_line(self, node: Element) -> None:
+ self.add_text('\n')
+
+ def visit_desc_content(self, node: Element) -> None:
+ self.new_state()
+ self.add_text(self.nl)
+
+ def depart_desc_content(self, node: Element) -> None:
+ self.end_state()
+
+ def visit_desc_inline(self, node: Element) -> None:
+ pass
+
+ def depart_desc_inline(self, node: Element) -> None:
+ pass
+
+ # Nodes for high-level structure in signatures
+ ##############################################
+
+ def visit_desc_name(self, node: Element) -> None:
+ pass
+
+ def depart_desc_name(self, node: Element) -> None:
+ pass
+
+ def visit_desc_addname(self, node: Element) -> None:
+ pass
+
+ def depart_desc_addname(self, node: Element) -> None:
+ pass
+
+ def visit_desc_type(self, node: Element) -> None:
+ pass
+
+ def depart_desc_type(self, node: Element) -> None:
+ pass
+
+ def visit_desc_returns(self, node: Element) -> None:
+ self.add_text(' -> ')
+
+ def depart_desc_returns(self, node: Element) -> None:
+ pass
+
+ def _visit_sig_parameter_list(
+ self,
+ node: Element,
+ parameter_group: type[Element],
+ sig_open_paren: str,
+ sig_close_paren: str,
+ ) -> None:
+ """Visit a signature parameters or type parameters list.
+
+ The *parameter_group* value is the type of a child node acting as a required parameter
+ or as a set of contiguous optional parameters.
+ """
+ self.add_text(sig_open_paren)
+ self.is_first_param = True
+ self.optional_param_level = 0
+ self.params_left_at_level = 0
+ self.param_group_index = 0
+ # Counts as what we call a parameter group are either a required parameter, or a
+ # set of contiguous optional ones.
+ self.list_is_required_param = [isinstance(c, parameter_group) for c in node.children]
+ self.required_params_left = sum(self.list_is_required_param)
+ self.param_separator = ', '
+ self.multi_line_parameter_list = node.get('multi_line_parameter_list', False)
+ if self.multi_line_parameter_list:
+ self.param_separator = self.param_separator.rstrip()
+ self.context.append(sig_close_paren)
+
+ def _depart_sig_parameter_list(self, node: Element) -> None:
+ sig_close_paren = self.context.pop()
+ self.add_text(sig_close_paren)
+
+ def visit_desc_parameterlist(self, node: Element) -> None:
+ self._visit_sig_parameter_list(node, addnodes.desc_parameter, '(', ')')
+
+ def depart_desc_parameterlist(self, node: Element) -> None:
+ self._depart_sig_parameter_list(node)
+
+ def visit_desc_type_parameter_list(self, node: Element) -> None:
+ self._visit_sig_parameter_list(node, addnodes.desc_type_parameter, '[', ']')
+
+ def depart_desc_type_parameter_list(self, node: Element) -> None:
+ self._depart_sig_parameter_list(node)
+
+ def visit_desc_parameter(self, node: Element) -> None:
+ on_separate_line = self.multi_line_parameter_list
+ if on_separate_line and not (self.is_first_param and self.optional_param_level > 0):
+ self.new_state()
+ if self.is_first_param:
+ self.is_first_param = False
+ elif not on_separate_line and not self.required_params_left:
+ self.add_text(self.param_separator)
+ if self.optional_param_level == 0:
+ self.required_params_left -= 1
+ else:
+ self.params_left_at_level -= 1
+
+ self.add_text(node.astext())
+
+ is_required = self.list_is_required_param[self.param_group_index]
+ if on_separate_line:
+ is_last_group = self.param_group_index + 1 == len(self.list_is_required_param)
+ next_is_required = (
+ not is_last_group
+ and self.list_is_required_param[self.param_group_index + 1]
+ )
+ opt_param_left_at_level = self.params_left_at_level > 0
+ if opt_param_left_at_level or is_required and (is_last_group or next_is_required):
+ self.add_text(self.param_separator)
+ self.end_state(wrap=False, end=None)
+
+ elif self.required_params_left:
+ self.add_text(self.param_separator)
+
+ if is_required:
+ self.param_group_index += 1
+ raise nodes.SkipNode
+
+ def visit_desc_type_parameter(self, node: Element) -> None:
+ self.visit_desc_parameter(node)
+
+ def visit_desc_optional(self, node: Element) -> None:
+ self.params_left_at_level = sum([isinstance(c, addnodes.desc_parameter)
+ for c in node.children])
+ self.optional_param_level += 1
+ self.max_optional_param_level = self.optional_param_level
+ if self.multi_line_parameter_list:
+ # If the first parameter is optional, start a new line and open the bracket.
+ if self.is_first_param:
+ self.new_state()
+ self.add_text('[')
+ # Else, if there remains at least one required parameter, append the
+ # parameter separator, open a new bracket, and end the line.
+ elif self.required_params_left:
+ self.add_text(self.param_separator)
+ self.add_text('[')
+ self.end_state(wrap=False, end=None)
+ # Else, open a new bracket, append the parameter separator, and end the
+ # line.
+ else:
+ self.add_text('[')
+ self.add_text(self.param_separator)
+ self.end_state(wrap=False, end=None)
+ else:
+ self.add_text('[')
+
+ def depart_desc_optional(self, node: Element) -> None:
+ self.optional_param_level -= 1
+ if self.multi_line_parameter_list:
+ # If it's the first time we go down one level, add the separator before the
+ # bracket.
+ if self.optional_param_level == self.max_optional_param_level - 1:
+ self.add_text(self.param_separator)
+ self.add_text(']')
+ # End the line if we have just closed the last bracket of this group of
+ # optional parameters.
+ if self.optional_param_level == 0:
+ self.end_state(wrap=False, end=None)
+
+ else:
+ self.add_text(']')
+ if self.optional_param_level == 0:
+ self.param_group_index += 1
+
+ def visit_desc_annotation(self, node: Element) -> None:
+ pass
+
+ def depart_desc_annotation(self, node: Element) -> None:
+ pass
+
+ ##############################################
+
+ def visit_figure(self, node: Element) -> None:
+ self.new_state()
+
+ def depart_figure(self, node: Element) -> None:
+ self.end_state()
+
+ def visit_caption(self, node: Element) -> None:
+ pass
+
+ def depart_caption(self, node: Element) -> None:
+ pass
+
+ def visit_productionlist(self, node: Element) -> None:
+ self.new_state()
+ names = []
+ productionlist = cast(Iterable[addnodes.production], node)
+ for production in productionlist:
+ names.append(production['tokenname'])
+ maxlen = max(len(name) for name in names)
+ lastname = None
+ for production in productionlist:
+ if production['tokenname']:
+ self.add_text(production['tokenname'].ljust(maxlen) + ' ::=')
+ lastname = production['tokenname']
+ elif lastname is not None:
+ self.add_text('%s ' % (' ' * len(lastname)))
+ self.add_text(production.astext() + self.nl)
+ self.end_state(wrap=False)
+ raise nodes.SkipNode
+
+ def visit_footnote(self, node: Element) -> None:
+ label = cast(nodes.label, node[0])
+ self._footnote = label.astext().strip()
+ self.new_state(len(self._footnote) + 3)
+
+ def depart_footnote(self, node: Element) -> None:
+ self.end_state(first='[%s] ' % self._footnote)
+
+ def visit_citation(self, node: Element) -> None:
+ if len(node) and isinstance(node[0], nodes.label):
+ self._citlabel = node[0].astext()
+ else:
+ self._citlabel = ''
+ self.new_state(len(self._citlabel) + 3)
+
+ def depart_citation(self, node: Element) -> None:
+ self.end_state(first='[%s] ' % self._citlabel)
+
+ def visit_label(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_legend(self, node: Element) -> None:
+ pass
+
+ def depart_legend(self, node: Element) -> None:
+ pass
+
+ # XXX: option list could use some better styling
+
+ def visit_option_list(self, node: Element) -> None:
+ pass
+
+ def depart_option_list(self, node: Element) -> None:
+ pass
+
+ def visit_option_list_item(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_option_list_item(self, node: Element) -> None:
+ self.end_state()
+
+ def visit_option_group(self, node: Element) -> None:
+ self._firstoption = True
+
+ def depart_option_group(self, node: Element) -> None:
+ self.add_text(' ')
+
+ def visit_option(self, node: Element) -> None:
+ if self._firstoption:
+ self._firstoption = False
+ else:
+ self.add_text(', ')
+
+ def depart_option(self, node: Element) -> None:
+ pass
+
+ def visit_option_string(self, node: Element) -> None:
+ pass
+
+ def depart_option_string(self, node: Element) -> None:
+ pass
+
+ def visit_option_argument(self, node: Element) -> None:
+ self.add_text(node['delimiter'])
+
+ def depart_option_argument(self, node: Element) -> None:
+ pass
+
+ def visit_description(self, node: Element) -> None:
+ pass
+
+ def depart_description(self, node: Element) -> None:
+ pass
+
+ def visit_tabular_col_spec(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_colspec(self, node: Element) -> None:
+ self.table.colwidth.append(node["colwidth"])
+ raise nodes.SkipNode
+
+ def visit_tgroup(self, node: Element) -> None:
+ pass
+
+ def depart_tgroup(self, node: Element) -> None:
+ pass
+
+ def visit_thead(self, node: Element) -> None:
+ pass
+
+ def depart_thead(self, node: Element) -> None:
+ pass
+
+ def visit_tbody(self, node: Element) -> None:
+ self.table.set_separator()
+
+ def depart_tbody(self, node: Element) -> None:
+ pass
+
+ def visit_row(self, node: Element) -> None:
+ if self.table.lines:
+ self.table.add_row()
+
+ def depart_row(self, node: Element) -> None:
+ pass
+
+ def visit_entry(self, node: Element) -> None:
+ self.entry = Cell(
+ rowspan=node.get("morerows", 0) + 1, colspan=node.get("morecols", 0) + 1,
+ )
+ self.new_state(0)
+
+ def depart_entry(self, node: Element) -> None:
+ text = self.nl.join(self.nl.join(x[1]) for x in self.states.pop())
+ self.stateindent.pop()
+ self.entry.text = text
+ self.table.add_cell(self.entry)
+ del self.entry
+
+ def visit_table(self, node: Element) -> None:
+ if hasattr(self, 'table'):
+ msg = 'Nested tables are not supported.'
+ raise NotImplementedError(msg)
+ self.new_state(0)
+ self.table = Table()
+
+ def depart_table(self, node: Element) -> None:
+ self.add_text(str(self.table))
+ del self.table
+ self.end_state(wrap=False)
+
+ def visit_acks(self, node: Element) -> None:
+ bullet_list = cast(nodes.bullet_list, node[0])
+ list_items = cast(Iterable[nodes.list_item], bullet_list)
+ self.new_state(0)
+ self.add_text(', '.join(n.astext() for n in list_items) + '.')
+ self.end_state()
+ raise nodes.SkipNode
+
+ def visit_image(self, node: Element) -> None:
+ if 'alt' in node.attributes:
+ self.add_text(_('[image: %s]') % node['alt'])
+ self.add_text(_('[image]'))
+ raise nodes.SkipNode
+
+ def visit_transition(self, node: Element) -> None:
+ indent = sum(self.stateindent)
+ self.new_state(0)
+ self.add_text('=' * (MAXWIDTH - indent))
+ self.end_state()
+ raise nodes.SkipNode
+
+ def visit_bullet_list(self, node: Element) -> None:
+ self.list_counter.append(-1)
+
+ def depart_bullet_list(self, node: Element) -> None:
+ self.list_counter.pop()
+
+ def visit_enumerated_list(self, node: Element) -> None:
+ self.list_counter.append(node.get('start', 1) - 1)
+
+ def depart_enumerated_list(self, node: Element) -> None:
+ self.list_counter.pop()
+
+ def visit_definition_list(self, node: Element) -> None:
+ self.list_counter.append(-2)
+
+ def depart_definition_list(self, node: Element) -> None:
+ self.list_counter.pop()
+
+ def visit_list_item(self, node: Element) -> None:
+ if self.list_counter[-1] == -1:
+ # bullet list
+ self.new_state(2)
+ elif self.list_counter[-1] == -2:
+ # definition list
+ pass
+ else:
+ # enumerated list
+ self.list_counter[-1] += 1
+ self.new_state(len(str(self.list_counter[-1])) + 2)
+
+ def depart_list_item(self, node: Element) -> None:
+ if self.list_counter[-1] == -1:
+ self.end_state(first='* ')
+ elif self.list_counter[-1] == -2:
+ pass
+ else:
+ self.end_state(first='%s. ' % self.list_counter[-1])
+
+ def visit_definition_list_item(self, node: Element) -> None:
+ self._classifier_count_in_li = len(list(node.findall(nodes.classifier)))
+
+ def depart_definition_list_item(self, node: Element) -> None:
+ pass
+
+ def visit_term(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_term(self, node: Element) -> None:
+ if not self._classifier_count_in_li:
+ self.end_state(end=None)
+
+ def visit_classifier(self, node: Element) -> None:
+ self.add_text(' : ')
+
+ def depart_classifier(self, node: Element) -> None:
+ self._classifier_count_in_li -= 1
+ if not self._classifier_count_in_li:
+ self.end_state(end=None)
+
+ def visit_definition(self, node: Element) -> None:
+ self.new_state()
+
+ def depart_definition(self, node: Element) -> None:
+ self.end_state()
+
+ def visit_field_list(self, node: Element) -> None:
+ pass
+
+ def depart_field_list(self, node: Element) -> None:
+ pass
+
+ def visit_field(self, node: Element) -> None:
+ pass
+
+ def depart_field(self, node: Element) -> None:
+ pass
+
+ def visit_field_name(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_field_name(self, node: Element) -> None:
+ self.add_text(':')
+ self.end_state(end=None)
+
+ def visit_field_body(self, node: Element) -> None:
+ self.new_state()
+
+ def depart_field_body(self, node: Element) -> None:
+ self.end_state()
+
+ def visit_centered(self, node: Element) -> None:
+ pass
+
+ def depart_centered(self, node: Element) -> None:
+ pass
+
+ def visit_hlist(self, node: Element) -> None:
+ pass
+
+ def depart_hlist(self, node: Element) -> None:
+ pass
+
+ def visit_hlistcol(self, node: Element) -> None:
+ pass
+
+ def depart_hlistcol(self, node: Element) -> None:
+ pass
+
+ def visit_admonition(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_admonition(self, node: Element) -> None:
+ self.end_state()
+
+ def _visit_admonition(self, node: Element) -> None:
+ self.new_state(2)
+
+ def _depart_admonition(self, node: Element) -> None:
+ label = admonitionlabels[node.tagname]
+ indent = sum(self.stateindent) + len(label)
+ if (len(self.states[-1]) == 1 and
+ self.states[-1][0][0] == 0 and
+ MAXWIDTH - indent >= sum(len(s) for s in self.states[-1][0][1])):
+ # short text: append text after admonition label
+ self.stateindent[-1] += len(label)
+ self.end_state(first=label + ': ')
+ else:
+ # long text: append label before the block
+ self.states[-1].insert(0, (0, [self.nl]))
+ self.end_state(first=label + ':')
+
+ visit_attention = _visit_admonition
+ depart_attention = _depart_admonition
+ visit_caution = _visit_admonition
+ depart_caution = _depart_admonition
+ visit_danger = _visit_admonition
+ depart_danger = _depart_admonition
+ visit_error = _visit_admonition
+ depart_error = _depart_admonition
+ visit_hint = _visit_admonition
+ depart_hint = _depart_admonition
+ visit_important = _visit_admonition
+ depart_important = _depart_admonition
+ visit_note = _visit_admonition
+ depart_note = _depart_admonition
+ visit_tip = _visit_admonition
+ depart_tip = _depart_admonition
+ visit_warning = _visit_admonition
+ depart_warning = _depart_admonition
+ visit_seealso = _visit_admonition
+ depart_seealso = _depart_admonition
+
+ def visit_versionmodified(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_versionmodified(self, node: Element) -> None:
+ self.end_state()
+
+ def visit_literal_block(self, node: Element) -> None:
+ self.new_state()
+
+ def depart_literal_block(self, node: Element) -> None:
+ self.end_state(wrap=False)
+
+ def visit_doctest_block(self, node: Element) -> None:
+ self.new_state(0)
+
+ def depart_doctest_block(self, node: Element) -> None:
+ self.end_state(wrap=False)
+
+ def visit_line_block(self, node: Element) -> None:
+ self.new_state()
+ self.lineblocklevel += 1
+
+ def depart_line_block(self, node: Element) -> None:
+ self.lineblocklevel -= 1
+ self.end_state(wrap=False, end=None)
+ if not self.lineblocklevel:
+ self.add_text('\n')
+
+ def visit_line(self, node: Element) -> None:
+ pass
+
+ def depart_line(self, node: Element) -> None:
+ self.add_text('\n')
+
+ def visit_block_quote(self, node: Element) -> None:
+ self.new_state()
+
+ def depart_block_quote(self, node: Element) -> None:
+ self.end_state()
+
+ def visit_compact_paragraph(self, node: Element) -> None:
+ pass
+
+ def depart_compact_paragraph(self, node: Element) -> None:
+ pass
+
+ def visit_paragraph(self, node: Element) -> None:
+ if not isinstance(node.parent, nodes.Admonition) or \
+ isinstance(node.parent, addnodes.seealso):
+ self.new_state(0)
+
+ def depart_paragraph(self, node: Element) -> None:
+ if not isinstance(node.parent, nodes.Admonition) or \
+ isinstance(node.parent, addnodes.seealso):
+ self.end_state()
+
+ def visit_target(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_index(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_toctree(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_substitution_definition(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_pending_xref(self, node: Element) -> None:
+ pass
+
+ def depart_pending_xref(self, node: Element) -> None:
+ pass
+
+ def visit_reference(self, node: Element) -> None:
+ if self.add_secnumbers:
+ numbers = node.get("secnumber")
+ if numbers is not None:
+ self.add_text('.'.join(map(str, numbers)) + self.secnumber_suffix)
+
+ def depart_reference(self, node: Element) -> None:
+ pass
+
+ def visit_number_reference(self, node: Element) -> None:
+ text = nodes.Text(node.get('title', '#'))
+ self.visit_Text(text)
+ raise nodes.SkipNode
+
+ def visit_download_reference(self, node: Element) -> None:
+ pass
+
+ def depart_download_reference(self, node: Element) -> None:
+ pass
+
+ def visit_emphasis(self, node: Element) -> None:
+ self.add_text('*')
+
+ def depart_emphasis(self, node: Element) -> None:
+ self.add_text('*')
+
+ def visit_literal_emphasis(self, node: Element) -> None:
+ self.add_text('*')
+
+ def depart_literal_emphasis(self, node: Element) -> None:
+ self.add_text('*')
+
+ def visit_strong(self, node: Element) -> None:
+ self.add_text('**')
+
+ def depart_strong(self, node: Element) -> None:
+ self.add_text('**')
+
+ def visit_literal_strong(self, node: Element) -> None:
+ self.add_text('**')
+
+ def depart_literal_strong(self, node: Element) -> None:
+ self.add_text('**')
+
+ def visit_abbreviation(self, node: Element) -> None:
+ self.add_text('')
+
+ def depart_abbreviation(self, node: Element) -> None:
+ if node.hasattr('explanation'):
+ self.add_text(' (%s)' % node['explanation'])
+
+ def visit_manpage(self, node: Element) -> None:
+ return self.visit_literal_emphasis(node)
+
+ def depart_manpage(self, node: Element) -> None:
+ return self.depart_literal_emphasis(node)
+
+ def visit_title_reference(self, node: Element) -> None:
+ self.add_text('*')
+
+ def depart_title_reference(self, node: Element) -> None:
+ self.add_text('*')
+
+ def visit_literal(self, node: Element) -> None:
+ self.add_text('"')
+
+ def depart_literal(self, node: Element) -> None:
+ self.add_text('"')
+
+ def visit_subscript(self, node: Element) -> None:
+ self.add_text('_')
+
+ def depart_subscript(self, node: Element) -> None:
+ pass
+
+ def visit_superscript(self, node: Element) -> None:
+ self.add_text('^')
+
+ def depart_superscript(self, node: Element) -> None:
+ pass
+
+ def visit_footnote_reference(self, node: Element) -> None:
+ self.add_text('[%s]' % node.astext())
+ raise nodes.SkipNode
+
+ def visit_citation_reference(self, node: Element) -> None:
+ self.add_text('[%s]' % node.astext())
+ raise nodes.SkipNode
+
+ def visit_Text(self, node: Text) -> None:
+ self.add_text(node.astext())
+
+ def depart_Text(self, node: Text) -> None:
+ pass
+
+ def visit_generated(self, node: Element) -> None:
+ pass
+
+ def depart_generated(self, node: Element) -> None:
+ pass
+
+ def visit_inline(self, node: Element) -> None:
+ if 'xref' in node['classes'] or 'term' in node['classes']:
+ self.add_text('*')
+
+ def depart_inline(self, node: Element) -> None:
+ if 'xref' in node['classes'] or 'term' in node['classes']:
+ self.add_text('*')
+
+ def visit_container(self, node: Element) -> None:
+ pass
+
+ def depart_container(self, node: Element) -> None:
+ pass
+
+ def visit_problematic(self, node: Element) -> None:
+ self.add_text('>>')
+
+ def depart_problematic(self, node: Element) -> None:
+ self.add_text('<<')
+
+ def visit_system_message(self, node: Element) -> None:
+ self.new_state(0)
+ self.add_text('<SYSTEM MESSAGE: %s>' % node.astext())
+ self.end_state()
+ raise nodes.SkipNode
+
+ def visit_comment(self, node: Element) -> None:
+ raise nodes.SkipNode
+
+ def visit_meta(self, node: Element) -> None:
+ # only valid for HTML
+ raise nodes.SkipNode
+
+ def visit_raw(self, node: Element) -> None:
+ if 'text' in node.get('format', '').split():
+ self.new_state(0)
+ self.add_text(node.astext())
+ self.end_state(wrap = False)
+ raise nodes.SkipNode
+
+ def visit_math(self, node: Element) -> None:
+ pass
+
+ def depart_math(self, node: Element) -> None:
+ pass
+
+ def visit_math_block(self, node: Element) -> None:
+ self.new_state()
+
+ def depart_math_block(self, node: Element) -> None:
+ self.end_state()
diff --git a/sphinx/writers/xml.py b/sphinx/writers/xml.py
new file mode 100644
index 0000000..38aa763
--- /dev/null
+++ b/sphinx/writers/xml.py
@@ -0,0 +1,52 @@
+"""Docutils-native XML and pseudo-XML writers."""
+
+from __future__ import annotations
+
+from typing import TYPE_CHECKING, Any
+
+from docutils.writers.docutils_xml import Writer as BaseXMLWriter
+
+if TYPE_CHECKING:
+ from sphinx.builders import Builder
+
+
+class XMLWriter(BaseXMLWriter):
+ output: str
+
+ def __init__(self, builder: Builder) -> None:
+ super().__init__()
+ self.builder = builder
+
+ # A lambda function to generate translator lazily
+ self.translator_class = lambda document: self.builder.create_translator(document)
+
+ def translate(self, *args: Any, **kwargs: Any) -> None:
+ self.document.settings.newlines = \
+ self.document.settings.indents = \
+ self.builder.env.config.xml_pretty
+ self.document.settings.xml_declaration = True
+ self.document.settings.doctype_declaration = True
+ return super().translate()
+
+
+class PseudoXMLWriter(BaseXMLWriter):
+
+ supported = ('pprint', 'pformat', 'pseudoxml')
+ """Formats this writer supports."""
+
+ config_section = 'pseudoxml writer'
+ config_section_dependencies = ('writers',)
+
+ output: str
+ """Final translated form of `document`."""
+
+ def __init__(self, builder: Builder) -> None:
+ super().__init__()
+ self.builder = builder
+
+ def translate(self) -> None:
+ self.output = self.document.pformat()
+
+ def supports(self, format: str) -> bool:
+ """This writer supports all format-specific elements."""
+ return True
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/__init__.py
diff --git a/tests/certs/cert.pem b/tests/certs/cert.pem
new file mode 100644
index 0000000..6f8c35c
--- /dev/null
+++ b/tests/certs/cert.pem
@@ -0,0 +1,50 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9fzHGBPNaZNcN
+nL/1nvO2xJR/E64vFua3QfPQQ5HpigjrK/HRUlRGztRKJ+CEjCXNYNfQ4dUcV45o
+k5uPH3U1CkAw2d/We+kZnAHkNuw4mRC0ohdzpUByyDOA5WtUWPn9SwhXCVz6fM7e
+I52auvzpUE6soVDM3nucnqZDJ3Ua9KgB02FrqX13S76Uq+uf8Q2hpTruO/nBzB4p
+6xFwJJ1taXEEWi8swg6HO8/+0x0AeripV6JieNUptEFuV9kLvRz9qGg0CO2f7AdI
+jNeFDGrgO7qJ+VxXV9Gnbi6ph4vsUwtJZB3phRGGomdgiRd6PSma81nvTe1z69x/
+g+8P091pAgMBAAECggEAIrTABfd0JpMffAPAeJjjJA8+70NIfKFiIiA3Kmalu7Mn
+TQMgZ+j/PHS3FtnU2hHc/o+FF2G1KVqz311heUYWrl8xQIE26M6K88DJ6+VPQFJw
+Z9TkHK8gbaVTIYFjNfCR4J00atRxLgNb0/2L6QHkPksSDbYB2XPKCfZYlyYL4aKq
+dePghFu9ePXhUXooPCqke+kP0b8OmHzPlmJpxbeb8ujiox2+4wYjN8lWPz8xHv8i
+IM7V5hAbPIaQfu/joKrRKk+Kk8UqGurkKQ75KLLL+1oaJO/GLTQ4bk5tpRgfWPda
+aEBzSPrnqame2CKUWtBughuRWSxdTIMvdXIC/ym1gQKBgQDx6Nyio/L6I5CdlXwC
+HAzBCy1mnj70Kj97tQc+A/0z8dD7fCSE/oo8IiEKixcjnaSxHk8VjINF/w17n63W
+8neE7pVsuDwxfhiQ9ZRI1WpV0LsFEoTrEWG7Ax8UzbHXCQbNJ9SI0HJRo9UN0f/Z
+t+ZT+HNUzdcpCwTvdRVDisbXcQKBgQDIiMz58GFEwdGPXJKEhSyQ3kSQBjeqo0Vl
+wMDuDvFEckHl/p1RnDo0lzaq6FivOX84ymvGNdQW14TnQp3A/mkQ5o6k/e1pfAA6
+X0Y6tBH/QppVo5sFvOufyn02k48k5pFAjLHH9L9i0dyWqq4V6PgA2uk4qilFxEg/
+CJEVfq4ZeQKBgQCZPHKWq9f8T48J42kcRPxnRFdMC63BKQnxqOifhhNcVi+VPjw7
+6qlSEiRv80+DBhcPAy4BbnKxYjD+QFX0NL80+5S3u7SVfVS+bnGx+U5UcdYmDmcY
+KHiJ6B5GJU4j8tnWFwbwa2ofAPKywHWbSnyicF1OON20aACGVtpTYJM4YQKBgBW4
+09NDGZY0FHoeAfT+4/vxR6X+NmtyciL6hSuETNgoNEEwmmPrs1ZdBtvufSTF6qUB
+MDlxPT8YK1pNmf78z+63ur3ej6f8eZ3ZEidruANZeJRMO4+cjj1p1rRhuYC6xQMj
++mH5ff27U9SyOlc/PBYDoH212PCouVaym9yjM0KpAoGBALr583slY55ESOthLrfX
+1ecoET5xxRm431XbZMnxu0uUvHWNfqoojtmD7laclb9HwkpShPB6PT1egBIvDWWM
+bVUuXzJ8gP0tIG3dHgiiUlld3ahOiaMYSU77uLFBRWv5sQqfewLuFvlzHn/2ZSt7
+TcipT4f67b18W8iuLJELEs57
+-----END PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIDuTCCAqGgAwIBAgIUUNvkPwe0W8C2I0+KnLpMaQ+S+vowDQYJKoZIhvcNAQEL
+BQAwYTELMAkGA1UEBhMCRlIxETAPBgNVBAgMCEJyZXRhZ25lMQ8wDQYDVQQHDAZS
+ZW5uZXMxGjAYBgNVBAoMEVNwaGlueCB0ZXN0IHN1aXRlMRIwEAYDVQQDDAlsb2Nh
+bGhvc3QwHhcNMjAxMTE1MTcyNDExWhcNMzAxMTEzMTcyNDExWjBhMQswCQYDVQQG
+EwJGUjERMA8GA1UECAwIQnJldGFnbmUxDzANBgNVBAcMBlJlbm5lczEaMBgGA1UE
+CgwRU3BoaW54IHRlc3Qgc3VpdGUxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAL1/McYE81pk1w2cv/We87bElH8Tri8W
+5rdB89BDkemKCOsr8dFSVEbO1Eon4ISMJc1g19Dh1RxXjmiTm48fdTUKQDDZ39Z7
+6RmcAeQ27DiZELSiF3OlQHLIM4Dla1RY+f1LCFcJXPp8zt4jnZq6/OlQTqyhUMze
+e5yepkMndRr0qAHTYWupfXdLvpSr65/xDaGlOu47+cHMHinrEXAknW1pcQRaLyzC
+Doc7z/7THQB6uKlXomJ41Sm0QW5X2Qu9HP2oaDQI7Z/sB0iM14UMauA7uon5XFdX
+0aduLqmHi+xTC0lkHemFEYaiZ2CJF3o9KZrzWe9N7XPr3H+D7w/T3WkCAwEAAaNp
+MGcwHQYDVR0OBBYEFN1iHZj88N6eI2FlRzza52xzOU5EMB8GA1UdIwQYMBaAFN1i
+HZj88N6eI2FlRzza52xzOU5EMA8GA1UdEwEB/wQFMAMBAf8wFAYDVR0RBA0wC4IJ
+bG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4IBAQBVUZm1iw7N7uZu/SF3hailxS+1
+3KChItWu3ZOIjlmDIkaJ9kWqP2ficUg3tBUx6/UOjHQAwRC4rj87BoSV2mEy+0OX
+fyy+ER/BeHYly5v+hpjVojVKeqysk5CKttZM+cOibT2SzLLYf0InNqZRQRJco+nL
+QNR0hVo/Lz6Mf1gF2ywf9bXSF3+XECU4K6sVm4QpFbJNm+fHqJBuh1LXHRrcTAsP
+LM6PBnd3P5QTcr/G0s/tYMPmero9YHZUO8FMvMVoI2K8k6/duG/EbBaNzriRI1OM
+PpZGCWxbJfyApnzc5lGAG4zJnV/wpOyNhKJuW9N1fr2oEwPpJlS3VzrgeKcY
+-----END CERTIFICATE-----
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..1b909bd
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,40 @@
+import os
+from pathlib import Path
+
+import docutils
+import pytest
+
+import sphinx
+import sphinx.locale
+
+
+def _init_console(locale_dir=sphinx.locale._LOCALE_DIR, catalog='sphinx'):
+ """Monkeypatch ``init_console`` to skip its action.
+
+ Some tests rely on warning messages in English. We don't want
+ CLI tests to bleed over those tests and make their warnings
+ translated.
+ """
+ return sphinx.locale.NullTranslations(), False
+
+
+sphinx.locale.init_console = _init_console
+
+pytest_plugins = 'sphinx.testing.fixtures'
+
+# Exclude 'roots' dirs for pytest test collector
+collect_ignore = ['roots']
+
+os.environ['SPHINX_AUTODOC_RELOAD_MODULES'] = '1'
+
+
+@pytest.fixture(scope='session')
+def rootdir():
+ return Path(__file__).parent.absolute() / 'roots'
+
+
+def pytest_report_header(config):
+ header = f"libraries: Sphinx-{sphinx.__display_version__}, docutils-{docutils.__version__}"
+ if hasattr(config, '_tmp_path_factory'):
+ header += f"\nbase tmp_path: {config._tmp_path_factory.getbasetemp()}"
+ return header
diff --git a/tests/ext_napoleon_pep526_data_google.py b/tests/ext_napoleon_pep526_data_google.py
new file mode 100644
index 0000000..bb55b0f
--- /dev/null
+++ b/tests/ext_napoleon_pep526_data_google.py
@@ -0,0 +1,16 @@
+"""Test module for napoleon PEP 526 compatibility with google style"""
+
+module_level_var: int = 99
+"""This is an example module level variable"""
+
+
+class PEP526GoogleClass:
+ """Sample class with PEP 526 annotations and google docstring
+
+ Attributes:
+ attr1: Attr1 description.
+ attr2: Attr2 description.
+ """
+
+ attr1: int
+ attr2: str
diff --git a/tests/ext_napoleon_pep526_data_numpy.py b/tests/ext_napoleon_pep526_data_numpy.py
new file mode 100644
index 0000000..b3093a7
--- /dev/null
+++ b/tests/ext_napoleon_pep526_data_numpy.py
@@ -0,0 +1,20 @@
+"""Test module for napoleon PEP 526 compatibility with numpy style"""
+
+module_level_var: int = 99
+"""This is an example module level variable"""
+
+
+class PEP526NumpyClass:
+ """
+ Sample class with PEP 526 annotations and numpy docstring
+
+ Attributes
+ ----------
+ attr1:
+ Attr1 description
+
+ attr2:
+ Attr2 description
+ """
+ attr1: int
+ attr2: str
diff --git a/tests/js/documentation_options.js b/tests/js/documentation_options.js
new file mode 100644
index 0000000..e736460
--- /dev/null
+++ b/tests/js/documentation_options.js
@@ -0,0 +1 @@
+const DOCUMENTATION_OPTIONS = {};
diff --git a/tests/js/searchtools.js b/tests/js/searchtools.js
new file mode 100644
index 0000000..c9e0c43
--- /dev/null
+++ b/tests/js/searchtools.js
@@ -0,0 +1,62 @@
+describe('Basic html theme search', function() {
+
+ describe('terms search', function() {
+
+ it('should find "C++" when in index', function() {
+ index = {
+ docnames:["index"],
+ filenames:["index.rst"],
+ terms:{'c++':0},
+ titles:["&lt;no title&gt;"],
+ titleterms:{}
+ }
+ Search.setIndex(index);
+ searchterms = ['c++'];
+ excluded = [];
+ terms = index.terms;
+ titleterms = index.titleterms;
+
+ hits = [[
+ "index",
+ "&lt;no title&gt;",
+ "",
+ null,
+ 2,
+ "index.rst"
+ ]];
+ expect(Search.performTermsSearch(searchterms, excluded, terms, titleterms)).toEqual(hits);
+ });
+
+ });
+
+});
+
+// This is regression test for https://github.com/sphinx-doc/sphinx/issues/3150
+describe('splitQuery regression tests', () => {
+
+ it('can split English words', () => {
+ const parts = splitQuery(' Hello World ')
+ expect(parts).toEqual(['Hello', 'World'])
+ })
+
+ it('can split special characters', () => {
+ const parts = splitQuery('Pin-Code')
+ expect(parts).toEqual(['Pin', 'Code'])
+ })
+
+ it('can split Chinese characters', () => {
+ const parts = splitQuery('Hello from 中国 上海')
+ expect(parts).toEqual(['Hello', 'from', '中国', '上海'])
+ })
+
+ it('can split Emoji (surrogate pair) characters. It should keep emojis.', () => {
+ const parts = splitQuery('ðŸ˜ðŸ˜')
+ expect(parts).toEqual(['ðŸ˜ðŸ˜'])
+ })
+
+ it('can split umlauts. It should keep umlauts.', () => {
+ const parts = splitQuery('Löschen Prüfung Abändern ærlig spørsmål')
+ expect(parts).toEqual(['Löschen', 'Prüfung', 'Abändern', 'ærlig', 'spørsmål'])
+ })
+
+})
diff --git a/tests/js/sphinx_highlight.js b/tests/js/sphinx_highlight.js
new file mode 100644
index 0000000..1f52eab
--- /dev/null
+++ b/tests/js/sphinx_highlight.js
@@ -0,0 +1,39 @@
+describe('highlightText', function() {
+
+ const cyrillicTerm = 'шеллы';
+ const umlautTerm = 'gänsefüßchen';
+
+ it('should highlight text incl. special characters correctly in HTML', function() {
+ const highlightTestSpan = new DOMParser().parseFromString(
+ '<span>This is the шеллы and Gänsefüßchen test!</span>', 'text/html').body.firstChild
+ _highlightText(highlightTestSpan, cyrillicTerm, 'highlighted');
+ _highlightText(highlightTestSpan, umlautTerm, 'highlighted');
+ const expectedHtmlString =
+ 'This is the <span class=\"highlighted\">шеллы</span> and ' +
+ '<span class=\"highlighted\">Gänsefüßchen</span> test!';
+ expect(highlightTestSpan.innerHTML).toEqual(expectedHtmlString);
+ });
+
+ it('should highlight text incl. special characters correctly in SVG', function() {
+ const highlightTestSvg = new DOMParser().parseFromString(
+ '<span id="svg-highlight-test">' +
+ '<svg xmlns="http://www.w3.org/2000/svg" height="50" width="500">' +
+ '<text x="0" y="15">' +
+ 'This is the шеллы and Gänsefüßchen test!' +
+ '</text>' +
+ '</svg>' +
+ '</span>', 'text/html').body.firstChild
+ _highlightText(highlightTestSvg, cyrillicTerm, 'highlighted');
+ _highlightText(highlightTestSvg, umlautTerm, 'highlighted');
+ /* Note wild cards and ``toMatch``; allowing for some variability
+ seems to be necessary, even between different FF versions */
+ const expectedSvgString =
+ '<svg xmlns="http://www.w3.org/2000/svg" height="50" width="500">'
+ + '<rect x=".*" y=".*" width=".*" height=".*" class="highlighted"/>'
+ + '<rect x=".*" y=".*" width=".*" height=".*" class="highlighted"/>'
+ + '<text x=".*" y=".*">This is the <tspan>шеллы</tspan> and '
+ + '<tspan>Gänsefüßchen</tspan> test!</text></svg>';
+ expect(new XMLSerializer().serializeToString(highlightTestSvg.firstChild)).toMatch(new RegExp(expectedSvgString));
+ });
+
+});
diff --git a/tests/roots/test-add_enumerable_node/conf.py b/tests/roots/test-add_enumerable_node/conf.py
new file mode 100644
index 0000000..8c3a568
--- /dev/null
+++ b/tests/roots/test-add_enumerable_node/conf.py
@@ -0,0 +1,7 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+extensions = ['enumerable_node']
+
+numfig = True
diff --git a/tests/roots/test-add_enumerable_node/enumerable_node.py b/tests/roots/test-add_enumerable_node/enumerable_node.py
new file mode 100644
index 0000000..782365e
--- /dev/null
+++ b/tests/roots/test-add_enumerable_node/enumerable_node.py
@@ -0,0 +1,62 @@
+from docutils import nodes
+from docutils.parsers.rst import Directive
+
+
+class my_figure(nodes.figure):
+ pass
+
+
+def visit_my_figure(self, node):
+ self.visit_figure(node)
+
+
+def depart_my_figure(self, node):
+ self.depart_figure(node)
+
+
+class MyFigure(Directive):
+ required_arguments = 1
+ has_content = True
+
+ def run(self):
+ figure_node = my_figure()
+ figure_node += nodes.image(uri=self.arguments[0])
+ figure_node += nodes.caption(text=''.join(self.content))
+ return [figure_node]
+
+
+class numbered_text(nodes.Element):
+ pass
+
+
+def visit_numbered_text(self, node):
+ self.body.append(self.starttag(node, 'div'))
+ self.add_fignumber(node)
+ self.body.append(node['title'])
+ self.body.append('</div>')
+ raise nodes.SkipNode
+
+
+def get_title(node):
+ return node['title']
+
+
+class NumberedText(Directive):
+ required_arguments = 1
+ final_argument_whitespace = True
+
+ def run(self):
+ return [numbered_text(title=self.arguments[0])]
+
+
+def setup(app):
+ # my-figure
+ app.add_enumerable_node(my_figure, 'figure',
+ html=(visit_my_figure, depart_my_figure))
+ app.add_directive('my-figure', MyFigure)
+
+ # numbered_label
+ app.add_enumerable_node(numbered_text, 'original', get_title,
+ html=(visit_numbered_text, None))
+ app.add_directive('numbered-text', NumberedText)
+ app.config.numfig_format.setdefault('original', 'No.%s')
diff --git a/tests/roots/test-add_enumerable_node/index.rst b/tests/roots/test-add_enumerable_node/index.rst
new file mode 100644
index 0000000..98b858e
--- /dev/null
+++ b/tests/roots/test-add_enumerable_node/index.rst
@@ -0,0 +1,48 @@
+========================
+test-add_enumerable_node
+========================
+
+.. toctree::
+ :numbered:
+
+
+First section
+=============
+
+.. _first_figure:
+
+.. figure:: rimg.png
+
+ First figure
+
+.. _first_my_figure:
+
+.. my-figure:: rimg.png
+
+ First my figure
+
+.. _first_numbered_text:
+
+.. numbered-text:: Hello world
+
+.. _second_numbered_text:
+
+.. numbered-text:: Hello Sphinx
+
+Second section
+==============
+
+.. _second_my_figure:
+
+.. my-figure:: rimg.png
+
+ Second my figure
+
+Reference section
+=================
+
+* first_figure is :numref:`first_figure`
+* first_my_figure is :numref:`first_my_figure`
+* second_my_figure is :numref:`second_my_figure`
+* first numbered_text is :numref:`first_numbered_text`
+* second numbered_text is :numref:`second_numbered_text`
diff --git a/tests/roots/test-add_enumerable_node/rimg.png b/tests/roots/test-add_enumerable_node/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-add_enumerable_node/rimg.png
Binary files differ
diff --git a/tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py b/tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py
new file mode 100644
index 0000000..3ad5491
--- /dev/null
+++ b/tests/roots/test-add_source_parser-conflicts-with-users-setting/conf.py
@@ -0,0 +1,17 @@
+import os
+import sys
+
+from docutils.parsers import Parser
+
+sys.path.insert(0, os.path.abspath('.'))
+
+
+class DummyTestParser(Parser):
+ supported = ('dummy',)
+
+
+extensions = ['source_parser']
+source_suffix = ['.rst', '.test']
+source_parsers = {
+ '.test': DummyTestParser
+}
diff --git a/tests/roots/test-add_source_parser-conflicts-with-users-setting/source_parser.py b/tests/roots/test-add_source_parser-conflicts-with-users-setting/source_parser.py
new file mode 100644
index 0000000..69ad02d
--- /dev/null
+++ b/tests/roots/test-add_source_parser-conflicts-with-users-setting/source_parser.py
@@ -0,0 +1,10 @@
+from docutils.parsers import Parser
+
+
+class TestSourceParser(Parser):
+ supported = ('test',)
+
+
+def setup(app):
+ app.add_source_suffix('.test', 'test')
+ app.add_source_parser(TestSourceParser)
diff --git a/tests/roots/test-add_source_parser/conf.py b/tests/roots/test-add_source_parser/conf.py
new file mode 100644
index 0000000..2acd4d2
--- /dev/null
+++ b/tests/roots/test-add_source_parser/conf.py
@@ -0,0 +1,8 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+
+extensions = ['source_parser']
+source_suffix = ['.rst']
diff --git a/tests/roots/test-add_source_parser/source_parser.py b/tests/roots/test-add_source_parser/source_parser.py
new file mode 100644
index 0000000..69ad02d
--- /dev/null
+++ b/tests/roots/test-add_source_parser/source_parser.py
@@ -0,0 +1,10 @@
+from docutils.parsers import Parser
+
+
+class TestSourceParser(Parser):
+ supported = ('test',)
+
+
+def setup(app):
+ app.add_source_suffix('.test', 'test')
+ app.add_source_parser(TestSourceParser)
diff --git a/tests/roots/test-api-set-translator/conf.py b/tests/roots/test-api-set-translator/conf.py
new file mode 100644
index 0000000..3b56c39
--- /dev/null
+++ b/tests/roots/test-api-set-translator/conf.py
@@ -0,0 +1,72 @@
+# set this by test
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+from docutils.writers.docutils_xml import XMLTranslator
+
+from sphinx.writers.html import HTML5Translator
+from sphinx.writers.latex import LaTeXTranslator
+from sphinx.writers.manpage import ManualPageTranslator
+from sphinx.writers.texinfo import TexinfoTranslator
+from sphinx.writers.text import TextTranslator
+
+project = 'test'
+
+
+class ConfHTMLTranslator(HTML5Translator):
+ pass
+
+
+class ConfDirHTMLTranslator(HTML5Translator):
+ pass
+
+
+class ConfSingleHTMLTranslator(HTML5Translator):
+ pass
+
+
+class ConfPickleTranslator(HTML5Translator):
+ pass
+
+
+class ConfJsonTranslator(HTML5Translator):
+ pass
+
+
+class ConfLaTeXTranslator(LaTeXTranslator):
+ pass
+
+
+class ConfManualPageTranslator(ManualPageTranslator):
+ pass
+
+
+class ConfTexinfoTranslator(TexinfoTranslator):
+ pass
+
+
+class ConfTextTranslator(TextTranslator):
+ pass
+
+
+class ConfXMLTranslator(XMLTranslator):
+ pass
+
+
+class ConfPseudoXMLTranslator(XMLTranslator):
+ pass
+
+
+def setup(app):
+ app.set_translator('html', ConfHTMLTranslator)
+ app.set_translator('dirhtml', ConfDirHTMLTranslator)
+ app.set_translator('singlehtml', ConfSingleHTMLTranslator)
+ app.set_translator('pickle', ConfPickleTranslator)
+ app.set_translator('json', ConfJsonTranslator)
+ app.set_translator('latex', ConfLaTeXTranslator)
+ app.set_translator('man', ConfManualPageTranslator)
+ app.set_translator('texinfo', ConfTexinfoTranslator)
+ app.set_translator('text', ConfTextTranslator)
+ app.set_translator('xml', ConfXMLTranslator)
+ app.set_translator('pseudoxml', ConfPseudoXMLTranslator)
diff --git a/tests/roots/test-api-set-translator/index.rst b/tests/roots/test-api-set-translator/index.rst
new file mode 100644
index 0000000..4a7d692
--- /dev/null
+++ b/tests/roots/test-api-set-translator/index.rst
@@ -0,0 +1,3 @@
+=======================
+Test API set_translator
+=======================
diff --git a/tests/roots/test-api-set-translator/nonext/conf.py b/tests/roots/test-api-set-translator/nonext/conf.py
new file mode 100644
index 0000000..f93e4da
--- /dev/null
+++ b/tests/roots/test-api-set-translator/nonext/conf.py
@@ -0,0 +1,6 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.dirname(os.path.abspath('.')))
+
+project = 'test'
diff --git a/tests/roots/test-api-set-translator/translator.py b/tests/roots/test-api-set-translator/translator.py
new file mode 100644
index 0000000..3adbf76
--- /dev/null
+++ b/tests/roots/test-api-set-translator/translator.py
@@ -0,0 +1,5 @@
+from sphinx.writers.html import HTML5Translator
+
+
+class ExtHTMLTranslator(HTML5Translator):
+ pass
diff --git a/tests/roots/test-apidoc-duplicates/fish_licence/halibut.cpython-38-x86_64-linux-gnu.so b/tests/roots/test-apidoc-duplicates/fish_licence/halibut.cpython-38-x86_64-linux-gnu.so
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-apidoc-duplicates/fish_licence/halibut.cpython-38-x86_64-linux-gnu.so
diff --git a/tests/roots/test-apidoc-duplicates/fish_licence/halibut.pyx b/tests/roots/test-apidoc-duplicates/fish_licence/halibut.pyx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-apidoc-duplicates/fish_licence/halibut.pyx
diff --git a/tests/roots/test-apidoc-pep420/a/b/c/__init__.py b/tests/roots/test-apidoc-pep420/a/b/c/__init__.py
new file mode 100644
index 0000000..5b727c1
--- /dev/null
+++ b/tests/roots/test-apidoc-pep420/a/b/c/__init__.py
@@ -0,0 +1 @@
+"Package C"
diff --git a/tests/roots/test-apidoc-pep420/a/b/c/d.py b/tests/roots/test-apidoc-pep420/a/b/c/d.py
new file mode 100644
index 0000000..63b0e34
--- /dev/null
+++ b/tests/roots/test-apidoc-pep420/a/b/c/d.py
@@ -0,0 +1 @@
+"Module d"
diff --git a/tests/roots/test-apidoc-pep420/a/b/e/__init__.py b/tests/roots/test-apidoc-pep420/a/b/e/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-apidoc-pep420/a/b/e/__init__.py
diff --git a/tests/roots/test-apidoc-pep420/a/b/e/f.py b/tests/roots/test-apidoc-pep420/a/b/e/f.py
new file mode 100644
index 0000000..a09affe
--- /dev/null
+++ b/tests/roots/test-apidoc-pep420/a/b/e/f.py
@@ -0,0 +1 @@
+"Module f"
diff --git a/tests/roots/test-apidoc-pep420/a/b/x/y.py b/tests/roots/test-apidoc-pep420/a/b/x/y.py
new file mode 100644
index 0000000..46bc245
--- /dev/null
+++ b/tests/roots/test-apidoc-pep420/a/b/x/y.py
@@ -0,0 +1 @@
+"Module y"
diff --git a/tests/roots/test-apidoc-subpackage-in-toc/parent/__init__.py b/tests/roots/test-apidoc-subpackage-in-toc/parent/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-apidoc-subpackage-in-toc/parent/__init__.py
diff --git a/tests/roots/test-apidoc-subpackage-in-toc/parent/child/__init__.py b/tests/roots/test-apidoc-subpackage-in-toc/parent/child/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-apidoc-subpackage-in-toc/parent/child/__init__.py
diff --git a/tests/roots/test-apidoc-subpackage-in-toc/parent/child/foo.py b/tests/roots/test-apidoc-subpackage-in-toc/parent/child/foo.py
new file mode 100644
index 0000000..810c96e
--- /dev/null
+++ b/tests/roots/test-apidoc-subpackage-in-toc/parent/child/foo.py
@@ -0,0 +1 @@
+"foo"
diff --git a/tests/roots/test-apidoc-toc/mypackage/__init__.py b/tests/roots/test-apidoc-toc/mypackage/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-apidoc-toc/mypackage/__init__.py
diff --git a/tests/roots/test-apidoc-toc/mypackage/main.py b/tests/roots/test-apidoc-toc/mypackage/main.py
new file mode 100755
index 0000000..f532813
--- /dev/null
+++ b/tests/roots/test-apidoc-toc/mypackage/main.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+
+import os
+
+import mod_resource
+import mod_something
+
+if __name__ == "__main__":
+ print(f"Hello, world! -> something returns: {mod_something.something()}")
+
+ res_path = \
+ os.path.join(os.path.dirname(mod_resource.__file__), 'resource.txt')
+ with open(res_path, encoding='utf-8') as f:
+ text = f.read()
+ print(f"From mod_resource:resource.txt -> {text}")
diff --git a/tests/roots/test-apidoc-toc/mypackage/no_init/foo.py b/tests/roots/test-apidoc-toc/mypackage/no_init/foo.py
new file mode 100644
index 0000000..ece50cb
--- /dev/null
+++ b/tests/roots/test-apidoc-toc/mypackage/no_init/foo.py
@@ -0,0 +1 @@
+MESSAGE = "There's no __init__.py in this folder, hence we should be left out"
diff --git a/tests/roots/test-apidoc-toc/mypackage/resource/__init__.py b/tests/roots/test-apidoc-toc/mypackage/resource/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-apidoc-toc/mypackage/resource/__init__.py
diff --git a/tests/roots/test-apidoc-toc/mypackage/resource/resource.txt b/tests/roots/test-apidoc-toc/mypackage/resource/resource.txt
new file mode 100644
index 0000000..c04433e
--- /dev/null
+++ b/tests/roots/test-apidoc-toc/mypackage/resource/resource.txt
@@ -0,0 +1 @@
+This is a text resource to be included in this otherwise empty module. No python contents here.
diff --git a/tests/roots/test-apidoc-toc/mypackage/something/__init__.py b/tests/roots/test-apidoc-toc/mypackage/something/__init__.py
new file mode 100644
index 0000000..6401e43
--- /dev/null
+++ b/tests/roots/test-apidoc-toc/mypackage/something/__init__.py
@@ -0,0 +1 @@
+"Subpackage Something"
diff --git a/tests/roots/test-apidoc-trailing-underscore/package_/__init__.py b/tests/roots/test-apidoc-trailing-underscore/package_/__init__.py
new file mode 100644
index 0000000..b09612b
--- /dev/null
+++ b/tests/roots/test-apidoc-trailing-underscore/package_/__init__.py
@@ -0,0 +1 @@
+""" A package with trailing underscores """
diff --git a/tests/roots/test-apidoc-trailing-underscore/package_/module_.py b/tests/roots/test-apidoc-trailing-underscore/package_/module_.py
new file mode 100644
index 0000000..e16461c
--- /dev/null
+++ b/tests/roots/test-apidoc-trailing-underscore/package_/module_.py
@@ -0,0 +1,9 @@
+""" A module with a trailing underscore """
+
+
+class SomeClass_:
+ """ A class with a trailing underscore """
+
+
+def some_function_(some_arg_):
+ """ A function with a trailing underscore in name and argument """
diff --git a/tests/roots/test-autosummary/conf.py b/tests/roots/test-autosummary/conf.py
new file mode 100644
index 0000000..46cf4fa
--- /dev/null
+++ b/tests/roots/test-autosummary/conf.py
@@ -0,0 +1,12 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autosummary']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+autosummary_generate = True
+
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-autosummary/dummy_module.py b/tests/roots/test-autosummary/dummy_module.py
new file mode 100644
index 0000000..4adc031
--- /dev/null
+++ b/tests/roots/test-autosummary/dummy_module.py
@@ -0,0 +1,85 @@
+"""
+.. autosummary::
+
+ module_attr
+ C.class_attr
+ C.instance_attr
+ C.prop_attr1
+ C.prop_attr2
+ C.C2
+"""
+
+
+def withSentence():
+ '''I have a sentence which
+ spans multiple lines. Then I have
+ more stuff
+ '''
+ pass
+
+
+def noSentence():
+ '''this doesn't start with a
+ capital. so it's not considered
+ a sentence
+ '''
+ pass
+
+
+def emptyLine():
+ '''This is the real summary
+
+ However, it did't end with a period.
+ '''
+ pass
+
+
+#: This is a module attribute
+#:
+#: value is integer.
+module_attr = 1
+
+
+class C:
+ '''
+ My C class
+
+ with class_attr attribute
+ '''
+
+ #: This is a class attribute
+ #:
+ #: value is integer.
+ class_attr = 42
+
+ def __init__(self):
+ #: This is an instance attribute
+ #:
+ #: value is a string
+ self.instance_attr = "42"
+
+ def _prop_attr_get(self):
+ """
+ This is a function docstring
+
+ return value is string.
+ """
+ return 'spam egg'
+
+ prop_attr1 = property(_prop_attr_get)
+
+ prop_attr2 = property(_prop_attr_get)
+ """
+ This is a attribute docstring
+
+ value is string.
+ """
+
+ class C2:
+ '''
+ This is a nested inner class docstring
+ '''
+
+
+def func(arg_, *args, **kwargs):
+ """Test function take an argument ended with underscore."""
diff --git a/tests/roots/test-autosummary/index.rst b/tests/roots/test-autosummary/index.rst
new file mode 100644
index 0000000..5ddc4bd
--- /dev/null
+++ b/tests/roots/test-autosummary/index.rst
@@ -0,0 +1,8 @@
+
+.. autosummary::
+ :nosignatures:
+ :toctree:
+
+ dummy_module
+ underscore_module_
+ sphinx
diff --git a/tests/roots/test-autosummary/sphinx.rst b/tests/roots/test-autosummary/sphinx.rst
new file mode 100644
index 0000000..fc1a35a
--- /dev/null
+++ b/tests/roots/test-autosummary/sphinx.rst
@@ -0,0 +1,31 @@
+Autosummary test
+================
+
+.. autosummary::
+ :toctree: generated
+
+ 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/roots/test-autosummary/underscore_module_.py b/tests/roots/test-autosummary/underscore_module_.py
new file mode 100644
index 0000000..8584e60
--- /dev/null
+++ b/tests/roots/test-autosummary/underscore_module_.py
@@ -0,0 +1,15 @@
+"""
+module with trailing underscores everywhere
+"""
+
+
+class class_:
+ """ Class """
+ def method_(_arg):
+ """ Method """
+ pass
+
+
+def function_(_arg):
+ """ Function """
+ pass
diff --git a/tests/roots/test-basic/conf.py b/tests/roots/test-basic/conf.py
new file mode 100644
index 0000000..e274bde
--- /dev/null
+++ b/tests/roots/test-basic/conf.py
@@ -0,0 +1,3 @@
+latex_documents = [
+ ('index', 'test.tex', 'The basic Sphinx documentation for testing', 'Sphinx', 'report')
+]
diff --git a/tests/roots/test-basic/index.rst b/tests/roots/test-basic/index.rst
new file mode 100644
index 0000000..af12ed6
--- /dev/null
+++ b/tests/roots/test-basic/index.rst
@@ -0,0 +1,31 @@
+The basic Sphinx documentation for testing
+==========================================
+
+Sphinx is a tool that makes it easy to create intelligent and beautiful
+documentation for Python projects (or other documents consisting of multiple
+reStructuredText sources), written by Georg Brandl. It was originally created
+for the new Python documentation, and has excellent facilities for Python
+project documentation, but C/C++ is supported as well, and more languages are
+planned.
+
+Sphinx uses reStructuredText as its markup language, and many of its strengths
+come from the power and straightforwardness of reStructuredText and its parsing
+and translating suite, the Docutils.
+
+features
+--------
+
+Among its features are the following:
+
+* Output formats: HTML (including derivative formats such as HTML Help, Epub
+ and Qt Help), plain text, manual pages and LaTeX or direct PDF output
+ using rst2pdf
+* Extensive cross-references: semantic markup and automatic links
+ for functions, classes, glossary terms and similar pieces of information
+* Hierarchical structure: easy definition of a document tree, with automatic
+ links to siblings, parents and children
+* Automatic indices: general index as well as a module index
+* Code handling: automatic highlighting using the Pygments highlighter
+* Flexible HTML output using the Jinja 2 templating engine
+* Various extensions are available, e.g. for automatic testing of snippets
+ and inclusion of appropriately formatted docstrings
diff --git a/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/extra.css b/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/extra.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/extra.css
diff --git a/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/mytheme.css b/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/mytheme.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/_static/mytheme.css
diff --git a/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/theme.conf b/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/theme.conf
new file mode 100644
index 0000000..c87296e
--- /dev/null
+++ b/tests/roots/test-build-html-theme-having-multiple-stylesheets/_themes/mytheme/theme.conf
@@ -0,0 +1,3 @@
+[theme]
+inherit = basic
+stylesheet = mytheme.css, extra.css
diff --git a/tests/roots/test-build-html-theme-having-multiple-stylesheets/conf.py b/tests/roots/test-build-html-theme-having-multiple-stylesheets/conf.py
new file mode 100644
index 0000000..3cb43d6
--- /dev/null
+++ b/tests/roots/test-build-html-theme-having-multiple-stylesheets/conf.py
@@ -0,0 +1,2 @@
+html_theme_path = ['_themes']
+html_theme = 'mytheme'
diff --git a/tests/roots/test-build-html-theme-having-multiple-stylesheets/index.rst b/tests/roots/test-build-html-theme-having-multiple-stylesheets/index.rst
new file mode 100644
index 0000000..b8b81f9
--- /dev/null
+++ b/tests/roots/test-build-html-theme-having-multiple-stylesheets/index.rst
@@ -0,0 +1,2 @@
+test-build-html-theme-having-multiple-stylesheets
+=================================================
diff --git a/tests/roots/test-build-html-translator/conf.py b/tests/roots/test-build-html-translator/conf.py
new file mode 100644
index 0000000..89448d4
--- /dev/null
+++ b/tests/roots/test-build-html-translator/conf.py
@@ -0,0 +1,16 @@
+from sphinx.writers.html import HTML5Translator
+
+project = 'test'
+
+
+class ConfHTMLTranslator(HTML5Translator):
+ depart_with_node = 0
+
+ def depart_admonition(self, node=None):
+ if node is not None:
+ self.depart_with_node += 1
+ HTML5Translator.depart_admonition(self, node)
+
+
+def setup(app):
+ app.set_translator('html', ConfHTMLTranslator)
diff --git a/tests/roots/test-build-html-translator/index.rst b/tests/roots/test-build-html-translator/index.rst
new file mode 100644
index 0000000..1610d2b
--- /dev/null
+++ b/tests/roots/test-build-html-translator/index.rst
@@ -0,0 +1,24 @@
+=======================
+Test HTML admonitions
+=======================
+
+.. seealso:: test
+
+.. note:: test
+
+.. warning:: test
+
+.. attention:: test
+
+.. caution:: test
+
+.. danger:: test
+
+.. error:: test
+
+.. hint:: test
+
+.. important:: test
+
+.. tip:: test
+
diff --git a/tests/roots/test-build-text/conf.py b/tests/roots/test-build-text/conf.py
new file mode 100644
index 0000000..fd9eefb
--- /dev/null
+++ b/tests/roots/test-build-text/conf.py
@@ -0,0 +1,2 @@
+source_suffix = '.txt'
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-build-text/doc1.txt b/tests/roots/test-build-text/doc1.txt
new file mode 100644
index 0000000..da1909a
--- /dev/null
+++ b/tests/roots/test-build-text/doc1.txt
@@ -0,0 +1,2 @@
+Section A
+=========
diff --git a/tests/roots/test-build-text/doc2.txt b/tests/roots/test-build-text/doc2.txt
new file mode 100644
index 0000000..ebc88e9
--- /dev/null
+++ b/tests/roots/test-build-text/doc2.txt
@@ -0,0 +1,9 @@
+Section B
+=========
+
+Sub Ba
+------
+
+Sub Bb
+------
+
diff --git a/tests/roots/test-build-text/index.txt b/tests/roots/test-build-text/index.txt
new file mode 100644
index 0000000..ca9f8dc
--- /dev/null
+++ b/tests/roots/test-build-text/index.txt
@@ -0,0 +1,11 @@
+.. toctree::
+ :numbered:
+
+ doc1
+ doc2
+ maxwidth
+ lineblock
+ nonascii_title
+ nonascii_table
+ nonascii_maxwidth
+ table
diff --git a/tests/roots/test-build-text/lineblock.txt b/tests/roots/test-build-text/lineblock.txt
new file mode 100644
index 0000000..b9cd0ed
--- /dev/null
+++ b/tests/roots/test-build-text/lineblock.txt
@@ -0,0 +1,6 @@
+* one
+
+ | line-block 1
+ | line-block 2
+
+followed paragraph.
diff --git a/tests/roots/test-build-text/listitems.txt b/tests/roots/test-build-text/listitems.txt
new file mode 100644
index 0000000..f0952d8
--- /dev/null
+++ b/tests/roots/test-build-text/listitems.txt
@@ -0,0 +1,4 @@
+.. seealso::
+
+ * item 1
+ * item 2
diff --git a/tests/roots/test-build-text/maxwidth.txt b/tests/roots/test-build-text/maxwidth.txt
new file mode 100644
index 0000000..c36f8a0
--- /dev/null
+++ b/tests/roots/test-build-text/maxwidth.txt
@@ -0,0 +1,6 @@
+.. seealso:: ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham
+
+* ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham
+* ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham ham
+
+spam egg
diff --git a/tests/roots/test-build-text/nonascii_maxwidth.txt b/tests/roots/test-build-text/nonascii_maxwidth.txt
new file mode 100644
index 0000000..e9f0fd9
--- /dev/null
+++ b/tests/roots/test-build-text/nonascii_maxwidth.txt
@@ -0,0 +1,5 @@
+abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc
+
+日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語 日本語
+
+abc 日本語 abc 日本語 abc 日本語 abc 日本語 abc 日本語 abc 日本語 abc 日本語 abc 日本語 abc 日本語 abc 日本語 abc 日本語
diff --git a/tests/roots/test-build-text/nonascii_table.txt b/tests/roots/test-build-text/nonascii_table.txt
new file mode 100644
index 0000000..709e0f2
--- /dev/null
+++ b/tests/roots/test-build-text/nonascii_table.txt
@@ -0,0 +1,7 @@
+.. list-table::
+
+ - - spam
+ - egg
+
+ - - 日本語
+ - 日本語
diff --git a/tests/roots/test-build-text/nonascii_title.txt b/tests/roots/test-build-text/nonascii_title.txt
new file mode 100644
index 0000000..6d3b1f6
--- /dev/null
+++ b/tests/roots/test-build-text/nonascii_title.txt
@@ -0,0 +1,2 @@
+日本語
+======
diff --git a/tests/roots/test-build-text/table.txt b/tests/roots/test-build-text/table.txt
new file mode 100644
index 0000000..adc8b37
--- /dev/null
+++ b/tests/roots/test-build-text/table.txt
@@ -0,0 +1,7 @@
++-----+-----+
+| XXX | XXX |
++-----+-----+
+| | XXX |
++-----+-----+
+| XXX | |
++-----+-----+
diff --git a/tests/roots/test-build-text/table_colspan.txt b/tests/roots/test-build-text/table_colspan.txt
new file mode 100644
index 0000000..4ae6637
--- /dev/null
+++ b/tests/roots/test-build-text/table_colspan.txt
@@ -0,0 +1,7 @@
++-----+-----+
+| XXX | XXX |
++-----+-----+
+| | XXX |
++-----+ |
+| XXX | |
++-----+-----+
diff --git a/tests/roots/test-build-text/table_colspan_and_rowspan.txt b/tests/roots/test-build-text/table_colspan_and_rowspan.txt
new file mode 100644
index 0000000..82d3607
--- /dev/null
+++ b/tests/roots/test-build-text/table_colspan_and_rowspan.txt
@@ -0,0 +1,7 @@
++-----------+-----+
+| AAA | BBB |
++-----+-----+ |
+| | XXX | |
+| +-----+-----+
+| DDD | CCC |
++-----+-----------+
diff --git a/tests/roots/test-build-text/table_colspan_left.txt b/tests/roots/test-build-text/table_colspan_left.txt
new file mode 100644
index 0000000..dbfa324
--- /dev/null
+++ b/tests/roots/test-build-text/table_colspan_left.txt
@@ -0,0 +1,7 @@
++-----+-----+
+| XXX | XXX |
++-----+-----+
+| | XXX |
+| +-----+
+| XXX | |
++-----+-----+
diff --git a/tests/roots/test-build-text/table_rowspan.txt b/tests/roots/test-build-text/table_rowspan.txt
new file mode 100644
index 0000000..36c30eb
--- /dev/null
+++ b/tests/roots/test-build-text/table_rowspan.txt
@@ -0,0 +1,7 @@
++-----+-----+
+| XXXXXXXXX |
++-----+-----+
+| | XXX |
++-----+-----+
+| XXX | |
++-----+-----+
diff --git a/tests/roots/test-builder-dirhtml/bar.rst b/tests/roots/test-builder-dirhtml/bar.rst
new file mode 100644
index 0000000..11f287a
--- /dev/null
+++ b/tests/roots/test-builder-dirhtml/bar.rst
@@ -0,0 +1,4 @@
+.. _bar:
+
+bar
+===
diff --git a/tests/roots/test-builder-dirhtml/conf.py b/tests/roots/test-builder-dirhtml/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-builder-dirhtml/conf.py
diff --git a/tests/roots/test-builder-dirhtml/foo/foo_1.rst b/tests/roots/test-builder-dirhtml/foo/foo_1.rst
new file mode 100644
index 0000000..6db0ea5
--- /dev/null
+++ b/tests/roots/test-builder-dirhtml/foo/foo_1.rst
@@ -0,0 +1,4 @@
+.. _foo_1:
+
+foo/foo_1
+=========
diff --git a/tests/roots/test-builder-dirhtml/foo/foo_2.rst b/tests/roots/test-builder-dirhtml/foo/foo_2.rst
new file mode 100644
index 0000000..fae7f26
--- /dev/null
+++ b/tests/roots/test-builder-dirhtml/foo/foo_2.rst
@@ -0,0 +1,4 @@
+.. _foo_2:
+
+foo/foo_2
+=========
diff --git a/tests/roots/test-builder-dirhtml/foo/index.rst b/tests/roots/test-builder-dirhtml/foo/index.rst
new file mode 100644
index 0000000..92d473c
--- /dev/null
+++ b/tests/roots/test-builder-dirhtml/foo/index.rst
@@ -0,0 +1,9 @@
+.. _foo:
+
+foo/index
+=========
+
+.. toctree::
+
+ foo_1
+ foo_2
diff --git a/tests/roots/test-builder-dirhtml/index.rst b/tests/roots/test-builder-dirhtml/index.rst
new file mode 100644
index 0000000..274e177
--- /dev/null
+++ b/tests/roots/test-builder-dirhtml/index.rst
@@ -0,0 +1,9 @@
+.. _index:
+
+index
+=====
+
+.. toctree::
+
+ foo/index
+ bar
diff --git a/tests/roots/test-builder-gettext-dont-rebuild-mo/bom.rst b/tests/roots/test-builder-gettext-dont-rebuild-mo/bom.rst
new file mode 100644
index 0000000..3fea824
--- /dev/null
+++ b/tests/roots/test-builder-gettext-dont-rebuild-mo/bom.rst
@@ -0,0 +1,5 @@
+File with UTF-8 BOM
+===================
+
+This file has a UTF-8 "BOM".
+
diff --git a/tests/roots/test-builder-gettext-dont-rebuild-mo/conf.py b/tests/roots/test-builder-gettext-dont-rebuild-mo/conf.py
new file mode 100644
index 0000000..d13f727
--- /dev/null
+++ b/tests/roots/test-builder-gettext-dont-rebuild-mo/conf.py
@@ -0,0 +1 @@
+language = 'xx'
diff --git a/tests/roots/test-builder-gettext-dont-rebuild-mo/index.rst b/tests/roots/test-builder-gettext-dont-rebuild-mo/index.rst
new file mode 100644
index 0000000..7ff38c5
--- /dev/null
+++ b/tests/roots/test-builder-gettext-dont-rebuild-mo/index.rst
@@ -0,0 +1,6 @@
+The basic Sphinx documentation for testing
+==========================================
+
+.. toctree::
+
+ bom
diff --git a/tests/roots/test-builder-gettext-dont-rebuild-mo/xx/LC_MESSAGES/bom.po b/tests/roots/test-builder-gettext-dont-rebuild-mo/xx/LC_MESSAGES/bom.po
new file mode 100644
index 0000000..c6025eb
--- /dev/null
+++ b/tests/roots/test-builder-gettext-dont-rebuild-mo/xx/LC_MESSAGES/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/roots/test-changes/base.rst b/tests/roots/test-changes/base.rst
new file mode 100644
index 0000000..a1b2839
--- /dev/null
+++ b/tests/roots/test-changes/base.rst
@@ -0,0 +1,20 @@
+Version markup
+--------------
+
+.. versionadded:: 0.6
+ Some funny **stuff**.
+
+.. versionchanged:: 0.6
+ Even more funny stuff.
+
+.. deprecated:: 0.6
+ Boring stuff.
+
+.. versionadded:: 1.2
+
+ First paragraph of versionadded.
+
+.. versionchanged:: 1.2
+ First paragraph of versionchanged.
+
+ Second paragraph of versionchanged.
diff --git a/tests/roots/test-changes/c-api.rst b/tests/roots/test-changes/c-api.rst
new file mode 100644
index 0000000..f0ad413
--- /dev/null
+++ b/tests/roots/test-changes/c-api.rst
@@ -0,0 +1,24 @@
+.. highlight:: c
+
+
+Memory
+======
+
+.. c:function:: void* Test_Malloc(size_t n)
+
+ Allocate *n* bytes of memory.
+
+ .. versionchanged:: 0.6
+
+ Can now be replaced with a different allocator.
+
+System
+------
+
+Access to the system allocator.
+
+.. versionadded:: 0.6
+
+.. c:function:: void* Test_SysMalloc(size_t n)
+
+ Allocate *n* bytes of memory using system allocator.
diff --git a/tests/roots/test-changes/conf.py b/tests/roots/test-changes/conf.py
new file mode 100644
index 0000000..c3b2169
--- /dev/null
+++ b/tests/roots/test-changes/conf.py
@@ -0,0 +1,4 @@
+project = 'Sphinx ChangesBuilder tests'
+copyright = '2007-2023 by the Sphinx team, see AUTHORS'
+version = '0.6'
+release = '0.6alpha1'
diff --git a/tests/roots/test-changes/contents.rst b/tests/roots/test-changes/contents.rst
new file mode 100644
index 0000000..ced8026
--- /dev/null
+++ b/tests/roots/test-changes/contents.rst
@@ -0,0 +1,13 @@
+Index for ChangesBuilder tests
+==============================
+
+Contents:
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Table of Contents
+ :name: mastertoc
+
+ base
+ c-api
+ library/utils
diff --git a/tests/roots/test-changes/library/utils.rst b/tests/roots/test-changes/library/utils.rst
new file mode 100644
index 0000000..8644699
--- /dev/null
+++ b/tests/roots/test-changes/library/utils.rst
@@ -0,0 +1,25 @@
+:mod:`utils` --- Fake utilities module for tests
+================================================
+
+.. module:: utils
+ :synopsis: Utility functions
+
+--------------
+
+The :mod:`utils` module is a pretend python module for changes testing.
+
+
+Classes
+-------
+
+.. class:: Path
+
+ Class for handling paths.
+
+ .. versionadded:: 0.5
+
+ Innovative new way to handle paths.
+
+ .. deprecated:: 0.6
+
+ So, that was a bad idea it turns out.
diff --git a/tests/roots/test-circular/conf.py b/tests/roots/test-circular/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-circular/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-circular/index.rst b/tests/roots/test-circular/index.rst
new file mode 100644
index 0000000..294e674
--- /dev/null
+++ b/tests/roots/test-circular/index.rst
@@ -0,0 +1,4 @@
+.. toctree::
+
+ sub
+
diff --git a/tests/roots/test-circular/sub.rst b/tests/roots/test-circular/sub.rst
new file mode 100644
index 0000000..cebfd65
--- /dev/null
+++ b/tests/roots/test-circular/sub.rst
@@ -0,0 +1,3 @@
+.. toctree::
+
+ index
diff --git a/tests/roots/test-config/conf.py b/tests/roots/test-config/conf.py
new file mode 100644
index 0000000..0027d87
--- /dev/null
+++ b/tests/roots/test-config/conf.py
@@ -0,0 +1,3 @@
+project = 'Sphinx <Tests>'
+release = '0.6alpha1'
+templates_path = ['_templates']
diff --git a/tests/roots/test-copyright-multiline/conf.py b/tests/roots/test-copyright-multiline/conf.py
new file mode 100644
index 0000000..a2b7b68
--- /dev/null
+++ b/tests/roots/test-copyright-multiline/conf.py
@@ -0,0 +1,9 @@
+copyright = (
+ '2006',
+ '2006-2009, Alice',
+ '2010-2013, Bob',
+ '2014-2017, Charlie',
+ '2018-2021, David',
+ '2022-2025, Eve',
+)
+html_theme = 'basic'
diff --git a/tests/roots/test-copyright-multiline/index.rst b/tests/roots/test-copyright-multiline/index.rst
new file mode 100644
index 0000000..aa32ae6
--- /dev/null
+++ b/tests/roots/test-copyright-multiline/index.rst
@@ -0,0 +1,3 @@
+========================
+test-copyright-multiline
+========================
diff --git a/tests/roots/test-correct-year/conf.py b/tests/roots/test-correct-year/conf.py
new file mode 100644
index 0000000..814c08b
--- /dev/null
+++ b/tests/roots/test-correct-year/conf.py
@@ -0,0 +1 @@
+copyright = '2006-2009, Author'
diff --git a/tests/roots/test-correct-year/index.rst b/tests/roots/test-correct-year/index.rst
new file mode 100644
index 0000000..938dfd5
--- /dev/null
+++ b/tests/roots/test-correct-year/index.rst
@@ -0,0 +1,4 @@
+=================
+test-correct-year
+=================
+
diff --git a/tests/roots/test-default_role/conf.py b/tests/roots/test-default_role/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-default_role/conf.py
diff --git a/tests/roots/test-default_role/foo.rst b/tests/roots/test-default_role/foo.rst
new file mode 100644
index 0000000..00e5ae5
--- /dev/null
+++ b/tests/roots/test-default_role/foo.rst
@@ -0,0 +1,4 @@
+foo.rst
+=======
+
+`OK` button
diff --git a/tests/roots/test-default_role/index.rst b/tests/roots/test-default_role/index.rst
new file mode 100644
index 0000000..34c1855
--- /dev/null
+++ b/tests/roots/test-default_role/index.rst
@@ -0,0 +1,6 @@
+default_role
+============
+
+.. default-role:: pep
+
+`8`
diff --git a/tests/roots/test-directive-code/caption.rst b/tests/roots/test-directive-code/caption.rst
new file mode 100644
index 0000000..77c5c38
--- /dev/null
+++ b/tests/roots/test-directive-code/caption.rst
@@ -0,0 +1,52 @@
+Caption
+=======
+
+References
+----------
+
+See :numref:`name *test* rb` and :numref:`name **test** py`.
+
+See :ref:`Ruby <name *test* rb>` and :ref:`Python <name **test** py>`.
+
+
+Code blocks
+-----------
+
+.. code-block:: ruby
+ :caption: caption *test* rb
+
+ def ruby?
+ false
+ end
+
+
+Literal Include
+---------------
+
+.. literalinclude:: literal.inc
+ :language: python
+ :caption: caption **test** py
+ :lines: 10-11
+
+
+Named Code blocks
+-----------------
+
+.. code-block:: ruby
+ :name: name *test* rb
+ :caption: caption *test* rbnamed
+
+ def ruby?
+ false
+ end
+
+
+Named Literal Include
+---------------------
+
+.. literalinclude:: literal.inc
+ :language: python
+ :name: name **test** py
+ :caption: caption **test** pynamed
+ :lines: 10-11
+
diff --git a/tests/roots/test-directive-code/classes.rst b/tests/roots/test-directive-code/classes.rst
new file mode 100644
index 0000000..e9aa5d9
--- /dev/null
+++ b/tests/roots/test-directive-code/classes.rst
@@ -0,0 +1,21 @@
+classes
+=======
+
+Code blocks
+-----------
+
+.. code-block:: ruby
+ :class: foo bar
+ :name: code_block
+
+ def ruby?
+ false
+ end
+
+
+Literal Includes
+----------------
+
+.. literalinclude:: literal.inc
+ :class: bar baz
+ :name: literal_include
diff --git a/tests/roots/test-directive-code/conf.py b/tests/roots/test-directive-code/conf.py
new file mode 100644
index 0000000..f1e3a2c
--- /dev/null
+++ b/tests/roots/test-directive-code/conf.py
@@ -0,0 +1,2 @@
+exclude_patterns = ['_build']
+numfig = True
diff --git a/tests/roots/test-directive-code/dedent.rst b/tests/roots/test-directive-code/dedent.rst
new file mode 100644
index 0000000..66ac91c
--- /dev/null
+++ b/tests/roots/test-directive-code/dedent.rst
@@ -0,0 +1,64 @@
+dedent option
+-------------
+
+.. code-block::
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+ReST has no fixed indent and only a change in indentation is significant not the amount [1]_.
+Thus, the following code inside the code block is not indent even it looks so with respect to the previous block.
+
+.. code-block::
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+Having an option "fixates" the indent to be 3 spaces, thus the code inside the code block is indented by 4 spaces.
+
+.. code-block::
+ :class: dummy
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+The code has 6 spaces indent, minus 4 spaces dedent should yield a 2 space indented code in the output.
+
+.. code-block::
+ :dedent: 4
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+Dedenting by zero, should not strip any spaces and be a no-op.
+
+.. note::
+ This can be used as an alternative to ``:class: dummy`` above, to fixate the ReST indentation of the block.
+
+.. code-block::
+ :dedent: 0
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+Dedent without argument should autostrip common whitespace at the beginning.
+
+.. code-block::
+ :dedent:
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+.. [1] https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#indentation
diff --git a/tests/roots/test-directive-code/emphasize.rst b/tests/roots/test-directive-code/emphasize.rst
new file mode 100644
index 0000000..95db574
--- /dev/null
+++ b/tests/roots/test-directive-code/emphasize.rst
@@ -0,0 +1,7 @@
+Literal Includes with Highlighted Lines
+=======================================
+
+.. literalinclude:: target.py
+ :language: python
+ :emphasize-lines: 5-6, 13-15, 24-
+
diff --git a/tests/roots/test-directive-code/empty.inc b/tests/roots/test-directive-code/empty.inc
new file mode 100644
index 0000000..b28b04f
--- /dev/null
+++ b/tests/roots/test-directive-code/empty.inc
@@ -0,0 +1,3 @@
+
+
+
diff --git a/tests/roots/test-directive-code/error.inc b/tests/roots/test-directive-code/error.inc
new file mode 100644
index 0000000..4728280
--- /dev/null
+++ b/tests/roots/test-directive-code/error.inc
@@ -0,0 +1 @@
+not a python script!
diff --git a/tests/roots/test-directive-code/force.rst b/tests/roots/test-directive-code/force.rst
new file mode 100644
index 0000000..1834b3a
--- /dev/null
+++ b/tests/roots/test-directive-code/force.rst
@@ -0,0 +1,16 @@
+force option
+============
+
+.. code:: python
+ :force:
+
+ not a python script!
+
+.. code-block:: python
+ :force:
+
+ not a python script!
+
+.. literalinclude:: error.inc
+ :language: python
+ :force:
diff --git a/tests/roots/test-directive-code/highlight.rst b/tests/roots/test-directive-code/highlight.rst
new file mode 100644
index 0000000..4191b58
--- /dev/null
+++ b/tests/roots/test-directive-code/highlight.rst
@@ -0,0 +1,20 @@
+highlight
+---------
+
+.. code-block::
+
+ "A code-block without no language"
+
+.. code-block:: python2
+
+ "A code-block with language argument"
+
+.. highlight:: python3
+
+.. code-block::
+
+ "A code-block without no language after highlight directive"
+
+.. code-block:: python2
+
+ "A code-block without language argument after highlight directive"
diff --git a/tests/roots/test-directive-code/index.rst b/tests/roots/test-directive-code/index.rst
new file mode 100644
index 0000000..dab6b70
--- /dev/null
+++ b/tests/roots/test-directive-code/index.rst
@@ -0,0 +1,25 @@
+test-directive-code
+===================
+
+.. toctree::
+ :glob:
+
+ *
+
+
+Code blocks
+-----------
+
+.. code-block:: ruby
+ :linenos:
+
+ def ruby?
+ false
+ end
+
+
+Literal Includes
+----------------
+
+.. literalinclude:: literal.inc
+ :language: python
diff --git a/tests/roots/test-directive-code/linenos.rst b/tests/roots/test-directive-code/linenos.rst
new file mode 100644
index 0000000..a8e5b69
--- /dev/null
+++ b/tests/roots/test-directive-code/linenos.rst
@@ -0,0 +1,18 @@
+Literal Includes with Line Numbers
+==================================
+
+.. literalinclude:: literal.inc
+ :language: python
+ :linenos:
+
+.. literalinclude:: literal.inc
+ :language: python
+ :lineno-start: 200
+
+.. literalinclude:: literal.inc
+ :language: python
+ :lines: 5-9
+ :lineno-match:
+
+.. literalinclude:: empty.inc
+ :lineno-match:
diff --git a/tests/roots/test-directive-code/linenothreshold.rst b/tests/roots/test-directive-code/linenothreshold.rst
new file mode 100644
index 0000000..09ee67e
--- /dev/null
+++ b/tests/roots/test-directive-code/linenothreshold.rst
@@ -0,0 +1,23 @@
+Code Blocks and Literal Includes with Line Numbers via linenothreshold
+======================================================================
+
+.. highlight:: python
+ :linenothreshold: 5
+
+.. code-block::
+
+ class Foo:
+ pass
+
+ class Bar:
+ def baz():
+ pass
+
+.. code-block::
+
+ # comment
+ value = True
+
+.. literalinclude:: literal.inc
+
+.. literalinclude:: literal-short.inc
diff --git a/tests/roots/test-directive-code/literal-diff.inc b/tests/roots/test-directive-code/literal-diff.inc
new file mode 100644
index 0000000..f9c21e3
--- /dev/null
+++ b/tests/roots/test-directive-code/literal-diff.inc
@@ -0,0 +1,13 @@
+# Literally included file using Python highlighting
+
+foo = "Including Unicode characters: üöä"
+
+class Foo:
+ pass
+
+class Bar:
+ def baz(self):
+ pass
+
+# comment after Bar class
+def bar(): pass
diff --git a/tests/roots/test-directive-code/literal-short.inc b/tests/roots/test-directive-code/literal-short.inc
new file mode 100644
index 0000000..7a07a3f
--- /dev/null
+++ b/tests/roots/test-directive-code/literal-short.inc
@@ -0,0 +1,3 @@
+# Very small literal include (linenothreshold check)
+
+value = True
diff --git a/tests/roots/test-directive-code/literal.inc b/tests/roots/test-directive-code/literal.inc
new file mode 100644
index 0000000..fa8f0ca
--- /dev/null
+++ b/tests/roots/test-directive-code/literal.inc
@@ -0,0 +1,13 @@
+# Literally included file using Python highlighting
+
+foo = "Including Unicode characters: üöä"
+
+class Foo:
+ pass
+
+class Bar:
+ def baz():
+ pass
+
+# comment after Bar class definition
+def bar(): pass
diff --git a/tests/roots/test-directive-code/namedblocks.rst b/tests/roots/test-directive-code/namedblocks.rst
new file mode 100644
index 0000000..5779bc9
--- /dev/null
+++ b/tests/roots/test-directive-code/namedblocks.rst
@@ -0,0 +1,28 @@
+Named Blocks
+============
+
+References to named blocks
+--------------------------
+
+See :ref:`the ruby code <some ruby code>` and
+also :ref:`the python code <some python code>`.
+
+
+Named Code block
+----------------
+
+.. code-block:: ruby
+ :name: some ruby code
+
+ def ruby?
+ false
+ end
+
+
+Named Literal Include
+---------------------
+
+.. literalinclude:: literal.inc
+ :language: python
+ :name: some python code
+
diff --git a/tests/roots/test-directive-code/py-decorators.inc b/tests/roots/test-directive-code/py-decorators.inc
new file mode 100644
index 0000000..012d5d5
--- /dev/null
+++ b/tests/roots/test-directive-code/py-decorators.inc
@@ -0,0 +1,15 @@
+# Literally included file using Python highlighting
+
+@class_decorator
+@other_decorator()
+class TheClass(object):
+
+ @method_decorator
+ @other_decorator()
+ def the_method():
+ pass
+
+@function_decorator
+@other_decorator()
+def the_function():
+ pass
diff --git a/tests/roots/test-directive-code/py-decorators.rst b/tests/roots/test-directive-code/py-decorators.rst
new file mode 100644
index 0000000..31417f5
--- /dev/null
+++ b/tests/roots/test-directive-code/py-decorators.rst
@@ -0,0 +1,17 @@
+py-decorators
+=============
+
+Various decorators
+------------------
+
+.. literalinclude:: py-decorators.inc
+ :name: literal_include_pydecorators_1
+ :pyobject: TheClass
+
+.. literalinclude:: py-decorators.inc
+ :name: literal_include_pydecorators_2
+ :pyobject: TheClass.the_method
+
+.. literalinclude:: py-decorators.inc
+ :name: literal_include_pydecorators_3
+ :pyobject: the_function
diff --git a/tests/roots/test-directive-code/python.rst b/tests/roots/test-directive-code/python.rst
new file mode 100644
index 0000000..794c190
--- /dev/null
+++ b/tests/roots/test-directive-code/python.rst
@@ -0,0 +1,13 @@
+===========================
+Literal Includes for python
+===========================
+
+block start with blank or comment
+=================================
+
+.. literalinclude:: target.py
+ :pyobject: block_start_with_comment
+
+.. literalinclude:: target.py
+ :pyobject: block_start_with_blank
+
diff --git a/tests/roots/test-directive-code/target.py b/tests/roots/test-directive-code/target.py
new file mode 100644
index 0000000..b95dffb
--- /dev/null
+++ b/tests/roots/test-directive-code/target.py
@@ -0,0 +1,26 @@
+# Literally included file using Python highlighting
+
+foo = "Including Unicode characters: üöä"
+
+class Foo:
+ pass
+
+class Bar:
+ def baz():
+ pass
+
+# comment after Bar class definition
+def bar(): pass
+
+def block_start_with_comment():
+ # Comment
+ return 1
+
+def block_start_with_blank():
+
+ return 1
+
+
+class Qux:
+ def quux(self):
+ pass
diff --git a/tests/roots/test-directive-csv-table/conf.py b/tests/roots/test-directive-csv-table/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-directive-csv-table/conf.py
diff --git a/tests/roots/test-directive-csv-table/example.csv b/tests/roots/test-directive-csv-table/example.csv
new file mode 100644
index 0000000..eb039aa
--- /dev/null
+++ b/tests/roots/test-directive-csv-table/example.csv
@@ -0,0 +1 @@
+foo,bar,baz
diff --git a/tests/roots/test-directive-csv-table/subdir/example.csv b/tests/roots/test-directive-csv-table/subdir/example.csv
new file mode 100644
index 0000000..32fe56f
--- /dev/null
+++ b/tests/roots/test-directive-csv-table/subdir/example.csv
@@ -0,0 +1 @@
+FOO,BAR,BAZ
diff --git a/tests/roots/test-directive-include/bar.txt b/tests/roots/test-directive-include/bar.txt
new file mode 100644
index 0000000..c0fef4c
--- /dev/null
+++ b/tests/roots/test-directive-include/bar.txt
@@ -0,0 +1 @@
+Text from :file:`bar.txt`.
diff --git a/tests/roots/test-directive-include/baz/baz.rst b/tests/roots/test-directive-include/baz/baz.rst
new file mode 100644
index 0000000..0b74be0
--- /dev/null
+++ b/tests/roots/test-directive-include/baz/baz.rst
@@ -0,0 +1,6 @@
+Baz
+===
+
+.. include:: foo.rst
+
+Baz was here.
diff --git a/tests/roots/test-directive-include/conf.py b/tests/roots/test-directive-include/conf.py
new file mode 100644
index 0000000..a476858
--- /dev/null
+++ b/tests/roots/test-directive-include/conf.py
@@ -0,0 +1,2 @@
+project = 'test-directive-include'
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-directive-include/foo.rst b/tests/roots/test-directive-include/foo.rst
new file mode 100644
index 0000000..0f82e66
--- /dev/null
+++ b/tests/roots/test-directive-include/foo.rst
@@ -0,0 +1 @@
+The #magical foo.
diff --git a/tests/roots/test-directive-include/text.txt b/tests/roots/test-directive-include/text.txt
new file mode 100644
index 0000000..b7ea15d
--- /dev/null
+++ b/tests/roots/test-directive-include/text.txt
@@ -0,0 +1 @@
+This is plain text.
diff --git a/tests/roots/test-directive-only/conf.py b/tests/roots/test-directive-only/conf.py
new file mode 100644
index 0000000..191d0f5
--- /dev/null
+++ b/tests/roots/test-directive-only/conf.py
@@ -0,0 +1,2 @@
+project = 'test-directive-only'
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-directive-only/index.rst b/tests/roots/test-directive-only/index.rst
new file mode 100644
index 0000000..80ec003
--- /dev/null
+++ b/tests/roots/test-directive-only/index.rst
@@ -0,0 +1,6 @@
+test-directive-only
+===================
+
+.. toctree::
+
+ only
diff --git a/tests/roots/test-directive-only/only.rst b/tests/roots/test-directive-only/only.rst
new file mode 100644
index 0000000..4a3eb48
--- /dev/null
+++ b/tests/roots/test-directive-only/only.rst
@@ -0,0 +1,203 @@
+
+1. Sections in only directives
+==============================
+
+Testing sections in only directives.
+
+.. only:: nonexisting_tag
+
+ Skipped Section
+ ---------------
+ Should not be here.
+
+.. only:: not nonexisting_tag
+
+ 1.1. Section
+ ------------
+ Should be here.
+
+1.2. Section
+------------
+
+.. only:: not nonexisting_tag
+
+ 1.2.1. Subsection
+ ~~~~~~~~~~~~~~~~~
+ Should be here.
+
+.. only:: nonexisting_tag
+
+ Skipped Subsection
+ ~~~~~~~~~~~~~~~~~~
+ Should not be here.
+
+1.3. Section
+------------
+
+1.3.1. Subsection
+~~~~~~~~~~~~~~~~~
+Should be here.
+
+1.4. Section
+------------
+
+.. only:: not nonexisting_tag
+
+ 1.4.1. Subsection
+ ~~~~~~~~~~~~~~~~~
+ Should be here.
+
+1.5. Section
+------------
+
+.. only:: not nonexisting_tag
+
+ 1.5.1. Subsection
+ ~~~~~~~~~~~~~~~~~
+ Should be here.
+
+1.5.2. Subsection
+~~~~~~~~~~~~~~~~~
+Should be here.
+
+1.6. Section
+------------
+
+1.6.1. Subsection
+~~~~~~~~~~~~~~~~~
+Should be here.
+
+.. only:: not nonexisting_tag
+
+ 1.6.2. Subsection
+ ~~~~~~~~~~~~~~~~~
+ Should be here.
+
+1.6.3. Subsection
+~~~~~~~~~~~~~~~~~
+Should be here.
+
+1.7. Section
+------------
+
+1.7.1. Subsection
+~~~~~~~~~~~~~~~~~
+Should be here.
+
+.. only:: not nonexisting_tag
+
+ 1.7.1.1. Subsubsection
+ ......................
+ Should be here.
+
+1.8. Section
+------------
+
+1.8.1. Subsection
+~~~~~~~~~~~~~~~~~
+Should be here.
+
+1.8.1.1. Subsubsection
+......................
+Should be here.
+
+.. only:: not nonexisting_tag
+
+ 1.8.1.2. Subsubsection
+ ......................
+ Should be here.
+
+1.9. Section
+------------
+
+.. only:: nonexisting_tag
+
+ Skipped Subsection
+ ~~~~~~~~~~~~~~~~~~
+
+1.9.1. Subsection
+~~~~~~~~~~~~~~~~~
+Should be here.
+
+1.9.1.1. Subsubsection
+......................
+Should be here.
+
+.. only:: not nonexisting_tag
+
+ 1.10. Section
+ -------------
+ Should be here.
+
+1.11. Section
+-------------
+
+Text before subsection 11.1.
+
+.. only:: not nonexisting_tag
+
+ More text before subsection 11.1.
+
+ 1.11.1. Subsection
+ ~~~~~~~~~~~~~~~~~~
+ Should be here.
+
+Text after subsection 11.1.
+
+.. only:: not nonexisting_tag
+
+ 1.12. Section
+ -------------
+ Should be here.
+
+ 1.12.1. Subsection
+ ~~~~~~~~~~~~~~~~~~
+ Should be here.
+
+ 1.13. Section
+ -------------
+ Should be here.
+
+.. only:: not nonexisting_tag
+
+ 1.14. Section
+ -------------
+ Should be here.
+
+ .. only:: not nonexisting_tag
+
+ 1.14.1. Subsection
+ ~~~~~~~~~~~~~~~~~~
+ Should be here.
+
+ 1.15. Section
+ -------------
+ Should be here.
+
+.. only:: nonexisting_tag
+
+ Skipped document level heading
+ ==============================
+ Should not be here.
+
+.. only:: not nonexisting_tag
+
+ 2. Included document level heading
+ ==================================
+ Should be here.
+
+3. Document level heading
+=========================
+Should be here.
+
+.. only:: nonexisting_tag
+
+ Skipped document level heading
+ ==============================
+ Should not be here.
+
+.. only:: not nonexisting_tag
+
+ 4. Another included document level heading
+ ==========================================
+ Should be here.
diff --git a/tests/roots/test-directives-raw/conf.py b/tests/roots/test-directives-raw/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-directives-raw/conf.py
diff --git a/tests/roots/test-directives-raw/index.rst b/tests/roots/test-directives-raw/index.rst
new file mode 100644
index 0000000..401ab73
--- /dev/null
+++ b/tests/roots/test-directives-raw/index.rst
@@ -0,0 +1,40 @@
+test-directives-raw
+===================
+
+HTML
+----
+
+standard
+^^^^^^^^
+
+.. raw:: html
+
+ standalone raw directive (HTML)
+
+with substitution
+^^^^^^^^^^^^^^^^^
+
+HTML: abc |HTML_RAW| ghi
+
+.. |HTML_RAW| raw:: html
+
+ def
+
+LaTeX
+-----
+
+standard
+^^^^^^^^
+
+.. raw:: latex
+
+ standalone raw directive (LaTeX)
+
+with substitution
+^^^^^^^^^^^^^^^^^
+
+LaTeX: abc |LATEX_RAW| ghi
+
+.. |LATEX_RAW| raw:: latex
+
+ def
diff --git a/tests/roots/test-docutilsconf/conf.py b/tests/roots/test-docutilsconf/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-docutilsconf/conf.py
diff --git a/tests/roots/test-docutilsconf/docutils.conf b/tests/roots/test-docutilsconf/docutils.conf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-docutilsconf/docutils.conf
diff --git a/tests/roots/test-docutilsconf/index.rst b/tests/roots/test-docutilsconf/index.rst
new file mode 100644
index 0000000..d292e32
--- /dev/null
+++ b/tests/roots/test-docutilsconf/index.rst
@@ -0,0 +1,6 @@
+test-docutilsconf
+==================
+
+Sphinx [1]_
+
+.. [1] Python Documentation Generator
diff --git a/tests/roots/test-domain-c-c_maximum_signature_line_length/conf.py b/tests/roots/test-domain-c-c_maximum_signature_line_length/conf.py
new file mode 100644
index 0000000..ba480ed
--- /dev/null
+++ b/tests/roots/test-domain-c-c_maximum_signature_line_length/conf.py
@@ -0,0 +1 @@
+c_maximum_signature_line_length = len("str hello(str name)") - 1
diff --git a/tests/roots/test-domain-c-c_maximum_signature_line_length/index.rst b/tests/roots/test-domain-c-c_maximum_signature_line_length/index.rst
new file mode 100644
index 0000000..be20940
--- /dev/null
+++ b/tests/roots/test-domain-c-c_maximum_signature_line_length/index.rst
@@ -0,0 +1,4 @@
+domain-c-c_maximum_signature_line_length
+========================================
+
+.. c:function:: str hello(str name)
diff --git a/tests/roots/test-domain-c-intersphinx/conf.py b/tests/roots/test-domain-c-intersphinx/conf.py
new file mode 100644
index 0000000..c176af7
--- /dev/null
+++ b/tests/roots/test-domain-c-intersphinx/conf.py
@@ -0,0 +1,4 @@
+exclude_patterns = ['_build']
+extensions = [
+ 'sphinx.ext.intersphinx',
+]
diff --git a/tests/roots/test-domain-c-intersphinx/index.rst b/tests/roots/test-domain-c-intersphinx/index.rst
new file mode 100644
index 0000000..5d6d3e0
--- /dev/null
+++ b/tests/roots/test-domain-c-intersphinx/index.rst
@@ -0,0 +1,62 @@
+.. c:member:: void __member = _member
+
+ - :any:`_member`
+ - :c:member:`_member`
+ - :c:var:`_member`
+ - :c:data:`_member`
+
+.. c:member:: void __var = _var
+
+ - :any:`_var`
+ - :c:member:`_var`
+ - :c:var:`_var`
+ - :c:data:`_var`
+
+.. c:member:: void __function = _function
+
+ - :any:`_function`
+ - :c:func:`_function`
+ - :c:type:`_function`
+
+.. c:member:: void __macro = _macro
+
+ - :any:`_macro`
+ - :c:macro:`_macro`
+
+.. c:type:: _struct __struct
+ struct _struct __structTagged
+
+ - :any:`_struct`
+ - :c:struct:`_struct`
+ - :c:type:`_struct`
+
+.. c:type:: _union __union
+ union _union __unionTagged
+
+ - :any:`_union`
+ - :c:union:`_union`
+ - :c:type:`_union`
+
+.. c:type:: _enum __enum
+ enum _enum __enumTagged
+
+ - :any:`_enum`
+ - :c:enum:`_enum`
+ - :c:type:`_enum`
+
+.. c:member:: void __enumerator = _enumerator
+
+ - :any:`_enumerator`
+ - :c:enumerator:`_enumerator`
+
+.. c:type:: _type __type
+
+ - :any:`_type`
+ - :c:type:`_type`
+
+.. c:member:: void __functionParam = _functionParam.param
+
+ - :any:`_functionParam.param`
+ - :c:member:`_functionParam.param`
+ - :c:var:`_functionParam.param`
+ - :c:data:`_functionParam.param`
diff --git a/tests/roots/test-domain-c/anon-dup-decl.rst b/tests/roots/test-domain-c/anon-dup-decl.rst
new file mode 100644
index 0000000..743ae2f
--- /dev/null
+++ b/tests/roots/test-domain-c/anon-dup-decl.rst
@@ -0,0 +1,7 @@
+.. c:namespace:: anon_dup_decl_ns
+
+.. c:struct:: anon_dup_decl
+
+ .. c:struct:: @a.A
+ .. c:struct:: @b.A
+ .. c:struct:: A
diff --git a/tests/roots/test-domain-c/conf.py b/tests/roots/test-domain-c/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-domain-c/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-domain-c/field-role.rst b/tests/roots/test-domain-c/field-role.rst
new file mode 100644
index 0000000..5452db5
--- /dev/null
+++ b/tests/roots/test-domain-c/field-role.rst
@@ -0,0 +1,4 @@
+.. c:function:: void f(int a, int *b)
+
+ :param int a:
+ :param int* b:
diff --git a/tests/roots/test-domain-c/function_param_target.rst b/tests/roots/test-domain-c/function_param_target.rst
new file mode 100644
index 0000000..d316d7b
--- /dev/null
+++ b/tests/roots/test-domain-c/function_param_target.rst
@@ -0,0 +1,7 @@
+.. c:namespace:: function_param_target
+
+.. c:function:: void f(int i)
+
+ - :c:var:`i`
+
+- :c:var:`f.i`
diff --git a/tests/roots/test-domain-c/index.rst b/tests/roots/test-domain-c/index.rst
new file mode 100644
index 0000000..4febd63
--- /dev/null
+++ b/tests/roots/test-domain-c/index.rst
@@ -0,0 +1,54 @@
+.. c:namespace:: index
+
+test-domain-c
+=============
+
+directives
+----------
+
+.. c:function:: int hello(const char *name)
+
+ :rtype: int
+
+.. c:function:: MyStruct hello2(char *name)
+
+ :rtype: MyStruct
+
+.. c:member:: float Sphinx.version
+.. c:var:: int version
+
+.. c:macro:: IS_SPHINX
+.. c:macro:: SPHINX(arg1, arg2)
+
+.. c:struct:: MyStruct
+.. c:union:: MyUnion
+.. c:enum:: MyEnum
+
+ .. c:enumerator:: MyEnumerator
+
+ :c:enumerator:`MyEnumerator`
+
+ :c:enumerator:`MyEnumerator`
+
+:c:enumerator:`MyEnumerator`
+
+.. c:type:: Sphinx
+.. c:type:: int SphinxVersionNum
+
+
+.. c:struct:: A
+
+ .. c:union:: @data
+
+ .. c:member:: int a
+
+- :c:member:`A.@data.a`
+- :c:member:`A.a`
+
+- :c:expr:`unsigned int`
+- :c:texpr:`unsigned int`
+
+.. c:var:: A a
+
+- :c:expr:`a->b`
+- :c:texpr:`a->b`
diff --git a/tests/roots/test-domain-c/namespace.rst b/tests/roots/test-domain-c/namespace.rst
new file mode 100644
index 0000000..c220d38
--- /dev/null
+++ b/tests/roots/test-domain-c/namespace.rst
@@ -0,0 +1,21 @@
+.. c:namespace:: NS
+
+.. c:var:: int NSVar
+
+.. c:namespace:: NULL
+
+.. c:var:: int NULLVar
+
+.. c:namespace:: NSDummy
+
+.. c:namespace:: 0
+
+.. c:var:: int ZeroVar
+
+.. c:namespace-push:: NS2.NS3
+
+.. c:var:: int NS2NS3Var
+
+.. c:namespace-pop::
+
+.. c:var:: int PopVar
diff --git a/tests/roots/test-domain-c/ns_lookup.rst b/tests/roots/test-domain-c/ns_lookup.rst
new file mode 100644
index 0000000..87f9d68
--- /dev/null
+++ b/tests/roots/test-domain-c/ns_lookup.rst
@@ -0,0 +1,13 @@
+.. c:namespace:: ns_lookup
+
+.. c:var:: int i
+
+.. c:function:: void f(int j)
+
+ - :c:var:`i`
+ - :c:var:`j`
+ - :c:expr:`i`
+ - :c:expr:`j`
+
+- :c:var:`i`
+- :c:expr:`i`
diff --git a/tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/conf.py b/tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/conf.py
new file mode 100644
index 0000000..1eb3a64
--- /dev/null
+++ b/tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/conf.py
@@ -0,0 +1 @@
+cpp_maximum_signature_line_length = len("str hello(str name)") - 1
diff --git a/tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/index.rst b/tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/index.rst
new file mode 100644
index 0000000..425908c
--- /dev/null
+++ b/tests/roots/test-domain-cpp-cpp_maximum_signature_line_length/index.rst
@@ -0,0 +1,4 @@
+domain-cpp-cpp_maximum_signature_line_length
+============================================
+
+.. cpp:function:: str hello(str name)
diff --git a/tests/roots/test-domain-cpp-intersphinx/conf.py b/tests/roots/test-domain-cpp-intersphinx/conf.py
new file mode 100644
index 0000000..c176af7
--- /dev/null
+++ b/tests/roots/test-domain-cpp-intersphinx/conf.py
@@ -0,0 +1,4 @@
+exclude_patterns = ['_build']
+extensions = [
+ 'sphinx.ext.intersphinx',
+]
diff --git a/tests/roots/test-domain-cpp-intersphinx/index.rst b/tests/roots/test-domain-cpp-intersphinx/index.rst
new file mode 100644
index 0000000..9ed9493
--- /dev/null
+++ b/tests/roots/test-domain-cpp-intersphinx/index.rst
@@ -0,0 +1,112 @@
+.. cpp:type:: _class __class
+
+ - :any:`_class`
+ - :cpp:any:`_class`
+ - :cpp:class:`_class`
+ - :cpp:struct:`_class`
+ - :cpp:type:`_class`
+
+.. cpp:type:: _struct __struct
+
+ - :any:`_struct`
+ - :cpp:any:`_struct`
+ - :cpp:class:`_struct`
+ - :cpp:struct:`_struct`
+ - :cpp:type:`_struct`
+
+.. cpp:type:: _union __union
+
+ - :any:`_union`
+ - :cpp:any:`_union`
+ - :cpp:union:`_union`
+ - :cpp:type:`_union`
+
+.. cpp:member:: void __function = _function
+
+ - :any:`_function`
+ - :cpp:any:`_function`
+ - :cpp:func:`_function`
+ - :cpp:type:`_function`
+
+.. cpp:member:: void __member = _member
+
+ - :any:`_member`
+ - :cpp:any:`_member`
+ - :cpp:member:`_member`
+ - :cpp:var:`_member`
+
+.. cpp:member:: void __var = _var
+
+ - :any:`_var`
+ - :cpp:any:`_var`
+ - :cpp:member:`_var`
+ - :cpp:var:`_var`
+
+.. cpp:type:: _type __type
+
+ - :any:`_type`
+ - :cpp:any:`_type`
+ - :cpp:type:`_type`
+
+.. cpp:function:: template<_concept T> void __concept()
+
+ - :any:`_concept`
+ - :cpp:any:`_concept`
+ - :cpp:concept:`_concept`
+
+.. cpp:type:: _enum __enum
+
+ - :any:`_enum`
+ - :cpp:any:`_enum`
+ - :cpp:enum:`_enum`
+ - :cpp:type:`_enum`
+
+.. cpp:type:: _enumStruct __enumStruct
+
+ - :any:`_enumStruct`
+ - :cpp:any:`_enumStruct`
+ - :cpp:enum:`_enumStruct`
+ - :cpp:type:`_enumStruct`
+
+.. cpp:type:: _enumClass __enumClass
+
+ - :any:`_enumClass`
+ - :cpp:any:`_enumClass`
+ - :cpp:enum:`_enumClass`
+ - :cpp:type:`_enumClass`
+
+.. cpp:member:: void __enumerator = _enumerator
+
+ - :any:`_enumerator`
+ - :cpp:any:`_enumerator`
+ - :cpp:enumerator:`_enumerator`
+
+.. cpp:member:: void __scopedEnumerator = _enumStruct::_scopedEnumerator
+
+ - :any:`_enumStruct::_scopedEnumerator`
+ - :cpp:any:`_enumStruct::_scopedEnumerator`
+ - :cpp:enumerator:`_enumStruct::_scopedEnumerator`
+
+.. cpp:member:: void __enumerator2 = _enum::_enumerator
+
+ - :any:`_enum::_enumerator`
+ - :cpp:any:`_enum::_enumerator`
+ - :cpp:enumerator:`_enum::_enumerator`
+
+.. cpp:member:: void __functionParam = _functionParam::param
+
+ - :any:`_functionParam::param`
+ - :cpp:any:`_functionParam::param`
+ - :cpp:member:`_functionParam::param`
+ - :cpp:var:`_functionParam::param`
+
+.. cpp:type:: _templateParam::TParam __templateParam
+
+ - :any:`_templateParam::TParam`
+ - :cpp:any:`_templateParam::TParam`
+ - :cpp:type:`_templateParam::TParam`
+ - :cpp:member:`_templateParam::TParam`
+ - :cpp:var:`_templateParam::TParam`
+ - :cpp:class:`_templateParam::TParam`
+ - :cpp:struct:`_templateParam::TParam`
+ - :cpp:union:`_templateParam::TParam`
diff --git a/tests/roots/test-domain-cpp/anon-dup-decl.rst b/tests/roots/test-domain-cpp/anon-dup-decl.rst
new file mode 100644
index 0000000..89a9c95
--- /dev/null
+++ b/tests/roots/test-domain-cpp/anon-dup-decl.rst
@@ -0,0 +1,4 @@
+.. cpp:namespace:: anon_dup_decl
+.. cpp:class:: @a::A
+.. cpp:class:: @b::A
+.. cpp:class:: A
diff --git a/tests/roots/test-domain-cpp/any-role.rst b/tests/roots/test-domain-cpp/any-role.rst
new file mode 100644
index 0000000..24b415e
--- /dev/null
+++ b/tests/roots/test-domain-cpp/any-role.rst
@@ -0,0 +1,17 @@
+any role
+--------
+
+* :cpp:any:`Sphinx`
+* :cpp:any:`Sphinx::version`
+* :cpp:any:`version`
+* :cpp:any:`List`
+* :cpp:any:`MyEnum`
+
+* ref function without parens :cpp:any:`paren_1`
+* ref function with parens :cpp:any:`paren_2()`
+* ref function without parens, explicit title :cpp:any:`paren_3_title <paren_3>`
+* ref function with parens, explicit title :cpp:any:`paren_4_title <paren_4()>`
+* ref op call without parens :cpp:any:`paren_5::operator()`
+* ref op call with parens :cpp:any:`paren_6::operator()()`
+* ref op call without parens, explicit title :cpp:any:`paren_7_title <paren_7::operator()>`
+* ref op call with parens, explicit title :cpp:any:`paren_8_title <paren_8::operator()()>`
diff --git a/tests/roots/test-domain-cpp/backslash.rst b/tests/roots/test-domain-cpp/backslash.rst
new file mode 100644
index 0000000..c93e68e
--- /dev/null
+++ b/tests/roots/test-domain-cpp/backslash.rst
@@ -0,0 +1 @@
+.. cpp:var:: char c = '\\'
diff --git a/tests/roots/test-domain-cpp/conf.py b/tests/roots/test-domain-cpp/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-domain-cpp/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-domain-cpp/field-role.rst b/tests/roots/test-domain-cpp/field-role.rst
new file mode 100644
index 0000000..1711a88
--- /dev/null
+++ b/tests/roots/test-domain-cpp/field-role.rst
@@ -0,0 +1,5 @@
+.. cpp:function:: void f()
+
+ :throws int:
+ :throws int*:
+
diff --git a/tests/roots/test-domain-cpp/index.rst b/tests/roots/test-domain-cpp/index.rst
new file mode 100644
index 0000000..2df5ec8
--- /dev/null
+++ b/tests/roots/test-domain-cpp/index.rst
@@ -0,0 +1,53 @@
+test-domain-cpp
+===============
+
+directives
+----------
+
+.. cpp:class:: public Sphinx
+
+ The description of Sphinx class.
+
+.. cpp:function:: int hello(char *name)
+
+ The description of hello function.
+
+.. cpp:member:: float Sphinx::version
+
+ The description of Sphinx::version.
+
+.. cpp:var:: int version
+
+ The description of version.
+
+.. cpp:type:: std::vector<int> List
+
+ The description of List type.
+
+.. cpp:enum:: MyEnum
+
+ An unscoped enum.
+
+ .. cpp:enumerator:: A
+
+.. cpp:enum-class:: MyScopedEnum
+
+ A scoped enum.
+
+ .. cpp:enumerator:: B
+
+.. cpp:enum-struct:: protected MyScopedVisibilityEnum : std::underlying_type<MySpecificEnum>::type
+
+ A scoped enum with non-default visibility, and with a specified underlying type.
+
+ .. cpp:enumerator:: B
+
+
+.. cpp:function:: void paren_1(int, float)
+.. cpp:function:: void paren_2(int, float)
+.. cpp:function:: void paren_3(int, float)
+.. cpp:function:: void paren_4(int, float)
+.. cpp:function:: void paren_5::operator()(int)
+.. cpp:function:: void paren_6::operator()(int)
+.. cpp:function:: void paren_7::operator()(int)
+.. cpp:function:: void paren_8::operator()(int)
diff --git a/tests/roots/test-domain-cpp/lookup-key-overload.rst b/tests/roots/test-domain-cpp/lookup-key-overload.rst
new file mode 100644
index 0000000..2011e26
--- /dev/null
+++ b/tests/roots/test-domain-cpp/lookup-key-overload.rst
@@ -0,0 +1,8 @@
+.. default-domain:: cpp
+
+.. namespace:: lookup_key_overload
+
+.. function:: void g(int a)
+.. function:: void g(double b)
+
+ :var:`b`
diff --git a/tests/roots/test-domain-cpp/multi-decl-lookup.rst b/tests/roots/test-domain-cpp/multi-decl-lookup.rst
new file mode 100644
index 0000000..9706d18
--- /dev/null
+++ b/tests/roots/test-domain-cpp/multi-decl-lookup.rst
@@ -0,0 +1,24 @@
+.. default-domain:: cpp
+
+.. namespace:: multi_decl_lookup
+
+.. function:: void f1(int a)
+ void f1(double b)
+
+ - a: :var:`a`
+ - b: :var:`b`
+
+.. function:: template<typename T> void f2(int a)
+ template<typename U> void f2(double b)
+
+ - T: :type:`T`
+ - U: :type:`U`
+
+
+.. class:: template<typename T> A
+ template<typename U> B
+
+ .. function:: void f3()
+
+ - T: :type:`T`
+ - U: :type:`U`
diff --git a/tests/roots/test-domain-cpp/roles-targets-ok.rst b/tests/roots/test-domain-cpp/roles-targets-ok.rst
new file mode 100644
index 0000000..783f7b9
--- /dev/null
+++ b/tests/roots/test-domain-cpp/roles-targets-ok.rst
@@ -0,0 +1,170 @@
+.. default-domain:: cpp
+
+.. namespace:: RolesTargetsOk
+
+.. class:: Class
+
+ :cpp:any:`Class`
+ :class:`Class`
+ :struct:`Class`
+ union
+ func
+ member
+ var
+ :type:`Class`
+ concept
+ enum
+ enumerator
+
+.. union:: Union
+
+ :cpp:any:`Union`
+ class
+ struct
+ :union:`Union`
+ func
+ member
+ var
+ :type:`Union`
+ concept
+ enum
+ enumerator
+
+.. function:: void Function()
+
+ :cpp:any:`Function`
+ class
+ struct
+ union
+ :func:`Function`
+ member
+ var
+ :type:`Function`
+ concept
+ enum
+ enumerator
+
+.. var:: int Variable
+
+ :cpp:any:`Variable`
+ class
+ struct
+ union
+ function
+ :member:`Variable`
+ :var:`Variables`
+ type
+ concept
+ enum
+ enumerator
+
+.. type:: Type = void
+
+ :cpp:any:`Type`
+ class
+ struct
+ union
+ function
+ member
+ var
+ :type:`Type`
+ concept
+ enum
+ enumerator
+
+.. concept:: template<typename T> Concept
+
+ :cpp:any:`Concept`
+ class
+ struct
+ union
+ function
+ member
+ var
+ type
+ :concept:`Concept`
+ enum
+ enumerator
+
+.. enum-struct:: Enum
+
+ :cpp:any:`Enum`
+ class
+ struct
+ union
+ function
+ member
+ var
+ :type:`Enum`
+ concept
+ :enum:`Enum`
+ enumerator
+
+ .. enumerator:: Enumerator
+
+ :cpp:any:`Enumerator`
+ class
+ struct
+ union
+ function
+ member
+ var
+ type
+ concept
+ enum
+ :enumerator:`Enumerator`
+
+.. class:: template<typename TParamType, \
+ int TParamVar, \
+ template<typename> typename TParamTemplate \
+ > ClassTemplate
+
+ :cpp:any:`TParamType`
+ :class:`TParamType`
+ :struct:`TParamType`
+ :union:`TParamType`
+ function
+ :member:`TParamType`
+ :var:`TParamType`
+ :type:`TParamType`
+ concept
+ enum
+ enumerator
+
+ :cpp:any:`TParamVar`
+ :class:`TParamVar`
+ :struct:`TParamVar`
+ :union:`TParamVar`
+ function
+ :member:`TParamVar`
+ :var:`TParamVar`
+ :type:`TParamVar`
+ concept
+ enum
+ enumerator
+
+ :cpp:any:`TParamTemplate`
+ :class:`TParamTemplate`
+ :struct:`TParamTemplate`
+ :union:`TParamTemplate`
+ function
+ :member:`TParamTemplate`
+ :var:`TParamTemplate`
+ :type:`TParamTemplate`
+ concept
+ enum
+ enumerator
+
+.. function:: void FunctionParams(int FunctionParam)
+
+ :cpp:any:`FunctionParam`
+ class
+ struct
+ union
+ function
+ :member:`FunctionParam`
+ :var:`FunctionParam`
+ type
+ concept
+ enum
+ enumerator
diff --git a/tests/roots/test-domain-cpp/roles-targets-warn.rst b/tests/roots/test-domain-cpp/roles-targets-warn.rst
new file mode 100644
index 0000000..57083ff
--- /dev/null
+++ b/tests/roots/test-domain-cpp/roles-targets-warn.rst
@@ -0,0 +1,158 @@
+.. default-domain:: cpp
+
+.. namespace:: RolesTargetsWarn
+
+.. class:: Class
+
+ class
+ struct
+ :union:`Class`
+ :func:`Class`
+ :member:`Class`
+ :var:`Class`
+ type
+ :concept:`Class`
+ :enum:`Class`
+ :enumerator:`Class`
+
+.. union:: Union
+
+ :class:`Union`
+ :struct:`Union`
+ union
+ :func:`Union`
+ :member:`Union`
+ :var:`Union`
+ type
+ :concept:`Union`
+ :enum:`Union`
+ :enumerator:`Union`
+
+.. function:: void Function()
+
+ :class:`Function`
+ :struct:`Function`
+ :union:`Function`
+ func
+ :member:`Function`
+ :var:`Function`
+ type
+ :concept:`Function`
+ :enum:`Function`
+ :enumerator:`Function`
+
+.. var:: int Variable
+
+ :class:`Variable`
+ :struct:`Variable`
+ :union:`Variable`
+ :func:`Variable`
+ member
+ var
+ :type:`Variable`
+ :concept:`Variable`
+ :enum:`Variable`
+ :enumerator:`Variable`
+
+.. type:: Type = void
+
+ :class:`Type`
+ :struct:`Type`
+ :union:`Type`
+ :func:`Type`
+ :member:`Type`
+ :var:`Type`
+ type
+ :concept:`Type`
+ :enum:`Type`
+ :enumerator:`Type`
+
+.. concept:: template<typename T> Concept
+
+ :class:`Concept`
+ :struct:`Concept`
+ :union:`Concept`
+ :func:`Concept`
+ :member:`Concept`
+ :var:`Concept`
+ :type:`Concept`
+ concept
+ :enum:`Concept`
+ :enumerator:`Concept`
+
+.. enum-struct:: Enum
+
+ :class:`Enum`
+ :struct:`Enum`
+ :union:`Enum`
+ :func:`Enum`
+ :member:`Enum`
+ :var:`Enum`
+ type
+ :concept:`Enum`
+ enum
+ :enumerator:`Enum`
+
+ .. enumerator:: Enumerator
+
+ :class:`Enumerator`
+ :struct:`Enumerator`
+ :union:`Enumerator`
+ :func:`Enumerator`
+ :member:`Enumerator`
+ :var:`Enumerator`
+ :type:`Enumerator`
+ :concept:`Enumerator`
+ :enum:`Enumerator`
+ enumerator
+
+.. class:: template<typename TParamType, \
+ int TParamVar, \
+ template<typename> typename TParamTemplate \
+ > ClassTemplate
+
+ class
+ struct
+ union
+ :func:`TParamType`
+ member
+ var
+ type
+ :concept:`TParamType`
+ :enum:`TParamType`
+ :enumerator:`TParamType`
+
+ class
+ struct
+ union
+ :func:`TParamVar`
+ member
+ var
+ type
+ :concept:`TParamVar`
+ :enum:`TParamVar`
+ :enumerator:`TParamVar`
+
+ class
+ struct
+ union
+ :func:`TParamTemplate`
+ member
+ var
+ type
+ :concept:`TParamTemplate`
+ :enum:`TParamTemplate`
+ :enumerator:`TParamTemplate`
+
+.. function:: void FunctionParams(int FunctionParam)
+
+ :class:`FunctionParam`
+ :struct:`FunctionParam`
+ :union:`FunctionParam`
+ :func:`FunctionParam`
+ member
+ var
+ :type:`FunctionParam`
+ :concept:`FunctionParam`
+ :enum:`FunctionParam`
+ :enumerator:`FunctionParam`
diff --git a/tests/roots/test-domain-cpp/roles.rst b/tests/roots/test-domain-cpp/roles.rst
new file mode 100644
index 0000000..afd2ede
--- /dev/null
+++ b/tests/roots/test-domain-cpp/roles.rst
@@ -0,0 +1,17 @@
+roles
+-----
+
+* :cpp:class:`Sphinx`
+* :cpp:member:`Sphinx::version`
+* :cpp:var:`version`
+* :cpp:type:`List`
+* :cpp:enum:`MyEnum`
+
+* ref function without parens :cpp:func:`paren_1`
+* ref function with parens :cpp:func:`paren_2()`
+* ref function without parens, explicit title :cpp:func:`paren_3_title <paren_3>`
+* ref function with parens, explicit title :cpp:func:`paren_4_title <paren_4()>`
+* ref op call without parens :cpp:func:`paren_5::operator()`
+* ref op call with parens :cpp:func:`paren_6::operator()()`
+* ref op call without parens, explicit title :cpp:func:`paren_7_title <paren_7::operator()>`
+* ref op call with parens, explicit title :cpp:func:`paren_8_title <paren_8::operator()()>`
diff --git a/tests/roots/test-domain-cpp/roles2.rst b/tests/roots/test-domain-cpp/roles2.rst
new file mode 100644
index 0000000..644b827
--- /dev/null
+++ b/tests/roots/test-domain-cpp/roles2.rst
@@ -0,0 +1,5 @@
+Check that we don't crash just because we misuse a role.
+
+.. cpp:class:: A
+
+:cpp:func:`A`
diff --git a/tests/roots/test-domain-cpp/semicolon.rst b/tests/roots/test-domain-cpp/semicolon.rst
new file mode 100644
index 0000000..e6b370e
--- /dev/null
+++ b/tests/roots/test-domain-cpp/semicolon.rst
@@ -0,0 +1,14 @@
+.. cpp:class:: Class;
+.. cpp:struct:: Struct;
+.. cpp:union:: Union;
+.. cpp:function:: void f();
+.. cpp:member:: int member;
+.. cpp:var:: int var;
+.. cpp:type:: Type;
+.. cpp:type:: int TypeDef;
+.. cpp:type:: Alias = int;
+.. cpp:concept:: template<typename T> Concept;
+.. cpp:enum:: Enum;
+.. cpp:enum-struct:: EnumStruct;
+.. cpp:enum-class:: EnumClass;
+.. cpp:enumerator:: Enumerator;
diff --git a/tests/roots/test-domain-cpp/warn-template-param-qualified-name.rst b/tests/roots/test-domain-cpp/warn-template-param-qualified-name.rst
new file mode 100644
index 0000000..49a650d
--- /dev/null
+++ b/tests/roots/test-domain-cpp/warn-template-param-qualified-name.rst
@@ -0,0 +1,11 @@
+.. default-domain:: cpp
+
+.. class:: template<typename T> A
+
+ .. type:: N1 = T::typeOk
+
+ - Not ok, warn: :type:`T::typeWarn`
+
+ .. type:: N2 = T::U::typeOk
+
+ - Not ok, warn: :type:`T::U::typeWarn`
diff --git a/tests/roots/test-domain-cpp/xref_consistency.rst b/tests/roots/test-domain-cpp/xref_consistency.rst
new file mode 100644
index 0000000..cb33000
--- /dev/null
+++ b/tests/roots/test-domain-cpp/xref_consistency.rst
@@ -0,0 +1,12 @@
+xref consistency
+----------------
+
+.. cpp:namespace:: xref_consistency
+
+.. cpp:class:: item
+
+code-role: :code:`item`
+any-role: :any:`item`
+cpp-any-role: :cpp:any:`item`
+cpp-expr-role: :cpp:expr:`item`
+cpp-texpr-role: :cpp:texpr:`item`
diff --git a/tests/roots/test-domain-js-javascript_maximum_signature_line_length/conf.py b/tests/roots/test-domain-js-javascript_maximum_signature_line_length/conf.py
new file mode 100644
index 0000000..d7c9331
--- /dev/null
+++ b/tests/roots/test-domain-js-javascript_maximum_signature_line_length/conf.py
@@ -0,0 +1 @@
+javascript_maximum_signature_line_length = 1
diff --git a/tests/roots/test-domain-js-javascript_maximum_signature_line_length/index.rst b/tests/roots/test-domain-js-javascript_maximum_signature_line_length/index.rst
new file mode 100644
index 0000000..b79fc1a
--- /dev/null
+++ b/tests/roots/test-domain-js-javascript_maximum_signature_line_length/index.rst
@@ -0,0 +1,6 @@
+domain-js-maximum_signature_line_length
+=======================================
+
+.. js:function:: hello(name)
+
+.. js:function:: foo([a, [b, ]]c, d[, e, f])
diff --git a/tests/roots/test-domain-js/conf.py b/tests/roots/test-domain-js/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-domain-js/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-domain-js/index.rst b/tests/roots/test-domain-js/index.rst
new file mode 100644
index 0000000..fb6b8c3
--- /dev/null
+++ b/tests/roots/test-domain-js/index.rst
@@ -0,0 +1,7 @@
+test-domain-js
+==============
+
+.. toctree::
+
+ roles
+ module
diff --git a/tests/roots/test-domain-js/module.rst b/tests/roots/test-domain-js/module.rst
new file mode 100644
index 0000000..1fe6a21
--- /dev/null
+++ b/tests/roots/test-domain-js/module.rst
@@ -0,0 +1,27 @@
+module
+=======
+
+.. js:module:: module_a.submodule
+
+* Link to :js:class:`ModTopLevel`
+
+.. js:class:: ModTopLevel
+
+ * Link to :js:meth:`mod_child_1`
+ * Link to :js:meth:`ModTopLevel.mod_child_1`
+
+.. js:method:: ModTopLevel.mod_child_1
+
+ * Link to :js:meth:`mod_child_2`
+
+.. js:method:: ModTopLevel.mod_child_2
+
+ * Link to :js:meth:`module_a.submodule.ModTopLevel.mod_child_1`
+
+.. js:module:: module_b.submodule
+
+* Link to :js:class:`ModTopLevel`
+
+.. js:class:: ModTopLevel
+
+ * Link to :js:mod:`module_a.submodule`
diff --git a/tests/roots/test-domain-js/roles.rst b/tests/roots/test-domain-js/roles.rst
new file mode 100644
index 0000000..4b6acf1
--- /dev/null
+++ b/tests/roots/test-domain-js/roles.rst
@@ -0,0 +1,48 @@
+roles
+=====
+
+.. js:class:: TopLevel
+
+.. js:function:: top_level
+
+* :js:class:`TopLevel`
+* :js:func:`top_level`
+
+
+.. js:class:: NestedParentA
+
+ * Link to :js:func:`child_1`
+
+ .. js:function:: child_1()
+
+ * Link to :js:func:`NestedChildA.subchild_2`
+ * Link to :js:func:`child_2`
+ * Link to :any:`any_child`
+
+ .. js:function:: any_child()
+
+ * Link to :js:class:`NestedChildA`
+
+ .. js:class:: NestedChildA
+
+ .. js:function:: subchild_1()
+
+ * Link to :js:func:`subchild_2`
+
+ .. js:function:: subchild_2()
+
+ Link to :js:func:`NestedParentA.child_1`
+
+ .. js:function:: child_2()
+
+ Link to :js:func:`NestedChildA.subchild_1`
+
+.. js:class:: NestedParentB
+
+ * Link to :js:func:`child_1`
+
+ .. js:function:: child_1()
+
+ * Link to :js:class:`NestedParentB`
+
+* :js:class:`NestedParentA.NestedChildA`
diff --git a/tests/roots/test-domain-py-python_maximum_signature_line_length/conf.py b/tests/roots/test-domain-py-python_maximum_signature_line_length/conf.py
new file mode 100644
index 0000000..45f620d
--- /dev/null
+++ b/tests/roots/test-domain-py-python_maximum_signature_line_length/conf.py
@@ -0,0 +1 @@
+python_maximum_signature_line_length = 1
diff --git a/tests/roots/test-domain-py-python_maximum_signature_line_length/index.rst b/tests/roots/test-domain-py-python_maximum_signature_line_length/index.rst
new file mode 100644
index 0000000..75e4683
--- /dev/null
+++ b/tests/roots/test-domain-py-python_maximum_signature_line_length/index.rst
@@ -0,0 +1,6 @@
+domain-py-maximum_signature_line_length
+=======================================
+
+.. py:function:: hello(name: str) -> str
+
+.. py:function:: foo([a, [b, ]]c, d[, e, f])
diff --git a/tests/roots/test-domain-py-python_use_unqualified_type_names/conf.py b/tests/roots/test-domain-py-python_use_unqualified_type_names/conf.py
new file mode 100644
index 0000000..c81bfe4
--- /dev/null
+++ b/tests/roots/test-domain-py-python_use_unqualified_type_names/conf.py
@@ -0,0 +1 @@
+python_use_unqualified_type_names = True
diff --git a/tests/roots/test-domain-py-python_use_unqualified_type_names/index.rst b/tests/roots/test-domain-py-python_use_unqualified_type_names/index.rst
new file mode 100644
index 0000000..a6850a0
--- /dev/null
+++ b/tests/roots/test-domain-py-python_use_unqualified_type_names/index.rst
@@ -0,0 +1,12 @@
+domain-py-smart_reference
+=========================
+
+.. py:class:: Name
+ :module: foo
+
+ :param name: blah blah
+ :type name: foo.Name
+ :param age: blah blah
+ :type age: foo.Age
+
+.. py:function:: hello(name: foo.Name, age: foo.Age)
diff --git a/tests/roots/test-domain-py-xref-warning/conf.py b/tests/roots/test-domain-py-xref-warning/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-domain-py-xref-warning/conf.py
diff --git a/tests/roots/test-domain-py-xref-warning/index.rst b/tests/roots/test-domain-py-xref-warning/index.rst
new file mode 100644
index 0000000..6f2cab7
--- /dev/null
+++ b/tests/roots/test-domain-py-xref-warning/index.rst
@@ -0,0 +1,7 @@
+test-domain-py-xref-warning
+===========================
+
+.. _existing-label:
+
+:ref:`no-label`
+:ref:`existing-label`
diff --git a/tests/roots/test-domain-py/abbr.rst b/tests/roots/test-domain-py/abbr.rst
new file mode 100644
index 0000000..67f1157
--- /dev/null
+++ b/tests/roots/test-domain-py/abbr.rst
@@ -0,0 +1,10 @@
+abbrev
+======
+
+.. currentmodule:: module_a.submodule
+
+* normal: :py:meth:`module_a.submodule.ModTopLevel.mod_child_1`
+* relative: :py:meth:`.ModTopLevel.mod_child_1`
+* short name: :py:meth:`~module_a.submodule.ModTopLevel.mod_child_1`
+* relative + short name: :py:meth:`~.ModTopLevel.mod_child_1`
+* short name + relative: :py:meth:`~.ModTopLevel.mod_child_1`
diff --git a/tests/roots/test-domain-py/canonical.rst b/tests/roots/test-domain-py/canonical.rst
new file mode 100644
index 0000000..34becfd
--- /dev/null
+++ b/tests/roots/test-domain-py/canonical.rst
@@ -0,0 +1,12 @@
+caninical
+=========
+
+:py:class:`.Foo`
+:any:`Foo`
+:any:`module.Foo`
+:any:`original.module.Foo`
+
+.. py:module:: canonical
+
+.. py:class:: Foo
+ :canonical: original.module.Foo
diff --git a/tests/roots/test-domain-py/conf.py b/tests/roots/test-domain-py/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-domain-py/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-domain-py/index.rst b/tests/roots/test-domain-py/index.rst
new file mode 100644
index 0000000..b24bbea
--- /dev/null
+++ b/tests/roots/test-domain-py/index.rst
@@ -0,0 +1,10 @@
+test-domain-py
+==============
+
+.. toctree::
+
+ roles
+ module
+ module_option
+ abbr
+ canonical
diff --git a/tests/roots/test-domain-py/module.rst b/tests/roots/test-domain-py/module.rst
new file mode 100644
index 0000000..4a28068
--- /dev/null
+++ b/tests/roots/test-domain-py/module.rst
@@ -0,0 +1,60 @@
+module
+======
+
+.. py:module:: module_a.submodule
+
+* Link to :py:class:`ModTopLevel`
+
+.. py:class:: ModTopLevel
+
+ * Link to :py:meth:`mod_child_1`
+ * Link to :py:meth:`ModTopLevel.mod_child_1`
+
+.. py:method:: ModTopLevel.mod_child_1
+
+ * Link to :py:meth:`mod_child_2`
+
+.. py:method:: ModTopLevel.mod_child_2
+
+ * Link to :py:meth:`module_a.submodule.ModTopLevel.mod_child_1`
+
+.. py:property:: ModTopLevel.prop
+
+ * Link to :py:attr:`prop attribute <.prop>`
+ * Link to :py:meth:`prop method <.prop>`
+
+.. py:currentmodule:: None
+
+.. py:class:: ModNoModule
+
+.. py:module:: module_b.submodule
+
+* Link to :py:class:`ModTopLevel`
+
+.. py:class:: ModTopLevel
+
+ * Link to :py:class:`ModNoModule`
+
+.. py:function:: foo(x, y)
+
+ :param x: param x
+ :type x: int
+ :param y: param y
+ :type y: tuple(str, float)
+ :rtype: list
+
+.. py:attribute:: attr1
+
+ :type: ModTopLevel
+
+.. py:attribute:: attr2
+
+ :type: :doc:`index`
+
+.. py:module:: exceptions
+
+.. py:exception:: Exception
+
+.. py:module:: object
+
+.. py:function:: sum()
diff --git a/tests/roots/test-domain-py/module_option.rst b/tests/roots/test-domain-py/module_option.rst
new file mode 100644
index 0000000..1dec2ce
--- /dev/null
+++ b/tests/roots/test-domain-py/module_option.rst
@@ -0,0 +1,25 @@
+module_option
+=============
+
+.. py:class:: B
+ :module: test.extra
+
+ This is also a test.
+
+
+ .. py:method:: B.baz()
+ :module: test.extra
+
+ Does something similar to :meth:`foo`.
+
+
+ .. py:method:: B.foo()
+ :module: test.extra
+
+ Does something.
+
+
+ .. py:method:: B.test()
+ :module: test.extra
+
+ Does something completely unrelated to :meth:`foo`
diff --git a/tests/roots/test-domain-py/roles.rst b/tests/roots/test-domain-py/roles.rst
new file mode 100644
index 0000000..6bff2d2
--- /dev/null
+++ b/tests/roots/test-domain-py/roles.rst
@@ -0,0 +1,48 @@
+roles
+=====
+
+.. py:class:: TopLevel
+
+.. py:method:: top_level
+
+* :py:class:`TopLevel`
+* :py:meth:`top_level`
+
+
+.. py:class:: NestedParentA
+
+ * Link to :py:meth:`child_1`
+
+ .. py:method:: child_1()
+
+ * Link to :py:meth:`NestedChildA.subchild_2`
+ * Link to :py:meth:`child_2`
+ * Link to :any:`any_child`
+
+ .. py:method:: any_child()
+
+ * Link to :py:class:`NestedChildA`
+
+ .. py:class:: NestedChildA
+
+ .. py:method:: subchild_1()
+
+ * Link to :py:meth:`subchild_2`
+
+ .. py:method:: subchild_2()
+
+ Link to :py:meth:`NestedParentA.child_1`
+
+ .. py:method:: child_2()
+
+ Link to :py:meth:`NestedChildA.subchild_1`
+
+.. py:class:: NestedParentB
+
+ * Link to :py:meth:`child_1`
+
+ .. py:method:: child_1()
+
+ * Link to :py:class:`NestedParentB`
+
+* :py:class:`NestedParentA.NestedChildA`
diff --git a/tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme1/theme.conf b/tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme1/theme.conf
new file mode 100644
index 0000000..89e03bb
--- /dev/null
+++ b/tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme1/theme.conf
@@ -0,0 +1,2 @@
+[theme]
+inherit = basic
diff --git a/tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme2/theme.conf b/tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme2/theme.conf
new file mode 100644
index 0000000..a68c018
--- /dev/null
+++ b/tests/roots/test-double-inheriting-theme/base_themes_dir/base_theme2/theme.conf
@@ -0,0 +1,2 @@
+[theme]
+inherit = base_theme1
diff --git a/tests/roots/test-double-inheriting-theme/conf.py b/tests/roots/test-double-inheriting-theme/conf.py
new file mode 100644
index 0000000..3667b02
--- /dev/null
+++ b/tests/roots/test-double-inheriting-theme/conf.py
@@ -0,0 +1,4 @@
+templates_path = ['_templates']
+html_theme = 'base_theme2'
+html_theme_path = ['base_themes_dir']
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-double-inheriting-theme/index.rst b/tests/roots/test-double-inheriting-theme/index.rst
new file mode 100644
index 0000000..e67f7ff
--- /dev/null
+++ b/tests/roots/test-double-inheriting-theme/index.rst
@@ -0,0 +1,3 @@
+============================
+Test double inheriting theme
+============================
diff --git a/tests/roots/test-environment-record-dependencies/api.rst b/tests/roots/test-environment-record-dependencies/api.rst
new file mode 100644
index 0000000..acfb896
--- /dev/null
+++ b/tests/roots/test-environment-record-dependencies/api.rst
@@ -0,0 +1,4 @@
+API
+===
+
+.. automodule:: example_module
diff --git a/tests/roots/test-environment-record-dependencies/conf.py b/tests/roots/test-environment-record-dependencies/conf.py
new file mode 100644
index 0000000..107480e
--- /dev/null
+++ b/tests/roots/test-environment-record-dependencies/conf.py
@@ -0,0 +1,5 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+extensions = ['sphinx.ext.autodoc']
diff --git a/tests/roots/test-environment-record-dependencies/example_module.py b/tests/roots/test-environment-record-dependencies/example_module.py
new file mode 100644
index 0000000..d12dc74
--- /dev/null
+++ b/tests/roots/test-environment-record-dependencies/example_module.py
@@ -0,0 +1,2 @@
+def example_function():
+ return 42
diff --git a/tests/roots/test-environment-record-dependencies/index.rst b/tests/roots/test-environment-record-dependencies/index.rst
new file mode 100644
index 0000000..21d88a0
--- /dev/null
+++ b/tests/roots/test-environment-record-dependencies/index.rst
@@ -0,0 +1,3 @@
+.. toctree::
+
+ api
diff --git a/tests/roots/test-epub-anchor-id/conf.py b/tests/roots/test-epub-anchor-id/conf.py
new file mode 100644
index 0000000..2a56f1f
--- /dev/null
+++ b/tests/roots/test-epub-anchor-id/conf.py
@@ -0,0 +1,2 @@
+def setup(app):
+ app.add_crossref_type(directivename="setting", rolename="setting")
diff --git a/tests/roots/test-epub-anchor-id/index.rst b/tests/roots/test-epub-anchor-id/index.rst
new file mode 100644
index 0000000..75e3c60
--- /dev/null
+++ b/tests/roots/test-epub-anchor-id/index.rst
@@ -0,0 +1,13 @@
+test-epub-anchor-id
+===================
+
+.. setting:: STATICFILES_FINDERS
+
+blah blah blah
+
+.. setting:: STATICFILES_SECTION
+
+blah blah blah
+==============
+
+see :setting:`STATICFILES_FINDERS`
diff --git a/tests/roots/test-ext-autodoc/autodoc_dummy_bar.py b/tests/roots/test-ext-autodoc/autodoc_dummy_bar.py
new file mode 100644
index 0000000..3b5bbfd
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/autodoc_dummy_bar.py
@@ -0,0 +1,6 @@
+from bug2437.autodoc_dummy_foo import Foo
+
+
+class Bar:
+ """Dummy class Bar with alias."""
+ my_name = Foo
diff --git a/tests/roots/test-ext-autodoc/autodoc_dummy_module.py b/tests/roots/test-ext-autodoc/autodoc_dummy_module.py
new file mode 100644
index 0000000..c05d96e
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/autodoc_dummy_module.py
@@ -0,0 +1,6 @@
+from dummy import *
+
+
+def test():
+ """Dummy function using dummy.*"""
+ dummy_function()
diff --git a/tests/roots/test-ext-autodoc/bug2437/__init__.py b/tests/roots/test-ext-autodoc/bug2437/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/bug2437/__init__.py
diff --git a/tests/roots/test-ext-autodoc/bug2437/autodoc_dummy_foo.py b/tests/roots/test-ext-autodoc/bug2437/autodoc_dummy_foo.py
new file mode 100644
index 0000000..9c954d8
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/bug2437/autodoc_dummy_foo.py
@@ -0,0 +1,3 @@
+class Foo:
+ """Dummy class Foo."""
+ pass
diff --git a/tests/roots/test-ext-autodoc/circular_import/__init__.py b/tests/roots/test-ext-autodoc/circular_import/__init__.py
new file mode 100644
index 0000000..402678d
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/circular_import/__init__.py
@@ -0,0 +1 @@
+from circular_import.c import SomeClass
diff --git a/tests/roots/test-ext-autodoc/circular_import/a.py b/tests/roots/test-ext-autodoc/circular_import/a.py
new file mode 100644
index 0000000..97ad9d8
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/circular_import/a.py
@@ -0,0 +1 @@
+X = 42
diff --git a/tests/roots/test-ext-autodoc/circular_import/b.py b/tests/roots/test-ext-autodoc/circular_import/b.py
new file mode 100644
index 0000000..c9b8ad5
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/circular_import/b.py
@@ -0,0 +1,4 @@
+import typing
+
+if typing.TYPE_CHECKING:
+ from circular_import import SomeClass
diff --git a/tests/roots/test-ext-autodoc/circular_import/c.py b/tests/roots/test-ext-autodoc/circular_import/c.py
new file mode 100644
index 0000000..0a8829e
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/circular_import/c.py
@@ -0,0 +1,6 @@
+import circular_import.a
+import circular_import.b
+
+
+class SomeClass:
+ X = circular_import.a.X
diff --git a/tests/roots/test-ext-autodoc/conf.py b/tests/roots/test-ext-autodoc/conf.py
new file mode 100644
index 0000000..979a709
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/conf.py
@@ -0,0 +1,15 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autodoc']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+autodoc_mock_imports = [
+ 'dummy'
+]
+
+nitpicky = True
diff --git a/tests/roots/test-ext-autodoc/index.rst b/tests/roots/test-ext-autodoc/index.rst
new file mode 100644
index 0000000..eb10829
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/index.rst
@@ -0,0 +1,15 @@
+
+.. automodule:: autodoc_dummy_module
+ :members:
+
+.. automodule:: bug2437.autodoc_dummy_foo
+ :members:
+
+.. automodule:: autodoc_dummy_bar
+ :members:
+
+.. autofunction:: target.typehints.incr
+
+.. autofunction:: target.overload.sum
+
+.. autofunction:: target.typehints.tuple_args
diff --git a/tests/roots/test-ext-autodoc/target/TYPE_CHECKING.py b/tests/roots/test-ext-autodoc/target/TYPE_CHECKING.py
new file mode 100644
index 0000000..85aea3a
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/TYPE_CHECKING.py
@@ -0,0 +1,16 @@
+from __future__ import annotations
+
+from gettext import NullTranslations
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+ from collections.abc import Iterable
+ from io import StringIO
+
+
+class Foo:
+ attr1: StringIO
+
+
+def spam(ham: Iterable[str]) -> tuple[NullTranslations, bool]:
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/__init__.py b/tests/roots/test-ext-autodoc/target/__init__.py
new file mode 100644
index 0000000..d7ee4ac
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/__init__.py
@@ -0,0 +1,204 @@
+import enum
+from io import StringIO
+
+from ._functions_to_import import function_to_be_imported
+
+__all__ = ['Class']
+
+#: documentation for the integer
+integer = 1
+
+
+def raises(exc, func, *args, **kwds):
+ """Raise AssertionError if ``func(*args, **kwds)`` does not raise *exc*."""
+ pass
+
+
+class CustomEx(Exception):
+ """My custom exception."""
+
+ def f(self):
+ """Exception method."""
+
+
+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
+ from functools import partial
+ function = partial(template, b=b, c=c, d=d)
+ function.__name__ = name
+ function.__doc__ = docstring
+ return classmethod(function)
+
+
+class Class:
+ """Class to document."""
+
+ def meth(self):
+ """Function."""
+
+ def undocmeth(self):
+ pass
+
+ def skipmeth(self):
+ """Method that should be skipped."""
+
+ def excludemeth(self):
+ """Method that should be excluded."""
+
+ # should not be documented
+ skipattr = 'foo'
+
+ #: should be documented -- süß
+ attr = 'bar'
+
+ docattr = 'baz'
+ """should likewise be documented -- süß"""
+
+ udocattr = 'quux'
+ """should be documented as well - süß"""
+
+ # initialized to any class imported from another module
+ 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
+ """a documented instance attribute"""
+ self._private_inst_attr = None #: a private instance attribute
+
+ def __special1__(self):
+ """documented special method"""
+
+ def __special2__(self):
+ # undocumented special method
+ pass
+
+
+class CustomDict(dict):
+ """Docstring."""
+
+
+def function(foo, *args, **kwds):
+ """
+ Return spam.
+ """
+ pass
+
+
+class Outer:
+ """Foo"""
+
+ class Inner:
+ """Foo"""
+
+ def meth(self):
+ """Foo"""
+
+ # should be documented as an alias
+ factory = dict
+
+
+class InnerChild(Outer.Inner):
+ """InnerChild docstring"""
+
+
+class DocstringSig:
+ def __new__(cls, *new_args, **new_kwargs):
+ """__new__(cls, d, e=1) -> DocstringSig
+First line of docstring
+
+ rest of docstring
+ """
+
+ def __init__(self, *init_args, **init_kwargs):
+ """__init__(self, a, b=1) -> None
+First line of docstring
+
+ rest of docstring
+ """
+
+ def meth(self):
+ """meth(FOO, BAR=1) -> BAZ
+First line of docstring
+
+ rest of docstring
+ """
+
+ def meth2(self):
+ """First line, no signature
+ Second line followed by indentation::
+
+ indented line
+ """
+
+ @property
+ def prop1(self):
+ """DocstringSig.prop1(self)
+ First line of docstring
+ """
+ return 123
+
+ @property
+ def prop2(self):
+ """First line of docstring
+ Second line of docstring
+ """
+ return 456
+
+
+class StrRepr(str):
+ """docstring"""
+
+ def __repr__(self):
+ return self
+
+
+class AttCls:
+ a1 = StrRepr('hello\nworld')
+ a2 = None
+
+
+class InstAttCls:
+ """Class with documented class and instance attributes."""
+
+ #: Doc comment for class attribute InstAttCls.ca1.
+ #: It can have multiple lines.
+ ca1 = 'a'
+
+ ca2 = 'b' #: Doc comment for InstAttCls.ca2. One line only.
+
+ ca3 = 'c'
+ """Docstring for class attribute InstAttCls.ca3."""
+
+ def __init__(self):
+ #: Doc comment for instance attribute InstAttCls.ia1
+ self.ia1 = 'd'
+
+ self.ia2 = 'e'
+ """Docstring for instance attribute InstAttCls.ia2."""
+
+
+class CustomIter:
+ def __init__(self):
+ """Create a new `CustomIter`."""
+ self.values = range(10)
+
+ def __iter__(self):
+ """Iterate squares of each value."""
+ for i in self.values:
+ yield i ** 2
+
+ def snafucate(self):
+ """Makes this snafucated."""
+ print("snafucated")
diff --git a/tests/roots/test-ext-autodoc/target/_functions_to_import.py b/tests/roots/test-ext-autodoc/target/_functions_to_import.py
new file mode 100644
index 0000000..7663e97
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/_functions_to_import.py
@@ -0,0 +1,8 @@
+from typing import TYPE_CHECKING, Optional
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+
+def function_to_be_imported(app: Optional["Sphinx"]) -> str:
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/abstractmethods.py b/tests/roots/test-ext-autodoc/target/abstractmethods.py
new file mode 100644
index 0000000..a4396d5
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/abstractmethods.py
@@ -0,0 +1,29 @@
+from abc import abstractmethod
+
+
+class Base():
+ def meth(self):
+ pass
+
+ @abstractmethod
+ def abstractmeth(self):
+ pass
+
+ @staticmethod
+ @abstractmethod
+ def staticmeth():
+ pass
+
+ @classmethod
+ @abstractmethod
+ def classmeth(cls):
+ pass
+
+ @property
+ @abstractmethod
+ def prop(self):
+ pass
+
+ @abstractmethod
+ async def coroutinemeth(self):
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/annotated.py b/tests/roots/test-ext-autodoc/target/annotated.py
new file mode 100644
index 0000000..5b87518
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/annotated.py
@@ -0,0 +1,8 @@
+from __future__ import annotations
+
+from typing import Annotated
+
+
+def hello(name: Annotated[str, "attribute"]) -> None:
+ """docstring"""
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/autoclass_content.py b/tests/roots/test-ext-autodoc/target/autoclass_content.py
new file mode 100644
index 0000000..52b9806
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/autoclass_content.py
@@ -0,0 +1,47 @@
+class A:
+ """A class having no __init__, no __new__"""
+
+
+class B:
+ """A class having __init__(no docstring), no __new__"""
+ def __init__(self):
+ pass
+
+
+class C:
+ """A class having __init__, no __new__"""
+ def __init__(self):
+ """__init__ docstring"""
+
+
+class D:
+ """A class having no __init__, __new__(no docstring)"""
+ def __new__(cls):
+ pass
+
+
+class E:
+ """A class having no __init__, __new__"""
+ def __new__(cls):
+ """__new__ docstring"""
+
+
+class F:
+ """A class having both __init__ and __new__"""
+ def __init__(self):
+ """__init__ docstring"""
+
+ def __new__(cls):
+ """__new__ docstring"""
+
+
+class G(C):
+ """A class inherits __init__ without docstring."""
+ def __init__(self):
+ pass
+
+
+class H(E):
+ """A class inherits __new__ without docstring."""
+ def __init__(self):
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/autodoc_type_aliases.py b/tests/roots/test-ext-autodoc/target/autodoc_type_aliases.py
new file mode 100644
index 0000000..f2c07a0
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/autodoc_type_aliases.py
@@ -0,0 +1,49 @@
+from __future__ import annotations
+
+import io
+from typing import Optional, overload
+
+myint = int
+
+#: docstring
+variable: myint
+
+#: docstring
+variable2 = None # type: myint
+
+#: docstring
+variable3: Optional[myint]
+
+
+def read(r: io.BytesIO) -> io.StringIO:
+ """docstring"""
+
+
+def sum(x: myint, y: myint) -> myint:
+ """docstring"""
+ return x + y
+
+
+@overload
+def mult(x: myint, y: myint) -> myint:
+ ...
+
+
+@overload
+def mult(x: float, y: float) -> float:
+ ...
+
+
+def mult(x, y):
+ """docstring"""
+ return x, y
+
+
+class Foo:
+ """docstring"""
+
+ #: docstring
+ attr1: myint
+
+ def __init__(self):
+ self.attr2: myint = None #: docstring
diff --git a/tests/roots/test-ext-autodoc/target/bound_method.py b/tests/roots/test-ext-autodoc/target/bound_method.py
new file mode 100644
index 0000000..d48b9ee
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/bound_method.py
@@ -0,0 +1,7 @@
+class Cls:
+ def method(self):
+ """Method docstring"""
+ pass
+
+
+bound_method = Cls().method
diff --git a/tests/roots/test-ext-autodoc/target/cached_property.py b/tests/roots/test-ext-autodoc/target/cached_property.py
new file mode 100644
index 0000000..712d1d9
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/cached_property.py
@@ -0,0 +1,12 @@
+from functools import cached_property
+
+
+class Foo:
+ @cached_property
+ def prop(self) -> int:
+ return 1
+
+ @cached_property
+ def prop_with_type_comment(self):
+ # type: () -> int
+ return 1
diff --git a/tests/roots/test-ext-autodoc/target/callable.py b/tests/roots/test-ext-autodoc/target/callable.py
new file mode 100644
index 0000000..6fcd505
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/callable.py
@@ -0,0 +1,13 @@
+class Callable():
+ """A callable object that behaves like a function."""
+
+ def __call__(self, arg1, arg2, **kwargs):
+ pass
+
+ def method(self, arg1, arg2):
+ """docstring of Callable.method()."""
+ pass
+
+
+function = Callable()
+method = function.method
diff --git a/tests/roots/test-ext-autodoc/target/canonical/__init__.py b/tests/roots/test-ext-autodoc/target/canonical/__init__.py
new file mode 100644
index 0000000..4ca2b33
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/canonical/__init__.py
@@ -0,0 +1 @@
+from target.canonical.original import Bar, Foo
diff --git a/tests/roots/test-ext-autodoc/target/canonical/original.py b/tests/roots/test-ext-autodoc/target/canonical/original.py
new file mode 100644
index 0000000..42049b2
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/canonical/original.py
@@ -0,0 +1,15 @@
+class Foo:
+ """docstring"""
+
+ def meth(self):
+ """docstring"""
+
+
+def bar():
+ class Bar:
+ """docstring"""
+
+ return Bar
+
+
+Bar = bar()
diff --git a/tests/roots/test-ext-autodoc/target/classes.py b/tests/roots/test-ext-autodoc/target/classes.py
new file mode 100644
index 0000000..e5cce7a
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/classes.py
@@ -0,0 +1,44 @@
+from __future__ import annotations
+
+from inspect import Parameter, Signature
+from typing import List, Union
+
+
+class Foo:
+ pass
+
+
+class Bar:
+ def __init__(self, x, y):
+ pass
+
+
+class Baz:
+ def __new__(cls, x, y):
+ pass
+
+
+class Qux:
+ __signature__ = Signature(parameters=[Parameter('foo', Parameter.POSITIONAL_OR_KEYWORD),
+ Parameter('bar', Parameter.POSITIONAL_OR_KEYWORD)])
+
+ def __init__(self, x, y):
+ pass
+
+
+class Quux(List[Union[int, float]]):
+ """A subclass of List[Union[int, float]]"""
+ pass
+
+
+class Corge(Quux):
+ pass
+
+
+Alias = Foo
+
+#: docstring
+OtherAlias = Bar
+
+#: docstring
+IntAlias = int
diff --git a/tests/roots/test-ext-autodoc/target/coroutine.py b/tests/roots/test-ext-autodoc/target/coroutine.py
new file mode 100644
index 0000000..f977b6e
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/coroutine.py
@@ -0,0 +1,37 @@
+import asyncio
+from functools import wraps
+
+
+class AsyncClass:
+ async def do_coroutine(self):
+ """A documented coroutine function"""
+ attr_coro_result = await _other_coro_func()
+
+ @classmethod
+ async def do_coroutine2(cls):
+ """A documented coroutine classmethod"""
+ pass
+
+ @staticmethod
+ async def do_coroutine3():
+ """A documented coroutine staticmethod"""
+ pass
+
+ async def do_asyncgen(self):
+ """A documented async generator"""
+ yield
+
+
+async def _other_coro_func():
+ return "run"
+
+
+def myawait(f):
+ @wraps(f)
+ def wrapper(*args, **kwargs):
+ awaitable = f(*args, **kwargs)
+ return asyncio.run(awaitable)
+ return wrapper
+
+
+sync_func = myawait(_other_coro_func)
diff --git a/tests/roots/test-ext-autodoc/target/cython.pyx b/tests/roots/test-ext-autodoc/target/cython.pyx
new file mode 100644
index 0000000..5d0329a
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/cython.pyx
@@ -0,0 +1,13 @@
+# cython: binding=True
+# cython: language_level=3str
+
+def foo(x: int, *args, y: str, **kwargs):
+ """Docstring."""
+
+
+class Class:
+ """Docstring."""
+
+ def meth(self, name: str, age: int = 0) -> None:
+ """Docstring."""
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/decorator.py b/tests/roots/test-ext-autodoc/target/decorator.py
new file mode 100644
index 0000000..faad3ff
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/decorator.py
@@ -0,0 +1,53 @@
+from functools import wraps
+
+
+def deco1(func):
+ """docstring for deco1"""
+ @wraps(func)
+ def wrapper():
+ return func()
+
+ return wrapper
+
+
+def deco2(condition, message):
+ """docstring for deco2"""
+ def decorator(func):
+ def wrapper():
+ return func()
+
+ return wrapper
+ return decorator
+
+
+@deco1
+def foo(name=None, age=None):
+ pass
+
+
+class Bar:
+ @deco1
+ def meth(self, name=None, age=None):
+ pass
+
+
+class Baz:
+ @deco1
+ def __init__(self, name=None, age=None):
+ pass
+
+
+class Qux:
+ @deco1
+ def __new__(self, name=None, age=None):
+ pass
+
+
+class _Metaclass(type):
+ @deco1
+ def __call__(self, name=None, age=None):
+ pass
+
+
+class Quux(metaclass=_Metaclass):
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/descriptor.py b/tests/roots/test-ext-autodoc/target/descriptor.py
new file mode 100644
index 0000000..2857c99
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/descriptor.py
@@ -0,0 +1,31 @@
+class CustomDataDescriptor:
+ """Descriptor class docstring."""
+
+ def __init__(self, doc):
+ self.__doc__ = doc
+
+ def __get__(self, obj, type=None):
+ if obj is None:
+ return self
+ return 42
+
+ def meth(self):
+ """Function."""
+ return "The Answer"
+
+
+class CustomDataDescriptorMeta(type):
+ """Descriptor metaclass docstring."""
+
+
+class CustomDataDescriptor2(CustomDataDescriptor):
+ """Descriptor class with custom metaclass docstring."""
+ __metaclass__ = CustomDataDescriptorMeta
+
+
+class Class:
+ descr = CustomDataDescriptor("Descriptor instance docstring.")
+
+ @property
+ def prop(self):
+ """Property."""
diff --git a/tests/roots/test-ext-autodoc/target/docstring_signature.py b/tests/roots/test-ext-autodoc/target/docstring_signature.py
new file mode 100644
index 0000000..981d936
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/docstring_signature.py
@@ -0,0 +1,33 @@
+class A:
+ """A(foo, bar)"""
+
+
+class B:
+ """B(foo, bar)"""
+ def __init__(self):
+ """B(foo, bar, baz)"""
+
+
+class C:
+ """C(foo, bar)"""
+ def __new__(cls):
+ """C(foo, bar, baz)"""
+
+
+class D:
+ def __init__(self):
+ """D(foo, bar, baz)"""
+
+
+class E:
+ def __init__(self):
+ """E(foo: int, bar: int, baz: int) -> None \\
+ E(foo: str, bar: str, baz: str) -> None \\
+ E(foo: float, bar: float, baz: float)"""
+
+
+class F:
+ def __init__(self):
+ """F(foo: int, bar: int, baz: int) -> None
+ F(foo: str, bar: str, baz: str) -> None
+ F(foo: float, bar: float, baz: float)"""
diff --git a/tests/roots/test-ext-autodoc/target/empty_all.py b/tests/roots/test-ext-autodoc/target/empty_all.py
new file mode 100644
index 0000000..c094cff
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/empty_all.py
@@ -0,0 +1,16 @@
+"""
+docsting of empty_all module.
+"""
+__all__ = []
+
+
+def foo():
+ """docstring"""
+
+
+def bar():
+ """docstring"""
+
+
+def baz():
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/enums.py b/tests/roots/test-ext-autodoc/target/enums.py
new file mode 100644
index 0000000..c69455f
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/enums.py
@@ -0,0 +1,23 @@
+import enum
+
+
+class EnumCls(enum.Enum):
+ """
+ this is enum class
+ """
+
+ #: doc for val1
+ val1 = 12
+ val2 = 23 #: doc for val2
+ val3 = 34
+ """doc for val3"""
+ val4 = 34
+
+ def say_hello(self):
+ """a method says hello to you."""
+ pass
+
+ @classmethod
+ def say_goodbye(cls):
+ """a classmethod says good-bye to you."""
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/final.py b/tests/roots/test-ext-autodoc/target/final.py
new file mode 100644
index 0000000..a8c3860
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/final.py
@@ -0,0 +1,16 @@
+from __future__ import annotations
+
+import typing
+from typing import final
+
+
+@typing.final
+class Class:
+ """docstring"""
+
+ @final
+ def meth1(self):
+ """docstring"""
+
+ def meth2(self):
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/functions.py b/tests/roots/test-ext-autodoc/target/functions.py
new file mode 100644
index 0000000..b62aa70
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/functions.py
@@ -0,0 +1,19 @@
+from functools import partial
+
+
+def func():
+ pass
+
+
+async def coroutinefunc():
+ pass
+
+
+async def asyncgenerator():
+ yield
+
+partial_func = partial(func)
+partial_coroutinefunc = partial(coroutinefunc)
+
+builtin_func = print
+partial_builtin_func = partial(print)
diff --git a/tests/roots/test-ext-autodoc/target/generic_class.py b/tests/roots/test-ext-autodoc/target/generic_class.py
new file mode 100644
index 0000000..1ec8058
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/generic_class.py
@@ -0,0 +1,13 @@
+from __future__ import annotations
+
+from typing import Generic, TypeVar
+
+T = TypeVar('T')
+
+
+# Test that typing.Generic's __new__ method does not mask our class'
+# __init__ signature.
+class A(Generic[T]):
+ """docstring for A"""
+ def __init__(self, a, b=None):
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/genericalias.py b/tests/roots/test-ext-autodoc/target/genericalias.py
new file mode 100644
index 0000000..06026fb
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/genericalias.py
@@ -0,0 +1,16 @@
+from __future__ import annotations
+
+from typing import Callable, List
+
+#: A list of int
+T = List[int]
+
+C = Callable[[int], None] # a generic alias not having a doccomment
+
+
+class Class:
+ #: A list of int
+ T = List[int]
+
+#: A list of Class
+L = List[Class]
diff --git a/tests/roots/test-ext-autodoc/target/hide_value.py b/tests/roots/test-ext-autodoc/target/hide_value.py
new file mode 100644
index 0000000..1d53aab
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/hide_value.py
@@ -0,0 +1,19 @@
+#: docstring
+#:
+#: :meta hide-value:
+SENTINEL1 = object()
+
+#: :meta hide-value:
+SENTINEL2 = object()
+
+
+class Foo:
+ """docstring"""
+
+ #: docstring
+ #:
+ #: :meta hide-value:
+ SENTINEL1 = object()
+
+ #: :meta hide-value:
+ SENTINEL2 = object()
diff --git a/tests/roots/test-ext-autodoc/target/imported_members.py b/tests/roots/test-ext-autodoc/target/imported_members.py
new file mode 100644
index 0000000..ee6e5b3
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/imported_members.py
@@ -0,0 +1 @@
+from .partialfunction import func2, func3
diff --git a/tests/roots/test-ext-autodoc/target/inheritance.py b/tests/roots/test-ext-autodoc/target/inheritance.py
new file mode 100644
index 0000000..e06f7a8
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/inheritance.py
@@ -0,0 +1,25 @@
+class Base:
+ #: docstring
+ inheritedattr = None
+
+ def inheritedmeth(self):
+ """Inherited function."""
+
+ @classmethod
+ def inheritedclassmeth(cls):
+ """Inherited class method."""
+
+ @staticmethod
+ def inheritedstaticmeth(cls):
+ """Inherited static method."""
+
+
+class Derived(Base):
+ def inheritedmeth(self):
+ # no docstring here
+ pass
+
+
+class MyList(list):
+ def meth(self):
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/instance_variable.py b/tests/roots/test-ext-autodoc/target/instance_variable.py
new file mode 100644
index 0000000..1d393bc
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/instance_variable.py
@@ -0,0 +1,11 @@
+class Foo:
+ def __init__(self):
+ self.attr1 = None #: docstring foo
+ self.attr2 = None #: docstring foo
+
+
+class Bar(Foo):
+ def __init__(self):
+ self.attr2 = None #: docstring bar
+ self.attr3 = None #: docstring bar
+ self.attr4 = None
diff --git a/tests/roots/test-ext-autodoc/target/literal.py b/tests/roots/test-ext-autodoc/target/literal.py
new file mode 100644
index 0000000..4340e51
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/literal.py
@@ -0,0 +1,24 @@
+from __future__ import annotations
+
+from enum import Enum
+from typing import Literal, TypeVar
+
+
+class MyEnum(Enum):
+ a = 1
+
+
+T = TypeVar('T', bound=Literal[1234])
+"""docstring"""
+
+
+U = TypeVar('U', bound=Literal[MyEnum.a])
+"""docstring"""
+
+
+def bar(x: Literal[1234]):
+ """docstring"""
+
+
+def foo(x: Literal[MyEnum.a]):
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/metadata.py b/tests/roots/test-ext-autodoc/target/metadata.py
new file mode 100644
index 0000000..7a4488f
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/metadata.py
@@ -0,0 +1,2 @@
+def foo():
+ """:meta metadata-only-docstring:"""
diff --git a/tests/roots/test-ext-autodoc/target/methods.py b/tests/roots/test-ext-autodoc/target/methods.py
new file mode 100644
index 0000000..ad5a6a9
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/methods.py
@@ -0,0 +1,29 @@
+from functools import partialmethod
+
+
+class Base():
+ def meth(self):
+ pass
+
+ @staticmethod
+ def staticmeth():
+ pass
+
+ @classmethod
+ def classmeth(cls):
+ pass
+
+ @property
+ def prop(self):
+ pass
+
+ partialmeth = partialmethod(meth)
+
+ async def coroutinemeth(self):
+ pass
+
+ partial_coroutinemeth = partialmethod(coroutinemeth)
+
+
+class Inherited(Base):
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/module.py b/tests/roots/test-ext-autodoc/target/module.py
new file mode 100644
index 0000000..fe3b490
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/module.py
@@ -0,0 +1,14 @@
+undocumented = 1
+
+#: docstring
+documented = 1
+
+undoc_annotated: int
+
+#: docstring
+annotated: int
+
+__special__ = 1
+
+#: docstring
+__documented_special__ = 1
diff --git a/tests/roots/test-ext-autodoc/target/name_conflict/__init__.py b/tests/roots/test-ext-autodoc/target/name_conflict/__init__.py
new file mode 100644
index 0000000..0a6f496
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/name_conflict/__init__.py
@@ -0,0 +1,6 @@
+from .foo import bar
+
+
+class foo:
+ """docstring of target.name_conflict::foo."""
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/name_conflict/foo.py b/tests/roots/test-ext-autodoc/target/name_conflict/foo.py
new file mode 100644
index 0000000..bb83ca0
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/name_conflict/foo.py
@@ -0,0 +1,2 @@
+class bar:
+ """docstring of target.name_conflict.foo::bar."""
diff --git a/tests/roots/test-ext-autodoc/target/name_mangling.py b/tests/roots/test-ext-autodoc/target/name_mangling.py
new file mode 100644
index 0000000..269b51d
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/name_mangling.py
@@ -0,0 +1,11 @@
+class Foo:
+ #: name of Foo
+ __name = None
+ __age = None
+
+
+class Bar(Foo):
+ __address = None
+
+ #: a member having mangled-like name
+ _Baz__email = None
diff --git a/tests/roots/test-ext-autodoc/target/need_mocks.py b/tests/roots/test-ext-autodoc/target/need_mocks.py
new file mode 100644
index 0000000..881220b
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/need_mocks.py
@@ -0,0 +1,42 @@
+import missing_module
+import missing_package1.missing_module1
+from missing_module import missing_name
+from missing_package2 import missing_module2
+from missing_package3.missing_module3 import missing_name
+
+import sphinx.missing_module4
+from sphinx.missing_module4 import missing_name2
+
+
+@missing_name(int)
+def decoratedFunction():
+ """decoratedFunction docstring"""
+ return None
+
+
+def func(arg: missing_module.Class):
+ """a function takes mocked object as an argument"""
+ pass
+
+
+class TestAutodoc:
+ """TestAutodoc docstring."""
+
+ #: docstring
+ Alias = missing_module2.Class
+
+ @missing_name
+ def decoratedMethod(self):
+ """TestAutodoc::decoratedMethod docstring"""
+ return None
+
+
+class Inherited(missing_module.Class):
+ """docstring"""
+ pass
+
+
+sphinx.missing_module4.missing_function(len(missing_name2))
+
+#: docstring
+Alias = missing_module2.Class
diff --git a/tests/roots/test-ext-autodoc/target/overload.py b/tests/roots/test-ext-autodoc/target/overload.py
new file mode 100644
index 0000000..4bcb6ea
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/overload.py
@@ -0,0 +1,90 @@
+from __future__ import annotations
+
+from typing import Any, overload
+
+
+@overload
+def sum(x: int, y: int = 0) -> int:
+ ...
+
+
+@overload
+def sum(x: float, y: float = 0.0) -> float:
+ ...
+
+
+@overload
+def sum(x: str, y: str = ...) -> str:
+ ...
+
+
+def sum(x, y=None):
+ """docstring"""
+ return x + y
+
+
+class Math:
+ """docstring"""
+
+ @overload
+ def sum(self, x: int, y: int = 0) -> int:
+ ...
+
+ @overload
+ def sum(self, x: float, y: float = 0.0) -> float:
+ ...
+
+ @overload
+ def sum(self, x: str, y: str = ...) -> str:
+ ...
+
+ def sum(self, x, y=None):
+ """docstring"""
+ return x + y
+
+
+class Foo:
+ """docstring"""
+
+ @overload
+ def __new__(cls, x: int, y: int) -> Foo:
+ ...
+
+ @overload
+ def __new__(cls, x: str, y: str) -> Foo:
+ ...
+
+ def __new__(cls, x, y):
+ pass
+
+
+class Bar:
+ """docstring"""
+
+ @overload
+ def __init__(cls, x: int, y: int) -> None:
+ ...
+
+ @overload
+ def __init__(cls, x: str, y: str) -> None:
+ ...
+
+ def __init__(cls, x, y):
+ pass
+
+
+class Meta(type):
+ @overload
+ def __call__(cls, x: int, y: int) -> Any:
+ ...
+
+ @overload
+ def __call__(cls, x: str, y: str) -> Any:
+ ...
+
+ def __call__(cls, x, y):
+ pass
+
+
+class Baz(metaclass=Meta):
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/overload2.py b/tests/roots/test-ext-autodoc/target/overload2.py
new file mode 100644
index 0000000..e901f79
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/overload2.py
@@ -0,0 +1,5 @@
+from target.overload import Bar
+
+
+class Baz(Bar):
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/partialfunction.py b/tests/roots/test-ext-autodoc/target/partialfunction.py
new file mode 100644
index 0000000..3be63ee
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/partialfunction.py
@@ -0,0 +1,12 @@
+from functools import partial
+
+
+def func1(a, b, c):
+ """docstring of func1"""
+ pass
+
+
+func2 = partial(func1, 1)
+func3 = partial(func2, 2)
+func3.__doc__ = "docstring of func3"
+func4 = partial(func3, 3)
diff --git a/tests/roots/test-ext-autodoc/target/partialmethod.py b/tests/roots/test-ext-autodoc/target/partialmethod.py
new file mode 100644
index 0000000..20d75e9
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/partialmethod.py
@@ -0,0 +1,17 @@
+from functools import partialmethod
+
+
+class Cell:
+ """An example for partialmethod.
+
+ refs: https://docs.python.jp/3/library/functools.html#functools.partialmethod
+ """
+
+ def set_state(self, state):
+ """Update state of cell to *state*."""
+
+ #: Make a cell alive.
+ set_alive = partialmethod(set_state, True)
+
+ # a partialmethod with no docstring
+ set_dead = partialmethod(set_state, False)
diff --git a/tests/roots/test-ext-autodoc/target/pep570.py b/tests/roots/test-ext-autodoc/target/pep570.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/pep570.py
diff --git a/tests/roots/test-ext-autodoc/target/pep604.py b/tests/roots/test-ext-autodoc/target/pep604.py
new file mode 100644
index 0000000..9b1f94a
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/pep604.py
@@ -0,0 +1,16 @@
+from __future__ import annotations
+
+attr: int | str #: docstring
+
+
+def sum(x: int | str, y: int | str) -> int | str:
+ """docstring"""
+
+
+class Foo:
+ """docstring"""
+
+ attr: int | str #: docstring
+
+ def meth(self, x: int | str, y: int | str) -> int | str:
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/preserve_defaults.py b/tests/roots/test-ext-autodoc/target/preserve_defaults.py
new file mode 100644
index 0000000..86e1038
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/preserve_defaults.py
@@ -0,0 +1,60 @@
+from __future__ import annotations
+
+from datetime import datetime
+from typing import Any
+
+CONSTANT = 'foo'
+SENTINEL = object()
+
+
+def foo(name: str = CONSTANT,
+ sentinel: Any = SENTINEL,
+ now: datetime = datetime.now(),
+ color: int = 0xFFFFFF,
+ *,
+ kwarg1,
+ kwarg2 = 0xFFFFFF) -> None:
+ """docstring"""
+
+
+class Class:
+ """docstring"""
+
+ def meth(self, name: str = CONSTANT, sentinel: Any = SENTINEL,
+ now: datetime = datetime.now(), color: int = 0xFFFFFF,
+ *, kwarg1, kwarg2 = 0xFFFFFF) -> None:
+ """docstring"""
+
+ @classmethod
+ def clsmeth(cls, name: str = CONSTANT, sentinel: Any = SENTINEL,
+ now: datetime = datetime.now(), color: int = 0xFFFFFF,
+ *, kwarg1, kwarg2 = 0xFFFFFF) -> None:
+ """docstring"""
+
+
+get_sentinel = lambda custom=SENTINEL: custom
+"""docstring"""
+
+
+class MultiLine:
+ """docstring"""
+
+ # The properties will raise a silent SyntaxError because "lambda self: 1"
+ # will be detected as a function to update the default values of. However,
+ # only prop3 will not fail because it's on a single line whereas the others
+ # will fail to parse.
+
+ prop1 = property(
+ lambda self: 1, doc="docstring")
+
+ prop2 = property(
+ lambda self: 2, doc="docstring"
+ )
+
+ prop3 = property(lambda self: 3, doc="docstring")
+
+ prop4 = (property
+ (lambda self: 4, doc="docstring"))
+
+ prop5 = property\
+ (lambda self: 5, doc="docstring")
diff --git a/tests/roots/test-ext-autodoc/target/preserve_defaults_special_constructs.py b/tests/roots/test-ext-autodoc/target/preserve_defaults_special_constructs.py
new file mode 100644
index 0000000..0fdb11a
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/preserve_defaults_special_constructs.py
@@ -0,0 +1,50 @@
+from __future__ import annotations
+
+from collections import namedtuple
+from dataclasses import dataclass, field
+from typing import NamedTuple, TypedDict
+
+#: docstring
+SENTINEL = object()
+
+
+#: docstring
+ze_lambda = lambda z=SENTINEL: None
+
+
+def foo(x, y, z=SENTINEL):
+ """docstring"""
+
+
+@dataclass
+class DataClass:
+ """docstring"""
+ a: int
+ b: object = SENTINEL
+ c: list[int] = field(default_factory=lambda: [1, 2, 3])
+
+
+@dataclass(init=False)
+class DataClassNoInit:
+ """docstring"""
+ a: int
+ b: object = SENTINEL
+ c: list[int] = field(default_factory=lambda: [1, 2, 3])
+
+
+class MyTypedDict(TypedDict):
+ """docstring"""
+ a: int
+ b: object
+ c: list[int]
+
+
+class MyNamedTuple1(NamedTuple):
+ """docstring"""
+ a: int
+ b: object = object()
+ c: list[int] = [1, 2, 3]
+
+
+class MyNamedTuple2(namedtuple('Base', ('a', 'b'), defaults=(0, SENTINEL))):
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/private.py b/tests/roots/test-ext-autodoc/target/private.py
new file mode 100644
index 0000000..e463448
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/private.py
@@ -0,0 +1,27 @@
+def private_function(name):
+ """private_function is a docstring().
+
+ :meta private:
+ """
+
+def _public_function(name):
+ """public_function is a docstring().
+
+ :meta public:
+ """
+
+
+PRIVATE_CONSTANT = None #: :meta private:
+_PUBLIC_CONSTANT = None #: :meta public:
+
+
+class Foo:
+ #: A public class attribute whose name starts with an underscore.
+ #:
+ #: :meta public:
+ _public_attribute = 47
+
+ #: A private class attribute whose name does not start with an underscore.
+ #:
+ #: :meta private:
+ private_attribute = 11
diff --git a/tests/roots/test-ext-autodoc/target/process_docstring.py b/tests/roots/test-ext-autodoc/target/process_docstring.py
new file mode 100644
index 0000000..6005943
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/process_docstring.py
@@ -0,0 +1,8 @@
+def func():
+ """
+ first line
+ ---
+ second line
+ ---
+ third line
+ """
diff --git a/tests/roots/test-ext-autodoc/target/properties.py b/tests/roots/test-ext-autodoc/target/properties.py
new file mode 100644
index 0000000..018f51e
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/properties.py
@@ -0,0 +1,22 @@
+class Foo:
+ """docstring"""
+
+ @property
+ def prop1(self) -> int:
+ """docstring"""
+
+ @classmethod
+ @property
+ def prop2(self) -> int:
+ """docstring"""
+
+ @property
+ def prop1_with_type_comment(self):
+ # type: () -> int
+ """docstring"""
+
+ @classmethod
+ @property
+ def prop2_with_type_comment(self):
+ # type: () -> int
+ """docstring"""
diff --git a/tests/roots/test-ext-autodoc/target/singledispatch.py b/tests/roots/test-ext-autodoc/target/singledispatch.py
new file mode 100644
index 0000000..3dd5aaf
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/singledispatch.py
@@ -0,0 +1,36 @@
+import inspect
+from functools import singledispatch
+
+
+def assign_signature(func):
+ # This is intended to cover more complex signature-rewriting decorators.
+ func.__signature__ = inspect.signature(func)
+ return func
+
+
+@singledispatch
+def func(arg, kwarg=None):
+ """A function for general use."""
+ pass
+
+
+@func.register(int)
+@func.register(float)
+def _func_int(arg, kwarg=None):
+ """A function for int."""
+ pass
+
+
+@func.register(str)
+@assign_signature
+def _func_str(arg, kwarg=None):
+ """A function for str."""
+ pass
+
+
+@func.register
+def _func_dict(arg: dict, kwarg=None):
+ """A function for dict."""
+ # This function tests for specifying type through annotations
+ pass
+
diff --git a/tests/roots/test-ext-autodoc/target/singledispatchmethod.py b/tests/roots/test-ext-autodoc/target/singledispatchmethod.py
new file mode 100644
index 0000000..fb92293
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/singledispatchmethod.py
@@ -0,0 +1,27 @@
+from functools import singledispatchmethod
+
+
+class Foo:
+ """docstring"""
+
+ @singledispatchmethod
+ def meth(self, arg, kwarg=None):
+ """A method for general use."""
+ pass
+
+ @meth.register(int)
+ @meth.register(float)
+ def _meth_int(self, arg, kwarg=None):
+ """A method for int."""
+ pass
+
+ @meth.register(str)
+ def _meth_str(self, arg, kwarg=None):
+ """A method for str."""
+ pass
+
+ @meth.register
+ def _meth_dict(self, arg: dict, kwarg=None):
+ """A method for dict."""
+ # This function tests for specifying type through annotations
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/slots.py b/tests/roots/test-ext-autodoc/target/slots.py
new file mode 100644
index 0000000..75c7a4a
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/slots.py
@@ -0,0 +1,22 @@
+class Foo:
+ """docstring"""
+
+ __slots__ = ['attr']
+
+
+class Bar:
+ """docstring"""
+
+ __slots__ = {'attr1': 'docstring of attr1',
+ 'attr2': 'docstring of attr2',
+ 'attr3': None}
+ __annotations__ = {'attr1': int}
+
+ def __init__(self):
+ self.attr2 = None #: docstring of instance attr2
+
+
+class Baz:
+ """docstring"""
+
+ __slots__ = 'attr'
diff --git a/tests/roots/test-ext-autodoc/target/sort_by_all.py b/tests/roots/test-ext-autodoc/target/sort_by_all.py
new file mode 100644
index 0000000..03def47
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/sort_by_all.py
@@ -0,0 +1,25 @@
+__all__ = ['baz', 'foo', 'Bar']
+
+
+def foo():
+ pass
+
+
+class Bar:
+ pass
+
+
+def baz():
+ pass
+
+
+def qux():
+ pass
+
+
+class Quux:
+ pass
+
+
+def foobar():
+ pass
diff --git a/tests/roots/test-ext-autodoc/target/typed_vars.py b/tests/roots/test-ext-autodoc/target/typed_vars.py
new file mode 100644
index 0000000..0fe7468
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/typed_vars.py
@@ -0,0 +1,34 @@
+#: attr1
+attr1: str = ''
+#: attr2
+attr2: str
+#: attr3
+attr3 = '' # type: str
+
+
+class _Descriptor:
+ def __init__(self, name):
+ self.__doc__ = f"This is {name}"
+ def __get__(self):
+ pass
+
+
+class Class:
+ attr1: int = 0
+ attr2: int
+ attr3 = 0 # type: int
+
+ descr4: int = _Descriptor("descr4")
+
+ def __init__(self):
+ self.attr4: int = 0 #: attr4
+ self.attr5: int #: attr5
+ self.attr6 = 0 # type: int
+ """attr6"""
+
+
+class Derived(Class):
+ attr7: int
+
+
+Alias = Derived
diff --git a/tests/roots/test-ext-autodoc/target/typehints.py b/tests/roots/test-ext-autodoc/target/typehints.py
new file mode 100644
index 0000000..9071594
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/typehints.py
@@ -0,0 +1,105 @@
+from __future__ import annotations
+
+import pathlib
+from typing import Any, Tuple, TypeVar, Union
+
+CONST1: int
+#: docstring
+CONST2: int = 1
+#: docstring
+CONST3: pathlib.PurePosixPath = pathlib.PurePosixPath("/a/b/c")
+#: docstring
+T = TypeVar("T", bound=pathlib.PurePosixPath)
+
+
+def incr(a: int, b: int = 1) -> int:
+ return a + b
+
+
+def decr(a, b = 1):
+ # type: (int, int) -> int
+ return a - b
+
+
+class Math:
+ CONST1: int
+ CONST2: int = 1
+ CONST3: pathlib.PurePosixPath = pathlib.PurePosixPath("/a/b/c")
+
+ def __init__(self, s: str, o: Any = None) -> None:
+ pass
+
+ def incr(self, a: int, b: int = 1) -> int:
+ return a + b
+
+ def decr(self, a, b = 1):
+ # type: (int, int) -> int
+ return a - b
+
+ def nothing(self):
+ # type: () -> None
+ pass
+
+ def horse(self,
+ a, # type: str
+ b, # type: int
+ ):
+ # type: (...) -> None
+ return
+
+ @property
+ def prop(self) -> int:
+ return 0
+
+ @property
+ def path(self) -> pathlib.PurePosixPath:
+ return pathlib.PurePosixPath("/a/b/c")
+
+
+def tuple_args(x: tuple[int, int | str]) -> tuple[int, int]:
+ pass
+
+
+class NewAnnotation:
+ def __new__(cls, i: int) -> NewAnnotation:
+ pass
+
+
+class NewComment:
+ def __new__(cls, i):
+ # type: (int) -> NewComment
+ pass
+
+
+class _MetaclassWithCall(type):
+ def __call__(cls, a: int):
+ pass
+
+
+class SignatureFromMetaclass(metaclass=_MetaclassWithCall):
+ pass
+
+
+def complex_func(arg1, arg2, arg3=None, *args, **kwargs):
+ # type: (str, List[int], Tuple[int, Union[str, Unknown]], *str, **str) -> None
+ pass
+
+
+def missing_attr(c,
+ a, # type: str
+ b=None # type: Optional[str]
+ ):
+ # type: (...) -> str
+ return a + (b or "")
+
+
+class _ClassWithDocumentedInit:
+ """Class docstring."""
+
+ def __init__(self, x: int, *args: int, **kwargs: int) -> None:
+ """Init docstring.
+
+ :param x: Some integer
+ :param args: Some integer
+ :param kwargs: Some integer
+ """
diff --git a/tests/roots/test-ext-autodoc/target/typevar.py b/tests/roots/test-ext-autodoc/target/typevar.py
new file mode 100644
index 0000000..1a02f3e
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/typevar.py
@@ -0,0 +1,32 @@
+from __future__ import annotations
+
+from datetime import date
+from typing import NewType, TypeVar
+
+#: T1
+T1 = TypeVar("T1")
+
+T2 = TypeVar("T2") # A TypeVar not having doc comment
+
+#: T3
+T3 = TypeVar("T3", int, str)
+
+#: T4
+T4 = TypeVar("T4", covariant=True)
+
+#: T5
+T5 = TypeVar("T5", contravariant=True)
+
+#: T6
+T6 = NewType("T6", date)
+
+#: T7
+T7 = TypeVar("T7", bound=int)
+
+
+class Class:
+ #: T1
+ T1 = TypeVar("T1")
+
+ #: T6
+ T6 = NewType("T6", date)
diff --git a/tests/roots/test-ext-autodoc/target/uninitialized_attributes.py b/tests/roots/test-ext-autodoc/target/uninitialized_attributes.py
new file mode 100644
index 0000000..e0f229c
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/uninitialized_attributes.py
@@ -0,0 +1,8 @@
+class Base:
+ attr1: int #: docstring
+ attr2: str
+
+
+class Derived(Base):
+ attr3: int #: docstring
+ attr4: str
diff --git a/tests/roots/test-ext-autodoc/target/wrappedfunction.py b/tests/roots/test-ext-autodoc/target/wrappedfunction.py
new file mode 100644
index 0000000..064d777
--- /dev/null
+++ b/tests/roots/test-ext-autodoc/target/wrappedfunction.py
@@ -0,0 +1,17 @@
+from __future__ import annotations
+
+from contextlib import contextmanager
+from functools import lru_cache
+from typing import Generator
+
+
+@lru_cache(maxsize=None)
+def slow_function(message, timeout):
+ """This function is slow."""
+ print(message)
+
+
+@contextmanager
+def feeling_good(x: int, y: int) -> Generator:
+ """You'll feel better in this context!"""
+ yield
diff --git a/tests/roots/test-ext-autosectionlabel-prefix-document/conf.py b/tests/roots/test-ext-autosectionlabel-prefix-document/conf.py
new file mode 100644
index 0000000..78fb56c
--- /dev/null
+++ b/tests/roots/test-ext-autosectionlabel-prefix-document/conf.py
@@ -0,0 +1,2 @@
+extensions = ['sphinx.ext.autosectionlabel']
+autosectionlabel_prefix_document = True
diff --git a/tests/roots/test-ext-autosectionlabel-prefix-document/index.rst b/tests/roots/test-ext-autosectionlabel-prefix-document/index.rst
new file mode 100644
index 0000000..d767373
--- /dev/null
+++ b/tests/roots/test-ext-autosectionlabel-prefix-document/index.rst
@@ -0,0 +1,37 @@
+=========================================
+test-ext-autosectionlabel-prefix-document
+=========================================
+
+
+Introduce of Sphinx
+===================
+
+Installation
+============
+
+For Windows users
+-----------------
+
+For UNIX users
+--------------
+
+Linux
+^^^^^
+
+FreeBSD
+^^^^^^^
+
+This one's got an apostrophe
+----------------------------
+
+
+References
+==========
+
+* :ref:`index:Introduce of Sphinx`
+* :ref:`index:Installation`
+* :ref:`index:For Windows users`
+* :ref:`index:For UNIX users`
+* :ref:`index:Linux`
+* :ref:`index:FreeBSD`
+* :ref:`index:This one's got an apostrophe`
diff --git a/tests/roots/test-ext-autosectionlabel/conf.py b/tests/roots/test-ext-autosectionlabel/conf.py
new file mode 100644
index 0000000..31e93ff
--- /dev/null
+++ b/tests/roots/test-ext-autosectionlabel/conf.py
@@ -0,0 +1 @@
+extensions = ['sphinx.ext.autosectionlabel']
diff --git a/tests/roots/test-ext-autosectionlabel/index.rst b/tests/roots/test-ext-autosectionlabel/index.rst
new file mode 100644
index 0000000..133206e
--- /dev/null
+++ b/tests/roots/test-ext-autosectionlabel/index.rst
@@ -0,0 +1,37 @@
+=========================
+test-ext-autosectionlabel
+=========================
+
+
+Introduce of Sphinx
+===================
+
+Installation
+============
+
+For Windows users
+-----------------
+
+For UNIX users
+--------------
+
+Linux
+^^^^^
+
+FreeBSD
+^^^^^^^
+
+This one's got an apostrophe
+----------------------------
+
+References
+==========
+
+* :ref:`test-ext-autosectionlabel`
+* :ref:`Introduce of Sphinx`
+* :ref:`Installation`
+* :ref:`For Windows users`
+* :ref:`For UNIX users`
+* :ref:`Linux`
+* :ref:`FreeBSD`
+* :ref:`This one's got an apostrophe`
diff --git a/tests/roots/test-ext-autosummary-filename-map/autosummary_dummy_module.py b/tests/roots/test-ext-autosummary-filename-map/autosummary_dummy_module.py
new file mode 100644
index 0000000..b88e335
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-filename-map/autosummary_dummy_module.py
@@ -0,0 +1,23 @@
+from __future__ import annotations
+
+from os import path
+from typing import Union
+
+
+class Foo:
+ class Bar:
+ pass
+
+ def __init__(self):
+ pass
+
+ def bar(self):
+ pass
+
+ @property
+ def baz(self):
+ pass
+
+
+def bar(x: int | str, y: int = 1) -> None:
+ pass
diff --git a/tests/roots/test-ext-autosummary-filename-map/conf.py b/tests/roots/test-ext-autosummary-filename-map/conf.py
new file mode 100644
index 0000000..17e2fa4
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-filename-map/conf.py
@@ -0,0 +1,11 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
+autosummary_filename_map = {
+ "autosummary_dummy_module": "module_mangled",
+ "autosummary_dummy_module.bar": "bar"
+}
diff --git a/tests/roots/test-ext-autosummary-filename-map/index.rst b/tests/roots/test-ext-autosummary-filename-map/index.rst
new file mode 100644
index 0000000..57d902b
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-filename-map/index.rst
@@ -0,0 +1,9 @@
+
+.. autosummary::
+ :toctree: generated
+ :caption: An autosummary
+
+ autosummary_dummy_module
+ autosummary_dummy_module.Foo
+ autosummary_dummy_module.Foo.bar
+ autosummary_dummy_module.bar
diff --git a/tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/__init__.py b/tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/__init__.py
new file mode 100644
index 0000000..0a7d9f3
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/__init__.py
@@ -0,0 +1 @@
+from .autosummary_dummy_module import Bar, foo
diff --git a/tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/autosummary_dummy_module.py b/tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/autosummary_dummy_module.py
new file mode 100644
index 0000000..9c93f06
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-imported_members/autosummary_dummy_package/autosummary_dummy_module.py
@@ -0,0 +1,8 @@
+class Bar:
+ """Bar class"""
+ pass
+
+
+def foo():
+ """Foo function"""
+ pass
diff --git a/tests/roots/test-ext-autosummary-imported_members/conf.py b/tests/roots/test-ext-autosummary-imported_members/conf.py
new file mode 100644
index 0000000..77af668
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-imported_members/conf.py
@@ -0,0 +1,8 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
+autosummary_imported_members = True
diff --git a/tests/roots/test-ext-autosummary-imported_members/index.rst b/tests/roots/test-ext-autosummary-imported_members/index.rst
new file mode 100644
index 0000000..1c55126
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-imported_members/index.rst
@@ -0,0 +1,7 @@
+test-ext-autosummary-imported_members
+=====================================
+
+.. autosummary::
+ :toctree: generated
+
+ autosummary_dummy_package
diff --git a/tests/roots/test-ext-autosummary-mock_imports/conf.py b/tests/roots/test-ext-autosummary-mock_imports/conf.py
new file mode 100644
index 0000000..121f814
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-mock_imports/conf.py
@@ -0,0 +1,8 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
+autosummary_mock_imports = ['unknown']
diff --git a/tests/roots/test-ext-autosummary-mock_imports/foo.py b/tests/roots/test-ext-autosummary-mock_imports/foo.py
new file mode 100644
index 0000000..ab4460e
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-mock_imports/foo.py
@@ -0,0 +1,6 @@
+import unknown
+
+
+class Foo(unknown.Class):
+ """Foo class"""
+ pass
diff --git a/tests/roots/test-ext-autosummary-mock_imports/index.rst b/tests/roots/test-ext-autosummary-mock_imports/index.rst
new file mode 100644
index 0000000..f6044ed
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-mock_imports/index.rst
@@ -0,0 +1,7 @@
+test-ext-autosummary-mock_imports
+=================================
+
+.. autosummary::
+ :toctree: generated
+
+ foo
diff --git a/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/__init__.py b/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/__init__.py
new file mode 100644
index 0000000..82f2060
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/__init__.py
@@ -0,0 +1,13 @@
+from .autosummary_dummy_module import Bar, PublicBar, foo, public_foo
+
+
+def baz():
+ """Baz function"""
+ pass
+
+
+def public_baz():
+ """Public Baz function"""
+
+
+__all__ = ["PublicBar", "public_foo", "public_baz", "extra_dummy_module"]
diff --git a/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/autosummary_dummy_module.py b/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/autosummary_dummy_module.py
new file mode 100644
index 0000000..ef89e22
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/autosummary_dummy_module.py
@@ -0,0 +1,20 @@
+class Bar:
+ """Bar class"""
+
+ pass
+
+
+class PublicBar:
+ """Public Bar class"""
+
+ pass
+
+
+def foo():
+ """Foo function"""
+ pass
+
+
+def public_foo():
+ """Public Foo function"""
+ pass
diff --git a/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/extra_dummy_module.py b/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/extra_dummy_module.py
new file mode 100644
index 0000000..ef89e22
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-module_all/autosummary_dummy_package_all/extra_dummy_module.py
@@ -0,0 +1,20 @@
+class Bar:
+ """Bar class"""
+
+ pass
+
+
+class PublicBar:
+ """Public Bar class"""
+
+ pass
+
+
+def foo():
+ """Foo function"""
+ pass
+
+
+def public_foo():
+ """Public Foo function"""
+ pass
diff --git a/tests/roots/test-ext-autosummary-module_all/conf.py b/tests/roots/test-ext-autosummary-module_all/conf.py
new file mode 100644
index 0000000..c6ff534
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-module_all/conf.py
@@ -0,0 +1,8 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
+autosummary_ignore_module_all = False
diff --git a/tests/roots/test-ext-autosummary-module_all/index.rst b/tests/roots/test-ext-autosummary-module_all/index.rst
new file mode 100644
index 0000000..cd638ad
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-module_all/index.rst
@@ -0,0 +1,8 @@
+test-ext-autosummary-module_all
+===============================
+
+.. autosummary::
+ :toctree: generated
+ :recursive:
+
+ autosummary_dummy_package_all
diff --git a/tests/roots/test-ext-autosummary-recursive/conf.py b/tests/roots/test-ext-autosummary-recursive/conf.py
new file mode 100644
index 0000000..1c0d022
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/conf.py
@@ -0,0 +1,7 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
diff --git a/tests/roots/test-ext-autosummary-recursive/index.rst b/tests/roots/test-ext-autosummary-recursive/index.rst
new file mode 100644
index 0000000..5855bfa
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/index.rst
@@ -0,0 +1,15 @@
+API Reference
+=============
+
+.. rubric:: Packages
+
+.. autosummary::
+ :toctree: generated
+ :recursive:
+
+ package
+
+.. autosummary::
+ :toctree: generated
+
+ package2
diff --git a/tests/roots/test-ext-autosummary-recursive/package/__init__.py b/tests/roots/test-ext-autosummary-recursive/package/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/package/__init__.py
diff --git a/tests/roots/test-ext-autosummary-recursive/package/module.py b/tests/roots/test-ext-autosummary-recursive/package/module.py
new file mode 100644
index 0000000..c76e733
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/package/module.py
@@ -0,0 +1,13 @@
+from os import *
+
+
+class Foo:
+ def __init__(self):
+ pass
+
+ def bar(self):
+ pass
+
+ @property
+ def baz(self):
+ pass
diff --git a/tests/roots/test-ext-autosummary-recursive/package/module_importfail.py b/tests/roots/test-ext-autosummary-recursive/package/module_importfail.py
new file mode 100644
index 0000000..5c6ce56
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/package/module_importfail.py
@@ -0,0 +1,2 @@
+# Fail module import in a catastrophic way
+raise SystemExit(1)
diff --git a/tests/roots/test-ext-autosummary-recursive/package/package/__init__.py b/tests/roots/test-ext-autosummary-recursive/package/package/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/package/package/__init__.py
diff --git a/tests/roots/test-ext-autosummary-recursive/package/package/module.py b/tests/roots/test-ext-autosummary-recursive/package/package/module.py
new file mode 100644
index 0000000..c76e733
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/package/package/module.py
@@ -0,0 +1,13 @@
+from os import *
+
+
+class Foo:
+ def __init__(self):
+ pass
+
+ def bar(self):
+ pass
+
+ @property
+ def baz(self):
+ pass
diff --git a/tests/roots/test-ext-autosummary-recursive/package2/__init__.py b/tests/roots/test-ext-autosummary-recursive/package2/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/package2/__init__.py
diff --git a/tests/roots/test-ext-autosummary-recursive/package2/module.py b/tests/roots/test-ext-autosummary-recursive/package2/module.py
new file mode 100644
index 0000000..c76e733
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-recursive/package2/module.py
@@ -0,0 +1,13 @@
+from os import *
+
+
+class Foo:
+ def __init__(self):
+ pass
+
+ def bar(self):
+ pass
+
+ @property
+ def baz(self):
+ pass
diff --git a/tests/roots/test-ext-autosummary-skip-member/conf.py b/tests/roots/test-ext-autosummary-skip-member/conf.py
new file mode 100644
index 0000000..7c8f0e9
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-skip-member/conf.py
@@ -0,0 +1,20 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
+autodoc_default_options = {'members': True}
+
+
+def skip_member(app, what, name, obj, skip, options):
+ if name == 'skipmeth':
+ return True
+ elif name == '_privatemeth':
+ return False
+
+
+def setup(app):
+ app.connect('autodoc-skip-member', skip_member)
diff --git a/tests/roots/test-ext-autosummary-skip-member/index.rst b/tests/roots/test-ext-autosummary-skip-member/index.rst
new file mode 100644
index 0000000..c376a13
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-skip-member/index.rst
@@ -0,0 +1,4 @@
+.. autosummary::
+ :toctree: generate
+
+ target.Foo
diff --git a/tests/roots/test-ext-autosummary-skip-member/target.py b/tests/roots/test-ext-autosummary-skip-member/target.py
new file mode 100644
index 0000000..fdf557e
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-skip-member/target.py
@@ -0,0 +1,14 @@
+class Foo:
+ """docstring of Foo."""
+
+ def meth(self):
+ """docstring of meth."""
+ pass
+
+ def skipmeth(self):
+ """docstring of skipmeth."""
+ pass
+
+ def _privatemeth(self):
+ """docstring of _privatemeth."""
+ pass
diff --git a/tests/roots/test-ext-autosummary-template/_templates/empty.rst b/tests/roots/test-ext-autosummary-template/_templates/empty.rst
new file mode 100644
index 0000000..7f7204c
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-template/_templates/empty.rst
@@ -0,0 +1 @@
+EMPTY
diff --git a/tests/roots/test-ext-autosummary-template/conf.py b/tests/roots/test-ext-autosummary-template/conf.py
new file mode 100644
index 0000000..cc23635
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-template/conf.py
@@ -0,0 +1,10 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
+autodoc_default_options = {'members': True}
+templates_path = ['_templates']
diff --git a/tests/roots/test-ext-autosummary-template/index.rst b/tests/roots/test-ext-autosummary-template/index.rst
new file mode 100644
index 0000000..c9f28b0
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-template/index.rst
@@ -0,0 +1,5 @@
+.. autosummary::
+ :toctree: generate
+ :template: empty.rst
+
+ target.Foo
diff --git a/tests/roots/test-ext-autosummary-template/target.py b/tests/roots/test-ext-autosummary-template/target.py
new file mode 100644
index 0000000..c607b59
--- /dev/null
+++ b/tests/roots/test-ext-autosummary-template/target.py
@@ -0,0 +1,2 @@
+class Foo:
+ """docstring of Foo."""
diff --git a/tests/roots/test-ext-autosummary/autosummary_class_module.py b/tests/roots/test-ext-autosummary/autosummary_class_module.py
new file mode 100644
index 0000000..f13de17
--- /dev/null
+++ b/tests/roots/test-ext-autosummary/autosummary_class_module.py
@@ -0,0 +1,2 @@
+class Class():
+ pass
diff --git a/tests/roots/test-ext-autosummary/autosummary_dummy_inherited_module.py b/tests/roots/test-ext-autosummary/autosummary_dummy_inherited_module.py
new file mode 100644
index 0000000..2b3d2da
--- /dev/null
+++ b/tests/roots/test-ext-autosummary/autosummary_dummy_inherited_module.py
@@ -0,0 +1,13 @@
+from autosummary_dummy_module import Foo
+
+
+class InheritedAttrClass(Foo):
+
+ def __init__(self):
+ #: other docstring
+ self.subclassattr = "subclassattr"
+
+ super().__init__()
+
+
+__all__ = ["InheritedAttrClass"]
diff --git a/tests/roots/test-ext-autosummary/autosummary_dummy_module.py b/tests/roots/test-ext-autosummary/autosummary_dummy_module.py
new file mode 100644
index 0000000..2d8829a
--- /dev/null
+++ b/tests/roots/test-ext-autosummary/autosummary_dummy_module.py
@@ -0,0 +1,68 @@
+from os import path
+from typing import Union
+
+from autosummary_class_module import Class
+
+__all__ = [
+ "CONSTANT1",
+ "Exc",
+ "Foo",
+ "_Baz",
+ "bar",
+ "qux",
+ "path",
+]
+
+#: module variable
+CONSTANT1 = None
+CONSTANT2 = None
+
+
+class Foo:
+ #: class variable
+ CONSTANT3 = None
+ CONSTANT4 = None
+
+ class Bar:
+ pass
+
+ def __init__(self):
+ #: docstring
+ self.value = 1
+
+ def bar(self):
+ pass
+
+ @property
+ def baz(self):
+ pass
+
+
+class _Baz:
+ pass
+
+
+def bar(x: Union[int, str], y: int = 1) -> None:
+ pass
+
+
+def _quux():
+ pass
+
+
+class Exc(Exception):
+ pass
+
+
+class _Exc(Exception):
+ pass
+
+
+#: a module-level attribute
+qux = 2
+#: a module-level attribute that has been excluded from __all__
+quuz = 2
+
+considered_as_imported = Class()
+non_imported_member = Class()
+""" This attribute has a docstring, so it is recognized as a not-imported member """
diff --git a/tests/roots/test-ext-autosummary/autosummary_importfail.py b/tests/roots/test-ext-autosummary/autosummary_importfail.py
new file mode 100644
index 0000000..5c6ce56
--- /dev/null
+++ b/tests/roots/test-ext-autosummary/autosummary_importfail.py
@@ -0,0 +1,2 @@
+# Fail module import in a catastrophic way
+raise SystemExit(1)
diff --git a/tests/roots/test-ext-autosummary/conf.py b/tests/roots/test-ext-autosummary/conf.py
new file mode 100644
index 0000000..55c769c
--- /dev/null
+++ b/tests/roots/test-ext-autosummary/conf.py
@@ -0,0 +1,10 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = True
+
+# The suffix of source filenames.
+source_suffix = '.rst'
diff --git a/tests/roots/test-ext-autosummary/index.rst b/tests/roots/test-ext-autosummary/index.rst
new file mode 100644
index 0000000..08bd0f0
--- /dev/null
+++ b/tests/roots/test-ext-autosummary/index.rst
@@ -0,0 +1,18 @@
+
+:autolink:`autosummary_dummy_module.Foo`
+
+:autolink:`autosummary_importfail`
+
+.. autosummary::
+ :toctree: generated
+ :caption: An autosummary
+
+ autosummary_dummy_module
+ autosummary_dummy_module.Foo
+ autosummary_dummy_module.Foo.Bar
+ autosummary_dummy_module.Foo.value
+ autosummary_dummy_module.bar
+ autosummary_dummy_module.qux
+ autosummary_dummy_inherited_module.InheritedAttrClass
+ autosummary_dummy_inherited_module.InheritedAttrClass.subclassattr
+ autosummary_importfail
diff --git a/tests/roots/test-ext-coverage/conf.py b/tests/roots/test-ext-coverage/conf.py
new file mode 100644
index 0000000..d3ec6e8
--- /dev/null
+++ b/tests/roots/test-ext-coverage/conf.py
@@ -0,0 +1,12 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage']
+
+coverage_ignore_pyobjects = [
+ r'^coverage_ignored(\..*)?$',
+ r'\.Ignored$',
+ r'\.Documented\.ignored\d$',
+]
diff --git a/tests/roots/test-ext-coverage/coverage_ignored.py b/tests/roots/test-ext-coverage/coverage_ignored.py
new file mode 100644
index 0000000..b762955
--- /dev/null
+++ b/tests/roots/test-ext-coverage/coverage_ignored.py
@@ -0,0 +1,22 @@
+class Documented:
+ """Documented"""
+
+ def ignored1(self):
+ pass
+
+ def ignored2(self):
+ pass
+
+ def not_ignored1(self):
+ pass
+
+ def not_ignored2(self):
+ pass
+
+
+class Ignored:
+ pass
+
+
+class NotIgnored:
+ pass
diff --git a/tests/roots/test-ext-coverage/coverage_not_ignored.py b/tests/roots/test-ext-coverage/coverage_not_ignored.py
new file mode 100644
index 0000000..b762955
--- /dev/null
+++ b/tests/roots/test-ext-coverage/coverage_not_ignored.py
@@ -0,0 +1,22 @@
+class Documented:
+ """Documented"""
+
+ def ignored1(self):
+ pass
+
+ def ignored2(self):
+ pass
+
+ def not_ignored1(self):
+ pass
+
+ def not_ignored2(self):
+ pass
+
+
+class Ignored:
+ pass
+
+
+class NotIgnored:
+ pass
diff --git a/tests/roots/test-ext-coverage/index.rst b/tests/roots/test-ext-coverage/index.rst
new file mode 100644
index 0000000..b846898
--- /dev/null
+++ b/tests/roots/test-ext-coverage/index.rst
@@ -0,0 +1,6 @@
+.. automodule:: coverage_ignored
+ :members:
+
+
+.. automodule:: coverage_not_ignored
+ :members:
diff --git a/tests/roots/test-ext-doctest-skipif/conf.py b/tests/roots/test-ext-doctest-skipif/conf.py
new file mode 100644
index 0000000..6f54982
--- /dev/null
+++ b/tests/roots/test-ext-doctest-skipif/conf.py
@@ -0,0 +1,16 @@
+extensions = ['sphinx.ext.doctest']
+
+project = 'test project for the doctest :skipif: directive'
+root_doc = 'skipif'
+source_suffix = '.txt'
+exclude_patterns = ['_build']
+
+doctest_global_setup = '''
+from tests.test_ext_doctest import record
+
+record('doctest_global_setup', 'body', True)
+'''
+
+doctest_global_cleanup = '''
+record('doctest_global_cleanup', 'body', True)
+'''
diff --git a/tests/roots/test-ext-doctest-skipif/skipif.txt b/tests/roots/test-ext-doctest-skipif/skipif.txt
new file mode 100644
index 0000000..c5bd398
--- /dev/null
+++ b/tests/roots/test-ext-doctest-skipif/skipif.txt
@@ -0,0 +1,81 @@
+Testing the doctest extension's `:skipif:` option
+=================================================
+
+testsetup
+---------
+
+.. testsetup:: group-skipif
+ :skipif: record('testsetup', ':skipif:', True) != 'this will be True'
+
+ record('testsetup', 'body', True)
+
+.. testsetup:: group-skipif
+ :skipif: record('testsetup', ':skipif:', False) == 'this will be False'
+
+ record('testsetup', 'body', False)
+
+
+doctest
+-------
+.. doctest:: group-skipif
+ :skipif: record('doctest', ':skipif:', True) != 'this will be True'
+
+ >>> print(record('doctest', 'body', True))
+ The test is skipped, and this expected text is ignored
+
+
+.. doctest::
+ :skipif: record('doctest', ':skipif:', False) == 'this will be False'
+
+ >>> print(record('doctest', 'body', False))
+ Recorded doctest body False
+
+
+testcode and testoutput
+-----------------------
+
+testcode skipped
+~~~~~~~~~~~~~~~~
+
+.. testcode:: group-skipif
+ :skipif: record('testcode', ':skipif:', True) != 'this will be True'
+
+ print(record('testcode', 'body', True))
+
+.. testoutput:: group-skipif
+ :skipif: record('testoutput-1', ':skipif:', True) != 'this will be True'
+
+ The previous testcode is skipped, and the :skipif: condition is True,
+ so this testoutput is ignored
+
+testcode executed
+~~~~~~~~~~~~~~~~~
+
+.. testcode:: group-skipif
+ :skipif: record('testcode', ':skipif:', False) == 'this will be False'
+
+ print(record('testcode', 'body', False))
+
+.. testoutput:: group-skipif
+ :skipif: record('testoutput-2', ':skipif:', False) == 'this will be False'
+
+ Recorded testcode body False
+
+.. testoutput:: group-skipif
+ :skipif: record('testoutput-2', ':skipif:', True) != 'this will be True'
+
+ The :skipif: condition is False, so this testoutput is ignored
+
+
+testcleanup
+-----------
+
+.. testcleanup:: group-skipif
+ :skipif: record('testcleanup', ':skipif:', True) != 'this will be True'
+
+ record('testcleanup', 'body', True)
+
+.. testcleanup:: group-skipif
+ :skipif: record('testcleanup', ':skipif:', False) == 'this will be False'
+
+ record('testcleanup', 'body', False)
diff --git a/tests/roots/test-ext-doctest-with-autodoc/conf.py b/tests/roots/test-ext-doctest-with-autodoc/conf.py
new file mode 100644
index 0000000..1ec1dd9
--- /dev/null
+++ b/tests/roots/test-ext-doctest-with-autodoc/conf.py
@@ -0,0 +1,7 @@
+import sys
+from os import path
+
+sys.path.insert(0, path.abspath(path.dirname(__file__)))
+
+project = 'test project for doctest + autodoc reporting'
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest']
diff --git a/tests/roots/test-ext-doctest-with-autodoc/dir/__init__.py b/tests/roots/test-ext-doctest-with-autodoc/dir/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-doctest-with-autodoc/dir/__init__.py
diff --git a/tests/roots/test-ext-doctest-with-autodoc/dir/bar.py b/tests/roots/test-ext-doctest-with-autodoc/dir/bar.py
new file mode 100644
index 0000000..122fdf7
--- /dev/null
+++ b/tests/roots/test-ext-doctest-with-autodoc/dir/bar.py
@@ -0,0 +1,4 @@
+"""
+>>> 'dir/bar.py:2'
+
+"""
diff --git a/tests/roots/test-ext-doctest-with-autodoc/dir/inner.rst b/tests/roots/test-ext-doctest-with-autodoc/dir/inner.rst
new file mode 100644
index 0000000..b2ee47f
--- /dev/null
+++ b/tests/roots/test-ext-doctest-with-autodoc/dir/inner.rst
@@ -0,0 +1,4 @@
+>>> 'dir/inner.rst:1'
+
+.. automodule:: dir.bar
+ :members:
diff --git a/tests/roots/test-ext-doctest-with-autodoc/foo.py b/tests/roots/test-ext-doctest-with-autodoc/foo.py
new file mode 100644
index 0000000..9f62a19
--- /dev/null
+++ b/tests/roots/test-ext-doctest-with-autodoc/foo.py
@@ -0,0 +1,5 @@
+"""
+
+>>> 'foo.py:3'
+
+"""
diff --git a/tests/roots/test-ext-doctest-with-autodoc/index.rst b/tests/roots/test-ext-doctest-with-autodoc/index.rst
new file mode 100644
index 0000000..09d1239
--- /dev/null
+++ b/tests/roots/test-ext-doctest-with-autodoc/index.rst
@@ -0,0 +1,4 @@
+.. automodule:: foo
+ :members:
+
+>>> 'index.rst:4'
diff --git a/tests/roots/test-ext-doctest/conf.py b/tests/roots/test-ext-doctest/conf.py
new file mode 100644
index 0000000..d0e8b10
--- /dev/null
+++ b/tests/roots/test-ext-doctest/conf.py
@@ -0,0 +1,6 @@
+extensions = ['sphinx.ext.doctest']
+
+project = 'test project for doctest'
+root_doc = 'doctest'
+source_suffix = '.txt'
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-ext-doctest/doctest.txt b/tests/roots/test-ext-doctest/doctest.txt
new file mode 100644
index 0000000..04780cf
--- /dev/null
+++ b/tests/roots/test-ext-doctest/doctest.txt
@@ -0,0 +1,163 @@
+Testing the doctest extension
+=============================
+
+Simple doctest blocks
+---------------------
+
+>>> 1+1
+2
+>>> 1/0
+Traceback (most recent call last):
+ ...
+ZeroDivisionError: integer division or modulo by zero
+
+
+Special directives
+------------------
+
+* doctest
+
+ .. doctest::
+
+ >>> 1+1
+ 2
+ >>> 1/0
+ Traceback (most recent call last):
+ ...
+ ZeroDivisionError: integer division or modulo by zero
+
+* testcode/testoutput
+
+ .. testcode::
+
+ print(1+1)
+
+ .. testoutput::
+
+ 2
+
+ .. testcode::
+
+ 1/0
+
+ .. testoutput::
+
+ Traceback (most recent call last):
+ ...
+ ZeroDivisionError: integer division or modulo by zero
+
+* testsetup
+
+ .. testsetup:: *
+
+ def squared(x):
+ return x * x
+
+ .. doctest::
+
+ >>> squared(2)
+ 4
+
+ .. testcode::
+
+ print(squared(2))
+
+ .. testoutput::
+
+ 4
+
+ >>> squared(2)
+ 4
+
+* options for doctest/testcode/testoutput blocks
+
+ .. testcode::
+ :hide:
+
+ print('Output text.')
+
+ .. testoutput::
+ :hide:
+ :options: +NORMALIZE_WHITESPACE
+
+ Output text.
+
+ .. doctest::
+ :pyversion: >= 2.0
+
+ >>> a = 3
+ >>> a
+ 3
+
+ .. doctest::
+ :pyversion: < 2.0
+
+ >>> a = 3
+ >>> a
+ 4
+
+* grouping
+
+ .. testsetup:: group1
+
+ def add(x, y):
+ return x + y
+
+
+ ``add`` is now known in "group1", but not in others.
+
+ .. doctest:: group1
+
+ >>> add(1, 1)
+ 2
+
+ .. doctest:: group2
+
+ >>> add(1, 1)
+ Traceback (most recent call last):
+ ...
+ NameError: name 'add' is not defined
+
+ Interleaving testcode/testoutput:
+
+ .. testcode:: group1
+
+ print(squared(3))
+
+ .. testcode:: group2
+
+ print(squared(4))
+
+ .. testoutput:: group1
+
+ 9
+
+ .. testoutput:: group2
+
+ 16
+
+
+.. testcleanup:: *
+
+ from tests import test_ext_doctest
+ test_ext_doctest.cleanup_call()
+
+non-ASCII result
+----------------
+
+>>> print('umlauts: äöü.')
+umlauts: äöü.
+>>> print('Japanese: 日本語')
+Japanese: 日本語
+
+keep control char in raw string
+-------------------------------
+
+.. doctest::
+
+ >>> print('one\ntwo')
+ one
+ two
+ >>> print(r'one\ntwo')
+ one\ntwo
+
diff --git a/tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/conf.py b/tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/conf.py
new file mode 100644
index 0000000..f463449
--- /dev/null
+++ b/tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/conf.py
@@ -0,0 +1,6 @@
+extensions = ['sphinx.ext.extlinks']
+extlinks = {
+ 'user': ('https://github.com/%s', '@%s'),
+ 'repo': ('https://github.com/%s', 'project %s'),
+}
+extlinks_detect_hardcoded_links = True
diff --git a/tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/index.rst b/tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/index.rst
new file mode 100644
index 0000000..162b361
--- /dev/null
+++ b/tests/roots/test-ext-extlinks-hardcoded-urls-multiple-replacements/index.rst
@@ -0,0 +1,24 @@
+test-ext-extlinks-hardcoded-urls
+================================
+
+.. Links generated by extlinks extension should not raise any warnings.
+.. Only hardcoded URLs are affected.
+
+:user:`octocat`
+
+:repo:`sphinx-doc/sphinx`
+
+.. hardcoded replaceable link which can be replaced as
+.. :repo:`octocat` or :user:`octocat`
+
+https://github.com/octocat
+
+`inline replaceable link <https://github.com/octocat>`_
+
+`replaceable link`_
+
+`non replaceable link <https://github.com/sphinx-doc/sphinx/pulls>`_
+
+.. hyperlinks
+
+.. _replaceable link: https://github.com/octocat
diff --git a/tests/roots/test-ext-extlinks-hardcoded-urls/conf.py b/tests/roots/test-ext-extlinks-hardcoded-urls/conf.py
new file mode 100644
index 0000000..db0b341
--- /dev/null
+++ b/tests/roots/test-ext-extlinks-hardcoded-urls/conf.py
@@ -0,0 +1,3 @@
+extensions = ['sphinx.ext.extlinks']
+extlinks = {'issue': ('https://github.com/sphinx-doc/sphinx/issues/%s', 'issue %s')}
+extlinks_detect_hardcoded_links = True
diff --git a/tests/roots/test-ext-extlinks-hardcoded-urls/index.rst b/tests/roots/test-ext-extlinks-hardcoded-urls/index.rst
new file mode 100644
index 0000000..ada6f07
--- /dev/null
+++ b/tests/roots/test-ext-extlinks-hardcoded-urls/index.rst
@@ -0,0 +1,28 @@
+test-ext-extlinks-hardcoded-urls
+================================
+
+.. Links generated by extlinks extension should not raise any warnings.
+.. Only hardcoded URLs are affected.
+
+:issue:`1`
+
+.. hardcoded replaceable link
+
+https://github.com/sphinx-doc/sphinx/issues/1
+
+`inline replaceable link <https://github.com/sphinx-doc/sphinx/issues/1>`_
+
+`replaceable link`_
+
+.. hardcoded non-replaceable link
+
+https://github.com/sphinx-doc/sphinx/pulls/1
+
+`inline non-replaceable link <https://github.com/sphinx-doc/sphinx/pulls/1>`_
+
+`non-replaceable link`_
+
+.. hyperlinks
+
+.. _replaceable link: https://github.com/sphinx-doc/sphinx/issues/1
+.. _non-replaceable link: https://github.com/sphinx-doc/sphinx/pulls/1
diff --git a/tests/roots/test-ext-githubpages/conf.py b/tests/roots/test-ext-githubpages/conf.py
new file mode 100644
index 0000000..3577096
--- /dev/null
+++ b/tests/roots/test-ext-githubpages/conf.py
@@ -0,0 +1 @@
+extensions = ['sphinx.ext.githubpages']
diff --git a/tests/roots/test-ext-githubpages/index.rst b/tests/roots/test-ext-githubpages/index.rst
new file mode 100644
index 0000000..711847f
--- /dev/null
+++ b/tests/roots/test-ext-githubpages/index.rst
@@ -0,0 +1,3 @@
+githubpages
+===========
+
diff --git a/tests/roots/test-ext-graphviz/_static/images/test.svg b/tests/roots/test-ext-graphviz/_static/images/test.svg
new file mode 100644
index 0000000..6134f44
--- /dev/null
+++ b/tests/roots/test-ext-graphviz/_static/images/test.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1"
+ height="128" width="128"
+ xmlns="http://www.w3.org/2000/svg">
+
+ <rect width="100%" height="100%" fill="red" />
+
+</svg>
diff --git a/tests/roots/test-ext-graphviz/conf.py b/tests/roots/test-ext-graphviz/conf.py
new file mode 100644
index 0000000..317457f
--- /dev/null
+++ b/tests/roots/test-ext-graphviz/conf.py
@@ -0,0 +1,3 @@
+extensions = ['sphinx.ext.graphviz']
+exclude_patterns = ['_build']
+html_static_path = ["_static"]
diff --git a/tests/roots/test-ext-graphviz/graph.dot b/tests/roots/test-ext-graphviz/graph.dot
new file mode 100644
index 0000000..ca57244
--- /dev/null
+++ b/tests/roots/test-ext-graphviz/graph.dot
@@ -0,0 +1,3 @@
+digraph {
+ bar -> baz
+}
diff --git a/tests/roots/test-ext-graphviz/graph.xx.dot b/tests/roots/test-ext-graphviz/graph.xx.dot
new file mode 100644
index 0000000..e5add5c
--- /dev/null
+++ b/tests/roots/test-ext-graphviz/graph.xx.dot
@@ -0,0 +1,3 @@
+digraph {
+ BAR -> BAZ
+}
diff --git a/tests/roots/test-ext-graphviz/index.rst b/tests/roots/test-ext-graphviz/index.rst
new file mode 100644
index 0000000..cb0f069
--- /dev/null
+++ b/tests/roots/test-ext-graphviz/index.rst
@@ -0,0 +1,43 @@
+graphviz
+========
+
+.. digraph:: foo
+ :caption: caption of graph
+
+ bar -> baz
+
+.. |graph| digraph:: bar
+
+ bar -> baz
+
+Hello |graph| graphviz world
+
+.. digraph:: foo
+ :graphviz_dot: neato
+ :class: neato_graph
+
+ baz -> qux
+
+
+.. graphviz:: graph.dot
+
+.. digraph:: bar
+ :align: right
+ :caption: on *right*
+
+ foo -> bar
+
+.. digraph:: foo
+ :align: center
+
+ centered
+
+.. graphviz::
+ :align: center
+
+ digraph test {
+ foo [label="foo", URL="#graphviz", target="_parent"]
+ bar [label="bar", image="./_static/images/test.svg"]
+ baz [label="baz", URL="./_static/images/test.svg"]
+ foo -> bar -> baz
+ }
diff --git a/tests/roots/test-ext-ifconfig/conf.py b/tests/roots/test-ext-ifconfig/conf.py
new file mode 100644
index 0000000..e82ec79
--- /dev/null
+++ b/tests/roots/test-ext-ifconfig/conf.py
@@ -0,0 +1,10 @@
+extensions = ['sphinx.ext.ifconfig']
+exclude_patterns = ['_build']
+
+confval1 = True
+
+
+def setup(app):
+ app.add_config_value('confval1', False, None)
+ app.add_config_value('confval2', False, None)
+ app.add_config_value('false_config', False, None)
diff --git a/tests/roots/test-ext-ifconfig/index.rst b/tests/roots/test-ext-ifconfig/index.rst
new file mode 100644
index 0000000..f7fabcc
--- /dev/null
+++ b/tests/roots/test-ext-ifconfig/index.rst
@@ -0,0 +1,21 @@
+ifconfig
+========
+
+.. ifconfig:: confval1
+
+ spam
+
+.. ifconfig:: confval2
+
+ egg
+
+Issue 10496 regression test
+===========================
+
+.. ifconfig:: false_config
+
+ `Link 1 <https://link1.example>`__
+
+.. ifconfig:: false_config
+
+ `Link 2 <https://link2.example>`__
diff --git a/tests/roots/test-ext-imgconverter/conf.py b/tests/roots/test-ext-imgconverter/conf.py
new file mode 100644
index 0000000..6a2e75d
--- /dev/null
+++ b/tests/roots/test-ext-imgconverter/conf.py
@@ -0,0 +1 @@
+extensions = ['sphinx.ext.imgconverter']
diff --git a/tests/roots/test-ext-imgconverter/img.pdf b/tests/roots/test-ext-imgconverter/img.pdf
new file mode 100644
index 0000000..cacbd85
--- /dev/null
+++ b/tests/roots/test-ext-imgconverter/img.pdf
Binary files differ
diff --git a/tests/roots/test-ext-imgconverter/index.rst b/tests/roots/test-ext-imgconverter/index.rst
new file mode 100644
index 0000000..f8ef1d6
--- /dev/null
+++ b/tests/roots/test-ext-imgconverter/index.rst
@@ -0,0 +1,5 @@
+test-ext-imgconverter
+=====================
+
+.. image:: svgimg.svg
+.. image:: img.pdf
diff --git a/tests/roots/test-ext-imgconverter/svgimg.svg b/tests/roots/test-ext-imgconverter/svgimg.svg
new file mode 100644
index 0000000..2bae0b9
--- /dev/null
+++ b/tests/roots/test-ext-imgconverter/svgimg.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="60" width="60">
+ <circle cx="40" cy="40" r="24" style="stroke:#000000; fill:#ffffff"/>
+</svg>
diff --git a/tests/roots/test-ext-imgmockconverter/1/svgimg.svg b/tests/roots/test-ext-imgmockconverter/1/svgimg.svg
new file mode 100644
index 0000000..981e301
--- /dev/null
+++ b/tests/roots/test-ext-imgmockconverter/1/svgimg.svg
@@ -0,0 +1,3 @@
+<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="50" cy="50" r="50" />
+</svg>
diff --git a/tests/roots/test-ext-imgmockconverter/2/svgimg.svg b/tests/roots/test-ext-imgmockconverter/2/svgimg.svg
new file mode 100644
index 0000000..2bae0b9
--- /dev/null
+++ b/tests/roots/test-ext-imgmockconverter/2/svgimg.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="60" width="60">
+ <circle cx="40" cy="40" r="24" style="stroke:#000000; fill:#ffffff"/>
+</svg>
diff --git a/tests/roots/test-ext-imgmockconverter/conf.py b/tests/roots/test-ext-imgmockconverter/conf.py
new file mode 100644
index 0000000..679bb5a
--- /dev/null
+++ b/tests/roots/test-ext-imgmockconverter/conf.py
@@ -0,0 +1,5 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+extensions = ['mocksvgconverter']
diff --git a/tests/roots/test-ext-imgmockconverter/index.rst b/tests/roots/test-ext-imgmockconverter/index.rst
new file mode 100644
index 0000000..bc665f6
--- /dev/null
+++ b/tests/roots/test-ext-imgmockconverter/index.rst
@@ -0,0 +1,6 @@
+test-ext-imgconverter
+=====================
+
+.. image:: ./1/svgimg.svg
+.. image:: ./2/svgimg.svg
+
diff --git a/tests/roots/test-ext-imgmockconverter/mocksvgconverter.py b/tests/roots/test-ext-imgmockconverter/mocksvgconverter.py
new file mode 100644
index 0000000..43368de
--- /dev/null
+++ b/tests/roots/test-ext-imgmockconverter/mocksvgconverter.py
@@ -0,0 +1,39 @@
+"""
+ Does foo.svg --> foo.pdf with no change to the file.
+"""
+
+import shutil
+
+from sphinx.transforms.post_transforms.images import ImageConverter
+
+if False:
+ # For type annotation
+ from typing import Any, Dict # NOQA
+
+ from sphinx.application import Sphinx # NOQA
+
+class MyConverter(ImageConverter):
+ conversion_rules = [
+ ('image/svg+xml', 'application/pdf'),
+ ]
+
+ def is_available(self):
+ # type: () -> bool
+ return True
+
+ def convert(self, _from, _to):
+ # type: (unicode, unicode) -> bool
+ """Mock converts the image from SVG to PDF."""
+ shutil.copyfile(_from, _to)
+ return True
+
+
+def setup(app):
+ # type: (Sphinx) -> Dict[unicode, Any]
+ app.add_post_transform(MyConverter)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/tests/roots/test-ext-inheritance_diagram/conf.py b/tests/roots/test-ext-inheritance_diagram/conf.py
new file mode 100644
index 0000000..d3778d5
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/conf.py
@@ -0,0 +1,6 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.inheritance_diagram', 'sphinx.ext.intersphinx']
diff --git a/tests/roots/test-ext-inheritance_diagram/example/__init__.py b/tests/roots/test-ext-inheritance_diagram/example/__init__.py
new file mode 100644
index 0000000..2f85c08
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/example/__init__.py
@@ -0,0 +1 @@
+# example.py
diff --git a/tests/roots/test-ext-inheritance_diagram/example/sphinx.py b/tests/roots/test-ext-inheritance_diagram/example/sphinx.py
new file mode 100644
index 0000000..2bfbf4c
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/example/sphinx.py
@@ -0,0 +1,5 @@
+# example.sphinx
+
+
+class DummyClass:
+ pass
diff --git a/tests/roots/test-ext-inheritance_diagram/external/other.py b/tests/roots/test-ext-inheritance_diagram/external/other.py
new file mode 100644
index 0000000..a4ce8a7
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/external/other.py
@@ -0,0 +1,5 @@
+from test import Alice
+
+
+class Bob(Alice):
+ pass
diff --git a/tests/roots/test-ext-inheritance_diagram/index.rst b/tests/roots/test-ext-inheritance_diagram/index.rst
new file mode 100644
index 0000000..e694fb0
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/index.rst
@@ -0,0 +1,18 @@
+============================
+test-ext-inheritance_diagram
+============================
+
+.. inheritance-diagram:: test.Foo
+
+.. inheritance-diagram:: test.Foo
+ :caption: Test Foo!
+
+.. inheritance-diagram:: test.DocSubDir2
+
+.. py:class:: test.DocHere
+
+.. py:class:: test.DocMainLevel
+
+.. inheritance-diagram:: external.other.Bob
+
+.. py:class:: test.Alice
diff --git a/tests/roots/test-ext-inheritance_diagram/subdir/page1.rst b/tests/roots/test-ext-inheritance_diagram/subdir/page1.rst
new file mode 100644
index 0000000..3001b02
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/subdir/page1.rst
@@ -0,0 +1,9 @@
+================================================
+test-ext-inheritance_diagram subdirectory page 1
+================================================
+
+.. inheritance-diagram:: test.DocMainLevel
+
+.. inheritance-diagram:: test.DocSubDir2
+
+.. py:class:: test.DocSubDir1
diff --git a/tests/roots/test-ext-inheritance_diagram/subdir/page2.rst b/tests/roots/test-ext-inheritance_diagram/subdir/page2.rst
new file mode 100644
index 0000000..720e2d8
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/subdir/page2.rst
@@ -0,0 +1,5 @@
+================================================
+test-ext-inheritance_diagram subdirectory page 2
+================================================
+
+.. py:class:: test.DocSubDir2
diff --git a/tests/roots/test-ext-inheritance_diagram/test.py b/tests/roots/test-ext-inheritance_diagram/test.py
new file mode 100644
index 0000000..efb1c2a
--- /dev/null
+++ b/tests/roots/test-ext-inheritance_diagram/test.py
@@ -0,0 +1,22 @@
+class Foo:
+ pass
+
+
+class DocHere(Foo):
+ pass
+
+
+class DocSubDir1(DocHere):
+ pass
+
+
+class DocSubDir2(DocSubDir1):
+ pass
+
+
+class DocMainLevel(Foo):
+ pass
+
+
+class Alice(object):
+ pass
diff --git a/tests/roots/test-ext-intersphinx-cppdomain/conf.py b/tests/roots/test-ext-intersphinx-cppdomain/conf.py
new file mode 100644
index 0000000..9485eb2
--- /dev/null
+++ b/tests/roots/test-ext-intersphinx-cppdomain/conf.py
@@ -0,0 +1 @@
+extensions = ['sphinx.ext.intersphinx']
diff --git a/tests/roots/test-ext-intersphinx-cppdomain/index.rst b/tests/roots/test-ext-intersphinx-cppdomain/index.rst
new file mode 100644
index 0000000..bf67d52
--- /dev/null
+++ b/tests/roots/test-ext-intersphinx-cppdomain/index.rst
@@ -0,0 +1,8 @@
+test-ext-intersphinx-cppdomain
+==============================
+
+.. cpp:namespace:: foo
+
+:cpp:class:`Bar`
+
+.. cpp:function:: foons::bartype FooBarBaz()
diff --git a/tests/roots/test-ext-intersphinx-role/conf.py b/tests/roots/test-ext-intersphinx-role/conf.py
new file mode 100644
index 0000000..a54f5c2
--- /dev/null
+++ b/tests/roots/test-ext-intersphinx-role/conf.py
@@ -0,0 +1,3 @@
+extensions = ['sphinx.ext.intersphinx']
+# the role should not honor this conf var
+intersphinx_disabled_reftypes = ['*']
diff --git a/tests/roots/test-ext-intersphinx-role/index.rst b/tests/roots/test-ext-intersphinx-role/index.rst
new file mode 100644
index 0000000..58edb7a
--- /dev/null
+++ b/tests/roots/test-ext-intersphinx-role/index.rst
@@ -0,0 +1,44 @@
+- ``module1`` is only defined in ``inv``:
+ :external:py:mod:`module1`
+
+.. py:module:: module2
+
+- ``module2`` is defined here and also in ``inv``, but should resolve to inv:
+ :external:py:mod:`module2`
+
+- ``module3`` is not defined anywhere, so should warn:
+ :external:py:mod:`module3`
+
+.. py:module:: module10
+
+- ``module10`` is only defined here, but should still not be resolved to:
+ :external:py:mod:`module10`
+
+- a function in inv:
+ :external:py:func:`module1.func`
+- a method, but with old style inventory prefix, which shouldn't work:
+ :external:py:meth:`inv:Foo.bar`
+- a non-existing role:
+ :external:py:nope:`something`
+
+.. default-domain:: cpp
+
+- a type where the default domain is used to find the role:
+ :external:type:`std::uint8_t`
+- a non-existing role in default domain:
+ :external:nope:`somethingElse`
+
+- two roles in ``std`` which can be found without a default domain:
+
+ - :external:doc:`docname`
+ - :external:option:`ls -l`
+
+
+- a function with explicit inventory:
+ :external+inv:c:func:`CFunc`
+- a class with explicit non-existing inventory, which also has upper-case in name:
+ :external+invNope:cpp:class:`foo::Bar`
+
+
+- explicit title:
+ :external:cpp:type:`FoonsTitle <foons>`
diff --git a/tests/roots/test-ext-math-compat/conf.py b/tests/roots/test-ext-math-compat/conf.py
new file mode 100644
index 0000000..85e3950
--- /dev/null
+++ b/tests/roots/test-ext-math-compat/conf.py
@@ -0,0 +1,20 @@
+from docutils import nodes
+from docutils.parsers.rst import Directive
+
+extensions = ['sphinx.ext.mathjax']
+
+
+def my_math_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
+ text = 'E = mc^2'
+ return [nodes.math(text, text)], []
+
+
+class MyMathDirective(Directive):
+ def run(self):
+ text = 'E = mc^2'
+ return [nodes.math_block(text, text)]
+
+
+def setup(app):
+ app.add_role('my_math', my_math_role)
+ app.add_directive('my-math', MyMathDirective)
diff --git a/tests/roots/test-ext-math-compat/index.rst b/tests/roots/test-ext-math-compat/index.rst
new file mode 100644
index 0000000..208878c
--- /dev/null
+++ b/tests/roots/test-ext-math-compat/index.rst
@@ -0,0 +1,21 @@
+Test Math
+=========
+
+inline
+------
+
+Inline: :math:`E=mc^2`
+Inline my math: :my_math:`:-)`
+
+block
+-----
+
+.. math:: a^2+b^2=c^2
+
+Second math
+
+.. math:: e^{i\pi}+1=0
+
+Multi math equations
+
+.. my-math::
diff --git a/tests/roots/test-ext-math-simple/conf.py b/tests/roots/test-ext-math-simple/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-math-simple/conf.py
diff --git a/tests/roots/test-ext-math-simple/index.rst b/tests/roots/test-ext-math-simple/index.rst
new file mode 100644
index 0000000..a455d89
--- /dev/null
+++ b/tests/roots/test-ext-math-simple/index.rst
@@ -0,0 +1,4 @@
+Test Math
+=========
+
+.. math:: a^2+b^2=c^2
diff --git a/tests/roots/test-ext-math/conf.py b/tests/roots/test-ext-math/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-math/conf.py
diff --git a/tests/roots/test-ext-math/index.rst b/tests/roots/test-ext-math/index.rst
new file mode 100644
index 0000000..221284a
--- /dev/null
+++ b/tests/roots/test-ext-math/index.rst
@@ -0,0 +1,25 @@
+Test Math
+=========
+
+.. toctree::
+ :numbered: 1
+
+ math
+ page
+ nomath
+
+.. math:: a^2+b^2=c^2
+
+Inline :math:`E=mc^2`
+
+Second math
+
+.. math:: e^{i\pi}+1=0
+
+Multi math equations
+
+.. math::
+
+ S &= \pi r^2
+
+ V &= \frac{4}{3} \pi r^3
diff --git a/tests/roots/test-ext-math/math.rst b/tests/roots/test-ext-math/math.rst
new file mode 100644
index 0000000..c05c3a0
--- /dev/null
+++ b/tests/roots/test-ext-math/math.rst
@@ -0,0 +1,31 @@
+Test math extensions :math:`E = m c^2`
+======================================
+
+This is inline math: :math:`a^2 + b^2 = c^2`.
+
+.. math:: a^2 + b^2 = c^2
+
+.. math::
+
+ a + 1 < b
+
+.. math::
+ :label: foo
+
+ e^{i\pi} = 1
+
+.. math::
+ :label:
+
+ e^{ix} = \cos x + i\sin x
+
+.. math::
+
+ n \in \mathbb N
+
+.. math::
+ :nowrap:
+
+ a + 1 < b
+
+Referencing equation :eq:`foo` and :math:numref:`foo`.
diff --git a/tests/roots/test-ext-math/nomath.rst b/tests/roots/test-ext-math/nomath.rst
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-math/nomath.rst
diff --git a/tests/roots/test-ext-math/page.rst b/tests/roots/test-ext-math/page.rst
new file mode 100644
index 0000000..ef80409
--- /dev/null
+++ b/tests/roots/test-ext-math/page.rst
@@ -0,0 +1,9 @@
+Test multiple pages
+===================
+
+.. math::
+ :label: bar
+
+ a = b + 1
+
+Referencing equations :eq:`foo` and :eq:`bar`.
diff --git a/tests/roots/test-ext-napoleon/conf.py b/tests/roots/test-ext-napoleon/conf.py
new file mode 100644
index 0000000..502fb5a
--- /dev/null
+++ b/tests/roots/test-ext-napoleon/conf.py
@@ -0,0 +1,5 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+extensions = ['sphinx.ext.napoleon']
diff --git a/tests/roots/test-ext-napoleon/index.rst b/tests/roots/test-ext-napoleon/index.rst
new file mode 100644
index 0000000..4c013b7
--- /dev/null
+++ b/tests/roots/test-ext-napoleon/index.rst
@@ -0,0 +1,6 @@
+test-ext-napoleon
+=================
+
+.. toctree::
+
+ typehints
diff --git a/tests/roots/test-ext-napoleon/mypackage/__init__.py b/tests/roots/test-ext-napoleon/mypackage/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-ext-napoleon/mypackage/__init__.py
diff --git a/tests/roots/test-ext-napoleon/mypackage/typehints.py b/tests/roots/test-ext-napoleon/mypackage/typehints.py
new file mode 100644
index 0000000..526b78e
--- /dev/null
+++ b/tests/roots/test-ext-napoleon/mypackage/typehints.py
@@ -0,0 +1,11 @@
+def hello(x: int, *args: int, **kwargs: int) -> None:
+ """
+ Parameters
+ ----------
+ x
+ X
+ *args
+ Additional arguments.
+ **kwargs
+ Extra arguments.
+ """
diff --git a/tests/roots/test-ext-napoleon/typehints.rst b/tests/roots/test-ext-napoleon/typehints.rst
new file mode 100644
index 0000000..43c61f6
--- /dev/null
+++ b/tests/roots/test-ext-napoleon/typehints.rst
@@ -0,0 +1,5 @@
+typehints
+=========
+
+.. automodule:: mypackage.typehints
+ :members:
diff --git a/tests/roots/test-ext-todo/bar.rst b/tests/roots/test-ext-todo/bar.rst
new file mode 100644
index 0000000..6804a68
--- /dev/null
+++ b/tests/roots/test-ext-todo/bar.rst
@@ -0,0 +1,4 @@
+bar
+===
+
+.. todo:: todo in bar
diff --git a/tests/roots/test-ext-todo/conf.py b/tests/roots/test-ext-todo/conf.py
new file mode 100644
index 0000000..64b749e
--- /dev/null
+++ b/tests/roots/test-ext-todo/conf.py
@@ -0,0 +1 @@
+extensions = ['sphinx.ext.todo']
diff --git a/tests/roots/test-ext-todo/foo.rst b/tests/roots/test-ext-todo/foo.rst
new file mode 100644
index 0000000..12e9f63
--- /dev/null
+++ b/tests/roots/test-ext-todo/foo.rst
@@ -0,0 +1,10 @@
+foo
+===
+
+.. todo:: todo in foo
+
+.. py:function:: hello()
+
+ :param bug: #5800
+
+ .. todo:: todo in param field
diff --git a/tests/roots/test-ext-todo/index.rst b/tests/roots/test-ext-todo/index.rst
new file mode 100644
index 0000000..781473d
--- /dev/null
+++ b/tests/roots/test-ext-todo/index.rst
@@ -0,0 +1,11 @@
+test for sphinx.ext.todo
+========================
+
+.. toctree::
+
+ foo
+ bar
+
+.. todolist::
+
+.. todolist::
diff --git a/tests/roots/test-ext-viewcode-find/conf.py b/tests/roots/test-ext-viewcode-find/conf.py
new file mode 100644
index 0000000..18f97f4
--- /dev/null
+++ b/tests/roots/test-ext-viewcode-find/conf.py
@@ -0,0 +1,3 @@
+extensions = ['sphinx.ext.viewcode']
+exclude_patterns = ['_build']
+viewcode_follow_imported_members = False
diff --git a/tests/roots/test-ext-viewcode-find/index.rst b/tests/roots/test-ext-viewcode-find/index.rst
new file mode 100644
index 0000000..7eb416a
--- /dev/null
+++ b/tests/roots/test-ext-viewcode-find/index.rst
@@ -0,0 +1,38 @@
+viewcode
+========
+
+.. py:module:: not_a_package
+
+.. py:function:: func1(a, b)
+
+ This is func1
+
+.. py:function:: not_a_package.submodule.func1(a, b)
+
+ This is func1
+
+.. py:module:: not_a_package.submodule
+
+.. py:class:: Class1
+
+ This is Class1
+
+.. py:class:: Class3
+
+ This is Class3
+
+.. py:class:: not_a_package.submodule.Class1
+
+ This is Class1
+
+.. literalinclude:: not_a_package/__init__.py
+ :language: python
+ :pyobject: func1
+
+.. literalinclude:: not_a_package/submodule.py
+ :language: python
+ :pyobject: func1
+
+.. py:attribute:: not_a_package.submodule.Class3.class_attr
+
+ This is the class attribute class_attr
diff --git a/tests/roots/test-ext-viewcode-find/not_a_package/__init__.py b/tests/roots/test-ext-viewcode-find/not_a_package/__init__.py
new file mode 100644
index 0000000..2382935
--- /dev/null
+++ b/tests/roots/test-ext-viewcode-find/not_a_package/__init__.py
@@ -0,0 +1 @@
+from .submodule import Class1, func1
diff --git a/tests/roots/test-ext-viewcode-find/not_a_package/submodule.py b/tests/roots/test-ext-viewcode-find/not_a_package/submodule.py
new file mode 100644
index 0000000..ba8be78
--- /dev/null
+++ b/tests/roots/test-ext-viewcode-find/not_a_package/submodule.py
@@ -0,0 +1,31 @@
+"""
+submodule
+"""
+raise RuntimeError('This module should not get imported')
+
+
+def decorator(f):
+ return f
+
+
+@decorator
+def func1(a, b):
+ """
+ this is func1
+ """
+ return a, b
+
+
+@decorator
+class Class1:
+ """
+ this is Class1
+ """
+
+
+class Class3:
+ """
+ this is Class3
+ """
+ class_attr = 42
+ """this is the class attribute class_attr"""
diff --git a/tests/roots/test-ext-viewcode/conf.py b/tests/roots/test-ext-viewcode/conf.py
new file mode 100644
index 0000000..5e07214
--- /dev/null
+++ b/tests/roots/test-ext-viewcode/conf.py
@@ -0,0 +1,24 @@
+import os
+import sys
+
+source_dir = os.path.abspath('.')
+if source_dir not in sys.path:
+ sys.path.insert(0, source_dir)
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
+exclude_patterns = ['_build']
+
+
+if 'test_linkcode' in tags:
+ extensions.remove('sphinx.ext.viewcode')
+ extensions.append('sphinx.ext.linkcode')
+
+ def linkcode_resolve(domain, info):
+ if domain == 'py':
+ fn = info['module'].replace('.', '/')
+ return "http://foobar/source/%s.py" % fn
+ elif domain == "js":
+ return "http://foobar/js/" + info['fullname']
+ elif domain in ("c", "cpp"):
+ return f"http://foobar/{domain}/{''.join(info['names'])}"
+ else:
+ raise AssertionError()
diff --git a/tests/roots/test-ext-viewcode/index.rst b/tests/roots/test-ext-viewcode/index.rst
new file mode 100644
index 0000000..e7956e7
--- /dev/null
+++ b/tests/roots/test-ext-viewcode/index.rst
@@ -0,0 +1,39 @@
+viewcode
+========
+
+.. py:module:: spam
+
+.. autofunction:: func1
+
+.. autofunction:: func2
+
+.. autofunction:: spam.mod1.func1
+
+.. autofunction:: spam.mod2.func2
+
+.. autofunction:: Class1
+
+.. autofunction:: Class2
+
+.. autofunction:: spam.mod1.Class1
+
+.. autofunction:: spam.mod2.Class2
+
+
+.. literalinclude:: spam/__init__.py
+ :language: python
+ :pyobject: func1
+
+.. literalinclude:: spam/mod1.py
+ :language: python
+ :pyobject: func1
+
+.. autoclass:: spam.mod3.Class3
+ :members:
+
+.. automodule:: spam.mod3
+ :members:
+
+.. toctree::
+
+ objects
diff --git a/tests/roots/test-ext-viewcode/objects.rst b/tests/roots/test-ext-viewcode/objects.rst
new file mode 100644
index 0000000..114adbf
--- /dev/null
+++ b/tests/roots/test-ext-viewcode/objects.rst
@@ -0,0 +1,169 @@
+Testing object descriptions
+===========================
+
+.. function:: func_without_module(a, b, *c[, d])
+
+ Does something.
+
+.. function:: func_without_body()
+
+.. function:: func_noindex
+ :no-index:
+
+.. function:: func_with_module
+ :module: foolib
+
+Referring to :func:`func with no index <func_noindex>`.
+Referring to :func:`nothing <>`.
+
+.. module:: mod
+ :synopsis: Module synopsis.
+ :platform: UNIX
+
+.. function:: func_in_module
+
+.. class:: Cls
+
+ .. method:: meth1
+
+ .. staticmethod:: meths
+
+ .. attribute:: attr
+
+.. explicit class given
+.. method:: Cls.meth2
+
+.. explicit module given
+.. exception:: Error(arg1, arg2)
+ :module: errmod
+
+.. data:: var
+
+
+.. currentmodule:: None
+
+.. function:: func_without_module2() -> annotation
+
+.. object:: long(parameter, \
+ list)
+ another one
+
+.. class:: TimeInt
+
+ Has only one parameter (triggers special behavior...)
+
+ :param moo: |test|
+ :type moo: |test|
+
+.. |test| replace:: Moo
+
+.. class:: Time(hour, minute, isdst)
+
+ :param year: The year.
+ :type year: TimeInt
+ :param TimeInt minute: The minute.
+ :param isdst: whether it's DST
+ :type isdst: * some complex
+ * expression
+ :returns: a new :class:`Time` instance
+ :rtype: :class:`Time`
+ :raises ValueError: if the values are out of range
+ :ivar int hour: like *hour*
+ :ivar minute: like *minute*
+ :vartype minute: int
+ :param hour: Some parameter
+ :type hour: DuplicateType
+ :param hour: Duplicate param. Should not lead to crashes.
+ :type hour: DuplicateType
+ :param .Cls extcls: A class from another module.
+
+
+C items
+=======
+
+.. c:function:: Sphinx_DoSomething()
+
+.. c:member:: SphinxStruct.member
+
+.. c:macro:: SPHINX_USE_PYTHON
+
+.. c:type:: SphinxType
+
+.. c:var:: sphinx_global
+
+
+Javascript items
+================
+
+.. js:function:: foo()
+
+.. js:data:: bar
+
+.. documenting the method of any object
+.. js:function:: bar.baz(href, callback[, errback])
+
+ :param string href: The location of the resource.
+ :param callback: Gets called with the data returned by the resource.
+ :throws InvalidHref: If the `href` is invalid.
+ :returns: `undefined`
+
+.. js:attribute:: bar.spam
+
+References
+==========
+
+Referencing :class:`mod.Cls` or :Class:`mod.Cls` should be the same.
+
+With target: :c:func:`Sphinx_DoSomething()` (parentheses are handled),
+:c:member:`SphinxStruct.member`, :c:macro:`SPHINX_USE_PYTHON`,
+:c:type:`SphinxType *` (pointer is handled), :c:data:`sphinx_global`.
+
+Without target: :c:func:`CFunction`. :c:func:`!malloc`.
+
+:js:func:`foo()`
+:js:func:`foo`
+
+:js:data:`bar`
+:js:func:`bar.baz()`
+:js:func:`bar.baz`
+:js:func:`~bar.baz()`
+
+:js:attr:`bar.baz`
+
+
+Others
+======
+
+.. envvar:: HOME
+
+.. program:: python
+
+.. cmdoption:: -c command
+
+.. program:: perl
+
+.. cmdoption:: -c
+
+.. option:: +p
+
+Link to :option:`perl +p`.
+
+
+User markup
+===========
+
+.. userdesc:: myobj:parameter
+
+ Description of userdesc.
+
+
+Referencing :userdescrole:`myobj`.
+
+
+CPP domain
+==========
+
+.. cpp:class:: n::Array<T,d>
+
+ .. cpp:function:: T& operator[]( unsigned j )
+ const T& operator[]( unsigned j ) const
diff --git a/tests/roots/test-ext-viewcode/spam/__init__.py b/tests/roots/test-ext-viewcode/spam/__init__.py
new file mode 100644
index 0000000..6219042
--- /dev/null
+++ b/tests/roots/test-ext-viewcode/spam/__init__.py
@@ -0,0 +1,2 @@
+from .mod1 import Class1, func1
+from .mod2 import Class2, func2
diff --git a/tests/roots/test-ext-viewcode/spam/mod1.py b/tests/roots/test-ext-viewcode/spam/mod1.py
new file mode 100644
index 0000000..a078328
--- /dev/null
+++ b/tests/roots/test-ext-viewcode/spam/mod1.py
@@ -0,0 +1,30 @@
+"""
+mod1
+"""
+
+
+def decorator(f):
+ return f
+
+
+@decorator
+def func1(a, b):
+ """
+ this is func1
+ """
+ return a, b
+
+
+@decorator
+class Class1:
+ """
+ this is Class1
+ """
+
+
+class Class3:
+ """
+ this is Class3
+ """
+ class_attr = 42
+ """this is the class attribute class_attr"""
diff --git a/tests/roots/test-ext-viewcode/spam/mod2.py b/tests/roots/test-ext-viewcode/spam/mod2.py
new file mode 100644
index 0000000..72cb089
--- /dev/null
+++ b/tests/roots/test-ext-viewcode/spam/mod2.py
@@ -0,0 +1,22 @@
+"""
+mod2
+"""
+
+
+def decorator(f):
+ return f
+
+
+@decorator
+def func2(a, b):
+ """
+ this is func2
+ """
+ return a, b
+
+
+@decorator
+class Class2:
+ """
+ this is Class2
+ """
diff --git a/tests/roots/test-ext-viewcode/spam/mod3.py b/tests/roots/test-ext-viewcode/spam/mod3.py
new file mode 100644
index 0000000..812c9b5
--- /dev/null
+++ b/tests/roots/test-ext-viewcode/spam/mod3.py
@@ -0,0 +1,3 @@
+from spam.mod1 import Class3
+
+__all__ = ('Class3',)
diff --git a/tests/roots/test-extensions/conf.py b/tests/roots/test-extensions/conf.py
new file mode 100644
index 0000000..9a3cbc8
--- /dev/null
+++ b/tests/roots/test-extensions/conf.py
@@ -0,0 +1,4 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
diff --git a/tests/roots/test-extensions/read_parallel.py b/tests/roots/test-extensions/read_parallel.py
new file mode 100644
index 0000000..a3e052f
--- /dev/null
+++ b/tests/roots/test-extensions/read_parallel.py
@@ -0,0 +1,4 @@
+def setup(app):
+ return {
+ 'parallel_read_safe': True
+ }
diff --git a/tests/roots/test-extensions/read_serial.py b/tests/roots/test-extensions/read_serial.py
new file mode 100644
index 0000000..c55570a
--- /dev/null
+++ b/tests/roots/test-extensions/read_serial.py
@@ -0,0 +1,4 @@
+def setup(app):
+ return {
+ 'parallel_read_safe': False
+ }
diff --git a/tests/roots/test-extensions/write_parallel.py b/tests/roots/test-extensions/write_parallel.py
new file mode 100644
index 0000000..ebc48ef
--- /dev/null
+++ b/tests/roots/test-extensions/write_parallel.py
@@ -0,0 +1,4 @@
+def setup(app):
+ return {
+ 'parallel_write_safe': True,
+ }
diff --git a/tests/roots/test-extensions/write_serial.py b/tests/roots/test-extensions/write_serial.py
new file mode 100644
index 0000000..75494ce
--- /dev/null
+++ b/tests/roots/test-extensions/write_serial.py
@@ -0,0 +1,4 @@
+def setup(app):
+ return {
+ 'parallel_write_safe': False
+ }
diff --git a/tests/roots/test-footnotes/bar.rst b/tests/roots/test-footnotes/bar.rst
new file mode 100644
index 0000000..660c663
--- /dev/null
+++ b/tests/roots/test-footnotes/bar.rst
@@ -0,0 +1,6 @@
+bar
+===
+
+Same footnote number [1]_ in bar.rst
+
+.. [1] footnote in bar
diff --git a/tests/roots/test-footnotes/baz.rst b/tests/roots/test-footnotes/baz.rst
new file mode 100644
index 0000000..af496c5
--- /dev/null
+++ b/tests/roots/test-footnotes/baz.rst
@@ -0,0 +1,6 @@
+baz
+===
+
+Auto footnote number [#]_ in baz.rst
+
+.. [#] footnote in baz
diff --git a/tests/roots/test-footnotes/conf.py b/tests/roots/test-footnotes/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-footnotes/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-footnotes/index.rst b/tests/roots/test-footnotes/index.rst
new file mode 100644
index 0000000..f2c5d0e
--- /dev/null
+++ b/tests/roots/test-footnotes/index.rst
@@ -0,0 +1,188 @@
+===============
+test-footenotes
+===============
+
+.. toctree::
+
+ bar
+ baz
+
+.. contents::
+ :local:
+
+The section with a reference to [AuthorYear]_
+=============================================
+
+.. figure:: rimg.png
+
+ This is the figure caption with a reference to [AuthorYear]_.
+
+.. list-table:: The table title with a reference to [AuthorYear]_
+ :header-rows: 1
+
+ * - Header1
+ - Header2
+ * - Content
+ - Content
+
+.. rubric:: The rubric title with a reference to [AuthorYear]_
+
+.. [#] First
+
+* First footnote: [#]_
+* Second footnote: [1]_
+* `Sphinx <http://sphinx-doc.org/>`_
+* Third footnote: [#]_
+* Fourth footnote: [#named]_
+* `URL including tilde <http://sphinx-doc.org/~test/>`_
+* GitHub Page: `https://github.com/sphinx-doc/sphinx <https://github.com/sphinx-doc/sphinx>`_
+* Mailing list: `sphinx-dev@googlegroups.com <mailto:sphinx-dev@googlegroups.com>`_
+
+.. [AuthorYear] Author, Title, Year
+.. [1] Second
+.. [#] Third [#]_
+.. [#] Footnote inside footnote
+.. [#named] Fourth
+
+The section with a reference to [#]_
+=====================================
+
+.. [#] Footnote in section
+
+`URL in term <http://sphinx-doc.org/>`_
+ Description Description Description ...
+
+Footnote in term [#]_
+ Description Description Description ...
+
+ `Term in deflist <http://sphinx-doc.org/>`_
+ Description2
+
+.. [#] Footnote in term
+
+.. figure:: rimg.png
+
+ This is the figure caption with a footnote to [#]_.
+
+.. [#] Footnote in caption
+
+.. list-table:: footnote [#]_ in caption of normal table
+ :widths: 1 1
+ :header-rows: 1
+
+ * - name
+ - desc
+ * - a
+ - b
+ * - a
+ - b
+
+.. [#] Foot note in table
+
+.. list-table:: footnote [#]_ in caption [#]_ of longtable
+ :widths: 1 1
+ :header-rows: 1
+
+ * - name
+ - desc
+ * - This is a reference to the code-block in the footnote:
+ :ref:`codeblockinfootnote`
+ - This is one more footnote with some code in it [#]_.
+ * - This is a reference to the other code block:
+ :ref:`codeblockinanotherfootnote`
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+ * - a
+ - b
+
+.. [#] Foot note in longtable
+
+.. [#] Second footnote in caption of longtable
+
+ .. code-block:: python
+ :caption: I am in a footnote
+ :name: codeblockinfootnote
+
+ def foo(x,y):
+ return x+y
+
+.. [#] Third footnote in longtable
+
+ .. code-block:: python
+ :caption: I am also in a footnote
+ :name: codeblockinanotherfootnote
+
+ def bar(x,y):
+ return x+y
+
+The section with an object description
+======================================
+
+.. py:function:: dummy(N)
+ :no-index:
+
+Footnotes referred twice
+========================
+
+* Explicitly numbered footnote: [100]_ [100]_
+* Named footnote: [#twice]_ [#twice]_
+
+.. [100] Numbered footnote
+.. [#twice] Named footnote
diff --git a/tests/roots/test-footnotes/rimg.png b/tests/roots/test-footnotes/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-footnotes/rimg.png
Binary files differ
diff --git a/tests/roots/test-gettext-template/_templates/template1.html b/tests/roots/test-gettext-template/_templates/template1.html
new file mode 100644
index 0000000..f4b49f1
--- /dev/null
+++ b/tests/roots/test-gettext-template/_templates/template1.html
@@ -0,0 +1,5 @@
+{% extends "layout.html" %}
+{% block body %}
+ <h1>{{ _('Template 1') }}</h1>
+ <p>{%trans%}This is Template 1.{%endtrans%}</p>
+{% endblock %}
diff --git a/tests/roots/test-gettext-template/_templates/template2.html b/tests/roots/test-gettext-template/_templates/template2.html
new file mode 100644
index 0000000..2a21069
--- /dev/null
+++ b/tests/roots/test-gettext-template/_templates/template2.html
@@ -0,0 +1,5 @@
+{% extends "layout.html" %}
+{% block body %}
+ <h1>{{ _('Template 2') }}</h1>
+ <p>{%trans%}This is Template 2.{%endtrans%}</p>
+{% endblock %}
diff --git a/tests/roots/test-gettext-template/conf.py b/tests/roots/test-gettext-template/conf.py
new file mode 100644
index 0000000..3f793b7
--- /dev/null
+++ b/tests/roots/test-gettext-template/conf.py
@@ -0,0 +1 @@
+templates_path = ['_templates']
diff --git a/tests/roots/test-gettext-template/index.rst b/tests/roots/test-gettext-template/index.rst
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-gettext-template/index.rst
diff --git a/tests/roots/test-glossary/conf.py b/tests/roots/test-glossary/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-glossary/conf.py
diff --git a/tests/roots/test-glossary/index.rst b/tests/roots/test-glossary/index.rst
new file mode 100644
index 0000000..1d84a02
--- /dev/null
+++ b/tests/roots/test-glossary/index.rst
@@ -0,0 +1,22 @@
+test-glossary
+=============
+
+.. glossary::
+ :sorted:
+
+ boson
+ Particle with integer spin.
+
+ *fermion*
+ Particle with half-integer spin.
+
+ tauon
+ myon
+ electron
+ Examples for fermions.
+
+ über
+ Gewisse
+
+ ähnlich
+ Dinge
diff --git a/tests/roots/test-highlight_options/conf.py b/tests/roots/test-highlight_options/conf.py
new file mode 100644
index 0000000..90997d4
--- /dev/null
+++ b/tests/roots/test-highlight_options/conf.py
@@ -0,0 +1,4 @@
+highlight_options = {
+ 'default': {'default_option': True},
+ 'python': {'python_option': True}
+}
diff --git a/tests/roots/test-highlight_options/index.rst b/tests/roots/test-highlight_options/index.rst
new file mode 100644
index 0000000..389041a
--- /dev/null
+++ b/tests/roots/test-highlight_options/index.rst
@@ -0,0 +1,14 @@
+test-highlight_options
+======================
+
+.. code-block::
+
+ blah blah blah
+
+.. code-block:: python
+
+ blah blah blah
+
+.. code-block:: java
+
+ blah blah blah
diff --git a/tests/roots/test-html_assets/conf.py b/tests/roots/test-html_assets/conf.py
new file mode 100644
index 0000000..7f94bbb
--- /dev/null
+++ b/tests/roots/test-html_assets/conf.py
@@ -0,0 +1,12 @@
+project = 'Sphinx'
+version = '1.4.4'
+
+html_static_path = ['static', 'subdir']
+html_extra_path = ['extra', 'subdir']
+html_css_files = ['css/style.css',
+ ('https://example.com/custom.css',
+ {'title': 'title', 'media': 'print', 'priority': 400})]
+html_js_files = ['js/custom.js',
+ ('https://example.com/script.js',
+ {'async': 'async', 'priority': 400})]
+exclude_patterns = ['**/_build', '**/.htpasswd']
diff --git a/tests/roots/test-html_assets/extra/.htaccess b/tests/roots/test-html_assets/extra/.htaccess
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/.htaccess
diff --git a/tests/roots/test-html_assets/extra/.htpasswd b/tests/roots/test-html_assets/extra/.htpasswd
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/.htpasswd
diff --git a/tests/roots/test-html_assets/extra/API.html_t b/tests/roots/test-html_assets/extra/API.html_t
new file mode 100644
index 0000000..34ecd9d
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/API.html_t
@@ -0,0 +1 @@
+{{ project }}-{{ version }}
diff --git a/tests/roots/test-html_assets/extra/css/style.css b/tests/roots/test-html_assets/extra/css/style.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/css/style.css
diff --git a/tests/roots/test-html_assets/extra/index.rst b/tests/roots/test-html_assets/extra/index.rst
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/index.rst
diff --git a/tests/roots/test-html_assets/extra/rimg.png b/tests/roots/test-html_assets/extra/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/rimg.png
Binary files differ
diff --git a/tests/roots/test-html_assets/extra/subdir/.htaccess b/tests/roots/test-html_assets/extra/subdir/.htaccess
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/subdir/.htaccess
diff --git a/tests/roots/test-html_assets/extra/subdir/.htpasswd b/tests/roots/test-html_assets/extra/subdir/.htpasswd
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/extra/subdir/.htpasswd
diff --git a/tests/roots/test-html_assets/index.rst b/tests/roots/test-html_assets/index.rst
new file mode 100644
index 0000000..6d56194
--- /dev/null
+++ b/tests/roots/test-html_assets/index.rst
@@ -0,0 +1,3 @@
+test-html_extra_path
+=====================
+this is dummy content
diff --git a/tests/roots/test-html_assets/static/.htaccess b/tests/roots/test-html_assets/static/.htaccess
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/static/.htaccess
diff --git a/tests/roots/test-html_assets/static/.htpasswd b/tests/roots/test-html_assets/static/.htpasswd
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/static/.htpasswd
diff --git a/tests/roots/test-html_assets/static/API.html_t b/tests/roots/test-html_assets/static/API.html_t
new file mode 100644
index 0000000..34ecd9d
--- /dev/null
+++ b/tests/roots/test-html_assets/static/API.html_t
@@ -0,0 +1 @@
+{{ project }}-{{ version }}
diff --git a/tests/roots/test-html_assets/static/css/style.css b/tests/roots/test-html_assets/static/css/style.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/static/css/style.css
diff --git a/tests/roots/test-html_assets/static/index.rst b/tests/roots/test-html_assets/static/index.rst
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/static/index.rst
diff --git a/tests/roots/test-html_assets/static/js/custom.js b/tests/roots/test-html_assets/static/js/custom.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/static/js/custom.js
diff --git a/tests/roots/test-html_assets/static/rimg.png b/tests/roots/test-html_assets/static/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-html_assets/static/rimg.png
Binary files differ
diff --git a/tests/roots/test-html_assets/static/subdir/.htaccess b/tests/roots/test-html_assets/static/subdir/.htaccess
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/static/subdir/.htaccess
diff --git a/tests/roots/test-html_assets/static/subdir/.htpasswd b/tests/roots/test-html_assets/static/subdir/.htpasswd
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/static/subdir/.htpasswd
diff --git a/tests/roots/test-html_assets/subdir/_build/index.html b/tests/roots/test-html_assets/subdir/_build/index.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_assets/subdir/_build/index.html
diff --git a/tests/roots/test-html_assets/subdir/background.png b/tests/roots/test-html_assets/subdir/background.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-html_assets/subdir/background.png
Binary files differ
diff --git a/tests/roots/test-html_entity/conf.py b/tests/roots/test-html_entity/conf.py
new file mode 100644
index 0000000..46bb290
--- /dev/null
+++ b/tests/roots/test-html_entity/conf.py
@@ -0,0 +1,2 @@
+html_theme = 'classic'
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-html_entity/index.rst b/tests/roots/test-html_entity/index.rst
new file mode 100644
index 0000000..11f4f4c
--- /dev/null
+++ b/tests/roots/test-html_entity/index.rst
@@ -0,0 +1,31 @@
+.. _index:
+
+test-html_entity (#3450)
+=========================
+
+Empty cell
+----------
+
+.. list-table::
+
+ - * un
+ *
+ * trois
+
+Return description in function signature
+----------------------------------------
+
+.. py:function:: test() -> string
+
+ rarr
+
+Field list that has long name (over 14 characters)
+--------------------------------------------------
+
+:abcdefghijklmnopqrstuvwxyz: fieldlist
+
+Option list that has long name (over 14 characters)
+---------------------------------------------------
+
+-a all
+-b long_long_file use file
diff --git a/tests/roots/test-html_file_checksum/conf.py b/tests/roots/test-html_file_checksum/conf.py
new file mode 100644
index 0000000..f918814
--- /dev/null
+++ b/tests/roots/test-html_file_checksum/conf.py
@@ -0,0 +1 @@
+html_static_path = ['static']
diff --git a/tests/roots/test-html_file_checksum/index.rst b/tests/roots/test-html_file_checksum/index.rst
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_file_checksum/index.rst
diff --git a/tests/roots/test-html_file_checksum/static/empty.js b/tests/roots/test-html_file_checksum/static/empty.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_file_checksum/static/empty.js
diff --git a/tests/roots/test-html_file_checksum/static/script.js b/tests/roots/test-html_file_checksum/static/script.js
new file mode 100644
index 0000000..9a21456
--- /dev/null
+++ b/tests/roots/test-html_file_checksum/static/script.js
@@ -0,0 +1 @@
+/* Script */
diff --git a/tests/roots/test-html_file_checksum/static/stylesheet-a.css b/tests/roots/test-html_file_checksum/static/stylesheet-a.css
new file mode 100644
index 0000000..3a5d802
--- /dev/null
+++ b/tests/roots/test-html_file_checksum/static/stylesheet-a.css
@@ -0,0 +1 @@
+/* Stylesheet A */
diff --git a/tests/roots/test-html_file_checksum/static/stylesheet-b.css b/tests/roots/test-html_file_checksum/static/stylesheet-b.css
new file mode 100644
index 0000000..ad5ff28
--- /dev/null
+++ b/tests/roots/test-html_file_checksum/static/stylesheet-b.css
@@ -0,0 +1 @@
+/* Stylesheet B */
diff --git a/tests/roots/test-html_scaled_image_link/conf.py b/tests/roots/test-html_scaled_image_link/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_scaled_image_link/conf.py
diff --git a/tests/roots/test-html_scaled_image_link/img.png b/tests/roots/test-html_scaled_image_link/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-html_scaled_image_link/img.png
Binary files differ
diff --git a/tests/roots/test-html_scaled_image_link/index.rst b/tests/roots/test-html_scaled_image_link/index.rst
new file mode 100644
index 0000000..0e47940
--- /dev/null
+++ b/tests/roots/test-html_scaled_image_link/index.rst
@@ -0,0 +1,11 @@
+test-html_scaled_image_link
+===========================
+
+.. image:: img.png
+
+.. image:: img.png
+ :scale: 50%
+
+.. image:: img.png
+ :scale: 50%
+ :class: no-scaled-link
diff --git a/tests/roots/test-html_signaturereturn_icon/conf.py b/tests/roots/test-html_signaturereturn_icon/conf.py
new file mode 100644
index 0000000..a695d18
--- /dev/null
+++ b/tests/roots/test-html_signaturereturn_icon/conf.py
@@ -0,0 +1 @@
+extensions = ['sphinx.ext.autodoc']
diff --git a/tests/roots/test-html_signaturereturn_icon/index.rst b/tests/roots/test-html_signaturereturn_icon/index.rst
new file mode 100644
index 0000000..4ff4eb6
--- /dev/null
+++ b/tests/roots/test-html_signaturereturn_icon/index.rst
@@ -0,0 +1,4 @@
+test-html_signaturereturn_icon
+==============================
+
+.. py:function:: foo(a: bool, b: int) -> str
diff --git a/tests/roots/test-html_style/_static/default.css b/tests/roots/test-html_style/_static/default.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-html_style/_static/default.css
diff --git a/tests/roots/test-html_style/conf.py b/tests/roots/test-html_style/conf.py
new file mode 100644
index 0000000..df1b310
--- /dev/null
+++ b/tests/roots/test-html_style/conf.py
@@ -0,0 +1,2 @@
+html_style = 'default.css'
+html_static_path = ['_static']
diff --git a/tests/roots/test-html_style/index.rst b/tests/roots/test-html_style/index.rst
new file mode 100644
index 0000000..d8aef48
--- /dev/null
+++ b/tests/roots/test-html_style/index.rst
@@ -0,0 +1,2 @@
+html_style
+==========
diff --git a/tests/roots/test-image-escape/conf.py b/tests/roots/test-image-escape/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-image-escape/conf.py
diff --git a/tests/roots/test-image-escape/img_#1.png b/tests/roots/test-image-escape/img_#1.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-image-escape/img_#1.png
Binary files differ
diff --git a/tests/roots/test-image-escape/index.rst b/tests/roots/test-image-escape/index.rst
new file mode 100644
index 0000000..723bf43
--- /dev/null
+++ b/tests/roots/test-image-escape/index.rst
@@ -0,0 +1,5 @@
+Sphinx image handling
+=====================
+
+.. an image with a character that is valid in a local file path but not a URL
+.. image:: img_#1.png
diff --git a/tests/roots/test-image-in-parsed-literal/conf.py b/tests/roots/test-image-in-parsed-literal/conf.py
new file mode 100644
index 0000000..5d06da6
--- /dev/null
+++ b/tests/roots/test-image-in-parsed-literal/conf.py
@@ -0,0 +1,9 @@
+exclude_patterns = ['_build']
+
+rst_epilog = '''
+.. |picture| image:: pic.png
+ :height: 1cm
+ :scale: 200%
+ :align: middle
+ :alt: alternative_text
+'''
diff --git a/tests/roots/test-image-in-parsed-literal/index.rst b/tests/roots/test-image-in-parsed-literal/index.rst
new file mode 100644
index 0000000..80e1008
--- /dev/null
+++ b/tests/roots/test-image-in-parsed-literal/index.rst
@@ -0,0 +1,9 @@
+test-image-in-parsed-literal
+============================
+
+Dummy text
+
+.. parsed-literal::
+
+ |picture|\ AFTER
+
diff --git a/tests/roots/test-image-in-parsed-literal/pic.png b/tests/roots/test-image-in-parsed-literal/pic.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-image-in-parsed-literal/pic.png
Binary files differ
diff --git a/tests/roots/test-image-in-section/conf.py b/tests/roots/test-image-in-section/conf.py
new file mode 100644
index 0000000..9cb250c
--- /dev/null
+++ b/tests/roots/test-image-in-section/conf.py
@@ -0,0 +1,8 @@
+exclude_patterns = ['_build']
+
+rst_epilog = '''
+.. |picture| image:: pic.png
+ :width: 15pt
+ :height: 15pt
+ :alt: alternative_text
+'''
diff --git a/tests/roots/test-image-in-section/index.rst b/tests/roots/test-image-in-section/index.rst
new file mode 100644
index 0000000..08416d6
--- /dev/null
+++ b/tests/roots/test-image-in-section/index.rst
@@ -0,0 +1,22 @@
+test-image-in-section
+=====================
+this is dummy content
+
+
+|picture| Test section
+----------------------
+blah blah blah
+
+
+Another section
+---------------
+another blah
+
+
+Other [blah] |picture| section
+------------------------------
+other blah
+
+|picture|
+---------
+blah blah blah
diff --git a/tests/roots/test-image-in-section/pic.png b/tests/roots/test-image-in-section/pic.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-image-in-section/pic.png
Binary files differ
diff --git a/tests/roots/test-images/conf.py b/tests/roots/test-images/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-images/conf.py
diff --git a/tests/roots/test-images/img.gif b/tests/roots/test-images/img.gif
new file mode 100644
index 0000000..8f02686
--- /dev/null
+++ b/tests/roots/test-images/img.gif
Binary files differ
diff --git a/tests/roots/test-images/img.ja.png b/tests/roots/test-images/img.ja.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-images/img.ja.png
Binary files differ
diff --git a/tests/roots/test-images/img.pdf b/tests/roots/test-images/img.pdf
new file mode 100644
index 0000000..cacbd85
--- /dev/null
+++ b/tests/roots/test-images/img.pdf
Binary files differ
diff --git a/tests/roots/test-images/img.png b/tests/roots/test-images/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-images/img.png
Binary files differ
diff --git a/tests/roots/test-images/img.zh.png b/tests/roots/test-images/img.zh.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-images/img.zh.png
Binary files differ
diff --git a/tests/roots/test-images/index.rst b/tests/roots/test-images/index.rst
new file mode 100644
index 0000000..14a2987
--- /dev/null
+++ b/tests/roots/test-images/index.rst
@@ -0,0 +1,29 @@
+test-image
+==========
+
+.. image:: rimg.png
+
+.. figure:: rimg.png
+
+ The caption of pic
+
+.. image:: img.*
+
+.. figure:: img.*
+
+ The caption of img
+
+.. image:: testimäge.png
+
+.. image:: rimg.png
+ :target: https://www.sphinx-doc.org/
+
+.. image:: rimg.png
+ :align: center
+ :target: https://www.python.org/
+
+.. a remote image
+.. image:: https://www.python.org/static/img/python-logo.png
+
+.. non-exist remote image
+.. image:: https://www.google.com/NOT_EXIST.PNG
diff --git a/tests/roots/test-images/rimg.png b/tests/roots/test-images/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-images/rimg.png
Binary files differ
diff --git a/tests/roots/test-images/rimg.png.xx b/tests/roots/test-images/rimg.png.xx
new file mode 100644
index 0000000..1081dc1
--- /dev/null
+++ b/tests/roots/test-images/rimg.png.xx
Binary files differ
diff --git a/tests/roots/test-images/rimg.xx.png b/tests/roots/test-images/rimg.xx.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-images/rimg.xx.png
Binary files differ
diff --git a/tests/roots/test-images/subdir/index.rst b/tests/roots/test-images/subdir/index.rst
new file mode 100644
index 0000000..72e742c
--- /dev/null
+++ b/tests/roots/test-images/subdir/index.rst
@@ -0,0 +1,10 @@
+test-images/subdir
+==================
+
+.. image:: rimg.png
+
+.. image:: svgimg.*
+
+.. figure:: svgimg.*
+
+ The caption of svgimg
diff --git a/tests/roots/test-images/subdir/rimg.png b/tests/roots/test-images/subdir/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-images/subdir/rimg.png
Binary files differ
diff --git a/tests/roots/test-images/subdir/rimg.xx.png b/tests/roots/test-images/subdir/rimg.xx.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-images/subdir/rimg.xx.png
Binary files differ
diff --git a/tests/roots/test-images/subdir/svgimg.pdf b/tests/roots/test-images/subdir/svgimg.pdf
new file mode 100644
index 0000000..cacbd85
--- /dev/null
+++ b/tests/roots/test-images/subdir/svgimg.pdf
Binary files differ
diff --git a/tests/roots/test-images/subdir/svgimg.svg b/tests/roots/test-images/subdir/svgimg.svg
new file mode 100644
index 0000000..2bae0b9
--- /dev/null
+++ b/tests/roots/test-images/subdir/svgimg.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="60" width="60">
+ <circle cx="40" cy="40" r="24" style="stroke:#000000; fill:#ffffff"/>
+</svg>
diff --git a/tests/roots/test-images/subdir/svgimg.xx.svg b/tests/roots/test-images/subdir/svgimg.xx.svg
new file mode 100644
index 0000000..2bae0b9
--- /dev/null
+++ b/tests/roots/test-images/subdir/svgimg.xx.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="60" width="60">
+ <circle cx="40" cy="40" r="24" style="stroke:#000000; fill:#ffffff"/>
+</svg>
diff --git a/tests/roots/test-images/testimäge.png b/tests/roots/test-images/testimäge.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-images/testimäge.png
Binary files differ
diff --git a/tests/roots/test-index_on_title/conf.py b/tests/roots/test-index_on_title/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-index_on_title/conf.py
diff --git a/tests/roots/test-index_on_title/contents.rst b/tests/roots/test-index_on_title/contents.rst
new file mode 100644
index 0000000..8256c42
--- /dev/null
+++ b/tests/roots/test-index_on_title/contents.rst
@@ -0,0 +1,5 @@
+index_on_title
+==============
+
+Test for :index:`index` in top level title
+------------------------------------------
diff --git a/tests/roots/test-inheritance/basic_diagram.rst b/tests/roots/test-inheritance/basic_diagram.rst
new file mode 100644
index 0000000..4c3838e
--- /dev/null
+++ b/tests/roots/test-inheritance/basic_diagram.rst
@@ -0,0 +1,5 @@
+Basic Diagram
+==============
+
+.. inheritance-diagram::
+ dummy.test
diff --git a/tests/roots/test-inheritance/conf.py b/tests/roots/test-inheritance/conf.py
new file mode 100644
index 0000000..26cadca
--- /dev/null
+++ b/tests/roots/test-inheritance/conf.py
@@ -0,0 +1,7 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.inheritance_diagram']
+source_suffix = '.rst'
diff --git a/tests/roots/test-inheritance/diagram_module_w_2_top_classes.rst b/tests/roots/test-inheritance/diagram_module_w_2_top_classes.rst
new file mode 100644
index 0000000..cc4365e
--- /dev/null
+++ b/tests/roots/test-inheritance/diagram_module_w_2_top_classes.rst
@@ -0,0 +1,6 @@
+Diagram using module with 2 top classes
+=======================================
+
+.. inheritance-diagram::
+ dummy.test
+ :top-classes: dummy.test.B, dummy.test.C
diff --git a/tests/roots/test-inheritance/diagram_w_1_top_class.rst b/tests/roots/test-inheritance/diagram_w_1_top_class.rst
new file mode 100644
index 0000000..97da825
--- /dev/null
+++ b/tests/roots/test-inheritance/diagram_w_1_top_class.rst
@@ -0,0 +1,7 @@
+Diagram using 1 top class
+=========================
+
+.. inheritance-diagram::
+ dummy.test
+ :top-classes: dummy.test.B
+
diff --git a/tests/roots/test-inheritance/diagram_w_2_top_classes.rst b/tests/roots/test-inheritance/diagram_w_2_top_classes.rst
new file mode 100644
index 0000000..8a6ae58
--- /dev/null
+++ b/tests/roots/test-inheritance/diagram_w_2_top_classes.rst
@@ -0,0 +1,9 @@
+Diagram using 2 top classes
+===========================
+
+.. inheritance-diagram::
+ dummy.test.F
+ dummy.test.D
+ dummy.test.E
+ :top-classes: dummy.test.B, dummy.test.C
+
diff --git a/tests/roots/test-inheritance/diagram_w_nested_classes.rst b/tests/roots/test-inheritance/diagram_w_nested_classes.rst
new file mode 100644
index 0000000..7fa0217
--- /dev/null
+++ b/tests/roots/test-inheritance/diagram_w_nested_classes.rst
@@ -0,0 +1,5 @@
+Diagram with Nested Classes
+===========================
+
+.. inheritance-diagram::
+ dummy.test_nested
diff --git a/tests/roots/test-inheritance/diagram_w_parts.rst b/tests/roots/test-inheritance/diagram_w_parts.rst
new file mode 100644
index 0000000..65a8318
--- /dev/null
+++ b/tests/roots/test-inheritance/diagram_w_parts.rst
@@ -0,0 +1,7 @@
+Diagram using the parts option
+==============================
+
+.. inheritance-diagram::
+ dummy.test
+ :parts: 1
+
diff --git a/tests/roots/test-inheritance/dummy/__init__.py b/tests/roots/test-inheritance/dummy/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-inheritance/dummy/__init__.py
diff --git a/tests/roots/test-inheritance/dummy/test.py b/tests/roots/test-inheritance/dummy/test.py
new file mode 100644
index 0000000..12fe8d9
--- /dev/null
+++ b/tests/roots/test-inheritance/dummy/test.py
@@ -0,0 +1,35 @@
+r"""
+
+ Test with a class diagram like this::
+
+ A
+ / \
+ B C
+ / \ / \
+ E D F
+
+"""
+
+
+class A:
+ pass
+
+
+class B(A):
+ pass
+
+
+class C(A):
+ pass
+
+
+class D(B, C):
+ pass
+
+
+class E(B):
+ pass
+
+
+class F(C):
+ pass
diff --git a/tests/roots/test-inheritance/dummy/test_nested.py b/tests/roots/test-inheritance/dummy/test_nested.py
new file mode 100644
index 0000000..4b68018
--- /dev/null
+++ b/tests/roots/test-inheritance/dummy/test_nested.py
@@ -0,0 +1,11 @@
+"""Test with nested classes.
+"""
+
+
+class A:
+ class B:
+ pass
+
+
+class C(A.B):
+ pass
diff --git a/tests/roots/test-inheritance/index.rst b/tests/roots/test-inheritance/index.rst
new file mode 100644
index 0000000..db4fbac
--- /dev/null
+++ b/tests/roots/test-inheritance/index.rst
@@ -0,0 +1,4 @@
+.. toctree::
+ :glob:
+
+ *
diff --git a/tests/roots/test-intl/_templates/contents.html b/tests/roots/test-intl/_templates/contents.html
new file mode 100644
index 0000000..d730545
--- /dev/null
+++ b/tests/roots/test-intl/_templates/contents.html
@@ -0,0 +1,10 @@
+{% extends "layout.html" %}
+{% block body %}
+ <h1>{{ _('Welcome') }}</h1>
+ <p>{%trans%}Sphinx {{ version }}{%endtrans%}</p>
+{% endblock %}
+
+{% block comment %}
+utf-8 encoded string: ニシキヘビ
+{% endblock %}
+
diff --git a/tests/roots/test-intl/admonitions.txt b/tests/roots/test-intl/admonitions.txt
new file mode 100644
index 0000000..a539461
--- /dev/null
+++ b/tests/roots/test-intl/admonitions.txt
@@ -0,0 +1,50 @@
+:tocdepth: 2
+
+Admonitions
+==================
+.. #1206 gettext did not translate admonition directive's title
+
+.. attention:: attention title
+
+ attention body
+
+.. caution:: caution title
+
+ caution body
+
+.. danger:: danger title
+
+ danger body
+
+.. error:: error title
+
+ error body
+
+.. hint:: hint title
+
+ hint body
+
+.. important:: important title
+
+ important body
+
+.. note:: note title
+
+ note body
+
+.. tip:: tip title
+
+ tip body
+
+.. warning:: warning title
+
+ warning body
+
+.. admonition:: admonition title
+
+ admonition body
+
+.. admonition:: 1. admonition title
+
+ admonition body
+
diff --git a/tests/roots/test-intl/bom.txt b/tests/roots/test-intl/bom.txt
new file mode 100644
index 0000000..3fea824
--- /dev/null
+++ b/tests/roots/test-intl/bom.txt
@@ -0,0 +1,5 @@
+File with UTF-8 BOM
+===================
+
+This file has a UTF-8 "BOM".
+
diff --git a/tests/roots/test-intl/conf.py b/tests/roots/test-intl/conf.py
new file mode 100644
index 0000000..96ac664
--- /dev/null
+++ b/tests/roots/test-intl/conf.py
@@ -0,0 +1,8 @@
+project = 'Sphinx intl <Tests>'
+source_suffix = '.txt'
+keep_warnings = True
+templates_path = ['_templates']
+html_additional_pages = {'contents': 'contents.html'}
+release = version = '2013.120'
+gettext_additional_targets = ['index']
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-intl/definition_terms.txt b/tests/roots/test-intl/definition_terms.txt
new file mode 100644
index 0000000..4c56288
--- /dev/null
+++ b/tests/roots/test-intl/definition_terms.txt
@@ -0,0 +1,16 @@
+:tocdepth: 2
+
+i18n with definition terms
+==========================
+
+Some term
+ The corresponding definition
+
+Some *term* `with link <http://sphinx-doc.org/>`__
+ The corresponding definition #2
+
+Some **term** with : classifier1 : classifier2
+ The corresponding definition
+
+Some term with : classifier[]
+ The corresponding definition
diff --git a/tests/roots/test-intl/docfields.txt b/tests/roots/test-intl/docfields.txt
new file mode 100644
index 0000000..b1b3c89
--- /dev/null
+++ b/tests/roots/test-intl/docfields.txt
@@ -0,0 +1,46 @@
+:tocdepth: 2
+
+i18n with docfields
+===================
+
+.. single TypedField
+
+.. class:: Cls1
+ :no-index:
+
+ :param param: description of parameter param
+
+.. grouped TypedFields
+
+.. class:: Cls2
+ :no-index:
+
+ :param foo: description of parameter foo
+ :param bar: description of parameter bar
+
+
+.. single GroupedField
+
+.. class:: Cls3(values)
+ :no-index:
+
+ :raises ValueError: if the values are out of range
+
+.. grouped GroupedFields
+
+.. class:: Cls4(values)
+ :no-index:
+
+ :raises TypeError: if the values are not valid
+ :raises ValueError: if the values are out of range
+
+
+.. single Field
+
+.. class:: Cls5
+ :no-index:
+
+ :returns: a new :class:`Cls3` instance
+
+.. Field is never grouped
+
diff --git a/tests/roots/test-intl/external_links.txt b/tests/roots/test-intl/external_links.txt
new file mode 100644
index 0000000..1cecbee
--- /dev/null
+++ b/tests/roots/test-intl/external_links.txt
@@ -0,0 +1,35 @@
+:tocdepth: 2
+
+i18n with external links
+========================
+.. #1044 external-links-dont-work-in-localized-html
+
+External link to Python_.
+
+Internal link to `i18n with external links`_.
+
+Inline link by `Sphinx Site <http://sphinx-doc.org>`_.
+
+Unnamed link__.
+
+.. _Python: http://python.org/index.html
+.. __: http://google.com
+
+
+link target swapped translation
+================================
+
+link to external1_ and external2_.
+
+link to `Sphinx Site <http://sphinx-doc.org>`_ and `Python Site <http://python.org>`_.
+
+.. _external1: https://www.google.com/external1
+.. _external2: https://www.google.com/external2
+
+
+Multiple references in the same line
+=====================================
+
+Link to `Sphinx Site <http://sphinx-doc.org>`_, `Python Site <http://python.org>`_, Python_, Unnamed__ and `i18n with external links`_.
+
+.. __: http://google.com
diff --git a/tests/roots/test-intl/figure.txt b/tests/roots/test-intl/figure.txt
new file mode 100644
index 0000000..633e12e
--- /dev/null
+++ b/tests/roots/test-intl/figure.txt
@@ -0,0 +1,53 @@
+:tocdepth: 2
+
+i18n with figure caption
+========================
+
+.. figure:: i18n.png
+
+ My caption of the figure
+
+ My description paragraph1 of the figure.
+
+ My description paragraph2 of the figure.
+
+figure in the block
+---------------------
+
+block
+
+ .. figure:: i18n.png
+
+ My caption of the figure
+
+ My description paragraph1 of the figure.
+
+ My description paragraph2 of the figure.
+
+
+image url and alt
+-------------------
+
+.. image:: i18n.png
+ :alt: i18n
+
+.. figure:: img.png
+ :alt: img
+
+
+image on substitution
+---------------------
+
+.. |sub image| image:: i18n.png
+
+image under note
+-----------------
+
+.. note::
+
+ .. image:: i18n.png
+ :alt: i18n under note
+
+ .. figure:: img.png
+ :alt: img under note
+
diff --git a/tests/roots/test-intl/footnote.txt b/tests/roots/test-intl/footnote.txt
new file mode 100644
index 0000000..0bbed91
--- /dev/null
+++ b/tests/roots/test-intl/footnote.txt
@@ -0,0 +1,14 @@
+:tocdepth: 2
+
+i18n with Footnote
+==================
+.. #955 cant-build-html-with-footnotes-when-using
+
+[100]_ Contents [#]_ for `i18n with Footnote`_ [ref]_ [#named]_ [*]_.
+second footnote_ref [100]_.
+
+.. [#] This is a auto numbered footnote.
+.. [ref] This is a named footnote.
+.. [100] This is a numbered footnote.
+.. [#named] This is a auto numbered named footnote.
+.. [*] This is a auto symbol footnote.
diff --git a/tests/roots/test-intl/glossary_terms.txt b/tests/roots/test-intl/glossary_terms.txt
new file mode 100644
index 0000000..473d857
--- /dev/null
+++ b/tests/roots/test-intl/glossary_terms.txt
@@ -0,0 +1,29 @@
+:tocdepth: 2
+
+i18n with glossary terms
+========================
+
+.. glossary::
+
+ Some term
+ The corresponding glossary
+
+ Some other term
+ The corresponding glossary #2
+
+link to :term:`Some term`.
+
+Translated glossary should be sorted by translated terms:
+
+.. glossary::
+ :sorted:
+
+ AAA
+ Define AAA
+
+ CCC
+ EEE
+ Define CCC
+
+ BBB
+ Define BBB
diff --git a/tests/roots/test-intl/glossary_terms_inconsistency.txt b/tests/roots/test-intl/glossary_terms_inconsistency.txt
new file mode 100644
index 0000000..837411b
--- /dev/null
+++ b/tests/roots/test-intl/glossary_terms_inconsistency.txt
@@ -0,0 +1,6 @@
+:tocdepth: 2
+
+i18n with glossary terms inconsistency
+======================================
+
+1. link to :term:`Some term` and :term:`Some other term`.
diff --git a/tests/roots/test-intl/i18n.png b/tests/roots/test-intl/i18n.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-intl/i18n.png
Binary files differ
diff --git a/tests/roots/test-intl/img.png b/tests/roots/test-intl/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-intl/img.png
Binary files differ
diff --git a/tests/roots/test-intl/index.txt b/tests/roots/test-intl/index.txt
new file mode 100644
index 0000000..9de15d5
--- /dev/null
+++ b/tests/roots/test-intl/index.txt
@@ -0,0 +1,40 @@
+CONTENTS
+========
+
+.. meta::
+ :description: testdata for i18n
+ :keywords: i18n, sphinx, markup
+
+.. toctree::
+ :maxdepth: 2
+ :numbered:
+ :caption: Table of Contents
+
+ subdir/index
+ bom
+ warnings
+ footnote
+ external_links
+ refs_inconsistency
+ literalblock
+ seealso
+ definition_terms
+ figure
+ index_entries
+ role_xref
+ glossary_terms
+ glossary_terms_inconsistency
+ versionchange
+ docfields
+ raw
+ refs
+ section
+ translation_progress
+ topic
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Hidden Toc
+ :hidden:
+
+ only
diff --git a/tests/roots/test-intl/index_entries.txt b/tests/roots/test-intl/index_entries.txt
new file mode 100644
index 0000000..e9300d0
--- /dev/null
+++ b/tests/roots/test-intl/index_entries.txt
@@ -0,0 +1,24 @@
+:tocdepth: 2
+
+i18n with index entries
+=======================
+
+.. index::
+ single: Mailing List
+ pair: Newsletter; Recipients List
+
+index target section
+--------------------
+
+this is :index:`Newsletter` target paragraph.
+
+
+various index entries
+---------------------
+
+.. index::
+ triple: First; Second; Third
+ see: Entry; Mailing List
+ seealso: See; Newsletter
+
+That's all.
diff --git a/tests/roots/test-intl/label_target.txt b/tests/roots/test-intl/label_target.txt
new file mode 100644
index 0000000..ac00084
--- /dev/null
+++ b/tests/roots/test-intl/label_target.txt
@@ -0,0 +1,67 @@
+:tocdepth: 2
+
+.. _implicit-target:
+
+section and label
+==================
+
+.. This section's label and section title are different.
+.. This case, the section have 2 target id.
+
+:ref:`implicit-target` point to ``implicit-target`` and
+`section and label`_ point to ``section-and-label``.
+
+
+.. _explicit-target:
+
+explicit-target
+================
+
+.. This section's label equals to section title.
+.. This case, a duplicated target id is generated by docutils.
+
+:ref:`explicit-target` point to ``explicit-target`` and
+`explicit-target`_ point to duplicated id like ``id1``.
+
+
+implicit section name
+======================
+
+.. This section have no label.
+.. This case, the section have one id.
+
+`implicit section name`_ point to ``implicit-section-name``.
+
+duplicated sub section
+------------------------
+
+.. This section have no label, but name will be duplicated by next section.
+.. This case, the section have one id.
+
+`duplicated sub section`_ is broken link.
+
+.. There is no way to link to this section's ``duplicated-sub-section``` by
+.. using formal reStructuredText markup.
+
+duplicated sub section
+------------------------
+
+.. This section have no label, but the section was a duplicate name.
+.. This case, a duplicated target id is generated by docutils.
+
+.. There is no way to link to this section's duplicated id like ``id2`` by
+.. using formal reStructuredText markup.
+
+
+.. _bridge label: `label bridged target section`_
+.. _bridge label2: `section and label`_
+
+label bridged target section
+=============================
+
+.. This section is targeted through label definition.
+
+`bridge label`_ is not translatable but linked to translated section title.
+
+`bridge label2`_ point to ``section and label`` and `bridge label`_ point to ``label bridged target section``. The second appeared `bridge label2`_ point to correct target.
+
diff --git a/tests/roots/test-intl/literalblock.txt b/tests/roots/test-intl/literalblock.txt
new file mode 100644
index 0000000..583b5b6
--- /dev/null
+++ b/tests/roots/test-intl/literalblock.txt
@@ -0,0 +1,71 @@
+:tocdepth: 2
+
+i18n with literal block
+=========================
+
+Correct literal block::
+
+ this is
+ literal block
+
+Missing literal block::
+
+That's all.
+
+.. literalinclude:: raw.txt
+ :caption: included raw.txt
+
+code blocks
+==============
+
+.. highlight:: ruby
+
+::
+
+ def main
+ 'result'
+ end
+
+::
+
+ #include <stdlib.h>
+ int main(int argc, char** argv)
+ {
+ return 0;
+ }
+
+.. code-block:: c
+ :caption: example of C language
+
+ #include <stdio.h>
+ int main(int argc, char** argv)
+ {
+ return 0;
+ }
+
+
+* ::
+
+ literal-block
+ in list
+
+.. highlight:: none
+
+::
+
+ test_code_for_noqa()
+ continued()
+
+
+doctest blocks
+==============
+
+.. highlight:: python
+
+>>> import sys # sys importing
+>>> def main(): # define main function
+... sys.stdout.write('hello') # call write method of stdout object
+>>>
+>>> if __name__ == '__main__': # if run this py file as python script
+... main() # call main
+
diff --git a/tests/roots/test-intl/noqa.txt b/tests/roots/test-intl/noqa.txt
new file mode 100644
index 0000000..004b301
--- /dev/null
+++ b/tests/roots/test-intl/noqa.txt
@@ -0,0 +1,16 @@
+First section
+=============
+
+Some text with a reference, :ref:`next-section`.
+
+Another reference: :ref:`next-section`.
+
+This should allow to test escaping ``#noqa``.
+
+.. _next-section:
+
+Next section
+============
+
+Some text, again referring to the section: :ref:`next-section`.
+
diff --git a/tests/roots/test-intl/only.txt b/tests/roots/test-intl/only.txt
new file mode 100644
index 0000000..2c8990e
--- /dev/null
+++ b/tests/roots/test-intl/only.txt
@@ -0,0 +1,14 @@
+Only directive
+--------------
+
+.. only:: html
+
+ In HTML.
+
+.. only:: latex
+
+ In LaTeX.
+
+.. only:: html or latex
+
+ In both.
diff --git a/tests/roots/test-intl/raw.txt b/tests/roots/test-intl/raw.txt
new file mode 100644
index 0000000..fe77f6c
--- /dev/null
+++ b/tests/roots/test-intl/raw.txt
@@ -0,0 +1,8 @@
+===
+Raw
+===
+
+.. raw:: html
+
+ <iframe src="http://sphinx-doc.org"></iframe>
+
diff --git a/tests/roots/test-intl/refs.txt b/tests/roots/test-intl/refs.txt
new file mode 100644
index 0000000..4a094b2
--- /dev/null
+++ b/tests/roots/test-intl/refs.txt
@@ -0,0 +1,48 @@
+References
+===========
+
+Translation Tips
+-----------------
+
+.. _download Sphinx: https://pypi.org/project/Sphinx/
+.. _Docutils site: https://docutils.sourceforge.io/
+.. _Sphinx site: http://sphinx-doc.org/
+
+
+A-1. Here's how you can `download Sphinx`_.
+
+A-2. Here's how you can `download Sphinx`_.
+
+A-3. Here's how you can `download Sphinx`_.
+
+B-1. `Docutils site`_ and `Sphinx site`_.
+
+B-2. `Docutils site`_ and `Sphinx site`_.
+
+B-3. `Docutils site`_ and `Sphinx site`_.
+
+B-4. `Docutils site`_ and `Sphinx site`_.
+
+C-1. Link to `Translation Tips`_ section.
+
+C-2. Link to `Translation Tips`_ section.
+
+C-3. Link to `Translation Tips`_ section.
+
+C-4. Link to `Translation Tips`_ section.
+
+C-5. Link to `Translation Tips`_ section.
+
+D-1. Link to `Translation Tips`_ and `Next Section`_ section.
+
+D-2. Link to `Translation Tips`_ and `Next Section`_ section.
+
+D-3. Link to `Translation Tips`_ and `Next Section`_ section.
+
+D-4. Link to `Translation Tips`_ and `Next Section`_ section.
+
+D-5. Link to `Translation Tips`_ and `Next Section`_ section.
+
+Next Section
+-------------
+Last updated |today|.
diff --git a/tests/roots/test-intl/refs_inconsistency.txt b/tests/roots/test-intl/refs_inconsistency.txt
new file mode 100644
index 0000000..b16623a
--- /dev/null
+++ b/tests/roots/test-intl/refs_inconsistency.txt
@@ -0,0 +1,13 @@
+:tocdepth: 2
+
+i18n with refs inconsistency
+=============================
+
+* [100]_ for [#]_ citation [ref2]_.
+* for reference_.
+* normal text.
+
+.. [#] This is a auto numbered footnote.
+.. [ref2] This is a citation.
+.. [100] This is a numbered footnote.
+.. _reference: http://www.example.com
diff --git a/tests/roots/test-intl/refs_python_domain.txt b/tests/roots/test-intl/refs_python_domain.txt
new file mode 100644
index 0000000..2b021f2
--- /dev/null
+++ b/tests/roots/test-intl/refs_python_domain.txt
@@ -0,0 +1,15 @@
+:tocdepth: 2
+
+i18n with python domain refs
+=============================
+
+.. currentmodule:: sensitive
+
+See this decorator: :func:`sensitive_variables`.
+
+.. function:: sensitive_variables(*variables)
+
+ Some description
+
+.. currentmodule:: reporting
+
diff --git a/tests/roots/test-intl/role_xref.txt b/tests/roots/test-intl/role_xref.txt
new file mode 100644
index 0000000..2919b5c
--- /dev/null
+++ b/tests/roots/test-intl/role_xref.txt
@@ -0,0 +1,40 @@
+:tocdepth: 2
+
+.. _i18n-role-xref:
+
+i18n role xref
+==============
+
+link to :term:`Some term`, :ref:`i18n-role-xref`, :doc:`index`.
+
+.. _same-type-links:
+
+same type links
+=================
+
+link to :term:`Some term` and :term:`Some other term`.
+
+link to :ref:`i18n-role-xref`, :ref:`same-type-links` and :ref:`label <same-type-links>`.
+
+link to :doc:`index` and :doc:`glossary_terms`.
+
+link to :option:`-m` and :option:`--module`.
+
+link to :envvar:`env1` and :envvar:`env2`.
+
+link to :token:`token1` and :token:`token2`.
+
+link to :keyword:`i18n-role-xref` and :keyword:`same-type-links`.
+
+
+.. option:: -m <module>
+
+.. option:: --module <module>
+
+.. envvar:: env1
+
+.. envvar:: env2
+
+.. productionlist::
+ token_stmt: `token1` ":" `token2`
+
diff --git a/tests/roots/test-intl/rubric.txt b/tests/roots/test-intl/rubric.txt
new file mode 100644
index 0000000..f285d49
--- /dev/null
+++ b/tests/roots/test-intl/rubric.txt
@@ -0,0 +1,14 @@
+:tocdepth: 2
+
+i18n with rubric
+================
+
+.. rubric:: rubric title
+
+rubric in the block
+-------------------
+
+block
+
+ .. rubric:: rubric title
+
diff --git a/tests/roots/test-intl/section.txt b/tests/roots/test-intl/section.txt
new file mode 100644
index 0000000..ae0604c
--- /dev/null
+++ b/tests/roots/test-intl/section.txt
@@ -0,0 +1,8 @@
+1. Section
+==========
+
+.. contents:: 3. Contents Title
+ :local:
+
+2. Sub Section
+--------------
diff --git a/tests/roots/test-intl/seealso.txt b/tests/roots/test-intl/seealso.txt
new file mode 100644
index 0000000..ed88599
--- /dev/null
+++ b/tests/roots/test-intl/seealso.txt
@@ -0,0 +1,15 @@
+:tocdepth: 2
+
+i18n with seealso
+============================
+.. #960 directive-seelaso-ignored-in-the-gettext
+
+.. seealso:: short text 1
+
+.. seealso::
+
+ long text 1
+
+.. seealso:: short text 2
+
+ long text 2
diff --git a/tests/roots/test-intl/subdir/index.txt b/tests/roots/test-intl/subdir/index.txt
new file mode 100644
index 0000000..7578ce3
--- /dev/null
+++ b/tests/roots/test-intl/subdir/index.txt
@@ -0,0 +1,2 @@
+subdir contents
+===============
diff --git a/tests/roots/test-intl/table.txt b/tests/roots/test-intl/table.txt
new file mode 100644
index 0000000..cf82438
--- /dev/null
+++ b/tests/roots/test-intl/table.txt
@@ -0,0 +1,20 @@
+:tocdepth: 2
+
+i18n with table
+===============
+
+.. table:: table caption
+
+ ======= =======
+ header1 header2
+ ------- -------
+ text1 text2
+ text3 text4
+ text5 text6
+ ======= =======
+
+.. table:: 1. table caption
+
+ +-----+
+ |text1|
+ +-----+
diff --git a/tests/roots/test-intl/toctree.txt b/tests/roots/test-intl/toctree.txt
new file mode 100644
index 0000000..35c956a
--- /dev/null
+++ b/tests/roots/test-intl/toctree.txt
@@ -0,0 +1,10 @@
+i18n with toctree
+=================
+
+.. toctree::
+ :caption: caption
+
+ figure <figure>
+ table
+ https://www.sphinx-doc.org/
+ self
diff --git a/tests/roots/test-intl/topic.txt b/tests/roots/test-intl/topic.txt
new file mode 100644
index 0000000..255a334
--- /dev/null
+++ b/tests/roots/test-intl/topic.txt
@@ -0,0 +1,13 @@
+:tocdepth: 2
+
+i18n with topic
+================
+
+.. topic:: Topic Title
+
+ Topic Content
+
+.. topic:: 1. Topic Title
+
+ Topic Content
+
diff --git a/tests/roots/test-intl/translation_progress.txt b/tests/roots/test-intl/translation_progress.txt
new file mode 100644
index 0000000..f70ab7a
--- /dev/null
+++ b/tests/roots/test-intl/translation_progress.txt
@@ -0,0 +1,40 @@
+Translation Progress
+====================
+
+When, in disgrace with fortune and men’s eyes,
+
+I all alone beweep my outcast state,
+
+And trouble deaf heaven with my bootless cries,
+
+And look upon myself, and curse my fate,
+
+Wishing me like to one more rich in hope,
+
+Featur’d like him, like him with friends possess’d,
+
+Desiring this man’s art and that man’s scope,
+
+With what I most enjoy contented least;
+
+.. idempotent translations (2 out of 14 lines):
+
+Yet in these thoughts myself almost despising,
+
+Haply I think on thee, and then my state,
+
+.. untranslated (2 out of 14 lines):
+
+Like to the lark at break of day arising
+
+From sullen earth, sings hymns at heaven’s gate;
+
+.. translation missing (2 out of 14 lines):
+
+For thy sweet love remember’d such wealth brings
+
+That then I scorn to change my state with kings.
+
+.. translation progress substitution
+
+|translation progress|
diff --git a/tests/roots/test-intl/versionchange.txt b/tests/roots/test-intl/versionchange.txt
new file mode 100644
index 0000000..4c57e14
--- /dev/null
+++ b/tests/roots/test-intl/versionchange.txt
@@ -0,0 +1,16 @@
+:tocdepth: 2
+
+i18n with versionchange
+============================
+
+.. deprecated:: 1.0
+ This is the *first* paragraph of deprecated.
+
+ This is the *second* paragraph of deprecated.
+
+.. versionadded:: 1.0
+ This is the *first* paragraph of versionadded.
+
+.. versionchanged:: 1.0
+
+ This is the *first* paragraph of versionchanged.
diff --git a/tests/roots/test-intl/warnings.txt b/tests/roots/test-intl/warnings.txt
new file mode 100644
index 0000000..a80fe18
--- /dev/null
+++ b/tests/roots/test-intl/warnings.txt
@@ -0,0 +1,5 @@
+i18n with reST warnings
+========================
+
+line of ``literal`` markup.
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/admonitions.po b/tests/roots/test-intl/xx/LC_MESSAGES/admonitions.po
new file mode 100644
index 0000000..f114e33
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/admonitions.po
@@ -0,0 +1,84 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2013, test_intl
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-03 12:00+0000\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"
+
+msgid "Admonitions"
+msgstr "ADMONITIONS"
+
+msgid "attention title"
+msgstr "ATTENTION TITLE"
+
+msgid "attention body"
+msgstr "ATTENTION BODY"
+
+msgid "caution title"
+msgstr "CAUTION TITLE"
+
+msgid "caution body"
+msgstr "CAUTION BODY"
+
+msgid "danger title"
+msgstr "DANGER TITLE"
+
+msgid "danger body"
+msgstr "DANGER BODY"
+
+msgid "error title"
+msgstr "ERROR TITLE"
+
+msgid "error body"
+msgstr "ERROR BODY"
+
+msgid "hint title"
+msgstr "HINT TITLE"
+
+msgid "hint body"
+msgstr "HINT BODY"
+
+msgid "important title"
+msgstr "IMPORTANT TITLE"
+
+msgid "important body"
+msgstr "IMPORTANT BODY"
+
+msgid "note title"
+msgstr "NOTE TITLE"
+
+msgid "note body"
+msgstr "NOTE BODY"
+
+msgid "tip title"
+msgstr "TIP TITLE"
+
+msgid "tip body"
+msgstr "TIP BODY"
+
+msgid "warning title"
+msgstr "WARNING TITLE"
+
+msgid "warning body"
+msgstr "WARNING BODY"
+
+msgid "admonition title"
+msgstr "ADMONITION TITLE"
+
+msgid "admonition body"
+msgstr "ADMONITION BODY"
+
+msgid "1. admonition title"
+msgstr "1. ADMONITION TITLE"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/bom.po b/tests/roots/test-intl/xx/LC_MESSAGES/bom.po
new file mode 100644
index 0000000..c6025eb
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/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/roots/test-intl/xx/LC_MESSAGES/definition_terms.po b/tests/roots/test-intl/xx/LC_MESSAGES/definition_terms.po
new file mode 100644
index 0000000..1752dd6
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/definition_terms.po
@@ -0,0 +1,47 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-01-01 05:00+0000\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"
+
+msgid "i18n with definition terms"
+msgstr "I18N WITH DEFINITION TERMS"
+
+msgid "Some term"
+msgstr "SOME TERM"
+
+msgid "The corresponding definition"
+msgstr "THE CORRESPONDING DEFINITION"
+
+msgid "Some *term* `with link <http://sphinx-doc.org/>`__"
+msgstr "SOME *TERM* `WITH LINK <http://sphinx-doc.org/>`__"
+
+msgid "The corresponding definition #2"
+msgstr "THE CORRESPONDING DEFINITION #2"
+
+msgid "Some **term** with"
+msgstr "SOME **TERM** WITH"
+
+msgid "classifier1"
+msgstr "CLASSIFIER1"
+
+msgid "classifier2"
+msgstr "CLASSIFIER2"
+
+msgid "Some term with"
+msgstr "SOME TERM WITH"
+
+msgid "classifier[]"
+msgstr "CLASSIFIER[]"
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/docfields.po b/tests/roots/test-intl/xx/LC_MESSAGES/docfields.po
new file mode 100644
index 0000000..8c3b8f9
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/docfields.po
@@ -0,0 +1,39 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010, Georg Brandl & Team
+# This file is distributed under the same license as the Sphinx <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx <Tests> 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-16 14:11+0000\n"
+"PO-Revision-Date: 2012-12-18 06:14+0900\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "i18n with docfields"
+msgstr "I18N WITH DOCFIELDS"
+
+msgid "description of parameter param"
+msgstr "DESCRIPTION OF PARAMETER param"
+
+msgid "description of parameter foo"
+msgstr "DESCRIPTION OF PARAMETER foo"
+
+msgid "description of parameter bar"
+msgstr "DESCRIPTION OF PARAMETER bar"
+
+msgid "if the values are not valid"
+msgstr "IF THE VALUES ARE NOT VALID"
+
+msgid "if the values are out of range"
+msgstr "IF THE VALUES ARE OUT OF RANGE"
+
+msgid "a new :class:`Cls3` instance"
+msgstr "A NEW :class:`Cls3` INSTANCE"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/external_links.po b/tests/roots/test-intl/xx/LC_MESSAGES/external_links.po
new file mode 100644
index 0000000..8c53abb
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/external_links.po
@@ -0,0 +1,47 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-11-22 08:28+0000\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"
+
+msgid "i18n with external links"
+msgstr "EXTERNAL LINKS"
+
+msgid "External link to Python_."
+msgstr "EXTERNAL LINK TO Python_."
+
+msgid "Internal link to `i18n with external links`_."
+msgstr "`EXTERNAL LINKS`_ IS INTERNAL LINK."
+
+msgid "Inline link by `Sphinx Site <http://sphinx-doc.org>`_."
+msgstr "INLINE LINK BY `THE SPHINX SITE <http://sphinx-doc.org>`_."
+
+msgid "Unnamed link__."
+msgstr "UNNAMED LINK__."
+
+msgid "link target swapped translation"
+msgstr "LINK TARGET SWAPPED TRANSLATION"
+
+msgid "link to external1_ and external2_."
+msgstr "LINK TO external2_ AND external1_."
+
+msgid "link to `Sphinx Site <http://sphinx-doc.org>`_ and `Python Site <http://python.org>`_."
+msgstr "LINK TO `THE PYTHON SITE <http://python.org>`_ AND `THE SPHINX SITE <http://sphinx-doc.org>`_."
+
+msgid "Multiple references in the same line"
+msgstr "MULTIPLE REFERENCES IN THE SAME LINE"
+
+msgid "Link to `Sphinx Site <http://sphinx-doc.org>`_, `Python Site <http://python.org>`_, Python_, Unnamed__ and `i18n with external links`_."
+msgstr "LINK TO `EXTERNAL LINKS`_, Python_, `THE SPHINX SITE <http://sphinx-doc.org>`_, UNNAMED__ AND `THE PYTHON SITE <http://python.org>`_."
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/figure.po b/tests/roots/test-intl/xx/LC_MESSAGES/figure.po
new file mode 100644
index 0000000..64bbdf7
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/figure.po
@@ -0,0 +1,57 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-01-04 07:00+0000\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"
+
+msgid "i18n with figure caption"
+msgstr "I18N WITH FIGURE CAPTION"
+
+msgid "My caption of the figure"
+msgstr "MY CAPTION OF THE FIGURE"
+
+msgid "My description paragraph1 of the figure."
+msgstr "MY DESCRIPTION PARAGRAPH1 OF THE FIGURE."
+
+msgid "My description paragraph2 of the figure."
+msgstr "MY DESCRIPTION PARAGRAPH2 OF THE FIGURE."
+
+msgid "figure in the block"
+msgstr "FIGURE IN THE BLOCK"
+
+msgid "block"
+msgstr "BLOCK"
+
+msgid "image url and alt"
+msgstr "IMAGE URL AND ALT"
+
+msgid "img"
+msgstr "IMG -> I18N"
+
+msgid ".. image:: img.png"
+msgstr ".. image:: i18n.png"
+
+msgid "i18n"
+msgstr "I18N -> IMG"
+
+msgid ".. image:: i18n.png"
+msgstr ".. image:: img.png"
+
+msgid "image on substitution"
+msgstr "IMAGE ON SUBSTITUTION"
+
+msgid "image under note"
+msgstr "IMAGE UNDER NOTE"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/footnote.po b/tests/roots/test-intl/xx/LC_MESSAGES/footnote.po
new file mode 100644
index 0000000..869bf62
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/footnote.po
@@ -0,0 +1,40 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-11-22 08:28+0000\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"
+
+msgid "i18n with Footnote"
+msgstr "I18N WITH FOOTNOTE"
+
+msgid "[100]_ Contents [#]_ for `i18n with Footnote`_ [ref]_ [#named]_ [*]_. "
+"second footnote_ref [100]_."
+msgstr "`I18N WITH FOOTNOTE`_ INCLUDE THIS CONTENTS [#named]_ [ref]_ [#]_ [100]_ [*]_. "
+"SECOND FOOTNOTE_REF [100]_."
+
+msgid "This is a auto numbered footnote."
+msgstr "THIS IS A AUTO NUMBERED FOOTNOTE."
+
+msgid "This is a named footnote."
+msgstr "THIS IS A NAMED FOOTNOTE."
+
+msgid "This is a numbered footnote."
+msgstr "THIS IS A NUMBERED FOOTNOTE."
+
+msgid "This is a auto numbered named footnote."
+msgstr "THIS IS A AUTO NUMBERED NAMED FOOTNOTE."
+
+msgid "This is a auto symbol footnote."
+msgstr "THIS IS A AUTO SYMBOL FOOTNOTE."
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms.po b/tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms.po
new file mode 100644
index 0000000..83542f1
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms.po
@@ -0,0 +1,59 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-01-29 14:10+0000\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"
+
+msgid "i18n with glossary terms"
+msgstr "I18N WITH GLOSSARY TERMS"
+
+msgid "Some term"
+msgstr "SOME NEW TERM"
+
+msgid "The corresponding glossary"
+msgstr "THE CORRESPONDING GLOSSARY"
+
+msgid "Some other term"
+msgstr "SOME OTHER NEW TERM"
+
+msgid "The corresponding glossary #2"
+msgstr "THE CORRESPONDING GLOSSARY #2"
+
+msgid "link to :term:`Some term`."
+msgstr "LINK TO :term:`SOME NEW TERM`."
+
+msgid "Translated glossary should be sorted by translated terms:"
+msgstr "TRANSLATED GLOSSARY SHOULD BE SORTED BY TRANSLATED TERMS:"
+
+msgid "BBB"
+msgstr "TRANSLATED TERM XXX"
+
+msgid "Define BBB"
+msgstr "DEFINE XXX"
+
+msgid "AAA"
+msgstr "TRANSLATED TERM YYY"
+
+msgid "Define AAA"
+msgstr "DEFINE YYY"
+
+msgid "CCC"
+msgstr "TRANSLATED TERM ZZZ"
+
+msgid "EEE"
+msgstr "VVV"
+
+msgid "Define CCC"
+msgstr "DEFINE ZZZ"
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms_inconsistency.po b/tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms_inconsistency.po
new file mode 100644
index 0000000..ef2bf30
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/glossary_terms_inconsistency.po
@@ -0,0 +1,23 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-01-29 14:10+0000\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"
+
+msgid "i18n with glossary terms inconsistency"
+msgstr "I18N WITH GLOSSARY TERMS INCONSISTENCY"
+
+msgid "link to :term:`Some term` and :term:`Some other term`."
+msgstr "LINK TO :term:`SOME NEW TERM`."
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/index.po b/tests/roots/test-intl/xx/LC_MESSAGES/index.po
new file mode 100644
index 0000000..a4646f1
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/index.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010, Georg Brandl & Team
+# This file is distributed under the same license as the Sphinx <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx <Tests> 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-16 14:11+0000\n"
+"PO-Revision-Date: 2012-12-18 06:14+0900\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Table of Contents"
+msgstr "TABLE OF CONTENTS"
+
+msgid "Hidden Toc"
+msgstr "HIDDEN TOC"
+
+msgid "testdata for i18n"
+msgstr "TESTDATA FOR I18N"
+
+msgid "i18n, sphinx, markup"
+msgstr "I18N, SPHINX, MARKUP"
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/index_entries.po b/tests/roots/test-intl/xx/LC_MESSAGES/index_entries.po
new file mode 100644
index 0000000..83619b4
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/index_entries.po
@@ -0,0 +1,77 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2013, foo
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: foo foo\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-01-05 18:10+0000\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"
+
+msgid "i18n with index entries"
+msgstr ""
+
+msgid "index target section"
+msgstr ""
+
+msgid "this is :index:`Newsletter` target paragraph."
+msgstr "THIS IS :index:`NEWSLETTER` TARGET PARAGRAPH."
+
+msgid "various index entries"
+msgstr ""
+
+msgid "That's all."
+msgstr ""
+
+msgid "Mailing List"
+msgstr "MAILING LIST"
+
+msgid "Newsletter"
+msgstr "NEWSLETTER"
+
+msgid "Recipients List"
+msgstr "RECIPIENTS LIST"
+
+msgid "First"
+msgstr "FIRST"
+
+msgid "Second"
+msgstr "SECOND"
+
+msgid "Third"
+msgstr "THIRD"
+
+msgid "Entry"
+msgstr "ENTRY"
+
+msgid "See"
+msgstr "SEE"
+
+msgid "Module"
+msgstr "MODULE"
+
+msgid "Keyword"
+msgstr "KEYWORD"
+
+msgid "Operator"
+msgstr "OPERATOR"
+
+msgid "Object"
+msgstr "OBJECT"
+
+msgid "Exception"
+msgstr "EXCEPTION"
+
+msgid "Statement"
+msgstr "STATEMENT"
+
+msgid "Builtin"
+msgstr "BUILTIN"
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/label_target.po b/tests/roots/test-intl/xx/LC_MESSAGES/label_target.po
new file mode 100644
index 0000000..60d7c3e
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/label_target.po
@@ -0,0 +1,66 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2013, sphinx
+# This file is distributed under the same license as the sphinx package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.2\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-06-19 00:33+0000\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"
+
+msgid "section and label"
+msgstr "X SECTION AND LABEL"
+
+msgid ""
+":ref:`implicit-target` point to ``implicit-target`` and "
+"`section and label`_ point to ``section-and-label``."
+msgstr ""
+":ref:`implicit-target` POINT TO ``implicit-target`` AND "
+"`X SECTION AND LABEL`_ POINT TO ``section-and-label``."
+
+msgid "explicit-target"
+msgstr "X EXPLICIT-TARGET"
+
+msgid ""
+":ref:`explicit-target` point to ``explicit-target`` and `explicit-target`_"
+" point to duplicated id like ``id1``."
+msgstr ""
+":ref:`explicit-target` POINT TO ``explicit-target`` AND `X EXPLICIT-TARGET`_"
+" POINT TO DUPLICATED ID LIKE ``id1``."
+
+msgid "implicit section name"
+msgstr "X IMPLICIT SECTION NAME"
+
+msgid "`implicit section name`_ point to ``implicit-section-name``."
+msgstr "`X IMPLICIT SECTION NAME`_ POINT TO ``implicit-section-name``."
+
+msgid "duplicated sub section"
+msgstr "X DUPLICATED SUB SECTION"
+
+msgid ""
+"`duplicated sub section`_ is broken link."
+msgstr ""
+"`X DUPLICATED SUB SECTION`_ IS BROKEN LINK."
+
+msgid "label bridged target section"
+msgstr "X LABEL BRIDGED TARGET SECTION"
+
+msgid "`bridge label`_ is not translatable but linked to translated section title."
+msgstr "X `bridge label`_ IS NOT TRANSLATABLE BUT LINKED TO TRANSLATED SECTION TITLE."
+
+msgid ""
+"`bridge label2`_ point to ``section and label`` and `bridge label`_ point to "
+"``label bridged target section``. The second appeared `bridge label2`_ point "
+"to correct target."
+msgstr ""
+"X `bridge label`_ POINT TO ``LABEL BRIDGED TARGET SECTION`` AND "
+"`bridge label2`_ POINT TO ``SECTION AND LABEL``. THE SECOND APPEARED "
+"`bridge label2`_ POINT TO CORRECT TARGET."
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/literalblock.po b/tests/roots/test-intl/xx/LC_MESSAGES/literalblock.po
new file mode 100644
index 0000000..8d3e5d8
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/literalblock.po
@@ -0,0 +1,103 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-11-22 08:28+0000\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"
+
+msgid "i18n with literal block"
+msgstr "I18N WITH LITERAL BLOCK"
+
+msgid "Correct literal block::"
+msgstr "CORRECT LITERAL BLOCK::"
+
+msgid "Missing literal block::"
+msgstr "MISSING LITERAL BLOCK::"
+
+msgid "That's all."
+msgstr "THAT'S ALL."
+
+msgid "included raw.txt"
+msgstr "INCLUDED RAW.TXT"
+
+msgid "code blocks"
+msgstr "CODE-BLOCKS"
+
+msgid ""
+"def main\n"
+" 'result'\n"
+"end"
+msgstr ""
+"def main\n"
+" 'RESULT'\n"
+"end"
+
+msgid "example of C language"
+msgstr "EXAMPLE OF C LANGUAGE"
+
+msgid ""
+"#include <stdlib.h>\n"
+"int main(int argc, char** argv)\n"
+"{\n"
+" return 0;\n"
+"}"
+msgstr ""
+"#include <STDLIB.H>\n"
+"int main(int ARGC, char** ARGV)\n"
+"{\n"
+" return 0;\n"
+"}"
+
+msgid ""
+"#include <stdio.h>\n"
+"int main(int argc, char** argv)\n"
+"{\n"
+" return 0;\n"
+"}"
+msgstr ""
+"#include <STDIO.H>\n"
+"int main(int ARGC, char** ARGV)\n"
+"{\n"
+" return 0;\n"
+"}"
+
+msgid "literal-block\n"
+"in list"
+msgstr "LITERAL-BLOCK\n"
+"IN LIST"
+
+msgid "test_code_for_noqa()\n"
+"continued()"
+msgstr ""
+"# TRAILING noqa SHOULD NOT GET STRIPPED\n"
+"# FROM THIS BLOCK. #noqa"
+
+msgid "doctest blocks"
+msgstr "DOCTEST-BLOCKS"
+
+msgid ""
+">>> import sys # sys importing\n"
+">>> def main(): # define main function\n"
+"... sys.stdout.write('hello') # call write method of stdout object\n"
+">>>\n"
+">>> if __name__ == '__main__': # if run this py file as python script\n"
+"... main() # call main"
+msgstr ""
+">>> import sys # SYS IMPORTING\n"
+">>> def main(): # DEFINE MAIN FUNCTION\n"
+"... sys.stdout.write('hello') # CALL WRITE METHOD OF STDOUT OBJECT\n"
+">>>\n"
+">>> if __name__ == '__main__': # IF RUN THIS PY FILE AS PYTHON SCRIPT\n"
+"... main() # CALL MAIN"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/noqa.po b/tests/roots/test-intl/xx/LC_MESSAGES/noqa.po
new file mode 100644
index 0000000..1af66b4
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/noqa.po
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C)
+# This file is distributed under the same license as the Sphinx intl <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-01-16 15:23+0100\n"
+"PO-Revision-Date: 2022-01-16 15:23+0100\n"
+"Last-Translator: Jean Abou Samra <jean@abou-samra.fr>\n"
+"Language-Team: \n"
+"Language: xx\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.0\n"
+
+#: ../tests/roots/test-intl/noqa.txt:2
+msgid "First section"
+msgstr "FIRST SECTION"
+
+#: ../tests/roots/test-intl/noqa.txt:4
+msgid "Some text with a reference, :ref:`next-section`."
+msgstr "TRANSLATED TEXT WITHOUT REFERENCE. #noqa"
+
+#: ../tests/roots/test-intl/noqa.txt:6
+msgid "Another reference: :ref:`next-section`."
+msgstr ""
+"TEST noqa WHITESPACE INSENSITIVITY.\n"
+"# \n"
+" noqa"
+
+#: ../tests/roots/test-intl/noqa.txt:8
+msgid "This should allow to test escaping ``#noqa``."
+msgstr "``#noqa`` IS ESCAPED AT THE END OF THIS STRING. \\#noqa"
+
+#: ../tests/roots/test-intl/noqa.txt:13
+msgid "Next section"
+msgstr "NEXT SECTION WITH PARAGRAPH TO TEST BARE noqa"
+
+# This edge case should not fail.
+#: ../tests/roots/test-intl/noqa.txt:15
+msgid "Some text, again referring to the section: :ref:`next-section`."
+msgstr "#noqa"
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/only.po b/tests/roots/test-intl/xx/LC_MESSAGES/only.po
new file mode 100644
index 0000000..43eb7d6
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/only.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010, Georg Brandl & Team
+# This file is distributed under the same license as the Sphinx <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx <Tests> 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-04 13:06+0000\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"
+
+msgid "Only directive"
+msgstr "ONLY DIRECTIVE"
+
+msgid "In HTML."
+msgstr "IN HTML."
+
+msgid "In LaTeX."
+msgstr "IN LATEX."
+
+msgid "In both."
+msgstr "IN BOTH."
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/raw.po b/tests/roots/test-intl/xx/LC_MESSAGES/raw.po
new file mode 100644
index 0000000..f2e8893
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/raw.po
@@ -0,0 +1,21 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2015, dev
+# This file is distributed under the same license as the 1235 package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: 1235 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-02-22 15:22+0900\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"
+
+msgid "<iframe src=\"http://sphinx-doc.org\"></iframe>"
+msgstr "<iframe src=\"HTTP://SPHINX-DOC.ORG\"></iframe>"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/refs.po b/tests/roots/test-intl/xx/LC_MESSAGES/refs.po
new file mode 100644
index 0000000..510a5a7
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/refs.po
@@ -0,0 +1,85 @@
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1191 1.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-08-08 15:31+0900\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"
+
+msgid "Translation Tips"
+msgstr "X TIPS"
+
+msgid "A-1. Here's how you can `download Sphinx`_."
+msgstr "A-1. HERE'S HOW YOU CAN `download Sphinx`_."
+
+msgid "A-2. Here's how you can `download Sphinx`_."
+msgstr "A-2. HERE'S HOW YOU CAN `A1 DOWNLOAD SPHINX`_."
+
+msgid "A-3. Here's how you can `download Sphinx`_."
+msgstr ""
+"A-3. HERE'S HOW YOU CAN `A3 DOWNLOAD SPHINX <download Sphinx_>`_ AND `A3 DOWNLOAD "
+"SPHINX <download Sphinx_>`_."
+
+msgid "B-1. `Docutils site`_ and `Sphinx site`_."
+msgstr "B-1. `Docutils site`_ and `Sphinx site`_."
+
+msgid "B-2. `Docutils site`_ and `Sphinx site`_."
+msgstr "B-2. `B1 DOCUTILS SITE`_ AND `B1 SPHINX SITE`_."
+
+msgid "B-3. `Docutils site`_ and `Sphinx site`_."
+msgstr "B-3. `B2 SPHINX SITE`_ AND `B2 DOCUTILS SITE`_."
+
+msgid "B-4. `Docutils site`_ and `Sphinx site`_."
+msgstr ""
+"B-4. `B4 SPHINX SITE <Sphinx site_>`_ AND `B4 DOCUTILS SITE <Docutils "
+"site_>`_."
+
+msgid "B-5. `Docutils site`_ and `Sphinx site`_."
+msgstr ""
+"B-5. `B5 SPHINX SITE <Sphinx site_>`_ AND `B5 DOCUTILS SITE <Docutils "
+"site_>`_\" AND `B5 SPHINX SITE <Sphinx site_>`_."
+
+msgid "C-1. Link to `Translation Tips`_ section."
+msgstr "C-1. LINK TO `Translation Tips`_ SECTION."
+
+msgid "C-2. Link to `Translation Tips`_ section."
+msgstr "C-2. LINK TO `X TIPS`_ SECTION."
+
+msgid "C-3. Link to `Translation Tips`_ section."
+msgstr "C-3. LINK TO `X TIPS <Translation Tips_>`_ SECTION."
+
+msgid "C-4. Link to `Translation Tips`_ section."
+msgstr ""
+"C-4. LINK TO `X TIPS <Translation Tips_>`_ x `X TIPS <Translation Tips_>`_ "
+"SECTION."
+
+msgid "C-5. Link to `Translation Tips`_ section."
+msgstr ""
+"C-5. LINK TO `TRANS <X TIPS_>`_ x `LATION <X TIPS_>`_ "
+
+msgid "D-1. Link to `Translation Tips`_ and `Next Section`_ section."
+msgstr "D-1. LINK TO `Translation Tips`_ and `Next Section`_ SECTION."
+
+msgid "D-2. Link to `Translation Tips`_ and `Next Section`_ section."
+msgstr "D-2. LINK TO `X TIPS`_ AND `N SECTION`_ SECTION."
+
+msgid "D-3. Link to `Translation Tips`_ and `Next Section`_ section."
+msgstr "D-3. LINK TO `N SECTION`_ AND `X TIPS`_ SECTION."
+
+msgid "D-4. Link to `Translation Tips`_ and `Next Section`_ section."
+msgstr ""
+"D-4. LINK TO `N SECTION <Next Section_>`_ AND `X TIPS <Translation Tips_>`_ "
+"SECTION."
+
+msgid "D-5. Link to `Translation Tips`_ and `Next Section`_ section."
+msgstr ""
+"D-5. LINK TO `Next <N SECTION_>`_ AND `Tips <X TIPS_>`_ "
+
+msgid "Next Section"
+msgstr "N SECTION"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/refs_inconsistency.po b/tests/roots/test-intl/xx/LC_MESSAGES/refs_inconsistency.po
new file mode 100644
index 0000000..9d8d13f
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/refs_inconsistency.po
@@ -0,0 +1,39 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-05 08:28+0000\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"
+
+msgid "i18n with refs inconsistency"
+msgstr "I18N WITH REFS INCONSISTENCY"
+
+msgid "[100]_ for [#]_ citation [ref2]_."
+msgstr "FOR CITATION [ref3]_."
+
+msgid "for reference_."
+msgstr "reference_ FOR reference_."
+
+msgid "normal text."
+msgstr "ORPHAN REFERENCE: `I18N WITH REFS INCONSISTENCY`_."
+
+msgid "This is a auto numbered footnote."
+msgstr "THIS IS A AUTO NUMBERED FOOTNOTE."
+
+msgid "This is a citation."
+msgstr "THIS IS A CITATION."
+
+msgid "This is a numbered footnote."
+msgstr "THIS IS A NUMBERED FOOTNOTE."
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/refs_python_domain.po b/tests/roots/test-intl/xx/LC_MESSAGES/refs_python_domain.po
new file mode 100644
index 0000000..bed87c4
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/refs_python_domain.po
@@ -0,0 +1,25 @@
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: issue1363 1363\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-03-16 19:34+0900\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"
+
+#: ..\..\index.rst:4
+msgid "i18n with python domain refs"
+msgstr "I18N WITH PYTHON DOMAIN REFS"
+
+#: ..\..\index.rst:8
+msgid "See this decorator: :func:`sensitive_variables`."
+msgstr "SEE THIS DECORATOR: :func:`sensitive_variables`."
+
+#: ..\..\index.rst:12
+msgid "Some description"
+msgstr "SOME DESCRIPTION"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/role_xref.po b/tests/roots/test-intl/xx/LC_MESSAGES/role_xref.po
new file mode 100644
index 0000000..96d821f
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/role_xref.po
@@ -0,0 +1,47 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-04 14:00+0000\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"
+
+msgid "i18n role xref"
+msgstr "I18N ROCK'N ROLE XREF"
+
+msgid "link to :term:`Some term`, :ref:`i18n-role-xref`, :doc:`index`."
+msgstr "LINK TO :ref:`i18n-role-xref`, :doc:`index`, :term:`SOME NEW TERM`."
+
+msgid "same type links"
+msgstr "SAME TYPE LINKS"
+
+msgid "link to :term:`Some term` and :term:`Some other term`."
+msgstr "LINK TO :term:`SOME OTHER NEW TERM` AND :term:`SOME NEW TERM`."
+
+msgid "link to :ref:`i18n-role-xref`, :ref:`same-type-links` and :ref:`label <same-type-links>`."
+msgstr "LINK TO :ref:`LABEL <i18n-role-xref>` AND :ref:`same-type-links` AND :ref:`same-type-links`."
+
+msgid "link to :doc:`index` and :doc:`glossary_terms`."
+msgstr "LINK TO :doc:`glossary_terms` AND :doc:`index`."
+
+msgid "link to :option:`-m` and :option:`--module`."
+msgstr "LINK TO :option:`--module` AND :option:`-m`."
+
+msgid "link to :envvar:`env1` and :envvar:`env2`."
+msgstr "LINK TO :envvar:`env2` AND :envvar:`env1`."
+
+msgid "link to :token:`token1` and :token:`token2`."
+msgstr "LINK TO :token:`token2` AND :token:`token1`."
+
+msgid "link to :keyword:`i18n-role-xref` and :keyword:`same-type-links`."
+msgstr "LINK TO :keyword:`same-type-links` AND :keyword:`i18n-role-xref`."
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/rubric.po b/tests/roots/test-intl/xx/LC_MESSAGES/rubric.po
new file mode 100644
index 0000000..9137623
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/rubric.po
@@ -0,0 +1,29 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-11-12 07:00+0000\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"
+
+msgid "i18n with rubric"
+msgstr "I18N WITH RUBRIC"
+
+msgid "rubric title"
+msgstr "RUBRIC TITLE"
+
+msgid "rubric in the block"
+msgstr "RUBRIC IN THE BLOCK"
+
+msgid "block"
+msgstr "BLOCK"
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/section.po b/tests/roots/test-intl/xx/LC_MESSAGES/section.po
new file mode 100644
index 0000000..4af349c
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/section.po
@@ -0,0 +1,28 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2018, dev
+# This file is distributed under the same license as the sphinx package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-05-06 16:44+0900\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 2.4.0\n"
+
+msgid "1. Section"
+msgstr "1. SECTION"
+
+msgid "2. Sub Section"
+msgstr "2. SUB SECTION"
+
+msgid "3. Contents Title"
+msgstr "3. CONTENTS TITLE"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/seealso.po b/tests/roots/test-intl/xx/LC_MESSAGES/seealso.po
new file mode 100644
index 0000000..86a1c73
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/seealso.po
@@ -0,0 +1,33 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010, Georg Brandl & Team
+# This file is distributed under the same license as the Sphinx <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx <Tests> 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-16 06:06+0000\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"
+
+msgid "i18n with seealso"
+msgstr "I18N WITH SEEALSO"
+
+msgid "short text 1"
+msgstr "SHORT TEXT 1"
+
+msgid "long text 1"
+msgstr "LONG TEXT 1"
+
+msgid "short text 2"
+msgstr "SHORT TEXT 2"
+
+msgid "long text 2"
+msgstr "LONG TEXT 2"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/sphinx.po b/tests/roots/test-intl/xx/LC_MESSAGES/sphinx.po
new file mode 100644
index 0000000..a236f2f
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/sphinx.po
@@ -0,0 +1,23 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2012, foof
+# This file is distributed under the same license as the foo package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-11-22 08:28+0000\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"
+
+msgid "Welcome"
+msgstr "WELCOME"
+
+msgid "Sphinx %(version)s"
+msgstr "SPHINX %(version)s"
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/table.po b/tests/roots/test-intl/xx/LC_MESSAGES/table.po
new file mode 100644
index 0000000..d8ffd35
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/table.po
@@ -0,0 +1,54 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010, Georg Brandl & Team
+# This file is distributed under the same license as the Sphinx <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx <Tests> 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-16 06:06+0000\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"
+
+msgid "i18n with table"
+msgstr "I18N WITH TABLE"
+
+msgid "table caption"
+msgstr "TABLE CAPTION"
+
+msgid "header1"
+msgstr "HEADER1"
+
+msgid "header2"
+msgstr "HEADER2"
+
+msgid "text1"
+msgstr "TEXT1"
+
+msgid "text2"
+msgstr "TEXT2"
+
+msgid "text3"
+msgstr "TEXT3"
+
+msgid "text1"
+msgstr "TEXT1"
+
+msgid "text4"
+msgstr "TEXT4"
+
+msgid "text5"
+msgstr "TEXT5"
+
+msgid "text6"
+msgstr "TEXT6"
+
+msgid "1. table caption"
+msgstr "1. TABLE CAPTION"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/toctree.po b/tests/roots/test-intl/xx/LC_MESSAGES/toctree.po
new file mode 100644
index 0000000..62cccdf
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/toctree.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C)
+# This file is distributed under the same license as the Sphinx intl <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx intl <Tests> 2013.120\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-11-01 10:24+0900\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"
+
+#: ../../toctree.txt:4
+msgid "figure"
+msgstr "FIGURE"
+
+#: ../../toctree.txt:4
+#: ../../toctree.txt:4
+msgid "caption"
+msgstr "CAPTION"
+
+#: ../../toctree.txt:2
+msgid "i18n with toctree"
+msgstr "I18N WITH TOCTREE"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/topic.po b/tests/roots/test-intl/xx/LC_MESSAGES/topic.po
new file mode 100644
index 0000000..53ecb0d
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/topic.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2018, dev
+# This file is distributed under the same license as the sphinx package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-05-06 16:44+0900\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 2.4.0\n"
+
+msgid "i18n with topic"
+msgstr "I18N WITH TOPIC"
+
+msgid "Topic Title"
+msgstr "TOPIC TITLE"
+
+msgid "Topic Content"
+msgstr "TOPIC CONTENT"
+
+msgid "1. Topic Title"
+msgstr "1. TOPIC TITLE"
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/translation_progress.po b/tests/roots/test-intl/xx/LC_MESSAGES/translation_progress.po
new file mode 100644
index 0000000..94673d1
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/translation_progress.po
@@ -0,0 +1,57 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2000-01-01 00:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: \n"
+"Language: xx\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Translation Progress"
+msgstr "TRANSLATION PROGRESS"
+
+msgid "When, in disgrace with fortune and men’s eyes,"
+msgstr "WHEN, IN DISGRACE WITH FORTUNE AND MEN’S EYES,"
+
+msgid "I all alone beweep my outcast state,"
+msgstr "I ALL ALONE BEWEEP MY OUTCAST STATE,"
+
+msgid "And trouble deaf heaven with my bootless cries,"
+msgstr "AND TROUBLE DEAF HEAVEN WITH MY BOOTLESS CRIES,"
+
+msgid "And look upon myself, and curse my fate,"
+msgstr "AND LOOK UPON MYSELF, AND CURSE MY FATE,"
+
+msgid "Wishing me like to one more rich in hope,"
+msgstr "WISHING ME LIKE TO ONE MORE RICH IN HOPE,"
+
+msgid "Featur’d like him, like him with friends possess’d,"
+msgstr "FEATUR’D LIKE HIM, LIKE HIM WITH FRIENDS POSSESS’D,"
+
+msgid "Desiring this man’s art and that man’s scope,"
+msgstr "DESIRING THIS MAN’S ART AND THAT MAN’S SCOPE,"
+
+msgid "With what I most enjoy contented least;"
+msgstr "WITH WHAT I MOST ENJOY CONTENTED LEAST;"
+
+# idempotent translations (2 out of 14 lines):
+
+msgid "Yet in these thoughts myself almost despising,"
+msgstr "Yet in these thoughts myself almost despising,"
+
+msgid "Haply I think on thee, and then my state,"
+msgstr "Haply I think on thee, and then my state,"
+
+# untranslated (2 out of 14 lines):
+
+msgid "Like to the lark at break of day arising"
+msgstr ""
+
+msgid "From sullen earth, sings hymns at heaven’s gate;"
+msgstr ""
+
+# translation missing (2 out of 14 lines):
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/versionchange.po b/tests/roots/test-intl/xx/LC_MESSAGES/versionchange.po
new file mode 100644
index 0000000..5a8df38
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/versionchange.po
@@ -0,0 +1,33 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010, Georg Brandl & Team
+# This file is distributed under the same license as the Sphinx <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-12-15 03:17+0000\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"
+
+msgid "i18n with versionchange"
+msgstr "I18N WITH VERSIONCHANGE"
+
+msgid "This is the *first* paragraph of deprecated."
+msgstr "THIS IS THE *FIRST* PARAGRAPH OF DEPRECATED."
+
+msgid "This is the *second* paragraph of deprecated."
+msgstr "THIS IS THE *SECOND* PARAGRAPH OF DEPRECATED."
+
+msgid "This is the *first* paragraph of versionadded."
+msgstr "THIS IS THE *FIRST* PARAGRAPH OF VERSIONADDED."
+
+msgid "This is the *first* paragraph of versionchanged."
+msgstr "THIS IS THE *FIRST* PARAGRAPH OF VERSIONCHANGED."
+
diff --git a/tests/roots/test-intl/xx/LC_MESSAGES/warnings.po b/tests/roots/test-intl/xx/LC_MESSAGES/warnings.po
new file mode 100644
index 0000000..7963a0a
--- /dev/null
+++ b/tests/roots/test-intl/xx/LC_MESSAGES/warnings.po
@@ -0,0 +1,23 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2010, Georg Brandl & Team
+# This file is distributed under the same license as the Sphinx <Tests> package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Sphinx <Tests> 0.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-04 13:06+0000\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"
+
+msgid "i18n with reST warnings"
+msgstr "I18N WITH REST WARNINGS"
+
+msgid "line of ``literal`` markup."
+msgstr "LINE OF ``BROKEN LITERAL MARKUP."
diff --git a/tests/roots/test-intl_substitution_definitions/conf.py b/tests/roots/test-intl_substitution_definitions/conf.py
new file mode 100644
index 0000000..5e43033
--- /dev/null
+++ b/tests/roots/test-intl_substitution_definitions/conf.py
@@ -0,0 +1,13 @@
+exclude_patterns = ['_build']
+
+rst_prolog = """\
+.. |subst_prolog_1| replace:: prologue substitute text
+
+.. |subst_prolog_2| image:: /img.png
+"""
+
+rst_epilog = """\
+.. |subst_epilog_1| replace:: epilogue substitute text
+
+.. |subst_epilog_2| image:: /i18n.png
+"""
diff --git a/tests/roots/test-intl_substitution_definitions/i18n.png b/tests/roots/test-intl_substitution_definitions/i18n.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-intl_substitution_definitions/i18n.png
Binary files differ
diff --git a/tests/roots/test-intl_substitution_definitions/img.png b/tests/roots/test-intl_substitution_definitions/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-intl_substitution_definitions/img.png
Binary files differ
diff --git a/tests/roots/test-intl_substitution_definitions/index.rst b/tests/roots/test-intl_substitution_definitions/index.rst
new file mode 100644
index 0000000..9b8c155
--- /dev/null
+++ b/tests/roots/test-intl_substitution_definitions/index.rst
@@ -0,0 +1,10 @@
+CONTENTS
+========
+
+.. toctree::
+ :maxdepth: 2
+ :numbered:
+ :caption: Table of Contents
+
+ prolog_epilog_substitution
+ prolog_epilog_substitution_excluded
diff --git a/tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution.rst b/tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution.rst
new file mode 100644
index 0000000..4127ba4
--- /dev/null
+++ b/tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution.rst
@@ -0,0 +1,12 @@
+:tocdepth: 2
+
+i18n with prologue and epilogue substitutions
+=============================================
+
+This is content that contains |subst_prolog_1|.
+
+Substituted image |subst_prolog_2| here.
+
+This is content that contains |subst_epilog_1|.
+
+Substituted image |subst_epilog_2| here.
diff --git a/tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution_excluded.rst b/tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution_excluded.rst
new file mode 100644
index 0000000..0ddfc74
--- /dev/null
+++ b/tests/roots/test-intl_substitution_definitions/prolog_epilog_substitution_excluded.rst
@@ -0,0 +1,6 @@
+:tocdepth: 2
+
+i18n without prologue and epilogue substitutions
+================================================
+
+This is content that does not include prologue and epilogue substitutions.
diff --git a/tests/roots/test-intl_substitution_definitions/xx/LC_MESSAGES/prolog_epilog_substitution.po b/tests/roots/test-intl_substitution_definitions/xx/LC_MESSAGES/prolog_epilog_substitution.po
new file mode 100644
index 0000000..3ce51fe
--- /dev/null
+++ b/tests/roots/test-intl_substitution_definitions/xx/LC_MESSAGES/prolog_epilog_substitution.po
@@ -0,0 +1,38 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinx tests\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-07-21 12:00+0800\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"
+
+msgid "i18n with prologue and epilogue substitutions"
+msgstr "I18N WITH PROLOGUE AND EPILOGUE SUBSTITUTIONS"
+
+msgid "This is content that contains |subst_prolog_1|."
+msgstr "THIS IS CONTENT THAT CONTAINS |subst_prolog_1|."
+
+msgid "Substituted image |subst_prolog_2| here."
+msgstr "SUBSTITUTED IMAGE |subst_prolog_2| HERE."
+
+msgid "This is content that contains |subst_epilog_1|."
+msgstr "THIS IS CONTENT THAT CONTAINS |subst_epilog_1|."
+
+msgid "Substituted image |subst_epilog_2| here."
+msgstr "SUBSTITUTED IMAGE |subst_epilog_2| HERE."
+
+msgid "subst_prolog_2"
+msgstr "SUBST_PROLOG_2 TRANSLATED"
+
+msgid ".. image:: /img.png"
+msgstr ".. image:: /i18n.png"
+
+msgid "subst_epilog_2"
+msgstr "SUBST_EPILOG_2 TRANSLATED"
+
+msgid ".. image:: /i18n.png"
+msgstr ".. image:: /img.png"
diff --git a/tests/roots/test-keep_warnings/conf.py b/tests/roots/test-keep_warnings/conf.py
new file mode 100644
index 0000000..b7b3c31
--- /dev/null
+++ b/tests/roots/test-keep_warnings/conf.py
@@ -0,0 +1 @@
+keep_warnings = True
diff --git a/tests/roots/test-keep_warnings/index.rst b/tests/roots/test-keep_warnings/index.rst
new file mode 100644
index 0000000..1e2d597
--- /dev/null
+++ b/tests/roots/test-keep_warnings/index.rst
@@ -0,0 +1,2 @@
+keep_warnings
+=====
diff --git a/tests/roots/test-latex-babel/bar.rst b/tests/roots/test-latex-babel/bar.rst
new file mode 100644
index 0000000..c1ddf30
--- /dev/null
+++ b/tests/roots/test-latex-babel/bar.rst
@@ -0,0 +1,4 @@
+===
+Bar
+===
+
diff --git a/tests/roots/test-latex-babel/conf.py b/tests/roots/test-latex-babel/conf.py
new file mode 100644
index 0000000..175e3ff
--- /dev/null
+++ b/tests/roots/test-latex-babel/conf.py
@@ -0,0 +1,5 @@
+numfig_format = {
+ 'figure': 'Fig. %s',
+ 'table': 'Table. %s',
+ 'code-block': 'List.',
+}
diff --git a/tests/roots/test-latex-babel/foo.rst b/tests/roots/test-latex-babel/foo.rst
new file mode 100644
index 0000000..cecc672
--- /dev/null
+++ b/tests/roots/test-latex-babel/foo.rst
@@ -0,0 +1,4 @@
+===
+Foo
+===
+
diff --git a/tests/roots/test-latex-babel/index.rst b/tests/roots/test-latex-babel/index.rst
new file mode 100644
index 0000000..7c19f9e
--- /dev/null
+++ b/tests/roots/test-latex-babel/index.rst
@@ -0,0 +1,8 @@
+test-tocdepth
+=============
+
+.. toctree::
+ :caption: Table of content
+
+ foo
+ bar
diff --git a/tests/roots/test-latex-container/conf.py b/tests/roots/test-latex-container/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-latex-container/conf.py
diff --git a/tests/roots/test-latex-container/index.rst b/tests/roots/test-latex-container/index.rst
new file mode 100644
index 0000000..899788b
--- /dev/null
+++ b/tests/roots/test-latex-container/index.rst
@@ -0,0 +1,4 @@
+.. container:: classname
+
+ text
+ \ No newline at end of file
diff --git a/tests/roots/test-latex-equations/conf.py b/tests/roots/test-latex-equations/conf.py
new file mode 100644
index 0000000..d851892
--- /dev/null
+++ b/tests/roots/test-latex-equations/conf.py
@@ -0,0 +1,2 @@
+root_doc = 'equations'
+extensions = ['sphinx.ext.imgmath']
diff --git a/tests/roots/test-latex-equations/equations.rst b/tests/roots/test-latex-equations/equations.rst
new file mode 100644
index 0000000..2eef2f2
--- /dev/null
+++ b/tests/roots/test-latex-equations/equations.rst
@@ -0,0 +1,21 @@
+test-latex-equation
+===================
+
+Equation without a label.
+
+.. math::
+
+ E = mc^2
+
+Equation with label.
+
+.. math:: E = hv
+ :label: test
+
+Second equation without label.
+
+.. math::
+
+ c^2 = a^2 + b^2
+
+Equation with label :eq:`test` is important.
diff --git a/tests/roots/test-latex-equations/expects/latex-equations.tex b/tests/roots/test-latex-equations/expects/latex-equations.tex
new file mode 100644
index 0000000..5374a67
--- /dev/null
+++ b/tests/roots/test-latex-equations/expects/latex-equations.tex
@@ -0,0 +1,18 @@
+
+\sphinxAtStartPar
+Equation without a label.
+\begin{equation*}
+\begin{split}E = mc^2\end{split}
+\end{equation*}
+\sphinxAtStartPar
+Equation with label.
+\begin{equation}\label{equation:equations:test}
+\begin{split}E = hv\end{split}
+\end{equation}
+\sphinxAtStartPar
+Second equation without label.
+\begin{equation*}
+\begin{split}c^2 = a^2 + b^2\end{split}
+\end{equation*}
+\sphinxAtStartPar
+Equation with label \eqref{equation:equations:test} is important.
diff --git a/tests/roots/test-latex-figure-in-admonition/conf.py b/tests/roots/test-latex-figure-in-admonition/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-latex-figure-in-admonition/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-latex-figure-in-admonition/img.png b/tests/roots/test-latex-figure-in-admonition/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-latex-figure-in-admonition/img.png
Binary files differ
diff --git a/tests/roots/test-latex-figure-in-admonition/index.rst b/tests/roots/test-latex-figure-in-admonition/index.rst
new file mode 100644
index 0000000..e3d39d3
--- /dev/null
+++ b/tests/roots/test-latex-figure-in-admonition/index.rst
@@ -0,0 +1,9 @@
+Test Figure in Admonition
+=========================
+
+.. caution::
+
+ This uses a figure in an admonition.
+
+ .. figure:: img.png
+
diff --git a/tests/roots/test-latex-includegraphics/conf.py b/tests/roots/test-latex-includegraphics/conf.py
new file mode 100644
index 0000000..65c19ab
--- /dev/null
+++ b/tests/roots/test-latex-includegraphics/conf.py
@@ -0,0 +1,47 @@
+exclude_patterns = ['_build']
+
+latex_elements = {
+ 'preamble': r'''
+\makeatletter
+\def\dividetwolengths#1#2{\the\dimexpr
+ \numexpr65536*\dimexpr#1\relax/\dimexpr#2\relax sp}%
+\newwrite\out
+\immediate\openout\out=\jobname-dimensions.txt
+\def\toout{\immediate\write\out}
+\def\getWfromoptions #1width=#2,#3\relax{\def\WidthFromOption{#2}}%
+\def\getHfromoptions #1height=#2,#3\relax{\def\HeightFromOption{#2}}%
+\def\tempincludegraphics[#1]#2{%
+ \sphinxsafeincludegraphics[#1]{#2}%
+ \edef\obtainedratio
+ {\dividetwolengths\spx@image@requiredheight\spx@image@requiredwidth}%
+ \getWfromoptions#1,width=,\relax
+ \getHfromoptions#1,height=,\relax
+ \def\ratiocheck{}%
+ \ifx\WidthFromOption\empty\else
+ \ifx\HeightFromOption\empty\else
+ \edef\askedforratio{\dividetwolengths\HeightFromOption\WidthFromOption}%
+ \edef\ratiocheck{\dividetwolengths\obtainedratio\askedforratio}%
+ \fi\fi
+ \toout{original options = #1^^J%
+ width = \the\dimexpr\spx@image@requiredwidth,
+ linewidth = \the\linewidth^^J%
+ height = \the\dimexpr\spx@image@requiredheight,
+ maxheight = \the\spx@image@maxheight^^J%
+ obtained H/W = \obtainedratio^^J%
+ \ifx\ratiocheck\empty
+ \else
+ asked for H/W = \askedforratio^^J%
+ ratio of ratios = \ratiocheck^^J%
+ \fi
+ }%
+ \ifx\ratiocheck\empty
+ \else
+ \ifpdfabsdim\dimexpr\ratiocheck-1pt\relax > 0.01pt
+ \ASPECTRATIOERROR
+ \fi
+ \fi
+}
+\def\sphinxincludegraphics#1#{\tempincludegraphics#1}
+\makeatother
+''',
+}
diff --git a/tests/roots/test-latex-includegraphics/img.png b/tests/roots/test-latex-includegraphics/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-latex-includegraphics/img.png
Binary files differ
diff --git a/tests/roots/test-latex-includegraphics/index.rst b/tests/roots/test-latex-includegraphics/index.rst
new file mode 100644
index 0000000..920c749
--- /dev/null
+++ b/tests/roots/test-latex-includegraphics/index.rst
@@ -0,0 +1,37 @@
+====================
+Test image inclusion
+====================
+
+Tests with both width and height
+--------------------------------
+
+.. an image with big dimensions, ratio H/W = 1/5
+.. image:: img.png
+ :height: 200
+ :width: 1000
+
+.. topic:: Oversized images
+
+ .. an image with big dimensions, ratio H/W = 5/1
+ .. image:: img.png
+ :height: 1000
+ :width: 200
+
+ .. height too big even if width reduced to linewidth, ratio H/W = 3/1
+ .. image:: img.png
+ :width: 1000
+ :height: 3000
+
+Tests with only width or height
+-------------------------------
+
+.. topic:: Oversized images
+
+ .. tall image which does not fit in textheight even if width rescaled
+ .. image:: tall.png
+ :width: 1000
+
+.. wide image which does not fit in linewidth even after height diminished
+.. image:: sphinx.png
+ :height: 1000
+
diff --git a/tests/roots/test-latex-includegraphics/sphinx.png b/tests/roots/test-latex-includegraphics/sphinx.png
new file mode 100644
index 0000000..0a103cd
--- /dev/null
+++ b/tests/roots/test-latex-includegraphics/sphinx.png
Binary files differ
diff --git a/tests/roots/test-latex-includegraphics/tall.png b/tests/roots/test-latex-includegraphics/tall.png
new file mode 100644
index 0000000..c98c058
--- /dev/null
+++ b/tests/roots/test-latex-includegraphics/tall.png
Binary files differ
diff --git a/tests/roots/test-latex-index/conf.py b/tests/roots/test-latex-index/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-latex-index/conf.py
diff --git a/tests/roots/test-latex-index/index.rst b/tests/roots/test-latex-index/index.rst
new file mode 100644
index 0000000..5b61279
--- /dev/null
+++ b/tests/roots/test-latex-index/index.rst
@@ -0,0 +1,16 @@
+test-latex-index
+================
+
+A :index:`famous` :index:`equation`:
+
+.. math::
+
+ E = m c^2
+
+.. index:: Einstein, relativity
+
+and some text.
+
+.. index:: main {
+
+An index entry containing non paired curly brace
diff --git a/tests/roots/test-latex-labels-before-module/automodule1.py b/tests/roots/test-latex-labels-before-module/automodule1.py
new file mode 100644
index 0000000..0545aa4
--- /dev/null
+++ b/tests/roots/test-latex-labels-before-module/automodule1.py
@@ -0,0 +1,2 @@
+"""docstring"""
+
diff --git a/tests/roots/test-latex-labels-before-module/automodule2a.py b/tests/roots/test-latex-labels-before-module/automodule2a.py
new file mode 100644
index 0000000..0545aa4
--- /dev/null
+++ b/tests/roots/test-latex-labels-before-module/automodule2a.py
@@ -0,0 +1,2 @@
+"""docstring"""
+
diff --git a/tests/roots/test-latex-labels-before-module/automodule2b.py b/tests/roots/test-latex-labels-before-module/automodule2b.py
new file mode 100644
index 0000000..0545aa4
--- /dev/null
+++ b/tests/roots/test-latex-labels-before-module/automodule2b.py
@@ -0,0 +1,2 @@
+"""docstring"""
+
diff --git a/tests/roots/test-latex-labels-before-module/automodule3.py b/tests/roots/test-latex-labels-before-module/automodule3.py
new file mode 100644
index 0000000..0545aa4
--- /dev/null
+++ b/tests/roots/test-latex-labels-before-module/automodule3.py
@@ -0,0 +1,2 @@
+"""docstring"""
+
diff --git a/tests/roots/test-latex-labels-before-module/conf.py b/tests/roots/test-latex-labels-before-module/conf.py
new file mode 100644
index 0000000..25193b0
--- /dev/null
+++ b/tests/roots/test-latex-labels-before-module/conf.py
@@ -0,0 +1,8 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autodoc']
+
+nitpicky = True
diff --git a/tests/roots/test-latex-labels-before-module/index.rst b/tests/roots/test-latex-labels-before-module/index.rst
new file mode 100644
index 0000000..e6df749
--- /dev/null
+++ b/tests/roots/test-latex-labels-before-module/index.rst
@@ -0,0 +1,48 @@
+latex-labels-before-module
+==========================
+
+.. _label_1a:
+.. _label_1b:
+
+.. module:: module1
+
+ text
+
+.. _label_2:
+
+.. module:: module2a
+
+ text
+
+.. module:: module2b
+
+ text
+
+.. _label_3:
+
+.. module:: module3
+
+ text
+
+.. _label_auto_1a:
+.. _label_auto_1b:
+
+.. automodule:: automodule1
+
+ text
+
+.. _label_auto_2:
+
+.. automodule:: automodule2a
+
+ text
+
+.. automodule:: automodule2b
+
+ text
+
+.. _label_auto_3:
+
+.. automodule:: automodule3
+
+ text
diff --git a/tests/roots/test-latex-labels/conf.py b/tests/roots/test-latex-labels/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-latex-labels/conf.py
diff --git a/tests/roots/test-latex-labels/index.rst b/tests/roots/test-latex-labels/index.rst
new file mode 100644
index 0000000..f3c4217
--- /dev/null
+++ b/tests/roots/test-latex-labels/index.rst
@@ -0,0 +1,72 @@
+latex-labels
+============
+
+figures
+-------
+
+.. _figure1:
+.. _figure2:
+
+.. figure:: logo.jpg
+
+ labeled figure
+
+.. figure:: logo.jpg
+ :name: figure3
+
+ labeled figure
+
+ with a legend
+
+code-blocks
+-----------
+
+.. _codeblock1:
+.. _codeblock2:
+
+.. code-block:: none
+
+ blah blah blah
+
+.. code-block:: none
+ :name: codeblock3
+
+ blah blah blah
+
+tables
+------
+
+.. _table1:
+.. _table2:
+
+.. table:: table caption
+
+ ==== ====
+ head head
+ cell cell
+ ==== ====
+
+.. table:: table caption
+ :name: table3
+
+ ==== ====
+ head head
+ cell cell
+ ==== ====
+
+.. _section1:
+.. _section2:
+
+subsection
+----------
+
+.. _section3:
+
+subsubsection
+~~~~~~~~~~~~~
+
+.. toctree::
+
+ otherdoc
+
+* Embedded standalone hyperlink reference(refs: #5948): `subsection <section1_>`_.
diff --git a/tests/roots/test-latex-labels/otherdoc.rst b/tests/roots/test-latex-labels/otherdoc.rst
new file mode 100644
index 0000000..55c5ca0
--- /dev/null
+++ b/tests/roots/test-latex-labels/otherdoc.rst
@@ -0,0 +1,2 @@
+otherdoc
+========
diff --git a/tests/roots/test-latex-numfig/conf.py b/tests/roots/test-latex-numfig/conf.py
new file mode 100644
index 0000000..287bd1c
--- /dev/null
+++ b/tests/roots/test-latex-numfig/conf.py
@@ -0,0 +1,8 @@
+extensions = ['sphinx.ext.imgmath'] # for math_numfig
+
+latex_documents = [
+ ('indexmanual', 'SphinxManual.tex', 'Test numfig manual',
+ 'Sphinx', 'manual'),
+ ('indexhowto', 'SphinxHowTo.tex', 'Test numfig howto',
+ 'Sphinx', 'howto'),
+]
diff --git a/tests/roots/test-latex-numfig/index.rst b/tests/roots/test-latex-numfig/index.rst
new file mode 100644
index 0000000..6b8b968
--- /dev/null
+++ b/tests/roots/test-latex-numfig/index.rst
@@ -0,0 +1,9 @@
+=================
+test-latex-numfig
+=================
+
+.. toctree::
+ :numbered:
+
+ indexmanual
+ indexhowto
diff --git a/tests/roots/test-latex-numfig/indexhowto.rst b/tests/roots/test-latex-numfig/indexhowto.rst
new file mode 100644
index 0000000..4749f1e
--- /dev/null
+++ b/tests/roots/test-latex-numfig/indexhowto.rst
@@ -0,0 +1,10 @@
+=======================
+test-latex-numfig-howto
+=======================
+
+This is a part
+==============
+
+This is a section
+-----------------
+
diff --git a/tests/roots/test-latex-numfig/indexmanual.rst b/tests/roots/test-latex-numfig/indexmanual.rst
new file mode 100644
index 0000000..8bab4fb
--- /dev/null
+++ b/tests/roots/test-latex-numfig/indexmanual.rst
@@ -0,0 +1,13 @@
+========================
+test-latex-numfig-manual
+========================
+
+First part
+==========
+
+This is chapter
+---------------
+
+This is section
+~~~~~~~~~~~~~~~
+
diff --git a/tests/roots/test-latex-table/_mytemplates/latex/longtable.tex_t b/tests/roots/test-latex-table/_mytemplates/latex/longtable.tex_t
new file mode 100644
index 0000000..e2cb1db
--- /dev/null
+++ b/tests/roots/test-latex-table/_mytemplates/latex/longtable.tex_t
@@ -0,0 +1 @@
+SALUT LES COPAINS
diff --git a/tests/roots/test-latex-table/complex.rst b/tests/roots/test-latex-table/complex.rst
new file mode 100644
index 0000000..d648ff1
--- /dev/null
+++ b/tests/roots/test-latex-table/complex.rst
@@ -0,0 +1,58 @@
+complex tables
+==============
+
+grid table
+----------
+
+.. rst-class:: nocolorrows
+
++---------+---------+---------+
+| header1 | header2 | header3 |
++=========+=========+=========+
+| cell1-1 | cell1-2 | cell1-3 |
++---------+ +---------+
+| cell2-1 | | cell2-3 |
++ +---------+---------+
+| | cell3-2-par1 |
++---------+ |
+| cell4-1 | cell3-2-par2 |
++---------+---------+---------+
+| cell5-1 |
++---------+---------+---------+
+
+grid table with tabularcolumns having no vline
+----------------------------------------------
+
+.. tabularcolumns:: TTT
+
++---------+---------+---------+
+| header1 | header2 | header3 |
++=========+=========+=========+
+| cell1-1 | cell1-2 | cell1-3 |
++---------+ +---------+
+| cell2-1 | | cell2-3 |
++ +---------+---------+
+| | cell3-2-par1 |
++---------+ |
+| cell4-1 | cell3-2-par2 |
++---------+---------+---------+
+| cell5-1 |
++---------+---------+---------+
+
+complex spanning cell
+---------------------
+
+table having ...
+
+* consecutive multirow at top of row (1-1 and 1-2)
+* consecutive multirow at end of row (1-4 and 1-5)
+
+.. rst-class:: standard
+
++-----------+-----------+-----------+-----------+-----------+
+| | | cell1-3 | | |
+| | +-----------+ | cell1-5 |
+| cell1-1 | cell1-2 | | cell1-4 | |
+| | | cell2-3 | +-----------+
+| | | | | cell3-5 |
++-----------+-----------+-----------+-----------+-----------+
diff --git a/tests/roots/test-latex-table/conf.py b/tests/roots/test-latex-table/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-latex-table/conf.py
diff --git a/tests/roots/test-latex-table/expects/complex_spanning_cell.tex b/tests/roots/test-latex-table/expects/complex_spanning_cell.tex
new file mode 100644
index 0000000..d2d6189
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/complex_spanning_cell.tex
@@ -0,0 +1,69 @@
+\label{\detokenize{complex:complex-spanning-cell}}
+\sphinxAtStartPar
+table having …
+\begin{itemize}
+\item {}
+\sphinxAtStartPar
+consecutive multirow at top of row (1\sphinxhyphen{}1 and 1\sphinxhyphen{}2)
+
+\item {}
+\sphinxAtStartPar
+consecutive multirow at end of row (1\sphinxhyphen{}4 and 1\sphinxhyphen{}5)
+
+\end{itemize}
+
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\sphinxthistablewithstandardstyle
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|T|T|}
+\sphinxtoprule
+\sphinxtableatstartofbodyhook\sphinxmultirow{3}{1}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{5}}
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxmultirow{3}{2}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{5}}
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}3
+&\sphinxmultirow{3}{4}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{5}}
+\sphinxAtStartPar
+cell1\sphinxhyphen{}4
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxmultirow{2}{5}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{5}}
+\sphinxAtStartPar
+cell1\sphinxhyphen{}5
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+\\
+\sphinxvlinecrossing{1}\sphinxcline{3-3}\sphinxvlinecrossing{4}\sphinxfixclines{5}\sphinxtablestrut{1}&\sphinxtablestrut{2}&\sphinxmultirow{2}{6}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{5}}
+\sphinxAtStartPar
+cell2\sphinxhyphen{}3
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxtablestrut{4}&\sphinxtablestrut{5}\\
+\sphinxvlinecrossing{1}\sphinxvlinecrossing{2}\sphinxvlinecrossing{3}\sphinxcline{5-5}\sphinxfixclines{5}\sphinxtablestrut{1}&\sphinxtablestrut{2}&\sphinxtablestrut{6}&\sphinxtablestrut{4}&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}5
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/gridtable.tex b/tests/roots/test-latex-table/expects/gridtable.tex
new file mode 100644
index 0000000..407abe7
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/gridtable.tex
@@ -0,0 +1,73 @@
+\label{\detokenize{complex:grid-table}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\sphinxthistablewithnocolorrowsstyle
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|T|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header3
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&\sphinxmultirow{2}{5}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{3}}
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}3
+\\
+\sphinxcline{1-1}\sphinxcline{3-3}\sphinxfixclines{3}\sphinxmultirow{2}{7}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{3}}
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxtablestrut{5}&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}3
+\\
+\sphinxcline{2-3}\sphinxfixclines{3}\sphinxtablestrut{7}&\sphinxstartmulticolumn{2}%
+\sphinxmultirow{2}{9}{%
+\begin{varwidth}[t]{\sphinxcolwidth{2}{3}}
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2\sphinxhyphen{}par1
+
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2\sphinxhyphen{}par2
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+\sphinxstopmulticolumn
+\\
+\sphinxcline{1-1}\sphinxfixclines{3}
+\sphinxAtStartPar
+cell4\sphinxhyphen{}1
+&\multicolumn{2}{l|}{\sphinxtablestrut{9}}\\
+\sphinxhline\sphinxstartmulticolumn{3}%
+\begin{varwidth}[t]{\sphinxcolwidth{3}{3}}
+\sphinxAtStartPar
+cell5\sphinxhyphen{}1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+\sphinxstopmulticolumn
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/gridtable_with_tabularcolumn.tex b/tests/roots/test-latex-table/expects/gridtable_with_tabularcolumn.tex
new file mode 100644
index 0000000..c77b990
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/gridtable_with_tabularcolumn.tex
@@ -0,0 +1,73 @@
+\label{\detokenize{complex:grid-table-with-tabularcolumns-having-no-vline}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\sphinxthistablewithnovlinesstyle
+\centering
+\begin{tabulary}{\linewidth}[t]{TTT}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header3
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&\sphinxmultirow{2}{5}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{3}}
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}3
+\\
+\sphinxcline{1-1}\sphinxcline{3-3}\sphinxfixclines{3}\sphinxmultirow{2}{7}{%
+\begin{varwidth}[t]{\sphinxcolwidth{1}{3}}
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+&\sphinxtablestrut{5}&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}3
+\\
+\sphinxcline{2-3}\sphinxfixclines{3}\sphinxtablestrut{7}&\sphinxstartmulticolumn{2}%
+\sphinxmultirow{2}{9}{%
+\begin{varwidth}[t]{\sphinxcolwidth{2}{3}}
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2\sphinxhyphen{}par1
+
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2\sphinxhyphen{}par2
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+}%
+\sphinxstopmulticolumn
+\\
+\sphinxcline{1-1}\sphinxfixclines{3}
+\sphinxAtStartPar
+cell4\sphinxhyphen{}1
+&\multicolumn{2}{l}{\sphinxtablestrut{9}}\\
+\sphinxhline\sphinxstartmulticolumn{3}%
+\begin{varwidth}[t]{\sphinxcolwidth{3}{3}}
+\sphinxAtStartPar
+cell5\sphinxhyphen{}1
+\par
+\vskip-\baselineskip\vbox{\hbox{\strut}}\end{varwidth}%
+\sphinxstopmulticolumn
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable.tex b/tests/roots/test-latex-table/expects/longtable.tex
new file mode 100644
index 0000000..1fe1022
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable.tex
@@ -0,0 +1,70 @@
+\label{\detokenize{longtable:longtable}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\sphinxthistablewithborderlessstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{ll}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable_having_align.tex b/tests/roots/test-latex-table/expects/longtable_having_align.tex
new file mode 100644
index 0000000..4a4df18
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_having_align.tex
@@ -0,0 +1,69 @@
+\label{\detokenize{longtable:longtable-having-align-option}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax
+\makeatother
+\begin{longtable}{|l|l|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable_having_caption.tex b/tests/roots/test-latex-table/expects/longtable_having_caption.tex
new file mode 100644
index 0000000..a1aa65d
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_having_caption.tex
@@ -0,0 +1,71 @@
+\label{\detokenize{longtable:longtable-having-caption}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{|l|l|}
+\sphinxthelongtablecaptionisattop
+\caption{caption for longtable\strut}\label{\detokenize{longtable:id1}}\\*[\sphinxlongtablecapskipadjust]
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable_having_problematic_cell.tex b/tests/roots/test-latex-table/expects/longtable_having_problematic_cell.tex
new file mode 100644
index 0000000..240a760
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_having_problematic_cell.tex
@@ -0,0 +1,76 @@
+\label{\detokenize{longtable:longtable-having-problematic-cell}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{|*{2}{\X{1}{2}|}}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+\begin{itemize}
+\item {}
+\sphinxAtStartPar
+item1
+
+\item {}
+\sphinxAtStartPar
+item2
+
+\end{itemize}
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable_having_stub_columns_and_problematic_cell.tex b/tests/roots/test-latex-table/expects/longtable_having_stub_columns_and_problematic_cell.tex
new file mode 100644
index 0000000..897830b
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_having_stub_columns_and_problematic_cell.tex
@@ -0,0 +1,81 @@
+\label{\detokenize{longtable:longtable-having-both-stub-columns-and-problematic-cell}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{|*{3}{\X{1}{3}|}}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header3
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{3}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header3
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{3}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+\sphinxstyletheadfamily \begin{itemize}
+\item {}
+\sphinxAtStartPar
+instub1\sphinxhyphen{}1a
+
+\item {}
+\sphinxAtStartPar
+instub1\sphinxhyphen{}1b
+
+\end{itemize}
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+instub1\sphinxhyphen{}2
+&
+\sphinxAtStartPar
+notinstub1\sphinxhyphen{}3
+\\
+\sphinxhline\sphinxstyletheadfamily
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}3
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable_having_verbatim.tex b/tests/roots/test-latex-table/expects/longtable_having_verbatim.tex
new file mode 100644
index 0000000..b9f7512
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_having_verbatim.tex
@@ -0,0 +1,70 @@
+\label{\detokenize{longtable:longtable-having-verbatim}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{|*{2}{\X{1}{2}|}}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+
+\begin{sphinxVerbatimintable}[commandchars=\\\{\}]
+\PYG{n}{hello} \PYG{n}{world}
+\end{sphinxVerbatimintable}
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable_having_widths.tex b/tests/roots/test-latex-table/expects/longtable_having_widths.tex
new file mode 100644
index 0000000..24dad79
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_having_widths.tex
@@ -0,0 +1,73 @@
+\label{\detokenize{longtable:longtable-having-widths-option}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{|\X{30}{100}|\X{70}{100}|}
+\noalign{\phantomsection\label{\detokenize{longtable:namedlongtable}}\label{\detokenize{longtable:mylongtable}}}%
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
+
+\sphinxAtStartPar
+See {\hyperref[\detokenize{longtable:mylongtable}]{\sphinxcrossref{mylongtable}}}, same as {\hyperref[\detokenize{longtable:namedlongtable}]{\sphinxcrossref{\DUrole{std,std-ref}{this one}}}}.
diff --git a/tests/roots/test-latex-table/expects/longtable_having_widths_and_problematic_cell.tex b/tests/roots/test-latex-table/expects/longtable_having_widths_and_problematic_cell.tex
new file mode 100644
index 0000000..b4758ca
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_having_widths_and_problematic_cell.tex
@@ -0,0 +1,76 @@
+\label{\detokenize{longtable:longtable-having-both-widths-and-problematic-cell}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{|\X{30}{100}|\X{70}{100}|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+\begin{itemize}
+\item {}
+\sphinxAtStartPar
+item1
+
+\item {}
+\sphinxAtStartPar
+item2
+
+\end{itemize}
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/longtable_with_tabularcolumn.tex b/tests/roots/test-latex-table/expects/longtable_with_tabularcolumn.tex
new file mode 100644
index 0000000..4c380fe
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/longtable_with_tabularcolumn.tex
@@ -0,0 +1,70 @@
+\label{\detokenize{longtable:longtable-with-tabularcolumn}}
+
+\begin{savenotes}
+\sphinxatlongtablestart
+\sphinxthistablewithglobalstyle
+\sphinxthistablewithvlinesstyle
+\makeatletter
+ \LTleft \@totalleftmargin plus1fill
+ \LTright\dimexpr\columnwidth-\@totalleftmargin-\linewidth\relax plus1fill
+\makeatother
+\begin{longtable}{|c|c|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endfirsthead
+
+\multicolumn{2}{c}{\sphinxnorowcolor
+ \makebox[0pt]{\sphinxtablecontinued{\tablename\ \thetable{} \textendash{} continued from previous page}}%
+}\\
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\endhead
+
+\sphinxbottomrule
+\multicolumn{2}{r}{\sphinxnorowcolor
+ \makebox[0pt][r]{\sphinxtablecontinued{continues on next page}}%
+}\\
+\endfoot
+
+\endlastfoot
+\sphinxtableatstartofbodyhook
+
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{longtable}
+\sphinxtableafterendhook
+\sphinxatlongtableend
+\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/simple_table.tex b/tests/roots/test-latex-table/expects/simple_table.tex
new file mode 100644
index 0000000..7bd85c7
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/simple_table.tex
@@ -0,0 +1,40 @@
+\label{\detokenize{tabular:simple-table}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|T|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/table_having_caption.tex b/tests/roots/test-latex-table/expects/table_having_caption.tex
new file mode 100644
index 0000000..f2ce553
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/table_having_caption.tex
@@ -0,0 +1,44 @@
+\label{\detokenize{tabular:table-having-caption}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\centering
+\sphinxcapstartof{table}
+\sphinxthecaptionisattop
+\sphinxcaption{caption for table}\label{\detokenize{tabular:id1}}
+\sphinxaftertopcaption
+\begin{tabulary}{\linewidth}[t]{|T|T|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/table_having_problematic_cell.tex b/tests/roots/test-latex-table/expects/table_having_problematic_cell.tex
new file mode 100644
index 0000000..7d7ad4b
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/table_having_problematic_cell.tex
@@ -0,0 +1,47 @@
+\label{\detokenize{tabular:table-having-problematic-cell}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\centering
+\begin{tabular}[t]{|*{2}{\X{1}{2}|}}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook\begin{itemize}
+\item {}
+\sphinxAtStartPar
+item1
+
+\item {}
+\sphinxAtStartPar
+item2
+
+\end{itemize}
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabular}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/table_having_stub_columns_and_problematic_cell.tex b/tests/roots/test-latex-table/expects/table_having_stub_columns_and_problematic_cell.tex
new file mode 100644
index 0000000..fbd797a
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/table_having_stub_columns_and_problematic_cell.tex
@@ -0,0 +1,49 @@
+\label{\detokenize{tabular:table-having-both-stub-columns-and-problematic-cell}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\centering
+\begin{tabular}[t]{|*{3}{\X{1}{3}|}}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header3
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook\sphinxstyletheadfamily \begin{itemize}
+\item {}
+\sphinxAtStartPar
+instub1\sphinxhyphen{}1a
+
+\item {}
+\sphinxAtStartPar
+instub1\sphinxhyphen{}1b
+
+\end{itemize}
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+instub1\sphinxhyphen{}2
+&
+\sphinxAtStartPar
+notinstub1\sphinxhyphen{}3
+\\
+\sphinxhline\sphinxstyletheadfamily
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}3
+\\
+\sphinxbottomrule
+\end{tabular}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/table_having_threeparagraphs_cell_in_first_col.tex b/tests/roots/test-latex-table/expects/table_having_threeparagraphs_cell_in_first_col.tex
new file mode 100644
index 0000000..9acd9a8
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/table_having_threeparagraphs_cell_in_first_col.tex
@@ -0,0 +1,26 @@
+\label{\detokenize{tabular:table-with-cell-in-first-column-having-three-paragraphs}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\centering
+\begin{tabulary}{\linewidth}[t]{|T|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1\sphinxhyphen{}par1
+
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1\sphinxhyphen{}par2
+
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1\sphinxhyphen{}par3
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/table_having_verbatim.tex b/tests/roots/test-latex-table/expects/table_having_verbatim.tex
new file mode 100644
index 0000000..a002de5
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/table_having_verbatim.tex
@@ -0,0 +1,41 @@
+\label{\detokenize{tabular:table-having-verbatim}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\centering
+\begin{tabular}[t]{|*{2}{\X{1}{2}|}}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\begin{sphinxVerbatimintable}[commandchars=\\\{\}]
+\PYG{n}{hello} \PYG{n}{world}
+\end{sphinxVerbatimintable}
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabular}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/table_having_widths.tex b/tests/roots/test-latex-table/expects/table_having_widths.tex
new file mode 100644
index 0000000..fe5f4c4
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/table_having_widths.tex
@@ -0,0 +1,46 @@
+\label{\detokenize{tabular:table-having-widths-option}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\sphinxthistablewithbooktabsstyle
+\sphinxthistablewithcolorrowsstyle
+\centering
+\phantomsection\label{\detokenize{tabular:namedtabular}}\label{\detokenize{tabular:mytabular}}\nobreak
+\begin{tabular}[t]{\X{30}{100}\X{70}{100}}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabular}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
+
+\sphinxAtStartPar
+See {\hyperref[\detokenize{tabular:mytabular}]{\sphinxcrossref{\DUrole{std,std-ref}{this}}}}, same as {\hyperref[\detokenize{tabular:namedtabular}]{\sphinxcrossref{namedtabular}}}.
diff --git a/tests/roots/test-latex-table/expects/table_having_widths_and_problematic_cell.tex b/tests/roots/test-latex-table/expects/table_having_widths_and_problematic_cell.tex
new file mode 100644
index 0000000..1baf92c
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/table_having_widths_and_problematic_cell.tex
@@ -0,0 +1,47 @@
+\label{\detokenize{tabular:table-having-both-widths-and-problematic-cell}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\centering
+\begin{tabular}[t]{|\X{30}{100}|\X{70}{100}|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook\begin{itemize}
+\item {}
+\sphinxAtStartPar
+item1
+
+\item {}
+\sphinxAtStartPar
+item2
+
+\end{itemize}
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabular}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/tabular_having_widths.tex b/tests/roots/test-latex-table/expects/tabular_having_widths.tex
new file mode 100644
index 0000000..15321d6
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/tabular_having_widths.tex
@@ -0,0 +1,40 @@
+\label{\detokenize{tabular:table-having-align-option-tabular}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\raggedright
+\begin{tabular}[t]{|\X{30}{100}|\X{70}{100}|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabular}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/tabularcolumn.tex b/tests/roots/test-latex-table/expects/tabularcolumn.tex
new file mode 100644
index 0000000..fcb01be
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/tabularcolumn.tex
@@ -0,0 +1,41 @@
+\label{\detokenize{tabular:table-with-tabularcolumn}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\sphinxthistablewithnovlinesstyle
+\centering
+\begin{tabulary}{\linewidth}[t]{cc}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/expects/tabulary_having_widths.tex b/tests/roots/test-latex-table/expects/tabulary_having_widths.tex
new file mode 100644
index 0000000..2463416
--- /dev/null
+++ b/tests/roots/test-latex-table/expects/tabulary_having_widths.tex
@@ -0,0 +1,40 @@
+\label{\detokenize{tabular:table-having-align-option-tabulary}}
+
+\begin{savenotes}\sphinxattablestart
+\sphinxthistablewithglobalstyle
+\raggedleft
+\begin{tabulary}{\linewidth}[t]{|T|T|}
+\sphinxtoprule
+\sphinxstyletheadfamily
+\sphinxAtStartPar
+header1
+&\sphinxstyletheadfamily
+\sphinxAtStartPar
+header2
+\\
+\sphinxmidrule
+\sphinxtableatstartofbodyhook
+\sphinxAtStartPar
+cell1\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell1\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell2\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell2\sphinxhyphen{}2
+\\
+\sphinxhline
+\sphinxAtStartPar
+cell3\sphinxhyphen{}1
+&
+\sphinxAtStartPar
+cell3\sphinxhyphen{}2
+\\
+\sphinxbottomrule
+\end{tabulary}
+\sphinxtableafterendhook\par
+\sphinxattableend\end{savenotes}
diff --git a/tests/roots/test-latex-table/index.rst b/tests/roots/test-latex-table/index.rst
new file mode 100644
index 0000000..80dd110
--- /dev/null
+++ b/tests/roots/test-latex-table/index.rst
@@ -0,0 +1,8 @@
+test-latex-table
+================
+
+.. toctree::
+
+ tabular
+ longtable
+ complex
diff --git a/tests/roots/test-latex-table/longtable.rst b/tests/roots/test-latex-table/longtable.rst
new file mode 100644
index 0000000..da6fa5c
--- /dev/null
+++ b/tests/roots/test-latex-table/longtable.rst
@@ -0,0 +1,156 @@
+longtables
+==========
+
+longtable
+---------
+
+.. table::
+ :class: longtable, borderless
+
+ ======= =======
+ header1 header2
+ ======= =======
+ cell1-1 cell1-2
+ cell2-1 cell2-2
+ cell3-1 cell3-2
+ ======= =======
+
+longtable having :widths: option
+--------------------------------
+
+.. _mylongtable:
+
+.. table::
+ :class: longtable
+ :widths: 30,70
+ :name: namedlongtable
+
+ ======= =======
+ header1 header2
+ ======= =======
+ cell1-1 cell1-2
+ cell2-1 cell2-2
+ cell3-1 cell3-2
+ ======= =======
+
+See mylongtable_, same as :ref:`this one <namedlongtable>`.
+
+longtable having :align: option
+-------------------------------
+
+.. table::
+ :align: right
+ :class: longtable
+
+ ======= =======
+ header1 header2
+ ======= =======
+ cell1-1 cell1-2
+ cell2-1 cell2-2
+ cell3-1 cell3-2
+ ======= =======
+
+longtable with tabularcolumn
+----------------------------
+
+.. tabularcolumns:: |c|c|
+
+.. table::
+ :class: longtable
+
+ ======= =======
+ header1 header2
+ ======= =======
+ cell1-1 cell1-2
+ cell2-1 cell2-2
+ cell3-1 cell3-2
+ ======= =======
+
+longtable having caption
+------------------------
+
+.. list-table:: caption for longtable
+ :class: longtable
+ :header-rows: 1
+
+ * - header1
+ - header2
+ * - cell1-1
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+longtable having verbatim
+-------------------------
+
+.. list-table::
+ :class: longtable
+ :header-rows: 1
+
+ * - header1
+ - header2
+ * - ::
+
+ hello world
+
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+longtable having both :widths: and problematic cell
+---------------------------------------------------
+
+.. list-table::
+ :class: longtable
+ :header-rows: 1
+ :widths: 30,70
+
+ * - header1
+ - header2
+ * - + item1
+ + item2
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+longtable having problematic cell
+---------------------------------
+
+.. list-table::
+ :class: longtable
+ :header-rows: 1
+
+ * - header1
+ - header2
+ * - + item1
+ + item2
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+longtable having both stub columns and problematic cell
+-------------------------------------------------------
+
+.. list-table::
+ :class: longtable
+ :header-rows: 1
+ :stub-columns: 2
+
+ * - header1
+ - header2
+ - header3
+ * - + instub1-1a
+ + instub1-1b
+ - instub1-2
+ - notinstub1-3
+ * - cell2-1
+ - cell2-2
+ - cell2-3
diff --git a/tests/roots/test-latex-table/tabular.rst b/tests/roots/test-latex-table/tabular.rst
new file mode 100644
index 0000000..15db823
--- /dev/null
+++ b/tests/roots/test-latex-table/tabular.rst
@@ -0,0 +1,173 @@
+tabular and tabulary
+====================
+
+simple table
+------------
+
+======= =======
+header1 header2
+======= =======
+cell1-1 cell1-2
+cell2-1 cell2-2
+cell3-1 cell3-2
+======= =======
+
+table having :widths: option
+----------------------------
+
+.. _mytabular:
+
+.. table::
+ :widths: 30,70
+ :name: namedtabular
+ :class: booktabs, colorrows
+
+ ======= =======
+ header1 header2
+ ======= =======
+ cell1-1 cell1-2
+ cell2-1 cell2-2
+ cell3-1 cell3-2
+ ======= =======
+
+See :ref:`this <mytabular>`, same as namedtabular_.
+
+table having :align: option (tabulary)
+--------------------------------------
+
+.. table::
+ :align: right
+
+ ======= =======
+ header1 header2
+ ======= =======
+ cell1-1 cell1-2
+ cell2-1 cell2-2
+ cell3-1 cell3-2
+ ======= =======
+
+table having :align: option (tabular)
+-------------------------------------
+
+.. table::
+ :align: left
+ :widths: 30,70
+
+ ======= =======
+ header1 header2
+ ======= =======
+ cell1-1 cell1-2
+ cell2-1 cell2-2
+ cell3-1 cell3-2
+ ======= =======
+
+table with tabularcolumn
+------------------------
+
+.. tabularcolumns:: cc
+
+======= =======
+header1 header2
+======= =======
+cell1-1 cell1-2
+cell2-1 cell2-2
+cell3-1 cell3-2
+======= =======
+
+table with cell in first column having three paragraphs
+-------------------------------------------------------
+
++--------------+
+| header1 |
++==============+
+| cell1-1-par1 |
+| |
+| cell1-1-par2 |
+| |
+| cell1-1-par3 |
++--------------+
+
+
+table having caption
+--------------------
+
+.. list-table:: caption for table
+ :header-rows: 1
+
+ * - header1
+ - header2
+ * - cell1-1
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+table having verbatim
+---------------------
+
+.. list-table::
+ :header-rows: 1
+
+ * - header1
+ - header2
+ * - ::
+
+ hello world
+
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+table having both :widths: and problematic cell
+-----------------------------------------------
+
+.. list-table::
+ :header-rows: 1
+ :widths: 30,70
+
+ * - header1
+ - header2
+ * - + item1
+ + item2
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+table having problematic cell
+-----------------------------
+
+.. list-table::
+ :header-rows: 1
+
+ * - header1
+ - header2
+ * - + item1
+ + item2
+ - cell1-2
+ * - cell2-1
+ - cell2-2
+ * - cell3-1
+ - cell3-2
+
+table having both stub columns and problematic cell
+---------------------------------------------------
+
+.. list-table::
+ :header-rows: 1
+ :stub-columns: 2
+
+ * - header1
+ - header2
+ - header3
+ * - + instub1-1a
+ + instub1-1b
+ - instub1-2
+ - notinstub1-3
+ * - cell2-1
+ - cell2-2
+ - cell2-3
diff --git a/tests/roots/test-latex-theme/conf.py b/tests/roots/test-latex-theme/conf.py
new file mode 100644
index 0000000..196307a
--- /dev/null
+++ b/tests/roots/test-latex-theme/conf.py
@@ -0,0 +1,2 @@
+latex_theme = 'custom'
+latex_theme_path = ['theme']
diff --git a/tests/roots/test-latex-theme/index.rst b/tests/roots/test-latex-theme/index.rst
new file mode 100644
index 0000000..f5b1d53
--- /dev/null
+++ b/tests/roots/test-latex-theme/index.rst
@@ -0,0 +1,2 @@
+latex_theme
+===========
diff --git a/tests/roots/test-latex-theme/theme/custom/theme.conf b/tests/roots/test-latex-theme/theme/custom/theme.conf
new file mode 100644
index 0000000..ad8df26
--- /dev/null
+++ b/tests/roots/test-latex-theme/theme/custom/theme.conf
@@ -0,0 +1,6 @@
+[theme]
+docclass = book
+wrapperclass = sphinxbook
+papersize = a4paper
+pointsize = 12pt
+toplevel_sectioning = chapter
diff --git a/tests/roots/test-latex-title/conf.py b/tests/roots/test-latex-title/conf.py
new file mode 100644
index 0000000..6443316
--- /dev/null
+++ b/tests/roots/test-latex-title/conf.py
@@ -0,0 +1,4 @@
+# set empty string to the third column to use the first section title to document title
+latex_documents = [
+ ('index', 'test.tex', '', 'Sphinx', 'report')
+]
diff --git a/tests/roots/test-latex-title/index.rst b/tests/roots/test-latex-title/index.rst
new file mode 100644
index 0000000..411ad00
--- /dev/null
+++ b/tests/roots/test-latex-title/index.rst
@@ -0,0 +1,12 @@
+.. admonition:: Notice
+
+ This generates nodes.title node before first section title.
+
+test-latex-title
+================
+
+.. toctree::
+ :numbered:
+
+ foo
+ bar
diff --git a/tests/roots/test-latex-unicode/conf.py b/tests/roots/test-latex-unicode/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-latex-unicode/conf.py
diff --git a/tests/roots/test-latex-unicode/index.rst b/tests/roots/test-latex-unicode/index.rst
new file mode 100644
index 0000000..2abeca9
--- /dev/null
+++ b/tests/roots/test-latex-unicode/index.rst
@@ -0,0 +1,7 @@
+test-latex-unicode
+==================
+
+* script small e: ℯ
+* double struck italic small i: â…ˆ
+* superscript: â°, ¹
+* subscript: â‚€, â‚
diff --git a/tests/roots/test-linkcheck-anchors-ignore-for-url/conf.py b/tests/roots/test-linkcheck-anchors-ignore-for-url/conf.py
new file mode 100644
index 0000000..0005bfa
--- /dev/null
+++ b/tests/roots/test-linkcheck-anchors-ignore-for-url/conf.py
@@ -0,0 +1,3 @@
+exclude_patterns = ['_build']
+linkcheck_anchors = True
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-anchors-ignore-for-url/index.rst b/tests/roots/test-linkcheck-anchors-ignore-for-url/index.rst
new file mode 100644
index 0000000..df287b4
--- /dev/null
+++ b/tests/roots/test-linkcheck-anchors-ignore-for-url/index.rst
@@ -0,0 +1,7 @@
+* `Example valid url, no anchor <http://localhost:7777/valid>`_
+* `Example valid url, valid anchor <http://localhost:7777/valid#valid-anchor>`_
+* `Example valid url, invalid anchor <http://localhost:7777/valid#invalid-anchor>`_
+* `Example ignored url, no anchor <http://localhost:7777/ignored>`_
+* `Example ignored url, invalid anchor <http://localhost:7777/ignored#invalid-anchor>`_
+* `Example invalid url, no anchor <http://localhost:7777/invalid>`_
+* `Example invalid url, invalid anchor <http://localhost:7777/invalid#anchor>`_
diff --git a/tests/roots/test-linkcheck-anchors-ignore/conf.py b/tests/roots/test-linkcheck-anchors-ignore/conf.py
new file mode 100644
index 0000000..0005bfa
--- /dev/null
+++ b/tests/roots/test-linkcheck-anchors-ignore/conf.py
@@ -0,0 +1,3 @@
+exclude_patterns = ['_build']
+linkcheck_anchors = True
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-anchors-ignore/index.rst b/tests/roots/test-linkcheck-anchors-ignore/index.rst
new file mode 100644
index 0000000..22a1379
--- /dev/null
+++ b/tests/roots/test-linkcheck-anchors-ignore/index.rst
@@ -0,0 +1,2 @@
+* `Example Bar invalid <http://localhost:7777/#!bar>`_
+* `Example Bar invalid <http://localhost:7777/#top>`_
diff --git a/tests/roots/test-linkcheck-documents_exclude/br0ken_link.rst b/tests/roots/test-linkcheck-documents_exclude/br0ken_link.rst
new file mode 100644
index 0000000..bf421f0
--- /dev/null
+++ b/tests/roots/test-linkcheck-documents_exclude/br0ken_link.rst
@@ -0,0 +1,5 @@
+Broken link
+===========
+
+Some links are `broken <https://www.sphinx-doc.org/this-is-another-broken-link>`__
+but sometimes not worrying about some broken links is a valid strategy.
diff --git a/tests/roots/test-linkcheck-documents_exclude/broken_link.rst b/tests/roots/test-linkcheck-documents_exclude/broken_link.rst
new file mode 100644
index 0000000..86e3bb4
--- /dev/null
+++ b/tests/roots/test-linkcheck-documents_exclude/broken_link.rst
@@ -0,0 +1,5 @@
+Broken link
+===========
+
+Some links are `broken <https://www.sphinx-doc.org/this-is-a-broken-link>`__
+but sometimes not worrying about some broken links is a valid strategy.
diff --git a/tests/roots/test-linkcheck-documents_exclude/conf.py b/tests/roots/test-linkcheck-documents_exclude/conf.py
new file mode 100644
index 0000000..52388f9
--- /dev/null
+++ b/tests/roots/test-linkcheck-documents_exclude/conf.py
@@ -0,0 +1,6 @@
+exclude_patterns = ['_build']
+linkcheck_exclude_documents = [
+ '^broken_link$',
+ 'br[0-9]ken_link',
+]
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-documents_exclude/index.rst b/tests/roots/test-linkcheck-documents_exclude/index.rst
new file mode 100644
index 0000000..57c39d8
--- /dev/null
+++ b/tests/roots/test-linkcheck-documents_exclude/index.rst
@@ -0,0 +1,3 @@
+.. toctree::
+ broken_link
+ br0ken_link \ No newline at end of file
diff --git a/tests/roots/test-linkcheck-localserver-anchor/conf.py b/tests/roots/test-linkcheck-localserver-anchor/conf.py
new file mode 100644
index 0000000..0005bfa
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver-anchor/conf.py
@@ -0,0 +1,3 @@
+exclude_patterns = ['_build']
+linkcheck_anchors = True
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-localserver-anchor/index.rst b/tests/roots/test-linkcheck-localserver-anchor/index.rst
new file mode 100644
index 0000000..807fe96
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver-anchor/index.rst
@@ -0,0 +1 @@
+`local server <http://localhost:7777/#anchor>`_
diff --git a/tests/roots/test-linkcheck-localserver-https/conf.py b/tests/roots/test-linkcheck-localserver-https/conf.py
new file mode 100644
index 0000000..a2ce01e
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver-https/conf.py
@@ -0,0 +1,2 @@
+exclude_patterns = ['_build']
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-localserver-https/index.rst b/tests/roots/test-linkcheck-localserver-https/index.rst
new file mode 100644
index 0000000..fea5983
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver-https/index.rst
@@ -0,0 +1 @@
+`HTTPS server <https://localhost:7777/>`_
diff --git a/tests/roots/test-linkcheck-localserver-warn-redirects/conf.py b/tests/roots/test-linkcheck-localserver-warn-redirects/conf.py
new file mode 100644
index 0000000..a2ce01e
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver-warn-redirects/conf.py
@@ -0,0 +1,2 @@
+exclude_patterns = ['_build']
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-localserver-warn-redirects/index.rst b/tests/roots/test-linkcheck-localserver-warn-redirects/index.rst
new file mode 100644
index 0000000..7359bd5
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver-warn-redirects/index.rst
@@ -0,0 +1,3 @@
+`local server1 <http://localhost:7777/path1>`_
+
+`local server2 <http://localhost:7777/path2>`_
diff --git a/tests/roots/test-linkcheck-localserver/conf.py b/tests/roots/test-linkcheck-localserver/conf.py
new file mode 100644
index 0000000..a2ce01e
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver/conf.py
@@ -0,0 +1,2 @@
+exclude_patterns = ['_build']
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-localserver/index.rst b/tests/roots/test-linkcheck-localserver/index.rst
new file mode 100644
index 0000000..c617e94
--- /dev/null
+++ b/tests/roots/test-linkcheck-localserver/index.rst
@@ -0,0 +1 @@
+`local server <http://localhost:7777/>`_
diff --git a/tests/roots/test-linkcheck-raw-node/conf.py b/tests/roots/test-linkcheck-raw-node/conf.py
new file mode 100644
index 0000000..a2ce01e
--- /dev/null
+++ b/tests/roots/test-linkcheck-raw-node/conf.py
@@ -0,0 +1,2 @@
+exclude_patterns = ['_build']
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-raw-node/index.rst b/tests/roots/test-linkcheck-raw-node/index.rst
new file mode 100644
index 0000000..76e26b5
--- /dev/null
+++ b/tests/roots/test-linkcheck-raw-node/index.rst
@@ -0,0 +1,2 @@
+.. raw:: html
+ :url: http://localhost:7777/
diff --git a/tests/roots/test-linkcheck-too-many-retries/conf.py b/tests/roots/test-linkcheck-too-many-retries/conf.py
new file mode 100644
index 0000000..0005bfa
--- /dev/null
+++ b/tests/roots/test-linkcheck-too-many-retries/conf.py
@@ -0,0 +1,3 @@
+exclude_patterns = ['_build']
+linkcheck_anchors = True
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck-too-many-retries/index.rst b/tests/roots/test-linkcheck-too-many-retries/index.rst
new file mode 100644
index 0000000..29b1ae4
--- /dev/null
+++ b/tests/roots/test-linkcheck-too-many-retries/index.rst
@@ -0,0 +1 @@
+`Non-existing uri with localhost <https://localhost:7777/doesnotexist>`_
diff --git a/tests/roots/test-linkcheck/conf.py b/tests/roots/test-linkcheck/conf.py
new file mode 100644
index 0000000..6ddb41a
--- /dev/null
+++ b/tests/roots/test-linkcheck/conf.py
@@ -0,0 +1,4 @@
+root_doc = 'links'
+exclude_patterns = ['_build']
+linkcheck_anchors = True
+linkcheck_timeout = 0.05
diff --git a/tests/roots/test-linkcheck/links.rst b/tests/roots/test-linkcheck/links.rst
new file mode 100644
index 0000000..88c757e
--- /dev/null
+++ b/tests/roots/test-linkcheck/links.rst
@@ -0,0 +1,14 @@
+Some additional anchors to exercise ignore code
+
+* `Valid url <http://localhost:7777/>`_
+* `Bar anchor invalid (trailing slash) <http://localhost:7777/#!bar>`_
+* `Bar anchor invalid <http://localhost:7777#!bar>`_ tests that default ignore anchor of #! does not need to be prefixed with /
+* `Top anchor invalid <http://localhost:7777/#top>`_
+* `'does-not-exist' anchor invalid <http://localhost:7777#does-not-exist>`_
+* `Valid local file <conf.py>`_
+* `Invalid local file <path/to/notfound>`_
+
+.. image:: http://localhost:7777/image.png
+.. figure:: http://localhost:7777/image2.png
+
+* `Valid anchored url <http://localhost:7777/anchor.html#found>`_
diff --git a/tests/roots/test-local-logo/conf.py b/tests/roots/test-local-logo/conf.py
new file mode 100644
index 0000000..1a166c1
--- /dev/null
+++ b/tests/roots/test-local-logo/conf.py
@@ -0,0 +1,4 @@
+latex_documents = [
+ ('index', 'test.tex', 'The basic Sphinx documentation for testing', 'Sphinx', 'report')
+]
+html_logo = "images/img.png"
diff --git a/tests/roots/test-local-logo/images/img.png b/tests/roots/test-local-logo/images/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-local-logo/images/img.png
Binary files differ
diff --git a/tests/roots/test-local-logo/index.rst b/tests/roots/test-local-logo/index.rst
new file mode 100644
index 0000000..af12ed6
--- /dev/null
+++ b/tests/roots/test-local-logo/index.rst
@@ -0,0 +1,31 @@
+The basic Sphinx documentation for testing
+==========================================
+
+Sphinx is a tool that makes it easy to create intelligent and beautiful
+documentation for Python projects (or other documents consisting of multiple
+reStructuredText sources), written by Georg Brandl. It was originally created
+for the new Python documentation, and has excellent facilities for Python
+project documentation, but C/C++ is supported as well, and more languages are
+planned.
+
+Sphinx uses reStructuredText as its markup language, and many of its strengths
+come from the power and straightforwardness of reStructuredText and its parsing
+and translating suite, the Docutils.
+
+features
+--------
+
+Among its features are the following:
+
+* Output formats: HTML (including derivative formats such as HTML Help, Epub
+ and Qt Help), plain text, manual pages and LaTeX or direct PDF output
+ using rst2pdf
+* Extensive cross-references: semantic markup and automatic links
+ for functions, classes, glossary terms and similar pieces of information
+* Hierarchical structure: easy definition of a document tree, with automatic
+ links to siblings, parents and children
+* Automatic indices: general index as well as a module index
+* Code handling: automatic highlighting using the Pygments highlighter
+* Flexible HTML output using the Jinja 2 templating engine
+* Various extensions are available, e.g. for automatic testing of snippets
+ and inclusion of appropriately formatted docstrings
diff --git a/tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.mo b/tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.mo
new file mode 100644
index 0000000..6aa00f7
--- /dev/null
+++ b/tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.mo
Binary files differ
diff --git a/tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.po b/tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.po
new file mode 100644
index 0000000..ee1f6c2
--- /dev/null
+++ b/tests/roots/test-locale/locale1/en/LC_MESSAGES/myext.po
@@ -0,0 +1,2 @@
+msgid "Hello world"
+msgstr "HELLO WORLD"
diff --git a/tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.mo b/tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.mo
new file mode 100644
index 0000000..c99a368
--- /dev/null
+++ b/tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.mo
Binary files differ
diff --git a/tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.po b/tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.po
new file mode 100644
index 0000000..1ecf6e3
--- /dev/null
+++ b/tests/roots/test-locale/locale1/et/LC_MESSAGES/myext.po
@@ -0,0 +1,2 @@
+msgid "Hello world"
+msgstr "Tere maailm"
diff --git a/tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.mo b/tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.mo
new file mode 100644
index 0000000..14c34d0
--- /dev/null
+++ b/tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.mo
Binary files differ
diff --git a/tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.po b/tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.po
new file mode 100644
index 0000000..d376cf9
--- /dev/null
+++ b/tests/roots/test-locale/locale2/en/LC_MESSAGES/myext.po
@@ -0,0 +1,2 @@
+msgid "Hello sphinx"
+msgstr "HELLO SPHINX"
diff --git a/tests/roots/test-manpage_url/conf.py b/tests/roots/test-manpage_url/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-manpage_url/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-manpage_url/index.rst b/tests/roots/test-manpage_url/index.rst
new file mode 100644
index 0000000..50d3b04
--- /dev/null
+++ b/tests/roots/test-manpage_url/index.rst
@@ -0,0 +1,3 @@
+ * :manpage:`man(1)`
+ * :manpage:`ls.1`
+ * :manpage:`sphinx`
diff --git a/tests/roots/test-markup-citation/conf.py b/tests/roots/test-markup-citation/conf.py
new file mode 100644
index 0000000..e274bde
--- /dev/null
+++ b/tests/roots/test-markup-citation/conf.py
@@ -0,0 +1,3 @@
+latex_documents = [
+ ('index', 'test.tex', 'The basic Sphinx documentation for testing', 'Sphinx', 'report')
+]
diff --git a/tests/roots/test-markup-citation/index.rst b/tests/roots/test-markup-citation/index.rst
new file mode 100644
index 0000000..238f093
--- /dev/null
+++ b/tests/roots/test-markup-citation/index.rst
@@ -0,0 +1,9 @@
+test-markup-citation
+=====================
+
+This is a citation ref; [CITE1]_ and [CITE2]_.
+
+.. [CITE1] This is a citation
+
+.. [CITE2] This is
+ a multiline citation
diff --git a/tests/roots/test-markup-rubric/conf.py b/tests/roots/test-markup-rubric/conf.py
new file mode 100644
index 0000000..e274bde
--- /dev/null
+++ b/tests/roots/test-markup-rubric/conf.py
@@ -0,0 +1,3 @@
+latex_documents = [
+ ('index', 'test.tex', 'The basic Sphinx documentation for testing', 'Sphinx', 'report')
+]
diff --git a/tests/roots/test-markup-rubric/index.rst b/tests/roots/test-markup-rubric/index.rst
new file mode 100644
index 0000000..c2ae68a
--- /dev/null
+++ b/tests/roots/test-markup-rubric/index.rst
@@ -0,0 +1,7 @@
+test-markup-rubric
+===================
+
+.. rubric:: This is a rubric
+
+.. rubric:: This is
+ a multiline rubric
diff --git a/tests/roots/test-maxlistdepth/conf.py b/tests/roots/test-maxlistdepth/conf.py
new file mode 100644
index 0000000..a3b12a2
--- /dev/null
+++ b/tests/roots/test-maxlistdepth/conf.py
@@ -0,0 +1,5 @@
+exclude_patterns = ['_build']
+
+latex_elements = {
+ 'maxlistdepth': '10',
+}
diff --git a/tests/roots/test-maxlistdepth/index.rst b/tests/roots/test-maxlistdepth/index.rst
new file mode 100644
index 0000000..5d9bc21
--- /dev/null
+++ b/tests/roots/test-maxlistdepth/index.rst
@@ -0,0 +1,57 @@
+test-maxlistdepth
+=================
+
+
+1. 1
+
+ 1. 2
+
+ 1. 3
+
+ 1. 4
+
+ 1. 5
+
+ 1. 6
+
+ 1. 7
+
+ 1. 8
+
+ 1. 9
+
+ 10a
+
+ - 10b
+
+ .. code-block:: python
+
+ def foo():
+
+
+- 1
+
+ - 2
+
+ - 3
+
+ - 4
+
+ - 5
+
+ - 6
+
+ - 7
+
+ - 8
+
+ 1. 9
+
+ 10a
+
+ 1. 10b
+
+ .. code-block:: python
+
+ def foo():
+
diff --git a/tests/roots/test-metadata/conf.py b/tests/roots/test-metadata/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-metadata/conf.py
diff --git a/tests/roots/test-metadata/index.rst b/tests/roots/test-metadata/index.rst
new file mode 100644
index 0000000..42af665
--- /dev/null
+++ b/tests/roots/test-metadata/index.rst
@@ -0,0 +1,46 @@
+:Author: David Goodger
+:Address: 123 Example Street
+ Example, EX Canada
+ A1B 2C3
+:Contact: goodger@python.org
+:Authors: Me; Myself; I
+:organization: humankind
+:date: $Date: 2006-05-21 22:44:42 +0200 (Son, 21 Mai 2006) $
+:status: This is a "work in progress"
+:revision: $Revision: 4564 $
+:version: 1
+:copyright: This document has been placed in the public domain. You
+ may do with it as you wish. You may copy, modify,
+ redistribute, reattribute, sell, buy, rent, lease,
+ destroy, or improve it, quote it at length, excerpt,
+ incorporate, collate, fold, staple, or mutilate it, or do
+ anything else to it that your or anyone else's heart
+ desires.
+:field name: This is a generic bibliographic field.
+:field name 2:
+ Generic bibliographic fields may contain multiple body elements.
+
+ Like this.
+
+:Dedication:
+
+ For Docutils users & co-developers.
+
+:abstract:
+
+ This document is a demonstration of the reStructuredText markup
+ language, containing examples of all basic reStructuredText
+ constructs and many advanced constructs.
+
+:nocomments:
+:orphan:
+:tocdepth: 1
+
+.. meta::
+ :keywords: reStructuredText, demonstration, demo, parser
+ :description lang=en: A demonstration of the reStructuredText
+ markup language, containing examples of all basic
+ constructs and many advanced constructs.
+
+test-metadata
+==============
diff --git a/tests/roots/test-need-escaped/bar.rst b/tests/roots/test-need-escaped/bar.rst
new file mode 100644
index 0000000..1cccd3c
--- /dev/null
+++ b/tests/roots/test-need-escaped/bar.rst
@@ -0,0 +1,2 @@
+bar
+===
diff --git a/tests/roots/test-need-escaped/baz.rst b/tests/roots/test-need-escaped/baz.rst
new file mode 100644
index 0000000..52e2e72
--- /dev/null
+++ b/tests/roots/test-need-escaped/baz.rst
@@ -0,0 +1,2 @@
+baz
+===
diff --git a/tests/roots/test-need-escaped/conf.py b/tests/roots/test-need-escaped/conf.py
new file mode 100644
index 0000000..0461ea3
--- /dev/null
+++ b/tests/roots/test-need-escaped/conf.py
@@ -0,0 +1,2 @@
+project = 'need <b>"escaped"</b> project'
+smartquotes = False
diff --git a/tests/roots/test-need-escaped/foo.rst b/tests/roots/test-need-escaped/foo.rst
new file mode 100644
index 0000000..70859b3
--- /dev/null
+++ b/tests/roots/test-need-escaped/foo.rst
@@ -0,0 +1,15 @@
+<foo>
+=====
+
+.. toctree::
+
+ quux
+
+foo "1"
+-------
+
+foo.1-1
+^^^^^^^
+
+foo.2
+-----
diff --git a/tests/roots/test-need-escaped/index.rst b/tests/roots/test-need-escaped/index.rst
new file mode 100644
index 0000000..9ef74e0
--- /dev/null
+++ b/tests/roots/test-need-escaped/index.rst
@@ -0,0 +1,30 @@
+.. Sphinx Tests documentation master file, created by sphinx-quickstart on Wed Jun 4 23:49:58 2008.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to Sphinx Tests's documentation!
+========================================
+
+Contents:
+
+.. toctree::
+ :maxdepth: 2
+ :numbered:
+ :caption: Table of Contents
+ :name: mastertoc
+
+ foo
+ bar
+ http://sphinx-doc.org/
+ baz
+ qux
+
+.. index::
+ pair: "subsection"; <subsection>
+
+----------
+subsection
+----------
+
+subsubsection
+-------------
diff --git a/tests/roots/test-need-escaped/quux.rst b/tests/roots/test-need-escaped/quux.rst
new file mode 100644
index 0000000..07dd0a0
--- /dev/null
+++ b/tests/roots/test-need-escaped/quux.rst
@@ -0,0 +1,2 @@
+quux
+====
diff --git a/tests/roots/test-need-escaped/qux.rst b/tests/roots/test-need-escaped/qux.rst
new file mode 100644
index 0000000..26176b9
--- /dev/null
+++ b/tests/roots/test-need-escaped/qux.rst
@@ -0,0 +1 @@
+qux.rst has no section title
diff --git a/tests/roots/test-nested-enumerated-list/conf.py b/tests/roots/test-nested-enumerated-list/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-nested-enumerated-list/conf.py
diff --git a/tests/roots/test-nested-enumerated-list/index.rst b/tests/roots/test-nested-enumerated-list/index.rst
new file mode 100644
index 0000000..28ad72f
--- /dev/null
+++ b/tests/roots/test-nested-enumerated-list/index.rst
@@ -0,0 +1,21 @@
+nested-enumerated-list
+======================
+
+5. Sphinx
+
+ d. Documentation builder
+ e. Egypt
+
+ 10) Pyramid
+ 11) Nile River
+
+ (x) Atbara
+ (y) Blue Nile
+ (#) Sobat
+ (#) Semliki
+ (#) Kagera
+
+6. Markup
+
+ iii. reStructuredText
+ iv. Markdown
diff --git a/tests/roots/test-nested-tables/conf.py b/tests/roots/test-nested-tables/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-nested-tables/conf.py
diff --git a/tests/roots/test-nested-tables/index.rst b/tests/roots/test-nested-tables/index.rst
new file mode 100644
index 0000000..79110ae
--- /dev/null
+++ b/tests/roots/test-nested-tables/index.rst
@@ -0,0 +1,16 @@
+nested-tables
+=============
+
+.. list-table::
+ :header-rows: 1
+
+ * - heading
+ - heading
+ * - content
+ - .. list-table::
+ :header-rows: 1
+
+ * - heading
+ - heading
+ * - content
+ - content
diff --git a/tests/roots/test-nitpicky-warnings/conf.py b/tests/roots/test-nitpicky-warnings/conf.py
new file mode 100644
index 0000000..2db221c
--- /dev/null
+++ b/tests/roots/test-nitpicky-warnings/conf.py
@@ -0,0 +1 @@
+nitpicky = True
diff --git a/tests/roots/test-nitpicky-warnings/index.rst b/tests/roots/test-nitpicky-warnings/index.rst
new file mode 100644
index 0000000..e73840d
--- /dev/null
+++ b/tests/roots/test-nitpicky-warnings/index.rst
@@ -0,0 +1,7 @@
+test-nitpicky-warnings
+======================
+
+:py:const:`prefix.anything.postfix`
+:py:class:`prefix.anything`
+:py:class:`anything.postfix`
+:js:class:`prefix.anything.postfix`
diff --git a/tests/roots/test-numbered-circular/conf.py b/tests/roots/test-numbered-circular/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-numbered-circular/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-numbered-circular/index.rst b/tests/roots/test-numbered-circular/index.rst
new file mode 100644
index 0000000..c3129cd
--- /dev/null
+++ b/tests/roots/test-numbered-circular/index.rst
@@ -0,0 +1,5 @@
+.. toctree::
+ :numbered:
+
+ sub
+
diff --git a/tests/roots/test-numbered-circular/sub.rst b/tests/roots/test-numbered-circular/sub.rst
new file mode 100644
index 0000000..cebfd65
--- /dev/null
+++ b/tests/roots/test-numbered-circular/sub.rst
@@ -0,0 +1,3 @@
+.. toctree::
+
+ index
diff --git a/tests/roots/test-numfig/bar.rst b/tests/roots/test-numfig/bar.rst
new file mode 100644
index 0000000..c4367c5
--- /dev/null
+++ b/tests/roots/test-numfig/bar.rst
@@ -0,0 +1,66 @@
+.. _bar:
+
+===
+Bar
+===
+
+.. _bar_a:
+
+Bar A
+=====
+
+.. figure:: rimg.png
+
+ should be Fig.2.1
+
+.. csv-table:: should be Table 2.1
+ :header-rows: 0
+
+ hello,world
+
+.. code-block:: python
+ :caption: should be List 2.1
+
+ print('hello world')
+
+.. toctree::
+
+ baz
+
+.. figure:: rimg.png
+
+ should be Fig.2.3
+
+.. csv-table:: should be Table 2.3
+ :header-rows: 0
+
+ hello,world
+
+.. code-block:: python
+ :caption: should be List 2.3
+
+ print('hello world')
+
+.. _bar_b:
+
+Bar B
+=====
+
+.. _bar_b1:
+
+Bar B1
+------
+
+.. figure:: rimg.png
+
+ should be Fig.2.4
+
+.. csv-table:: should be Table 2.4
+ :header-rows: 0
+
+ hello,world
+
+.. code-block:: python
+ :caption: should be List 2.4
+
+ print('hello world')
diff --git a/tests/roots/test-numfig/baz.rst b/tests/roots/test-numfig/baz.rst
new file mode 100644
index 0000000..3ac684b
--- /dev/null
+++ b/tests/roots/test-numfig/baz.rst
@@ -0,0 +1,24 @@
+.. _baz_a:
+
+Baz A
+-----
+
+.. _fig22:
+
+.. figure:: rimg.png
+
+ should be Fig.2.2
+
+.. _table22:
+
+.. csv-table:: should be Table 2.2
+ :header-rows: 0
+
+ hello,world
+
+.. _CODE22:
+
+.. code-block:: python
+ :caption: should be List 2.2
+
+ print('hello world')
diff --git a/tests/roots/test-numfig/conf.py b/tests/roots/test-numfig/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-numfig/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-numfig/foo.rst b/tests/roots/test-numfig/foo.rst
new file mode 100644
index 0000000..6b6a865
--- /dev/null
+++ b/tests/roots/test-numfig/foo.rst
@@ -0,0 +1,81 @@
+.. _foo:
+
+===
+Foo
+===
+
+.. figure:: rimg.png
+
+ should be Fig.1.1
+
+.. csv-table:: should be Table 1.1
+ :header-rows: 0
+
+ hello,world
+
+.. code-block:: python
+ :caption: should be List 1.1
+
+ print('hello world')
+
+.. _foo_a:
+
+Foo A
+=====
+
+.. figure:: rimg.png
+
+ should be Fig.1.2
+
+.. figure:: rimg.png
+
+ should be Fig.1.3
+
+.. csv-table:: should be Table 1.2
+ :header-rows: 0
+
+ hello,world
+
+.. csv-table:: should be Table 1.3
+ :header-rows: 0
+
+ hello,world
+
+.. code-block:: python
+ :caption: should be List 1.2
+
+ print('hello world')
+
+.. code-block:: python
+ :caption: should be List 1.3
+
+ print('hello world')
+
+.. _foo_a1:
+
+Foo A1
+------
+
+.. _foo_b:
+
+Foo B
+=====
+
+.. _foo_b1:
+
+Foo B1
+------
+
+.. figure:: rimg.png
+
+ should be Fig.1.4
+
+.. csv-table:: should be Table 1.4
+ :header-rows: 0
+
+ hello,world
+
+.. code-block:: python
+ :caption: should be List 1.4
+
+ print('hello world')
diff --git a/tests/roots/test-numfig/index.rst b/tests/roots/test-numfig/index.rst
new file mode 100644
index 0000000..9399038
--- /dev/null
+++ b/tests/roots/test-numfig/index.rst
@@ -0,0 +1,59 @@
+.. _index:
+
+test-tocdepth
+=============
+
+.. toctree::
+ :numbered:
+
+ foo
+ bar
+
+.. _fig1:
+
+.. figure:: rimg.png
+
+ should be Fig.1
+
+.. figure:: rimg.png
+
+ should be Fig.2
+
+.. _table-1:
+
+.. csv-table:: should be Table 1
+ :header-rows: 0
+
+ hello,world
+
+.. csv-table:: should be Table 2
+ :header-rows: 0
+
+ hello,world
+
+.. _CODE_1:
+
+.. code-block:: python
+ :caption: should be List 1
+
+ print('hello world')
+
+.. code-block:: python
+ :caption: should be List 2
+
+ print('hello world')
+
+
+* Fig.1 is :numref:`fig1`
+* Fig.2.2 is :numref:`Figure%s <fig22>`
+* Table.1 is :numref:`table-1`
+* Table.2.2 is :numref:`Table:%s <table22>`
+* List.1 is :numref:`CODE_1`
+* List.2.2 is :numref:`Code-%s <CODE22>`
+* Section.1 is :numref:`foo`
+* Section.2.1 is :numref:`bar_a`
+* Unnumbered section is :numref:`index`
+* Invalid numfig_format 01: :numref:`invalid <fig1>`
+* Invalid numfig_format 02: :numref:`Fig %s %s <fig1>`
+* Fig.1 is :numref:`Fig.{number} {name} <fig1>`
+* Section.1 is :numref:`Sect.{number} {name} <foo>`
diff --git a/tests/roots/test-numfig/rimg.png b/tests/roots/test-numfig/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-numfig/rimg.png
Binary files differ
diff --git a/tests/roots/test-object-description-sections/conf.py b/tests/roots/test-object-description-sections/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-object-description-sections/conf.py
diff --git a/tests/roots/test-object-description-sections/index.rst b/tests/roots/test-object-description-sections/index.rst
new file mode 100644
index 0000000..1892f94
--- /dev/null
+++ b/tests/roots/test-object-description-sections/index.rst
@@ -0,0 +1,6 @@
+.. py:function:: func()
+
+ Overview
+ --------
+
+ Lorem ipsum dolar sit amet
diff --git a/tests/roots/test-productionlist/Bare.rst b/tests/roots/test-productionlist/Bare.rst
new file mode 100644
index 0000000..8ea9213
--- /dev/null
+++ b/tests/roots/test-productionlist/Bare.rst
@@ -0,0 +1,6 @@
+Bare
+====
+
+.. productionlist::
+ A: `A` | somethingA
+ B: `B` | somethingB
diff --git a/tests/roots/test-productionlist/Dup1.rst b/tests/roots/test-productionlist/Dup1.rst
new file mode 100644
index 0000000..5cd09cb
--- /dev/null
+++ b/tests/roots/test-productionlist/Dup1.rst
@@ -0,0 +1,5 @@
+Dup1
+====
+
+.. productionlist::
+ Dup: `Dup` | somethingDup
diff --git a/tests/roots/test-productionlist/Dup2.rst b/tests/roots/test-productionlist/Dup2.rst
new file mode 100644
index 0000000..1d66375
--- /dev/null
+++ b/tests/roots/test-productionlist/Dup2.rst
@@ -0,0 +1,5 @@
+Dup2
+====
+
+.. productionlist::
+ Dup: `Dup` | somethingDup
diff --git a/tests/roots/test-productionlist/LineContinuation.rst b/tests/roots/test-productionlist/LineContinuation.rst
new file mode 100644
index 0000000..4943e8b
--- /dev/null
+++ b/tests/roots/test-productionlist/LineContinuation.rst
@@ -0,0 +1,6 @@
+LineContinuation
+================
+
+.. productionlist:: lineContinuation
+ A: B C D \
+ E F G
diff --git a/tests/roots/test-productionlist/P1.rst b/tests/roots/test-productionlist/P1.rst
new file mode 100644
index 0000000..6f9a863
--- /dev/null
+++ b/tests/roots/test-productionlist/P1.rst
@@ -0,0 +1,6 @@
+P1
+==
+
+.. productionlist:: P1
+ A: `A` | somethingA
+ B: `B` | somethingB
diff --git a/tests/roots/test-productionlist/P2.rst b/tests/roots/test-productionlist/P2.rst
new file mode 100644
index 0000000..e6c3bc1
--- /dev/null
+++ b/tests/roots/test-productionlist/P2.rst
@@ -0,0 +1,6 @@
+P2
+==
+
+.. productionlist:: P2
+ A: `A` | somethingA
+ B: `B` | somethingB
diff --git a/tests/roots/test-productionlist/conf.py b/tests/roots/test-productionlist/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-productionlist/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-productionlist/firstLineRule.rst b/tests/roots/test-productionlist/firstLineRule.rst
new file mode 100644
index 0000000..30ea6e0
--- /dev/null
+++ b/tests/roots/test-productionlist/firstLineRule.rst
@@ -0,0 +1,5 @@
+FirstLineRule
+=============
+
+.. productionlist:: FirstLine: something
+ SecondLine: somethingElse
diff --git a/tests/roots/test-productionlist/index.rst b/tests/roots/test-productionlist/index.rst
new file mode 100644
index 0000000..4a0b978
--- /dev/null
+++ b/tests/roots/test-productionlist/index.rst
@@ -0,0 +1,27 @@
+.. toctree::
+
+ P1
+ P2
+ Bare
+ Dup1
+ Dup2
+ firstLineRule
+ LineContinuation
+
+- A: :token:`A`
+- B: :token:`B`
+- P1:A: :token:`P1:A`
+- P1:B: :token:`P1:B`
+- P2:A: :token:`P1:A`
+- P2:B: :token:`P2:B`
+- Explicit title A, plain: :token:`MyTitle <A>`
+- Explicit title A, colon: :token:`My:Title <A>`
+- Explicit title P1:A, plain: :token:`MyTitle <P1:A>`
+- Explicit title P1:A, colon: :token:`My:Title <P1:A>`
+- Tilde A: :token:`~A`.
+- Tilde P1:A: :token:`~P1:A`.
+- Tilde explicit title P1:A: :token:`~MyTitle <P1:A>`
+- Tilde, explicit title P1:A: :token:`MyTitle <~P1:A>`
+- Dup: :token:`Dup`
+- FirstLine: :token:`FirstLine`
+- SecondLine: :token:`SecondLine`
diff --git a/tests/roots/test-prolog/conf.py b/tests/roots/test-prolog/conf.py
new file mode 100644
index 0000000..f6be09c
--- /dev/null
+++ b/tests/roots/test-prolog/conf.py
@@ -0,0 +1,10 @@
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('.'))
+
+
+extensions = ['prolog_markdown_parser']
+
+rst_prolog = '*Hello world*.\n\n'
+rst_epilog = '\n\n*Good-bye world*.'
diff --git a/tests/roots/test-prolog/index.rst b/tests/roots/test-prolog/index.rst
new file mode 100644
index 0000000..2178d73
--- /dev/null
+++ b/tests/roots/test-prolog/index.rst
@@ -0,0 +1,7 @@
+prolog and epilog
+=================
+
+.. toctree::
+
+ restructuredtext
+ markdown
diff --git a/tests/roots/test-prolog/markdown.md b/tests/roots/test-prolog/markdown.md
new file mode 100644
index 0000000..e400720
--- /dev/null
+++ b/tests/roots/test-prolog/markdown.md
@@ -0,0 +1,3 @@
+# sample document
+
+This is a sample document in markdown
diff --git a/tests/roots/test-prolog/prolog_markdown_parser.py b/tests/roots/test-prolog/prolog_markdown_parser.py
new file mode 100644
index 0000000..f8d787c
--- /dev/null
+++ b/tests/roots/test-prolog/prolog_markdown_parser.py
@@ -0,0 +1,13 @@
+from docutils.parsers import Parser
+
+
+class DummyMarkdownParser(Parser):
+ supported = ('markdown',)
+
+ def parse(self, inputstring, document):
+ document.rawsource = inputstring
+
+
+def setup(app):
+ app.add_source_suffix('.md', 'markdown')
+ app.add_source_parser(DummyMarkdownParser)
diff --git a/tests/roots/test-prolog/restructuredtext.rst b/tests/roots/test-prolog/restructuredtext.rst
new file mode 100644
index 0000000..f1fafb6
--- /dev/null
+++ b/tests/roots/test-prolog/restructuredtext.rst
@@ -0,0 +1,4 @@
+sample document
+===============
+
+This is a sample document in reST
diff --git a/tests/roots/test-pycode/cp_1251_coded.py b/tests/roots/test-pycode/cp_1251_coded.py
new file mode 100644
index 0000000..43d98f3
--- /dev/null
+++ b/tests/roots/test-pycode/cp_1251_coded.py
@@ -0,0 +1,4 @@
+#!python
+# -*- coding: windows-1251 -*-
+
+X="Õ" #:It MUST look like X="Õ" \ No newline at end of file
diff --git a/tests/roots/test-reST-code-block/conf.py b/tests/roots/test-reST-code-block/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-reST-code-block/conf.py
diff --git a/tests/roots/test-reST-code-block/index.rst b/tests/roots/test-reST-code-block/index.rst
new file mode 100644
index 0000000..a7c7df0
--- /dev/null
+++ b/tests/roots/test-reST-code-block/index.rst
@@ -0,0 +1,7 @@
+.. code-block::
+ :linenos:
+
+ def hello(name)
+ print("hello", name)
+
+ hello("Sphinx")
diff --git a/tests/roots/test-reST-code-role/conf.py b/tests/roots/test-reST-code-role/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-reST-code-role/conf.py
diff --git a/tests/roots/test-reST-code-role/index.rst b/tests/roots/test-reST-code-role/index.rst
new file mode 100644
index 0000000..5be6bfc
--- /dev/null
+++ b/tests/roots/test-reST-code-role/index.rst
@@ -0,0 +1,9 @@
+.. role:: python(code)
+ :language: python
+ :class: highlight
+
+Inline :python:`def foo(1 + 2 + None + "abc"): pass` code block
+
+.. code-block:: python
+
+ def foo(1 + 2 + None + "abc"): pass
diff --git a/tests/roots/test-refonly_bullet_list/conf.py b/tests/roots/test-refonly_bullet_list/conf.py
new file mode 100644
index 0000000..bdccf9c
--- /dev/null
+++ b/tests/roots/test-refonly_bullet_list/conf.py
@@ -0,0 +1 @@
+html_compact_lists = False
diff --git a/tests/roots/test-refonly_bullet_list/index.rst b/tests/roots/test-refonly_bullet_list/index.rst
new file mode 100644
index 0000000..9d8539d
--- /dev/null
+++ b/tests/roots/test-refonly_bullet_list/index.rst
@@ -0,0 +1,14 @@
+test-refonly_bullet_list
+========================
+
+List A:
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
+List B:
+
+* Hello
+* Sphinx
+* World
diff --git a/tests/roots/test-remote-logo/conf.py b/tests/roots/test-remote-logo/conf.py
new file mode 100644
index 0000000..07949ba
--- /dev/null
+++ b/tests/roots/test-remote-logo/conf.py
@@ -0,0 +1,5 @@
+latex_documents = [
+ ('index', 'test.tex', 'The basic Sphinx documentation for testing', 'Sphinx', 'report')
+]
+html_logo = "https://www.python.org/static/img/python-logo.png"
+html_favicon = "https://www.python.org/static/favicon.ico"
diff --git a/tests/roots/test-remote-logo/index.rst b/tests/roots/test-remote-logo/index.rst
new file mode 100644
index 0000000..af12ed6
--- /dev/null
+++ b/tests/roots/test-remote-logo/index.rst
@@ -0,0 +1,31 @@
+The basic Sphinx documentation for testing
+==========================================
+
+Sphinx is a tool that makes it easy to create intelligent and beautiful
+documentation for Python projects (or other documents consisting of multiple
+reStructuredText sources), written by Georg Brandl. It was originally created
+for the new Python documentation, and has excellent facilities for Python
+project documentation, but C/C++ is supported as well, and more languages are
+planned.
+
+Sphinx uses reStructuredText as its markup language, and many of its strengths
+come from the power and straightforwardness of reStructuredText and its parsing
+and translating suite, the Docutils.
+
+features
+--------
+
+Among its features are the following:
+
+* Output formats: HTML (including derivative formats such as HTML Help, Epub
+ and Qt Help), plain text, manual pages and LaTeX or direct PDF output
+ using rst2pdf
+* Extensive cross-references: semantic markup and automatic links
+ for functions, classes, glossary terms and similar pieces of information
+* Hierarchical structure: easy definition of a document tree, with automatic
+ links to siblings, parents and children
+* Automatic indices: general index as well as a module index
+* Code handling: automatic highlighting using the Pygments highlighter
+* Flexible HTML output using the Jinja 2 templating engine
+* Various extensions are available, e.g. for automatic testing of snippets
+ and inclusion of appropriately formatted docstrings
diff --git a/tests/roots/test-roles-download/another/dummy.dat b/tests/roots/test-roles-download/another/dummy.dat
new file mode 100644
index 0000000..f6d9fed
--- /dev/null
+++ b/tests/roots/test-roles-download/another/dummy.dat
@@ -0,0 +1 @@
+this one will have some content
diff --git a/tests/roots/test-roles-download/conf.py b/tests/roots/test-roles-download/conf.py
new file mode 100644
index 0000000..e274bde
--- /dev/null
+++ b/tests/roots/test-roles-download/conf.py
@@ -0,0 +1,3 @@
+latex_documents = [
+ ('index', 'test.tex', 'The basic Sphinx documentation for testing', 'Sphinx', 'report')
+]
diff --git a/tests/roots/test-roles-download/dummy.dat b/tests/roots/test-roles-download/dummy.dat
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-roles-download/dummy.dat
diff --git a/tests/roots/test-roles-download/index.rst b/tests/roots/test-roles-download/index.rst
new file mode 100644
index 0000000..cdb075e
--- /dev/null
+++ b/tests/roots/test-roles-download/index.rst
@@ -0,0 +1,7 @@
+test-roles-download
+===================
+
+* :download:`dummy.dat`
+* :download:`another/dummy.dat`
+* :download:`not_found.dat`
+* :download:`Sphinx logo <http://www.sphinx-doc.org/en/master/_static/sphinxheader.png>`
diff --git a/tests/roots/test-root/Makefile b/tests/roots/test-root/Makefile
new file mode 100644
index 0000000..85a93bc
--- /dev/null
+++ b/tests/roots/test-root/Makefile
@@ -0,0 +1,67 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+
+# Internal variables.
+ALLSPHINXOPTS = -d _build/doctrees $(SPHINXOPTS) .
+
+.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " pickle to make pickle files (usable by e.g. sphinx-web)"
+ @echo " htmlhelp to make HTML files and an HTML help project"
+ @echo " latex to make LaTeX files"
+ @echo " changes to make an overview over all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+
+clean:
+ rm -rf _build/*
+
+html:
+ mkdir -p _build/html _build/doctrees
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html
+ @echo
+ @echo "Build finished. The HTML pages are in _build/html."
+
+pickle:
+ mkdir -p _build/pickle _build/doctrees
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files or run"
+ @echo " sphinx-web _build/pickle"
+ @echo "to start the sphinx-web server."
+
+web: pickle
+
+htmlhelp:
+ mkdir -p _build/htmlhelp _build/doctrees
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in _build/htmlhelp."
+
+latex:
+ mkdir -p _build/latex _build/doctrees
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in _build/latex."
+ @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
+ "run these through (pdf)latex."
+
+changes:
+ mkdir -p _build/changes _build/doctrees
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes
+ @echo
+ @echo "The overview file is in _build/changes."
+
+linkcheck:
+ mkdir -p _build/linkcheck _build/doctrees
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in _build/linkcheck/output.txt."
diff --git a/tests/roots/test-root/_templates/contentssb.html b/tests/roots/test-root/_templates/contentssb.html
new file mode 100644
index 0000000..d0c276a
--- /dev/null
+++ b/tests/roots/test-root/_templates/contentssb.html
@@ -0,0 +1,2 @@
+{# sidebar only for contents document #}
+<h4>Contents sidebar</h4>
diff --git a/tests/roots/test-root/_templates/customsb.html b/tests/roots/test-root/_templates/customsb.html
new file mode 100644
index 0000000..0cd6735
--- /dev/null
+++ b/tests/roots/test-root/_templates/customsb.html
@@ -0,0 +1,4 @@
+{# custom sidebar template #}
+<h4>Custom sidebar</h4>
+
+{{ toctree(titles_only=True, maxdepth=1) }}
diff --git a/tests/roots/test-root/_templates/layout.html b/tests/roots/test-root/_templates/layout.html
new file mode 100644
index 0000000..db685b0
--- /dev/null
+++ b/tests/roots/test-root/_templates/layout.html
@@ -0,0 +1,15 @@
+{% extends "!layout.html" %}
+
+{% block extrahead %}
+{# html_context variable from conf.py #}
+<meta name="hc" content="{{ hckey }}" />
+{# html_context variable from confoverrides (as if given on cmdline) #}
+<meta name="hc_co" content="{{ hckey_co }}" />
+{{ super() }}
+{% endblock %}
+
+{% block sidebartoc %}
+{# display global TOC in addition to local TOC #}
+{{ super() }}
+{{ toctree(collapse=False, maxdepth=-1) }}
+{% endblock %}
diff --git a/tests/roots/test-root/autodoc.txt b/tests/roots/test-root/autodoc.txt
new file mode 100644
index 0000000..959ab2d
--- /dev/null
+++ b/tests/roots/test-root/autodoc.txt
@@ -0,0 +1,39 @@
+Autodoc tests
+=============
+
+Just testing a few autodoc possibilities...
+
+.. automodule:: autodoc_target
+ :members:
+
+.. autofunction:: function
+
+.. autoclass:: Class
+ :inherited-members:
+
+ Additional content.
+
+.. autoclass:: Outer
+ :members: Inner
+
+.. autoattribute:: Class.docattr
+
+.. autoexception:: CustomEx
+ :members: f
+
+.. autoclass:: CustomDict
+ :show-inheritance:
+ :members:
+
+
+.. currentmodule:: autodoc_target
+
+.. autoclass:: InstAttCls
+ :members:
+
+ All members (5 total)
+
+.. autoclass:: InstAttCls
+ :members: ca1, ia1
+
+ Specific members (2 total)
diff --git a/tests/roots/test-root/autodoc_target.py b/tests/roots/test-root/autodoc_target.py
new file mode 100644
index 0000000..59f6c74
--- /dev/null
+++ b/tests/roots/test-root/autodoc_target.py
@@ -0,0 +1,221 @@
+import enum
+from io import StringIO
+
+__all__ = ['Class']
+
+#: documentation for the integer
+integer = 1
+
+
+def raises(exc, func, *args, **kwds):
+ """Raise AssertionError if ``func(*args, **kwds)`` does not raise *exc*."""
+ pass
+
+
+class CustomEx(Exception):
+ """My custom exception."""
+
+ def f(self):
+ """Exception method."""
+
+
+class CustomDataDescriptor:
+ """Descriptor class docstring."""
+
+ def __init__(self, doc):
+ self.__doc__ = doc
+
+ def __get__(self, obj, type=None):
+ if obj is None:
+ return self
+ return 42
+
+ def meth(self):
+ """Function."""
+ return "The Answer"
+
+
+class CustomDataDescriptorMeta(type):
+ """Descriptor metaclass docstring."""
+
+
+class CustomDataDescriptor2(CustomDataDescriptor):
+ """Descriptor class with custom metaclass docstring."""
+ __metaclass__ = CustomDataDescriptorMeta
+
+
+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
+ from functools import partial
+ function = partial(template, b=b, c=c, d=d)
+ function.__name__ = name
+ function.__doc__ = docstring
+ return classmethod(function)
+
+
+class Base:
+ def inheritedmeth(self):
+ """Inherited function."""
+
+
+class Derived(Base):
+ def inheritedmeth(self):
+ # no docstring here
+ pass
+
+
+class Class(Base):
+ """Class to document."""
+
+ descr = CustomDataDescriptor("Descriptor instance docstring.")
+
+ def meth(self):
+ """Function."""
+
+ def undocmeth(self):
+ pass
+
+ def skipmeth(self):
+ """Method that should be skipped."""
+
+ def excludemeth(self):
+ """Method that should be excluded."""
+
+ # should not be documented
+ skipattr = 'foo'
+
+ #: should be documented -- süß
+ attr = 'bar'
+
+ @property
+ def prop(self):
+ """Property."""
+
+ docattr = 'baz'
+ """should likewise be documented -- süß"""
+
+ udocattr = 'quux'
+ """should be documented as well - süß"""
+
+ # initialized to any class imported from another module
+ 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
+ """a documented instance attribute"""
+ self._private_inst_attr = None #: a private instance attribute
+
+ def __special1__(self):
+ """documented special method"""
+
+ def __special2__(self):
+ # undocumented special method
+ pass
+
+
+class CustomDict(dict):
+ """Docstring."""
+
+
+def function(foo, *args, **kwds):
+ """
+ Return spam.
+ """
+ pass
+
+
+class Outer:
+ """Foo"""
+
+ class Inner:
+ """Foo"""
+
+ def meth(self):
+ """Foo"""
+
+ # should be documented as an alias
+ factory = dict
+
+
+class DocstringSig:
+ def meth(self):
+ """meth(FOO, BAR=1) -> BAZ
+First line of docstring
+
+ rest of docstring
+ """
+
+ def meth2(self):
+ """First line, no signature
+ Second line followed by indentation::
+
+ indented line
+ """
+
+ @property
+ def prop1(self):
+ """DocstringSig.prop1(self)
+ First line of docstring
+ """
+ return 123
+
+ @property
+ def prop2(self):
+ """First line of docstring
+ Second line of docstring
+ """
+ return 456
+
+
+class StrRepr(str):
+ def __repr__(self):
+ return self
+
+
+class AttCls:
+ a1 = StrRepr('hello\nworld')
+ a2 = None
+
+
+class InstAttCls:
+ """Class with documented class and instance attributes."""
+
+ #: Doc comment for class attribute InstAttCls.ca1.
+ #: It can have multiple lines.
+ ca1 = 'a'
+
+ ca2 = 'b' #: Doc comment for InstAttCls.ca2. One line only.
+
+ ca3 = 'c'
+ """Docstring for class attribute InstAttCls.ca3."""
+
+ def __init__(self):
+ #: Doc comment for instance attribute InstAttCls.ia1
+ self.ia1 = 'd'
+
+ self.ia2 = 'e'
+ """Docstring for instance attribute InstAttCls.ia2."""
+
+
+class EnumCls(enum.Enum):
+ """
+ this is enum class
+ """
+
+ #: doc for val1
+ val1 = 12
+ val2 = 23 #: doc for val2
+ val3 = 34
+ """doc for val3"""
diff --git a/tests/roots/test-root/bom.txt b/tests/roots/test-root/bom.txt
new file mode 100644
index 0000000..3fea824
--- /dev/null
+++ b/tests/roots/test-root/bom.txt
@@ -0,0 +1,5 @@
+File with UTF-8 BOM
+===================
+
+This file has a UTF-8 "BOM".
+
diff --git a/tests/roots/test-root/conf.py b/tests/roots/test-root/conf.py
new file mode 100644
index 0000000..154d4d1
--- /dev/null
+++ b/tests/roots/test-root/conf.py
@@ -0,0 +1,148 @@
+import os
+import sys
+
+from docutils import nodes
+from docutils.parsers.rst import Directive
+
+from sphinx import addnodes
+
+sys.path.append(os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autodoc',
+ 'sphinx.ext.todo',
+ 'sphinx.ext.coverage',
+ 'sphinx.ext.extlinks']
+
+jsmath_path = 'dummy.js'
+
+templates_path = ['_templates']
+
+source_suffix = ['.txt', '.add', '.foo']
+
+project = 'Sphinx <Tests>'
+copyright = '1234-6789, copyright text credits'
+# If this is changed, remember to update the versionchanges!
+version = '0.6'
+release = '0.6alpha1'
+today_fmt = '%B %d, %Y'
+exclude_patterns = ['_build', '**/excluded.*']
+keep_warnings = True
+pygments_style = 'sphinx'
+show_authors = True
+numfig = True
+
+html_sidebars = {'**': ['localtoc.html', 'relations.html', 'sourcelink.html',
+ 'customsb.html', 'searchbox.html'],
+ 'index': ['contentssb.html', 'localtoc.html', 'globaltoc.html']}
+html_last_updated_fmt = '%b %d, %Y'
+html_context = {'hckey': 'hcval', 'hckey_co': 'wrong_hcval_co'}
+
+latex_additional_files = ['svgimg.svg']
+# some random pdf layout parameters to check they don't break build
+latex_elements = {
+ 'sphinxsetup': """
+ verbatimwithframe,
+ verbatimwrapslines,
+ verbatimforcewraps,
+ verbatimmaxoverfull=1,
+ verbatimmaxunderfull=5,
+ verbatimhintsturnover=true,
+ verbatimcontinuesalign=l,
+ VerbatimColor={RGB}{242,242,242},
+ VerbatimBorderColor={RGB}{32,32,32},
+ VerbatimHighlightColor={RGB}{200,200,200},
+ pre_box-decoration-break=slice,
+ pre_border-top-left-radius=20pt,
+ pre_border-top-right-radius=0pt,
+ pre_border-bottom-right-radius=20pt,
+ pre_border-bottom-left-radius=0pt,
+ verbatimsep=1pt,
+ pre_padding=5pt,% alias to verbatimsep
+ pre_border-top-width=5pt,
+ pre_border-right-width=10pt,
+ pre_border-bottom-width=15pt,
+ pre_border-left-width=20pt,
+ pre_border-width=3pt,% overrides all previous four
+ verbatimborder=2pt,% alias to pre_border-width
+%
+ shadowrule=1pt,
+ shadowsep=10pt,
+ shadowsize=10pt,
+ div.topic_border-width=2pt,% alias to shadowrule
+ div.topic_padding=6pt,% alias to shadowsep
+ div.topic_box-shadow=5pt,% overrides/alias shadowsize
+%
+ noteBorderColor={RGB}{204,204,204},
+ hintBorderColor={RGB}{204,204,204},
+ importantBorderColor={RGB}{204,204,204},
+ tipBorderColor={RGB}{204,204,204},
+%
+ noteborder=5pt,
+ hintborder=5pt,
+ importantborder=5pt,
+ tipborder=5pt,
+%
+ warningborder=3pt,
+ cautionborder=3pt,
+ attentionborder=3pt,
+ errorborder=3pt,
+%
+ dangerborder=3pt,
+ div.danger_border-width=10pt,
+ div.danger_background-TeXcolor={rgb}{0,1,0},
+ div.danger_border-TeXcolor={rgb}{0,0,1},
+ div.danger_box-shadow=20pt -20pt,
+ div.danger_box-shadow-TeXcolor={rgb}{0.5,0.5,0.5},
+%
+ warningBorderColor={RGB}{255,119,119},
+ cautionBorderColor={RGB}{255,119,119},
+ attentionBorderColor={RGB}{255,119,119},
+ dangerBorderColor={RGB}{255,119,119},
+ errorBorderColor={RGB}{255,119,119},
+ warningBgColor={RGB}{255,238,238},
+ cautionBgColor={RGB}{255,238,238},
+ attentionBgColor={RGB}{255,238,238},
+ dangerBgColor={RGB}{255,238,238},
+ errorBgColor={RGB}{255,238,238},
+%
+ TableRowColorHeader={rgb}{0,1,0},
+ TableRowColorOdd={rgb}{0.5,0,0},
+ TableRowColorEven={rgb}{0.1,0.1,0.1},
+""",
+}
+
+coverage_c_path = ['special/*.h']
+coverage_c_regexes = {'function': r'^PyAPI_FUNC\(.*\)\s+([^_][\w_]+)'}
+
+extlinks = {'issue': ('http://bugs.python.org/issue%s', 'issue %s'),
+ 'pyurl': ('http://python.org/%s', None)}
+
+# modify tags from conf.py
+tags.add('confpytag')
+
+
+# -- extension API
+def userdesc_parse(env, sig, signode):
+ x, y = sig.split(':')
+ signode += addnodes.desc_name(x, x)
+ signode += addnodes.desc_parameterlist()
+ signode[-1] += addnodes.desc_parameter(y, y)
+ return x
+
+
+class ClassDirective(Directive):
+ option_spec = {'opt': lambda x: x}
+
+ def run(self):
+ return [nodes.strong(text='from class: %s' % self.options['opt'])]
+
+
+def setup(app):
+ import parsermod
+
+ app.add_directive('clsdir', ClassDirective)
+ app.add_object_type('userdesc', 'userdescrole', '%s (userdesc)',
+ userdesc_parse, objname='user desc')
+ app.add_js_file('file://moo.js')
+ app.add_source_suffix('.foo', 'foo')
+ app.add_source_parser(parsermod.Parser)
diff --git a/tests/roots/test-root/extapi.txt b/tests/roots/test-root/extapi.txt
new file mode 100644
index 0000000..56be6d8
--- /dev/null
+++ b/tests/roots/test-root/extapi.txt
@@ -0,0 +1,7 @@
+Extension API tests
+===================
+
+Testing directives:
+
+.. clsdir::
+ :opt: Bar
diff --git a/tests/roots/test-root/extensions.txt b/tests/roots/test-root/extensions.txt
new file mode 100644
index 0000000..96b1f8e
--- /dev/null
+++ b/tests/roots/test-root/extensions.txt
@@ -0,0 +1,28 @@
+Test for diverse extensions
+===========================
+
+extlinks
+--------
+
+Test diverse links: :issue:`1000` and :pyurl:`dev/`, also with
+:issue:`explicit caption <1042>`.
+
+
+todo
+----
+
+.. todo::
+
+ Test the todo extension.
+
+.. todo::
+
+ Test with |sub| (see #286).
+
+.. |sub| replace:: substitution references
+
+
+list of all todos
+^^^^^^^^^^^^^^^^^
+
+.. todolist::
diff --git a/tests/roots/test-root/file_with_special_#_chars.xyz b/tests/roots/test-root/file_with_special_#_chars.xyz
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-root/file_with_special_#_chars.xyz
diff --git a/tests/roots/test-root/footnote.txt b/tests/roots/test-root/footnote.txt
new file mode 100644
index 0000000..49cceee
--- /dev/null
+++ b/tests/roots/test-root/footnote.txt
@@ -0,0 +1,60 @@
+:tocdepth: 2
+
+Testing footnote and citation
+================================
+.. #1058 footnote-backlinks-do-not-work
+
+numbered footnote
+--------------------
+
+[1]_
+
+auto-numbered footnote
+------------------------------
+
+[#]_
+
+named footnote
+--------------------
+
+[#foo]_
+
+citation
+--------------------
+
+[bar]_
+[baz_qux]_
+
+footnotes in table
+--------------------
+
+.. list-table:: Table caption [#]_
+ :header-rows: 1
+
+ * - name [#]_
+ - description
+ * - VIDIOC_CROPCAP
+ - Information about VIDIOC_CROPCAP [#]_
+
+footenotes
+--------------------
+
+.. rubric:: Footnotes
+
+.. [1] numbered
+
+.. [#] auto numbered
+
+.. [#foo] named
+
+.. rubric:: Citations
+
+.. [bar] cite
+
+.. [baz_qux] citation including underscore
+
+.. [#] footnote in table caption
+
+.. [#] footnote in table header
+
+.. [#] footnote in table not in header
diff --git a/tests/roots/test-root/images.txt b/tests/roots/test-root/images.txt
new file mode 100644
index 0000000..1dc591a
--- /dev/null
+++ b/tests/roots/test-root/images.txt
@@ -0,0 +1,25 @@
+Sphinx image handling
+=====================
+
+.. first, a simple test with direct filename
+.. image:: img.png
+
+.. an image with path name (relative to this directory!)
+.. image:: subdir/img.png
+ :height: 100
+ :width: 200
+
+.. an image with unspecified extension
+.. image:: img.*
+
+.. a non-local image URI
+.. image:: https://www.python.org/static/img/python-logo.png
+
+.. an image with subdir and unspecified extension
+.. image:: subdir/simg.*
+
+.. an SVG image (for HTML at least)
+.. image:: svgimg.*
+
+.. an image with more than 1 dot in its file name
+.. image:: img.foo.png
diff --git a/tests/roots/test-root/img.foo.png b/tests/roots/test-root/img.foo.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-root/img.foo.png
Binary files differ
diff --git a/tests/roots/test-root/img.gif b/tests/roots/test-root/img.gif
new file mode 100644
index 0000000..8f02686
--- /dev/null
+++ b/tests/roots/test-root/img.gif
Binary files differ
diff --git a/tests/roots/test-root/img.pdf b/tests/roots/test-root/img.pdf
new file mode 100644
index 0000000..cacbd85
--- /dev/null
+++ b/tests/roots/test-root/img.pdf
Binary files differ
diff --git a/tests/roots/test-root/img.png b/tests/roots/test-root/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-root/img.png
Binary files differ
diff --git a/tests/roots/test-root/includes.txt b/tests/roots/test-root/includes.txt
new file mode 100644
index 0000000..19b98ae
--- /dev/null
+++ b/tests/roots/test-root/includes.txt
@@ -0,0 +1,102 @@
+Testing downloadable files
+==========================
+
+Download :download:`img.png` here.
+Download :download:`this <subdir/img.png>` there.
+Download :download:`file with special characters <file_with_special_#_chars.xyz>`.
+
+Test file and literal inclusion
+===============================
+
+.. include:: subdir/include.inc
+
+.. include:: /subdir/include.inc
+
+.. literalinclude:: literal.inc
+ :language: python
+
+.. should succeed
+.. literalinclude:: wrongenc.inc
+ :encoding: latin-1
+ :language: none
+.. include:: wrongenc.inc
+ :encoding: latin-1
+
+Literalinclude options
+======================
+
+.. highlight:: text
+
+.. cssclass:: inc-pyobj1
+.. literalinclude:: literal.inc
+ :pyobject: Foo
+
+.. cssclass:: inc-pyobj2
+.. literalinclude:: literal.inc
+ :pyobject: Bar.baz
+
+.. cssclass:: inc-lines
+.. literalinclude:: literal.inc
+ :lines: 6-7,9
+ :lineno-start: 6
+
+.. cssclass:: inc-startend
+.. literalinclude:: literal.inc
+ :start-after: coding: utf-8
+ :end-before: class Foo
+
+.. cssclass:: inc-preappend
+.. literalinclude:: literal.inc
+ :prepend: START CODE
+ :append: END CODE
+
+.. literalinclude:: literal.inc
+ :start-after: utf-8
+
+.. literalinclude:: literal.inc
+ :end-before: class Foo
+
+.. literalinclude:: literal.inc
+ :diff: literal_orig.inc
+
+.. cssclass:: inc-tab3
+.. literalinclude:: tabs.inc
+ :tab-width: 3
+ :language: text
+
+.. cssclass:: inc-tab8
+.. literalinclude:: tabs.inc
+ :tab-width: 8
+ :language: python
+
+.. cssclass:: inc-pyobj-lines-match
+.. literalinclude:: literal.inc
+ :pyobject: Foo
+ :lineno-match:
+
+.. cssclass:: inc-lines-match
+.. literalinclude:: literal.inc
+ :lines: 6-7,8
+ :lineno-match:
+
+.. cssclass:: inc-startend-match
+.. literalinclude:: literal.inc
+ :start-after: coding: utf-8
+ :end-before: class Foo
+ :lineno-match:
+
+Test if dedenting before parsing works.
+
+.. highlight:: python
+
+.. cssclass:: inc-pyobj-dedent
+.. literalinclude:: literal.inc
+ :pyobject: Bar.baz
+
+Docutils include with "literal"
+===============================
+
+While not recommended, it should work (and leave quotes alone).
+
+.. include:: quotes.inc
+ :literal:
diff --git a/tests/roots/test-root/index.txt b/tests/roots/test-root/index.txt
new file mode 100644
index 0000000..e39c958
--- /dev/null
+++ b/tests/roots/test-root/index.txt
@@ -0,0 +1,65 @@
+.. Sphinx Tests documentation master file, created by sphinx-quickstart on Wed Jun 4 23:49:58 2008.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to Sphinx Tests's documentation!
+========================================
+
+Contents:
+
+.. toctree::
+ :maxdepth: 2
+ :numbered:
+ :caption: Table of Contents
+ :name: mastertoc
+
+ extapi
+ images
+ subdir/images
+ subdir/includes
+ includes
+ markup
+ objects
+ bom
+ math
+ autodoc
+ extensions
+ footnote
+ lists
+ otherext
+
+ http://sphinx-doc.org/
+ Latest reference <http://sphinx-doc.org/latest/>
+ Python <http://python.org/>
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+
+References
+==========
+
+.. [Ref1] Reference target.
+.. [Ref_1] Reference target 2.
+
+Test for issue #1157
+====================
+
+This used to crash:
+
+.. toctree::
+
+.. toctree::
+ :hidden:
+
+Test for issue #1700
+====================
+
+:ref:`mastertoc`
+
+Test for indirect hyperlink targets
+===================================
+
+:ref:`indirect hyperref <other-label>`
diff --git a/tests/roots/test-root/lists.txt b/tests/roots/test-root/lists.txt
new file mode 100644
index 0000000..0b54454
--- /dev/null
+++ b/tests/roots/test-root/lists.txt
@@ -0,0 +1,70 @@
+Various kinds of lists
+======================
+
+
+nested enumerated lists
+-----------------------
+
+#. one
+
+#. two
+
+ #. two.1
+ #. two.2
+
+#. three
+
+
+enumerated lists with non-default start values
+----------------------------------------------
+
+0. zero
+#. one
+
+----------------------------------------
+
+1. one
+#. two
+
+----------------------------------------
+
+2. two
+#. three
+
+
+enumerated lists using letters
+------------------------------
+
+a. a
+
+b. b
+
+#. c
+
+#. d
+
+----------------------------------------
+
+x. x
+
+y. y
+
+#. z
+
+#. {
+
+definition lists
+-----------------
+
+term1
+ description
+
+term2 (**stronged partially**)
+ description
+
+Samp tests
+----------
+
+:samp:`{variable_only}`
+:samp:`{variable} and text`
+:samp:`Show {variable} in the middle`
diff --git a/tests/roots/test-root/literal.inc b/tests/roots/test-root/literal.inc
new file mode 100644
index 0000000..694f15e
--- /dev/null
+++ b/tests/roots/test-root/literal.inc
@@ -0,0 +1,13 @@
+# Literally included file using Python highlighting
+# -*- coding: utf-8 -*-
+
+foo = "Including Unicode characters: üöä"
+
+class Foo:
+ pass
+
+class Bar:
+ def baz():
+ pass
+
+def bar(): pass
diff --git a/tests/roots/test-root/literal_orig.inc b/tests/roots/test-root/literal_orig.inc
new file mode 100644
index 0000000..cfb5dd1
--- /dev/null
+++ b/tests/roots/test-root/literal_orig.inc
@@ -0,0 +1,12 @@
+# Literally included file using Python highlighting
+
+foo = "Including Unicode characters: üöä" # This will be changed
+
+class FooOrig:
+ pass
+
+class BarOrig:
+ def baz():
+ pass
+
+def bar(): pass
diff --git a/tests/roots/test-root/markup.txt b/tests/roots/test-root/markup.txt
new file mode 100644
index 0000000..b59a652
--- /dev/null
+++ b/tests/roots/test-root/markup.txt
@@ -0,0 +1,455 @@
+:tocdepth: 2
+
+.. title:: set by title directive
+.. _1024:
+
+Testing various markup
+======================
+
+Meta markup
+-----------
+
+.. sectionauthor:: Georg Brandl
+.. moduleauthor:: Georg Brandl
+
+.. contents:: TOC
+
+.. meta::
+ :author: Me
+ :keywords: docs, sphinx
+
+
+Generic reST
+------------
+
+A |subst|!
+
+.. |subst| replace:: global substitution
+
+.. highlight:: none
+
+.. _label:
+
+::
+
+ some code
+
+Option list:
+
+-h help
+--help also help
+
+Line block:
+
+| line1
+| line2
+| line3
+| line4
+| line5
+| line6
+| line7
+
+
+Body directives
+^^^^^^^^^^^^^^^
+
+.. topic:: Title
+
+ Topic body.
+
+.. sidebar:: Sidebar
+ :subtitle: Sidebar subtitle
+
+ Sidebar body.
+
+.. rubric:: Test rubric
+
+.. epigraph:: Epigraph title
+
+ Epigraph body.
+
+ -- Author
+
+.. highlights:: Highlights
+
+ Highlights body.
+
+.. pull-quote:: Pull-quote
+
+ Pull quote body.
+
+.. compound::
+
+ a
+
+ b
+
+.. parsed-literal::
+
+ with some *markup* inside
+
+
+.. _admonition-section:
+
+Admonitions
+^^^^^^^^^^^
+
+.. admonition:: My Admonition
+
+ Admonition text.
+
+.. note::
+ Note text.
+
+.. warning::
+
+ Warning text.
+
+.. _some-label:
+
+.. tip::
+ Tip text.
+
+Indirect hyperlink targets
+
+.. _other-label: some-label_
+
+Inline markup
+-------------
+
+*Generic inline markup*
+
+Adding \n to test unescaping.
+
+* :command:`command\\n`
+* :dfn:`dfn\\n`
+* :guilabel:`guilabel with &accelerator and \\n`
+* :kbd:`kbd\\n`
+* :mailheader:`mailheader\\n`
+* :makevar:`makevar\\n`
+* :manpage:`manpage\\n`
+* :mimetype:`mimetype\\n`
+* :newsgroup:`newsgroup\\n`
+* :program:`program\\n`
+* :regexp:`regexp\\n`
+* :menuselection:`File --> Close\\n`
+* :menuselection:`&File --> &Print`
+* :file:`a/{varpart}/b\\n`
+* :samp:`print {i}\\n`
+
+*Linking inline markup*
+
+* :pep:`8`
+* :pep:`Python Enhancement Proposal #8 <8>`
+* :rfc:`1`
+* :rfc:`Request for Comments #1 <1>`
+* :envvar:`HOME`
+* :keyword:`with`
+* :token:`try statement <try_stmt>`
+* :ref:`admonition-section`
+* :ref:`here <some-label>`
+* :ref:`there <other-label>`
+* :ref:`my-figure`
+* :ref:`my-figure-name`
+* :ref:`my-table`
+* :ref:`my-table-name`
+* :ref:`my-code-block`
+* :ref:`my-code-block-name`
+* :ref:`1024`
+* :numref:`my-figure`
+* :numref:`my-figure-name`
+* :numref:`my-table`
+* :numref:`my-table-name`
+* :numref:`my-code-block`
+* :numref:`my-code-block-name`
+* :doc:`subdir/includes`
+* ``:download:`` is tested in includes.txt
+* :option:`Python -c option <python -c>`
+
+Test :abbr:`abbr (abbreviation)` and another :abbr:`abbr (abbreviation)`.
+
+Testing the :index:`index` role, also available with
+:index:`explicit <pair: title; explicit>` title.
+
+.. _with:
+
+With
+----
+
+(Empty section.)
+
+
+Tables
+------
+
+.. tabularcolumns:: |L|p{5cm}|R|
+
+.. _my-table:
+
+.. table:: my table
+ :name: my-table-name
+
+ +----+----------------+----+
+ | 1 | * Block elems | x |
+ | | * In table | |
+ +----+----------------+----+
+ | 2 | Empty cells: | |
+ +----+----------------+----+
+
+.. table:: empty cell in table header
+
+ ===== ======
+ \
+ ===== ======
+ 1 2
+ 3 4
+ ===== ======
+
+Tables with multirow and multicol:
+
+.. only:: latex
+
+ +----+----------------+---------+
+ | 1 | test! | c |
+ +----+---------+------+ |
+ | 2 | col | col | |
+ | y +---------+------+----+----+
+ | x | multi-column cell | x |
+ +----+---------------------+----+
+
+ +----+
+ | 1 |
+ + +
+ | |
+ +----+
+
+.. list-table::
+ :header-rows: 0
+
+ * - .. figure:: img.png
+
+ figure in table
+
+
+Figures
+-------
+
+.. _my-figure:
+
+.. figure:: img.png
+ :name: my-figure-name
+
+ My caption of the figure
+
+ My description paragraph of the figure.
+
+ Description paragraph is wrapped with legend node.
+
+.. figure:: rimg.png
+ :align: right
+
+ figure with align option
+
+.. figure:: rimg.png
+ :align: right
+ :figwidth: 50%
+
+ figure with align & figwidth option
+
+.. figure:: rimg.png
+ :align: right
+ :width: 3cm
+
+ figure with align & width option
+
+Version markup
+--------------
+
+.. versionadded:: 0.6
+ Some funny **stuff**.
+
+.. versionchanged:: 0.6
+ Even more funny stuff.
+
+.. deprecated:: 0.6
+ Boring stuff.
+
+.. versionadded:: 1.2
+
+ First paragraph of versionadded.
+
+.. versionchanged:: 1.2
+ First paragraph of versionchanged.
+
+ Second paragraph of versionchanged.
+
+
+Code blocks
+-----------
+
+.. _my-code-block:
+
+.. code-block:: ruby
+ :linenos:
+ :caption: my ruby code
+ :name: my-code-block-name
+
+ def ruby?
+ false
+ end
+
+Misc stuff
+----------
+
+Stuff [#]_
+
+Reference lookup: [Ref1]_ (defined in another file).
+Reference lookup underscore: [Ref_1]_
+
+.. seealso:: something, something else, something more
+
+ `Google <http://www.google.com>`_
+ For everything.
+
+.. hlist::
+ :columns: 4
+
+ * This
+ * is
+ * a horizontal
+ * list
+ * with several
+ * items
+
+.. rubric:: Side note
+
+This is a side note.
+
+This tests :CLASS:`role names in uppercase`.
+
+.. centered:: LICENSE AGREEMENT
+
+.. acks::
+
+ * Terry Pratchett
+ * J. R. R. Tolkien
+ * Monty Python
+
+.. glossary::
+ :sorted:
+
+ boson
+ Particle with integer spin.
+
+ *fermion*
+ Particle with half-integer spin.
+
+ tauon
+ myon
+ electron
+ Examples for fermions.
+
+ über
+ Gewisse
+
+ ähnlich
+ Dinge
+
+.. productionlist::
+ try_stmt: `try1_stmt` | `try2_stmt`
+ try1_stmt: "try" ":" `suite`
+ : ("except" [`expression` ["," `target`]] ":" `suite`)+
+ : ["else" ":" `suite`]
+ : ["finally" ":" `suite`]
+ try2_stmt: "try" ":" `suite`
+ : "finally" ":" `suite`
+
+
+Index markup
+------------
+
+.. index::
+ single: entry
+ pair: entry; pair
+ double: entry; double
+ triple: index; entry; triple
+ see: from; to
+ seealso: fromalso; toalso
+
+.. index::
+ !Main, !Other
+ !single: entry; pair
+
+:index:`!Main`
+
+.. _ölabel:
+
+Ö... Some strange characters
+----------------------------
+
+Testing öäü...
+
+
+Only directive
+--------------
+
+.. only:: html
+
+ In HTML.
+
+.. only:: latex
+
+ In LaTeX.
+
+.. only:: html or latex
+
+ In both.
+
+.. only:: confpytag and (testtag or nonexisting_tag)
+
+ Always present, because set through conf.py/command line.
+
+
+Any role
+--------
+
+.. default-role:: any
+
+Test referencing to `headings <with>` and `objects <func_without_body>`.
+Also `modules <mod>` and `classes <Time>`.
+
+More domains:
+
+* `JS <bar.baz>`
+* `C <SphinxType>`
+* `myobj` (user markup)
+* `n::Array`
+* `perl -c`
+
+.. default-role::
+
+
+Smart quotes
+------------
+
+* Smart "quotes" in English 'text'.
+* Smart --- long and -- short dashes.
+* Ellipsis...
+* No smartypants in literal blocks: ``foo--"bar"...``.
+
+.. only:: html
+
+ .. LaTeX does not like Cyrillic letters in this test, so it is HTML only.
+
+ .. rst-class:: language-ru
+
+ Этот "абзац" должен иÑпользовать 'руÑÑкие' кавычки.
+
+ .. rst-class:: language-fr
+
+ Il dit : "C'est 'super' !"
+
+.. rubric:: Footnotes
+
+.. [#] Like footnotes.
+
diff --git a/tests/roots/test-root/math.txt b/tests/roots/test-root/math.txt
new file mode 100644
index 0000000..5a209be
--- /dev/null
+++ b/tests/roots/test-root/math.txt
@@ -0,0 +1,31 @@
+Test math extensions :math:`E = m c^2`
+======================================
+
+This is inline math: :math:`a^2 + b^2 = c^2`.
+
+.. math:: a^2 + b^2 = c^2
+
+.. math::
+
+ a + 1 < b
+
+.. math::
+ :label: foo
+
+ e^{i\pi} = 1
+
+.. math::
+ :label:
+
+ e^{ix} = \cos x + i\sin x
+
+.. math::
+
+ n \in \mathbb N
+
+.. math::
+ :nowrap:
+
+ a + 1 < b
+
+Referencing equation :eq:`foo`.
diff --git a/tests/roots/test-root/objects.txt b/tests/roots/test-root/objects.txt
new file mode 100644
index 0000000..ed5f2c2
--- /dev/null
+++ b/tests/roots/test-root/objects.txt
@@ -0,0 +1,262 @@
+Testing object descriptions
+===========================
+
+.. function:: func_without_module(a, b, *c[, d])
+
+ Does something.
+
+.. function:: func_without_body()
+
+.. function:: func_with_unknown_field()
+
+ : :
+
+ : empty field name:
+
+ :field_name:
+
+ :field_name all lower:
+
+ :FIELD_NAME:
+
+ :FIELD_NAME ALL CAPS:
+
+ :Field_Name:
+
+ :Field_Name All Word Caps:
+
+ :Field_name:
+
+ :Field_name First word cap:
+
+ :FIELd_name:
+
+ :FIELd_name PARTial caps:
+
+.. function:: func_noindex
+ :no-index:
+
+.. function:: func_with_module
+ :module: foolib
+
+Referring to :func:`func with no index <func_noindex>`.
+Referring to :func:`nothing <>`.
+
+.. module:: mod
+ :synopsis: Module synopsis.
+ :platform: UNIX
+
+.. function:: func_in_module
+
+.. class:: Cls
+
+ .. method:: meth1
+
+ .. staticmethod:: meths
+
+ .. attribute:: attr
+
+.. explicit class given
+.. method:: Cls.meth2
+
+.. explicit module given
+.. exception:: Error(arg1, arg2)
+ :module: errmod
+
+.. data:: var
+
+
+.. currentmodule:: None
+
+.. function:: func_without_module2() -> annotation
+
+.. object:: long(parameter, \
+ list)
+ another one
+
+.. class:: TimeInt
+
+ Has only one parameter (triggers special behavior...)
+
+ :param moo: |test|
+ :type moo: |test|
+
+.. |test| replace:: Moo
+
+.. class:: Time(hour, minute, isdst)
+
+ :param year: The year.
+ :type year: TimeInt
+ :param TimeInt minute: The minute.
+ :param isdst: whether it's DST
+ :type isdst: * some complex
+ * expression
+ :returns: a new :class:`Time` instance
+ :rtype: Time
+ :raises Error: if the values are out of range
+ :ivar int hour: like *hour*
+ :ivar minute: like *minute*
+ :vartype minute: int
+ :param hour: Some parameter
+ :type hour: DuplicateType
+ :param hour: Duplicate param. Should not lead to crashes.
+ :type hour: DuplicateType
+ :param .Cls extcls: A class from another module.
+
+.. raw:: latex
+
+ \begingroup
+ \let\oldhref\href
+ \def\href{\ifnum\catcode`\-=\active\errorwithsphinxhref\fi\oldhref}
+
+.. class:: MyClass
+
+ .. attribute:: config
+ :type: sphinx.config.Config
+
+ A configuration object.
+
+.. raw:: latex
+
+ \endgroup
+
+C items
+=======
+
+.. c:function:: void Sphinx_DoSomething()
+
+.. c:member:: int SphinxStruct.member
+
+.. c:macro:: SPHINX_USE_PYTHON
+
+.. c:type:: SphinxType
+
+.. c:var:: int sphinx_global
+
+.. c:function:: PyObject* Py_SphinxFoo(void)
+
+
+Javascript items
+================
+
+.. js:function:: foo()
+
+.. js:data:: bar
+
+.. documenting the method of any object
+.. js:function:: bar.baz(href, callback[, errback])
+
+ :param string href: The location of the resource.
+ :param callback: Gets called with the data returned by the resource.
+ :throws InvalidHref: If the `href` is invalid.
+ :returns: `undefined`
+
+.. js:attribute:: bar.spam
+
+References
+==========
+
+Referencing :class:`mod.Cls` or :Class:`mod.Cls` should be the same.
+
+With target: :c:func:`Sphinx_DoSomething()` (parentheses are handled),
+:c:member:`SphinxStruct.member`, :c:macro:`SPHINX_USE_PYTHON`,
+:c:type:`SphinxType *` (pointer is handled), :c:data:`sphinx_global`.
+
+Without target: :c:func:`CFunction`. :c:func:`!malloc`.
+
+:js:func:`foo()`
+:js:func:`foo`
+
+:js:data:`bar`
+:js:func:`bar.baz()`
+:js:func:`bar.baz`
+:js:func:`~bar.baz()`
+
+:js:attr:`bar.baz`
+
+
+Others
+======
+
+.. envvar:: HOME
+
+.. program:: python
+
+.. cmdoption:: -c command
+
+.. program:: perl
+
+.. cmdoption:: -c
+
+.. option:: +p
+
+.. option:: --ObjC++
+
+.. option:: --plugin.option
+
+.. option:: create-auth-token
+
+.. option:: arg
+
+.. option:: -j[=N]
+
+Link to :option:`perl +p`, :option:`--ObjC++`, :option:`--plugin.option`, :option:`create-auth-token`, :option:`arg` and :option:`-j`
+
+.. program:: hg
+
+.. option:: commit
+
+.. program:: git commit
+
+.. option:: -p
+
+Link to :option:`hg commit` and :option:`git commit -p`.
+
+.. option:: --abi={TYPE}
+
+.. option:: --test={WHERE}-{COUNT}
+
+.. option:: --wrap=\{\{value\}\}
+
+.. option:: -allowable_client {client_name}
+
+Foo bar.
+
+Test repeated option directive.
+
+.. option:: -mapi
+
+ My API.
+
+.. option:: -mapi=secret
+
+ My secret API.
+
+Reference the first option :option:`-mapi=secret`, :option:`-mapi[=xxx]`
+or :option:`-mapi with_space`.
+
+
+User markup
+===========
+
+.. userdesc:: myobj:parameter
+
+ Description of userdesc.
+
+
+Referencing :userdescrole:`myobj`.
+
+
+CPP domain
+==========
+
+.. cpp:class:: n::Array
+
+ .. cpp:function:: T& operator[]( unsigned j )
+ const T& operator[]( unsigned j ) const
+
+.. cpp:function:: template<typename T1, typename T2> \
+ requires A<T1, T2> \
+ void f()
+
+- :cpp:expr:`a + b`
diff --git a/tests/roots/test-root/otherext.foo b/tests/roots/test-root/otherext.foo
new file mode 100644
index 0000000..531ea29
--- /dev/null
+++ b/tests/roots/test-root/otherext.foo
@@ -0,0 +1,2 @@
+The contents of this file are ignored.
+The file is "parsed" using Parser in the tests/root/parsermod.py file.
diff --git a/tests/roots/test-root/parsermod.py b/tests/roots/test-root/parsermod.py
new file mode 100644
index 0000000..de0849c
--- /dev/null
+++ b/tests/roots/test-root/parsermod.py
@@ -0,0 +1,14 @@
+from docutils import nodes
+from docutils.parsers import Parser
+
+
+class Parser(Parser):
+ supported = ('foo',)
+
+ def parse(self, input, document):
+ section = nodes.section(ids=['id1'])
+ section += nodes.title('Generated section', 'Generated section')
+ document += section
+
+ def get_transforms(self):
+ return []
diff --git a/tests/roots/test-root/quotes.inc b/tests/roots/test-root/quotes.inc
new file mode 100644
index 0000000..276cc56
--- /dev/null
+++ b/tests/roots/test-root/quotes.inc
@@ -0,0 +1 @@
+Testing "quotes" in literal 'included' text.
diff --git a/tests/roots/test-root/rimg.png b/tests/roots/test-root/rimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-root/rimg.png
Binary files differ
diff --git a/tests/roots/test-root/special/api.h b/tests/roots/test-root/special/api.h
new file mode 100644
index 0000000..2bf2382
--- /dev/null
+++ b/tests/roots/test-root/special/api.h
@@ -0,0 +1,2 @@
+PyAPI_FUNC(PyObject *) Py_SphinxTest(void);
+PyAPI_FUNC(PyObject *) Py_SphinxFoo(void);
diff --git a/tests/roots/test-root/special/code.py b/tests/roots/test-root/special/code.py
new file mode 100644
index 0000000..b7934b2
--- /dev/null
+++ b/tests/roots/test-root/special/code.py
@@ -0,0 +1,2 @@
+print("line 1")
+print("line 2")
diff --git a/tests/roots/test-root/subdir/excluded.txt b/tests/roots/test-root/subdir/excluded.txt
new file mode 100644
index 0000000..5df3139
--- /dev/null
+++ b/tests/roots/test-root/subdir/excluded.txt
@@ -0,0 +1,2 @@
+Excluded file -- should *not* be read as source
+-----------------------------------------------
diff --git a/tests/roots/test-root/subdir/images.txt b/tests/roots/test-root/subdir/images.txt
new file mode 100644
index 0000000..f2adf88
--- /dev/null
+++ b/tests/roots/test-root/subdir/images.txt
@@ -0,0 +1,6 @@
+Image including source in subdir
+================================
+
+.. image:: img.*
+
+.. image:: /rimg.png
diff --git a/tests/roots/test-root/subdir/img.png b/tests/roots/test-root/subdir/img.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-root/subdir/img.png
Binary files differ
diff --git a/tests/roots/test-root/subdir/include.inc b/tests/roots/test-root/subdir/include.inc
new file mode 100644
index 0000000..d89275d
--- /dev/null
+++ b/tests/roots/test-root/subdir/include.inc
@@ -0,0 +1,5 @@
+.. This file is included by contents.txt.
+
+.. Paths in included files are relative to the file that
+ includes them
+.. image:: subdir/img.png
diff --git a/tests/roots/test-root/subdir/includes.txt b/tests/roots/test-root/subdir/includes.txt
new file mode 100644
index 0000000..627dcfb
--- /dev/null
+++ b/tests/roots/test-root/subdir/includes.txt
@@ -0,0 +1,18 @@
+Including in subdir
+===================
+
+.. absolute filename
+.. literalinclude:: /special/code.py
+ :lines: 1
+
+.. relative filename
+.. literalinclude:: ../special/code.py
+ :lines: 2
+
+Absolute :download:`/img.png` download.
+
+.. absolute image filename
+.. image:: /img.png
+
+.. absolute include filename
+.. include:: /test.inc
diff --git a/tests/roots/test-root/subdir/simg.png b/tests/roots/test-root/subdir/simg.png
new file mode 100644
index 0000000..a97e86d
--- /dev/null
+++ b/tests/roots/test-root/subdir/simg.png
Binary files differ
diff --git a/tests/roots/test-root/svgimg.pdf b/tests/roots/test-root/svgimg.pdf
new file mode 100644
index 0000000..cacbd85
--- /dev/null
+++ b/tests/roots/test-root/svgimg.pdf
Binary files differ
diff --git a/tests/roots/test-root/svgimg.svg b/tests/roots/test-root/svgimg.svg
new file mode 100644
index 0000000..2bae0b9
--- /dev/null
+++ b/tests/roots/test-root/svgimg.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="60" width="60">
+ <circle cx="40" cy="40" r="24" style="stroke:#000000; fill:#ffffff"/>
+</svg>
diff --git a/tests/roots/test-root/tabs.inc b/tests/roots/test-root/tabs.inc
new file mode 100644
index 0000000..20b5182
--- /dev/null
+++ b/tests/roots/test-root/tabs.inc
@@ -0,0 +1,5 @@
+Tabs include file test
+----------------------
+
+The next line has a tab:
+-| |-
diff --git a/tests/roots/test-root/test.inc b/tests/roots/test-root/test.inc
new file mode 100644
index 0000000..4773390
--- /dev/null
+++ b/tests/roots/test-root/test.inc
@@ -0,0 +1,3 @@
+.. This file is included from subdir/includes.txt.
+
+This is an include file.
diff --git a/tests/roots/test-root/wrongenc.inc b/tests/roots/test-root/wrongenc.inc
new file mode 100644
index 0000000..700f613
--- /dev/null
+++ b/tests/roots/test-root/wrongenc.inc
@@ -0,0 +1,3 @@
+This file is encoded in latin-1 but at first read as utf-8.
+
+Max Strauß aß in München eine Leberkässemmel.
diff --git a/tests/roots/test-search/conf.py b/tests/roots/test-search/conf.py
new file mode 100644
index 0000000..8613f5f
--- /dev/null
+++ b/tests/roots/test-search/conf.py
@@ -0,0 +1,2 @@
+exclude_patterns = ['_build']
+html_search_language = 'en'
diff --git a/tests/roots/test-search/index.rst b/tests/roots/test-search/index.rst
new file mode 100644
index 0000000..fc2298b
--- /dev/null
+++ b/tests/roots/test-search/index.rst
@@ -0,0 +1,30 @@
+meta keywords
+=============
+
+.. meta::
+ :keywords lang=en: findthiskey, thistoo, notgerman
+ :keywords: thisonetoo
+ :keywords lang=de: onlygerman, onlytoogerman
+ :description: thisnoteither
+
+Stemmer
+=======
+
+bat
+findthisstemmedkey
+
+textinheading
+
+International
+
+.. toctree::
+
+ tocitem
+
+.. raw:: html
+
+ <span class="raw">rawword"</span>
+
+.. raw:: latex
+
+ latex_keyword
diff --git a/tests/roots/test-search/nosearch.rst b/tests/roots/test-search/nosearch.rst
new file mode 100644
index 0000000..4f79575
--- /dev/null
+++ b/tests/roots/test-search/nosearch.rst
@@ -0,0 +1,7 @@
+:nosearch:
+
+nosearch
+========
+
+bat
+latex
diff --git a/tests/roots/test-search/tocitem.rst b/tests/roots/test-search/tocitem.rst
new file mode 100644
index 0000000..98a1dc7
--- /dev/null
+++ b/tests/roots/test-search/tocitem.rst
@@ -0,0 +1,17 @@
+heading 1
+=========
+
+lorem ipsum
+
+bat
+
+textinheading
+=============
+
+lorem ipsum
+
+å¯ä»¥æŸ¥çœ‹ FAQ 模å—中 Chinesetest 部分
+
+模å—中 CAS service部分
+
+å¯ä»¥Chinesetesttwo查看
diff --git a/tests/roots/test-smartquotes/conf.py b/tests/roots/test-smartquotes/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-smartquotes/conf.py
diff --git a/tests/roots/test-smartquotes/index.rst b/tests/roots/test-smartquotes/index.rst
new file mode 100644
index 0000000..7dfd01a
--- /dev/null
+++ b/tests/roots/test-smartquotes/index.rst
@@ -0,0 +1,8 @@
+test-smartquotes
+================
+
+-- "Sphinx" is a tool that makes it easy ...
+
+.. toctree::
+
+ literals
diff --git a/tests/roots/test-smartquotes/literals.rst b/tests/roots/test-smartquotes/literals.rst
new file mode 100644
index 0000000..ed77c80
--- /dev/null
+++ b/tests/roots/test-smartquotes/literals.rst
@@ -0,0 +1,12 @@
+literals
+========
+
+.. role:: python(code)
+ :language: python
+.. default-role:: python
+
+Standard :code:`code role with 'quotes'`
+
+This is a Python :python:`{'code': 'role', 'with': 'quotes'}`.
+
+This is a ``literal with 'quotes'``
diff --git a/tests/roots/test-stylesheets/_templates/layout.html b/tests/roots/test-stylesheets/_templates/layout.html
new file mode 100644
index 0000000..d048fe4
--- /dev/null
+++ b/tests/roots/test-stylesheets/_templates/layout.html
@@ -0,0 +1,8 @@
+{% extends "!layout.html" %}
+{%- block css %}
+ {{ super() }}
+ <link rel="stylesheet" href="_static/more_persistent.css" type="text/css" />
+ <link rel="stylesheet" href="_static/more_default.css" type="text/css" title="Default" />
+ <link rel="alternate stylesheet" href="_static/more_alternate1.css" type="text/css" title="Alternate" />
+ <link rel="alternate stylesheet" href="_static/more_alternate2.css" type="text/css" />
+{%- endblock %}
diff --git a/tests/roots/test-stylesheets/conf.py b/tests/roots/test-stylesheets/conf.py
new file mode 100644
index 0000000..fa37130
--- /dev/null
+++ b/tests/roots/test-stylesheets/conf.py
@@ -0,0 +1,9 @@
+html_theme = 'classic'
+templates_path = ['_templates']
+
+
+def setup(app):
+ app.add_css_file('persistent.css')
+ app.add_css_file('default.css', title="Default")
+ app.add_css_file('alternate1.css', title="Alternate", rel="alternate stylesheet")
+ app.add_css_file('alternate2.css', rel="alternate stylesheet")
diff --git a/tests/roots/test-stylesheets/index.rst b/tests/roots/test-stylesheets/index.rst
new file mode 100644
index 0000000..c5c5766
--- /dev/null
+++ b/tests/roots/test-stylesheets/index.rst
@@ -0,0 +1,4 @@
+test-stylesheets
+================
+
+Lorem ipsum dolor
diff --git a/tests/roots/test-templating/_templates/autosummary/class.rst b/tests/roots/test-templating/_templates/autosummary/class.rst
new file mode 100644
index 0000000..6f50564
--- /dev/null
+++ b/tests/roots/test-templating/_templates/autosummary/class.rst
@@ -0,0 +1,9 @@
+{% extends "!autosummary/class.rst" %}
+
+{% block methods %}
+
+ .. note:: autosummary/class.rst method block overloading
+ {{ sentence }}
+
+ {{ super() }}
+{% endblock %}
diff --git a/tests/roots/test-templating/_templates/layout.html b/tests/roots/test-templating/_templates/layout.html
new file mode 100644
index 0000000..f836c77
--- /dev/null
+++ b/tests/roots/test-templating/_templates/layout.html
@@ -0,0 +1,6 @@
+{% extends "!layout.html" %}
+
+{% block extrahead %}
+<!-- layout overloading -->
+{{ super() }}
+{% endblock %}
diff --git a/tests/roots/test-templating/autosummary_templating.txt b/tests/roots/test-templating/autosummary_templating.txt
new file mode 100644
index 0000000..6b396a3
--- /dev/null
+++ b/tests/roots/test-templating/autosummary_templating.txt
@@ -0,0 +1,7 @@
+Autosummary templating test
+===========================
+
+.. autosummary::
+ :toctree: generated
+
+ sphinx.application.TemplateBridge
diff --git a/tests/roots/test-templating/conf.py b/tests/roots/test-templating/conf.py
new file mode 100644
index 0000000..e03eaf1
--- /dev/null
+++ b/tests/roots/test-templating/conf.py
@@ -0,0 +1,9 @@
+project = 'Sphinx templating <Tests>'
+source_suffix = '.txt'
+keep_warnings = True
+templates_path = ['_templates']
+release = version = '2013.120'
+exclude_patterns = ['_build']
+
+extensions = ['sphinx.ext.autosummary']
+autosummary_generate = ['autosummary_templating']
diff --git a/tests/roots/test-templating/index.txt b/tests/roots/test-templating/index.txt
new file mode 100644
index 0000000..04a40e2
--- /dev/null
+++ b/tests/roots/test-templating/index.txt
@@ -0,0 +1,7 @@
+Welcome to Sphinx Tests's documentation!
+========================================
+
+.. toctree::
+
+ autosummary_templating
+
diff --git a/tests/roots/test-theming/child.zip b/tests/roots/test-theming/child.zip
new file mode 100644
index 0000000..b4a6a56
--- /dev/null
+++ b/tests/roots/test-theming/child.zip
Binary files differ
diff --git a/tests/roots/test-theming/conf.py b/tests/roots/test-theming/conf.py
new file mode 100644
index 0000000..0db7cf0
--- /dev/null
+++ b/tests/roots/test-theming/conf.py
@@ -0,0 +1,3 @@
+html_theme = 'test-theme'
+html_theme_path = ['.', 'test_theme']
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-theming/index.rst b/tests/roots/test-theming/index.rst
new file mode 100644
index 0000000..214dcd7
--- /dev/null
+++ b/tests/roots/test-theming/index.rst
@@ -0,0 +1,5 @@
+=======
+Theming
+=======
+
+
diff --git a/tests/roots/test-theming/parent.zip b/tests/roots/test-theming/parent.zip
new file mode 100644
index 0000000..8a246ed
--- /dev/null
+++ b/tests/roots/test-theming/parent.zip
Binary files differ
diff --git a/tests/roots/test-theming/test_theme/__init__.py b/tests/roots/test-theming/test_theme/__init__.py
new file mode 100644
index 0000000..13bdc4b
--- /dev/null
+++ b/tests/roots/test-theming/test_theme/__init__.py
@@ -0,0 +1,5 @@
+import os
+
+
+def get_path():
+ return os.path.dirname(os.path.abspath(__file__))
diff --git a/tests/roots/test-theming/test_theme/staticfiles/layout.html b/tests/roots/test-theming/test_theme/staticfiles/layout.html
new file mode 100644
index 0000000..81372be
--- /dev/null
+++ b/tests/roots/test-theming/test_theme/staticfiles/layout.html
@@ -0,0 +1,5 @@
+{% extends "basic/layout.html" %}
+{% block extrahead %}
+<meta name="testopt" content="{{ theme_testopt }}" />
+{{ super() }}
+{% endblock %}
diff --git a/tests/roots/test-theming/test_theme/staticfiles/static/staticimg.png b/tests/roots/test-theming/test_theme/staticfiles/static/staticimg.png
new file mode 100644
index 0000000..fda6cd2
--- /dev/null
+++ b/tests/roots/test-theming/test_theme/staticfiles/static/staticimg.png
Binary files differ
diff --git a/tests/roots/test-theming/test_theme/staticfiles/static/statictmpl.html_t b/tests/roots/test-theming/test_theme/staticfiles/static/statictmpl.html_t
new file mode 100644
index 0000000..4ab292b
--- /dev/null
+++ b/tests/roots/test-theming/test_theme/staticfiles/static/statictmpl.html_t
@@ -0,0 +1,2 @@
+<!-- testing static templates -->
+<html><project>{{ project|e }}</project></html>
diff --git a/tests/roots/test-theming/test_theme/staticfiles/theme.conf b/tests/roots/test-theming/test_theme/staticfiles/theme.conf
new file mode 100644
index 0000000..a877673
--- /dev/null
+++ b/tests/roots/test-theming/test_theme/staticfiles/theme.conf
@@ -0,0 +1,7 @@
+[theme]
+inherit = basic
+stylesheet = default.css
+pygments_style = emacs
+
+[options]
+testopt = optdefault
diff --git a/tests/roots/test-theming/test_theme/test-theme/theme.conf b/tests/roots/test-theming/test_theme/test-theme/theme.conf
new file mode 100644
index 0000000..2ad2c33
--- /dev/null
+++ b/tests/roots/test-theming/test_theme/test-theme/theme.conf
@@ -0,0 +1,4 @@
+[theme]
+inherit = classic
+sidebars = globaltoc.html, searchbox.html
+pygments_dark_style = monokai
diff --git a/tests/roots/test-theming/ziptheme.zip b/tests/roots/test-theming/ziptheme.zip
new file mode 100644
index 0000000..8a246ed
--- /dev/null
+++ b/tests/roots/test-theming/ziptheme.zip
Binary files differ
diff --git a/tests/roots/test-tocdepth/bar.rst b/tests/roots/test-tocdepth/bar.rst
new file mode 100644
index 0000000..d70dec9
--- /dev/null
+++ b/tests/roots/test-tocdepth/bar.rst
@@ -0,0 +1,27 @@
+:tocdepth: 2
+
+===
+Bar
+===
+
+should be 2
+
+Bar A
+=====
+
+should be 2.1
+
+.. toctree::
+
+ baz
+
+Bar B
+=====
+
+should be 2.2
+
+Bar B1
+------
+
+should be 2.2.1
+
diff --git a/tests/roots/test-tocdepth/baz.rst b/tests/roots/test-tocdepth/baz.rst
new file mode 100644
index 0000000..b07fa05
--- /dev/null
+++ b/tests/roots/test-tocdepth/baz.rst
@@ -0,0 +1,5 @@
+Baz A
+-----
+
+should be 2.1.1
+
diff --git a/tests/roots/test-tocdepth/conf.py b/tests/roots/test-tocdepth/conf.py
new file mode 100644
index 0000000..46bb290
--- /dev/null
+++ b/tests/roots/test-tocdepth/conf.py
@@ -0,0 +1,2 @@
+html_theme = 'classic'
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-tocdepth/foo.rst b/tests/roots/test-tocdepth/foo.rst
new file mode 100644
index 0000000..61fd539
--- /dev/null
+++ b/tests/roots/test-tocdepth/foo.rst
@@ -0,0 +1,26 @@
+===
+Foo
+===
+
+should be 1
+
+Foo A
+=====
+
+should be 1.1
+
+Foo A1
+------
+
+should be 1.1.1
+
+Foo B
+=====
+
+should be 1.2
+
+Foo B1
+------
+
+should be 1.2.1
+
diff --git a/tests/roots/test-tocdepth/index.rst b/tests/roots/test-tocdepth/index.rst
new file mode 100644
index 0000000..0b651d4
--- /dev/null
+++ b/tests/roots/test-tocdepth/index.rst
@@ -0,0 +1,8 @@
+test-tocdepth
+=============
+
+.. toctree::
+ :numbered:
+
+ foo
+ bar
diff --git a/tests/roots/test-toctree-domain-objects/conf.py b/tests/roots/test-toctree-domain-objects/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-toctree-domain-objects/conf.py
diff --git a/tests/roots/test-toctree-domain-objects/domains.rst b/tests/roots/test-toctree-domain-objects/domains.rst
new file mode 100644
index 0000000..61467cf
--- /dev/null
+++ b/tests/roots/test-toctree-domain-objects/domains.rst
@@ -0,0 +1,39 @@
+test-domain-objects
+===================
+
+.. py:module:: hello
+
+.. py:function:: world() -> str
+
+ Prints "Hello, World!" to stdout
+
+.. py:class:: HelloWorldPrinter
+
+ Controls printing of hello world
+
+ .. py:method:: set_language()
+
+ Sets the language of the HelloWorldPrinter instance
+
+ .. py:attribute:: output_count
+
+ Count of outputs of "Hello, World!"
+
+ .. py:method:: print_normal()
+ :async:
+ :classmethod:
+
+ Prints the normal form of "Hello, World!"
+
+ .. py:method:: print()
+
+ Prints "Hello, World!", including in the chosen language
+
+.. py:function:: exit()
+ :module: sys
+
+ Quits the interpreter
+
+.. js:function:: fetch(resource)
+
+ Fetches the given resource, returns a Promise \ No newline at end of file
diff --git a/tests/roots/test-toctree-domain-objects/index.rst b/tests/roots/test-toctree-domain-objects/index.rst
new file mode 100644
index 0000000..77ee010
--- /dev/null
+++ b/tests/roots/test-toctree-domain-objects/index.rst
@@ -0,0 +1,6 @@
+.. toctree::
+ :numbered:
+ :caption: Table of Contents
+ :name: mastertoc
+
+ domains
diff --git a/tests/roots/test-toctree-duplicated/conf.py b/tests/roots/test-toctree-duplicated/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-toctree-duplicated/conf.py
diff --git a/tests/roots/test-toctree-duplicated/foo.rst b/tests/roots/test-toctree-duplicated/foo.rst
new file mode 100644
index 0000000..f23d4ce
--- /dev/null
+++ b/tests/roots/test-toctree-duplicated/foo.rst
@@ -0,0 +1,2 @@
+foo
+===
diff --git a/tests/roots/test-toctree-duplicated/index.rst b/tests/roots/test-toctree-duplicated/index.rst
new file mode 100644
index 0000000..38a8c44
--- /dev/null
+++ b/tests/roots/test-toctree-duplicated/index.rst
@@ -0,0 +1,7 @@
+test-toctree-duplicated
+=======================
+
+.. toctree::
+
+ foo
+ foo
diff --git a/tests/roots/test-toctree-empty/_templates/localtoc.html b/tests/roots/test-toctree-empty/_templates/localtoc.html
new file mode 100644
index 0000000..0fd9139
--- /dev/null
+++ b/tests/roots/test-toctree-empty/_templates/localtoc.html
@@ -0,0 +1,2 @@
+{# This will call toctree unconditionally, whether there is a local or global toc #}
+{{ toctree() }}
diff --git a/tests/roots/test-toctree-empty/conf.py b/tests/roots/test-toctree-empty/conf.py
new file mode 100644
index 0000000..bda61da
--- /dev/null
+++ b/tests/roots/test-toctree-empty/conf.py
@@ -0,0 +1,2 @@
+exclude_patterns = ['_build']
+templates_path = ['_templates']
diff --git a/tests/roots/test-toctree-empty/index.rst b/tests/roots/test-toctree-empty/index.rst
new file mode 100644
index 0000000..0b97a60
--- /dev/null
+++ b/tests/roots/test-toctree-empty/index.rst
@@ -0,0 +1,4 @@
+test-toctree-empty
+==================
+
+.. toctree::
diff --git a/tests/roots/test-toctree-glob/bar/bar_1.rst b/tests/roots/test-toctree-glob/bar/bar_1.rst
new file mode 100644
index 0000000..6229a15
--- /dev/null
+++ b/tests/roots/test-toctree-glob/bar/bar_1.rst
@@ -0,0 +1,4 @@
+Bar-1
+=====
+
+bar
diff --git a/tests/roots/test-toctree-glob/bar/bar_2.rst b/tests/roots/test-toctree-glob/bar/bar_2.rst
new file mode 100644
index 0000000..ed78621
--- /dev/null
+++ b/tests/roots/test-toctree-glob/bar/bar_2.rst
@@ -0,0 +1,4 @@
+Bar-2
+=====
+
+bar
diff --git a/tests/roots/test-toctree-glob/bar/bar_3.rst b/tests/roots/test-toctree-glob/bar/bar_3.rst
new file mode 100644
index 0000000..93c58d4
--- /dev/null
+++ b/tests/roots/test-toctree-glob/bar/bar_3.rst
@@ -0,0 +1,4 @@
+Bar-3
+=====
+
+bar
diff --git a/tests/roots/test-toctree-glob/bar/bar_4/index.rst b/tests/roots/test-toctree-glob/bar/bar_4/index.rst
new file mode 100644
index 0000000..4fae623
--- /dev/null
+++ b/tests/roots/test-toctree-glob/bar/bar_4/index.rst
@@ -0,0 +1,4 @@
+Bar-4
+=====
+
+bar
diff --git a/tests/roots/test-toctree-glob/bar/index.rst b/tests/roots/test-toctree-glob/bar/index.rst
new file mode 100644
index 0000000..74a9ba9
--- /dev/null
+++ b/tests/roots/test-toctree-glob/bar/index.rst
@@ -0,0 +1,8 @@
+Bar
+===
+
+.. toctree::
+ :glob:
+
+ *
+ bar_4/index
diff --git a/tests/roots/test-toctree-glob/baz.rst b/tests/roots/test-toctree-glob/baz.rst
new file mode 100644
index 0000000..2c1bbbc
--- /dev/null
+++ b/tests/roots/test-toctree-glob/baz.rst
@@ -0,0 +1,4 @@
+Baz
+===
+
+baz
diff --git a/tests/roots/test-toctree-glob/conf.py b/tests/roots/test-toctree-glob/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-toctree-glob/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-toctree-glob/foo.rst b/tests/roots/test-toctree-glob/foo.rst
new file mode 100644
index 0000000..83f9522
--- /dev/null
+++ b/tests/roots/test-toctree-glob/foo.rst
@@ -0,0 +1,4 @@
+Foo
+===
+
+foo
diff --git a/tests/roots/test-toctree-glob/index.rst b/tests/roots/test-toctree-glob/index.rst
new file mode 100644
index 0000000..4ed6bb4
--- /dev/null
+++ b/tests/roots/test-toctree-glob/index.rst
@@ -0,0 +1,28 @@
+test-toctree-glob
+=================
+
+normal order
+------------
+
+.. toctree::
+ :glob:
+
+ foo
+ bar/index
+ bar/*
+ baz
+ qux/index
+ hyperref <https://sphinx-doc.org/?q=sphinx>
+
+reversed order
+--------------
+
+.. toctree::
+ :glob:
+ :reversed:
+
+ foo
+ bar/index
+ bar/*
+ baz
+ qux/index
diff --git a/tests/roots/test-toctree-glob/quux.rst b/tests/roots/test-toctree-glob/quux.rst
new file mode 100644
index 0000000..340389d
--- /dev/null
+++ b/tests/roots/test-toctree-glob/quux.rst
@@ -0,0 +1,4 @@
+Quux
+====
+
+quux
diff --git a/tests/roots/test-toctree-glob/qux/index.rst b/tests/roots/test-toctree-glob/qux/index.rst
new file mode 100644
index 0000000..ad0bee5
--- /dev/null
+++ b/tests/roots/test-toctree-glob/qux/index.rst
@@ -0,0 +1,8 @@
+Qux
+===
+
+.. toctree::
+ :glob:
+ :hidden:
+
+ *
diff --git a/tests/roots/test-toctree-glob/qux/qux_1.rst b/tests/roots/test-toctree-glob/qux/qux_1.rst
new file mode 100644
index 0000000..bac227b
--- /dev/null
+++ b/tests/roots/test-toctree-glob/qux/qux_1.rst
@@ -0,0 +1,4 @@
+Qux-1
+=====
+
+qux
diff --git a/tests/roots/test-toctree-glob/qux/qux_2.rst b/tests/roots/test-toctree-glob/qux/qux_2.rst
new file mode 100644
index 0000000..bac227b
--- /dev/null
+++ b/tests/roots/test-toctree-glob/qux/qux_2.rst
@@ -0,0 +1,4 @@
+Qux-1
+=====
+
+qux
diff --git a/tests/roots/test-toctree-index/conf.py b/tests/roots/test-toctree-index/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-toctree-index/conf.py
diff --git a/tests/roots/test-toctree-index/foo.rst b/tests/roots/test-toctree-index/foo.rst
new file mode 100644
index 0000000..fc2c716
--- /dev/null
+++ b/tests/roots/test-toctree-index/foo.rst
@@ -0,0 +1,8 @@
+foo
+===
+
+:index:`word`
+
+.. py:module:: pymodule
+
+.. py:function:: Timer.repeat(repeat=3, number=1000000)
diff --git a/tests/roots/test-toctree-index/index.rst b/tests/roots/test-toctree-index/index.rst
new file mode 100644
index 0000000..eb211c5
--- /dev/null
+++ b/tests/roots/test-toctree-index/index.rst
@@ -0,0 +1,15 @@
+test-toctree-index
+==================
+
+.. toctree::
+
+ foo
+
+
+.. toctree::
+ :caption: Indices
+
+ genindex
+ modindex
+ search
+
diff --git a/tests/roots/test-toctree-maxdepth/bar.rst b/tests/roots/test-toctree-maxdepth/bar.rst
new file mode 100644
index 0000000..d70dec9
--- /dev/null
+++ b/tests/roots/test-toctree-maxdepth/bar.rst
@@ -0,0 +1,27 @@
+:tocdepth: 2
+
+===
+Bar
+===
+
+should be 2
+
+Bar A
+=====
+
+should be 2.1
+
+.. toctree::
+
+ baz
+
+Bar B
+=====
+
+should be 2.2
+
+Bar B1
+------
+
+should be 2.2.1
+
diff --git a/tests/roots/test-toctree-maxdepth/baz.rst b/tests/roots/test-toctree-maxdepth/baz.rst
new file mode 100644
index 0000000..b07fa05
--- /dev/null
+++ b/tests/roots/test-toctree-maxdepth/baz.rst
@@ -0,0 +1,5 @@
+Baz A
+-----
+
+should be 2.1.1
+
diff --git a/tests/roots/test-toctree-maxdepth/conf.py b/tests/roots/test-toctree-maxdepth/conf.py
new file mode 100644
index 0000000..a45d22e
--- /dev/null
+++ b/tests/roots/test-toctree-maxdepth/conf.py
@@ -0,0 +1 @@
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-toctree-maxdepth/foo.rst b/tests/roots/test-toctree-maxdepth/foo.rst
new file mode 100644
index 0000000..61fd539
--- /dev/null
+++ b/tests/roots/test-toctree-maxdepth/foo.rst
@@ -0,0 +1,26 @@
+===
+Foo
+===
+
+should be 1
+
+Foo A
+=====
+
+should be 1.1
+
+Foo A1
+------
+
+should be 1.1.1
+
+Foo B
+=====
+
+should be 1.2
+
+Foo B1
+------
+
+should be 1.2.1
+
diff --git a/tests/roots/test-toctree-maxdepth/index.rst b/tests/roots/test-toctree-maxdepth/index.rst
new file mode 100644
index 0000000..30dc61c
--- /dev/null
+++ b/tests/roots/test-toctree-maxdepth/index.rst
@@ -0,0 +1,9 @@
+test-toctree-max-depth
+======================
+
+.. toctree::
+ :numbered:
+ :maxdepth: 2
+
+ foo
+ bar
diff --git a/tests/roots/test-toctree-maxdepth/qux.rst b/tests/roots/test-toctree-maxdepth/qux.rst
new file mode 100644
index 0000000..35e9ac1
--- /dev/null
+++ b/tests/roots/test-toctree-maxdepth/qux.rst
@@ -0,0 +1,9 @@
+test-toctree-max-depth
+======================
+
+.. toctree::
+ :numbered:
+ :maxdepth: 4
+
+ foo
+ bar
diff --git a/tests/roots/test-toctree/bar.rst b/tests/roots/test-toctree/bar.rst
new file mode 100644
index 0000000..1cccd3c
--- /dev/null
+++ b/tests/roots/test-toctree/bar.rst
@@ -0,0 +1,2 @@
+bar
+===
diff --git a/tests/roots/test-toctree/baz.rst b/tests/roots/test-toctree/baz.rst
new file mode 100644
index 0000000..52e2e72
--- /dev/null
+++ b/tests/roots/test-toctree/baz.rst
@@ -0,0 +1,2 @@
+baz
+===
diff --git a/tests/roots/test-toctree/conf.py b/tests/roots/test-toctree/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-toctree/conf.py
diff --git a/tests/roots/test-toctree/foo.rst b/tests/roots/test-toctree/foo.rst
new file mode 100644
index 0000000..49f4d4b
--- /dev/null
+++ b/tests/roots/test-toctree/foo.rst
@@ -0,0 +1,15 @@
+foo
+===
+
+.. toctree::
+
+ quux
+
+foo.1
+-----
+
+foo.1-1
+^^^^^^^
+
+foo.2
+-----
diff --git a/tests/roots/test-toctree/index.rst b/tests/roots/test-toctree/index.rst
new file mode 100644
index 0000000..adf1b84
--- /dev/null
+++ b/tests/roots/test-toctree/index.rst
@@ -0,0 +1,55 @@
+.. Sphinx Tests documentation master file, created by sphinx-quickstart on Wed Jun 4 23:49:58 2008.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to Sphinx Tests's documentation!
+========================================
+
+Contents:
+
+.. toctree::
+ :maxdepth: 2
+ :numbered:
+ :caption: Table of Contents
+ :name: mastertoc
+
+ foo
+ bar
+ http://sphinx-doc.org/
+ self
+
+.. only:: html
+
+ Section for HTML
+ ----------------
+
+ .. toctree::
+
+ baz
+
+----------
+subsection
+----------
+
+subsubsection
+-------------
+
+Test for issue #1157
+====================
+
+This used to crash:
+
+.. toctree::
+
+.. toctree::
+ :hidden:
+
+ Latest reference <http://sphinx-doc.org/latest/>
+ Python <http://python.org/>
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/tests/roots/test-toctree/quux.rst b/tests/roots/test-toctree/quux.rst
new file mode 100644
index 0000000..07dd0a0
--- /dev/null
+++ b/tests/roots/test-toctree/quux.rst
@@ -0,0 +1,2 @@
+quux
+====
diff --git a/tests/roots/test-toctree/qux.rst b/tests/roots/test-toctree/qux.rst
new file mode 100644
index 0000000..26176b9
--- /dev/null
+++ b/tests/roots/test-toctree/qux.rst
@@ -0,0 +1 @@
+qux.rst has no section title
diff --git a/tests/roots/test-toctree/tocdepth.rst b/tests/roots/test-toctree/tocdepth.rst
new file mode 100644
index 0000000..1069b4c
--- /dev/null
+++ b/tests/roots/test-toctree/tocdepth.rst
@@ -0,0 +1,15 @@
+:tocdepth: 2
+
+=======
+level 1
+=======
+
+level 2
+=======
+
+-------
+level 3
+-------
+
+level 4
+-------
diff --git a/tests/roots/test-transforms-post_transforms-keyboard/conf.py b/tests/roots/test-transforms-post_transforms-keyboard/conf.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/roots/test-transforms-post_transforms-keyboard/conf.py
diff --git a/tests/roots/test-transforms-post_transforms-keyboard/index.rst b/tests/roots/test-transforms-post_transforms-keyboard/index.rst
new file mode 100644
index 0000000..2177578
--- /dev/null
+++ b/tests/roots/test-transforms-post_transforms-keyboard/index.rst
@@ -0,0 +1,4 @@
+Regression test for issue 10495
+===============================
+
+:kbd:`spanish - inquisition`
diff --git a/tests/roots/test-transforms-post_transforms-missing-reference/conf.py b/tests/roots/test-transforms-post_transforms-missing-reference/conf.py
new file mode 100644
index 0000000..2db221c
--- /dev/null
+++ b/tests/roots/test-transforms-post_transforms-missing-reference/conf.py
@@ -0,0 +1 @@
+nitpicky = True
diff --git a/tests/roots/test-transforms-post_transforms-missing-reference/index.rst b/tests/roots/test-transforms-post_transforms-missing-reference/index.rst
new file mode 100644
index 0000000..7180978
--- /dev/null
+++ b/tests/roots/test-transforms-post_transforms-missing-reference/index.rst
@@ -0,0 +1,5 @@
+transforms-post_transforms-missing-reference
+============================================
+
+:class:`io.StringIO`
+
diff --git a/tests/roots/test-trim_doctest_flags/conf.py b/tests/roots/test-trim_doctest_flags/conf.py
new file mode 100644
index 0000000..77c7255
--- /dev/null
+++ b/tests/roots/test-trim_doctest_flags/conf.py
@@ -0,0 +1 @@
+extensions = ['sphinx.ext.doctest']
diff --git a/tests/roots/test-trim_doctest_flags/index.rst b/tests/roots/test-trim_doctest_flags/index.rst
new file mode 100644
index 0000000..d63251a
--- /dev/null
+++ b/tests/roots/test-trim_doctest_flags/index.rst
@@ -0,0 +1,40 @@
+test-trim_doctest_flags
+=======================
+
+.. code-block:: pycon
+
+ >>> datetime.date.now() # doctest: +FOO
+ datetime.date(2008, 1, 1)
+
+.. code-block:: none
+
+ >>> datetime.date.now() # doctest: +BAR
+ datetime.date(2008, 1, 1)
+
+.. code-block:: guess
+
+ # vim: set filetype=pycon
+ >>> datetime.date.now() # doctest: +BAZ
+ datetime.date(2008, 1, 1)
+
+.. testcode::
+
+ >>> datetime.date.now() # doctest: +QUX
+ datetime.date(2008, 1, 1)
+
+.. doctest::
+
+ >>> datetime.date.now() # doctest: +QUUX
+ datetime.date(2008, 1, 1)
+
+.. doctest::
+ :trim-doctest-flags:
+
+ >>> datetime.date.now() # doctest: +CORGE
+ datetime.date(2008, 1, 1)
+
+.. doctest::
+ :no-trim-doctest-flags:
+
+ >>> datetime.date.now() # doctest: +GRAULT
+ datetime.date(2008, 1, 1)
diff --git a/tests/roots/test-versioning/added.txt b/tests/roots/test-versioning/added.txt
new file mode 100644
index 0000000..22a7073
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/conf.py b/tests/roots/test-versioning/conf.py
new file mode 100644
index 0000000..6344cb0
--- /dev/null
+++ b/tests/roots/test-versioning/conf.py
@@ -0,0 +1,3 @@
+project = 'versioning test root'
+source_suffix = '.txt'
+exclude_patterns = ['_build']
diff --git a/tests/roots/test-versioning/deleted.txt b/tests/roots/test-versioning/deleted.txt
new file mode 100644
index 0000000..a1a9c4c
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/deleted_end.txt b/tests/roots/test-versioning/deleted_end.txt
new file mode 100644
index 0000000..f30e630
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/index.txt b/tests/roots/test-versioning/index.txt
new file mode 100644
index 0000000..9d098f7
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/insert.txt b/tests/roots/test-versioning/insert.txt
new file mode 100644
index 0000000..1c157cc
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/insert_beginning.txt b/tests/roots/test-versioning/insert_beginning.txt
new file mode 100644
index 0000000..57102a7
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/insert_similar.txt b/tests/roots/test-versioning/insert_similar.txt
new file mode 100644
index 0000000..ee9b530
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/modified.txt b/tests/roots/test-versioning/modified.txt
new file mode 100644
index 0000000..49cdad9
--- /dev/null
+++ b/tests/roots/test-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/roots/test-versioning/original.txt b/tests/roots/test-versioning/original.txt
new file mode 100644
index 0000000..b3fe060
--- /dev/null
+++ b/tests/roots/test-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/roots/test-warnings/autodoc_fodder.py b/tests/roots/test-warnings/autodoc_fodder.py
new file mode 100644
index 0000000..59e4e21
--- /dev/null
+++ b/tests/roots/test-warnings/autodoc_fodder.py
@@ -0,0 +1,6 @@
+class MarkupError:
+ """
+ .. note:: This is a docstring with a
+ small markup error which should have
+ correct location information.
+ """
diff --git a/tests/roots/test-warnings/conf.py b/tests/roots/test-warnings/conf.py
new file mode 100644
index 0000000..25b8aba
--- /dev/null
+++ b/tests/roots/test-warnings/conf.py
@@ -0,0 +1,6 @@
+import os
+import sys
+
+sys.path.append(os.path.abspath('.'))
+
+extensions = ['sphinx.ext.autodoc']
diff --git a/tests/roots/test-warnings/index.rst b/tests/roots/test-warnings/index.rst
new file mode 100644
index 0000000..ac52d90
--- /dev/null
+++ b/tests/roots/test-warnings/index.rst
@@ -0,0 +1,45 @@
+test-warnings
+=============
+
+.. automodule:: autodoc_fodder
+ :no-index:
+
+ .. autoclass:: MarkupError
+
+.. a non-existing image with direct filename
+.. image:: foo.png
+
+.. a non-existing image with .*
+.. image:: foo.*
+
+.. an SVG image (for HTML at least)
+.. image:: svgimg.*
+
+.. should give a warning
+.. literalinclude:: wrongenc.inc
+ :language: none
+
+.. a non-existing download
+
+Don't download :download:`this <nonexisting.png>`.
+
+.. Invalid index markup
+.. index::
+ single:
+ pair:
+ seealso:
+
+.. Invalid code-block
+.. code-block:: c
+
+ import sys
+
+ sys.stdout.write('hello world!\n')
+
+.. unknown option
+
+This used to crash: :option:`&option`
+
+.. missing citation
+
+[missing]_ citation
diff --git a/tests/roots/test-warnings/svgimg.pdf b/tests/roots/test-warnings/svgimg.pdf
new file mode 100644
index 0000000..cacbd85
--- /dev/null
+++ b/tests/roots/test-warnings/svgimg.pdf
Binary files differ
diff --git a/tests/roots/test-warnings/svgimg.svg b/tests/roots/test-warnings/svgimg.svg
new file mode 100644
index 0000000..2bae0b9
--- /dev/null
+++ b/tests/roots/test-warnings/svgimg.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="60" width="60">
+ <circle cx="40" cy="40" r="24" style="stroke:#000000; fill:#ffffff"/>
+</svg>
diff --git a/tests/roots/test-warnings/undecodable.rst b/tests/roots/test-warnings/undecodable.rst
new file mode 100644
index 0000000..a4cf5c3
--- /dev/null
+++ b/tests/roots/test-warnings/undecodable.rst
@@ -0,0 +1,3 @@
+:orphan:
+
+here: »
diff --git a/tests/roots/test-warnings/wrongenc.inc b/tests/roots/test-warnings/wrongenc.inc
new file mode 100644
index 0000000..700f613
--- /dev/null
+++ b/tests/roots/test-warnings/wrongenc.inc
@@ -0,0 +1,3 @@
+This file is encoded in latin-1 but at first read as utf-8.
+
+Max Strauß aß in München eine Leberkässemmel.
diff --git a/tests/test_addnodes.py b/tests/test_addnodes.py
new file mode 100644
index 0000000..184a696
--- /dev/null
+++ b/tests/test_addnodes.py
@@ -0,0 +1,51 @@
+"""Test the non-trivial features in the :mod:`sphinx.addnodes` module."""
+
+from __future__ import annotations
+
+import pytest
+
+from sphinx import addnodes
+
+
+@pytest.fixture()
+def sig_elements() -> set[type[addnodes.desc_sig_element]]:
+ """Fixture returning the current ``addnodes.SIG_ELEMENTS`` set."""
+ original = addnodes.SIG_ELEMENTS.copy() # safe copy of the current nodes
+ yield {*addnodes.SIG_ELEMENTS} # temporary value to use during tests
+ addnodes.SIG_ELEMENTS = original # restore the previous value
+
+
+def test_desc_sig_element_nodes(sig_elements):
+ """Test the registration of ``desc_sig_element`` subclasses."""
+
+ # expected desc_sig_* node classes (must be declared *after* reloading
+ # the module since otherwise the objects are not the correct ones)
+ EXPECTED_SIG_ELEMENTS = {
+ addnodes.desc_sig_space,
+ addnodes.desc_sig_name,
+ addnodes.desc_sig_operator,
+ addnodes.desc_sig_punctuation,
+ addnodes.desc_sig_keyword,
+ addnodes.desc_sig_keyword_type,
+ addnodes.desc_sig_literal_number,
+ addnodes.desc_sig_literal_string,
+ addnodes.desc_sig_literal_char,
+ }
+
+ assert addnodes.SIG_ELEMENTS == EXPECTED_SIG_ELEMENTS
+
+ # create a built-in custom desc_sig_element (added to SIG_ELEMENTS)
+ class BuiltInSigElementLikeNode(addnodes.desc_sig_element, _sig_element=True):
+ pass
+
+ # create a custom desc_sig_element (implicitly not added to SIG_ELEMENTS)
+ class Custom1SigElementLikeNode(addnodes.desc_sig_element):
+ pass
+
+ # create a custom desc_sig_element (explicitly not added to SIG_ELEMENTS)
+ class Custom2SigElementLikeNode(addnodes.desc_sig_element, _sig_element=False):
+ pass
+
+ assert BuiltInSigElementLikeNode in addnodes.SIG_ELEMENTS
+ assert Custom1SigElementLikeNode not in addnodes.SIG_ELEMENTS
+ assert Custom2SigElementLikeNode not in addnodes.SIG_ELEMENTS
diff --git a/tests/test_api_translator.py b/tests/test_api_translator.py
new file mode 100644
index 0000000..9f2bd44
--- /dev/null
+++ b/tests/test_api_translator.py
@@ -0,0 +1,92 @@
+"""Test the Sphinx API for translator."""
+
+import sys
+
+import pytest
+
+
+@pytest.fixture(scope='module', autouse=True)
+def _setup_module(rootdir):
+ p = rootdir / 'test-api-set-translator'
+ sys.path.insert(0, p)
+ yield
+ sys.path.remove(p)
+
+
+@pytest.mark.sphinx('html')
+def test_html_translator(app, status, warning):
+ # no set_translator()
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'HTML5Translator'
+
+
+@pytest.mark.sphinx('html', testroot='api-set-translator')
+def test_html_with_set_translator_for_html_(app, status, warning):
+ # use set_translator()
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfHTMLTranslator'
+
+
+@pytest.mark.sphinx('singlehtml', testroot='api-set-translator')
+def test_singlehtml_set_translator_for_singlehtml(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfSingleHTMLTranslator'
+
+
+@pytest.mark.sphinx('pickle', testroot='api-set-translator')
+def test_pickle_set_translator_for_pickle(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfPickleTranslator'
+
+
+@pytest.mark.sphinx('json', testroot='api-set-translator')
+def test_json_set_translator_for_json(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfJsonTranslator'
+
+
+@pytest.mark.sphinx('latex', testroot='api-set-translator')
+def test_html_with_set_translator_for_latex(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfLaTeXTranslator'
+
+
+@pytest.mark.sphinx('man', testroot='api-set-translator')
+def test_html_with_set_translator_for_man(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfManualPageTranslator'
+
+
+@pytest.mark.sphinx('texinfo', testroot='api-set-translator')
+def test_html_with_set_translator_for_texinfo(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfTexinfoTranslator'
+
+
+@pytest.mark.sphinx('text', testroot='api-set-translator')
+def test_html_with_set_translator_for_text(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfTextTranslator'
+
+
+@pytest.mark.sphinx('xml', testroot='api-set-translator')
+def test_html_with_set_translator_for_xml(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfXMLTranslator'
+
+
+@pytest.mark.sphinx('pseudoxml', testroot='api-set-translator')
+def test_html_with_set_translator_for_pseudoxml(app, status, warning):
+ translator_class = app.builder.get_translator_class()
+ assert translator_class
+ assert translator_class.__name__ == 'ConfPseudoXMLTranslator'
diff --git a/tests/test_application.py b/tests/test_application.py
new file mode 100644
index 0000000..a0fe268
--- /dev/null
+++ b/tests/test_application.py
@@ -0,0 +1,152 @@
+"""Test the Sphinx class."""
+
+import shutil
+import sys
+from io import StringIO
+from pathlib import Path
+from unittest.mock import Mock
+
+import pytest
+from docutils import nodes
+
+import sphinx.application
+from sphinx.errors import ExtensionError
+from sphinx.testing.util import SphinxTestApp, strip_escseq
+from sphinx.util import logging
+
+
+def test_instantiation(tmp_path_factory, rootdir: str, monkeypatch):
+ # Given
+ src_dir = tmp_path_factory.getbasetemp() / 'root'
+
+ # special support for sphinx/tests
+ if rootdir and not src_dir.exists():
+ shutil.copytree(Path(str(rootdir)) / 'test-root', src_dir)
+
+ syspath = sys.path[:]
+
+ # When
+ app_ = SphinxTestApp(
+ srcdir=src_dir,
+ status=StringIO(),
+ warning=StringIO(),
+ )
+ sys.path[:] = syspath
+ app_.cleanup()
+
+ # Then
+ assert isinstance(app_, sphinx.application.Sphinx)
+
+
+def test_events(app, status, warning):
+ def empty():
+ pass
+ with pytest.raises(ExtensionError) as excinfo:
+ app.connect("invalid", empty)
+ assert "Unknown event name: invalid" in str(excinfo.value)
+
+ app.add_event("my_event")
+ with pytest.raises(ExtensionError) as excinfo:
+ app.add_event("my_event")
+ assert "Event 'my_event' already present" in str(excinfo.value)
+
+ def mock_callback(a_app, *args):
+ assert a_app is app
+ assert emit_args == args
+ return "ret"
+ emit_args = (1, 3, "string")
+ listener_id = app.connect("my_event", mock_callback)
+ assert app.emit("my_event", *emit_args) == ["ret"], "Callback not called"
+
+ app.disconnect(listener_id)
+ assert app.emit("my_event", *emit_args) == [], \
+ "Callback called when disconnected"
+
+
+def test_emit_with_nonascii_name_node(app, status, warning):
+ node = nodes.section(names=['\u65e5\u672c\u8a9e'])
+ app.emit('my_event', node)
+
+
+def test_extensions(app, status, warning):
+ app.setup_extension('shutil')
+ warning = strip_escseq(warning.getvalue())
+ assert "extension 'shutil' has no setup() function" in warning
+
+
+def test_extension_in_blacklist(app, status, warning):
+ app.setup_extension('sphinxjp.themecore')
+ msg = strip_escseq(warning.getvalue())
+ assert msg.startswith("WARNING: the extension 'sphinxjp.themecore' was")
+
+
+@pytest.mark.sphinx(testroot='add_source_parser')
+def test_add_source_parser(app, status, warning):
+ assert set(app.config.source_suffix) == {'.rst', '.test'}
+
+ # .rst; only in :confval:`source_suffix`
+ assert '.rst' not in app.registry.get_source_parsers()
+ assert app.registry.source_suffix['.rst'] is None
+
+ # .test; configured by API
+ assert app.registry.source_suffix['.test'] == 'test'
+ assert 'test' in app.registry.get_source_parsers()
+ assert app.registry.get_source_parsers()['test'].__name__ == 'TestSourceParser'
+
+
+@pytest.mark.sphinx(testroot='extensions')
+def test_add_is_parallel_allowed(app, status, warning):
+ logging.setup(app, status, warning)
+
+ assert app.is_parallel_allowed('read') is True
+ assert app.is_parallel_allowed('write') is True
+ assert warning.getvalue() == ''
+
+ app.setup_extension('read_parallel')
+ assert app.is_parallel_allowed('read') is True
+ assert app.is_parallel_allowed('write') is True
+ assert warning.getvalue() == ''
+ app.extensions.pop('read_parallel')
+
+ app.setup_extension('write_parallel')
+ assert app.is_parallel_allowed('read') is False
+ assert app.is_parallel_allowed('write') is True
+ assert ("the write_parallel extension does not declare if it is safe "
+ "for parallel reading, assuming it isn't - please ") in warning.getvalue()
+ app.extensions.pop('write_parallel')
+ warning.truncate(0) # reset warnings
+
+ app.setup_extension('read_serial')
+ assert app.is_parallel_allowed('read') is False
+ assert "the read_serial extension is not safe for parallel reading" in warning.getvalue()
+ warning.truncate(0) # reset warnings
+ assert app.is_parallel_allowed('write') is True
+ assert warning.getvalue() == ''
+ app.extensions.pop('read_serial')
+
+ app.setup_extension('write_serial')
+ assert app.is_parallel_allowed('read') is False
+ assert app.is_parallel_allowed('write') is False
+ assert ("the write_serial extension does not declare if it is safe "
+ "for parallel reading, assuming it isn't - please ") in warning.getvalue()
+ app.extensions.pop('write_serial')
+ warning.truncate(0) # reset warnings
+
+
+@pytest.mark.sphinx('dummy', testroot='root')
+def test_build_specific(app):
+ app.builder.build = Mock()
+ filenames = [app.srcdir / 'index.txt', # normal
+ app.srcdir / 'images', # without suffix
+ app.srcdir / 'notfound.txt', # not found
+ app.srcdir / 'img.png', # unknown suffix
+ '/index.txt', # external file
+ app.srcdir / 'subdir', # directory
+ app.srcdir / 'subdir/includes.txt', # file on subdir
+ app.srcdir / 'subdir/../subdir/excluded.txt'] # not normalized
+ app.build(False, filenames)
+
+ expected = ['index', 'subdir/includes', 'subdir/excluded']
+ app.builder.build.assert_called_with(expected,
+ method='specific',
+ summary='3 source files given on command line')
diff --git a/tests/test_build.py b/tests/test_build.py
new file mode 100644
index 0000000..ed4bc43
--- /dev/null
+++ b/tests/test_build.py
@@ -0,0 +1,135 @@
+"""Test all builders."""
+
+import os
+import shutil
+from unittest import mock
+
+import pytest
+from docutils import nodes
+
+from sphinx.errors import SphinxError
+
+
+def request_session_head(url, **kwargs):
+ response = mock.Mock()
+ response.status_code = 200
+ response.url = url
+ return response
+
+
+@pytest.fixture()
+def nonascii_srcdir(request, rootdir, sphinx_test_tempdir):
+ # Build in a non-ASCII source dir
+ test_name = '\u65e5\u672c\u8a9e'
+ basedir = sphinx_test_tempdir / request.node.originalname
+ srcdir = basedir / test_name
+ if not srcdir.exists():
+ shutil.copytree(rootdir / 'test-root', srcdir)
+
+ # add a doc with a non-ASCII file name to the source dir
+ (srcdir / (test_name + '.txt')).write_text("""
+nonascii file name page
+=======================
+""", encoding='utf8')
+
+ root_doc = srcdir / 'index.txt'
+ root_doc.write_text(root_doc.read_text(encoding='utf8') + f"""
+.. toctree::
+
+{test_name}/{test_name}
+""", encoding='utf8')
+ return srcdir
+
+
+# note: this test skips building docs for some builders because they have independent testcase.
+# (html, changes, epub, latex, texinfo and manpage)
+@pytest.mark.parametrize(
+ "buildername",
+ ['dirhtml', 'singlehtml', 'text', 'xml', 'pseudoxml', 'linkcheck'],
+)
+@mock.patch('sphinx.builders.linkcheck.requests.head',
+ side_effect=request_session_head)
+def test_build_all(requests_head, make_app, nonascii_srcdir, buildername):
+ app = make_app(buildername, srcdir=nonascii_srcdir)
+ app.build()
+
+
+def test_root_doc_not_found(tmp_path, make_app):
+ (tmp_path / 'conf.py').write_text('', encoding='utf8')
+ assert os.listdir(tmp_path) == ['conf.py']
+
+ app = make_app('dummy', srcdir=tmp_path)
+ with pytest.raises(SphinxError):
+ app.builder.build_all() # no index.rst
+
+
+@pytest.mark.sphinx(buildername='text', testroot='circular')
+def test_circular_toctree(app, status, warning):
+ app.builder.build_all()
+ warnings = warning.getvalue()
+ assert (
+ 'circular toctree references detected, ignoring: '
+ 'sub <- index <- sub') in warnings
+ assert (
+ 'circular toctree references detected, ignoring: '
+ 'index <- sub <- index') in warnings
+
+
+@pytest.mark.sphinx(buildername='text', testroot='numbered-circular')
+def test_numbered_circular_toctree(app, status, warning):
+ app.builder.build_all()
+ warnings = warning.getvalue()
+ assert (
+ 'circular toctree references detected, ignoring: '
+ 'sub <- index <- sub') in warnings
+ assert (
+ 'circular toctree references detected, ignoring: '
+ 'index <- sub <- index') in warnings
+
+
+@pytest.mark.sphinx(buildername='dummy', testroot='images')
+def test_image_glob(app, status, warning):
+ app.builder.build_all()
+
+ # index.rst
+ doctree = app.env.get_doctree('index')
+
+ assert isinstance(doctree[0][1], nodes.image)
+ assert doctree[0][1]['candidates'] == {'*': 'rimg.png'}
+ assert doctree[0][1]['uri'] == 'rimg.png'
+
+ assert isinstance(doctree[0][2], nodes.figure)
+ assert isinstance(doctree[0][2][0], nodes.image)
+ assert doctree[0][2][0]['candidates'] == {'*': 'rimg.png'}
+ assert doctree[0][2][0]['uri'] == 'rimg.png'
+
+ assert isinstance(doctree[0][3], nodes.image)
+ assert doctree[0][3]['candidates'] == {'application/pdf': 'img.pdf',
+ 'image/gif': 'img.gif',
+ 'image/png': 'img.png'}
+ assert doctree[0][3]['uri'] == 'img.*'
+
+ assert isinstance(doctree[0][4], nodes.figure)
+ assert isinstance(doctree[0][4][0], nodes.image)
+ assert doctree[0][4][0]['candidates'] == {'application/pdf': 'img.pdf',
+ 'image/gif': 'img.gif',
+ 'image/png': 'img.png'}
+ assert doctree[0][4][0]['uri'] == 'img.*'
+
+ # subdir/index.rst
+ doctree = app.env.get_doctree('subdir/index')
+
+ assert isinstance(doctree[0][1], nodes.image)
+ assert doctree[0][1]['candidates'] == {'*': 'subdir/rimg.png'}
+ assert doctree[0][1]['uri'] == 'subdir/rimg.png'
+
+ assert isinstance(doctree[0][2], nodes.image)
+ assert doctree[0][2]['candidates'] == {'application/pdf': 'subdir/svgimg.pdf',
+ 'image/svg+xml': 'subdir/svgimg.svg'}
+ assert doctree[0][2]['uri'] == 'subdir/svgimg.*'
+
+ assert isinstance(doctree[0][3], nodes.figure)
+ assert isinstance(doctree[0][3][0], nodes.image)
+ assert doctree[0][3][0]['candidates'] == {'application/pdf': 'subdir/svgimg.pdf',
+ 'image/svg+xml': 'subdir/svgimg.svg'}
+ assert doctree[0][3][0]['uri'] == 'subdir/svgimg.*'
diff --git a/tests/test_build_changes.py b/tests/test_build_changes.py
new file mode 100644
index 0000000..b340c8d
--- /dev/null
+++ b/tests/test_build_changes.py
@@ -0,0 +1,34 @@
+"""Test the ChangesBuilder class."""
+
+import pytest
+
+
+@pytest.mark.sphinx('changes', testroot='changes')
+def test_build(app):
+ app.build()
+
+ # TODO: Use better checking of html content
+ htmltext = (app.outdir / 'changes.html').read_text(encoding='utf8')
+ assert 'New in version 0.6: Some funny stuff.' in htmltext
+ assert 'Changed in version 0.6: Even more funny stuff.' in htmltext
+ assert 'Deprecated since version 0.6: Boring stuff.' in htmltext
+
+ path_html = (
+ '<b>Path</b>: <i>deprecated:</i> Deprecated since version 0.6:'
+ ' So, that was a bad idea it turns out.')
+ assert path_html in htmltext
+
+ malloc_html = (
+ '<b>void *Test_Malloc(size_t n)</b>: <i>changed:</i> Changed in version 0.6:'
+ ' Can now be replaced with a different allocator.</a>')
+ assert malloc_html in htmltext
+
+
+@pytest.mark.sphinx(
+ 'changes', testroot='changes', srcdir='changes-none',
+ confoverrides={'version': '0.7', 'release': '0.7b1'})
+def test_no_changes(app, status):
+ app.build()
+
+ assert 'no changes in version 0.7.' in status.getvalue()
+ assert not (app.outdir / 'changes.html').exists()
diff --git a/tests/test_build_dirhtml.py b/tests/test_build_dirhtml.py
new file mode 100644
index 0000000..dc5ab86
--- /dev/null
+++ b/tests/test_build_dirhtml.py
@@ -0,0 +1,40 @@
+"""Test dirhtml builder."""
+
+import posixpath
+
+import pytest
+
+from sphinx.util.inventory import InventoryFile
+
+
+@pytest.mark.sphinx(buildername='dirhtml', testroot='builder-dirhtml')
+def test_dirhtml(app, status, warning):
+ app.build()
+
+ assert (app.outdir / 'index.html').exists()
+ assert (app.outdir / 'foo/index.html').exists()
+ assert (app.outdir / 'foo/foo_1/index.html').exists()
+ assert (app.outdir / 'foo/foo_2/index.html').exists()
+ assert (app.outdir / 'bar/index.html').exists()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert 'href="foo/"' in content
+ assert 'href="foo/foo_1/"' in content
+ assert 'href="foo/foo_2/"' in content
+ assert 'href="bar/"' in content
+
+ # objects.inv (refs: #7095)
+ with (app.outdir / 'objects.inv').open('rb') as f:
+ invdata = InventoryFile.load(f, 'path/to', posixpath.join)
+
+ assert 'index' in invdata.get('std:doc')
+ assert invdata['std:doc']['index'] == ('Python', '', 'path/to/', '-')
+
+ assert 'foo/index' in invdata.get('std:doc')
+ assert invdata['std:doc']['foo/index'] == ('Python', '', 'path/to/foo/', '-')
+
+ assert 'index' in invdata.get('std:label')
+ assert invdata['std:label']['index'] == ('Python', '', 'path/to/#index', '-')
+
+ assert 'foo' in invdata.get('std:label')
+ assert invdata['std:label']['foo'] == ('Python', '', 'path/to/foo/#foo', 'foo/index')
diff --git a/tests/test_build_epub.py b/tests/test_build_epub.py
new file mode 100644
index 0000000..7f5b815
--- /dev/null
+++ b/tests/test_build_epub.py
@@ -0,0 +1,411 @@
+"""Test the HTML builder and check output against XPath."""
+
+import os
+import subprocess
+from pathlib import Path
+from subprocess import CalledProcessError
+from xml.etree import ElementTree
+
+import pytest
+
+from sphinx.builders.epub3 import _XML_NAME_PATTERN
+
+
+# check given command is runnable
+def runnable(command):
+ try:
+ subprocess.run(command, capture_output=True, check=True)
+ return True
+ except (OSError, CalledProcessError):
+ return False # command not found or exit with non-zero
+
+
+class EPUBElementTree:
+ """Test helper for content.opf and toc.ncx"""
+ namespaces = {
+ 'idpf': 'http://www.idpf.org/2007/opf',
+ 'dc': 'http://purl.org/dc/elements/1.1/',
+ 'ibooks': 'http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/',
+ 'ncx': 'http://www.daisy.org/z3986/2005/ncx/',
+ 'xhtml': 'http://www.w3.org/1999/xhtml',
+ 'epub': 'http://www.idpf.org/2007/ops',
+ }
+
+ def __init__(self, tree):
+ self.tree = tree
+
+ @classmethod
+ def fromstring(cls, string):
+ tree = ElementTree.fromstring(string) # NoQA: S314 # using known data in tests
+ return cls(tree)
+
+ def find(self, match):
+ ret = self.tree.find(match, namespaces=self.namespaces)
+ if ret is not None:
+ return self.__class__(ret)
+ else:
+ return ret
+
+ def findall(self, match):
+ ret = self.tree.findall(match, namespaces=self.namespaces)
+ return [self.__class__(e) for e in ret]
+
+ def __getattr__(self, name):
+ return getattr(self.tree, name)
+
+ def __iter__(self):
+ for child in self.tree:
+ yield self.__class__(child)
+
+
+@pytest.mark.sphinx('epub', testroot='basic')
+def test_build_epub(app):
+ app.builder.build_all()
+ assert (app.outdir / 'mimetype').read_text(encoding='utf8') == 'application/epub+zip'
+ assert (app.outdir / 'META-INF' / 'container.xml').exists()
+
+ # toc.ncx
+ toc = EPUBElementTree.fromstring((app.outdir / 'toc.ncx').read_text(encoding='utf8'))
+ assert toc.find("./ncx:docTitle/ncx:text").text == 'Python'
+
+ # toc.ncx / head
+ meta = list(toc.find("./ncx:head"))
+ assert meta[0].attrib == {'name': 'dtb:uid', 'content': 'unknown'}
+ assert meta[1].attrib == {'name': 'dtb:depth', 'content': '1'}
+ assert meta[2].attrib == {'name': 'dtb:totalPageCount', 'content': '0'}
+ assert meta[3].attrib == {'name': 'dtb:maxPageNumber', 'content': '0'}
+
+ # toc.ncx / navMap
+ navpoints = toc.findall("./ncx:navMap/ncx:navPoint")
+ assert len(navpoints) == 1
+ assert navpoints[0].attrib == {'id': 'navPoint1', 'playOrder': '1'}
+ assert navpoints[0].find("./ncx:content").attrib == {'src': 'index.xhtml'}
+
+ navlabel = navpoints[0].find("./ncx:navLabel/ncx:text")
+ assert navlabel.text == 'The basic Sphinx documentation for testing'
+
+ # content.opf
+ opf = EPUBElementTree.fromstring((app.outdir / 'content.opf').read_text(encoding='utf8'))
+
+ # content.opf / metadata
+ metadata = opf.find("./idpf:metadata")
+ assert metadata.find("./dc:language").text == 'en'
+ assert metadata.find("./dc:title").text == 'Python'
+ assert metadata.find("./dc:description").text == 'unknown'
+ assert metadata.find("./dc:creator").text == 'unknown'
+ assert metadata.find("./dc:contributor").text == 'unknown'
+ assert metadata.find("./dc:publisher").text == 'unknown'
+ assert metadata.find("./dc:rights").text is None
+ assert metadata.find("./idpf:meta[@property='ibooks:version']").text is None
+ assert metadata.find("./idpf:meta[@property='ibooks:specified-fonts']").text == 'true'
+ assert metadata.find("./idpf:meta[@property='ibooks:binding']").text == 'true'
+ assert metadata.find("./idpf:meta[@property='ibooks:scroll-axis']").text == 'vertical'
+
+ # content.opf / manifest
+ manifest = opf.find("./idpf:manifest")
+ items = list(manifest)
+ assert items[0].attrib == {'id': 'ncx',
+ 'href': 'toc.ncx',
+ 'media-type': 'application/x-dtbncx+xml'}
+ assert items[1].attrib == {'id': 'nav',
+ 'href': 'nav.xhtml',
+ 'media-type': 'application/xhtml+xml',
+ 'properties': 'nav'}
+ assert items[2].attrib == {'id': 'epub-0',
+ 'href': 'genindex.xhtml',
+ 'media-type': 'application/xhtml+xml'}
+ assert items[3].attrib == {'id': 'epub-1',
+ 'href': 'index.xhtml',
+ 'media-type': 'application/xhtml+xml'}
+
+ for i, item in enumerate(items[2:]):
+ # items are named as epub-NN
+ assert item.get('id') == 'epub-%d' % i
+
+ # content.opf / spine
+ spine = opf.find("./idpf:spine")
+ itemrefs = list(spine)
+ assert spine.get('toc') == 'ncx'
+ assert spine.get('page-progression-direction') == 'ltr'
+ assert itemrefs[0].get('idref') == 'epub-1'
+ assert itemrefs[1].get('idref') == 'epub-0'
+
+ # content.opf / guide
+ reference = opf.find("./idpf:guide/idpf:reference")
+ assert reference.get('type') == 'toc'
+ assert reference.get('title') == 'Table of Contents'
+ assert reference.get('href') == 'index.xhtml'
+
+ # nav.xhtml
+ nav = EPUBElementTree.fromstring((app.outdir / 'nav.xhtml').read_text(encoding='utf8'))
+ assert nav.attrib == {'lang': 'en',
+ '{http://www.w3.org/XML/1998/namespace}lang': 'en'}
+ assert nav.find("./xhtml:head/xhtml:title").text == 'Table of Contents'
+
+ # nav.xhtml / nav
+ navlist = nav.find("./xhtml:body/xhtml:nav")
+ toc = navlist.findall("./xhtml:ol/xhtml:li")
+ assert navlist.find("./xhtml:h1").text == 'Table of Contents'
+ assert len(toc) == 1
+ assert toc[0].find("./xhtml:a").get("href") == 'index.xhtml'
+ assert toc[0].find("./xhtml:a").text == 'The basic Sphinx documentation for testing'
+
+
+@pytest.mark.sphinx('epub', testroot='footnotes',
+ confoverrides={'epub_cover': ('_images/rimg.png', None)})
+def test_epub_cover(app):
+ app.build()
+
+ # content.opf / metadata
+ opf = EPUBElementTree.fromstring((app.outdir / 'content.opf').read_text(encoding='utf8'))
+ cover_image = opf.find("./idpf:manifest/idpf:item[@href='%s']" % app.config.epub_cover[0])
+ cover = opf.find("./idpf:metadata/idpf:meta[@name='cover']")
+ assert cover
+ assert cover.get('content') == cover_image.get('id')
+
+
+@pytest.mark.sphinx('epub', testroot='toctree')
+def test_nested_toc(app):
+ app.build()
+
+ # toc.ncx
+ toc = EPUBElementTree.fromstring((app.outdir / 'toc.ncx').read_bytes())
+ assert toc.find("./ncx:docTitle/ncx:text").text == 'Python'
+
+ # toc.ncx / navPoint
+ def navinfo(elem):
+ label = elem.find("./ncx:navLabel/ncx:text")
+ content = elem.find("./ncx:content")
+ return (elem.get('id'), elem.get('playOrder'),
+ content.get('src'), label.text)
+
+ navpoints = toc.findall("./ncx:navMap/ncx:navPoint")
+ assert len(navpoints) == 4
+ assert navinfo(navpoints[0]) == ('navPoint1', '1', 'index.xhtml',
+ "Welcome to Sphinx Tests’s documentation!")
+ assert navpoints[0].findall("./ncx:navPoint") == []
+
+ # toc.ncx / nested navPoints
+ assert navinfo(navpoints[1]) == ('navPoint2', '2', 'foo.xhtml', 'foo')
+ navchildren = navpoints[1].findall("./ncx:navPoint")
+ assert len(navchildren) == 4
+ assert navinfo(navchildren[0]) == ('navPoint3', '2', 'foo.xhtml', 'foo')
+ assert navinfo(navchildren[1]) == ('navPoint4', '3', 'quux.xhtml', 'quux')
+ assert navinfo(navchildren[2]) == ('navPoint5', '4', 'foo.xhtml#foo-1', 'foo.1')
+ assert navinfo(navchildren[3]) == ('navPoint8', '6', 'foo.xhtml#foo-2', 'foo.2')
+
+ # nav.xhtml / nav
+ def navinfo(elem):
+ anchor = elem.find("./xhtml:a")
+ return (anchor.get('href'), anchor.text)
+
+ nav = EPUBElementTree.fromstring((app.outdir / 'nav.xhtml').read_bytes())
+ toc = nav.findall("./xhtml:body/xhtml:nav/xhtml:ol/xhtml:li")
+ assert len(toc) == 4
+ assert navinfo(toc[0]) == ('index.xhtml',
+ "Welcome to Sphinx Tests’s documentation!")
+ assert toc[0].findall("./xhtml:ol") == []
+
+ # nav.xhtml / nested toc
+ assert navinfo(toc[1]) == ('foo.xhtml', 'foo')
+ tocchildren = toc[1].findall("./xhtml:ol/xhtml:li")
+ assert len(tocchildren) == 3
+ assert navinfo(tocchildren[0]) == ('quux.xhtml', 'quux')
+ assert navinfo(tocchildren[1]) == ('foo.xhtml#foo-1', 'foo.1')
+ assert navinfo(tocchildren[2]) == ('foo.xhtml#foo-2', 'foo.2')
+
+ grandchild = tocchildren[1].findall("./xhtml:ol/xhtml:li")
+ assert len(grandchild) == 1
+ assert navinfo(grandchild[0]) == ('foo.xhtml#foo-1-1', 'foo.1-1')
+
+
+@pytest.mark.sphinx('epub', testroot='need-escaped')
+def test_escaped_toc(app):
+ app.build()
+
+ # toc.ncx
+ toc = EPUBElementTree.fromstring((app.outdir / 'toc.ncx').read_bytes())
+ assert toc.find("./ncx:docTitle/ncx:text").text == 'need <b>"escaped"</b> project'
+
+ # toc.ncx / navPoint
+ def navinfo(elem):
+ label = elem.find("./ncx:navLabel/ncx:text")
+ content = elem.find("./ncx:content")
+ return (elem.get('id'), elem.get('playOrder'),
+ content.get('src'), label.text)
+
+ navpoints = toc.findall("./ncx:navMap/ncx:navPoint")
+ assert len(navpoints) == 4
+ assert navinfo(navpoints[0]) == ('navPoint1', '1', 'index.xhtml',
+ "Welcome to Sphinx Tests's documentation!")
+ assert navpoints[0].findall("./ncx:navPoint") == []
+
+ # toc.ncx / nested navPoints
+ assert navinfo(navpoints[1]) == ('navPoint2', '2', 'foo.xhtml', '<foo>')
+ navchildren = navpoints[1].findall("./ncx:navPoint")
+ assert len(navchildren) == 4
+ assert navinfo(navchildren[0]) == ('navPoint3', '2', 'foo.xhtml', '<foo>')
+ assert navinfo(navchildren[1]) == ('navPoint4', '3', 'quux.xhtml', 'quux')
+ assert navinfo(navchildren[2]) == ('navPoint5', '4', 'foo.xhtml#foo-1', 'foo “1â€')
+ assert navinfo(navchildren[3]) == ('navPoint8', '6', 'foo.xhtml#foo-2', 'foo.2')
+
+ # nav.xhtml / nav
+ def navinfo(elem):
+ anchor = elem.find("./xhtml:a")
+ return (anchor.get('href'), anchor.text)
+
+ nav = EPUBElementTree.fromstring((app.outdir / 'nav.xhtml').read_bytes())
+ toc = nav.findall("./xhtml:body/xhtml:nav/xhtml:ol/xhtml:li")
+ assert len(toc) == 4
+ assert navinfo(toc[0]) == ('index.xhtml',
+ "Welcome to Sphinx Tests's documentation!")
+ assert toc[0].findall("./xhtml:ol") == []
+
+ # nav.xhtml / nested toc
+ assert navinfo(toc[1]) == ('foo.xhtml', '<foo>')
+ tocchildren = toc[1].findall("./xhtml:ol/xhtml:li")
+ assert len(tocchildren) == 3
+ assert navinfo(tocchildren[0]) == ('quux.xhtml', 'quux')
+ assert navinfo(tocchildren[1]) == ('foo.xhtml#foo-1', 'foo “1â€')
+ assert navinfo(tocchildren[2]) == ('foo.xhtml#foo-2', 'foo.2')
+
+ grandchild = tocchildren[1].findall("./xhtml:ol/xhtml:li")
+ assert len(grandchild) == 1
+ assert navinfo(grandchild[0]) == ('foo.xhtml#foo-1-1', 'foo.1-1')
+
+
+@pytest.mark.sphinx('epub', testroot='basic')
+def test_epub_writing_mode(app):
+ # horizontal (default)
+ app.builder.build_all()
+
+ # horizontal / page-progression-direction
+ opf = EPUBElementTree.fromstring((app.outdir / 'content.opf').read_text(encoding='utf8'))
+ assert opf.find("./idpf:spine").get('page-progression-direction') == 'ltr'
+
+ # horizontal / ibooks:scroll-axis
+ metadata = opf.find("./idpf:metadata")
+ assert metadata.find("./idpf:meta[@property='ibooks:scroll-axis']").text == 'vertical'
+
+ # horizontal / writing-mode (CSS)
+ css = (app.outdir / '_static' / 'epub.css').read_text(encoding='utf8')
+ assert 'writing-mode: horizontal-tb;' in css
+
+ # vertical
+ app.config.epub_writing_mode = 'vertical'
+ (app.outdir / 'index.xhtml').unlink() # forcely rebuild
+ app.build()
+
+ # vertical / page-progression-direction
+ opf = EPUBElementTree.fromstring((app.outdir / 'content.opf').read_text(encoding='utf8'))
+ assert opf.find("./idpf:spine").get('page-progression-direction') == 'rtl'
+
+ # vertical / ibooks:scroll-axis
+ metadata = opf.find("./idpf:metadata")
+ assert metadata.find("./idpf:meta[@property='ibooks:scroll-axis']").text == 'horizontal'
+
+ # vertical / writing-mode (CSS)
+ css = (app.outdir / '_static' / 'epub.css').read_text(encoding='utf8')
+ assert 'writing-mode: vertical-rl;' in css
+
+
+@pytest.mark.sphinx('epub', testroot='epub-anchor-id')
+def test_epub_anchor_id(app):
+ app.build()
+
+ html = (app.outdir / 'index.xhtml').read_text(encoding='utf8')
+ assert ('<p id="std-setting-STATICFILES_FINDERS">'
+ 'blah blah blah</p>' in html)
+ assert ('<span id="std-setting-STATICFILES_SECTION"></span>'
+ '<h1>blah blah blah</h1>' in html)
+ assert 'see <a class="reference internal" href="#std-setting-STATICFILES_FINDERS">' in html
+
+
+@pytest.mark.sphinx('epub', testroot='html_assets')
+def test_epub_assets(app):
+ app.builder.build_all()
+
+ # epub_sytlesheets (same as html_css_files)
+ content = (app.outdir / 'index.xhtml').read_text(encoding='utf8')
+ assert ('<link rel="stylesheet" type="text/css" href="_static/css/style.css" />'
+ in content)
+ assert ('<link media="print" rel="stylesheet" title="title" type="text/css" '
+ 'href="https://example.com/custom.css" />' in content)
+
+
+@pytest.mark.sphinx('epub', testroot='html_assets',
+ confoverrides={'epub_css_files': ['css/epub.css']})
+def test_epub_css_files(app):
+ app.builder.build_all()
+
+ # epub_css_files
+ content = (app.outdir / 'index.xhtml').read_text(encoding='utf8')
+ assert '<link rel="stylesheet" type="text/css" href="_static/css/epub.css" />' in content
+
+ # files in html_css_files are not outputted
+ assert ('<link rel="stylesheet" type="text/css" href="_static/css/style.css" />'
+ not in content)
+ assert ('<link media="print" rel="stylesheet" title="title" type="text/css" '
+ 'href="https://example.com/custom.css" />' not in content)
+
+
+@pytest.mark.sphinx('epub', testroot='roles-download')
+def test_html_download_role(app, status, warning):
+ app.build()
+ assert not (app.outdir / '_downloads' / 'dummy.dat').exists()
+
+ content = (app.outdir / 'index.xhtml').read_text(encoding='utf8')
+ assert ('<li><p><code class="xref download docutils literal notranslate">'
+ '<span class="pre">dummy.dat</span></code></p></li>' in content)
+ assert ('<li><p><code class="xref download docutils literal notranslate">'
+ '<span class="pre">not_found.dat</span></code></p></li>' in content)
+ assert ('<li><p><code class="xref download docutils literal notranslate">'
+ '<span class="pre">Sphinx</span> <span class="pre">logo</span></code>'
+ '<span class="link-target"> [http://www.sphinx-doc.org/en/master'
+ '/_static/sphinxheader.png]</span></p></li>' in content)
+
+
+@pytest.mark.sphinx('epub', testroot='toctree-duplicated')
+def test_duplicated_toctree_entry(app, status, warning):
+ app.builder.build_all()
+ assert 'WARNING: duplicated ToC entry found: foo.xhtml' in warning.getvalue()
+
+
+@pytest.mark.skipif('DO_EPUBCHECK' not in os.environ,
+ reason='Skipped because DO_EPUBCHECK is not set')
+@pytest.mark.sphinx('epub')
+def test_run_epubcheck(app):
+ app.build()
+
+ epubcheck = os.environ.get('EPUBCHECK_PATH', '/usr/share/java/epubcheck.jar')
+ if runnable(['java', '-version']) and os.path.exists(epubcheck):
+ try:
+ subprocess.run(['java', '-jar', epubcheck, app.outdir / 'SphinxTests.epub'],
+ capture_output=True, check=True)
+ except CalledProcessError as exc:
+ print(exc.stdout.decode('utf-8'))
+ print(exc.stderr.decode('utf-8'))
+ msg = f'epubcheck exited with return code {exc.returncode}'
+ raise AssertionError(msg) from exc
+
+
+def test_xml_name_pattern_check():
+ assert _XML_NAME_PATTERN.match('id-pub')
+ assert _XML_NAME_PATTERN.match('webpage')
+ assert not _XML_NAME_PATTERN.match('1bfda21')
+
+
+@pytest.mark.sphinx('epub', testroot='images')
+def test_copy_images(app, status, warning):
+ app.build()
+
+ images_dir = Path(app.outdir) / '_images'
+ images = {image.name for image in images_dir.rglob('*')}
+ images.discard('python-logo.png')
+ assert images == {
+ 'img.png',
+ 'rimg.png',
+ 'rimg1.png',
+ 'svgimg.svg',
+ 'testimäge.png',
+ }
diff --git a/tests/test_build_gettext.py b/tests/test_build_gettext.py
new file mode 100644
index 0000000..6d9154e
--- /dev/null
+++ b/tests/test_build_gettext.py
@@ -0,0 +1,235 @@
+"""Test the build process with gettext builder with the test root."""
+
+import gettext
+import os
+import re
+import subprocess
+import sys
+from subprocess import CalledProcessError
+
+import pytest
+
+from sphinx.builders.gettext import Catalog, MsgOrigin
+
+if sys.version_info[:2] >= (3, 11):
+ from contextlib import chdir
+else:
+ from sphinx.util.osutil import _chdir as chdir
+
+_MSGID_PATTERN = re.compile(r'msgid "(.*)"')
+
+
+def msgid_getter(msgid):
+ if m := _MSGID_PATTERN.search(msgid):
+ return m[1]
+ return None
+
+
+def test_Catalog_duplicated_message():
+ catalog = Catalog()
+ catalog.add('hello', MsgOrigin('/path/to/filename', 1))
+ catalog.add('hello', MsgOrigin('/path/to/filename', 1))
+ catalog.add('hello', MsgOrigin('/path/to/filename', 2))
+ catalog.add('hello', MsgOrigin('/path/to/yetanother', 1))
+ catalog.add('world', MsgOrigin('/path/to/filename', 1))
+
+ assert len(list(catalog)) == 2
+
+ msg1, msg2 = list(catalog)
+ assert msg1.text == 'hello'
+ assert msg1.locations == [('/path/to/filename', 1),
+ ('/path/to/filename', 2),
+ ('/path/to/yetanother', 1)]
+ assert msg2.text == 'world'
+ assert msg2.locations == [('/path/to/filename', 1)]
+
+
+@pytest.mark.sphinx('gettext', srcdir='root-gettext')
+def test_build_gettext(app):
+ # Generic build; should fail only when the builder is horribly broken.
+ app.builder.build_all()
+
+ # Do messages end up in the correct location?
+ # top-level documents end up in a message catalog
+ assert (app.outdir / 'extapi.pot').is_file()
+ # directory items are grouped into sections
+ assert (app.outdir / 'subdir.pot').is_file()
+
+ # regression test for issue #960
+ catalog = (app.outdir / 'markup.pot').read_text(encoding='utf8')
+ assert 'msgid "something, something else, something more"' in catalog
+
+
+@pytest.mark.sphinx('gettext', srcdir='root-gettext')
+def test_msgfmt(app):
+ app.builder.build_all()
+
+ (app.outdir / 'en' / 'LC_MESSAGES').mkdir(parents=True, exist_ok=True)
+ with chdir(app.outdir):
+ try:
+ args = ['msginit', '--no-translator', '-i', 'markup.pot', '--locale', 'en_US']
+ subprocess.run(args, capture_output=True, check=True)
+ except OSError:
+ pytest.skip() # most likely msginit was not found
+ except CalledProcessError as exc:
+ print(exc.stdout)
+ print(exc.stderr)
+ msg = f'msginit exited with return code {exc.returncode}'
+ raise AssertionError(msg) from exc
+
+ assert (app.outdir / 'en_US.po').is_file(), 'msginit failed'
+ try:
+ args = ['msgfmt', 'en_US.po',
+ '-o', os.path.join('en', 'LC_MESSAGES', 'test_root.mo')]
+ subprocess.run(args, capture_output=True, check=True)
+ except OSError:
+ pytest.skip() # most likely msgfmt was not found
+ except CalledProcessError as exc:
+ print(exc.stdout)
+ print(exc.stderr)
+ msg = f'msgfmt exited with return code {exc.returncode}'
+ raise AssertionError(msg) from exc
+
+ mo = app.outdir / 'en' / 'LC_MESSAGES' / 'test_root.mo'
+ assert mo.is_file(), 'msgfmt failed'
+
+ _ = gettext.translation('test_root', app.outdir, languages=['en']).gettext
+ assert _("Testing various markup") == "Testing various markup"
+
+
+@pytest.mark.sphinx(
+ 'gettext', testroot='intl', srcdir='gettext',
+ confoverrides={'gettext_compact': False})
+def test_gettext_index_entries(app):
+ # regression test for #976
+ app.builder.build(['index_entries'])
+
+ pot = (app.outdir / 'index_entries.pot').read_text(encoding='utf8')
+ msg_ids = list(filter(None, map(msgid_getter, pot.splitlines())))
+
+ assert msg_ids == [
+ "i18n with index entries",
+ "index target section",
+ "this is :index:`Newsletter` target paragraph.",
+ "various index entries",
+ "That's all.",
+ "Mailing List",
+ "Newsletter",
+ "Recipients List",
+ "First",
+ "Second",
+ "Third",
+ "Entry",
+ "See",
+ ]
+
+
+@pytest.mark.sphinx(
+ 'gettext', testroot='intl', srcdir='gettext',
+ confoverrides={'gettext_compact': False,
+ 'gettext_additional_targets': []})
+def test_gettext_disable_index_entries(app):
+ # regression test for #976
+ app.env._pickled_doctree_cache.clear() # clear cache
+ app.builder.build(['index_entries'])
+
+ pot = (app.outdir / 'index_entries.pot').read_text(encoding='utf8')
+ msg_ids = list(filter(None, map(msgid_getter, pot.splitlines())))
+
+ assert msg_ids == [
+ "i18n with index entries",
+ "index target section",
+ "this is :index:`Newsletter` target paragraph.",
+ "various index entries",
+ "That's all.",
+ ]
+
+
+@pytest.mark.sphinx('gettext', testroot='intl', srcdir='gettext')
+def test_gettext_template(app):
+ app.builder.build_all()
+
+ assert (app.outdir / 'sphinx.pot').is_file()
+
+ result = (app.outdir / 'sphinx.pot').read_text(encoding='utf8')
+ assert "Welcome" in result
+ assert "Sphinx %(version)s" in result
+
+
+@pytest.mark.sphinx('gettext', testroot='gettext-template')
+def test_gettext_template_msgid_order_in_sphinxpot(app):
+ app.builder.build_all()
+ assert (app.outdir / 'sphinx.pot').is_file()
+
+ result = (app.outdir / 'sphinx.pot').read_text(encoding='utf8')
+ assert re.search(
+ ('msgid "Template 1".*'
+ 'msgid "This is Template 1\\.".*'
+ 'msgid "Template 2".*'
+ 'msgid "This is Template 2\\.".*'),
+ result,
+ flags=re.DOTALL)
+
+
+@pytest.mark.sphinx(
+ 'gettext', srcdir='root-gettext',
+ confoverrides={'gettext_compact': 'documentation'})
+def test_build_single_pot(app):
+ app.builder.build_all()
+
+ assert (app.outdir / 'documentation.pot').is_file()
+
+ result = (app.outdir / 'documentation.pot').read_text(encoding='utf8')
+ assert re.search(
+ ('msgid "Todo".*'
+ 'msgid "Like footnotes.".*'
+ 'msgid "The minute.".*'
+ 'msgid "Generated section".*'),
+ result,
+ flags=re.DOTALL)
+
+
+@pytest.mark.sphinx(
+ 'gettext',
+ testroot='intl_substitution_definitions',
+ srcdir='gettext-subst',
+ confoverrides={'gettext_compact': False,
+ 'gettext_additional_targets': ['image']})
+def test_gettext_prolog_epilog_substitution(app):
+ app.builder.build_all()
+
+ assert (app.outdir / 'prolog_epilog_substitution.pot').is_file()
+ pot = (app.outdir / 'prolog_epilog_substitution.pot').read_text(encoding='utf8')
+ msg_ids = list(filter(None, map(msgid_getter, pot.splitlines())))
+
+ assert msg_ids == [
+ "i18n with prologue and epilogue substitutions",
+ "This is content that contains |subst_prolog_1|.",
+ "Substituted image |subst_prolog_2| here.",
+ "subst_prolog_2",
+ ".. image:: /img.png",
+ "This is content that contains |subst_epilog_1|.",
+ "Substituted image |subst_epilog_2| here.",
+ "subst_epilog_2",
+ ".. image:: /i18n.png",
+ ]
+
+
+@pytest.mark.sphinx(
+ 'gettext',
+ testroot='intl_substitution_definitions',
+ srcdir='gettext-subst',
+ confoverrides={'gettext_compact': False,
+ 'gettext_additional_targets': ['image']})
+def test_gettext_prolog_epilog_substitution_excluded(app):
+ # regression test for #9428
+ app.builder.build_all()
+
+ assert (app.outdir / 'prolog_epilog_substitution_excluded.pot').is_file()
+ pot = (app.outdir / 'prolog_epilog_substitution_excluded.pot').read_text(encoding='utf8')
+ msg_ids = list(filter(None, map(msgid_getter, pot.splitlines())))
+
+ assert msg_ids == [
+ "i18n without prologue and epilogue substitutions",
+ "This is content that does not include prologue and epilogue substitutions.",
+ ]
diff --git a/tests/test_build_html.py b/tests/test_build_html.py
new file mode 100644
index 0000000..07f101d
--- /dev/null
+++ b/tests/test_build_html.py
@@ -0,0 +1,1841 @@
+"""Test the HTML builder and check output against XPath."""
+
+import hashlib
+import os
+import posixpath
+import re
+from itertools import chain, cycle
+from pathlib import Path
+from unittest.mock import ANY, call, patch
+
+import pytest
+from html5lib import HTMLParser
+
+import sphinx.builders.html
+from sphinx.builders.html import validate_html_extra_path, validate_html_static_path
+from sphinx.builders.html._assets import _file_checksum
+from sphinx.errors import ConfigError, ThemeError
+from sphinx.testing.util import strip_escseq
+from sphinx.util.inventory import InventoryFile
+
+FIGURE_CAPTION = ".//figure/figcaption/p"
+
+
+ENV_WARNINGS = """\
+%(root)s/autodoc_fodder.py:docstring of autodoc_fodder.MarkupError:\\d+: \
+WARNING: Explicit markup ends without a blank line; unexpected unindent.
+%(root)s/index.rst:\\d+: WARNING: Encoding 'utf-8-sig' used for reading included \
+file '%(root)s/wrongenc.inc' seems to be wrong, try giving an :encoding: option
+%(root)s/index.rst:\\d+: WARNING: invalid single index entry ''
+%(root)s/index.rst:\\d+: WARNING: image file not readable: foo.png
+%(root)s/index.rst:\\d+: WARNING: download file not readable: %(root)s/nonexisting.png
+%(root)s/undecodable.rst:\\d+: WARNING: undecodable source characters, replacing \
+with "\\?": b?'here: >>>(\\\\|/)xbb<<<((\\\\|/)r)?'
+"""
+
+HTML_WARNINGS = ENV_WARNINGS + """\
+%(root)s/index.rst:\\d+: WARNING: unknown option: '&option'
+%(root)s/index.rst:\\d+: WARNING: citation not found: missing
+%(root)s/index.rst:\\d+: WARNING: a suitable image for html builder not found: foo.\\*
+%(root)s/index.rst:\\d+: WARNING: Lexing literal_block ".*" as "c" resulted in an error at token: ".*". Retrying in relaxed mode.
+"""
+
+
+etree_cache = {}
+
+
+@pytest.fixture(scope='module')
+def cached_etree_parse():
+ def parse(fname):
+ if fname in etree_cache:
+ return etree_cache[fname]
+ with (fname).open('rb') as fp:
+ etree = HTMLParser(namespaceHTMLElements=False).parse(fp)
+ etree_cache.clear()
+ etree_cache[fname] = etree
+ return etree
+ yield parse
+ etree_cache.clear()
+
+
+def flat_dict(d):
+ return chain.from_iterable(
+ [
+ zip(cycle([fname]), values)
+ for fname, values in d.items()
+ ],
+ )
+
+
+def tail_check(check):
+ rex = re.compile(check)
+
+ def checker(nodes):
+ for node in nodes:
+ if node.tail and rex.search(node.tail):
+ return True
+ msg = f'{check!r} not found in tail of any nodes {nodes}'
+ raise AssertionError(msg)
+ return checker
+
+
+def check_xpath(etree, fname, path, check, be_found=True):
+ nodes = list(etree.findall(path))
+ if check is None:
+ assert nodes == [], ('found any nodes matching xpath '
+ '%r in file %s' % (path, fname))
+ return
+ else:
+ assert nodes != [], ('did not find any node matching xpath '
+ '%r in file %s' % (path, fname))
+ if callable(check):
+ check(nodes)
+ elif not check:
+ # only check for node presence
+ pass
+ else:
+ def get_text(node):
+ if node.text is not None:
+ # the node has only one text
+ return node.text
+ else:
+ # the node has tags and text; gather texts just under the node
+ return ''.join(n.tail or '' for n in node)
+
+ rex = re.compile(check)
+ if be_found:
+ if any(rex.search(get_text(node)) for node in nodes):
+ return
+ else:
+ if all(not rex.search(get_text(node)) for node in nodes):
+ return
+
+ raise AssertionError('%r not found in any node matching '
+ 'path %s in %s: %r' % (check, path, fname,
+ [node.text for node in nodes]))
+
+
+@pytest.mark.sphinx('html', testroot='warnings')
+def test_html_warnings(app, warning):
+ app.build()
+ html_warnings = strip_escseq(re.sub(re.escape(os.sep) + '{1,2}', '/', warning.getvalue()))
+ html_warnings_exp = HTML_WARNINGS % {
+ 'root': re.escape(app.srcdir.as_posix())}
+ assert re.match(html_warnings_exp + '$', html_warnings), \
+ "Warnings don't match:\n" + \
+ '--- Expected (regex):\n' + html_warnings_exp + \
+ '--- Got:\n' + html_warnings
+
+
+def test_html4_error(make_app, tmp_path):
+ (tmp_path / 'conf.py').write_text('', encoding='utf-8')
+ with pytest.raises(
+ ConfigError,
+ match='HTML 4 is no longer supported by Sphinx',
+ ):
+ make_app(
+ buildername='html',
+ srcdir=tmp_path,
+ confoverrides={'html4_writer': True},
+ )
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'images.html': [
+ (".//img[@src='_images/img.png']", ''),
+ (".//img[@src='_images/img1.png']", ''),
+ (".//img[@src='_images/simg.png']", ''),
+ (".//img[@src='_images/svgimg.svg']", ''),
+ (".//a[@href='_sources/images.txt']", ''),
+ ],
+ 'subdir/images.html': [
+ (".//img[@src='../_images/img1.png']", ''),
+ (".//img[@src='../_images/rimg.png']", ''),
+ ],
+ 'subdir/includes.html': [
+ (".//a[@class='reference download internal']", ''),
+ (".//img[@src='../_images/img.png']", ''),
+ (".//p", 'This is an include file.'),
+ (".//pre/span", 'line 1'),
+ (".//pre/span", 'line 2'),
+ ],
+ 'includes.html': [
+ (".//pre", 'Max Strauß'),
+ (".//a[@class='reference download internal']", ''),
+ (".//pre/span", '"quotes"'),
+ (".//pre/span", "'included'"),
+ (".//pre/span[@class='s2']", 'üöä'),
+ (".//div[@class='inc-pyobj1 highlight-text notranslate']//pre",
+ r'^class Foo:\n pass\n\s*$'),
+ (".//div[@class='inc-pyobj2 highlight-text notranslate']//pre",
+ r'^ def baz\(\):\n pass\n\s*$'),
+ (".//div[@class='inc-lines highlight-text notranslate']//pre",
+ r'^class Foo:\n pass\nclass Bar:\n$'),
+ (".//div[@class='inc-startend highlight-text notranslate']//pre",
+ '^foo = "Including Unicode characters: üöä"\\n$'),
+ (".//div[@class='inc-preappend highlight-text notranslate']//pre",
+ r'(?m)^START CODE$'),
+ (".//div[@class='inc-pyobj-dedent highlight-python notranslate']//span",
+ r'def'),
+ (".//div[@class='inc-tab3 highlight-text notranslate']//pre",
+ r'-| |-'),
+ (".//div[@class='inc-tab8 highlight-python notranslate']//pre/span",
+ r'-| |-'),
+ ],
+ 'autodoc.html': [
+ (".//dl[@class='py class']/dt[@id='autodoc_target.Class']", ''),
+ (".//dl[@class='py function']/dt[@id='autodoc_target.function']/em/span/span", r'\*\*'),
+ (".//dl[@class='py function']/dt[@id='autodoc_target.function']/em/span/span", r'kwds'),
+ (".//dd/p", r'Return spam\.'),
+ ],
+ 'extapi.html': [
+ (".//strong", 'from class: Bar'),
+ ],
+ 'markup.html': [
+ (".//title", 'set by title directive'),
+ (".//p/em", 'Section author: Georg Brandl'),
+ (".//p/em", 'Module author: Georg Brandl'),
+ # created by the meta directive
+ (".//meta[@name='author'][@content='Me']", ''),
+ (".//meta[@name='keywords'][@content='docs, sphinx']", ''),
+ # a label created by ``.. _label:``
+ (".//div[@id='label']", ''),
+ # code with standard code blocks
+ (".//pre", '^some code$'),
+ # an option list
+ (".//span[@class='option']", '--help'),
+ # admonitions
+ (".//p[@class='admonition-title']", 'My Admonition'),
+ (".//div[@class='admonition note']/p", 'Note text.'),
+ (".//div[@class='admonition warning']/p", 'Warning text.'),
+ # inline markup
+ (".//li/p/strong", r'^command\\n$'),
+ (".//li/p/strong", r'^program\\n$'),
+ (".//li/p/em", r'^dfn\\n$'),
+ (".//li/p/kbd", r'^kbd\\n$'),
+ (".//li/p/span", 'File \N{TRIANGULAR BULLET} Close'),
+ (".//li/p/code/span[@class='pre']", '^a/$'),
+ (".//li/p/code/em/span[@class='pre']", '^varpart$'),
+ (".//li/p/code/em/span[@class='pre']", '^i$'),
+ (".//a[@href='https://peps.python.org/pep-0008/']"
+ "[@class='pep reference external']/strong", 'PEP 8'),
+ (".//a[@href='https://peps.python.org/pep-0008/']"
+ "[@class='pep reference external']/strong",
+ 'Python Enhancement Proposal #8'),
+ (".//a[@href='https://datatracker.ietf.org/doc/html/rfc1.html']"
+ "[@class='rfc reference external']/strong", 'RFC 1'),
+ (".//a[@href='https://datatracker.ietf.org/doc/html/rfc1.html']"
+ "[@class='rfc reference external']/strong", 'Request for Comments #1'),
+ (".//a[@href='objects.html#envvar-HOME']"
+ "[@class='reference internal']/code/span[@class='pre']", 'HOME'),
+ (".//a[@href='#with']"
+ "[@class='reference internal']/code/span[@class='pre']", '^with$'),
+ (".//a[@href='#grammar-token-try_stmt']"
+ "[@class='reference internal']/code/span", '^statement$'),
+ (".//a[@href='#some-label'][@class='reference internal']/span", '^here$'),
+ (".//a[@href='#some-label'][@class='reference internal']/span", '^there$'),
+ (".//a[@href='subdir/includes.html']"
+ "[@class='reference internal']/span", 'Including in subdir'),
+ (".//a[@href='objects.html#cmdoption-python-c']"
+ "[@class='reference internal']/code/span[@class='pre']", '-c'),
+ # abbreviations
+ (".//abbr[@title='abbreviation']", '^abbr$'),
+ # version stuff
+ (".//div[@class='versionadded']/p/span", 'New in version 0.6: '),
+ (".//div[@class='versionadded']/p/span",
+ tail_check('First paragraph of versionadded')),
+ (".//div[@class='versionchanged']/p/span",
+ tail_check('First paragraph of versionchanged')),
+ (".//div[@class='versionchanged']/p",
+ 'Second paragraph of versionchanged'),
+ # footnote reference
+ (".//a[@class='footnote-reference brackets']", r'1'),
+ # created by reference lookup
+ (".//a[@href='index.html#ref1']", ''),
+ # ``seealso`` directive
+ (".//div/p[@class='admonition-title']", 'See also'),
+ # a ``hlist`` directive
+ (".//table[@class='hlist']/tbody/tr/td/ul/li/p", '^This$'),
+ # a ``centered`` directive
+ (".//p[@class='centered']/strong", 'LICENSE'),
+ # a glossary
+ (".//dl/dt[@id='term-boson']", 'boson'),
+ (".//dl/dt[@id='term-boson']/a", '¶'),
+ # a production list
+ (".//pre/strong", 'try_stmt'),
+ (".//pre/a[@href='#grammar-token-try1_stmt']/code/span", 'try1_stmt'),
+ # tests for ``only`` directive
+ (".//p", 'A global substitution!'),
+ (".//p", 'In HTML.'),
+ (".//p", 'In both.'),
+ (".//p", 'Always present'),
+ # tests for ``any`` role
+ (".//a[@href='#with']/span", 'headings'),
+ (".//a[@href='objects.html#func_without_body']/code/span", 'objects'),
+ # tests for numeric labels
+ (".//a[@href='#id1'][@class='reference internal']/span", 'Testing various markup'),
+ # tests for smartypants
+ (".//li/p", 'Smart “quotes†in English ‘text’.'),
+ (".//li/p", 'Smart — long and – short dashes.'),
+ (".//li/p", 'Ellipsis…'),
+ (".//li/p/code/span[@class='pre']", 'foo--"bar"...'),
+ (".//p", 'Этот «абзац» должен иÑпользовать „руÑÑкие“ кавычки.'),
+ (".//p", 'Il dit : « C’est “super†! »'),
+ ],
+ 'objects.html': [
+ (".//dt[@id='mod.Cls.meth1']", ''),
+ (".//dt[@id='errmod.Error']", ''),
+ (".//dt/span[@class='sig-name descname']/span[@class='pre']", r'long\(parameter,'),
+ (".//dt/span[@class='sig-name descname']/span[@class='pre']", r'list\)'),
+ (".//dt/span[@class='sig-name descname']/span[@class='pre']", 'another'),
+ (".//dt/span[@class='sig-name descname']/span[@class='pre']", 'one'),
+ (".//a[@href='#mod.Cls'][@class='reference internal']", ''),
+ (".//dl[@class='std userdesc']", ''),
+ (".//dt[@id='userdesc-myobj']", ''),
+ (".//a[@href='#userdesc-myobj'][@class='reference internal']", ''),
+ # docfields
+ (".//a[@class='reference internal'][@href='#TimeInt']/em", 'TimeInt'),
+ (".//a[@class='reference internal'][@href='#Time']", 'Time'),
+ (".//a[@class='reference internal'][@href='#errmod.Error']/strong", 'Error'),
+ # C references
+ (".//span[@class='pre']", 'CFunction()'),
+ (".//a[@href='#c.Sphinx_DoSomething']", ''),
+ (".//a[@href='#c.SphinxStruct.member']", ''),
+ (".//a[@href='#c.SPHINX_USE_PYTHON']", ''),
+ (".//a[@href='#c.SphinxType']", ''),
+ (".//a[@href='#c.sphinx_global']", ''),
+ # test global TOC created by toctree()
+ (".//ul[@class='current']/li[@class='toctree-l1 current']/a[@href='#']",
+ 'Testing object descriptions'),
+ (".//li[@class='toctree-l1']/a[@href='markup.html']",
+ 'Testing various markup'),
+ # test unknown field names
+ (".//dt[@class='field-odd']", 'Field_name'),
+ (".//dt[@class='field-even']", 'Field_name all lower'),
+ (".//dt[@class='field-odd']", 'FIELD_NAME'),
+ (".//dt[@class='field-even']", 'FIELD_NAME ALL CAPS'),
+ (".//dt[@class='field-odd']", 'Field_Name'),
+ (".//dt[@class='field-even']", 'Field_Name All Word Caps'),
+ (".//dt[@class='field-odd']", 'Field_name'),
+ (".//dt[@class='field-even']", 'Field_name First word cap'),
+ (".//dt[@class='field-odd']", 'FIELd_name'),
+ (".//dt[@class='field-even']", 'FIELd_name PARTial caps'),
+ # custom sidebar
+ (".//h4", 'Custom sidebar'),
+ # docfields
+ (".//dd[@class='field-odd']/p/strong", '^moo$'),
+ (".//dd[@class='field-odd']/p/strong", tail_check(r'\(Moo\) .* Moo')),
+ (".//dd[@class='field-odd']/ul/li/p/strong", '^hour$'),
+ (".//dd[@class='field-odd']/ul/li/p/em", '^DuplicateType$'),
+ (".//dd[@class='field-odd']/ul/li/p/em", tail_check(r'.* Some parameter')),
+ # others
+ (".//a[@class='reference internal'][@href='#cmdoption-perl-arg-p']/code/span",
+ 'perl'),
+ (".//a[@class='reference internal'][@href='#cmdoption-perl-arg-p']/code/span",
+ '\\+p'),
+ (".//a[@class='reference internal'][@href='#cmdoption-perl-ObjC']/code/span",
+ '--ObjC\\+\\+'),
+ (".//a[@class='reference internal'][@href='#cmdoption-perl-plugin.option']/code/span",
+ '--plugin.option'),
+ (".//a[@class='reference internal'][@href='#cmdoption-perl-arg-create-auth-token']"
+ "/code/span",
+ 'create-auth-token'),
+ (".//a[@class='reference internal'][@href='#cmdoption-perl-arg-arg']/code/span",
+ 'arg'),
+ (".//a[@class='reference internal'][@href='#cmdoption-perl-j']/code/span",
+ '-j'),
+ (".//a[@class='reference internal'][@href='#cmdoption-hg-arg-commit']/code/span",
+ 'hg'),
+ (".//a[@class='reference internal'][@href='#cmdoption-hg-arg-commit']/code/span",
+ 'commit'),
+ (".//a[@class='reference internal'][@href='#cmdoption-git-commit-p']/code/span",
+ 'git'),
+ (".//a[@class='reference internal'][@href='#cmdoption-git-commit-p']/code/span",
+ 'commit'),
+ (".//a[@class='reference internal'][@href='#cmdoption-git-commit-p']/code/span",
+ '-p'),
+ ],
+ 'index.html': [
+ (".//meta[@name='hc'][@content='hcval']", ''),
+ (".//meta[@name='hc_co'][@content='hcval_co']", ''),
+ (".//li[@class='toctree-l1']/a", 'Testing various markup'),
+ (".//li[@class='toctree-l2']/a", 'Inline markup'),
+ (".//title", 'Sphinx <Tests>'),
+ (".//div[@class='footer']", 'copyright text credits'),
+ (".//a[@href='http://python.org/']"
+ "[@class='reference external']", ''),
+ (".//li/p/a[@href='genindex.html']/span", 'Index'),
+ (".//li/p/a[@href='py-modindex.html']/span", 'Module Index'),
+ # custom sidebar only for contents
+ (".//h4", 'Contents sidebar'),
+ # custom JavaScript
+ (".//script[@src='file://moo.js']", ''),
+ # URL in contents
+ (".//a[@class='reference external'][@href='http://sphinx-doc.org/']",
+ 'http://sphinx-doc.org/'),
+ (".//a[@class='reference external'][@href='http://sphinx-doc.org/latest/']",
+ 'Latest reference'),
+ # Indirect hyperlink targets across files
+ (".//a[@href='markup.html#some-label'][@class='reference internal']/span",
+ '^indirect hyperref$'),
+ ],
+ 'bom.html': [
+ (".//title", " File with UTF-8 BOM"),
+ ],
+ 'extensions.html': [
+ (".//a[@href='http://python.org/dev/']", "http://python.org/dev/"),
+ (".//a[@href='http://bugs.python.org/issue1000']", "issue 1000"),
+ (".//a[@href='http://bugs.python.org/issue1042']", "explicit caption"),
+ ],
+ 'genindex.html': [
+ # index entries
+ (".//a/strong", "Main"),
+ (".//a/strong", "[1]"),
+ (".//a/strong", "Other"),
+ (".//a", "entry"),
+ (".//li/a", "double"),
+ ],
+ 'otherext.html': [
+ (".//h1", "Generated section"),
+ (".//a[@href='_sources/otherext.foo.txt']", ''),
+ ],
+}))
+@pytest.mark.sphinx('html', tags=['testtag'],
+ confoverrides={'html_context.hckey_co': 'hcval_co'})
+@pytest.mark.test_params(shared_result='test_build_html_output')
+def test_html5_output(app, cached_etree_parse, fname, expect):
+ app.build()
+ print(app.outdir / fname)
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (".//div[@class='citation']/span", r'Ref1'),
+ (".//div[@class='citation']/span", r'Ref_1'),
+ ],
+ 'footnote.html': [
+ (".//a[@class='footnote-reference brackets'][@href='#id9'][@id='id1']", r"1"),
+ (".//a[@class='footnote-reference brackets'][@href='#id10'][@id='id2']", r"2"),
+ (".//a[@class='footnote-reference brackets'][@href='#foo'][@id='id3']", r"3"),
+ (".//a[@class='reference internal'][@href='#bar'][@id='id4']/span", r"\[bar\]"),
+ (".//a[@class='reference internal'][@href='#baz-qux'][@id='id5']/span", r"\[baz_qux\]"),
+ (".//a[@class='footnote-reference brackets'][@href='#id11'][@id='id6']", r"4"),
+ (".//a[@class='footnote-reference brackets'][@href='#id12'][@id='id7']", r"5"),
+ (".//aside[@class='footnote brackets']/span/a[@href='#id1']", r"1"),
+ (".//aside[@class='footnote brackets']/span/a[@href='#id2']", r"2"),
+ (".//aside[@class='footnote brackets']/span/a[@href='#id3']", r"3"),
+ (".//div[@class='citation']/span/a[@href='#id4']", r"bar"),
+ (".//div[@class='citation']/span/a[@href='#id5']", r"baz_qux"),
+ (".//aside[@class='footnote brackets']/span/a[@href='#id6']", r"4"),
+ (".//aside[@class='footnote brackets']/span/a[@href='#id7']", r"5"),
+ (".//aside[@class='footnote brackets']/span/a[@href='#id8']", r"6"),
+ ],
+}))
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_build_html_output_docutils18')
+def test_docutils_output(app, cached_etree_parse, fname, expect):
+ app.build()
+ print(app.outdir / fname)
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', parallel=2)
+def test_html_parallel(app):
+ app.build()
+
+
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_build_html_output')
+def test_html_download(app):
+ app.build()
+
+ # subdir/includes.html
+ result = (app.outdir / 'subdir' / 'includes.html').read_text(encoding='utf8')
+ pattern = ('<a class="reference download internal" download="" '
+ 'href="../(_downloads/.*/img.png)">')
+ matched = re.search(pattern, result)
+ assert matched
+ assert (app.outdir / matched.group(1)).exists()
+ filename = matched.group(1)
+
+ # includes.html
+ result = (app.outdir / 'includes.html').read_text(encoding='utf8')
+ pattern = ('<a class="reference download internal" download="" '
+ 'href="(_downloads/.*/img.png)">')
+ matched = re.search(pattern, result)
+ assert matched
+ assert (app.outdir / matched.group(1)).exists()
+ assert matched.group(1) == filename
+
+ pattern = ('<a class="reference download internal" download="" '
+ 'href="(_downloads/.*/)(file_with_special_%23_chars.xyz)">')
+ matched = re.search(pattern, result)
+ assert matched
+ assert (app.outdir / matched.group(1) / "file_with_special_#_chars.xyz").exists()
+
+
+@pytest.mark.sphinx('html', testroot='roles-download')
+def test_html_download_role(app, status, warning):
+ app.build()
+ digest = hashlib.md5(b'dummy.dat', usedforsecurity=False).hexdigest()
+ assert (app.outdir / '_downloads' / digest / 'dummy.dat').exists()
+ digest_another = hashlib.md5(b'another/dummy.dat', usedforsecurity=False).hexdigest()
+ assert (app.outdir / '_downloads' / digest_another / 'dummy.dat').exists()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert (('<li><p><a class="reference download internal" download="" '
+ 'href="_downloads/%s/dummy.dat">'
+ '<code class="xref download docutils literal notranslate">'
+ '<span class="pre">dummy.dat</span></code></a></p></li>' % digest)
+ in content)
+ assert (('<li><p><a class="reference download internal" download="" '
+ 'href="_downloads/%s/dummy.dat">'
+ '<code class="xref download docutils literal notranslate">'
+ '<span class="pre">another/dummy.dat</span></code></a></p></li>' %
+ digest_another) in content)
+ assert ('<li><p><code class="xref download docutils literal notranslate">'
+ '<span class="pre">not_found.dat</span></code></p></li>' in content)
+ assert ('<li><p><a class="reference download external" download="" '
+ 'href="http://www.sphinx-doc.org/en/master/_static/sphinxheader.png">'
+ '<code class="xref download docutils literal notranslate">'
+ '<span class="pre">Sphinx</span> <span class="pre">logo</span>'
+ '</code></a></p></li>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='build-html-translator')
+def test_html_translator(app):
+ app.build()
+ assert app.builder.docwriter.visitor.depart_with_node == 10
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (".//li[@class='toctree-l3']/a", '1.1.1. Foo A1', True),
+ (".//li[@class='toctree-l3']/a", '1.2.1. Foo B1', True),
+ (".//li[@class='toctree-l3']/a", '2.1.1. Bar A1', False),
+ (".//li[@class='toctree-l3']/a", '2.2.1. Bar B1', False),
+ ],
+ 'foo.html': [
+ (".//h1", 'Foo', True),
+ (".//h2", 'Foo A', True),
+ (".//h3", 'Foo A1', True),
+ (".//h2", 'Foo B', True),
+ (".//h3", 'Foo B1', True),
+
+ (".//h1//span[@class='section-number']", '1. ', True),
+ (".//h2//span[@class='section-number']", '1.1. ', True),
+ (".//h3//span[@class='section-number']", '1.1.1. ', True),
+ (".//h2//span[@class='section-number']", '1.2. ', True),
+ (".//h3//span[@class='section-number']", '1.2.1. ', True),
+
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '1.1. Foo A', True),
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '1.1.1. Foo A1', True),
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '1.2. Foo B', True),
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '1.2.1. Foo B1', True),
+ ],
+ 'bar.html': [
+ (".//h1", 'Bar', True),
+ (".//h2", 'Bar A', True),
+ (".//h2", 'Bar B', True),
+ (".//h3", 'Bar B1', True),
+ (".//h1//span[@class='section-number']", '2. ', True),
+ (".//h2//span[@class='section-number']", '2.1. ', True),
+ (".//h2//span[@class='section-number']", '2.2. ', True),
+ (".//h3//span[@class='section-number']", '2.2.1. ', True),
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '2. Bar', True),
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '2.1. Bar A', True),
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '2.2. Bar B', True),
+ (".//div[@class='sphinxsidebarwrapper']//li/a", '2.2.1. Bar B1', False),
+ ],
+ 'baz.html': [
+ (".//h1", 'Baz A', True),
+ (".//h1//span[@class='section-number']", '2.1.1. ', True),
+ ],
+}))
+@pytest.mark.sphinx('html', testroot='tocdepth')
+@pytest.mark.test_params(shared_result='test_build_html_tocdepth')
+def test_tocdepth(app, cached_etree_parse, fname, expect):
+ app.build()
+ # issue #1251
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (".//li[@class='toctree-l3']/a", '1.1.1. Foo A1', True),
+ (".//li[@class='toctree-l3']/a", '1.2.1. Foo B1', True),
+ (".//li[@class='toctree-l3']/a", '2.1.1. Bar A1', False),
+ (".//li[@class='toctree-l3']/a", '2.2.1. Bar B1', False),
+
+ # index.rst
+ (".//h1", 'test-tocdepth', True),
+
+ # foo.rst
+ (".//h2", 'Foo', True),
+ (".//h3", 'Foo A', True),
+ (".//h4", 'Foo A1', True),
+ (".//h3", 'Foo B', True),
+ (".//h4", 'Foo B1', True),
+ (".//h2//span[@class='section-number']", '1. ', True),
+ (".//h3//span[@class='section-number']", '1.1. ', True),
+ (".//h4//span[@class='section-number']", '1.1.1. ', True),
+ (".//h3//span[@class='section-number']", '1.2. ', True),
+ (".//h4//span[@class='section-number']", '1.2.1. ', True),
+
+ # bar.rst
+ (".//h2", 'Bar', True),
+ (".//h3", 'Bar A', True),
+ (".//h3", 'Bar B', True),
+ (".//h4", 'Bar B1', True),
+ (".//h2//span[@class='section-number']", '2. ', True),
+ (".//h3//span[@class='section-number']", '2.1. ', True),
+ (".//h3//span[@class='section-number']", '2.2. ', True),
+ (".//h4//span[@class='section-number']", '2.2.1. ', True),
+
+ # baz.rst
+ (".//h4", 'Baz A', True),
+ (".//h4//span[@class='section-number']", '2.1.1. ', True),
+ ],
+}))
+@pytest.mark.sphinx('singlehtml', testroot='tocdepth')
+@pytest.mark.test_params(shared_result='test_build_html_tocdepth')
+def test_tocdepth_singlehtml(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', testroot='numfig')
+@pytest.mark.test_params(shared_result='test_build_html_numfig')
+def test_numfig_disabled_warn(app, warning):
+ app.build()
+ warnings = warning.getvalue()
+ assert 'index.rst:47: WARNING: numfig is disabled. :numref: is ignored.' in warnings
+ assert 'index.rst:56: WARNING: invalid numfig_format: invalid' not in warnings
+ assert 'index.rst:57: WARNING: invalid numfig_format: Fig %s %s' not in warnings
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", None, True),
+ (".//table/caption/span[@class='caption-number']", None, True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", None, True),
+ (".//li/p/code/span", '^fig1$', True),
+ (".//li/p/code/span", '^Figure%s$', True),
+ (".//li/p/code/span", '^table-1$', True),
+ (".//li/p/code/span", '^Table:%s$', True),
+ (".//li/p/code/span", '^CODE_1$', True),
+ (".//li/p/code/span", '^Code-%s$', True),
+ (".//li/p/a/span", '^Section 1$', True),
+ (".//li/p/a/span", '^Section 2.1$', True),
+ (".//li/p/code/span", '^Fig.{number}$', True),
+ (".//li/p/a/span", '^Sect.1 Foo$', True),
+ ],
+ 'foo.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", None, True),
+ (".//table/caption/span[@class='caption-number']", None, True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", None, True),
+ ],
+ 'bar.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", None, True),
+ (".//table/caption/span[@class='caption-number']", None, True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", None, True),
+ ],
+ 'baz.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", None, True),
+ (".//table/caption/span[@class='caption-number']", None, True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", None, True),
+ ],
+}))
+@pytest.mark.sphinx('html', testroot='numfig')
+@pytest.mark.test_params(shared_result='test_build_html_numfig')
+def test_numfig_disabled(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx(
+ 'html', testroot='numfig',
+ srcdir='test_numfig_without_numbered_toctree_warn',
+ confoverrides={'numfig': True})
+def test_numfig_without_numbered_toctree_warn(app, warning):
+ app.build()
+ # remove :numbered: option
+ index = (app.srcdir / 'index.rst').read_text(encoding='utf8')
+ index = re.sub(':numbered:.*', '', index)
+ (app.srcdir / 'index.rst').write_text(index, encoding='utf8')
+ app.build()
+
+ warnings = warning.getvalue()
+ assert 'index.rst:47: WARNING: numfig is disabled. :numref: is ignored.' not in warnings
+ assert 'index.rst:55: WARNING: Failed to create a cross reference. Any number is not assigned: index' in warnings
+ assert 'index.rst:56: WARNING: invalid numfig_format: invalid' in warnings
+ assert 'index.rst:57: WARNING: invalid numfig_format: Fig %s %s' in warnings
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 9 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 10 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 9 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 10 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 9 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 10 $', True),
+ (".//li/p/a/span", '^Fig. 9$', True),
+ (".//li/p/a/span", '^Figure6$', True),
+ (".//li/p/a/span", '^Table 9$', True),
+ (".//li/p/a/span", '^Table:6$', True),
+ (".//li/p/a/span", '^Listing 9$', True),
+ (".//li/p/a/span", '^Code-6$', True),
+ (".//li/p/code/span", '^foo$', True),
+ (".//li/p/code/span", '^bar_a$', True),
+ (".//li/p/a/span", '^Fig.9 should be Fig.1$', True),
+ (".//li/p/code/span", '^Sect.{number}$', True),
+ ],
+ 'foo.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 4 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 4 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 4 $', True),
+ ],
+ 'bar.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 5 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 7 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 8 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 5 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 7 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 8 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 5 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 7 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 8 $', True),
+ ],
+ 'baz.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 6 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 6 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 6 $', True),
+ ],
+}))
+@pytest.mark.sphinx(
+ 'html', testroot='numfig',
+ srcdir='test_numfig_without_numbered_toctree',
+ confoverrides={'numfig': True})
+def test_numfig_without_numbered_toctree(app, cached_etree_parse, fname, expect):
+ # remove :numbered: option
+ index = (app.srcdir / 'index.rst').read_text(encoding='utf8')
+ index = re.sub(':numbered:.*', '', index)
+ (app.srcdir / 'index.rst').write_text(index, encoding='utf8')
+
+ if not os.listdir(app.outdir):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', testroot='numfig', confoverrides={'numfig': True})
+@pytest.mark.test_params(shared_result='test_build_html_numfig_on')
+def test_numfig_with_numbered_toctree_warn(app, warning):
+ app.build()
+ warnings = warning.getvalue()
+ assert 'index.rst:47: WARNING: numfig is disabled. :numref: is ignored.' not in warnings
+ assert 'index.rst:55: WARNING: Failed to create a cross reference. Any number is not assigned: index' in warnings
+ assert 'index.rst:56: WARNING: invalid numfig_format: invalid' in warnings
+ assert 'index.rst:57: WARNING: invalid numfig_format: Fig %s %s' in warnings
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2 $', True),
+ (".//li/p/a/span", '^Fig. 1$', True),
+ (".//li/p/a/span", '^Figure2.2$', True),
+ (".//li/p/a/span", '^Table 1$', True),
+ (".//li/p/a/span", '^Table:2.2$', True),
+ (".//li/p/a/span", '^Listing 1$', True),
+ (".//li/p/a/span", '^Code-2.2$', True),
+ (".//li/p/a/span", '^Section.1$', True),
+ (".//li/p/a/span", '^Section.2.1$', True),
+ (".//li/p/a/span", '^Fig.1 should be Fig.1$', True),
+ (".//li/p/a/span", '^Sect.1 Foo$', True),
+ ],
+ 'foo.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.2 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.4 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.4 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.4 $', True),
+ ],
+ 'bar.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.4 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.4 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.4 $', True),
+ ],
+ 'baz.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.2 $', True),
+ ],
+}))
+@pytest.mark.sphinx('html', testroot='numfig', confoverrides={'numfig': True})
+@pytest.mark.test_params(shared_result='test_build_html_numfig_on')
+def test_numfig_with_numbered_toctree(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', testroot='numfig', confoverrides={
+ 'numfig': True,
+ 'numfig_format': {'figure': 'Figure:%s',
+ 'table': 'Tab_%s',
+ 'code-block': 'Code-%s',
+ 'section': 'SECTION-%s'}})
+@pytest.mark.test_params(shared_result='test_build_html_numfig_format_warn')
+def test_numfig_with_prefix_warn(app, warning):
+ app.build()
+ warnings = warning.getvalue()
+ assert 'index.rst:47: WARNING: numfig is disabled. :numref: is ignored.' not in warnings
+ assert 'index.rst:55: WARNING: Failed to create a cross reference. Any number is not assigned: index' in warnings
+ assert 'index.rst:56: WARNING: invalid numfig_format: invalid' in warnings
+ assert 'index.rst:57: WARNING: invalid numfig_format: Fig %s %s' in warnings
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-2 $', True),
+ (".//li/p/a/span", '^Figure:1$', True),
+ (".//li/p/a/span", '^Figure2.2$', True),
+ (".//li/p/a/span", '^Tab_1$', True),
+ (".//li/p/a/span", '^Table:2.2$', True),
+ (".//li/p/a/span", '^Code-1$', True),
+ (".//li/p/a/span", '^Code-2.2$', True),
+ (".//li/p/a/span", '^SECTION-1$', True),
+ (".//li/p/a/span", '^SECTION-2.1$', True),
+ (".//li/p/a/span", '^Fig.1 should be Fig.1$', True),
+ (".//li/p/a/span", '^Sect.1 Foo$', True),
+ ],
+ 'foo.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:1.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:1.2 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:1.3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:1.4 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_1.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_1.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_1.3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_1.4 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-1.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-1.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-1.3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-1.4 $', True),
+ ],
+ 'bar.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:2.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:2.3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:2.4 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_2.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_2.3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_2.4 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-2.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-2.3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-2.4 $', True),
+ ],
+ 'baz.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Figure:2.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Tab_2.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Code-2.2 $', True),
+ ],
+}))
+@pytest.mark.sphinx('html', testroot='numfig',
+ confoverrides={'numfig': True,
+ 'numfig_format': {'figure': 'Figure:%s',
+ 'table': 'Tab_%s',
+ 'code-block': 'Code-%s',
+ 'section': 'SECTION-%s'}})
+@pytest.mark.test_params(shared_result='test_build_html_numfig_format_warn')
+def test_numfig_with_prefix(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', testroot='numfig',
+ confoverrides={'numfig': True, 'numfig_secnum_depth': 2})
+@pytest.mark.test_params(shared_result='test_build_html_numfig_depth_2')
+def test_numfig_with_secnum_depth_warn(app, warning):
+ app.build()
+ warnings = warning.getvalue()
+ assert 'index.rst:47: WARNING: numfig is disabled. :numref: is ignored.' not in warnings
+ assert 'index.rst:55: WARNING: Failed to create a cross reference. Any number is not assigned: index' in warnings
+ assert 'index.rst:56: WARNING: invalid numfig_format: invalid' in warnings
+ assert 'index.rst:57: WARNING: invalid numfig_format: Fig %s %s' in warnings
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2 $', True),
+ (".//li/p/a/span", '^Fig. 1$', True),
+ (".//li/p/a/span", '^Figure2.1.2$', True),
+ (".//li/p/a/span", '^Table 1$', True),
+ (".//li/p/a/span", '^Table:2.1.2$', True),
+ (".//li/p/a/span", '^Listing 1$', True),
+ (".//li/p/a/span", '^Code-2.1.2$', True),
+ (".//li/p/a/span", '^Section.1$', True),
+ (".//li/p/a/span", '^Section.2.1$', True),
+ (".//li/p/a/span", '^Fig.1 should be Fig.1$', True),
+ (".//li/p/a/span", '^Sect.1 Foo$', True),
+ ],
+ 'foo.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.1.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.1.2 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.2.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.1.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.1.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.2.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.1.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.1.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.2.1 $', True),
+ ],
+ 'bar.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.1.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.1.3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.2.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.1.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.1.3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.2.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.1.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.1.3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.2.1 $', True),
+ ],
+ 'baz.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.1.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.1.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.1.2 $', True),
+ ],
+}))
+@pytest.mark.sphinx('html', testroot='numfig',
+ confoverrides={'numfig': True,
+ 'numfig_secnum_depth': 2})
+@pytest.mark.test_params(shared_result='test_build_html_numfig_depth_2')
+def test_numfig_with_secnum_depth(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2 $', True),
+ (".//li/p/a/span", '^Fig. 1$', True),
+ (".//li/p/a/span", '^Figure2.2$', True),
+ (".//li/p/a/span", '^Table 1$', True),
+ (".//li/p/a/span", '^Table:2.2$', True),
+ (".//li/p/a/span", '^Listing 1$', True),
+ (".//li/p/a/span", '^Code-2.2$', True),
+ (".//li/p/a/span", '^Section.1$', True),
+ (".//li/p/a/span", '^Section.2.1$', True),
+ (".//li/p/a/span", '^Fig.1 should be Fig.1$', True),
+ (".//li/p/a/span", '^Sect.1 Foo$', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.2 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 1.4 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 1.4 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 1.4 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.1 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.3 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.4 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.1 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.3 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.4 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.1 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.3 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.4 $', True),
+ (FIGURE_CAPTION + "/span[@class='caption-number']", '^Fig. 2.2 $', True),
+ (".//table/caption/span[@class='caption-number']",
+ '^Table 2.2 $', True),
+ (".//div[@class='code-block-caption']/"
+ "span[@class='caption-number']", '^Listing 2.2 $', True),
+ ],
+}))
+@pytest.mark.sphinx('singlehtml', testroot='numfig', confoverrides={'numfig': True})
+@pytest.mark.test_params(shared_result='test_build_html_numfig_on')
+def test_numfig_with_singlehtml(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (FIGURE_CAPTION + "//span[@class='caption-number']", "Fig. 1", True),
+ (FIGURE_CAPTION + "//span[@class='caption-number']", "Fig. 2", True),
+ (FIGURE_CAPTION + "//span[@class='caption-number']", "Fig. 3", True),
+ (".//div//span[@class='caption-number']", "No.1 ", True),
+ (".//div//span[@class='caption-number']", "No.2 ", True),
+ (".//li/p/a/span", 'Fig. 1', True),
+ (".//li/p/a/span", 'Fig. 2', True),
+ (".//li/p/a/span", 'Fig. 3', True),
+ (".//li/p/a/span", 'No.1', True),
+ (".//li/p/a/span", 'No.2', True),
+ ],
+}))
+@pytest.mark.sphinx('html', testroot='add_enumerable_node',
+ srcdir='test_enumerable_node')
+def test_enumerable_node(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', testroot='html_assets')
+def test_html_assets(app):
+ app.builder.build_all()
+
+ # exclude_path and its family
+ assert not (app.outdir / 'static' / 'index.html').exists()
+ assert not (app.outdir / 'extra' / 'index.html').exists()
+
+ # html_static_path
+ assert not (app.outdir / '_static' / '.htaccess').exists()
+ assert not (app.outdir / '_static' / '.htpasswd').exists()
+ assert (app.outdir / '_static' / 'API.html').exists()
+ assert (app.outdir / '_static' / 'API.html').read_text(encoding='utf8') == 'Sphinx-1.4.4'
+ assert (app.outdir / '_static' / 'css' / 'style.css').exists()
+ assert (app.outdir / '_static' / 'js' / 'custom.js').exists()
+ assert (app.outdir / '_static' / 'rimg.png').exists()
+ assert not (app.outdir / '_static' / '_build' / 'index.html').exists()
+ assert (app.outdir / '_static' / 'background.png').exists()
+ assert not (app.outdir / '_static' / 'subdir' / '.htaccess').exists()
+ assert not (app.outdir / '_static' / 'subdir' / '.htpasswd').exists()
+
+ # html_extra_path
+ assert (app.outdir / '.htaccess').exists()
+ assert not (app.outdir / '.htpasswd').exists()
+ assert (app.outdir / 'API.html_t').exists()
+ assert (app.outdir / 'css/style.css').exists()
+ assert (app.outdir / 'rimg.png').exists()
+ assert not (app.outdir / '_build' / 'index.html').exists()
+ assert (app.outdir / 'background.png').exists()
+ assert (app.outdir / 'subdir' / '.htaccess').exists()
+ assert not (app.outdir / 'subdir' / '.htpasswd').exists()
+
+ # html_css_files
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<link rel="stylesheet" type="text/css" href="_static/css/style.css" />' in content
+ assert ('<link media="print" rel="stylesheet" title="title" type="text/css" '
+ 'href="https://example.com/custom.css" />' in content)
+
+ # html_js_files
+ assert '<script src="_static/js/custom.js"></script>' in content
+ assert ('<script async="async" src="https://example.com/script.js">'
+ '</script>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='html_assets')
+def test_assets_order(app, monkeypatch):
+ monkeypatch.setattr(sphinx.builders.html, '_file_checksum', lambda o, f: '')
+
+ app.add_css_file('normal.css')
+ app.add_css_file('early.css', priority=100)
+ app.add_css_file('late.css', priority=750)
+ app.add_css_file('lazy.css', priority=900)
+ app.add_js_file('normal.js')
+ app.add_js_file('early.js', priority=100)
+ app.add_js_file('late.js', priority=750)
+ app.add_js_file('lazy.js', priority=900)
+
+ app.builder.build_all()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ # css_files
+ expected = [
+ '_static/early.css',
+ '_static/pygments.css',
+ '_static/alabaster.css',
+ 'https://example.com/custom.css',
+ '_static/normal.css',
+ '_static/late.css',
+ '_static/css/style.css',
+ '_static/lazy.css',
+ ]
+ pattern = '.*'.join(f'href="{re.escape(f)}"' for f in expected)
+ assert re.search(pattern, content, re.DOTALL), content
+
+ # js_files
+ expected = [
+ '_static/early.js',
+ '_static/doctools.js',
+ '_static/sphinx_highlight.js',
+ 'https://example.com/script.js',
+ '_static/normal.js',
+ '_static/late.js',
+ '_static/js/custom.js',
+ '_static/lazy.js',
+ ]
+ pattern = '.*'.join(f'src="{re.escape(f)}"' for f in expected)
+ assert re.search(pattern, content, re.DOTALL), content
+
+
+@pytest.mark.sphinx('html', testroot='html_file_checksum')
+def test_file_checksum(app):
+ app.add_css_file('stylesheet-a.css')
+ app.add_css_file('stylesheet-b.css')
+ app.add_css_file('https://example.com/custom.css')
+ app.add_js_file('script.js')
+ app.add_js_file('empty.js')
+ app.add_js_file('https://example.com/script.js')
+
+ app.builder.build_all()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ # checksum for local files
+ assert '<link rel="stylesheet" type="text/css" href="_static/stylesheet-a.css?v=e575b6df" />' in content
+ assert '<link rel="stylesheet" type="text/css" href="_static/stylesheet-b.css?v=a2d5cc0f" />' in content
+ assert '<script src="_static/script.js?v=48278d48"></script>' in content
+
+ # empty files have no checksum
+ assert '<script src="_static/empty.js"></script>' in content
+
+ # no checksum for hyperlinks
+ assert '<link rel="stylesheet" type="text/css" href="https://example.com/custom.css" />' in content
+ assert '<script src="https://example.com/script.js"></script>' in content
+
+
+def test_file_checksum_query_string():
+ with pytest.raises(ThemeError, match='Local asset file paths must not contain query strings'):
+ _file_checksum(Path(), 'with_query_string.css?dead_parrots=1')
+
+ with pytest.raises(ThemeError, match='Local asset file paths must not contain query strings'):
+ _file_checksum(Path(), 'with_query_string.js?dead_parrots=1')
+
+ with pytest.raises(ThemeError, match='Local asset file paths must not contain query strings'):
+ _file_checksum(Path.cwd(), '_static/with_query_string.css?dead_parrots=1')
+
+ with pytest.raises(ThemeError, match='Local asset file paths must not contain query strings'):
+ _file_checksum(Path.cwd(), '_static/with_query_string.js?dead_parrots=1')
+
+
+@pytest.mark.sphinx('html', testroot='html_assets')
+def test_javscript_loading_method(app):
+ app.add_js_file('normal.js')
+ app.add_js_file('early.js', loading_method='async')
+ app.add_js_file('late.js', loading_method='defer')
+
+ app.builder.build_all()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ assert '<script src="_static/normal.js"></script>' in content
+ assert '<script async="async" src="_static/early.js"></script>' in content
+ assert '<script defer="defer" src="_static/late.js"></script>' in content
+
+
+@pytest.mark.sphinx('html', testroot='basic', confoverrides={'html_copy_source': False})
+def test_html_copy_source(app):
+ app.builder.build_all()
+ assert not (app.outdir / '_sources' / 'index.rst.txt').exists()
+
+
+@pytest.mark.sphinx('html', testroot='basic', confoverrides={'html_sourcelink_suffix': '.txt'})
+def test_html_sourcelink_suffix(app):
+ app.builder.build_all()
+ assert (app.outdir / '_sources' / 'index.rst.txt').exists()
+
+
+@pytest.mark.sphinx('html', testroot='basic', confoverrides={'html_sourcelink_suffix': '.rst'})
+def test_html_sourcelink_suffix_same(app):
+ app.builder.build_all()
+ assert (app.outdir / '_sources' / 'index.rst').exists()
+
+
+@pytest.mark.sphinx('html', testroot='basic', confoverrides={'html_sourcelink_suffix': ''})
+def test_html_sourcelink_suffix_empty(app):
+ app.builder.build_all()
+ assert (app.outdir / '_sources' / 'index.rst').exists()
+
+
+@pytest.mark.sphinx('html', testroot='html_entity')
+def test_html_entity(app):
+ app.builder.build_all()
+ valid_entities = {'amp', 'lt', 'gt', 'quot', 'apos'}
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ for entity in re.findall(r'&([a-z]+);', content, re.M):
+ assert entity not in valid_entities
+
+
+@pytest.mark.sphinx('html', testroot='basic')
+def test_html_inventory(app):
+ app.builder.build_all()
+
+ with app.outdir.joinpath('objects.inv').open('rb') as f:
+ invdata = InventoryFile.load(f, 'https://www.google.com', posixpath.join)
+
+ assert set(invdata.keys()) == {'std:label', 'std:doc'}
+ assert set(invdata['std:label'].keys()) == {'modindex',
+ 'py-modindex',
+ 'genindex',
+ 'search'}
+ assert invdata['std:label']['modindex'] == ('Python',
+ '',
+ 'https://www.google.com/py-modindex.html',
+ 'Module Index')
+ assert invdata['std:label']['py-modindex'] == ('Python',
+ '',
+ 'https://www.google.com/py-modindex.html',
+ 'Python Module Index')
+ assert invdata['std:label']['genindex'] == ('Python',
+ '',
+ 'https://www.google.com/genindex.html',
+ 'Index')
+ assert invdata['std:label']['search'] == ('Python',
+ '',
+ 'https://www.google.com/search.html',
+ 'Search Page')
+ assert set(invdata['std:doc'].keys()) == {'index'}
+ assert invdata['std:doc']['index'] == ('Python',
+ '',
+ 'https://www.google.com/index.html',
+ 'The basic Sphinx documentation for testing')
+
+
+@pytest.mark.sphinx('html', testroot='images', confoverrides={'html_sourcelink_suffix': ''})
+def test_html_anchor_for_figure(app):
+ app.builder.build_all()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<figcaption>\n<p><span class="caption-text">The caption of pic</span>'
+ '<a class="headerlink" href="#id1" title="Link to this image">¶</a></p>\n</figcaption>'
+ in content)
+
+
+@pytest.mark.sphinx('html', testroot='directives-raw')
+def test_html_raw_directive(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ # standard case
+ assert 'standalone raw directive (HTML)' in result
+ assert 'standalone raw directive (LaTeX)' not in result
+
+ # with substitution
+ assert '<p>HTML: abc def ghi</p>' in result
+ assert '<p>LaTeX: abc ghi</p>' in result
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [
+ (".//link[@href='_static/persistent.css']"
+ "[@rel='stylesheet']", '', True),
+ (".//link[@href='_static/default.css']"
+ "[@rel='stylesheet']"
+ "[@title='Default']", '', True),
+ (".//link[@href='_static/alternate1.css']"
+ "[@rel='alternate stylesheet']"
+ "[@title='Alternate']", '', True),
+ (".//link[@href='_static/alternate2.css']"
+ "[@rel='alternate stylesheet']", '', True),
+ (".//link[@href='_static/more_persistent.css']"
+ "[@rel='stylesheet']", '', True),
+ (".//link[@href='_static/more_default.css']"
+ "[@rel='stylesheet']"
+ "[@title='Default']", '', True),
+ (".//link[@href='_static/more_alternate1.css']"
+ "[@rel='alternate stylesheet']"
+ "[@title='Alternate']", '', True),
+ (".//link[@href='_static/more_alternate2.css']"
+ "[@rel='alternate stylesheet']", '', True),
+ ],
+}))
+@pytest.mark.sphinx('html', testroot='stylesheets')
+def test_alternate_stylesheets(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', testroot='html_style')
+def test_html_style(app, status, warning):
+ app.build()
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<link rel="stylesheet" type="text/css" href="_static/default.css" />' in result
+ assert ('<link rel="stylesheet" type="text/css" href="_static/alabaster.css" />'
+ not in result)
+
+
+@pytest.mark.sphinx('html', testroot='images')
+def test_html_remote_images(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<img alt="https://www.python.org/static/img/python-logo.png" '
+ 'src="https://www.python.org/static/img/python-logo.png" />' in result)
+ assert not (app.outdir / 'python-logo.png').exists()
+
+
+@pytest.mark.sphinx('html', testroot='image-escape')
+def test_html_encoded_image(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<img alt="_images/img_%231.png" src="_images/img_%231.png" />' in result)
+ assert (app.outdir / '_images/img_#1.png').exists()
+
+
+@pytest.mark.sphinx('html', testroot='remote-logo')
+def test_html_remote_logo(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<img class="logo" src="https://www.python.org/static/img/python-logo.png" alt="Logo"/>' in result)
+ assert ('<link rel="icon" href="https://www.python.org/static/favicon.ico"/>' in result)
+ assert not (app.outdir / 'python-logo.png').exists()
+
+
+@pytest.mark.sphinx('html', testroot='local-logo')
+def test_html_local_logo(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<img class="logo" src="_static/img.png" alt="Logo"/>' in result)
+ assert (app.outdir / '_static/img.png').exists()
+
+
+@pytest.mark.sphinx('html', testroot='basic')
+def test_html_sidebar(app, status, warning):
+ ctx = {}
+
+ # default for alabaster
+ app.builder.build_all()
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<div class="sphinxsidebar" role="navigation" '
+ 'aria-label="main navigation">' in result)
+ assert '<h1 class="logo"><a href="#">Python</a></h1>' in result
+ assert '<h3>Navigation</h3>' in result
+ assert '<h3>Related Topics</h3>' in result
+ assert '<h3 id="searchlabel">Quick search</h3>' in result
+
+ app.builder.add_sidebars('index', ctx)
+ assert ctx['sidebars'] == ['about.html', 'navigation.html', 'relations.html',
+ 'searchbox.html', 'donate.html']
+
+ # only relations.html
+ app.config.html_sidebars = {'**': ['relations.html']}
+ app.builder.build_all()
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<div class="sphinxsidebar" role="navigation" '
+ 'aria-label="main navigation">' in result)
+ assert '<h1 class="logo"><a href="#">Python</a></h1>' not in result
+ assert '<h3>Navigation</h3>' not in result
+ assert '<h3>Related Topics</h3>' in result
+ assert '<h3 id="searchlabel">Quick search</h3>' not in result
+
+ app.builder.add_sidebars('index', ctx)
+ assert ctx['sidebars'] == ['relations.html']
+
+ # no sidebars
+ app.config.html_sidebars = {'**': []}
+ app.builder.build_all()
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<div class="sphinxsidebar" role="navigation" '
+ 'aria-label="main navigation">' not in result)
+ assert '<h1 class="logo"><a href="#">Python</a></h1>' not in result
+ assert '<h3>Navigation</h3>' not in result
+ assert '<h3>Related Topics</h3>' not in result
+ assert '<h3 id="searchlabel">Quick search</h3>' not in result
+
+ app.builder.add_sidebars('index', ctx)
+ assert ctx['sidebars'] == []
+
+
+@pytest.mark.parametrize(("fname", "expect"), flat_dict({
+ 'index.html': [(".//em/a[@href='https://example.com/man.1']", "", True),
+ (".//em/a[@href='https://example.com/ls.1']", "", True),
+ (".//em/a[@href='https://example.com/sphinx.']", "", True)],
+
+}))
+@pytest.mark.sphinx('html', testroot='manpage_url', confoverrides={
+ 'manpages_url': 'https://example.com/{page}.{section}'})
+@pytest.mark.test_params(shared_result='test_build_html_manpage_url')
+def test_html_manpage(app, cached_etree_parse, fname, expect):
+ app.build()
+ check_xpath(cached_etree_parse(app.outdir / fname), fname, *expect)
+
+
+@pytest.mark.sphinx('html', testroot='toctree-glob',
+ confoverrides={'html_baseurl': 'https://example.com/'})
+def test_html_baseurl(app, status, warning):
+ app.build()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<link rel="canonical" href="https://example.com/index.html" />' in result
+
+ result = (app.outdir / 'qux' / 'index.html').read_text(encoding='utf8')
+ assert '<link rel="canonical" href="https://example.com/qux/index.html" />' in result
+
+
+@pytest.mark.sphinx('html', testroot='toctree-glob',
+ confoverrides={'html_baseurl': 'https://example.com/subdir',
+ 'html_file_suffix': '.htm'})
+def test_html_baseurl_and_html_file_suffix(app, status, warning):
+ app.build()
+
+ result = (app.outdir / 'index.htm').read_text(encoding='utf8')
+ assert '<link rel="canonical" href="https://example.com/subdir/index.htm" />' in result
+
+ result = (app.outdir / 'qux' / 'index.htm').read_text(encoding='utf8')
+ assert '<link rel="canonical" href="https://example.com/subdir/qux/index.htm" />' in result
+
+
+@pytest.mark.sphinx('html', testroot='basic')
+def test_default_html_math_renderer(app, status, warning):
+ assert app.builder.math_renderer_name == 'mathjax'
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'extensions': ['sphinx.ext.mathjax']})
+def test_html_math_renderer_is_mathjax(app, status, warning):
+ assert app.builder.math_renderer_name == 'mathjax'
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'extensions': ['sphinx.ext.imgmath']})
+def test_html_math_renderer_is_imgmath(app, status, warning):
+ assert app.builder.math_renderer_name == 'imgmath'
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'extensions': ['sphinxcontrib.jsmath',
+ 'sphinx.ext.imgmath']})
+def test_html_math_renderer_is_duplicated(make_app, app_params):
+ args, kwargs = app_params
+ with pytest.raises(
+ ConfigError,
+ match='Many math_renderers are registered. But no math_renderer is selected.',
+ ):
+ make_app(*args, **kwargs)
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'extensions': ['sphinx.ext.imgmath',
+ 'sphinx.ext.mathjax']})
+def test_html_math_renderer_is_duplicated2(app, status, warning):
+ # case of both mathjax and another math_renderer is loaded
+ assert app.builder.math_renderer_name == 'imgmath' # The another one is chosen
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'extensions': ['sphinxcontrib.jsmath',
+ 'sphinx.ext.imgmath'],
+ 'html_math_renderer': 'imgmath'})
+def test_html_math_renderer_is_chosen(app, status, warning):
+ assert app.builder.math_renderer_name == 'imgmath'
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'extensions': ['sphinxcontrib.jsmath',
+ 'sphinx.ext.mathjax'],
+ 'html_math_renderer': 'imgmath'})
+def test_html_math_renderer_is_mismatched(make_app, app_params):
+ args, kwargs = app_params
+ with pytest.raises(ConfigError, match="Unknown math_renderer 'imgmath' is given."):
+ make_app(*args, **kwargs)
+
+
+@pytest.mark.sphinx('html', testroot='basic')
+def test_html_pygments_style_default(app):
+ style = app.builder.highlighter.formatter_args.get('style')
+ assert style.__name__ == 'Alabaster'
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'pygments_style': 'sphinx'})
+def test_html_pygments_style_manually(app):
+ style = app.builder.highlighter.formatter_args.get('style')
+ assert style.__name__ == 'SphinxStyle'
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'html_theme': 'classic'})
+def test_html_pygments_for_classic_theme(app):
+ style = app.builder.highlighter.formatter_args.get('style')
+ assert style.__name__ == 'SphinxStyle'
+
+
+@pytest.mark.sphinx('html', testroot='basic')
+def test_html_dark_pygments_style_default(app):
+ assert app.builder.dark_highlighter is None
+
+
+@pytest.mark.sphinx(testroot='basic', srcdir='validate_html_extra_path')
+def test_validate_html_extra_path(app):
+ (app.confdir / '_static').mkdir(parents=True, exist_ok=True)
+ app.config.html_extra_path = [
+ '/path/to/not_found', # not found
+ '_static',
+ app.outdir, # outdir
+ app.outdir / '_static', # inside outdir
+ ]
+ validate_html_extra_path(app, app.config)
+ assert app.config.html_extra_path == ['_static']
+
+
+@pytest.mark.sphinx(testroot='basic', srcdir='validate_html_static_path')
+def test_validate_html_static_path(app):
+ (app.confdir / '_static').mkdir(parents=True, exist_ok=True)
+ app.config.html_static_path = [
+ '/path/to/not_found', # not found
+ '_static',
+ app.outdir, # outdir
+ app.outdir / '_static', # inside outdir
+ ]
+ validate_html_static_path(app, app.config)
+ assert app.config.html_static_path == ['_static']
+
+
+@pytest.mark.sphinx(testroot='html_scaled_image_link')
+def test_html_scaled_image_link(app):
+ app.build()
+ context = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ # no scaled parameters
+ assert re.search('\n<img alt="_images/img.png" src="_images/img.png" />', context)
+
+ # scaled_image_link
+ assert re.search('\n<a class="reference internal image-reference" href="_images/img.png">'
+ '<img alt="_images/img.png" src="_images/img.png" style="[^"]+" /></a>',
+ context)
+
+ # no-scaled-link class disables the feature
+ assert re.search('\n<img alt="_images/img.png" class="no-scaled-link"'
+ ' src="_images/img.png" style="[^"]+" />',
+ context)
+
+
+@pytest.mark.sphinx('html', testroot='reST-code-block',
+ confoverrides={'html_codeblock_linenos_style': 'table'})
+def test_html_codeblock_linenos_style_table(app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ assert ('<div class="linenodiv"><pre><span class="normal">1</span>\n'
+ '<span class="normal">2</span>\n'
+ '<span class="normal">3</span>\n'
+ '<span class="normal">4</span></pre></div>') in content
+
+
+@pytest.mark.sphinx('html', testroot='reST-code-block',
+ confoverrides={'html_codeblock_linenos_style': 'inline'})
+def test_html_codeblock_linenos_style_inline(app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ assert '<span class="linenos">1</span>' in content
+
+
+@pytest.mark.sphinx('html', testroot='highlight_options')
+def test_highlight_options(app):
+ subject = app.builder.highlighter
+ with patch.object(subject, 'highlight_block', wraps=subject.highlight_block) as highlight:
+ app.build()
+
+ call_args = highlight.call_args_list
+ assert len(call_args) == 3
+ assert call_args[0] == call(ANY, 'default', force=False, linenos=False,
+ location=ANY, opts={'default_option': True})
+ assert call_args[1] == call(ANY, 'python', force=False, linenos=False,
+ location=ANY, opts={'python_option': True})
+ assert call_args[2] == call(ANY, 'java', force=False, linenos=False,
+ location=ANY, opts={})
+
+
+@pytest.mark.sphinx('html', testroot='highlight_options',
+ confoverrides={'highlight_options': {'default_option': True}})
+def test_highlight_options_old(app):
+ subject = app.builder.highlighter
+ with patch.object(subject, 'highlight_block', wraps=subject.highlight_block) as highlight:
+ app.build()
+
+ call_args = highlight.call_args_list
+ assert len(call_args) == 3
+ assert call_args[0] == call(ANY, 'default', force=False, linenos=False,
+ location=ANY, opts={'default_option': True})
+ assert call_args[1] == call(ANY, 'python', force=False, linenos=False,
+ location=ANY, opts={})
+ assert call_args[2] == call(ANY, 'java', force=False, linenos=False,
+ location=ANY, opts={})
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'html_permalinks': False})
+def test_html_permalink_disable(app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ assert '<h1>The basic Sphinx documentation for testing</h1>' in content
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'html_permalinks_icon': '<span>[PERMALINK]</span>'})
+def test_html_permalink_icon(app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ assert ('<h1>The basic Sphinx documentation for testing<a class="headerlink" '
+ 'href="#the-basic-sphinx-documentation-for-testing" '
+ 'title="Link to this heading"><span>[PERMALINK]</span></a></h1>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='html_signaturereturn_icon')
+def test_html_signaturereturn_icon(app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ assert ('<span class="sig-return-icon">&#x2192;</span>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='reST-code-role')
+def test_html_code_role(app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ common_content = (
+ '<span class="k">def</span> <span class="nf">foo</span>'
+ '<span class="p">(</span>'
+ '<span class="mi">1</span> '
+ '<span class="o">+</span> '
+ '<span class="mi">2</span> '
+ '<span class="o">+</span> '
+ '<span class="kc">None</span> '
+ '<span class="o">+</span> '
+ '<span class="s2">&quot;abc&quot;</span>'
+ '<span class="p">):</span> '
+ '<span class="k">pass</span>')
+ assert ('<p>Inline <code class="code highlight python docutils literal highlight-python">' +
+ common_content + '</code> code block</p>') in content
+ assert ('<div class="highlight-python notranslate">' +
+ '<div class="highlight"><pre><span></span>' +
+ common_content) in content
+
+
+@pytest.mark.sphinx('html', testroot='root',
+ confoverrides={'option_emphasise_placeholders': True})
+def test_option_emphasise_placeholders(app, status, warning):
+ app.build()
+ content = (app.outdir / 'objects.html').read_text(encoding='utf8')
+ assert '<em><span class="pre">TYPE</span></em>' in content
+ assert '{TYPE}' not in content
+ assert ('<em><span class="pre">WHERE</span></em>'
+ '<span class="pre">-</span>'
+ '<em><span class="pre">COUNT</span></em>' in content)
+ assert '<span class="pre">{{value}}</span>' in content
+ assert ('<span class="pre">--plugin.option</span></span>'
+ '<a class="headerlink" href="#cmdoption-perl-plugin.option" title="Link to this definition">¶</a></dt>') in content
+
+
+@pytest.mark.sphinx('html', testroot='root')
+def test_option_emphasise_placeholders_default(app, status, warning):
+ app.build()
+ content = (app.outdir / 'objects.html').read_text(encoding='utf8')
+ assert '<span class="pre">={TYPE}</span>' in content
+ assert '<span class="pre">={WHERE}-{COUNT}</span></span>' in content
+ assert '<span class="pre">{client_name}</span>' in content
+ assert ('<span class="pre">--plugin.option</span></span>'
+ '<span class="sig-prename descclassname"></span>'
+ '<a class="headerlink" href="#cmdoption-perl-plugin.option" title="Link to this definition">¶</a></dt>') in content
+
+
+@pytest.mark.sphinx('html', testroot='root')
+def test_option_reference_with_value(app, status, warning):
+ app.build()
+ content = (app.outdir / 'objects.html').read_text(encoding='utf-8')
+ assert ('<span class="pre">-mapi</span></span><span class="sig-prename descclassname">'
+ '</span><a class="headerlink" href="#cmdoption-git-commit-mapi"') in content
+ assert 'first option <a class="reference internal" href="#cmdoption-git-commit-mapi">' in content
+ assert ('<a class="reference internal" href="#cmdoption-git-commit-mapi">'
+ '<code class="xref std std-option docutils literal notranslate"><span class="pre">-mapi[=xxx]</span></code></a>') in content
+ assert '<span class="pre">-mapi</span> <span class="pre">with_space</span>' in content
+
+
+@pytest.mark.sphinx('html', testroot='theming')
+def test_theme_options(app, status, warning):
+ app.build()
+
+ result = (app.outdir / '_static' / 'documentation_options.js').read_text(encoding='utf8')
+ assert 'NAVIGATION_WITH_KEYS: false' in result
+ assert 'ENABLE_SEARCH_SHORTCUTS: true' in result
+
+
+@pytest.mark.sphinx('html', testroot='theming',
+ confoverrides={'html_theme_options.navigation_with_keys': True,
+ 'html_theme_options.enable_search_shortcuts': False})
+def test_theme_options_with_override(app, status, warning):
+ app.build()
+
+ result = (app.outdir / '_static' / 'documentation_options.js').read_text(encoding='utf8')
+ assert 'NAVIGATION_WITH_KEYS: true' in result
+ assert 'ENABLE_SEARCH_SHORTCUTS: false' in result
+
+
+@pytest.mark.sphinx('html', testroot='build-html-theme-having-multiple-stylesheets')
+def test_theme_having_multiple_stylesheets(app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf-8')
+
+ assert '<link rel="stylesheet" type="text/css" href="_static/mytheme.css" />' in content
+ assert '<link rel="stylesheet" type="text/css" href="_static/extra.css" />' in content
+
+
+@pytest.mark.sphinx('html', testroot='images')
+def test_copy_images(app, status, warning):
+ app.build()
+
+ images_dir = Path(app.outdir) / '_images'
+ images = {image.name for image in images_dir.rglob('*')}
+ assert images == {
+ 'img.png',
+ 'rimg.png',
+ 'rimg1.png',
+ 'svgimg.svg',
+ 'testimäge.png',
+ }
diff --git a/tests/test_build_latex.py b/tests/test_build_latex.py
new file mode 100644
index 0000000..e37a97e
--- /dev/null
+++ b/tests/test_build_latex.py
@@ -0,0 +1,1755 @@
+"""Test the build process with LaTeX builder with the test root."""
+
+import os
+import re
+import subprocess
+from itertools import chain, product
+from pathlib import Path
+from shutil import copyfile
+from subprocess import CalledProcessError
+
+import pytest
+
+from sphinx.builders.latex import default_latex_documents
+from sphinx.config import Config
+from sphinx.errors import SphinxError
+from sphinx.ext.intersphinx import load_mappings, normalize_intersphinx_mapping
+from sphinx.ext.intersphinx import setup as intersphinx_setup
+from sphinx.testing.util import strip_escseq
+from sphinx.util.osutil import ensuredir
+from sphinx.writers.latex import LaTeXTranslator
+
+from .test_build_html import ENV_WARNINGS
+
+try:
+ from contextlib import chdir
+except ImportError:
+ from sphinx.util.osutil import _chdir as chdir
+
+LATEX_ENGINES = ['pdflatex', 'lualatex', 'xelatex']
+DOCCLASSES = ['manual', 'howto']
+STYLEFILES = ['article.cls', 'fancyhdr.sty', 'titlesec.sty', 'amsmath.sty',
+ 'framed.sty', 'color.sty', 'fancyvrb.sty',
+ 'fncychap.sty', 'geometry.sty', 'kvoptions.sty', 'hyperref.sty',
+ 'booktabs.sty']
+
+LATEX_WARNINGS = ENV_WARNINGS + """\
+%(root)s/index.rst:\\d+: WARNING: unknown option: '&option'
+%(root)s/index.rst:\\d+: WARNING: citation not found: missing
+%(root)s/index.rst:\\d+: WARNING: a suitable image for latex builder not found: foo.\\*
+%(root)s/index.rst:\\d+: WARNING: Lexing literal_block ".*" as "c" resulted in an error at token: ".*". Retrying in relaxed mode.
+"""
+
+
+# only run latex if all needed packages are there
+def kpsetest(*filenames):
+ try:
+ subprocess.run(['kpsewhich'] + list(filenames), capture_output=True, check=True)
+ return True
+ except (OSError, CalledProcessError):
+ return False # command not found or exit with non-zero
+
+
+# compile latex document with app.config.latex_engine
+def compile_latex_document(app, filename='python.tex', docclass='manual'):
+ # now, try to run latex over it
+ try:
+ with chdir(app.outdir):
+ # name latex output-directory according to both engine and docclass
+ # to avoid reuse of auxiliary files by one docclass from another
+ latex_outputdir = app.config.latex_engine + docclass
+ ensuredir(latex_outputdir)
+ # keep a copy of latex file for this engine in case test fails
+ copyfile(filename, latex_outputdir + '/' + filename)
+ args = [app.config.latex_engine,
+ '--halt-on-error',
+ '--interaction=nonstopmode',
+ '-output-directory=%s' % latex_outputdir,
+ filename]
+ subprocess.run(args, capture_output=True, check=True)
+ except OSError as exc: # most likely the latex executable was not found
+ raise pytest.skip.Exception from exc
+ except CalledProcessError as exc:
+ print(exc.stdout.decode('utf8'))
+ print(exc.stderr.decode('utf8'))
+ msg = f'{app.config.latex_engine} exited with return code {exc.returncode}'
+ raise AssertionError(msg) from exc
+
+
+def skip_if_requested(testfunc):
+ if 'SKIP_LATEX_BUILD' in os.environ:
+ msg = 'Skip LaTeX builds because SKIP_LATEX_BUILD is set'
+ return pytest.mark.skipif(True, reason=msg)(testfunc)
+ else:
+ return testfunc
+
+
+def skip_if_stylefiles_notfound(testfunc):
+ if kpsetest(*STYLEFILES) is False:
+ msg = 'not running latex, the required styles do not seem to be installed'
+ return pytest.mark.skipif(True, reason=msg)(testfunc)
+ else:
+ return testfunc
+
+
+@skip_if_requested
+@skip_if_stylefiles_notfound
+@pytest.mark.parametrize(
+ ('engine', 'docclass', 'python_maximum_signature_line_length'),
+ # Only running test with `python_maximum_signature_line_length` not None with last
+ # LaTeX engine to reduce testing time, as if this configuration does not fail with
+ # one engine, it's almost impossible it would fail with another.
+ chain(
+ product(LATEX_ENGINES[:-1], DOCCLASSES, [None]),
+ product([LATEX_ENGINES[-1]], DOCCLASSES, [1]),
+ ),
+)
+@pytest.mark.sphinx('latex', freshenv=True)
+def test_build_latex_doc(app, status, warning, engine, docclass, python_maximum_signature_line_length):
+ app.config.python_maximum_signature_line_length = python_maximum_signature_line_length
+ app.config.intersphinx_mapping = {
+ 'sphinx': ('https://www.sphinx-doc.org/en/master/', None),
+ }
+ intersphinx_setup(app)
+ app.config.latex_engine = engine
+ app.config.latex_documents = [app.config.latex_documents[0][:4] + (docclass,)]
+ if engine == 'xelatex':
+ app.config.latex_table_style = ['booktabs']
+ elif engine == 'lualatex':
+ app.config.latex_table_style = ['colorrows']
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+ app.builder.init()
+ LaTeXTranslator.ignore_missing_images = True
+ app.builder.build_all()
+
+ # file from latex_additional_files
+ assert (app.outdir / 'svgimg.svg').is_file()
+
+ compile_latex_document(app, 'sphinxtests.tex', docclass)
+
+
+@pytest.mark.sphinx('latex')
+def test_writer(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'sphinxtests.tex').read_text(encoding='utf8')
+
+ assert ('\\begin{sphinxfigure-in-table}\n\\centering\n\\capstart\n'
+ '\\noindent\\sphinxincludegraphics{{img}.png}\n'
+ '\\sphinxfigcaption{figure in table}\\label{\\detokenize{markup:id8}}'
+ '\\end{sphinxfigure-in-table}\\relax' in result)
+
+ assert ('\\begin{wrapfigure}{r}{0pt}\n\\centering\n'
+ '\\noindent\\sphinxincludegraphics{{rimg}.png}\n'
+ '\\caption{figure with align option}\\label{\\detokenize{markup:id9}}'
+ '\\end{wrapfigure}\n\n'
+ '\\mbox{}\\par\\vskip-\\dimexpr\\baselineskip+\\parskip\\relax' in result)
+
+ assert ('\\begin{wrapfigure}{r}{0.500\\linewidth}\n\\centering\n'
+ '\\noindent\\sphinxincludegraphics{{rimg}.png}\n'
+ '\\caption{figure with align \\& figwidth option}'
+ '\\label{\\detokenize{markup:id10}}'
+ '\\end{wrapfigure}\n\n'
+ '\\mbox{}\\par\\vskip-\\dimexpr\\baselineskip+\\parskip\\relax' in result)
+
+ assert ('\\begin{wrapfigure}{r}{3cm}\n\\centering\n'
+ '\\noindent\\sphinxincludegraphics[width=3cm]{{rimg}.png}\n'
+ '\\caption{figure with align \\& width option}'
+ '\\label{\\detokenize{markup:id11}}'
+ '\\end{wrapfigure}\n\n'
+ '\\mbox{}\\par\\vskip-\\dimexpr\\baselineskip+\\parskip\\relax' in result)
+
+ assert 'Footnotes' not in result
+
+ assert ('\\begin{sphinxseealso}{See also:}\n\n'
+ '\\sphinxAtStartPar\n'
+ 'something, something else, something more\n'
+ '\\begin{description}\n'
+ '\\sphinxlineitem{\\sphinxhref{http://www.google.com}{Google}}\n'
+ '\\sphinxAtStartPar\n'
+ 'For everything.\n'
+ '\n'
+ '\\end{description}\n'
+ '\n\n\\end{sphinxseealso}\n\n' in result)
+
+
+@pytest.mark.sphinx('latex', testroot='warnings', freshenv=True)
+def test_latex_warnings(app, status, warning):
+ app.builder.build_all()
+
+ warnings = strip_escseq(re.sub(re.escape(os.sep) + '{1,2}', '/', warning.getvalue()))
+ warnings_exp = LATEX_WARNINGS % {
+ 'root': re.escape(app.srcdir.as_posix())}
+ assert re.match(warnings_exp + '$', warnings), \
+ "Warnings don't match:\n" + \
+ '--- Expected (regex):\n' + warnings_exp + \
+ '--- Got:\n' + warnings
+
+
+@pytest.mark.sphinx('latex', testroot='basic')
+def test_latex_basic(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert r'\title{The basic Sphinx documentation for testing}' in result
+ assert r'\release{}' in result
+ assert r'\renewcommand{\releasename}{}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic',
+ confoverrides={
+ 'latex_documents': [('index', 'test.tex', 'title', 'author', 'manual')],
+ })
+def test_latex_basic_manual(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\sphinxdocclass{report}' in result
+ assert r'\documentclass[letterpaper,10pt,english]{sphinxmanual}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic',
+ confoverrides={
+ 'latex_documents': [('index', 'test.tex', 'title', 'author', 'howto')],
+ })
+def test_latex_basic_howto(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\sphinxdocclass{article}' in result
+ assert r'\documentclass[letterpaper,10pt,english]{sphinxhowto}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic',
+ confoverrides={
+ 'language': 'ja',
+ 'latex_documents': [('index', 'test.tex', 'title', 'author', 'manual')],
+ })
+def test_latex_basic_manual_ja(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\sphinxdocclass{ujbook}' in result
+ assert r'\documentclass[letterpaper,10pt,dvipdfmx]{sphinxmanual}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic',
+ confoverrides={
+ 'language': 'ja',
+ 'latex_documents': [('index', 'test.tex', 'title', 'author', 'howto')],
+ })
+def test_latex_basic_howto_ja(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\sphinxdocclass{ujreport}' in result
+ assert r'\documentclass[letterpaper,10pt,dvipdfmx]{sphinxhowto}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-theme')
+def test_latex_theme(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\sphinxdocclass{book}' in result
+ assert r'\documentclass[a4paper,12pt,english]{sphinxbook}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-theme',
+ confoverrides={'latex_elements': {'papersize': 'b5paper',
+ 'pointsize': '9pt'}})
+def test_latex_theme_papersize(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\sphinxdocclass{book}' in result
+ assert r'\documentclass[b5paper,9pt,english]{sphinxbook}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-theme',
+ confoverrides={'latex_theme_options': {'papersize': 'b5paper',
+ 'pointsize': '9pt'}})
+def test_latex_theme_options(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\sphinxdocclass{book}' in result
+ assert r'\documentclass[b5paper,9pt,english]{sphinxbook}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic', confoverrides={'language': 'zh'})
+def test_latex_additional_settings_for_language_code(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert r'\usepackage{xeCJK}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic', confoverrides={'language': 'el'})
+def test_latex_additional_settings_for_greek(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\usepackage{polyglossia}\n\\setmainlanguage{greek}' in result
+ assert '\\newfontfamily\\greekfonttt{FreeMono}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-title')
+def test_latex_title_after_admonitions(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\title{test\\sphinxhyphen{}latex\\sphinxhyphen{}title}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic',
+ confoverrides={'release': '1.0_0'})
+def test_latex_release(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert r'\release{1.0\_0}' in result
+ assert r'\renewcommand{\releasename}{Release}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='numfig',
+ confoverrides={'numfig': True})
+def test_numref(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('\\hyperref[\\detokenize{index:fig1}]'
+ '{Fig.\\@ \\ref{\\detokenize{index:fig1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:fig22}]'
+ '{Figure\\ref{\\detokenize{baz:fig22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:table-1}]'
+ '{Table \\ref{\\detokenize{index:table-1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:table22}]'
+ '{Table:\\ref{\\detokenize{baz:table22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:code-1}]'
+ '{Listing \\ref{\\detokenize{index:code-1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:code22}]'
+ '{Code\\sphinxhyphen{}\\ref{\\detokenize{baz:code22}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]'
+ '{Section \\ref{\\detokenize{foo:foo}}}') in result
+ assert ('\\hyperref[\\detokenize{bar:bar-a}]'
+ '{Section \\ref{\\detokenize{bar:bar-a}}}') in result
+ assert ('\\hyperref[\\detokenize{index:fig1}]{Fig.\\ref{\\detokenize{index:fig1}} '
+ '\\nameref{\\detokenize{index:fig1}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]{Sect.\\ref{\\detokenize{foo:foo}} '
+ '\\nameref{\\detokenize{foo:foo}}}') in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\addto\captionsenglish{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\tablename}{Table }}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\literalblockname}{Listing}}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='numfig',
+ confoverrides={'numfig': True,
+ 'numfig_format': {'figure': 'Figure:%s',
+ 'table': 'Tab_%s',
+ 'code-block': 'Code-%s',
+ 'section': 'SECTION-%s'}})
+def test_numref_with_prefix1(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\ref{\\detokenize{index:fig1}}' in result
+ assert '\\ref{\\detokenize{baz:fig22}}' in result
+ assert '\\ref{\\detokenize{index:table-1}}' in result
+ assert '\\ref{\\detokenize{baz:table22}}' in result
+ assert '\\ref{\\detokenize{index:code-1}}' in result
+ assert '\\ref{\\detokenize{baz:code22}}' in result
+ assert ('\\hyperref[\\detokenize{index:fig1}]'
+ '{Figure:\\ref{\\detokenize{index:fig1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:fig22}]'
+ '{Figure\\ref{\\detokenize{baz:fig22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:table-1}]'
+ '{Tab\\_\\ref{\\detokenize{index:table-1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:table22}]'
+ '{Table:\\ref{\\detokenize{baz:table22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:code-1}]'
+ '{Code\\sphinxhyphen{}\\ref{\\detokenize{index:code-1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:code22}]'
+ '{Code\\sphinxhyphen{}\\ref{\\detokenize{baz:code22}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]'
+ '{SECTION\\sphinxhyphen{}\\ref{\\detokenize{foo:foo}}}') in result
+ assert ('\\hyperref[\\detokenize{bar:bar-a}]'
+ '{SECTION\\sphinxhyphen{}\\ref{\\detokenize{bar:bar-a}}}') in result
+ assert ('\\hyperref[\\detokenize{index:fig1}]{Fig.\\ref{\\detokenize{index:fig1}} '
+ '\\nameref{\\detokenize{index:fig1}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]{Sect.\\ref{\\detokenize{foo:foo}} '
+ '\\nameref{\\detokenize{foo:foo}}}') in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\addto\captionsenglish{\renewcommand{\figurename}{Figure:}}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\tablename}{Tab\_}}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\literalblockname}{Code-}}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='numfig',
+ confoverrides={'numfig': True,
+ 'numfig_format': {'figure': 'Figure:%s.',
+ 'table': 'Tab_%s:',
+ 'code-block': 'Code-%s | ',
+ 'section': 'SECTION_%s_'}})
+def test_numref_with_prefix2(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('\\hyperref[\\detokenize{index:fig1}]'
+ '{Figure:\\ref{\\detokenize{index:fig1}}.\\@}') in result
+ assert ('\\hyperref[\\detokenize{baz:fig22}]'
+ '{Figure\\ref{\\detokenize{baz:fig22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:table-1}]'
+ '{Tab\\_\\ref{\\detokenize{index:table-1}}:}') in result
+ assert ('\\hyperref[\\detokenize{baz:table22}]'
+ '{Table:\\ref{\\detokenize{baz:table22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:code-1}]{Code\\sphinxhyphen{}\\ref{\\detokenize{index:code-1}} '
+ '| }') in result
+ assert ('\\hyperref[\\detokenize{baz:code22}]'
+ '{Code\\sphinxhyphen{}\\ref{\\detokenize{baz:code22}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]'
+ '{SECTION\\_\\ref{\\detokenize{foo:foo}}\\_}') in result
+ assert ('\\hyperref[\\detokenize{bar:bar-a}]'
+ '{SECTION\\_\\ref{\\detokenize{bar:bar-a}}\\_}') in result
+ assert ('\\hyperref[\\detokenize{index:fig1}]{Fig.\\ref{\\detokenize{index:fig1}} '
+ '\\nameref{\\detokenize{index:fig1}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]{Sect.\\ref{\\detokenize{foo:foo}} '
+ '\\nameref{\\detokenize{foo:foo}}}') in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\addto\captionsenglish{\renewcommand{\figurename}{Figure:}}' in result
+ assert r'\def\fnum@figure{\figurename\thefigure{}.}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\tablename}{Tab\_}}' in result
+ assert r'\def\fnum@table{\tablename\thetable{}:}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\literalblockname}{Code-}}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='numfig',
+ confoverrides={'numfig': True, 'language': 'ja'})
+def test_numref_with_language_ja(app, status, warning):
+ app.build()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('\\hyperref[\\detokenize{index:fig1}]'
+ '{\u56f3 \\ref{\\detokenize{index:fig1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:fig22}]'
+ '{Figure\\ref{\\detokenize{baz:fig22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:table-1}]'
+ '{\u8868 \\ref{\\detokenize{index:table-1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:table22}]'
+ '{Table:\\ref{\\detokenize{baz:table22}}}') in result
+ assert ('\\hyperref[\\detokenize{index:code-1}]'
+ '{\u30ea\u30b9\u30c8 \\ref{\\detokenize{index:code-1}}}') in result
+ assert ('\\hyperref[\\detokenize{baz:code22}]'
+ '{Code\\sphinxhyphen{}\\ref{\\detokenize{baz:code22}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]'
+ '{\\ref{\\detokenize{foo:foo}} \u7ae0}') in result
+ assert ('\\hyperref[\\detokenize{bar:bar-a}]'
+ '{\\ref{\\detokenize{bar:bar-a}} \u7ae0}') in result
+ assert ('\\hyperref[\\detokenize{index:fig1}]{Fig.\\ref{\\detokenize{index:fig1}} '
+ '\\nameref{\\detokenize{index:fig1}}}') in result
+ assert ('\\hyperref[\\detokenize{foo:foo}]{Sect.\\ref{\\detokenize{foo:foo}} '
+ '\\nameref{\\detokenize{foo:foo}}}') in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert '\\@iden{\\renewcommand{\\figurename}{図 }}' in result
+ assert '\\@iden{\\renewcommand{\\tablename}{表 }}' in result
+ assert '\\@iden{\\renewcommand{\\literalblockname}{リスト}}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-numfig')
+def test_latex_obey_numfig_is_false(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'SphinxManual.tex').read_text(encoding='utf8')
+ assert '\\usepackage{sphinx}' in result
+
+ result = (app.outdir / 'SphinxHowTo.tex').read_text(encoding='utf8')
+ assert '\\usepackage{sphinx}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-numfig',
+ confoverrides={'numfig': True, 'numfig_secnum_depth': 0})
+def test_latex_obey_numfig_secnum_depth_is_zero(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'SphinxManual.tex').read_text(encoding='utf8')
+ assert '\\usepackage[,nonumfigreset,mathnumfig]{sphinx}' in result
+
+ result = (app.outdir / 'SphinxHowTo.tex').read_text(encoding='utf8')
+ assert '\\usepackage[,nonumfigreset,mathnumfig]{sphinx}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-numfig',
+ confoverrides={'numfig': True, 'numfig_secnum_depth': 2})
+def test_latex_obey_numfig_secnum_depth_is_two(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'SphinxManual.tex').read_text(encoding='utf8')
+ assert '\\usepackage[,numfigreset=2,mathnumfig]{sphinx}' in result
+
+ result = (app.outdir / 'SphinxHowTo.tex').read_text(encoding='utf8')
+ assert '\\usepackage[,numfigreset=3,mathnumfig]{sphinx}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-numfig',
+ confoverrides={'numfig': True, 'math_numfig': False})
+def test_latex_obey_numfig_but_math_numfig_false(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'SphinxManual.tex').read_text(encoding='utf8')
+ assert '\\usepackage[,numfigreset=1]{sphinx}' in result
+
+ result = (app.outdir / 'SphinxHowTo.tex').read_text(encoding='utf8')
+ assert '\\usepackage[,numfigreset=2]{sphinx}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic')
+def test_latex_add_latex_package(app, status, warning):
+ app.add_latex_package('foo')
+ app.add_latex_package('bar', 'baz')
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ assert '\\usepackage{foo}' in result
+ assert '\\usepackage[baz]{bar}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-babel')
+def test_babel_with_no_language_settings(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,english]{sphinxmanual}' in result
+ assert '\\usepackage{babel}' in result
+ assert '\\usepackage{tgtermes}' in result
+ assert '\\usepackage[Bjarne]{fncychap}' in result
+ assert ('\\addto\\captionsenglish{\\renewcommand{\\contentsname}{Table of content}}\n'
+ in result)
+ assert '\\shorthandoff{"}' in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{page}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\tablename}{Table.\@{} }}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-babel',
+ confoverrides={'language': 'de'})
+def test_babel_with_language_de(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,ngerman]{sphinxmanual}' in result
+ assert '\\usepackage{babel}' in result
+ assert '\\usepackage{tgtermes}' in result
+ assert '\\usepackage[Sonny]{fncychap}' in result
+ assert ('\\addto\\captionsngerman{\\renewcommand{\\contentsname}{Table of content}}\n'
+ in result)
+ assert '\\shorthandoff{"}' in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{Seite}' in result
+ assert r'\addto\captionsngerman{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsngerman{\renewcommand{\tablename}{Table.\@{} }}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-babel',
+ confoverrides={'language': 'ru'})
+def test_babel_with_language_ru(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,russian]{sphinxmanual}' in result
+ assert '\\usepackage{babel}' in result
+ assert '\\usepackage{tgtermes}' not in result
+ assert '\\usepackage[Sonny]{fncychap}' in result
+ assert ('\\addto\\captionsrussian{\\renewcommand{\\contentsname}{Table of content}}\n'
+ in result)
+ assert '\\shorthandoff{"}' in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{Ñтраница}' in result
+ assert r'\addto\captionsrussian{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsrussian{\renewcommand{\tablename}{Table.\@{} }}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-babel',
+ confoverrides={'language': 'tr'})
+def test_babel_with_language_tr(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,turkish]{sphinxmanual}' in result
+ assert '\\usepackage{babel}' in result
+ assert '\\usepackage{tgtermes}' in result
+ assert '\\usepackage[Sonny]{fncychap}' in result
+ assert ('\\addto\\captionsturkish{\\renewcommand{\\contentsname}{Table of content}}\n'
+ in result)
+ assert '\\shorthandoff{=}' in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{sayfa}' in result
+ assert r'\addto\captionsturkish{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsturkish{\renewcommand{\tablename}{Table.\@{} }}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-babel',
+ confoverrides={'language': 'ja'})
+def test_babel_with_language_ja(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,dvipdfmx]{sphinxmanual}' in result
+ assert '\\usepackage{babel}' not in result
+ assert '\\usepackage{tgtermes}' in result
+ assert '\\usepackage[Sonny]{fncychap}' not in result
+ assert '\\renewcommand{\\contentsname}{Table of content}\n' in result
+ assert '\\shorthandoff' not in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{ページ}' in result
+ assert '\\@iden{\\renewcommand{\\figurename}{Fig.\\@{} }}' in result
+ assert '\\@iden{\\renewcommand{\\tablename}{Table.\\@{} }}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-babel',
+ confoverrides={'language': 'unknown'})
+def test_babel_with_unknown_language(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,english]{sphinxmanual}' in result
+ assert '\\usepackage{babel}' in result
+ assert '\\usepackage{tgtermes}' in result
+ assert '\\usepackage[Sonny]{fncychap}' in result
+ assert ('\\addto\\captionsenglish{\\renewcommand{\\contentsname}{Table of content}}\n'
+ in result)
+ assert '\\shorthandoff' in result
+
+ assert "WARNING: no Babel option known for language 'unknown'" in warning.getvalue()
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{page}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsenglish{\renewcommand{\tablename}{Table.\@{} }}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-babel',
+ confoverrides={'language': 'de', 'latex_engine': 'lualatex'})
+def test_polyglossia_with_language_de(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,german]{sphinxmanual}' in result
+ assert '\\usepackage{polyglossia}' in result
+ assert '\\setmainlanguage[spelling=new]{german}' in result
+ assert '\\usepackage{tgtermes}' not in result
+ assert '\\usepackage[Sonny]{fncychap}' in result
+ assert ('\\addto\\captionsgerman{\\renewcommand{\\contentsname}{Table of content}}\n'
+ in result)
+ assert '\\shorthandoff' not in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{Seite}' in result
+ assert r'\addto\captionsgerman{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsgerman{\renewcommand{\tablename}{Table.\@{} }}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='latex-babel',
+ confoverrides={'language': 'de-1901', 'latex_engine': 'lualatex'})
+def test_polyglossia_with_language_de_1901(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\documentclass[letterpaper,10pt,german]{sphinxmanual}' in result
+ assert '\\usepackage{polyglossia}' in result
+ assert '\\setmainlanguage[spelling=old]{german}' in result
+ assert '\\usepackage{tgtermes}' not in result
+ assert '\\usepackage[Sonny]{fncychap}' in result
+ assert ('\\addto\\captionsgerman{\\renewcommand{\\contentsname}{Table of content}}\n'
+ in result)
+ assert '\\shorthandoff' not in result
+
+ # sphinxmessages.sty
+ result = (app.outdir / 'sphinxmessages.sty').read_text(encoding='utf8')
+ print(result)
+ assert r'\def\pageautorefname{page}' in result
+ assert r'\addto\captionsgerman{\renewcommand{\figurename}{Fig.\@{} }}' in result
+ assert r'\addto\captionsgerman{\renewcommand{\tablename}{Table.\@{} }}' in result
+
+
+@pytest.mark.sphinx('latex')
+def test_footnote(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'sphinxtests.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('\\sphinxAtStartPar\n%\n\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'numbered\n%\n\\end{footnote}') in result
+ assert ('\\begin{footnote}[2]\\sphinxAtStartFootnote\nauto numbered\n%\n'
+ '\\end{footnote}') in result
+ assert '\\begin{footnote}[3]\\sphinxAtStartFootnote\nnamed\n%\n\\end{footnote}' in result
+ assert '\\sphinxcite{footnote:bar}' in result
+ assert ('\\bibitem[bar]{footnote:bar}\n\\sphinxAtStartPar\ncite\n') in result
+ assert '\\sphinxcaption{Table caption \\sphinxfootnotemark[4]' in result
+ assert ('\\sphinxmidrule\n\\sphinxtableatstartofbodyhook%\n'
+ '\\begin{footnotetext}[4]\\sphinxAtStartFootnote\n'
+ 'footnote in table caption\n%\n\\end{footnotetext}\\ignorespaces %\n'
+ '\\begin{footnotetext}[5]\\sphinxAtStartFootnote\n'
+ 'footnote in table header\n%\n\\end{footnotetext}\\ignorespaces '
+ '\n\\sphinxAtStartPar\n'
+ 'VIDIOC\\_CROPCAP\n&\n\\sphinxAtStartPar\n') in result
+ assert ('Information about VIDIOC\\_CROPCAP %\n'
+ '\\begin{footnote}[6]\\sphinxAtStartFootnote\n'
+ 'footnote in table not in header\n%\n\\end{footnote}\n\\\\\n'
+ '\\sphinxbottomrule\n\\end{tabulary}\n'
+ '\\sphinxtableafterendhook\\par\n\\sphinxattableend\\end{savenotes}\n') in result
+
+
+@pytest.mark.sphinx('latex', testroot='footnotes')
+def test_reference_in_caption_and_codeblock_in_footnote(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('\\caption{This is the figure caption with a reference to '
+ '\\sphinxcite{index:authoryear}.}' in result)
+ assert '\\chapter{The section with a reference to {[}AuthorYear{]}}' in result
+ assert ('\\sphinxcaption{The table title with a reference'
+ ' to {[}AuthorYear{]}}' in result)
+ assert '\\subsubsection*{The rubric title with a reference to {[}AuthorYear{]}}' in result
+ assert ('\\chapter{The section with a reference to \\sphinxfootnotemark[6]}\n'
+ '\\label{\\detokenize{index:the-section-with-a-reference-to}}'
+ '%\n\\begin{footnotetext}[6]\\sphinxAtStartFootnote\n'
+ 'Footnote in section\n%\n\\end{footnotetext}') in result
+ assert ('\\caption{This is the figure caption with a footnote to '
+ '\\sphinxfootnotemark[8].}\\label{\\detokenize{index:id35}}\\end{figure}\n'
+ '%\n\\begin{footnotetext}[8]\\sphinxAtStartFootnote\n'
+ 'Footnote in caption\n%\n\\end{footnotetext}') in result
+ assert ('\\sphinxcaption{footnote \\sphinxfootnotemark[9] in '
+ 'caption of normal table}\\label{\\detokenize{index:id36}}') in result
+ assert ('\\caption{footnote \\sphinxfootnotemark[10] '
+ 'in caption \\sphinxfootnotemark[11] of longtable\\strut}') in result
+ assert ('\\endlastfoot\n\\sphinxtableatstartofbodyhook\n%\n'
+ '\\begin{footnotetext}[10]\\sphinxAtStartFootnote\n'
+ 'Foot note in longtable\n%\n\\end{footnotetext}\\ignorespaces %\n'
+ '\\begin{footnotetext}[11]\\sphinxAtStartFootnote\n'
+ 'Second footnote in caption of longtable\n') in result
+ assert ('This is a reference to the code\\sphinxhyphen{}block in the footnote:\n'
+ '{\\hyperref[\\detokenize{index:codeblockinfootnote}]'
+ '{\\sphinxcrossref{\\DUrole{std,std-ref}{I am in a footnote}}}}') in result
+ assert ('&\n\\sphinxAtStartPar\nThis is one more footnote with some code in it %\n'
+ '\\begin{footnote}[12]\\sphinxAtStartFootnote\n'
+ 'Third footnote in longtable\n') in result
+ assert ('\\end{sphinxVerbatim}\n%\n\\end{footnote}.\n') in result
+ assert '\\begin{sphinxVerbatim}[commandchars=\\\\\\{\\}]' in result
+
+
+@pytest.mark.sphinx('latex', testroot='footnotes')
+def test_footnote_referred_multiple_times(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+
+ assert ('Explicitly numbered footnote: %\n'
+ '\\begin{footnote}[100]'
+ '\\sphinxAtStartFootnote\nNumbered footnote\n%\n'
+ '\\end{footnote} \\sphinxfootnotemark[100]\n'
+ in result)
+ assert ('Named footnote: %\n'
+ '\\begin{footnote}[13]'
+ '\\sphinxAtStartFootnote\nNamed footnote\n%\n'
+ '\\end{footnote} \\sphinxfootnotemark[13]\n'
+ in result)
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='footnotes',
+ confoverrides={'latex_show_urls': 'inline'})
+def test_latex_show_urls_is_inline(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('Same footnote number %\n'
+ '\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'footnote in bar\n%\n\\end{footnote} in bar.rst') in result
+ assert ('Auto footnote number %\n\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'footnote in baz\n%\n\\end{footnote} in baz.rst') in result
+ assert ('\\phantomsection\\label{\\detokenize{index:id38}}'
+ '{\\hyperref[\\detokenize{index:the-section'
+ '-with-a-reference-to-authoryear}]'
+ '{\\sphinxcrossref{The section with a reference to '
+ '\\sphinxcite{index:authoryear}}}}') in result
+ assert ('\\phantomsection\\label{\\detokenize{index:id39}}'
+ '{\\hyperref[\\detokenize{index:the-section-with-a-reference-to}]'
+ '{\\sphinxcrossref{The section with a reference to }}}' in result)
+ assert ('First footnote: %\n\\begin{footnote}[2]\\sphinxAtStartFootnote\n'
+ 'First\n%\n\\end{footnote}') in result
+ assert ('Second footnote: %\n'
+ '\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'Second\n%\n\\end{footnote}\n') in result
+ assert '\\sphinxhref{http://sphinx-doc.org/}{Sphinx} (http://sphinx\\sphinxhyphen{}doc.org/)' in result
+ assert ('Third footnote: %\n\\begin{footnote}[3]\\sphinxAtStartFootnote\n'
+ 'Third \\sphinxfootnotemark[4]\n%\n\\end{footnote}%\n'
+ '\\begin{footnotetext}[4]\\sphinxAtStartFootnote\n'
+ 'Footnote inside footnote\n%\n\\end{footnotetext}\\ignorespaces') in result
+ assert ('Fourth footnote: %\n\\begin{footnote}[5]\\sphinxAtStartFootnote\n'
+ 'Fourth\n%\n\\end{footnote}\n') in result
+ assert ('\\sphinxhref{http://sphinx-doc.org/~test/}{URL including tilde} '
+ '(http://sphinx\\sphinxhyphen{}doc.org/\\textasciitilde{}test/)') in result
+ assert ('\\sphinxlineitem{\\sphinxhref{http://sphinx-doc.org/}{URL in term} '
+ '(http://sphinx\\sphinxhyphen{}doc.org/)}\n'
+ '\\sphinxAtStartPar\nDescription' in result)
+ assert ('\\sphinxlineitem{Footnote in term \\sphinxfootnotemark[7]}%\n'
+ '\\begin{footnotetext}[7]\\sphinxAtStartFootnote\n' in result)
+ assert ('\\sphinxlineitem{\\sphinxhref{http://sphinx-doc.org/}{URL in term} '
+ '(http://sphinx\\sphinxhyphen{}doc.org/)}\n'
+ '\\sphinxAtStartPar\nDescription' in result)
+ assert ('\\sphinxlineitem{Footnote in term \\sphinxfootnotemark[7]}%\n'
+ '\\begin{footnotetext}[7]\\sphinxAtStartFootnote\n'
+ 'Footnote in term\n%\n\\end{footnotetext}\\ignorespaces '
+ '\n\\sphinxAtStartPar\nDescription') in result
+ assert ('\\sphinxlineitem{\\sphinxhref{http://sphinx-doc.org/}{Term in deflist} '
+ '(http://sphinx\\sphinxhyphen{}doc.org/)}'
+ '\n\\sphinxAtStartPar\nDescription') in result
+ assert '\\sphinxurl{https://github.com/sphinx-doc/sphinx}\n' in result
+ assert ('\\sphinxhref{mailto:sphinx-dev@googlegroups.com}'
+ '{sphinx\\sphinxhyphen{}dev@googlegroups.com}') in result
+ assert '\\begin{savenotes}\\begin{fulllineitems}' not in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='footnotes',
+ confoverrides={'latex_show_urls': 'footnote'})
+def test_latex_show_urls_is_footnote(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('Same footnote number %\n'
+ '\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'footnote in bar\n%\n\\end{footnote} in bar.rst') in result
+ assert ('Auto footnote number %\n\\begin{footnote}[2]\\sphinxAtStartFootnote\n'
+ 'footnote in baz\n%\n\\end{footnote} in baz.rst') in result
+ assert ('\\phantomsection\\label{\\detokenize{index:id38}}'
+ '{\\hyperref[\\detokenize{index:the-section-with-a-reference-to-authoryear}]'
+ '{\\sphinxcrossref{The section with a reference '
+ 'to \\sphinxcite{index:authoryear}}}}') in result
+ assert ('\\phantomsection\\label{\\detokenize{index:id39}}'
+ '{\\hyperref[\\detokenize{index:the-section-with-a-reference-to}]'
+ '{\\sphinxcrossref{The section with a reference to }}}') in result
+ assert ('First footnote: %\n\\begin{footnote}[3]\\sphinxAtStartFootnote\n'
+ 'First\n%\n\\end{footnote}') in result
+ assert ('Second footnote: %\n'
+ '\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'Second\n%\n\\end{footnote}') in result
+ assert ('\\sphinxhref{http://sphinx-doc.org/}{Sphinx}'
+ '%\n\\begin{footnote}[4]\\sphinxAtStartFootnote\n'
+ '\\sphinxnolinkurl{http://sphinx-doc.org/}\n%\n\\end{footnote}') in result
+ assert ('Third footnote: %\n\\begin{footnote}[6]\\sphinxAtStartFootnote\n'
+ 'Third \\sphinxfootnotemark[7]\n%\n\\end{footnote}%\n'
+ '\\begin{footnotetext}[7]\\sphinxAtStartFootnote\n'
+ 'Footnote inside footnote\n%\n'
+ '\\end{footnotetext}\\ignorespaces') in result
+ assert ('Fourth footnote: %\n\\begin{footnote}[8]\\sphinxAtStartFootnote\n'
+ 'Fourth\n%\n\\end{footnote}\n') in result
+ assert ('\\sphinxhref{http://sphinx-doc.org/~test/}{URL including tilde}'
+ '%\n\\begin{footnote}[5]\\sphinxAtStartFootnote\n'
+ '\\sphinxnolinkurl{http://sphinx-doc.org/~test/}\n%\n\\end{footnote}') in result
+ assert ('\\sphinxlineitem{\\sphinxhref{http://sphinx-doc.org/}'
+ '{URL in term}\\sphinxfootnotemark[10]}%\n'
+ '\\begin{footnotetext}[10]'
+ '\\sphinxAtStartFootnote\n'
+ '\\sphinxnolinkurl{http://sphinx-doc.org/}\n%\n'
+ '\\end{footnotetext}\\ignorespaces \n\\sphinxAtStartPar\nDescription') in result
+ assert ('\\sphinxlineitem{Footnote in term \\sphinxfootnotemark[12]}%\n'
+ '\\begin{footnotetext}[12]'
+ '\\sphinxAtStartFootnote\n'
+ 'Footnote in term\n%\n\\end{footnotetext}\\ignorespaces '
+ '\n\\sphinxAtStartPar\nDescription') in result
+ assert ('\\sphinxlineitem{\\sphinxhref{http://sphinx-doc.org/}{Term in deflist}'
+ '\\sphinxfootnotemark[11]}%\n'
+ '\\begin{footnotetext}[11]'
+ '\\sphinxAtStartFootnote\n'
+ '\\sphinxnolinkurl{http://sphinx-doc.org/}\n%\n'
+ '\\end{footnotetext}\\ignorespaces \n\\sphinxAtStartPar\nDescription') in result
+ assert ('\\sphinxurl{https://github.com/sphinx-doc/sphinx}\n' in result)
+ assert ('\\sphinxhref{mailto:sphinx-dev@googlegroups.com}'
+ '{sphinx\\sphinxhyphen{}dev@googlegroups.com}\n') in result
+ assert '\\begin{savenotes}\\begin{fulllineitems}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='footnotes',
+ confoverrides={'latex_show_urls': 'no'})
+def test_latex_show_urls_is_no(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('Same footnote number %\n'
+ '\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'footnote in bar\n%\n\\end{footnote} in bar.rst') in result
+ assert ('Auto footnote number %\n\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'footnote in baz\n%\n\\end{footnote} in baz.rst') in result
+ assert ('\\phantomsection\\label{\\detokenize{index:id38}}'
+ '{\\hyperref[\\detokenize{index:the-section-with-a-reference-to-authoryear}]'
+ '{\\sphinxcrossref{The section with a reference '
+ 'to \\sphinxcite{index:authoryear}}}}') in result
+ assert ('\\phantomsection\\label{\\detokenize{index:id39}}'
+ '{\\hyperref[\\detokenize{index:the-section-with-a-reference-to}]'
+ '{\\sphinxcrossref{The section with a reference to }}}' in result)
+ assert ('First footnote: %\n\\begin{footnote}[2]\\sphinxAtStartFootnote\n'
+ 'First\n%\n\\end{footnote}') in result
+ assert ('Second footnote: %\n'
+ '\\begin{footnote}[1]\\sphinxAtStartFootnote\n'
+ 'Second\n%\n\\end{footnote}') in result
+ assert '\\sphinxhref{http://sphinx-doc.org/}{Sphinx}' in result
+ assert ('Third footnote: %\n\\begin{footnote}[3]\\sphinxAtStartFootnote\n'
+ 'Third \\sphinxfootnotemark[4]\n%\n\\end{footnote}%\n'
+ '\\begin{footnotetext}[4]\\sphinxAtStartFootnote\n'
+ 'Footnote inside footnote\n%\n\\end{footnotetext}\\ignorespaces') in result
+ assert ('Fourth footnote: %\n\\begin{footnote}[5]\\sphinxAtStartFootnote\n'
+ 'Fourth\n%\n\\end{footnote}\n') in result
+ assert '\\sphinxhref{http://sphinx-doc.org/~test/}{URL including tilde}' in result
+ assert ('\\sphinxlineitem{\\sphinxhref{http://sphinx-doc.org/}{URL in term}}\n'
+ '\\sphinxAtStartPar\nDescription') in result
+ assert ('\\sphinxlineitem{Footnote in term \\sphinxfootnotemark[7]}%\n'
+ '\\begin{footnotetext}[7]\\sphinxAtStartFootnote\n'
+ 'Footnote in term\n%\n\\end{footnotetext}\\ignorespaces '
+ '\n\\sphinxAtStartPar\nDescription') in result
+ assert ('\\sphinxlineitem{\\sphinxhref{http://sphinx-doc.org/}{Term in deflist}}'
+ '\n\\sphinxAtStartPar\nDescription') in result
+ assert ('\\sphinxurl{https://github.com/sphinx-doc/sphinx}\n' in result)
+ assert ('\\sphinxhref{mailto:sphinx-dev@googlegroups.com}'
+ '{sphinx\\sphinxhyphen{}dev@googlegroups.com}\n') in result
+ assert '\\begin{savenotes}\\begin{fulllineitems}' not in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='footnotes',
+ confoverrides={'latex_show_urls': 'footnote',
+ 'rst_prolog': '.. |URL| replace:: `text <http://www.example.com/>`__'})
+def test_latex_show_urls_footnote_and_substitutions(app, status, warning):
+ # hyperlinks in substitutions should not effect to make footnotes (refs: #4784)
+ test_latex_show_urls_is_footnote(app, status, warning)
+
+
+@pytest.mark.sphinx('latex', testroot='image-in-section')
+def test_image_in_section(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert ('\\chapter[Test section]{\\lowercase{\\sphinxincludegraphics'
+ '[width=15bp,height=15bp]}{{pic}.png} Test section}'
+ in result)
+ assert ('\\chapter[Other {[}blah{]} section]{Other {[}blah{]} '
+ '\\lowercase{\\sphinxincludegraphics[width=15bp,height=15bp]}'
+ '{{pic}.png} section}' in result)
+ assert ('\\chapter{Another section}' in result)
+
+
+@pytest.mark.sphinx('latex', testroot='basic',
+ confoverrides={'latex_logo': 'notfound.jpg'})
+def test_latex_logo_if_not_found(app, status, warning):
+ with pytest.raises(SphinxError):
+ app.builder.build_all()
+
+
+@pytest.mark.sphinx('latex', testroot='toctree-maxdepth')
+def test_toctree_maxdepth_manual(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\setcounter{tocdepth}{1}' in result
+ assert '\\setcounter{secnumdepth}' not in result
+ assert '\\chapter{Foo}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'latex_documents': [
+ ('index', 'python.tex', 'Sphinx Tests Documentation',
+ 'Georg Brandl', 'howto'),
+ ]})
+def test_toctree_maxdepth_howto(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\setcounter{tocdepth}{2}' in result
+ assert '\\setcounter{secnumdepth}' not in result
+ assert '\\section{Foo}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'root_doc': 'foo'})
+def test_toctree_not_found(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\setcounter{tocdepth}' not in result
+ assert '\\setcounter{secnumdepth}' not in result
+ assert '\\chapter{Foo A}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'root_doc': 'bar'})
+def test_toctree_without_maxdepth(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\setcounter{tocdepth}' not in result
+ assert '\\setcounter{secnumdepth}' not in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'root_doc': 'qux'})
+def test_toctree_with_deeper_maxdepth(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\setcounter{tocdepth}{3}' in result
+ assert '\\setcounter{secnumdepth}{3}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'latex_toplevel_sectioning': None})
+def test_latex_toplevel_sectioning_is_None(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\chapter{Foo}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'latex_toplevel_sectioning': 'part'})
+def test_latex_toplevel_sectioning_is_part(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\part{Foo}' in result
+ assert '\\chapter{Foo A}' in result
+ assert '\\chapter{Foo B}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'latex_toplevel_sectioning': 'part',
+ 'latex_documents': [
+ ('index', 'python.tex', 'Sphinx Tests Documentation',
+ 'Georg Brandl', 'howto'),
+ ]})
+def test_latex_toplevel_sectioning_is_part_with_howto(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\part{Foo}' in result
+ assert '\\section{Foo A}' in result
+ assert '\\section{Foo B}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'latex_toplevel_sectioning': 'chapter'})
+def test_latex_toplevel_sectioning_is_chapter(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\chapter{Foo}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'latex_toplevel_sectioning': 'chapter',
+ 'latex_documents': [
+ ('index', 'python.tex', 'Sphinx Tests Documentation',
+ 'Georg Brandl', 'howto'),
+ ]})
+def test_latex_toplevel_sectioning_is_chapter_with_howto(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\section{Foo}' in result
+
+
+@pytest.mark.sphinx(
+ 'latex', testroot='toctree-maxdepth',
+ confoverrides={'latex_toplevel_sectioning': 'section'})
+def test_latex_toplevel_sectioning_is_section(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert '\\section{Foo}' in result
+
+
+@skip_if_stylefiles_notfound
+@pytest.mark.sphinx('latex', testroot='maxlistdepth')
+def test_maxlistdepth_at_ten(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ print(status.getvalue())
+ print(warning.getvalue())
+ compile_latex_document(app, 'python.tex')
+
+
+@pytest.mark.sphinx('latex', testroot='latex-table',
+ confoverrides={'latex_table_style': []})
+@pytest.mark.test_params(shared_result='latex-table')
+def test_latex_table_tabulars(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ tables = {}
+ for chap in re.split(r'\\(?:section|chapter){', result)[1:]:
+ sectname, content = chap.split('}', 1)
+ content = re.sub(r'\\sphinxstepscope', '', content) # filter a separator
+ tables[sectname] = content.strip()
+
+ def get_expected(name):
+ return (app.srcdir / 'expects' / (name + '.tex')).read_text(encoding='utf8').strip()
+
+ # simple_table
+ actual = tables['simple table']
+ expected = get_expected('simple_table')
+ assert actual == expected
+
+ # table having :widths: option
+ actual = tables['table having :widths: option']
+ expected = get_expected('table_having_widths')
+ assert actual == expected
+
+ # table having :align: option (tabulary)
+ actual = tables['table having :align: option (tabulary)']
+ expected = get_expected('tabulary_having_widths')
+ assert actual == expected
+
+ # table having :align: option (tabular)
+ actual = tables['table having :align: option (tabular)']
+ expected = get_expected('tabular_having_widths')
+ assert actual == expected
+
+ # table with tabularcolumn
+ actual = tables['table with tabularcolumn']
+ expected = get_expected('tabularcolumn')
+ assert actual == expected
+
+ # table with cell in first column having three paragraphs
+ actual = tables['table with cell in first column having three paragraphs']
+ expected = get_expected('table_having_threeparagraphs_cell_in_first_col')
+ assert actual == expected
+
+ # table having caption
+ actual = tables['table having caption']
+ expected = get_expected('table_having_caption')
+ assert actual == expected
+
+ # table having verbatim
+ actual = tables['table having verbatim']
+ expected = get_expected('table_having_verbatim')
+ assert actual == expected
+
+ # table having problematic cell
+ actual = tables['table having problematic cell']
+ expected = get_expected('table_having_problematic_cell')
+ assert actual == expected
+
+ # table having both :widths: and problematic cell
+ actual = tables['table having both :widths: and problematic cell']
+ expected = get_expected('table_having_widths_and_problematic_cell')
+ assert actual == expected
+
+ # table having both stub columns and problematic cell
+ actual = tables['table having both stub columns and problematic cell']
+ expected = get_expected('table_having_stub_columns_and_problematic_cell')
+ assert actual == expected
+
+
+@pytest.mark.sphinx('latex', testroot='latex-table',
+ confoverrides={'latex_table_style': []})
+@pytest.mark.test_params(shared_result='latex-table')
+def test_latex_table_longtable(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ tables = {}
+ for chap in re.split(r'\\(?:section|chapter){', result)[1:]:
+ sectname, content = chap.split('}', 1)
+ content = re.sub(r'\\sphinxstepscope', '', content) # filter a separator
+ tables[sectname] = content.strip()
+
+ def get_expected(name):
+ return (app.srcdir / 'expects' / (name + '.tex')).read_text(encoding='utf8').strip()
+
+ # longtable
+ actual = tables['longtable']
+ expected = get_expected('longtable')
+ assert actual == expected
+
+ # longtable having :widths: option
+ actual = tables['longtable having :widths: option']
+ expected = get_expected('longtable_having_widths')
+ assert actual == expected
+
+ # longtable having :align: option
+ actual = tables['longtable having :align: option']
+ expected = get_expected('longtable_having_align')
+ assert actual == expected
+
+ # longtable with tabularcolumn
+ actual = tables['longtable with tabularcolumn']
+ expected = get_expected('longtable_with_tabularcolumn')
+ assert actual == expected
+
+ # longtable having caption
+ actual = tables['longtable having caption']
+ expected = get_expected('longtable_having_caption')
+ assert actual == expected
+
+ # longtable having verbatim
+ actual = tables['longtable having verbatim']
+ expected = get_expected('longtable_having_verbatim')
+ assert actual == expected
+
+ # longtable having problematic cell
+ actual = tables['longtable having problematic cell']
+ expected = get_expected('longtable_having_problematic_cell')
+ assert actual == expected
+
+ # longtable having both :widths: and problematic cell
+ actual = tables['longtable having both :widths: and problematic cell']
+ expected = get_expected('longtable_having_widths_and_problematic_cell')
+ assert actual == expected
+
+ # longtable having both stub columns and problematic cell
+ actual = tables['longtable having both stub columns and problematic cell']
+ expected = get_expected('longtable_having_stub_columns_and_problematic_cell')
+ assert actual == expected
+
+
+@pytest.mark.sphinx('latex', testroot='latex-table',
+ confoverrides={'latex_table_style': []})
+@pytest.mark.test_params(shared_result='latex-table')
+def test_latex_table_complex_tables(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ tables = {}
+ for chap in re.split(r'\\(?:section|renewcommand){', result)[1:]:
+ sectname, content = chap.split('}', 1)
+ tables[sectname] = content.strip()
+
+ def get_expected(name):
+ return (app.srcdir / 'expects' / (name + '.tex')).read_text(encoding='utf8').strip()
+
+ # grid table
+ actual = tables['grid table']
+ expected = get_expected('gridtable')
+ assert actual == expected
+
+ # grid table with tabularcolumns
+ # MEMO: filename should end with tabularcolumns but tabularcolumn has been
+ # used in existing other cases
+ actual = tables['grid table with tabularcolumns having no vline']
+ expected = get_expected('gridtable_with_tabularcolumn')
+ assert actual == expected
+
+ # complex spanning cell
+ actual = tables['complex spanning cell']
+ expected = get_expected('complex_spanning_cell')
+ assert actual == expected
+
+
+@pytest.mark.sphinx('latex', testroot='latex-table')
+def test_latex_table_with_booktabs_and_colorrows(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert r'\PassOptionsToPackage{booktabs}{sphinx}' in result
+ assert r'\PassOptionsToPackage{colorrows}{sphinx}' in result
+ # tabularcolumns
+ assert r'\begin{longtable}{|c|c|}' in result
+ # class: standard
+ assert r'\begin{tabulary}{\linewidth}[t]{|T|T|T|T|T|}' in result
+ assert r'\begin{longtable}{ll}' in result
+ assert r'\begin{tabular}[t]{*{2}{\X{1}{2}}}' in result
+ assert r'\begin{tabular}[t]{\X{30}{100}\X{70}{100}}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-table',
+ confoverrides={'templates_path': ['_mytemplates/latex']})
+def test_latex_table_custom_template_caseA(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert 'SALUT LES COPAINS' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-table',
+ confoverrides={'templates_path': ['_mytemplates']})
+def test_latex_table_custom_template_caseB(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert 'SALUT LES COPAINS' not in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-table')
+@pytest.mark.test_params(shared_result='latex-table')
+def test_latex_table_custom_template_caseC(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert 'SALUT LES COPAINS' not in result
+
+
+@pytest.mark.sphinx('latex', testroot='directives-raw')
+def test_latex_raw_directive(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ # standard case
+ assert 'standalone raw directive (HTML)' not in result
+ assert ('\\label{\\detokenize{index:id1}}\n'
+ 'standalone raw directive (LaTeX)' in result)
+
+ # with substitution
+ assert 'HTML: abc ghi' in result
+ assert 'LaTeX: abc def ghi' in result
+
+
+@pytest.mark.sphinx('latex', testroot='images')
+def test_latex_images(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ # images are copied
+ assert '\\sphinxincludegraphics{{python-logo}.png}' in result
+ assert (app.outdir / 'python-logo.png').exists()
+
+ # not found images
+ assert '\\sphinxincludegraphics{{NOT_EXIST}.PNG}' not in result
+ assert ('WARNING: Could not fetch remote image: '
+ 'https://www.google.com/NOT_EXIST.PNG [404]' in warning.getvalue())
+
+ # an image having target
+ assert ('\\sphinxhref{https://www.sphinx-doc.org/}'
+ '{\\sphinxincludegraphics{{rimg}.png}}\n\n' in result)
+
+ # a centerized image having target
+ assert ('\\sphinxhref{https://www.python.org/}{{\\hspace*{\\fill}'
+ '\\sphinxincludegraphics{{rimg}.png}\\hspace*{\\fill}}}\n\n' in result)
+
+
+@pytest.mark.sphinx('latex', testroot='latex-index')
+def test_latex_index(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert ('A \\index{famous@\\spxentry{famous}}famous '
+ '\\index{equation@\\spxentry{equation}}equation:\n' in result)
+ assert ('\n\\index{Einstein@\\spxentry{Einstein}}'
+ '\\index{relativity@\\spxentry{relativity}}'
+ '\\ignorespaces \n\\sphinxAtStartPar\nand') in result
+ assert ('\n\\index{main \\sphinxleftcurlybrace{}@\\spxentry{'
+ 'main \\sphinxleftcurlybrace{}}}\\ignorespaces ' in result)
+
+
+@pytest.mark.sphinx('latex', testroot='latex-equations')
+def test_latex_equations(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ expected = (app.srcdir / 'expects' / 'latex-equations.tex').read_text(encoding='utf8').strip()
+
+ assert expected in result
+
+
+@pytest.mark.sphinx('latex', testroot='image-in-parsed-literal')
+def test_latex_image_in_parsed_literal(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert ('{\\sphinxunactivateextrasandspace \\raisebox{-0.5\\height}'
+ '{\\sphinxincludegraphics[height=2.00000cm]{{pic}.png}}'
+ '}AFTER') in result
+
+
+@pytest.mark.sphinx('latex', testroot='nested-enumerated-list')
+def test_latex_nested_enumerated_list(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert ('\\sphinxsetlistlabels{\\arabic}{enumi}{enumii}{}{.}%\n'
+ '\\setcounter{enumi}{4}\n' in result)
+ assert ('\\sphinxsetlistlabels{\\alph}{enumii}{enumiii}{}{.}%\n'
+ '\\setcounter{enumii}{3}\n' in result)
+ assert ('\\sphinxsetlistlabels{\\arabic}{enumiii}{enumiv}{}{)}%\n'
+ '\\setcounter{enumiii}{9}\n' in result)
+ assert ('\\sphinxsetlistlabels{\\arabic}{enumiv}{enumv}{(}{)}%\n'
+ '\\setcounter{enumiv}{23}\n' in result)
+ assert ('\\sphinxsetlistlabels{\\roman}{enumii}{enumiii}{}{.}%\n'
+ '\\setcounter{enumii}{2}\n' in result)
+
+
+@pytest.mark.sphinx('latex', testroot='footnotes')
+def test_latex_thebibliography(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ assert ('\\begin{sphinxthebibliography}{AuthorYe}\n'
+ '\\bibitem[AuthorYear]{index:authoryear}\n\\sphinxAtStartPar\n'
+ 'Author, Title, Year\n'
+ '\\end{sphinxthebibliography}\n' in result)
+ assert '\\sphinxcite{index:authoryear}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='glossary')
+def test_latex_glossary(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert (r'\sphinxlineitem{ähnlich\index{ähnlich@\spxentry{ähnlich}|spxpagem}'
+ r'\phantomsection'
+ r'\label{\detokenize{index:term-ahnlich}}}' in result)
+ assert (r'\sphinxlineitem{boson\index{boson@\spxentry{boson}|spxpagem}\phantomsection'
+ r'\label{\detokenize{index:term-boson}}}' in result)
+ assert (r'\sphinxlineitem{\sphinxstyleemphasis{fermion}'
+ r'\index{fermion@\spxentry{fermion}|spxpagem}'
+ r'\phantomsection'
+ r'\label{\detokenize{index:term-fermion}}}' in result)
+ assert (r'\sphinxlineitem{tauon\index{tauon@\spxentry{tauon}|spxpagem}\phantomsection'
+ r'\label{\detokenize{index:term-tauon}}}'
+ r'\sphinxlineitem{myon\index{myon@\spxentry{myon}|spxpagem}\phantomsection'
+ r'\label{\detokenize{index:term-myon}}}'
+ r'\sphinxlineitem{electron\index{electron@\spxentry{electron}|spxpagem}\phantomsection'
+ r'\label{\detokenize{index:term-electron}}}' in result)
+ assert (r'\sphinxlineitem{über\index{über@\spxentry{über}|spxpagem}\phantomsection'
+ r'\label{\detokenize{index:term-uber}}}' in result)
+
+
+@pytest.mark.sphinx('latex', testroot='latex-labels')
+def test_latex_labels(app, status, warning):
+ app.builder.build_all()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ # figures
+ assert (r'\caption{labeled figure}'
+ r'\label{\detokenize{index:id1}}'
+ r'\label{\detokenize{index:figure2}}'
+ r'\label{\detokenize{index:figure1}}'
+ r'\end{figure}' in result)
+ assert (r'\caption{labeled figure}'
+ '\\label{\\detokenize{index:figure3}}\n'
+ '\\begin{sphinxlegend}\n\\sphinxAtStartPar\n'
+ 'with a legend\n\\end{sphinxlegend}\n'
+ r'\end{figure}' in result)
+
+ # code-blocks
+ assert (r'\def\sphinxLiteralBlockLabel{'
+ r'\label{\detokenize{index:codeblock2}}'
+ r'\label{\detokenize{index:codeblock1}}}' in result)
+ assert (r'\def\sphinxLiteralBlockLabel{'
+ r'\label{\detokenize{index:codeblock3}}}' in result)
+
+ # tables
+ assert (r'\sphinxcaption{table caption}'
+ r'\label{\detokenize{index:id2}}'
+ r'\label{\detokenize{index:table2}}'
+ r'\label{\detokenize{index:table1}}' in result)
+ assert (r'\sphinxcaption{table caption}'
+ r'\label{\detokenize{index:table3}}' in result)
+
+ # sections
+ assert ('\\chapter{subsection}\n'
+ r'\label{\detokenize{index:subsection}}'
+ r'\label{\detokenize{index:section2}}'
+ r'\label{\detokenize{index:section1}}' in result)
+ assert ('\\section{subsubsection}\n'
+ r'\label{\detokenize{index:subsubsection}}'
+ r'\label{\detokenize{index:section3}}' in result)
+ assert ('\\subsection{otherdoc}\n'
+ r'\label{\detokenize{otherdoc:otherdoc}}'
+ r'\label{\detokenize{otherdoc::doc}}' in result)
+
+ # Embedded standalone hyperlink reference (refs: #5948)
+ assert result.count(r'\label{\detokenize{index:section1}}') == 1
+
+
+@pytest.mark.sphinx('latex', testroot='latex-figure-in-admonition')
+def test_latex_figure_in_admonition(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert r'\begin{figure}[H]' in result
+
+
+def test_default_latex_documents():
+ from sphinx.util import texescape
+ texescape.init()
+ config = Config({'root_doc': 'index',
+ 'project': 'STASIâ„¢ Documentation',
+ 'author': "Wolfgang Schäuble & G'Beckstein."})
+ config.init_values()
+ config.add('latex_engine', None, True, None)
+ config.add('latex_theme', 'manual', True, None)
+ expected = [('index', 'stasi.tex', 'STASIâ„¢ Documentation',
+ r"Wolfgang Schäuble \& G\textquotesingle{}Beckstein.\@{}", 'manual')]
+ assert default_latex_documents(config) == expected
+
+
+@skip_if_requested
+@skip_if_stylefiles_notfound
+@pytest.mark.sphinx('latex', testroot='latex-includegraphics')
+def test_includegraphics_oversized(app, status, warning):
+ app.builder.build_all()
+ print(status.getvalue())
+ print(warning.getvalue())
+ compile_latex_document(app)
+
+
+@pytest.mark.sphinx('latex', testroot='index_on_title')
+def test_index_on_title(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert ('\\chapter{Test for index in top level title}\n'
+ '\\label{\\detokenize{contents:test-for-index-in-top-level-title}}'
+ '\\index{index@\\spxentry{index}}\n'
+ in result)
+
+
+@pytest.mark.sphinx('latex', testroot='latex-unicode',
+ confoverrides={'latex_engine': 'pdflatex'})
+def test_texescape_for_non_unicode_supported_engine(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ assert 'script small e: e' in result
+ assert 'double struck italic small i: i' in result
+ assert r'superscript: \(\sp{\text{0}}\), \(\sp{\text{1}}\)' in result
+ assert r'subscript: \(\sb{\text{0}}\), \(\sb{\text{1}}\)' in result
+
+
+@pytest.mark.sphinx('latex', testroot='latex-unicode',
+ confoverrides={'latex_engine': 'xelatex'})
+def test_texescape_for_unicode_supported_engine(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(result)
+ assert 'script small e: e' in result
+ assert 'double struck italic small i: i' in result
+ assert 'superscript: â°, ¹' in result
+ assert 'subscript: â‚€, â‚' in result
+
+
+@pytest.mark.sphinx('latex', testroot='basic',
+ confoverrides={'latex_elements': {'extrapackages': r'\usepackage{foo}'}})
+def test_latex_elements_extrapackages(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'test.tex').read_text(encoding='utf8')
+ assert r'\usepackage{foo}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='nested-tables')
+def test_latex_nested_tables(app, status, warning):
+ app.builder.build_all()
+ assert warning.getvalue() == ''
+
+
+@pytest.mark.sphinx('latex', testroot='latex-container')
+def test_latex_container(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert r'\begin{sphinxuseclass}{classname}' in result
+ assert r'\end{sphinxuseclass}' in result
+
+
+@pytest.mark.sphinx('latex', testroot='reST-code-role')
+def test_latex_code_role(app):
+ app.build()
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ common_content = (
+ r'\PYG{k}{def} '
+ r'\PYG{n+nf}{foo}'
+ r'\PYG{p}{(}'
+ r'\PYG{l+m+mi}{1} '
+ r'\PYG{o}{+} '
+ r'\PYG{l+m+mi}{2} '
+ r'\PYG{o}{+} '
+ r'\PYG{k+kc}{None} '
+ r'\PYG{o}{+} '
+ r'\PYG{l+s+s2}{\PYGZdq{}}'
+ r'\PYG{l+s+s2}{abc}'
+ r'\PYG{l+s+s2}{\PYGZdq{}}'
+ r'\PYG{p}{)}'
+ r'\PYG{p}{:} '
+ r'\PYG{k}{pass}')
+ assert (r'Inline \sphinxcode{\sphinxupquote{%' + '\n' +
+ common_content + '%\n}} code block') in content
+ assert (r'\begin{sphinxVerbatim}[commandchars=\\\{\}]' +
+ '\n' + common_content + '\n' + r'\end{sphinxVerbatim}') in content
+
+
+@pytest.mark.sphinx('latex', testroot='images')
+def test_copy_images(app, status, warning):
+ app.build()
+
+ test_dir = Path(app.outdir)
+ images = {
+ image.name for image in test_dir.rglob('*')
+ if image.suffix in {'.gif', '.pdf', '.png', '.svg'}
+ }
+ images.discard('python-logo.png')
+ assert images == {
+ 'img.pdf',
+ 'rimg.png',
+ 'testimäge.png',
+ }
+
+
+@pytest.mark.sphinx('latex', testroot='latex-labels-before-module')
+def test_duplicated_labels_before_module(app, status, warning):
+ app.build()
+ content: str = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ def count_label(name):
+ text = r'\phantomsection\label{\detokenize{%s}}' % name
+ return content.count(text)
+
+ pattern = r'\\phantomsection\\label\{\\detokenize\{index:label-(?:auto-)?\d+[a-z]*}}'
+ # labels found in the TeX output
+ output_labels = frozenset(match.group() for match in re.finditer(pattern, content))
+ # labels that have been tested and occurring exactly once in the output
+ tested_labels = set()
+
+ # iterate over the (explicit) labels in the corresponding index.rst
+ for rst_label_name in [
+ 'label_1a', 'label_1b', 'label_2', 'label_3',
+ 'label_auto_1a', 'label_auto_1b', 'label_auto_2', 'label_auto_3',
+ ]:
+ tex_label_name = 'index:' + rst_label_name.replace('_', '-')
+ tex_label_code = r'\phantomsection\label{\detokenize{%s}}' % tex_label_name
+ assert content.count(tex_label_code) == 1, f'duplicated label: {tex_label_name!r}'
+ tested_labels.add(tex_label_code)
+
+ # ensure that we did not forget any label to check
+ # and if so, report them nicely in case of failure
+ assert sorted(tested_labels) == sorted(output_labels)
+
+
+@pytest.mark.sphinx('latex', testroot='domain-py-python_maximum_signature_line_length',
+ confoverrides={'python_maximum_signature_line_length': 23})
+def test_one_parameter_per_line(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ # TODO: should these asserts check presence or absence of a final \sphinxparamcomma?
+ # signature of 23 characters is too short to trigger one-param-per-line mark-up
+ assert ('\\pysiglinewithargsret{\\sphinxbfcode{\\sphinxupquote{hello}}}' in result)
+
+ assert ('\\pysigwithonelineperarg{\\sphinxbfcode{\\sphinxupquote{foo}}}' in result)
diff --git a/tests/test_build_linkcheck.py b/tests/test_build_linkcheck.py
new file mode 100644
index 0000000..38a0bd1
--- /dev/null
+++ b/tests/test_build_linkcheck.py
@@ -0,0 +1,989 @@
+"""Test the build process with manpage builder with the test root."""
+
+from __future__ import annotations
+
+import http.server
+import json
+import re
+import sys
+import textwrap
+import time
+import wsgiref.handlers
+from base64 import b64encode
+from os import path
+from queue import Queue
+from unittest import mock
+
+import pytest
+from urllib3.poolmanager import PoolManager
+
+import sphinx.util.http_date
+from sphinx.builders.linkcheck import (
+ CheckRequest,
+ Hyperlink,
+ HyperlinkAvailabilityCheckWorker,
+ RateLimit,
+)
+from sphinx.testing.util import strip_escseq
+from sphinx.util import requests
+from sphinx.util.console import strip_colors
+
+from .utils import CERT_FILE, http_server, https_server
+
+ts_re = re.compile(r".*\[(?P<ts>.*)\].*")
+SPHINX_DOCS_INDEX = path.abspath(path.join(__file__, "..", "roots", "test-linkcheck", "sphinx-docs-index.html"))
+
+
+class DefaultsHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def do_HEAD(self):
+ if self.path[1:].rstrip() in {"", "anchor.html"}:
+ self.send_response(200, "OK")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+ else:
+ self.send_response(404, "Not Found")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ def do_GET(self):
+ if self.path[1:].rstrip() == "":
+ content = b"ok\n\n"
+ elif self.path[1:].rstrip() == "anchor.html":
+ doc = '<!DOCTYPE html><html><body><a id="found"></a></body></html>'
+ content = doc.encode("utf-8")
+ else:
+ content = b""
+
+ if content:
+ self.send_response(200, "OK")
+ self.send_header("Content-Length", str(len(content)))
+ self.end_headers()
+ self.wfile.write(content)
+ else:
+ self.send_response(404, "Not Found")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+
+class ConnectionMeasurement:
+ """Measure the number of distinct host connections created during linkchecking"""
+
+ def __init__(self):
+ self.connections = set()
+ self.urllib3_connection_from_url = PoolManager.connection_from_url
+ self.patcher = mock.patch.object(
+ target=PoolManager,
+ attribute='connection_from_url',
+ new=self._collect_connections(),
+ )
+
+ def _collect_connections(self):
+ def connection_collector(obj, url):
+ connection = self.urllib3_connection_from_url(obj, url)
+ self.connections.add(connection)
+ return connection
+ return connection_collector
+
+ def __enter__(self):
+ self.patcher.start()
+ return self
+
+ def __exit__(self, *args, **kwargs):
+ for connection in self.connections:
+ connection.close()
+ self.patcher.stop()
+
+ @property
+ def connection_count(self):
+ return len(self.connections)
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck', freshenv=True)
+def test_defaults(app):
+ with http_server(DefaultsHandler):
+ with ConnectionMeasurement() as m:
+ app.build()
+ assert m.connection_count <= 5
+
+ # Text output
+ assert (app.outdir / 'output.txt').exists()
+ content = (app.outdir / 'output.txt').read_text(encoding='utf8')
+
+ # looking for '#top' and '#does-not-exist' not found should fail
+ assert "Anchor 'top' not found" in content
+ assert "Anchor 'does-not-exist' not found" in content
+ # images should fail
+ assert "Not Found for url: http://localhost:7777/image.png" in content
+ assert "Not Found for url: http://localhost:7777/image2.png" in content
+ # looking for local file should fail
+ assert "[broken] path/to/notfound" in content
+ assert len(content.splitlines()) == 5
+
+ # JSON output
+ assert (app.outdir / 'output.json').exists()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+
+ rows = [json.loads(x) for x in content.splitlines()]
+ row = rows[0]
+ for attr in ("filename", "lineno", "status", "code", "uri", "info"):
+ assert attr in row
+
+ assert len(content.splitlines()) == 10
+ assert len(rows) == 10
+ # the output order of the rows is not stable
+ # due to possible variance in network latency
+ rowsby = {row["uri"]: row for row in rows}
+ assert rowsby["http://localhost:7777#!bar"] == {
+ 'filename': 'links.rst',
+ 'lineno': 5,
+ 'status': 'working',
+ 'code': 0,
+ 'uri': 'http://localhost:7777#!bar',
+ 'info': '',
+ }
+ assert rowsby['http://localhost:7777/image2.png'] == {
+ 'filename': 'links.rst',
+ 'lineno': 13,
+ 'status': 'broken',
+ 'code': 0,
+ 'uri': 'http://localhost:7777/image2.png',
+ 'info': '404 Client Error: Not Found for url: http://localhost:7777/image2.png',
+ }
+ # looking for '#top' and '#does-not-exist' not found should fail
+ assert rowsby["http://localhost:7777/#top"]["info"] == "Anchor 'top' not found"
+ assert rowsby["http://localhost:7777/#top"]["status"] == "broken"
+ assert rowsby["http://localhost:7777#does-not-exist"]["info"] == "Anchor 'does-not-exist' not found"
+ # images should fail
+ assert "Not Found for url: http://localhost:7777/image.png" in rowsby["http://localhost:7777/image.png"]["info"]
+ # anchor should be found
+ assert rowsby['http://localhost:7777/anchor.html#found'] == {
+ 'filename': 'links.rst',
+ 'lineno': 14,
+ 'status': 'working',
+ 'code': 0,
+ 'uri': 'http://localhost:7777/anchor.html#found',
+ 'info': '',
+ }
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck', freshenv=True,
+ confoverrides={'linkcheck_anchors': False})
+def test_check_link_response_only(app):
+ with http_server(DefaultsHandler):
+ app.build()
+
+ # JSON output
+ assert (app.outdir / 'output.json').exists()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+
+ rows = [json.loads(x) for x in content.splitlines()]
+ rowsby = {row["uri"]: row for row in rows}
+ assert rowsby["http://localhost:7777/#top"]["status"] == "working"
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-too-many-retries', freshenv=True)
+def test_too_many_retries(app):
+ with http_server(DefaultsHandler):
+ app.build()
+
+ # Text output
+ assert (app.outdir / 'output.txt').exists()
+ content = (app.outdir / 'output.txt').read_text(encoding='utf8')
+
+ # looking for non-existent URL should fail
+ assert " Max retries exceeded with url: /doesnotexist" in content
+
+ # JSON output
+ assert (app.outdir / 'output.json').exists()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+
+ assert len(content.splitlines()) == 1
+ row = json.loads(content)
+ # the output order of the rows is not stable
+ # due to possible variance in network latency
+
+ # looking for non-existent URL should fail
+ assert row['filename'] == 'index.rst'
+ assert row['lineno'] == 1
+ assert row['status'] == 'broken'
+ assert row['code'] == 0
+ assert row['uri'] == 'https://localhost:7777/doesnotexist'
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-raw-node', freshenv=True)
+def test_raw_node(app):
+ with http_server(OKHandler):
+ app.build()
+
+ # JSON output
+ assert (app.outdir / 'output.json').exists()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+
+ assert len(content.splitlines()) == 1
+ row = json.loads(content)
+
+ # raw nodes' url should be checked too
+ assert row == {
+ 'filename': 'index.rst',
+ 'lineno': 1,
+ 'status': 'working',
+ 'code': 0,
+ 'uri': 'http://localhost:7777/',
+ 'info': '',
+ }
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck-anchors-ignore', freshenv=True,
+ confoverrides={'linkcheck_anchors_ignore': ["^!", "^top$"]})
+def test_anchors_ignored(app):
+ with http_server(OKHandler):
+ app.build()
+
+ assert (app.outdir / 'output.txt').exists()
+ content = (app.outdir / 'output.txt').read_text(encoding='utf8')
+
+ # expect all ok when excluding #top
+ assert not content
+
+
+class AnchorsIgnoreForUrlHandler(http.server.BaseHTTPRequestHandler):
+ def do_HEAD(self):
+ if self.path in {'/valid', '/ignored'}:
+ self.send_response(200, "OK")
+ else:
+ self.send_response(404, "Not Found")
+ self.end_headers()
+
+ def do_GET(self):
+ self.do_HEAD()
+ if self.path == '/valid':
+ self.wfile.write(b"<h1 id='valid-anchor'>valid anchor</h1>\n")
+ elif self.path == '/ignored':
+ self.wfile.write(b"no anchor but page exists\n")
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck-anchors-ignore-for-url', freshenv=True,
+ confoverrides={'linkcheck_anchors_ignore_for_url': [
+ 'http://localhost:7777/ignored', # existing page
+ 'http://localhost:7777/invalid', # unknown page
+ ]})
+def test_anchors_ignored_for_url(app):
+ with http_server(AnchorsIgnoreForUrlHandler):
+ app.build()
+
+ assert (app.outdir / 'output.txt').exists()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+
+ attrs = ('filename', 'lineno', 'status', 'code', 'uri', 'info')
+ data = [json.loads(x) for x in content.splitlines()]
+ assert len(data) == 7
+ assert all(all(attr in row for attr in attrs) for row in data)
+
+ # rows may be unsorted due to network latency or
+ # the order the threads are processing the links
+ rows = {r['uri']: {'status': r['status'], 'info': r['info']} for r in data}
+
+ assert rows['http://localhost:7777/valid']['status'] == 'working'
+ assert rows['http://localhost:7777/valid#valid-anchor']['status'] == 'working'
+ assert rows['http://localhost:7777/valid#invalid-anchor'] == {
+ 'status': 'broken',
+ 'info': "Anchor 'invalid-anchor' not found",
+ }
+
+ assert rows['http://localhost:7777/ignored']['status'] == 'working'
+ assert rows['http://localhost:7777/ignored#invalid-anchor']['status'] == 'working'
+
+ assert rows['http://localhost:7777/invalid'] == {
+ 'status': 'broken',
+ 'info': '404 Client Error: Not Found for url: http://localhost:7777/invalid',
+ }
+ assert rows['http://localhost:7777/invalid#anchor'] == {
+ 'status': 'broken',
+ 'info': '404 Client Error: Not Found for url: http://localhost:7777/invalid',
+ }
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-anchor', freshenv=True)
+def test_raises_for_invalid_status(app):
+ class InternalServerErrorHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def do_GET(self):
+ self.send_error(500, "Internal Server Error")
+
+ with http_server(InternalServerErrorHandler):
+ app.build()
+ content = (app.outdir / 'output.txt').read_text(encoding='utf8')
+ assert content == (
+ "index.rst:1: [broken] http://localhost:7777/#anchor: "
+ "500 Server Error: Internal Server Error "
+ "for url: http://localhost:7777/\n"
+ )
+
+
+def custom_handler(valid_credentials=(), success_criteria=lambda _: True):
+ """
+ Returns an HTTP request handler that authenticates the client and then determines
+ an appropriate HTTP response code, based on caller-provided credentials and optional
+ success criteria, respectively.
+ """
+ expected_token = None
+ if valid_credentials:
+ assert len(valid_credentials) == 2, "expected a pair of strings as credentials"
+ expected_token = b64encode(":".join(valid_credentials).encode()).decode("utf-8")
+ del valid_credentials
+
+ class CustomHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def authenticated(method):
+ def method_if_authenticated(self):
+ if (expected_token is None
+ or self.headers["Authorization"] == f"Basic {expected_token}"):
+ return method(self)
+ else:
+ self.send_response(403, "Forbidden")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ return method_if_authenticated
+
+ @authenticated
+ def do_HEAD(self):
+ self.do_GET()
+
+ @authenticated
+ def do_GET(self):
+ if success_criteria(self):
+ self.send_response(200, "OK")
+ self.send_header("Content-Length", "0")
+ else:
+ self.send_response(400, "Bad Request")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ return CustomHandler
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck-localserver', freshenv=True,
+ confoverrides={'linkcheck_auth': [
+ (r'^$', ('no', 'match')),
+ (r'^http://localhost:7777/$', ('user1', 'password')),
+ (r'.*local.*', ('user2', 'hunter2')),
+ ]})
+def test_auth_header_uses_first_match(app):
+ with http_server(custom_handler(valid_credentials=("user1", "password"))):
+ app.build()
+
+ with open(app.outdir / "output.json", encoding="utf-8") as fp:
+ content = json.load(fp)
+
+ assert content["status"] == "working"
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck-localserver', freshenv=True,
+ confoverrides={'linkcheck_auth': [(r'^$', ('user1', 'password'))]})
+def test_auth_header_no_match(app):
+ with http_server(custom_handler(valid_credentials=("user1", "password"))):
+ app.build()
+
+ with open(app.outdir / "output.json", encoding="utf-8") as fp:
+ content = json.load(fp)
+
+ # TODO: should this test's webserver return HTTP 401 here?
+ # https://github.com/sphinx-doc/sphinx/issues/11433
+ assert content["info"] == "403 Client Error: Forbidden for url: http://localhost:7777/"
+ assert content["status"] == "broken"
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck-localserver', freshenv=True,
+ confoverrides={'linkcheck_request_headers': {
+ "http://localhost:7777/": {
+ "Accept": "text/html",
+ },
+ "*": {
+ "X-Secret": "open sesami",
+ },
+ }})
+def test_linkcheck_request_headers(app):
+ def check_headers(self):
+ if "X-Secret" in self.headers:
+ return False
+ if self.headers["Accept"] != "text/html":
+ return False
+ return True
+
+ with http_server(custom_handler(success_criteria=check_headers)):
+ app.build()
+
+ with open(app.outdir / "output.json", encoding="utf-8") as fp:
+ content = json.load(fp)
+
+ assert content["status"] == "working"
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck-localserver', freshenv=True,
+ confoverrides={'linkcheck_request_headers': {
+ "http://localhost:7777": {"Accept": "application/json"},
+ "*": {"X-Secret": "open sesami"},
+ }})
+def test_linkcheck_request_headers_no_slash(app):
+ def check_headers(self):
+ if "X-Secret" in self.headers:
+ return False
+ if self.headers["Accept"] != "application/json":
+ return False
+ return True
+
+ with http_server(custom_handler(success_criteria=check_headers)):
+ app.build()
+
+ with open(app.outdir / "output.json", encoding="utf-8") as fp:
+ content = json.load(fp)
+
+ assert content["status"] == "working"
+
+
+@pytest.mark.sphinx(
+ 'linkcheck', testroot='linkcheck-localserver', freshenv=True,
+ confoverrides={'linkcheck_request_headers': {
+ "http://do.not.match.org": {"Accept": "application/json"},
+ "*": {"X-Secret": "open sesami"},
+ }})
+def test_linkcheck_request_headers_default(app):
+ def check_headers(self):
+ if self.headers["X-Secret"] != "open sesami":
+ return False
+ if self.headers["Accept"] == "application/json":
+ return False
+ return True
+
+ with http_server(custom_handler(success_criteria=check_headers)):
+ app.build()
+
+ with open(app.outdir / "output.json", encoding="utf-8") as fp:
+ content = json.load(fp)
+
+ assert content["status"] == "working"
+
+
+def make_redirect_handler(*, support_head):
+ class RedirectOnceHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def do_HEAD(self):
+ if support_head:
+ self.do_GET()
+ else:
+ self.send_response(405, "Method Not Allowed")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ def do_GET(self):
+ if self.path == "/?redirected=1":
+ self.send_response(204, "No content")
+ else:
+ self.send_response(302, "Found")
+ self.send_header("Location", "http://localhost:7777/?redirected=1")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ def log_date_time_string(self):
+ """Strip date and time from logged messages for assertions."""
+ return ""
+
+ return RedirectOnceHandler
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_follows_redirects_on_HEAD(app, capsys, warning):
+ with http_server(make_redirect_handler(support_head=True)):
+ app.build()
+ stdout, stderr = capsys.readouterr()
+ content = (app.outdir / 'output.txt').read_text(encoding='utf8')
+ assert content == (
+ "index.rst:1: [redirected with Found] "
+ "http://localhost:7777/ to http://localhost:7777/?redirected=1\n"
+ )
+ assert stderr == textwrap.dedent(
+ """\
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 302 -
+ 127.0.0.1 - - [] "HEAD /?redirected=1 HTTP/1.1" 204 -
+ """,
+ )
+ assert warning.getvalue() == ''
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_follows_redirects_on_GET(app, capsys, warning):
+ with http_server(make_redirect_handler(support_head=False)):
+ app.build()
+ stdout, stderr = capsys.readouterr()
+ content = (app.outdir / 'output.txt').read_text(encoding='utf8')
+ assert content == (
+ "index.rst:1: [redirected with Found] "
+ "http://localhost:7777/ to http://localhost:7777/?redirected=1\n"
+ )
+ assert stderr == textwrap.dedent(
+ """\
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 405 -
+ 127.0.0.1 - - [] "GET / HTTP/1.1" 302 -
+ 127.0.0.1 - - [] "GET /?redirected=1 HTTP/1.1" 204 -
+ """,
+ )
+ assert warning.getvalue() == ''
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-warn-redirects',
+ freshenv=True, confoverrides={
+ 'linkcheck_allowed_redirects': {'http://localhost:7777/.*1': '.*'},
+ })
+def test_linkcheck_allowed_redirects(app, warning):
+ with http_server(make_redirect_handler(support_head=False)):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ rows = [json.loads(l) for l in fp.readlines()]
+
+ assert len(rows) == 2
+ records = {row["uri"]: row for row in rows}
+ assert records["http://localhost:7777/path1"]["status"] == "working"
+ assert records["http://localhost:7777/path2"] == {
+ 'filename': 'index.rst',
+ 'lineno': 3,
+ 'status': 'redirected',
+ 'code': 302,
+ 'uri': 'http://localhost:7777/path2',
+ 'info': 'http://localhost:7777/?redirected=1',
+ }
+
+ assert ("index.rst:3: WARNING: redirect http://localhost:7777/path2 - with Found to "
+ "http://localhost:7777/?redirected=1\n" in strip_escseq(warning.getvalue()))
+ assert len(warning.getvalue().splitlines()) == 1
+
+
+class OKHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def do_HEAD(self):
+ self.send_response(200, "OK")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ def do_GET(self):
+ content = b"ok\n"
+ self.send_response(200, "OK")
+ self.send_header("Content-Length", str(len(content)))
+ self.end_headers()
+ self.wfile.write(content)
+
+
+@mock.patch("sphinx.builders.linkcheck.requests.get", wraps=requests.get)
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-https', freshenv=True)
+def test_invalid_ssl(get_request, app):
+ # Link indicates SSL should be used (https) but the server does not handle it.
+ with http_server(OKHandler):
+ app.build()
+ assert not get_request.called
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = json.load(fp)
+ assert content["status"] == "broken"
+ assert content["filename"] == "index.rst"
+ assert content["lineno"] == 1
+ assert content["uri"] == "https://localhost:7777/"
+ assert "SSLError" in content["info"]
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-https', freshenv=True)
+def test_connect_to_selfsigned_fails(app):
+ with https_server(OKHandler):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = json.load(fp)
+ assert content["status"] == "broken"
+ assert content["filename"] == "index.rst"
+ assert content["lineno"] == 1
+ assert content["uri"] == "https://localhost:7777/"
+ assert "[SSL: CERTIFICATE_VERIFY_FAILED]" in content["info"]
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-https', freshenv=True)
+def test_connect_to_selfsigned_with_tls_verify_false(app):
+ app.config.tls_verify = False
+ with https_server(OKHandler):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = json.load(fp)
+ assert content == {
+ "code": 0,
+ "status": "working",
+ "filename": "index.rst",
+ "lineno": 1,
+ "uri": "https://localhost:7777/",
+ "info": "",
+ }
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-https', freshenv=True)
+def test_connect_to_selfsigned_with_tls_cacerts(app):
+ app.config.tls_cacerts = CERT_FILE
+ with https_server(OKHandler):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = json.load(fp)
+ assert content == {
+ "code": 0,
+ "status": "working",
+ "filename": "index.rst",
+ "lineno": 1,
+ "uri": "https://localhost:7777/",
+ "info": "",
+ }
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-https', freshenv=True)
+def test_connect_to_selfsigned_with_requests_env_var(monkeypatch, app):
+ monkeypatch.setenv("REQUESTS_CA_BUNDLE", CERT_FILE)
+ with https_server(OKHandler):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = json.load(fp)
+ assert content == {
+ "code": 0,
+ "status": "working",
+ "filename": "index.rst",
+ "lineno": 1,
+ "uri": "https://localhost:7777/",
+ "info": "",
+ }
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver-https', freshenv=True)
+def test_connect_to_selfsigned_nonexistent_cert_file(app):
+ app.config.tls_cacerts = "does/not/exist"
+ with https_server(OKHandler):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = json.load(fp)
+ assert content == {
+ "code": 0,
+ "status": "broken",
+ "filename": "index.rst",
+ "lineno": 1,
+ "uri": "https://localhost:7777/",
+ "info": "Could not find a suitable TLS CA certificate bundle, invalid path: does/not/exist",
+ }
+
+
+class InfiniteRedirectOnHeadHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def do_HEAD(self):
+ self.send_response(302, "Found")
+ self.send_header("Location", "http://localhost:7777/")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ def do_GET(self):
+ content = b"ok\n"
+ self.send_response(200, "OK")
+ self.send_header("Content-Length", str(len(content)))
+ self.end_headers()
+ self.wfile.write(content)
+ self.close_connection = True # we don't expect the client to read this response body
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_TooManyRedirects_on_HEAD(app, monkeypatch):
+ import requests.sessions
+
+ monkeypatch.setattr(requests.sessions, "DEFAULT_REDIRECT_LIMIT", 5)
+
+ with http_server(InfiniteRedirectOnHeadHandler):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = json.load(fp)
+ assert content == {
+ "code": 0,
+ "status": "working",
+ "filename": "index.rst",
+ "lineno": 1,
+ "uri": "http://localhost:7777/",
+ "info": "",
+ }
+
+
+def make_retry_after_handler(responses):
+ class RetryAfterHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def do_HEAD(self):
+ status, retry_after = responses.pop(0)
+ self.send_response(status)
+ if retry_after:
+ self.send_header('Retry-After', retry_after)
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+ def log_date_time_string(self):
+ """Strip date and time from logged messages for assertions."""
+ return ""
+
+ return RetryAfterHandler
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_too_many_requests_retry_after_int_delay(app, capsys, status):
+ with http_server(make_retry_after_handler([(429, "0"), (200, None)])), \
+ mock.patch("sphinx.builders.linkcheck.DEFAULT_DELAY", 0), \
+ mock.patch("sphinx.builders.linkcheck.QUEUE_POLL_SECS", 0.01):
+ app.build()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+ assert json.loads(content) == {
+ "filename": "index.rst",
+ "lineno": 1,
+ "status": "working",
+ "code": 0,
+ "uri": "http://localhost:7777/",
+ "info": "",
+ }
+ rate_limit_log = "-rate limited- http://localhost:7777/ | sleeping...\n"
+ assert rate_limit_log in strip_colors(status.getvalue())
+ _stdout, stderr = capsys.readouterr()
+ assert stderr == textwrap.dedent(
+ """\
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 429 -
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 200 -
+ """,
+ )
+
+
+@pytest.mark.parametrize('tz', [None, 'GMT', 'GMT+3', 'GMT-3'])
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_too_many_requests_retry_after_HTTP_date(tz, app, monkeypatch, capsys):
+ retry_after = wsgiref.handlers.format_date_time(time.time())
+
+ with monkeypatch.context() as m:
+ if tz is not None:
+ m.setenv('TZ', tz)
+ if sys.platform != "win32":
+ time.tzset()
+ m.setattr(sphinx.util.http_date, '_GMT_OFFSET',
+ float(time.localtime().tm_gmtoff))
+
+ with http_server(make_retry_after_handler([(429, retry_after), (200, None)])):
+ app.build()
+
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+ assert json.loads(content) == {
+ "filename": "index.rst",
+ "lineno": 1,
+ "status": "working",
+ "code": 0,
+ "uri": "http://localhost:7777/",
+ "info": "",
+ }
+ _stdout, stderr = capsys.readouterr()
+ assert stderr == textwrap.dedent(
+ """\
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 429 -
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 200 -
+ """,
+ )
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_too_many_requests_retry_after_without_header(app, capsys):
+ with http_server(make_retry_after_handler([(429, None), (200, None)])), \
+ mock.patch("sphinx.builders.linkcheck.DEFAULT_DELAY", 0):
+ app.build()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+ assert json.loads(content) == {
+ "filename": "index.rst",
+ "lineno": 1,
+ "status": "working",
+ "code": 0,
+ "uri": "http://localhost:7777/",
+ "info": "",
+ }
+ _stdout, stderr = capsys.readouterr()
+ assert stderr == textwrap.dedent(
+ """\
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 429 -
+ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 200 -
+ """,
+ )
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_too_many_requests_user_timeout(app):
+ app.config.linkcheck_rate_limit_timeout = 0.0
+ with http_server(make_retry_after_handler([(429, None)])):
+ app.build()
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+ assert json.loads(content) == {
+ "filename": "index.rst",
+ "lineno": 1,
+ "status": "broken",
+ "code": 0,
+ "uri": "http://localhost:7777/",
+ "info": "429 Client Error: Too Many Requests for url: http://localhost:7777/",
+ }
+
+
+class FakeResponse:
+ headers: dict[str, str] = {}
+ url = "http://localhost/"
+
+
+def test_limit_rate_default_sleep(app):
+ worker = HyperlinkAvailabilityCheckWorker(app.config, Queue(), Queue(), {})
+ with mock.patch('time.time', return_value=0.0):
+ next_check = worker.limit_rate(FakeResponse.url, FakeResponse.headers.get("Retry-After"))
+ assert next_check == 60.0
+
+
+def test_limit_rate_user_max_delay(app):
+ app.config.linkcheck_rate_limit_timeout = 0.0
+ worker = HyperlinkAvailabilityCheckWorker(app.config, Queue(), Queue(), {})
+ next_check = worker.limit_rate(FakeResponse.url, FakeResponse.headers.get("Retry-After"))
+ assert next_check is None
+
+
+def test_limit_rate_doubles_previous_wait_time(app):
+ rate_limits = {"localhost": RateLimit(60.0, 0.0)}
+ worker = HyperlinkAvailabilityCheckWorker(app.config, Queue(), Queue(), rate_limits)
+ with mock.patch('time.time', return_value=0.0):
+ next_check = worker.limit_rate(FakeResponse.url, FakeResponse.headers.get("Retry-After"))
+ assert next_check == 120.0
+
+
+def test_limit_rate_clips_wait_time_to_max_time(app):
+ app.config.linkcheck_rate_limit_timeout = 90.0
+ rate_limits = {"localhost": RateLimit(60.0, 0.0)}
+ worker = HyperlinkAvailabilityCheckWorker(app.config, Queue(), Queue(), rate_limits)
+ with mock.patch('time.time', return_value=0.0):
+ next_check = worker.limit_rate(FakeResponse.url, FakeResponse.headers.get("Retry-After"))
+ assert next_check == 90.0
+
+
+def test_limit_rate_bails_out_after_waiting_max_time(app):
+ app.config.linkcheck_rate_limit_timeout = 90.0
+ rate_limits = {"localhost": RateLimit(90.0, 0.0)}
+ worker = HyperlinkAvailabilityCheckWorker(app.config, Queue(), Queue(), rate_limits)
+ next_check = worker.limit_rate(FakeResponse.url, FakeResponse.headers.get("Retry-After"))
+ assert next_check is None
+
+
+@mock.patch('sphinx.util.requests.requests.Session.get_adapter')
+def test_connection_contention(get_adapter, app, capsys):
+ # Create a shared, but limited-size, connection pool
+ import requests
+ get_adapter.return_value = requests.adapters.HTTPAdapter(pool_maxsize=1)
+
+ # Set an upper-bound on socket timeouts globally
+ import socket
+ socket.setdefaulttimeout(5)
+
+ # Place a workload into the linkcheck queue
+ link_count = 10
+ rqueue, wqueue = Queue(), Queue()
+ for _ in range(link_count):
+ wqueue.put(CheckRequest(0, Hyperlink("http://localhost:7777", "test", "test.rst", 1)))
+
+ # Create parallel consumer threads
+ with http_server(make_redirect_handler(support_head=True)):
+ begin, checked = time.time(), []
+ threads = [
+ HyperlinkAvailabilityCheckWorker(
+ config=app.config,
+ rqueue=rqueue,
+ wqueue=wqueue,
+ rate_limits={},
+ )
+ for _ in range(10)
+ ]
+ for thread in threads:
+ thread.start()
+ while time.time() < begin + 5 and len(checked) < link_count:
+ checked.append(rqueue.get(timeout=5))
+ for thread in threads:
+ thread.join(timeout=0)
+
+ # Ensure that all items were consumed within the time limit
+ _, stderr = capsys.readouterr()
+ assert len(checked) == link_count
+ assert "TimeoutError" not in stderr
+
+
+class ConnectionResetHandler(http.server.BaseHTTPRequestHandler):
+ protocol_version = "HTTP/1.1"
+
+ def do_HEAD(self):
+ self.close_connection = True
+
+ def do_GET(self):
+ self.send_response(200, "OK")
+ self.send_header("Content-Length", "0")
+ self.end_headers()
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True)
+def test_get_after_head_raises_connection_error(app):
+ with http_server(ConnectionResetHandler):
+ app.build()
+ content = (app.outdir / 'output.txt').read_text(encoding='utf8')
+ assert not content
+ content = (app.outdir / 'output.json').read_text(encoding='utf8')
+ assert json.loads(content) == {
+ "filename": "index.rst",
+ "lineno": 1,
+ "status": "working",
+ "code": 0,
+ "uri": "http://localhost:7777/",
+ "info": "",
+ }
+
+
+@pytest.mark.sphinx('linkcheck', testroot='linkcheck-documents_exclude', freshenv=True)
+def test_linkcheck_exclude_documents(app):
+ with http_server(DefaultsHandler):
+ app.build()
+
+ with open(app.outdir / 'output.json', encoding='utf-8') as fp:
+ content = [json.loads(record) for record in fp]
+
+ assert content == [
+ {
+ 'filename': 'broken_link.rst',
+ 'lineno': 4,
+ 'status': 'ignored',
+ 'code': 0,
+ 'uri': 'https://www.sphinx-doc.org/this-is-a-broken-link',
+ 'info': 'broken_link matched ^broken_link$ from linkcheck_exclude_documents',
+ },
+ {
+ 'filename': 'br0ken_link.rst',
+ 'lineno': 4,
+ 'status': 'ignored',
+ 'code': 0,
+ 'uri': 'https://www.sphinx-doc.org/this-is-another-broken-link',
+ 'info': 'br0ken_link matched br[0-9]ken_link from linkcheck_exclude_documents',
+ },
+ ]
diff --git a/tests/test_build_manpage.py b/tests/test_build_manpage.py
new file mode 100644
index 0000000..e765644
--- /dev/null
+++ b/tests/test_build_manpage.py
@@ -0,0 +1,105 @@
+"""Test the build process with manpage builder with the test root."""
+
+import docutils
+import pytest
+
+from sphinx.builders.manpage import default_man_pages
+from sphinx.config import Config
+
+
+@pytest.mark.sphinx('man')
+def test_all(app, status, warning):
+ app.builder.build_all()
+ assert (app.outdir / 'sphinxtests.1').exists()
+
+ content = (app.outdir / 'sphinxtests.1').read_text(encoding='utf8')
+ assert r'\fBprint \fP\fIi\fP\fB\en\fP' in content
+ assert r'\fBmanpage\en\fP' in content
+
+ # heading (title + description)
+ assert r'sphinxtests \- Sphinx <Tests> 0.6alpha1' in content
+
+ # term of definition list including nodes.strong
+ assert '\n.B term1\n' in content
+ assert '\nterm2 (\\fBstronged partially\\fP)\n' in content
+
+ # test samp with braces
+ assert '\n\\fIvariable_only\\fP\n' in content
+ assert '\n\\fIvariable\\fP\\fB and text\\fP\n' in content
+ assert '\n\\fBShow \\fP\\fIvariable\\fP\\fB in the middle\\fP\n' in content
+
+ assert 'Footnotes' not in content
+
+
+@pytest.mark.sphinx('man', testroot='basic',
+ confoverrides={'man_pages': [('index', 'title', None, [], 1)]})
+def test_man_pages_empty_description(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'title.1').read_text(encoding='utf8')
+ assert r'title \-' not in content
+
+
+@pytest.mark.sphinx('man', testroot='basic',
+ confoverrides={'man_make_section_directory': True})
+def test_man_make_section_directory(app, status, warning):
+ app.build()
+ assert (app.outdir / 'man1' / 'python.1').exists()
+
+
+@pytest.mark.sphinx('man', testroot='directive-code')
+def test_captioned_code_block(app, status, warning):
+ app.builder.build_all()
+ content = (app.outdir / 'python.1').read_text(encoding='utf8')
+
+ if docutils.__version_info__[:2] < (0, 21):
+ expected = """\
+.sp
+caption \\fItest\\fP rb
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.nf
+.ft C
+def ruby?
+ false
+end
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+"""
+ else:
+ expected = """\
+.sp
+caption \\fItest\\fP rb
+.INDENT 0.0
+.INDENT 3.5
+.sp
+.EX
+def ruby?
+ false
+end
+.EE
+.UNINDENT
+.UNINDENT
+"""
+
+ assert expected in content
+
+
+def test_default_man_pages():
+ config = Config({'project': 'STASIâ„¢ Documentation',
+ 'author': "Wolfgang Schäuble & G'Beckstein",
+ 'release': '1.0'})
+ config.init_values()
+ expected = [('index', 'stasi', 'STASIâ„¢ Documentation 1.0',
+ ["Wolfgang Schäuble & G'Beckstein"], 1)]
+ assert default_man_pages(config) == expected
+
+
+@pytest.mark.sphinx('man', testroot='markup-rubric')
+def test_rubric(app, status, warning):
+ app.build()
+ content = (app.outdir / 'python.1').read_text(encoding='utf8')
+ assert 'This is a rubric\n' in content
diff --git a/tests/test_build_texinfo.py b/tests/test_build_texinfo.py
new file mode 100644
index 0000000..9964382
--- /dev/null
+++ b/tests/test_build_texinfo.py
@@ -0,0 +1,155 @@
+"""Test the build process with Texinfo builder with the test root."""
+
+import os
+import re
+import subprocess
+from pathlib import Path
+from subprocess import CalledProcessError
+from unittest.mock import Mock
+
+import pytest
+
+from sphinx.builders.texinfo import default_texinfo_documents
+from sphinx.config import Config
+from sphinx.testing.util import strip_escseq
+from sphinx.util.docutils import new_document
+from sphinx.writers.texinfo import TexinfoTranslator
+
+from .test_build_html import ENV_WARNINGS
+
+TEXINFO_WARNINGS = ENV_WARNINGS + """\
+%(root)s/index.rst:\\d+: WARNING: unknown option: '&option'
+%(root)s/index.rst:\\d+: WARNING: citation not found: missing
+%(root)s/index.rst:\\d+: WARNING: a suitable image for texinfo builder not found: foo.\\*
+%(root)s/index.rst:\\d+: WARNING: a suitable image for texinfo builder not found: \
+\\['application/pdf', 'image/svg\\+xml'\\] \\(svgimg.\\*\\)
+"""
+
+
+@pytest.mark.sphinx('texinfo', testroot='warnings', freshenv=True)
+def test_texinfo_warnings(app, status, warning):
+ app.builder.build_all()
+ warnings = strip_escseq(re.sub(re.escape(os.sep) + '{1,2}', '/', warning.getvalue()))
+ warnings_exp = TEXINFO_WARNINGS % {
+ 'root': re.escape(app.srcdir.as_posix())}
+ assert re.match(warnings_exp + '$', warnings), \
+ "Warnings don't match:\n" + \
+ '--- Expected (regex):\n' + warnings_exp + \
+ '--- Got:\n' + warnings
+
+
+@pytest.mark.sphinx('texinfo')
+def test_texinfo(app, status, warning):
+ TexinfoTranslator.ignore_missing_images = True
+ app.builder.build_all()
+ result = (app.outdir / 'sphinxtests.texi').read_text(encoding='utf8')
+ assert ('@anchor{markup doc}@anchor{11}'
+ '@anchor{markup id1}@anchor{12}'
+ '@anchor{markup testing-various-markup}@anchor{13}' in result)
+ assert 'Footnotes' not in result
+ # now, try to run makeinfo over it
+ try:
+ args = ['makeinfo', '--no-split', 'sphinxtests.texi']
+ subprocess.run(args, capture_output=True, cwd=app.outdir, check=True)
+ except OSError as exc:
+ raise pytest.skip.Exception from exc # most likely makeinfo was not found
+ except CalledProcessError as exc:
+ print(exc.stdout)
+ print(exc.stderr)
+ msg = f'makeinfo exited with return code {exc.retcode}'
+ raise AssertionError(msg) from exc
+
+
+@pytest.mark.sphinx('texinfo', testroot='markup-rubric')
+def test_texinfo_rubric(app, status, warning):
+ app.build()
+
+ output = (app.outdir / 'python.texi').read_text(encoding='utf8')
+ assert '@heading This is a rubric' in output
+ assert '@heading This is a multiline rubric' in output
+
+
+@pytest.mark.sphinx('texinfo', testroot='markup-citation')
+def test_texinfo_citation(app, status, warning):
+ app.builder.build_all()
+
+ output = (app.outdir / 'python.texi').read_text(encoding='utf8')
+ assert 'This is a citation ref; @ref{1,,[CITE1]} and @ref{2,,[CITE2]}.' in output
+ assert ('@anchor{index cite1}@anchor{1}@w{(CITE1)} \n'
+ 'This is a citation\n') in output
+ assert ('@anchor{index cite2}@anchor{2}@w{(CITE2)} \n'
+ 'This is a multiline citation\n') in output
+
+
+def test_default_texinfo_documents():
+ config = Config({'project': 'STASIâ„¢ Documentation',
+ 'author': "Wolfgang Schäuble & G'Beckstein"})
+ config.init_values()
+ expected = [('index', 'stasi', 'STASIâ„¢ Documentation',
+ "Wolfgang Schäuble & G'Beckstein", 'stasi',
+ 'One line description of project', 'Miscellaneous')]
+ assert default_texinfo_documents(config) == expected
+
+
+@pytest.mark.sphinx('texinfo')
+def test_texinfo_escape_id(app, status, warning):
+ settings = Mock(title='',
+ texinfo_dir_entry='',
+ texinfo_elements={})
+ document = new_document('', settings)
+ translator = app.builder.create_translator(document, app.builder)
+
+ assert translator.escape_id('Hello world') == 'Hello world'
+ assert translator.escape_id('Hello world') == 'Hello world'
+ assert translator.escape_id('Hello Sphinx world') == 'Hello Sphinx world'
+ assert translator.escape_id('Hello:world') == 'Hello world'
+ assert translator.escape_id('Hello(world)') == 'Hello world'
+ assert translator.escape_id('Hello world.') == 'Hello world'
+ assert translator.escape_id('.') == '.'
+
+
+@pytest.mark.sphinx('texinfo', testroot='footnotes')
+def test_texinfo_footnote(app, status, warning):
+ app.builder.build_all()
+
+ output = (app.outdir / 'python.texi').read_text(encoding='utf8')
+ assert 'First footnote: @footnote{\nFirst\n}' in output
+
+
+@pytest.mark.sphinx('texinfo')
+def test_texinfo_xrefs(app, status, warning):
+ app.builder.build_all()
+ output = (app.outdir / 'sphinxtests.texi').read_text(encoding='utf8')
+ assert re.search(r'@ref{\w+,,--plugin\.option}', output)
+
+ # Now rebuild it without xrefs
+ app.config.texinfo_cross_references = False
+ app.builder.build_all()
+ output = (app.outdir / 'sphinxtests.texi').read_text(encoding='utf8')
+ assert not re.search(r'@ref{\w+,,--plugin\.option}', output)
+ assert 'Link to perl +p, --ObjC++, --plugin.option, create-auth-token, arg and -j' in output
+
+
+@pytest.mark.sphinx('texinfo', testroot='root')
+def test_texinfo_samp_with_variable(app, status, warning):
+ app.build()
+
+ output = (app.outdir / 'sphinxtests.texi').read_text(encoding='utf8')
+
+ assert '@code{@var{variable_only}}' in output
+ assert '@code{@var{variable} and text}' in output
+ assert '@code{Show @var{variable} in the middle}' in output
+
+
+@pytest.mark.sphinx('texinfo', testroot='images')
+def test_copy_images(app, status, warning):
+ app.build()
+
+ images_dir = Path(app.outdir) / 'python-figures'
+ images = {image.name for image in images_dir.rglob('*')}
+ images.discard('python-logo.png')
+ assert images == {
+ 'img.png',
+ 'rimg.png',
+ 'testimäge.png',
+ }
diff --git a/tests/test_build_text.py b/tests/test_build_text.py
new file mode 100644
index 0000000..4a53be3
--- /dev/null
+++ b/tests/test_build_text.py
@@ -0,0 +1,278 @@
+"""Test the build process with Text builder with the test root."""
+
+import pytest
+from docutils.utils import column_width
+
+from sphinx.writers.text import MAXWIDTH, Cell, Table
+
+
+def with_text_app(*args, **kw):
+ default_kw = {
+ 'buildername': 'text',
+ 'testroot': 'build-text',
+ }
+ default_kw.update(kw)
+ return pytest.mark.sphinx(*args, **default_kw)
+
+
+@with_text_app()
+def test_maxwitdh_with_prefix(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'maxwidth.txt').read_text(encoding='utf8')
+
+ lines = result.splitlines()
+ line_widths = [column_width(line) for line in lines]
+ assert max(line_widths) < MAXWIDTH
+ assert lines[0].startswith('See also:')
+ assert lines[1].startswith('')
+ assert lines[2].startswith(' ham')
+ assert lines[3].startswith(' ham')
+ assert lines[4] == ''
+ assert lines[5].startswith('* ham')
+ assert lines[6].startswith(' ham')
+ assert lines[7] == ''
+ assert lines[8].startswith('* ham')
+ assert lines[9].startswith(' ham')
+ assert lines[10] == ''
+ assert lines[11].startswith('spam egg')
+
+
+@with_text_app()
+def test_lineblock(app, status, warning):
+ # regression test for #1109: need empty line after line block
+ app.builder.build_update()
+ result = (app.outdir / 'lineblock.txt').read_text(encoding='utf8')
+ expect = (
+ "* one\n"
+ "\n"
+ " line-block 1\n"
+ " line-block 2\n"
+ "\n"
+ "followed paragraph.\n"
+ )
+ assert result == expect
+
+
+@with_text_app()
+def test_nonascii_title_line(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'nonascii_title.txt').read_text(encoding='utf8')
+ expect_underline = '*********'
+ result_underline = result.splitlines()[1].strip()
+ assert expect_underline == result_underline
+
+
+@with_text_app()
+def test_nonascii_table(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'nonascii_table.txt').read_text(encoding='utf8')
+ lines = [line.strip() for line in result.splitlines() if line.strip()]
+ line_widths = [column_width(line) for line in lines]
+ assert len(set(line_widths)) == 1 # same widths
+
+
+@with_text_app()
+def test_nonascii_maxwidth(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'nonascii_maxwidth.txt').read_text(encoding='utf8')
+ lines = [line.strip() for line in result.splitlines() if line.strip()]
+ line_widths = [column_width(line) for line in lines]
+ assert max(line_widths) < MAXWIDTH
+
+
+def test_table_builder():
+ table = Table([6, 6])
+ table.add_cell(Cell("foo"))
+ table.add_cell(Cell("bar"))
+ table_str = str(table).split("\n")
+ assert table_str[0] == "+--------+--------+"
+ assert table_str[1] == "| foo | bar |"
+ assert table_str[2] == "+--------+--------+"
+ assert repr(table).count("<Cell ") == 2
+
+
+def test_table_separator():
+ table = Table([6, 6])
+ table.add_cell(Cell("foo"))
+ table.add_cell(Cell("bar"))
+ table.set_separator()
+ table.add_row()
+ table.add_cell(Cell("FOO"))
+ table.add_cell(Cell("BAR"))
+ table_str = str(table).split("\n")
+ assert table_str[0] == "+--------+--------+"
+ assert table_str[1] == "| foo | bar |"
+ assert table_str[2] == "|========|========|"
+ assert table_str[3] == "| FOO | BAR |"
+ assert table_str[4] == "+--------+--------+"
+ assert repr(table).count("<Cell ") == 4
+
+
+def test_table_cell():
+ cell = Cell("Foo bar baz")
+ cell.wrap(3)
+ assert "Cell" in repr(cell)
+ assert cell.wrapped == ["Foo", "bar", "baz"]
+
+
+@with_text_app()
+def test_table_with_empty_cell(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'table.txt').read_text(encoding='utf8')
+ lines = [line.strip() for line in result.splitlines() if line.strip()]
+ assert lines[0] == "+-------+-------+"
+ assert lines[1] == "| XXX | XXX |"
+ assert lines[2] == "+-------+-------+"
+ assert lines[3] == "| | XXX |"
+ assert lines[4] == "+-------+-------+"
+ assert lines[5] == "| XXX | |"
+ assert lines[6] == "+-------+-------+"
+
+
+@with_text_app()
+def test_table_with_rowspan(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'table_rowspan.txt').read_text(encoding='utf8')
+ lines = [line.strip() for line in result.splitlines() if line.strip()]
+ assert lines[0] == "+-------+-------+"
+ assert lines[1] == "| XXXXXXXXX |"
+ assert lines[2] == "+-------+-------+"
+ assert lines[3] == "| | XXX |"
+ assert lines[4] == "+-------+-------+"
+ assert lines[5] == "| XXX | |"
+ assert lines[6] == "+-------+-------+"
+
+
+@with_text_app()
+def test_table_with_colspan(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'table_colspan.txt').read_text(encoding='utf8')
+ lines = [line.strip() for line in result.splitlines() if line.strip()]
+ assert lines[0] == "+-------+-------+"
+ assert lines[1] == "| XXX | XXX |"
+ assert lines[2] == "+-------+-------+"
+ assert lines[3] == "| | XXX |"
+ assert lines[4] == "+-------+ |"
+ assert lines[5] == "| XXX | |"
+ assert lines[6] == "+-------+-------+"
+
+
+@with_text_app()
+def test_table_with_colspan_left(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'table_colspan_left.txt').read_text(encoding='utf8')
+ lines = [line.strip() for line in result.splitlines() if line.strip()]
+ assert lines[0] == "+-------+-------+"
+ assert lines[1] == "| XXX | XXX |"
+ assert lines[2] == "+-------+-------+"
+ assert lines[3] == "| XXX | XXX |"
+ assert lines[4] == "| +-------+"
+ assert lines[5] == "| | |"
+ assert lines[6] == "+-------+-------+"
+
+
+@with_text_app()
+def test_table_with_colspan_and_rowspan(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'table_colspan_and_rowspan.txt').read_text(encoding='utf8')
+ lines = [line.strip() for line in result.splitlines() if line.strip()]
+ assert result
+ assert lines[0] == "+-------+-------+-------+"
+ assert lines[1] == "| AAA | BBB |"
+ assert lines[2] == "+-------+-------+ |"
+ assert lines[3] == "| DDD | XXX | |"
+ assert lines[4] == "| +-------+-------+"
+ assert lines[5] == "| | CCC |"
+ assert lines[6] == "+-------+-------+-------+"
+
+
+@with_text_app()
+def test_list_items_in_admonition(app, status, warning):
+ app.builder.build_update()
+ result = (app.outdir / 'listitems.txt').read_text(encoding='utf8')
+ lines = [line.rstrip() for line in result.splitlines()]
+ assert lines[0] == "See also:"
+ assert lines[1] == ""
+ assert lines[2] == " * item 1"
+ assert lines[3] == ""
+ assert lines[4] == " * item 2"
+
+
+@with_text_app()
+def test_secnums(app, status, warning):
+ app.builder.build_all()
+ index = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ lines = index.splitlines()
+ assert lines[0] == "* 1. Section A"
+ assert lines[1] == ""
+ assert lines[2] == "* 2. Section B"
+ assert lines[3] == ""
+ assert lines[4] == " * 2.1. Sub Ba"
+ assert lines[5] == ""
+ assert lines[6] == " * 2.2. Sub Bb"
+ doc2 = (app.outdir / 'doc2.txt').read_text(encoding='utf8')
+ expect = (
+ "2. Section B\n"
+ "************\n"
+ "\n"
+ "\n"
+ "2.1. Sub Ba\n"
+ "===========\n"
+ "\n"
+ "\n"
+ "2.2. Sub Bb\n"
+ "===========\n"
+ )
+ assert doc2 == expect
+
+ app.config.text_secnumber_suffix = " "
+ app.builder.build_all()
+ index = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ lines = index.splitlines()
+ assert lines[0] == "* 1 Section A"
+ assert lines[1] == ""
+ assert lines[2] == "* 2 Section B"
+ assert lines[3] == ""
+ assert lines[4] == " * 2.1 Sub Ba"
+ assert lines[5] == ""
+ assert lines[6] == " * 2.2 Sub Bb"
+ doc2 = (app.outdir / 'doc2.txt').read_text(encoding='utf8')
+ expect = (
+ "2 Section B\n"
+ "***********\n"
+ "\n"
+ "\n"
+ "2.1 Sub Ba\n"
+ "==========\n"
+ "\n"
+ "\n"
+ "2.2 Sub Bb\n"
+ "==========\n"
+ )
+ assert doc2 == expect
+
+ app.config.text_add_secnumbers = False
+ app.builder.build_all()
+ index = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ lines = index.splitlines()
+ assert lines[0] == "* Section A"
+ assert lines[1] == ""
+ assert lines[2] == "* Section B"
+ assert lines[3] == ""
+ assert lines[4] == " * Sub Ba"
+ assert lines[5] == ""
+ assert lines[6] == " * Sub Bb"
+ doc2 = (app.outdir / 'doc2.txt').read_text(encoding='utf8')
+ expect = (
+ "Section B\n"
+ "*********\n"
+ "\n"
+ "\n"
+ "Sub Ba\n"
+ "======\n"
+ "\n"
+ "\n"
+ "Sub Bb\n"
+ "======\n"
+ )
+ assert doc2 == expect
diff --git a/tests/test_builder.py b/tests/test_builder.py
new file mode 100644
index 0000000..1ff8aea
--- /dev/null
+++ b/tests/test_builder.py
@@ -0,0 +1,39 @@
+"""Test the Builder class."""
+import pytest
+
+
+@pytest.mark.sphinx('dummy', srcdir="test_builder", freshenv=True)
+def test_incremental_reading(app):
+ # first reading
+ updated = app.builder.read()
+ assert set(updated) == app.env.found_docs == set(app.env.all_docs)
+ assert updated == sorted(updated) # sorted by alphanumeric
+
+ # test if exclude_patterns works ok
+ assert 'subdir/excluded' not in app.env.found_docs
+
+ # before second reading, add, modify and remove source files
+ (app.srcdir / 'new.txt').write_text('New file\n========\n', encoding='utf8')
+ app.env.all_docs['index'] = 0 # mark as modified
+ (app.srcdir / 'autodoc.txt').unlink()
+
+ # second reading
+ updated = app.builder.read()
+
+ assert set(updated) == {'index', 'new'}
+ assert 'autodoc' not in app.env.all_docs
+ assert 'autodoc' not in app.env.found_docs
+
+
+@pytest.mark.sphinx('dummy', testroot='warnings', freshenv=True)
+def test_incremental_reading_for_missing_files(app):
+ # first reading
+ updated = app.builder.read()
+ assert set(updated) == app.env.found_docs == set(app.env.all_docs)
+
+ # second reading
+ updated = app.builder.read()
+
+ # "index" is listed up to updated because it contains references
+ # to nonexisting downloadable or image files
+ assert set(updated) == {'index'}
diff --git a/tests/test_catalogs.py b/tests/test_catalogs.py
new file mode 100644
index 0000000..b7fd7be
--- /dev/null
+++ b/tests/test_catalogs.py
@@ -0,0 +1,74 @@
+"""Test the base build process."""
+import shutil
+from pathlib import Path
+
+import pytest
+
+
+@pytest.fixture()
+def _setup_test(app_params):
+ assert isinstance(app_params.kwargs['srcdir'], Path)
+ srcdir = app_params.kwargs['srcdir']
+ src_locale_dir = srcdir / 'xx' / 'LC_MESSAGES'
+ dest_locale_dir = srcdir / 'locale'
+ # copy all catalogs into locale layout directory
+ for po in src_locale_dir.rglob('*.po'):
+ copy_po = (dest_locale_dir / 'en' / 'LC_MESSAGES' / po.relative_to(src_locale_dir))
+ if not copy_po.parent.exists():
+ copy_po.parent.mkdir(parents=True, exist_ok=True)
+ shutil.copy(po, copy_po)
+
+ yield
+
+ # delete remnants left over after failed build
+ shutil.rmtree(dest_locale_dir, ignore_errors=True)
+ shutil.rmtree(srcdir / '_build', ignore_errors=True)
+
+
+@pytest.mark.usefixtures('_setup_test')
+@pytest.mark.test_params(shared_result='test-catalogs')
+@pytest.mark.sphinx(
+ 'html', testroot='intl',
+ confoverrides={'language': 'en', 'locale_dirs': ['./locale']})
+def test_compile_all_catalogs(app, status, warning):
+ app.builder.compile_all_catalogs()
+
+ locale_dir = app.srcdir / 'locale'
+ catalog_dir = locale_dir / app.config.language / 'LC_MESSAGES'
+ expect = {x.with_suffix('.mo') for x in catalog_dir.rglob('*.po')}
+ actual = set(catalog_dir.rglob('*.mo'))
+ assert actual # not empty
+ assert actual == expect
+
+
+@pytest.mark.usefixtures('_setup_test')
+@pytest.mark.test_params(shared_result='test-catalogs')
+@pytest.mark.sphinx(
+ 'html', testroot='intl',
+ confoverrides={'language': 'en', 'locale_dirs': ['./locale']})
+def test_compile_specific_catalogs(app, status, warning):
+ locale_dir = app.srcdir / 'locale'
+ catalog_dir = locale_dir / app.config.language / 'LC_MESSAGES'
+
+ actual_on_boot = set(catalog_dir.rglob('*.mo')) # sphinx.mo might be included
+ app.builder.compile_specific_catalogs([app.srcdir / 'admonitions.txt'])
+ actual = {str(x.relative_to(catalog_dir))
+ for x in catalog_dir.rglob('*.mo')
+ if x not in actual_on_boot}
+ assert actual == {'admonitions.mo'}
+
+
+@pytest.mark.usefixtures('_setup_test')
+@pytest.mark.test_params(shared_result='test-catalogs')
+@pytest.mark.sphinx(
+ 'html', testroot='intl',
+ confoverrides={'language': 'en', 'locale_dirs': ['./locale']})
+def test_compile_update_catalogs(app, status, warning):
+ app.builder.compile_update_catalogs()
+
+ locale_dir = app.srcdir / 'locale'
+ catalog_dir = locale_dir / app.config.language / 'LC_MESSAGES'
+ expect = {x.with_suffix('.mo') for x in set(catalog_dir.rglob('*.po'))}
+ actual = set(catalog_dir.rglob('*.mo'))
+ assert actual # not empty
+ assert actual == expect
diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644
index 0000000..0be0a58
--- /dev/null
+++ b/tests/test_config.py
@@ -0,0 +1,517 @@
+"""Test the sphinx.config.Config class."""
+
+import time
+from pathlib import Path
+from unittest import mock
+
+import pytest
+
+import sphinx
+from sphinx.config import ENUM, Config, check_confval_types
+from sphinx.errors import ConfigError, ExtensionError, VersionRequirementError
+
+
+@pytest.mark.sphinx(testroot='config', confoverrides={
+ 'root_doc': 'root',
+ 'nonexisting_value': 'True',
+ 'latex_elements.maketitle': 'blah blah blah',
+ 'modindex_common_prefix': 'path1,path2'})
+def test_core_config(app, status, warning):
+ cfg = app.config
+
+ # simple values
+ assert 'project' in cfg.__dict__
+ assert cfg.project == 'Sphinx <Tests>'
+ assert cfg.templates_path == ['_templates']
+
+ # overrides
+ assert cfg.root_doc == 'root'
+ assert cfg.latex_elements['maketitle'] == 'blah blah blah'
+ assert cfg.modindex_common_prefix == ['path1', 'path2']
+
+ # simple default values
+ assert 'locale_dirs' not in cfg.__dict__
+ assert cfg.locale_dirs == ['locales']
+ assert cfg.trim_footnote_reference_space is False
+
+ # complex default values
+ assert 'html_title' not in cfg.__dict__
+ assert cfg.html_title == 'Sphinx <Tests> 0.6alpha1 documentation'
+
+ # complex default values mustn't raise
+ for valuename in cfg.config_values:
+ getattr(cfg, valuename)
+
+ # "contains" gives True both for set and unset values
+ assert 'project' in cfg
+ assert 'html_title' in cfg
+ assert 'nonexisting_value' not in cfg
+
+ # invalid values
+ with pytest.raises(AttributeError):
+ _ = cfg._value
+ with pytest.raises(AttributeError):
+ _ = cfg.nonexisting_value
+
+ # non-value attributes are deleted from the namespace
+ with pytest.raises(AttributeError):
+ _ = cfg.sys
+
+ # setting attributes
+ cfg.project = 'Foo'
+ assert cfg.project == 'Foo'
+
+ # alternative access via item interface
+ cfg['project'] = 'Sphinx Tests'
+ assert cfg['project'] == cfg.project == 'Sphinx Tests'
+
+
+def test_config_not_found(tmp_path):
+ with pytest.raises(ConfigError):
+ Config.read(tmp_path)
+
+
+def test_extension_values():
+ config = Config()
+
+ # check standard settings
+ assert config.root_doc == 'index'
+
+ # can't override it by add_config_value()
+ with pytest.raises(ExtensionError) as excinfo:
+ config.add('root_doc', 'index', 'env', None)
+ assert 'already present' in str(excinfo.value)
+
+ # add a new config value
+ config.add('value_from_ext', [], 'env', None)
+ assert config.value_from_ext == []
+
+ # can't override it by add_config_value()
+ with pytest.raises(ExtensionError) as excinfo:
+ config.add('value_from_ext', [], 'env', None)
+ assert 'already present' in str(excinfo.value)
+
+
+def test_overrides():
+ config = Config({'value1': '1', 'value2': 2, 'value6': {'default': 6}},
+ {'value2': 999, 'value3': '999', 'value5.attr1': 999, 'value6.attr1': 999,
+ 'value7': 'abc,def,ghi', 'value8': 'abc,def,ghi'})
+ config.add('value1', None, 'env', ())
+ config.add('value2', None, 'env', ())
+ config.add('value3', 0, 'env', ())
+ config.add('value4', 0, 'env', ())
+ config.add('value5', {'default': 0}, 'env', ())
+ config.add('value6', {'default': 0}, 'env', ())
+ config.add('value7', None, 'env', ())
+ config.add('value8', [], 'env', ())
+ config.init_values()
+
+ assert config.value1 == '1'
+ assert config.value2 == 999
+ assert config.value3 == 999
+ assert config.value4 == 0
+ assert config.value5 == {'attr1': 999}
+ assert config.value6 == {'default': 6, 'attr1': 999}
+ assert config.value7 == 'abc,def,ghi'
+ assert config.value8 == ['abc', 'def', 'ghi']
+
+
+def test_overrides_boolean():
+ config = Config({}, {'value1': '1',
+ 'value2': '0',
+ 'value3': '0'})
+ config.add('value1', None, 'env', [bool])
+ config.add('value2', None, 'env', [bool])
+ config.add('value3', True, 'env', ())
+ config.init_values()
+
+ assert config.value1 is True
+ assert config.value2 is False
+ assert config.value3 is False
+
+
+@mock.patch("sphinx.config.logger")
+def test_errors_warnings(logger, tmp_path):
+ # test the error for syntax errors in the config file
+ (tmp_path / 'conf.py').write_text('project = \n', encoding='ascii')
+ with pytest.raises(ConfigError) as excinfo:
+ Config.read(tmp_path, {}, None)
+ assert 'conf.py' in str(excinfo.value)
+
+ # test the automatic conversion of 2.x only code in configs
+ (tmp_path / 'conf.py').write_text('project = u"Jägermeister"\n', encoding='utf8')
+ cfg = Config.read(tmp_path, {}, None)
+ cfg.init_values()
+ assert cfg.project == 'Jägermeister'
+ assert logger.called is False
+
+
+def test_errors_if_setup_is_not_callable(tmp_path, make_app):
+ # test the error to call setup() in the config file
+ (tmp_path / 'conf.py').write_text('setup = 1', encoding='utf8')
+ with pytest.raises(ConfigError) as excinfo:
+ make_app(srcdir=tmp_path)
+ assert 'callable' in str(excinfo.value)
+
+
+@pytest.fixture()
+def make_app_with_empty_project(make_app, tmp_path):
+ (tmp_path / 'conf.py').write_text('', encoding='utf8')
+
+ def _make_app(*args, **kw):
+ kw.setdefault('srcdir', Path(tmp_path))
+ return make_app(*args, **kw)
+ return _make_app
+
+
+@mock.patch.object(sphinx, '__display_version__', '1.6.4')
+def test_needs_sphinx(make_app_with_empty_project):
+ make_app = make_app_with_empty_project
+ # micro version
+ make_app(confoverrides={'needs_sphinx': '1.6.3'}) # OK: less
+ make_app(confoverrides={'needs_sphinx': '1.6.4'}) # OK: equals
+ with pytest.raises(VersionRequirementError):
+ make_app(confoverrides={'needs_sphinx': '1.6.5'}) # NG: greater
+
+ # minor version
+ make_app(confoverrides={'needs_sphinx': '1.5'}) # OK: less
+ make_app(confoverrides={'needs_sphinx': '1.6'}) # OK: equals
+ with pytest.raises(VersionRequirementError):
+ make_app(confoverrides={'needs_sphinx': '1.7'}) # NG: greater
+
+ # major version
+ make_app(confoverrides={'needs_sphinx': '0'}) # OK: less
+ make_app(confoverrides={'needs_sphinx': '1'}) # OK: equals
+ with pytest.raises(VersionRequirementError):
+ make_app(confoverrides={'needs_sphinx': '2'}) # NG: greater
+
+
+@mock.patch("sphinx.config.logger")
+def test_config_eol(logger, tmp_path):
+ # test config file's eol patterns: LF, CRLF
+ configfile = tmp_path / 'conf.py'
+ for eol in (b'\n', b'\r\n'):
+ configfile.write_bytes(b'project = "spam"' + eol)
+ cfg = Config.read(tmp_path, {}, None)
+ cfg.init_values()
+ assert cfg.project == 'spam'
+ assert logger.called is False
+
+
+@pytest.mark.sphinx(confoverrides={'root_doc': 123,
+ 'language': 'foo',
+ 'primary_domain': None})
+def test_builtin_conf(app, status, warning):
+ warnings = warning.getvalue()
+ assert 'root_doc' in warnings, (
+ 'override on builtin "root_doc" should raise a type warning')
+ assert 'language' not in warnings, (
+ 'explicitly permitted override on builtin "language" should NOT raise '
+ 'a type warning')
+ assert 'primary_domain' not in warnings, (
+ 'override to None on builtin "primary_domain" should NOT raise a type '
+ 'warning')
+
+
+# example classes for type checking
+class A:
+ pass
+
+
+class B(A):
+ pass
+
+
+class C(A):
+ pass
+
+
+# name, default, annotation, actual, warned
+TYPECHECK_WARNINGS = [
+ ('value1', 'string', None, 123, True), # wrong type
+ ('value2', lambda _: [], None, 123, True), # lambda with wrong type
+ ('value3', lambda _: [], None, [], False), # lambda with correct type
+ ('value4', 100, None, True, True), # child type
+ ('value5', False, None, True, False), # parent type
+ ('value6', [], None, (), True), # other sequence type
+ ('value7', 'string', [list], ['foo'], False), # explicit type annotation
+ ('value8', B(), None, C(), False), # sibling type
+ ('value9', None, None, 'foo', False), # no default or no annotations
+ ('value10', None, None, 123, False), # no default or no annotations
+ ('value11', None, [str], 'bar', False), # str
+ ('value12', 'string', None, 'bar', False), # str
+]
+
+
+@mock.patch("sphinx.config.logger")
+@pytest.mark.parametrize(('name', 'default', 'annotation', 'actual', 'warned'), TYPECHECK_WARNINGS)
+def test_check_types(logger, name, default, annotation, actual, warned):
+ config = Config({name: actual})
+ config.add(name, default, 'env', annotation or ())
+ config.init_values()
+ check_confval_types(None, config)
+ assert logger.warning.called == warned
+
+
+TYPECHECK_WARNING_MESSAGES = [
+ ('value1', 'string', [str], ['foo', 'bar'],
+ "The config value `value1' has type `list'; expected `str'."),
+ ('value1', 'string', [str, int], ['foo', 'bar'],
+ "The config value `value1' has type `list'; expected `str' or `int'."),
+ ('value1', 'string', [str, int, tuple], ['foo', 'bar'],
+ "The config value `value1' has type `list'; expected `str', `int', or `tuple'."),
+]
+
+
+@mock.patch("sphinx.config.logger")
+@pytest.mark.parametrize(('name', 'default', 'annotation', 'actual', 'message'), TYPECHECK_WARNING_MESSAGES)
+def test_conf_warning_message(logger, name, default, annotation, actual, message):
+ config = Config({name: actual})
+ config.add(name, default, False, annotation or ())
+ config.init_values()
+ check_confval_types(None, config)
+ assert logger.warning.called
+ assert logger.warning.call_args[0][0] == message
+
+
+@mock.patch("sphinx.config.logger")
+def test_check_enum(logger):
+ config = Config()
+ config.add('value', 'default', False, ENUM('default', 'one', 'two'))
+ config.init_values()
+ check_confval_types(None, config)
+ logger.warning.assert_not_called() # not warned
+
+
+@mock.patch("sphinx.config.logger")
+def test_check_enum_failed(logger):
+ config = Config({'value': 'invalid'})
+ config.add('value', 'default', False, ENUM('default', 'one', 'two'))
+ config.init_values()
+ check_confval_types(None, config)
+ assert logger.warning.called
+
+
+@mock.patch("sphinx.config.logger")
+def test_check_enum_for_list(logger):
+ config = Config({'value': ['one', 'two']})
+ config.add('value', 'default', False, ENUM('default', 'one', 'two'))
+ config.init_values()
+ check_confval_types(None, config)
+ logger.warning.assert_not_called() # not warned
+
+
+@mock.patch("sphinx.config.logger")
+def test_check_enum_for_list_failed(logger):
+ config = Config({'value': ['one', 'two', 'invalid']})
+ config.add('value', 'default', False, ENUM('default', 'one', 'two'))
+ config.init_values()
+ check_confval_types(None, config)
+ assert logger.warning.called
+
+
+nitpick_warnings = [
+ "WARNING: py:const reference target not found: prefix.anything.postfix",
+ "WARNING: py:class reference target not found: prefix.anything",
+ "WARNING: py:class reference target not found: anything.postfix",
+ "WARNING: js:class reference target not found: prefix.anything.postfix",
+]
+
+
+@pytest.mark.sphinx(testroot='nitpicky-warnings')
+def test_nitpick_base(app, status, warning):
+ app.builder.build_all()
+
+ warning = warning.getvalue().strip().split('\n')
+ assert len(warning) == len(nitpick_warnings)
+ for actual, expected in zip(warning, nitpick_warnings):
+ assert expected in actual
+
+
+@pytest.mark.sphinx(testroot='nitpicky-warnings', confoverrides={
+ 'nitpick_ignore': {
+ ('py:const', 'prefix.anything.postfix'),
+ ('py:class', 'prefix.anything'),
+ ('py:class', 'anything.postfix'),
+ ('js:class', 'prefix.anything.postfix'),
+ },
+})
+def test_nitpick_ignore(app, status, warning):
+ app.builder.build_all()
+ assert not len(warning.getvalue().strip())
+
+
+@pytest.mark.sphinx(testroot='nitpicky-warnings', confoverrides={
+ 'nitpick_ignore_regex': [
+ (r'py:.*', r'.*postfix'),
+ (r'.*:class', r'prefix.*'),
+ ],
+})
+def test_nitpick_ignore_regex1(app, status, warning):
+ app.builder.build_all()
+ assert not len(warning.getvalue().strip())
+
+
+@pytest.mark.sphinx(testroot='nitpicky-warnings', confoverrides={
+ 'nitpick_ignore_regex': [
+ (r'py:.*', r'prefix.*'),
+ (r'.*:class', r'.*postfix'),
+ ],
+})
+def test_nitpick_ignore_regex2(app, status, warning):
+ app.builder.build_all()
+ assert not len(warning.getvalue().strip())
+
+
+@pytest.mark.sphinx(testroot='nitpicky-warnings', confoverrides={
+ 'nitpick_ignore_regex': [
+ # None of these should match
+ (r'py:', r'.*'),
+ (r':class', r'.*'),
+ (r'', r'.*'),
+ (r'.*', r'anything'),
+ (r'.*', r'prefix'),
+ (r'.*', r'postfix'),
+ (r'.*', r''),
+ ],
+})
+def test_nitpick_ignore_regex_fullmatch(app, status, warning):
+ app.builder.build_all()
+
+ warning = warning.getvalue().strip().split('\n')
+ assert len(warning) == len(nitpick_warnings)
+ for actual, expected in zip(warning, nitpick_warnings):
+ assert expected in actual
+
+
+def test_conf_py_language_none(tmp_path):
+ """Regression test for #10474."""
+
+ # Given a conf.py file with language = None
+ (tmp_path / 'conf.py').write_text("language = None", encoding='utf-8')
+
+ # When we load conf.py into a Config object
+ cfg = Config.read(tmp_path, {}, None)
+ cfg.init_values()
+
+ # Then the language is coerced to English
+ assert cfg.language == "en"
+
+
+@mock.patch("sphinx.config.logger")
+def test_conf_py_language_none_warning(logger, tmp_path):
+ """Regression test for #10474."""
+
+ # Given a conf.py file with language = None
+ (tmp_path / 'conf.py').write_text("language = None", encoding='utf-8')
+
+ # When we load conf.py into a Config object
+ Config.read(tmp_path, {}, None)
+
+ # Then a warning is raised
+ assert logger.warning.called
+ assert logger.warning.call_args[0][0] == (
+ "Invalid configuration value found: 'language = None'. "
+ "Update your configuration to a valid language code. "
+ "Falling back to 'en' (English).")
+
+
+def test_conf_py_no_language(tmp_path):
+ """Regression test for #10474."""
+
+ # Given a conf.py file with no language attribute
+ (tmp_path / 'conf.py').write_text("", encoding='utf-8')
+
+ # When we load conf.py into a Config object
+ cfg = Config.read(tmp_path, {}, None)
+ cfg.init_values()
+
+ # Then the language is coerced to English
+ assert cfg.language == "en"
+
+
+def test_conf_py_nitpick_ignore_list(tmp_path):
+ """Regression test for #11355."""
+
+ # Given a conf.py file with no language attribute
+ (tmp_path / 'conf.py').write_text("", encoding='utf-8')
+
+ # When we load conf.py into a Config object
+ cfg = Config.read(tmp_path, {}, None)
+ cfg.init_values()
+
+ # Then the default nitpick_ignore[_regex] is an empty list
+ assert cfg.nitpick_ignore == []
+ assert cfg.nitpick_ignore_regex == []
+
+
+@pytest.fixture(params=[
+ # test with SOURCE_DATE_EPOCH unset: no modification
+ None,
+ # test with SOURCE_DATE_EPOCH set: copyright year should be updated
+ 1293840000,
+ 1293839999,
+])
+def source_date_year(request, monkeypatch):
+ sde = request.param
+ with monkeypatch.context() as m:
+ if sde:
+ m.setenv('SOURCE_DATE_EPOCH', str(sde))
+ yield time.gmtime(sde).tm_year
+ else:
+ m.delenv('SOURCE_DATE_EPOCH', raising=False)
+ yield None
+
+
+@pytest.mark.sphinx(testroot='copyright-multiline')
+def test_multi_line_copyright(source_date_year, app, monkeypatch):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf-8')
+
+ if source_date_year is None:
+ # check the copyright footer line by line (empty lines ignored)
+ assert ' &#169; Copyright 2006.<br/>\n' in content
+ assert ' &#169; Copyright 2006-2009, Alice.<br/>\n' in content
+ assert ' &#169; Copyright 2010-2013, Bob.<br/>\n' in content
+ assert ' &#169; Copyright 2014-2017, Charlie.<br/>\n' in content
+ assert ' &#169; Copyright 2018-2021, David.<br/>\n' in content
+ assert ' &#169; Copyright 2022-2025, Eve.' in content
+
+ # check the raw copyright footer block (empty lines included)
+ assert (
+ ' &#169; Copyright 2006.<br/>\n'
+ ' \n'
+ ' &#169; Copyright 2006-2009, Alice.<br/>\n'
+ ' \n'
+ ' &#169; Copyright 2010-2013, Bob.<br/>\n'
+ ' \n'
+ ' &#169; Copyright 2014-2017, Charlie.<br/>\n'
+ ' \n'
+ ' &#169; Copyright 2018-2021, David.<br/>\n'
+ ' \n'
+ ' &#169; Copyright 2022-2025, Eve.'
+ ) in content
+ else:
+ # check the copyright footer line by line (empty lines ignored)
+ assert f' &#169; Copyright {source_date_year}.<br/>\n' in content
+ assert f' &#169; Copyright 2006-{source_date_year}, Alice.<br/>\n' in content
+ assert f' &#169; Copyright 2010-{source_date_year}, Bob.<br/>\n' in content
+ assert f' &#169; Copyright 2014-{source_date_year}, Charlie.<br/>\n' in content
+ assert f' &#169; Copyright 2018-{source_date_year}, David.<br/>\n' in content
+ assert f' &#169; Copyright 2022-{source_date_year}, Eve.' in content
+
+ # check the raw copyright footer block (empty lines included)
+ assert (
+ f' &#169; Copyright {source_date_year}.<br/>\n'
+ f' \n'
+ f' &#169; Copyright 2006-{source_date_year}, Alice.<br/>\n'
+ f' \n'
+ f' &#169; Copyright 2010-{source_date_year}, Bob.<br/>\n'
+ f' \n'
+ f' &#169; Copyright 2014-{source_date_year}, Charlie.<br/>\n'
+ f' \n'
+ f' &#169; Copyright 2018-{source_date_year}, David.<br/>\n'
+ f' \n'
+ f' &#169; Copyright 2022-{source_date_year}, Eve.'
+ ) in content
diff --git a/tests/test_correct_year.py b/tests/test_correct_year.py
new file mode 100644
index 0000000..4ef77a6
--- /dev/null
+++ b/tests/test_correct_year.py
@@ -0,0 +1,29 @@
+"""Test copyright year adjustment"""
+import pytest
+
+
+@pytest.fixture(
+ params=[
+ # test with SOURCE_DATE_EPOCH unset: no modification
+ (None, '2006-2009'),
+ # test with SOURCE_DATE_EPOCH set: copyright year should be updated
+ ('1293840000', '2006-2011'),
+ ('1293839999', '2006-2010'),
+ ],
+
+)
+def expect_date(request, monkeypatch):
+ sde, expect = request.param
+ with monkeypatch.context() as m:
+ if sde:
+ m.setenv('SOURCE_DATE_EPOCH', sde)
+ else:
+ m.delenv('SOURCE_DATE_EPOCH', raising=False)
+ yield expect
+
+
+@pytest.mark.sphinx('html', testroot='correct-year')
+def test_correct_year(expect_date, app):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert expect_date in content
diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py
new file mode 100644
index 0000000..df7de57
--- /dev/null
+++ b/tests/test_directive_code.py
@@ -0,0 +1,595 @@
+"""Test the code-block directive."""
+
+import os.path
+
+import pytest
+from docutils import nodes
+
+from sphinx.config import Config
+from sphinx.directives.code import LiteralIncludeReader
+from sphinx.testing.util import etree_parse
+
+DUMMY_CONFIG = Config({}, {})
+
+
+@pytest.fixture(scope='module')
+def testroot(rootdir):
+ testroot_path = rootdir / 'test-directive-code'
+ return testroot_path
+
+
+@pytest.fixture(scope='module')
+def literal_inc_path(testroot):
+ return testroot / 'literal.inc'
+
+
+def test_LiteralIncludeReader(literal_inc_path):
+ options = {'lineno-match': True}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == literal_inc_path.read_text(encoding='utf8')
+ assert lines == 13
+ assert reader.lineno_start == 1
+
+
+def test_LiteralIncludeReader_lineno_start(literal_inc_path):
+ options = {'lineno-start': 4}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == literal_inc_path.read_text(encoding='utf8')
+ assert lines == 13
+ assert reader.lineno_start == 4
+
+
+def test_LiteralIncludeReader_pyobject1(literal_inc_path):
+ options = {'lineno-match': True, 'pyobject': 'Foo'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("class Foo:\n"
+ " pass\n")
+ assert reader.lineno_start == 5
+
+
+def test_LiteralIncludeReader_pyobject2(literal_inc_path):
+ options = {'pyobject': 'Bar'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("class Bar:\n"
+ " def baz():\n"
+ " pass\n")
+ assert reader.lineno_start == 1 # no lineno-match
+
+
+def test_LiteralIncludeReader_pyobject3(literal_inc_path):
+ options = {'pyobject': 'Bar.baz'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == (" def baz():\n"
+ " pass\n")
+
+
+def test_LiteralIncludeReader_pyobject_and_lines(literal_inc_path):
+ options = {'pyobject': 'Bar', 'lines': '2-'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == (" def baz():\n"
+ " pass\n")
+
+
+def test_LiteralIncludeReader_lines1(literal_inc_path):
+ options = {'lines': '1-3'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("# Literally included file using Python highlighting\n"
+ "\n"
+ "foo = \"Including Unicode characters: üöä\"\n")
+
+
+def test_LiteralIncludeReader_lines2(literal_inc_path):
+ options = {'lines': '1,3,5'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("# Literally included file using Python highlighting\n"
+ "foo = \"Including Unicode characters: üöä\"\n"
+ "class Foo:\n")
+
+
+def test_LiteralIncludeReader_lines_and_lineno_match1(literal_inc_path):
+ options = {'lines': '3-5', 'lineno-match': True}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("foo = \"Including Unicode characters: üöä\"\n"
+ "\n"
+ "class Foo:\n")
+ assert reader.lineno_start == 3
+
+
+@pytest.mark.sphinx() # init locale for errors
+def test_LiteralIncludeReader_lines_and_lineno_match2(literal_inc_path, app, status, warning):
+ options = {'lines': '0,3,5', 'lineno-match': True}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ with pytest.raises(ValueError, match='Cannot use "lineno-match" with a disjoint set of "lines"'):
+ reader.read()
+
+
+@pytest.mark.sphinx() # init locale for errors
+def test_LiteralIncludeReader_lines_and_lineno_match3(literal_inc_path, app, status, warning):
+ options = {'lines': '100-', 'lineno-match': True}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ with pytest.raises(ValueError, match="Line spec '100-': no lines pulled from include file"):
+ reader.read()
+
+
+def test_LiteralIncludeReader_start_at(literal_inc_path):
+ options = {'lineno-match': True, 'start-at': 'Foo', 'end-at': 'Bar'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("class Foo:\n"
+ " pass\n"
+ "\n"
+ "class Bar:\n")
+ assert reader.lineno_start == 5
+
+
+def test_LiteralIncludeReader_start_after(literal_inc_path):
+ options = {'lineno-match': True, 'start-after': 'Foo', 'end-before': 'Bar'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == (" pass\n"
+ "\n")
+ assert reader.lineno_start == 6
+
+
+def test_LiteralIncludeReader_start_after_and_lines(literal_inc_path):
+ options = {'lineno-match': True, 'lines': '6-',
+ 'start-after': 'Literally', 'end-before': 'comment'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("\n"
+ "class Bar:\n"
+ " def baz():\n"
+ " pass\n"
+ "\n")
+ assert reader.lineno_start == 7
+
+
+def test_LiteralIncludeReader_start_at_and_lines(literal_inc_path):
+ options = {'lines': '2, 3, 5', 'start-at': 'foo', 'end-before': '#'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("\n"
+ "class Foo:\n"
+ "\n")
+ assert reader.lineno_start == 1
+
+
+def test_LiteralIncludeReader_missing_start_and_end(literal_inc_path):
+ options = {'start-at': 'NOTHING'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ with pytest.raises(ValueError, match='start-at pattern not found: NOTHING'):
+ reader.read()
+
+ options = {'end-at': 'NOTHING'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ with pytest.raises(ValueError, match='end-at pattern not found: NOTHING'):
+ reader.read()
+
+ options = {'start-after': 'NOTHING'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ with pytest.raises(ValueError, match='start-after pattern not found: NOTHING'):
+ reader.read()
+
+ options = {'end-before': 'NOTHING'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ with pytest.raises(ValueError, match='end-before pattern not found: NOTHING'):
+ reader.read()
+
+
+def test_LiteralIncludeReader_end_before(literal_inc_path):
+ options = {'end-before': 'nclud'} # *nclud* matches first and third lines.
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("# Literally included file using Python highlighting\n"
+ "\n")
+
+
+def test_LiteralIncludeReader_prepend(literal_inc_path):
+ options = {'lines': '1', 'prepend': 'Hello', 'append': 'Sphinx'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("Hello\n"
+ "# Literally included file using Python highlighting\n"
+ "Sphinx\n")
+
+
+def test_LiteralIncludeReader_dedent(literal_inc_path):
+ # dedent: 2
+ options = {'lines': '9-11', 'dedent': 2}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == (" def baz():\n"
+ " pass\n"
+ "\n")
+
+ # dedent: 4
+ options = {'lines': '9-11', 'dedent': 4}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("def baz():\n"
+ " pass\n"
+ "\n")
+
+ # dedent: 6
+ options = {'lines': '9-11', 'dedent': 6}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("f baz():\n"
+ " pass\n"
+ "\n")
+
+ # dedent: None
+ options = {'lines': '9-11', 'dedent': None}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("def baz():\n"
+ " pass\n"
+ "\n")
+
+
+def test_LiteralIncludeReader_dedent_and_append_and_prepend(literal_inc_path):
+ # dedent: 2
+ options = {'lines': '9-11', 'dedent': 2, 'prepend': 'class Foo:', 'append': '# comment'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("class Foo:\n"
+ " def baz():\n"
+ " pass\n"
+ "\n"
+ "# comment\n")
+
+
+def test_LiteralIncludeReader_tabwidth(testroot):
+ # tab-width: 4
+ options = {'tab-width': 4, 'pyobject': 'Qux'}
+ reader = LiteralIncludeReader(testroot / 'target.py', options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("class Qux:\n"
+ " def quux(self):\n"
+ " pass\n")
+
+ # tab-width: 8
+ options = {'tab-width': 8, 'pyobject': 'Qux'}
+ reader = LiteralIncludeReader(testroot / 'target.py', options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("class Qux:\n"
+ " def quux(self):\n"
+ " pass\n")
+
+
+def test_LiteralIncludeReader_tabwidth_dedent(testroot):
+ options = {'tab-width': 4, 'dedent': 4, 'pyobject': 'Qux.quux'}
+ reader = LiteralIncludeReader(testroot / 'target.py', options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("def quux(self):\n"
+ " pass\n")
+
+
+def test_LiteralIncludeReader_diff(testroot, literal_inc_path):
+ options = {'diff': testroot / 'literal-diff.inc'}
+ reader = LiteralIncludeReader(literal_inc_path, options, DUMMY_CONFIG)
+ content, lines = reader.read()
+ assert content == ("--- " + os.path.join(testroot, 'literal-diff.inc') + "\n"
+ "+++ " + os.path.join(testroot, 'literal.inc') + "\n"
+ "@@ -6,8 +6,8 @@\n"
+ " pass\n"
+ " \n"
+ " class Bar:\n"
+ "- def baz(self):\n"
+ "+ def baz():\n"
+ " pass\n"
+ " \n"
+ "-# comment after Bar class\n"
+ "+# comment after Bar class definition\n"
+ " def bar(): pass\n")
+
+
+@pytest.mark.sphinx('xml', testroot='directive-code')
+def test_code_block(app, status, warning):
+ app.builder.build('index')
+ et = etree_parse(app.outdir / 'index.xml')
+ secs = et.findall('./section/section')
+ code_block = secs[0].findall('literal_block')
+ assert len(code_block) > 0
+ actual = code_block[0].text
+ expect = (
+ " def ruby?\n" +
+ " false\n" +
+ " end"
+ )
+ assert actual == expect
+
+
+@pytest.mark.sphinx('html', testroot='directive-code')
+def test_force_option(app, status, warning):
+ app.builder.build(['force'])
+ assert 'force.rst' not in warning.getvalue()
+
+
+@pytest.mark.sphinx('html', testroot='directive-code')
+def test_code_block_caption_html(app, status, warning):
+ app.builder.build(['caption'])
+ html = (app.outdir / 'caption.html').read_text(encoding='utf8')
+ caption = ('<div class="code-block-caption">'
+ '<span class="caption-number">Listing 1 </span>'
+ '<span class="caption-text">caption <em>test</em> rb'
+ '</span><a class="headerlink" href="#id1" '
+ 'title="Link to this code">\xb6</a></div>')
+ assert caption in html
+
+
+@pytest.mark.sphinx('latex', testroot='directive-code')
+def test_code_block_caption_latex(app, status, warning):
+ app.builder.build_all()
+ latex = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ caption = '\\sphinxSetupCaptionForVerbatim{caption \\sphinxstyleemphasis{test} rb}'
+ label = '\\def\\sphinxLiteralBlockLabel{\\label{\\detokenize{caption:id1}}}'
+ link = '\\hyperref[\\detokenize{caption:name-test-rb}]' \
+ '{Listing \\ref{\\detokenize{caption:name-test-rb}}}'
+ assert caption in latex
+ assert label in latex
+ assert link in latex
+
+
+@pytest.mark.sphinx('latex', testroot='directive-code')
+def test_code_block_namedlink_latex(app, status, warning):
+ app.builder.build_all()
+ latex = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ label1 = '\\def\\sphinxLiteralBlockLabel{\\label{\\detokenize{caption:name-test-rb}}}'
+ link1 = '\\hyperref[\\detokenize{caption:name-test-rb}]'\
+ '{\\sphinxcrossref{\\DUrole{std,std-ref}{Ruby}}'
+ label2 = ('\\def\\sphinxLiteralBlockLabel'
+ '{\\label{\\detokenize{namedblocks:some-ruby-code}}}')
+ link2 = '\\hyperref[\\detokenize{namedblocks:some-ruby-code}]'\
+ '{\\sphinxcrossref{\\DUrole{std,std-ref}{the ruby code}}}'
+ assert label1 in latex
+ assert link1 in latex
+ assert label2 in latex
+ assert link2 in latex
+
+
+@pytest.mark.sphinx('latex', testroot='directive-code')
+def test_code_block_emphasize_latex(app, status, warning):
+ app.builder.build(['emphasize'])
+ latex = (app.outdir / 'python.tex').read_text(encoding='utf8').replace('\r\n', '\n')
+ includes = '\\fvset{hllines={, 5, 6, 13, 14, 15, 24, 25, 26,}}%\n'
+ assert includes in latex
+ includes = '\\end{sphinxVerbatim}\n\\sphinxresetverbatimhllines\n'
+ assert includes in latex
+
+
+@pytest.mark.sphinx('xml', testroot='directive-code')
+def test_literal_include(app, status, warning):
+ app.builder.build(['index'])
+ et = etree_parse(app.outdir / 'index.xml')
+ secs = et.findall('./section/section')
+ literal_include = secs[1].findall('literal_block')
+ literal_src = (app.srcdir / 'literal.inc').read_text(encoding='utf8')
+ assert len(literal_include) > 0
+ actual = literal_include[0].text
+ assert actual == literal_src
+
+
+@pytest.mark.sphinx('xml', testroot='directive-code')
+def test_literal_include_block_start_with_comment_or_brank(app, status, warning):
+ app.builder.build(['python'])
+ et = etree_parse(app.outdir / 'python.xml')
+ secs = et.findall('./section/section')
+ literal_include = secs[0].findall('literal_block')
+ assert len(literal_include) > 0
+ actual = literal_include[0].text
+ expect = (
+ 'def block_start_with_comment():\n'
+ ' # Comment\n'
+ ' return 1\n'
+ )
+ assert actual == expect
+
+ actual = literal_include[1].text
+ expect = (
+ 'def block_start_with_blank():\n'
+ '\n'
+ ' return 1\n'
+ )
+ assert actual == expect
+
+
+@pytest.mark.sphinx('html', testroot='directive-code')
+def test_literal_include_linenos(app, status, warning):
+ app.builder.build(['linenos'])
+ html = (app.outdir / 'linenos.html').read_text(encoding='utf8')
+
+ # :linenos:
+ assert ('<span class="linenos"> 1</span><span class="c1">'
+ '# Literally included file using Python highlighting</span>' in html)
+
+ # :lineno-start:
+ assert ('<span class="linenos">200</span><span class="c1">'
+ '# Literally included file using Python highlighting</span>' in html)
+
+ # :lines: 5-9
+ assert ('<span class="linenos">5</span><span class="k">class</span> '
+ '<span class="nc">Foo</span><span class="p">:</span>' in html)
+
+
+@pytest.mark.sphinx('latex', testroot='directive-code')
+def test_literalinclude_file_whole_of_emptyline(app, status, warning):
+ app.builder.build_all()
+ latex = (app.outdir / 'python.tex').read_text(encoding='utf8').replace('\r\n', '\n')
+ includes = (
+ '\\begin{sphinxVerbatim}'
+ '[commandchars=\\\\\\{\\},numbers=left,firstnumber=1,stepnumber=1]\n'
+ '\n'
+ '\n'
+ '\n'
+ '\\end{sphinxVerbatim}\n')
+ assert includes in latex
+
+
+@pytest.mark.sphinx('html', testroot='directive-code')
+def test_literalinclude_caption_html(app, status, warning):
+ app.builder.build_all()
+ html = (app.outdir / 'caption.html').read_text(encoding='utf8')
+ caption = ('<div class="code-block-caption">'
+ '<span class="caption-number">Listing 2 </span>'
+ '<span class="caption-text">caption <strong>test</strong> py'
+ '</span><a class="headerlink" href="#id2" '
+ 'title="Link to this code">\xb6</a></div>')
+ assert caption in html
+
+
+@pytest.mark.sphinx('latex', testroot='directive-code')
+def test_literalinclude_caption_latex(app, status, warning):
+ app.builder.build('index')
+ latex = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ caption = '\\sphinxSetupCaptionForVerbatim{caption \\sphinxstylestrong{test} py}'
+ label = '\\def\\sphinxLiteralBlockLabel{\\label{\\detokenize{caption:id2}}}'
+ link = '\\hyperref[\\detokenize{caption:name-test-py}]' \
+ '{Listing \\ref{\\detokenize{caption:name-test-py}}}'
+ assert caption in latex
+ assert label in latex
+ assert link in latex
+
+
+@pytest.mark.sphinx('latex', testroot='directive-code')
+def test_literalinclude_namedlink_latex(app, status, warning):
+ app.builder.build('index')
+ latex = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ label1 = '\\def\\sphinxLiteralBlockLabel{\\label{\\detokenize{caption:name-test-py}}}'
+ link1 = '\\hyperref[\\detokenize{caption:name-test-py}]'\
+ '{\\sphinxcrossref{\\DUrole{std,std-ref}{Python}}'
+ label2 = ('\\def\\sphinxLiteralBlockLabel'
+ '{\\label{\\detokenize{namedblocks:some-python-code}}}')
+ link2 = '\\hyperref[\\detokenize{namedblocks:some-python-code}]'\
+ '{\\sphinxcrossref{\\DUrole{std,std-ref}{the python code}}}'
+ assert label1 in latex
+ assert link1 in latex
+ assert label2 in latex
+ assert link2 in latex
+
+
+@pytest.mark.sphinx('xml', testroot='directive-code')
+def test_literalinclude_classes(app, status, warning):
+ app.builder.build(['classes'])
+ et = etree_parse(app.outdir / 'classes.xml')
+ secs = et.findall('./section/section')
+
+ code_block = secs[0].findall('literal_block')
+ assert len(code_block) > 0
+ assert code_block[0].get('classes') == 'foo bar'
+ assert code_block[0].get('names') == 'code_block'
+
+ literalinclude = secs[1].findall('literal_block')
+ assert len(literalinclude) > 0
+ assert literalinclude[0].get('classes') == 'bar baz'
+ assert literalinclude[0].get('names') == 'literal_include'
+
+
+@pytest.mark.sphinx('xml', testroot='directive-code')
+def test_literalinclude_pydecorators(app, status, warning):
+ app.builder.build(['py-decorators'])
+ et = etree_parse(app.outdir / 'py-decorators.xml')
+ secs = et.findall('./section/section')
+
+ literal_include = secs[0].findall('literal_block')
+ assert len(literal_include) == 3
+
+ actual = literal_include[0].text
+ expect = (
+ '@class_decorator\n'
+ '@other_decorator()\n'
+ 'class TheClass(object):\n'
+ '\n'
+ ' @method_decorator\n'
+ ' @other_decorator()\n'
+ ' def the_method():\n'
+ ' pass\n'
+ )
+ assert actual == expect
+
+ actual = literal_include[1].text
+ expect = (
+ ' @method_decorator\n'
+ ' @other_decorator()\n'
+ ' def the_method():\n'
+ ' pass\n'
+ )
+ assert actual == expect
+
+ actual = literal_include[2].text
+ expect = (
+ '@function_decorator\n'
+ '@other_decorator()\n'
+ 'def the_function():\n'
+ ' pass\n'
+ )
+ assert actual == expect
+
+
+@pytest.mark.sphinx('dummy', testroot='directive-code')
+def test_code_block_highlighted(app, status, warning):
+ app.builder.build(['highlight'])
+ doctree = app.env.get_doctree('highlight')
+ codeblocks = list(doctree.findall(nodes.literal_block))
+
+ assert codeblocks[0]['language'] == 'default'
+ assert codeblocks[1]['language'] == 'python2'
+ assert codeblocks[2]['language'] == 'python3'
+ assert codeblocks[3]['language'] == 'python2'
+
+
+@pytest.mark.sphinx('html', testroot='directive-code')
+def test_linenothreshold(app, status, warning):
+ app.builder.build(['linenothreshold'])
+ html = (app.outdir / 'linenothreshold.html').read_text(encoding='utf8')
+
+ # code-block using linenothreshold
+ assert ('<span class="linenos">1</span><span class="k">class</span> '
+ '<span class="nc">Foo</span><span class="p">:</span>' in html)
+
+ # code-block not using linenothreshold (no line numbers)
+ assert '<span></span><span class="c1"># comment</span>' in html
+
+ # literal include using linenothreshold
+ assert ('<span class="linenos"> 1</span><span class="c1">'
+ '# Literally included file using Python highlighting</span>' in html)
+
+ # literal include not using linenothreshold (no line numbers)
+ assert ('<span></span><span class="c1"># Very small literal include '
+ '(linenothreshold check)</span>' in html)
+
+
+@pytest.mark.sphinx('dummy', testroot='directive-code')
+def test_code_block_dedent(app, status, warning):
+ app.builder.build(['dedent'])
+ doctree = app.env.get_doctree('dedent')
+ codeblocks = list(doctree.findall(nodes.literal_block))
+ # Note: comparison string should not have newlines at the beginning or end
+ text_0_indent = '''First line
+Second line
+ Third line
+Fourth line'''
+ text_2_indent = ''' First line
+ Second line
+ Third line
+ Fourth line'''
+ text_4_indent = ''' First line
+ Second line
+ Third line
+ Fourth line'''
+
+ assert codeblocks[0].astext() == text_0_indent
+ assert codeblocks[1].astext() == text_0_indent
+ assert codeblocks[2].astext() == text_4_indent
+ assert codeblocks[3].astext() == text_2_indent
+ assert codeblocks[4].astext() == text_4_indent
+ assert codeblocks[5].astext() == text_0_indent
diff --git a/tests/test_directive_object_description.py b/tests/test_directive_object_description.py
new file mode 100644
index 0000000..f2c9f9d
--- /dev/null
+++ b/tests/test_directive_object_description.py
@@ -0,0 +1,59 @@
+"""Test object description directives."""
+
+import docutils.utils
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.io import create_publisher
+from sphinx.testing import restructuredtext
+from sphinx.util.docutils import sphinx_domains
+
+
+def _doctree_for_test(builder, docname: str) -> nodes.document:
+ builder.env.prepare_settings(docname)
+ publisher = create_publisher(builder.app, 'restructuredtext')
+ with sphinx_domains(builder.env):
+ publisher.set_source(source_path=builder.env.doc2path(docname))
+ publisher.publish()
+ return publisher.document
+
+
+@pytest.mark.sphinx('text', testroot='object-description-sections')
+def test_object_description_sections(app):
+ doctree = _doctree_for_test(app.builder, 'index')
+ # <document>
+ # <index>
+ # <desc>
+ # <desc_signature>
+ # <desc_name>
+ # func
+ # <desc_parameterlist>
+ # <desc_content>
+ # <section>
+ # <title>
+ # Overview
+ # <paragraph>
+ # Lorem ipsum dolar sit amet
+
+ assert isinstance(doctree[0], addnodes.index)
+ assert isinstance(doctree[1], addnodes.desc)
+ assert isinstance(doctree[1][0], addnodes.desc_signature)
+ assert isinstance(doctree[1][1], addnodes.desc_content)
+ assert isinstance(doctree[1][1][0], nodes.section)
+ assert isinstance(doctree[1][1][0][0], nodes.title)
+ assert doctree[1][1][0][0][0] == 'Overview'
+ assert isinstance(doctree[1][1][0][1], nodes.paragraph)
+ assert doctree[1][1][0][1][0] == 'Lorem ipsum dolar sit amet'
+
+
+def test_object_description_content_line_number(app):
+ text = (".. py:function:: foo(bar)\n" +
+ "\n" +
+ " Some link here: :ref:`abc`\n")
+ doc = restructuredtext.parse(app, text)
+ xrefs = list(doc.findall(condition=addnodes.pending_xref))
+ assert len(xrefs) == 1
+ source, line = docutils.utils.get_source_line(xrefs[0])
+ assert 'index.rst' in source
+ assert line == 3
diff --git a/tests/test_directive_only.py b/tests/test_directive_only.py
new file mode 100644
index 0000000..2e9ea63
--- /dev/null
+++ b/tests/test_directive_only.py
@@ -0,0 +1,46 @@
+"""Test the only directive with the test root."""
+
+import re
+
+import pytest
+from docutils import nodes
+
+
+@pytest.mark.sphinx('text', testroot='directive-only')
+def test_sectioning(app, status, warning):
+
+ def getsects(section):
+ if not isinstance(section, nodes.section):
+ return [getsects(n) for n in section.children]
+ title = section.next_node(nodes.title).astext().strip()
+ subsects = []
+ children = section.children[:]
+ while children:
+ node = children.pop(0)
+ if isinstance(node, nodes.section):
+ subsects.append(node)
+ continue
+ children = list(node.children) + children
+ return [title, [getsects(subsect) for subsect in subsects]]
+
+ def testsects(prefix, sects, indent=0):
+ title = sects[0]
+ parent_num = title.split()[0]
+ assert prefix == parent_num, \
+ 'Section out of place: %r' % title
+ for i, subsect in enumerate(sects[1]):
+ num = subsect[0].split()[0]
+ assert re.match('[0-9]+[.0-9]*[.]', num), \
+ 'Unnumbered section: %r' % subsect[0]
+ testsects(prefix + str(i + 1) + '.', subsect, indent + 4)
+
+ app.builder.build(['only'])
+ doctree = app.env.get_doctree('only')
+ app.env.apply_post_transforms(doctree, 'only')
+
+ parts = [getsects(n)
+ for n in [_n for _n in doctree.children if isinstance(_n, nodes.section)]]
+ for i, s in enumerate(parts):
+ testsects(str(i + 1) + '.', s, 4)
+ assert len(parts) == 4, 'Expected 4 document level headings, got:\n%s' % \
+ '\n'.join([p[0] for p in parts])
diff --git a/tests/test_directive_other.py b/tests/test_directive_other.py
new file mode 100644
index 0000000..1feb251
--- /dev/null
+++ b/tests/test_directive_other.py
@@ -0,0 +1,195 @@
+"""Test the other directives."""
+from pathlib import Path
+
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_toctree(app):
+ text = (".. toctree::\n"
+ "\n"
+ " foo\n"
+ " bar/index\n"
+ " baz\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'foo'), (None, 'bar/index'), (None, 'baz')],
+ includefiles=['foo', 'bar/index', 'baz'])
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_relative_toctree(app):
+ text = (".. toctree::\n"
+ "\n"
+ " bar_1\n"
+ " bar_2\n"
+ " bar_3\n"
+ " ../quux\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'bar/index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'bar/bar_1'), (None, 'bar/bar_2'), (None, 'bar/bar_3'),
+ (None, 'quux')],
+ includefiles=['bar/bar_1', 'bar/bar_2', 'bar/bar_3', 'quux'])
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_toctree_urls_and_titles(app):
+ text = (".. toctree::\n"
+ "\n"
+ " Sphinx <https://www.sphinx-doc.org/>\n"
+ " https://readthedocs.org/\n"
+ " The BAR <bar/index>\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[('Sphinx', 'https://www.sphinx-doc.org/'),
+ (None, 'https://readthedocs.org/'),
+ ('The BAR', 'bar/index')],
+ includefiles=['bar/index'])
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_toctree_glob(app):
+ text = (".. toctree::\n"
+ " :glob:\n"
+ "\n"
+ " *\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'baz'), (None, 'foo'), (None, 'quux')],
+ includefiles=['baz', 'foo', 'quux'])
+
+ # give both docname and glob (case1)
+ text = (".. toctree::\n"
+ " :glob:\n"
+ "\n"
+ " foo\n"
+ " *\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'foo'), (None, 'baz'), (None, 'quux')],
+ includefiles=['foo', 'baz', 'quux'])
+
+ # give both docname and glob (case2)
+ text = (".. toctree::\n"
+ " :glob:\n"
+ "\n"
+ " *\n"
+ " foo\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'baz'), (None, 'foo'), (None, 'quux'), (None, 'foo')],
+ includefiles=['baz', 'foo', 'quux', 'foo'])
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_toctree_glob_and_url(app):
+ text = (".. toctree::\n"
+ " :glob:\n"
+ "\n"
+ " https://example.com/?q=sphinx\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'https://example.com/?q=sphinx')],
+ includefiles=[])
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_reversed_toctree(app):
+ text = (".. toctree::\n"
+ " :reversed:\n"
+ "\n"
+ " foo\n"
+ " bar/index\n"
+ " baz\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'baz'), (None, 'bar/index'), (None, 'foo')],
+ includefiles=['baz', 'bar/index', 'foo'])
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_toctree_twice(app):
+ text = (".. toctree::\n"
+ "\n"
+ " foo\n"
+ " foo\n")
+
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
+ assert_node(doctree[0][0],
+ entries=[(None, 'foo'), (None, 'foo')],
+ includefiles=['foo', 'foo'])
+
+
+@pytest.mark.sphinx(testroot='directive-include')
+def test_include_include_read_event(app):
+ sources_reported = []
+
+ def source_read_handler(_app, relative_path, parent_docname, source):
+ sources_reported.append((relative_path, parent_docname, source[0]))
+
+ app.connect("include-read", source_read_handler)
+ text = """\
+.. include:: baz/baz.rst
+ :start-line: 4
+.. include:: text.txt
+ :literal:
+.. include:: bar.txt
+"""
+ app.env.find_files(app.config, app.builder)
+ restructuredtext.parse(app, text, 'index')
+
+ included_files = {filename.as_posix()
+ for filename, p, s in sources_reported}
+ assert 'index.rst' not in included_files # sources don't emit 'include-read'
+ assert 'baz/baz.rst' in included_files
+ assert 'text.txt' not in included_files # text was included as literal, no rst parsing
+ assert 'bar.txt' in included_files # suffix not in source-suffixes
+ assert (Path('baz/baz.rst'), 'index', '\nBaz was here.') in sources_reported
+
+
+@pytest.mark.sphinx(testroot='directive-include')
+def test_include_include_read_event_nested_includes(app):
+
+ def source_read_handler(_app, _relative_path, _parent_docname, source):
+ text = source[0].replace("#magical", "amazing")
+ source[0] = text
+
+ app.connect("include-read", source_read_handler)
+ text = ".. include:: baz/baz.rst\n"
+ app.env.find_files(app.config, app.builder)
+ doctree = restructuredtext.parse(app, text, 'index')
+ assert_node(doctree, addnodes.document)
+ assert len(doctree.children) == 3
+ assert_node(doctree.children[1], nodes.paragraph)
+ assert doctree.children[1].rawsource == "The amazing foo."
diff --git a/tests/test_directive_patch.py b/tests/test_directive_patch.py
new file mode 100644
index 0000000..f4eb8f9
--- /dev/null
+++ b/tests/test_directive_patch.py
@@ -0,0 +1,110 @@
+"""Test the patched directives."""
+
+import pytest
+from docutils import nodes
+
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+
+
+def test_code_directive(app):
+ # normal case
+ text = ('.. code::\n'
+ '\n'
+ ' print("hello world")\n')
+
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, nodes.literal_block, 'print("hello world")'])
+ assert_node(doctree[0], language="default", highlight_args={})
+
+ # with language
+ text = ('.. code:: python\n'
+ '\n'
+ ' print("hello world")\n')
+
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, nodes.literal_block, 'print("hello world")'])
+ assert_node(doctree[0], language="python", highlight_args={})
+
+ # :number-lines: option
+ text = ('.. code:: python\n'
+ ' :number-lines:\n'
+ '\n'
+ ' print("hello world")\n')
+
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, nodes.literal_block, 'print("hello world")'])
+ assert_node(doctree[0], language="python", linenos=True, highlight_args={})
+
+ # :number-lines: option
+ text = ('.. code:: python\n'
+ ' :number-lines: 5\n'
+ '\n'
+ ' print("hello world")\n')
+
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, nodes.literal_block, 'print("hello world")'])
+ assert_node(doctree[0], language="python", linenos=True, highlight_args={'linenostart': 5})
+
+
+@pytest.mark.sphinx(testroot='directive-csv-table')
+def test_csv_table_directive(app):
+ # relative path from current document
+ text = ('.. csv-table::\n'
+ ' :file: example.csv\n')
+ doctree = restructuredtext.parse(app, text, docname="subdir/index")
+ assert_node(doctree,
+ ([nodes.table, nodes.tgroup, (nodes.colspec,
+ nodes.colspec,
+ nodes.colspec,
+ [nodes.tbody, nodes.row])],))
+ assert_node(doctree[0][0][3][0],
+ ([nodes.entry, nodes.paragraph, "FOO"],
+ [nodes.entry, nodes.paragraph, "BAR"],
+ [nodes.entry, nodes.paragraph, "BAZ"]))
+
+ # absolute path from source directory
+ text = ('.. csv-table::\n'
+ ' :file: /example.csv\n')
+ doctree = restructuredtext.parse(app, text, docname="subdir/index")
+ assert_node(doctree,
+ ([nodes.table, nodes.tgroup, (nodes.colspec,
+ nodes.colspec,
+ nodes.colspec,
+ [nodes.tbody, nodes.row])],))
+ assert_node(doctree[0][0][3][0],
+ ([nodes.entry, nodes.paragraph, "foo"],
+ [nodes.entry, nodes.paragraph, "bar"],
+ [nodes.entry, nodes.paragraph, "baz"]))
+
+
+def test_math_directive(app):
+ # normal case
+ text = '.. math:: E = mc^2'
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, nodes.math_block, 'E = mc^2\n\n'])
+
+ # :name: option
+ text = ('.. math:: E = mc^2\n'
+ ' :name: eq1\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, (nodes.target,
+ [nodes.math_block, "E = mc^2\n\n"])])
+ assert_node(doctree[1], nodes.math_block, docname='index', label="eq1", number=1)
+
+ # :label: option
+ text = ('.. math:: E = mc^2\n'
+ ' :label: eq2\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, (nodes.target,
+ [nodes.math_block, 'E = mc^2\n\n'])])
+ assert_node(doctree[1], nodes.math_block, docname='index', label="eq2", number=2)
+
+ # :label: option without value
+ text = ('.. math:: E = mc^2\n'
+ ' :label:\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, [nodes.document, (nodes.target,
+ [nodes.math_block, 'E = mc^2\n\n'])])
+ assert_node(doctree[1], nodes.math_block, ids=['equation-index-0'],
+ docname='index', label="index:0", number=3)
diff --git a/tests/test_directives_no_typesetting.py b/tests/test_directives_no_typesetting.py
new file mode 100644
index 0000000..fd101fb
--- /dev/null
+++ b/tests/test_directives_no_typesetting.py
@@ -0,0 +1,108 @@
+"""Tests the directives"""
+
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+
+DOMAINS = [
+ # directive, no-index, no-index-entry, signature of f, signature of g, index entry of g
+ ('c:function', False, True, 'void f()', 'void g()', ('single', 'g (C function)', 'c.g', '', None)),
+ ('cpp:function', False, True, 'void f()', 'void g()', ('single', 'g (C++ function)', '_CPPv41gv', '', None)),
+ ('js:function', True, True, 'f()', 'g()', ('single', 'g() (built-in function)', 'g', '', None)),
+ ('py:function', True, True, 'f()', 'g()', ('pair', 'built-in function; g()', 'g', '', None)),
+ ('rst:directive', True, False, 'f', 'g', ('single', 'g (directive)', 'directive-g', '', None)),
+ ('cmdoption', True, False, 'f', 'g', ('pair', 'command line option; g', 'cmdoption-arg-g', '', None)),
+ ('envvar', True, False, 'f', 'g', ('single', 'environment variable; g', 'envvar-g', '', None)),
+]
+
+
+@pytest.mark.parametrize(('directive', 'no_index', 'no_index_entry', 'sig_f', 'sig_g', 'index_g'), DOMAINS)
+def test_object_description_no_typesetting(app, directive, no_index, no_index_entry, sig_f, sig_g, index_g):
+ text = (f'.. {directive}:: {sig_f}\n'
+ f' :no-typesetting:\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, nodes.target))
+
+
+@pytest.mark.parametrize(('directive', 'no_index', 'no_index_entry', 'sig_f', 'sig_g', 'index_g'), DOMAINS)
+def test_object_description_no_typesetting_twice(app, directive, no_index, no_index_entry, sig_f, sig_g, index_g):
+ text = (f'.. {directive}:: {sig_f}\n'
+ f' :no-typesetting:\n'
+ f'.. {directive}:: {sig_g}\n'
+ f' :no-typesetting:\n')
+ doctree = restructuredtext.parse(app, text)
+ # Note that all index nodes come before the target nodes
+ assert_node(doctree, (addnodes.index, addnodes.index, nodes.target, nodes.target))
+
+
+@pytest.mark.parametrize(('directive', 'no_index', 'no_index_entry', 'sig_f', 'sig_g', 'index_g'), DOMAINS)
+def test_object_description_no_typesetting_noindex_orig(app, directive, no_index, no_index_entry, sig_f, sig_g, index_g):
+ if not no_index:
+ pytest.skip(f'{directive} does not support :no-index: option')
+ text = (f'.. {directive}:: {sig_f}\n'
+ f' :no-index:\n'
+ f'.. {directive}:: {sig_g}\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, addnodes.desc, addnodes.index, addnodes.desc))
+ assert_node(doctree[2], addnodes.index, entries=[index_g])
+
+
+@pytest.mark.parametrize(('directive', 'no_index', 'no_index_entry', 'sig_f', 'sig_g', 'index_g'), DOMAINS)
+def test_object_description_no_typesetting_noindex(app, directive, no_index, no_index_entry, sig_f, sig_g, index_g):
+ if not no_index:
+ pytest.skip(f'{directive} does not support :no-index: option')
+ text = (f'.. {directive}:: {sig_f}\n'
+ f' :no-index:\n'
+ f' :no-typesetting:\n'
+ f'.. {directive}:: {sig_g}\n'
+ f' :no-typesetting:\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, addnodes.index, nodes.target))
+ assert_node(doctree[0], addnodes.index, entries=[])
+ assert_node(doctree[1], addnodes.index, entries=[index_g])
+
+
+@pytest.mark.parametrize(('directive', 'no_index', 'no_index_entry', 'sig_f', 'sig_g', 'index_g'), DOMAINS)
+def test_object_description_no_typesetting_no_index_entry(app, directive, no_index, no_index_entry, sig_f, sig_g, index_g):
+ if not no_index_entry:
+ pytest.skip(f'{directive} does not support :no-index-entry: option')
+ text = (f'.. {directive}:: {sig_f}\n'
+ f' :no-index-entry:\n'
+ f' :no-typesetting:\n'
+ f'.. {directive}:: {sig_g}\n'
+ f' :no-typesetting:\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, addnodes.index, nodes.target, nodes.target))
+ assert_node(doctree[0], addnodes.index, entries=[])
+ assert_node(doctree[1], addnodes.index, entries=[index_g])
+
+
+@pytest.mark.parametrize(('directive', 'no_index', 'no_index_entry', 'sig_f', 'sig_g', 'index_g'), DOMAINS)
+def test_object_description_no_typesetting_code(app, directive, no_index, no_index_entry, sig_f, sig_g, index_g):
+ text = (f'.. {directive}:: {sig_f}\n'
+ f' :no-typesetting:\n'
+ f'.. {directive}:: {sig_g}\n'
+ f' :no-typesetting:\n'
+ f'.. code::\n'
+ f'\n'
+ f' code\n')
+ doctree = restructuredtext.parse(app, text)
+ # Note that all index nodes come before the targets
+ assert_node(doctree, (addnodes.index, addnodes.index, nodes.target, nodes.target, nodes.literal_block))
+
+
+@pytest.mark.parametrize(('directive', 'no_index', 'no_index_entry', 'sig_f', 'sig_g', 'index_g'), DOMAINS)
+def test_object_description_no_typesetting_heading(app, directive, no_index, no_index_entry, sig_f, sig_g, index_g):
+ text = (f'.. {directive}:: {sig_f}\n'
+ f' :no-typesetting:\n'
+ f'.. {directive}:: {sig_g}\n'
+ f' :no-typesetting:\n'
+ f'\n'
+ f'Heading\n'
+ f'=======\n')
+ doctree = restructuredtext.parse(app, text)
+ # Note that all index nodes come before the targets and the heading is floated before those.
+ assert_node(doctree, (nodes.title, addnodes.index, addnodes.index, nodes.target, nodes.target))
diff --git a/tests/test_docutilsconf.py b/tests/test_docutilsconf.py
new file mode 100644
index 0000000..def6cb6
--- /dev/null
+++ b/tests/test_docutilsconf.py
@@ -0,0 +1,29 @@
+"""Test docutils.conf support for several writers."""
+
+import pytest
+from docutils import nodes
+
+from sphinx.testing.util import assert_node
+from sphinx.util.docutils import patch_docutils
+
+
+@pytest.mark.sphinx('dummy', testroot='docutilsconf', freshenv=True)
+def test_html_with_default_docutilsconf(app, status, warning):
+ with patch_docutils(app.confdir):
+ app.build()
+
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0][1], [nodes.paragraph, ("Sphinx ",
+ [nodes.footnote_reference, "1"])])
+
+
+@pytest.mark.sphinx('dummy', testroot='docutilsconf', freshenv=True,
+ docutilsconf=('[restructuredtext parser]\n'
+ 'trim_footnote_reference_space: true\n'))
+def test_html_with_docutilsconf(app, status, warning):
+ with patch_docutils(app.confdir):
+ app.build()
+
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0][1], [nodes.paragraph, ("Sphinx",
+ [nodes.footnote_reference, "1"])])
diff --git a/tests/test_domain_c.py b/tests/test_domain_c.py
new file mode 100644
index 0000000..6582a0c
--- /dev/null
+++ b/tests/test_domain_c.py
@@ -0,0 +1,1076 @@
+"""Tests the C Domain"""
+
+import itertools
+import zlib
+from xml.etree import ElementTree
+
+import pytest
+
+from sphinx import addnodes
+from sphinx.addnodes import (
+ desc,
+ desc_content,
+ desc_name,
+ desc_parameter,
+ desc_parameterlist,
+ desc_sig_name,
+ desc_sig_space,
+ desc_signature,
+ desc_signature_line,
+ pending_xref,
+)
+from sphinx.domains.c import (
+ DefinitionError,
+ DefinitionParser,
+ Symbol,
+ _id_prefix,
+ _macroKeywords,
+ _max_id,
+)
+from sphinx.ext.intersphinx import load_mappings, normalize_intersphinx_mapping
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+from sphinx.writers.text import STDINDENT
+
+
+class Config:
+ c_id_attributes = ["id_attr", 'LIGHTGBM_C_EXPORT']
+ c_paren_attributes = ["paren_attr"]
+ c_extra_keywords = _macroKeywords
+
+
+def parse(name, string):
+ parser = DefinitionParser(string, location=None, config=Config())
+ parser.allowFallbackExpressionParsing = False
+ ast = parser.parse_declaration(name, name)
+ parser.assert_end()
+ return ast
+
+
+def _check(name, input, idDict, output, key, asTextOutput):
+ if key is None:
+ key = name
+ key += ' '
+ if name in ('function', 'member'):
+ inputActual = input
+ outputAst = output
+ outputAsText = output
+ else:
+ inputActual = input.format(key='')
+ outputAst = output.format(key='')
+ outputAsText = output.format(key=key)
+ if asTextOutput is not None:
+ outputAsText = asTextOutput
+
+ # first a simple check of the AST
+ ast = parse(name, inputActual)
+ res = str(ast)
+ if res != outputAst:
+ print("")
+ print("Input: ", input)
+ print("Result: ", res)
+ print("Expected: ", outputAst)
+ raise DefinitionError
+ rootSymbol = Symbol(None, None, None, None, None)
+ symbol = rootSymbol.add_declaration(ast, docname="TestDoc", line=42)
+ parentNode = addnodes.desc()
+ signode = addnodes.desc_signature(input, '')
+ parentNode += signode
+ ast.describe_signature(signode, 'lastIsName', symbol, options={})
+ resAsText = parentNode.astext()
+ if resAsText != outputAsText:
+ print("")
+ print("Input: ", input)
+ print("astext(): ", resAsText)
+ print("Expected: ", outputAsText)
+ raise DefinitionError
+
+ idExpected = [None]
+ for i in range(1, _max_id + 1):
+ if i in idDict:
+ idExpected.append(idDict[i])
+ else:
+ idExpected.append(idExpected[i - 1])
+ idActual = [None]
+ for i in range(1, _max_id + 1):
+ # try:
+ id = ast.get_id(version=i)
+ assert id is not None
+ idActual.append(id[len(_id_prefix[i]):])
+ # except NoOldIdError:
+ # idActual.append(None)
+
+ res = [True]
+ for i in range(1, _max_id + 1):
+ res.append(idExpected[i] == idActual[i])
+
+ if not all(res):
+ print("input: %s" % input.rjust(20))
+ for i in range(1, _max_id + 1):
+ if res[i]:
+ continue
+ print("Error in id version %d." % i)
+ print("result: %s" % idActual[i])
+ print("expected: %s" % idExpected[i])
+ # print(rootSymbol.dump(0))
+ raise DefinitionError
+
+
+def check(name, input, idDict, output=None, key=None, asTextOutput=None):
+ if output is None:
+ output = input
+ # First, check without semicolon
+ _check(name, input, idDict, output, key, asTextOutput)
+ if name != 'macro':
+ # Second, check with semicolon
+ _check(name, input + ' ;', idDict, output + ';', key,
+ asTextOutput + ';' if asTextOutput is not None else None)
+
+
+def test_domain_c_ast_expressions():
+ def exprCheck(expr, output=None):
+ parser = DefinitionParser(expr, location=None, config=Config())
+ parser.allowFallbackExpressionParsing = False
+ ast = parser.parse_expression()
+ parser.assert_end()
+ # first a simple check of the AST
+ if output is None:
+ output = expr
+ res = str(ast)
+ if res != output:
+ print("")
+ print("Input: ", input)
+ print("Result: ", res)
+ print("Expected: ", output)
+ raise DefinitionError
+ displayString = ast.get_display_string()
+ if res != displayString:
+ # note: if the expression contains an anon name then this will trigger a falsely
+ print("")
+ print("Input: ", expr)
+ print("Result: ", res)
+ print("Display: ", displayString)
+ raise DefinitionError
+
+ # type expressions
+ exprCheck('int*')
+ exprCheck('int *const*')
+ exprCheck('int *volatile*')
+ exprCheck('int *restrict*')
+ exprCheck('int *(*)(double)')
+ exprCheck('const int*')
+ exprCheck('__int64')
+ exprCheck('unsigned __int64')
+
+ # actual expressions
+
+ # primary
+ exprCheck('true')
+ exprCheck('false')
+ ints = ['5', '0', '075', '0x0123456789ABCDEF', '0XF', '0b1', '0B1',
+ "0b0'1'0", "00'1'2", "0x0'1'2", "1'2'3"]
+ unsignedSuffix = ['', 'u', 'U']
+ longSuffix = ['', 'l', 'L', 'll', 'LL']
+ for i in ints:
+ for u in unsignedSuffix:
+ for l in longSuffix:
+ expr = i + u + l
+ exprCheck(expr)
+ expr = i + l + u
+ exprCheck(expr)
+ for suffix in ['', 'f', 'F', 'l', 'L']:
+ for e in [
+ '5e42', '5e+42', '5e-42',
+ '5.', '5.e42', '5.e+42', '5.e-42',
+ '.5', '.5e42', '.5e+42', '.5e-42',
+ '5.0', '5.0e42', '5.0e+42', '5.0e-42',
+ "1'2'3e7'8'9", "1'2'3.e7'8'9",
+ ".4'5'6e7'8'9", "1'2'3.4'5'6e7'8'9"]:
+ expr = e + suffix
+ exprCheck(expr)
+ for e in [
+ 'ApF', 'Ap+F', 'Ap-F',
+ 'A.', 'A.pF', 'A.p+F', 'A.p-F',
+ '.A', '.ApF', '.Ap+F', '.Ap-F',
+ 'A.B', 'A.BpF', 'A.Bp+F', 'A.Bp-F',
+ "A'B'Cp1'2'3", "A'B'C.p1'2'3",
+ ".D'E'Fp1'2'3", "A'B'C.D'E'Fp1'2'3"]:
+ expr = "0x" + e + suffix
+ exprCheck(expr)
+ exprCheck('"abc\\"cba"') # string
+ # character literals
+ for p in ['', 'u8', 'u', 'U', 'L']:
+ exprCheck(p + "'a'")
+ exprCheck(p + "'\\n'")
+ exprCheck(p + "'\\012'")
+ exprCheck(p + "'\\0'")
+ exprCheck(p + "'\\x0a'")
+ exprCheck(p + "'\\x0A'")
+ exprCheck(p + "'\\u0a42'")
+ exprCheck(p + "'\\u0A42'")
+ exprCheck(p + "'\\U0001f34c'")
+ exprCheck(p + "'\\U0001F34C'")
+
+ exprCheck('(5)')
+ exprCheck('C')
+ # postfix
+ exprCheck('A(2)')
+ exprCheck('A[2]')
+ exprCheck('a.b.c')
+ exprCheck('a->b->c')
+ exprCheck('i++')
+ exprCheck('i--')
+ # unary
+ exprCheck('++5')
+ exprCheck('--5')
+ exprCheck('*5')
+ exprCheck('&5')
+ exprCheck('+5')
+ exprCheck('-5')
+ exprCheck('!5')
+ exprCheck('not 5')
+ exprCheck('~5')
+ exprCheck('compl 5')
+ exprCheck('sizeof(T)')
+ exprCheck('sizeof -42')
+ exprCheck('alignof(T)')
+ # cast
+ exprCheck('(int)2')
+ # binary op
+ exprCheck('5 || 42')
+ exprCheck('5 or 42')
+ exprCheck('5 && 42')
+ exprCheck('5 and 42')
+ exprCheck('5 | 42')
+ exprCheck('5 bitor 42')
+ exprCheck('5 ^ 42')
+ exprCheck('5 xor 42')
+ exprCheck('5 & 42')
+ exprCheck('5 bitand 42')
+ # ['==', '!=']
+ exprCheck('5 == 42')
+ exprCheck('5 != 42')
+ exprCheck('5 not_eq 42')
+ # ['<=', '>=', '<', '>']
+ exprCheck('5 <= 42')
+ exprCheck('5 >= 42')
+ exprCheck('5 < 42')
+ exprCheck('5 > 42')
+ # ['<<', '>>']
+ exprCheck('5 << 42')
+ exprCheck('5 >> 42')
+ # ['+', '-']
+ exprCheck('5 + 42')
+ exprCheck('5 - 42')
+ # ['*', '/', '%']
+ exprCheck('5 * 42')
+ exprCheck('5 / 42')
+ exprCheck('5 % 42')
+ # ['.*', '->*']
+ # conditional
+ # TODO
+ # assignment
+ exprCheck('a = 5')
+ exprCheck('a *= 5')
+ exprCheck('a /= 5')
+ exprCheck('a %= 5')
+ exprCheck('a += 5')
+ exprCheck('a -= 5')
+ exprCheck('a >>= 5')
+ exprCheck('a <<= 5')
+ exprCheck('a &= 5')
+ exprCheck('a and_eq 5')
+ exprCheck('a ^= 5')
+ exprCheck('a xor_eq 5')
+ exprCheck('a |= 5')
+ exprCheck('a or_eq 5')
+
+
+def test_domain_c_ast_fundamental_types():
+ def types():
+ def signed(t):
+ yield t
+ yield 'signed ' + t
+ yield 'unsigned ' + t
+
+ # integer types
+ # -------------
+ yield 'void'
+ yield from ('_Bool', 'bool')
+ yield from signed('char')
+ yield from signed('short')
+ yield from signed('short int')
+ yield from signed('int')
+ yield from ('signed', 'unsigned')
+ yield from signed('long')
+ yield from signed('long int')
+ yield from signed('long long')
+ yield from signed('long long int')
+ yield from ('__int128', '__uint128')
+ # extensions
+ for t in ('__int8', '__int16', '__int32', '__int64', '__int128'):
+ yield from signed(t)
+
+ # floating point types
+ # --------------------
+ yield from ('_Decimal32', '_Decimal64', '_Decimal128')
+ for f in ('float', 'double', 'long double'):
+ yield f
+ yield from (f + " _Complex", f + " complex")
+ yield from ("_Complex " + f, "complex " + f)
+ yield from ("_Imaginary " + f, "imaginary " + f)
+ # extensions
+ # https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html#Floating-Types
+ yield from ('__float80', '_Float64x',
+ '__float128', '_Float128',
+ '__ibm128')
+ # https://gcc.gnu.org/onlinedocs/gcc/Half-Precision.html#Half-Precision
+ yield '__fp16'
+
+ # fixed-point types (extension)
+ # -----------------------------
+ # https://gcc.gnu.org/onlinedocs/gcc/Fixed-Point.html#Fixed-Point
+ for sat in ('', '_Sat '):
+ for t in ('_Fract', 'fract', '_Accum', 'accum'):
+ for size in ('short ', '', 'long ', 'long long '):
+ for tt in signed(size + t):
+ yield sat + tt
+
+ for t in types():
+ input = "{key}%s foo" % t
+ output = ' '.join(input.split())
+ check('type', input, {1: 'foo'}, key='typedef', output=output)
+ if ' ' in t:
+ # try permutations of all components
+ tcs = t.split()
+ for p in itertools.permutations(tcs):
+ input = "{key}%s foo" % ' '.join(p)
+ output = ' '.join(input.split())
+ check("type", input, {1: 'foo'}, key='typedef', output=output)
+
+
+def test_domain_c_ast_type_definitions():
+ check('type', "{key}T", {1: "T"})
+
+ check('type', "{key}bool *b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool *const b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool *const *b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool *volatile *b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool *restrict *b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool *volatile const b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool *volatile const b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool *volatile const *b", {1: 'b'}, key='typedef')
+ check('type', "{key}bool b[]", {1: 'b'}, key='typedef')
+ check('type', "{key}long long int foo", {1: 'foo'}, key='typedef')
+ # test decl specs on right
+ check('type', "{key}bool const b", {1: 'b'}, key='typedef')
+
+ # from breathe#267 (named function parameters for function pointers
+ check('type', '{key}void (*gpio_callback_t)(struct device *port, uint32_t pin)',
+ {1: 'gpio_callback_t'}, key='typedef')
+
+
+def test_domain_c_ast_macro_definitions():
+ check('macro', 'M', {1: 'M'})
+ check('macro', 'M()', {1: 'M'})
+ check('macro', 'M(arg)', {1: 'M'})
+ check('macro', 'M(arg1, arg2)', {1: 'M'})
+ check('macro', 'M(arg1, arg2, arg3)', {1: 'M'})
+ check('macro', 'M(...)', {1: 'M'})
+ check('macro', 'M(arg, ...)', {1: 'M'})
+ check('macro', 'M(arg1, arg2, ...)', {1: 'M'})
+ check('macro', 'M(arg1, arg2, arg3, ...)', {1: 'M'})
+ # GNU extension
+ check('macro', 'M(arg1, arg2, arg3...)', {1: 'M'})
+ with pytest.raises(DefinitionError):
+ check('macro', 'M(arg1, arg2..., arg3)', {1: 'M'})
+
+
+def test_domain_c_ast_member_definitions():
+ check('member', 'void a', {1: 'a'})
+ check('member', '_Bool a', {1: 'a'})
+ check('member', 'bool a', {1: 'a'})
+ check('member', 'char a', {1: 'a'})
+ check('member', 'int a', {1: 'a'})
+ check('member', 'float a', {1: 'a'})
+ check('member', 'double a', {1: 'a'})
+
+ check('member', 'unsigned long a', {1: 'a'})
+ check('member', '__int64 a', {1: 'a'})
+ check('member', 'unsigned __int64 a', {1: 'a'})
+
+ check('member', 'int .a', {1: 'a'})
+
+ check('member', 'int *a', {1: 'a'})
+ check('member', 'int **a', {1: 'a'})
+ check('member', 'const int a', {1: 'a'})
+ check('member', 'volatile int a', {1: 'a'})
+ check('member', 'restrict int a', {1: 'a'})
+ check('member', 'volatile const int a', {1: 'a'})
+ check('member', 'restrict const int a', {1: 'a'})
+ check('member', 'restrict volatile int a', {1: 'a'})
+ check('member', 'restrict volatile const int a', {1: 'a'})
+
+ check('member', 'T t', {1: 't'})
+
+ check('member', 'int a[]', {1: 'a'})
+
+ check('member', 'int (*p)[]', {1: 'p'})
+
+ check('member', 'int a[42]', {1: 'a'})
+ check('member', 'int a = 42', {1: 'a'})
+ check('member', 'T a = {}', {1: 'a'})
+ check('member', 'T a = {1}', {1: 'a'})
+ check('member', 'T a = {1, 2}', {1: 'a'})
+ check('member', 'T a = {1, 2, 3}', {1: 'a'})
+
+ # test from issue #1539
+ check('member', 'CK_UTF8CHAR model[16]', {1: 'model'})
+
+ check('member', 'auto int a', {1: 'a'})
+ check('member', 'register int a', {1: 'a'})
+ check('member', 'extern int a', {1: 'a'})
+ check('member', 'static int a', {1: 'a'})
+
+ check('member', 'thread_local int a', {1: 'a'})
+ check('member', '_Thread_local int a', {1: 'a'})
+ check('member', 'extern thread_local int a', {1: 'a'})
+ check('member', 'thread_local extern int a', {1: 'a'},
+ 'extern thread_local int a')
+ check('member', 'static thread_local int a', {1: 'a'})
+ check('member', 'thread_local static int a', {1: 'a'},
+ 'static thread_local int a')
+
+ check('member', 'int b : 3', {1: 'b'})
+
+
+def test_domain_c_ast_function_definitions():
+ check('function', 'void f()', {1: 'f'})
+ check('function', 'void f(int)', {1: 'f'})
+ check('function', 'void f(int i)', {1: 'f'})
+ check('function', 'void f(int i, int j)', {1: 'f'})
+ check('function', 'void f(...)', {1: 'f'})
+ check('function', 'void f(int i, ...)', {1: 'f'})
+ check('function', 'void f(struct T)', {1: 'f'})
+ check('function', 'void f(struct T t)', {1: 'f'})
+ check('function', 'void f(union T)', {1: 'f'})
+ check('function', 'void f(union T t)', {1: 'f'})
+ check('function', 'void f(enum T)', {1: 'f'})
+ check('function', 'void f(enum T t)', {1: 'f'})
+
+ # test from issue #1539
+ check('function', 'void f(A x[])', {1: 'f'})
+
+ # test from issue #2377
+ check('function', 'void (*signal(int sig, void (*func)(int)))(int)', {1: 'signal'})
+
+ check('function', 'extern void f()', {1: 'f'})
+ check('function', 'static void f()', {1: 'f'})
+ check('function', 'inline void f()', {1: 'f'})
+
+ # tests derived from issue #1753 (skip to keep sanity)
+ check('function', "void f(float *q(double))", {1: 'f'})
+ check('function', "void f(float *(*q)(double))", {1: 'f'})
+ check('function', "void f(float (*q)(double))", {1: 'f'})
+ check('function', "int (*f(double d))(float)", {1: 'f'})
+ check('function', "int (*f(bool b))[5]", {1: 'f'})
+ check('function', "void f(int *const p)", {1: 'f'})
+ check('function', "void f(int *volatile const p)", {1: 'f'})
+
+ # from breathe#223
+ check('function', 'void f(struct E e)', {1: 'f'})
+ check('function', 'void f(enum E e)', {1: 'f'})
+ check('function', 'void f(union E e)', {1: 'f'})
+
+ # array declarators
+ check('function', 'void f(int arr[])', {1: 'f'})
+ check('function', 'void f(int arr[*])', {1: 'f'})
+ cvrs = ['', 'const', 'volatile', 'restrict', 'restrict volatile const']
+ for cvr in cvrs:
+ space = ' ' if len(cvr) != 0 else ''
+ check('function', f'void f(int arr[{cvr}*])', {1: 'f'})
+ check('function', f'void f(int arr[{cvr}])', {1: 'f'})
+ check('function', f'void f(int arr[{cvr}{space}42])', {1: 'f'})
+ check('function', f'void f(int arr[static{space}{cvr} 42])', {1: 'f'})
+ check('function', f'void f(int arr[{cvr}{space}static 42])', {1: 'f'},
+ output=f'void f(int arr[static{space}{cvr} 42])')
+ check('function', 'void f(int arr[const static volatile 42])', {1: 'f'},
+ output='void f(int arr[static volatile const 42])')
+
+ with pytest.raises(DefinitionError):
+ parse('function', 'void f(int for)')
+
+ # from #8960
+ check('function', 'void f(void (*p)(int, double), int i)', {1: 'f'})
+
+
+def test_domain_c_ast_nested_name():
+ check('struct', '{key}.A', {1: "A"})
+ check('struct', '{key}.A.B', {1: "A.B"})
+ check('function', 'void f(.A a)', {1: "f"})
+ check('function', 'void f(.A.B a)', {1: "f"})
+
+
+def test_domain_c_ast_struct_definitions():
+ check('struct', '{key}A', {1: 'A'})
+
+
+def test_domain_c_ast_union_definitions():
+ check('union', '{key}A', {1: 'A'})
+
+
+def test_domain_c_ast_enum_definitions():
+ check('enum', '{key}A', {1: 'A'})
+
+ check('enumerator', '{key}A', {1: 'A'})
+ check('enumerator', '{key}A = 42', {1: 'A'})
+
+
+def test_domain_c_ast_anon_definitions():
+ check('struct', '@a', {1: "@a"}, asTextOutput='struct [anonymous]')
+ check('union', '@a', {1: "@a"}, asTextOutput='union [anonymous]')
+ check('enum', '@a', {1: "@a"}, asTextOutput='enum [anonymous]')
+ check('struct', '@1', {1: "@1"}, asTextOutput='struct [anonymous]')
+ check('struct', '@a.A', {1: "@a.A"}, asTextOutput='struct [anonymous].A')
+
+
+def test_domain_c_ast_initializers():
+ idsMember = {1: 'v'}
+ idsFunction = {1: 'f'}
+ # no init
+ check('member', 'T v', idsMember)
+ check('function', 'void f(T v)', idsFunction)
+ # with '=', assignment-expression
+ check('member', 'T v = 42', idsMember)
+ check('function', 'void f(T v = 42)', idsFunction)
+ # with '=', braced-init
+ check('member', 'T v = {}', idsMember)
+ check('function', 'void f(T v = {})', idsFunction)
+ check('member', 'T v = {42, 42, 42}', idsMember)
+ check('function', 'void f(T v = {42, 42, 42})', idsFunction)
+ check('member', 'T v = {42, 42, 42,}', idsMember)
+ check('function', 'void f(T v = {42, 42, 42,})', idsFunction)
+ # TODO: designator-list
+
+
+def test_domain_c_ast_attributes():
+ # style: C++
+ check('member', '[[]] int f', {1: 'f'})
+ check('member', '[ [ ] ] int f', {1: 'f'},
+ # this will fail when the proper grammar is implemented
+ output='[[ ]] int f')
+ check('member', '[[a]] int f', {1: 'f'})
+ # style: GNU
+ check('member', '__attribute__(()) int f', {1: 'f'})
+ check('member', '__attribute__((a)) int f', {1: 'f'})
+ check('member', '__attribute__((a, b)) int f', {1: 'f'})
+ check('member', '__attribute__((optimize(3))) int f', {1: 'f'})
+ check('member', '__attribute__((format(printf, 1, 2))) int f', {1: 'f'})
+ # style: user-defined id
+ check('member', 'id_attr int f', {1: 'f'})
+ # style: user-defined paren
+ check('member', 'paren_attr() int f', {1: 'f'})
+ check('member', 'paren_attr(a) int f', {1: 'f'})
+ check('member', 'paren_attr("") int f', {1: 'f'})
+ check('member', 'paren_attr(()[{}][]{}) int f', {1: 'f'})
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr(() int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr([) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr({) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr([)]) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr((])) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr({]}) int f')
+
+ # position: decl specs
+ check('function', 'static inline __attribute__(()) void f()', {1: 'f'},
+ output='__attribute__(()) static inline void f()')
+ check('function', '[[attr1]] [[attr2]] void f()', {1: 'f'})
+ # position: declarator
+ check('member', 'int *[[attr1]] [[attr2]] i', {1: 'i'})
+ check('member', 'int *const [[attr1]] [[attr2]] volatile i', {1: 'i'},
+ output='int *[[attr1]] [[attr2]] volatile const i')
+ check('member', 'int *[[attr1]] [[attr2]] *i', {1: 'i'})
+ # position: parameters
+ check('function', 'void f() [[attr1]] [[attr2]]', {1: 'f'})
+
+ # position: enumerator
+ check('enumerator', '{key}Foo [[attr1]] [[attr2]]', {1: 'Foo'})
+ check('enumerator', '{key}Foo [[attr1]] [[attr2]] = 42', {1: 'Foo'})
+
+ # issue michaeljones/breathe#500
+ check('function', 'LIGHTGBM_C_EXPORT int LGBM_BoosterFree(int handle)',
+ {1: 'LGBM_BoosterFree'})
+
+
+def test_extra_keywords():
+ with pytest.raises(DefinitionError,
+ match='Expected identifier in nested name'):
+ parse('function', 'void complex(void)')
+
+
+# def test_print():
+# # used for getting all the ids out for checking
+# for a in ids:
+# print(a)
+# raise DefinitionError
+
+
+def split_warnigns(warning):
+ ws = warning.getvalue().split("\n")
+ assert len(ws) >= 1
+ assert ws[-1] == ""
+ return ws[:-1]
+
+
+def filter_warnings(warning, file):
+ lines = split_warnigns(warning)
+ res = [l for l in lines if "domain-c" in l and f"{file}.rst" in l and
+ "WARNING: document isn't included in any toctree" not in l]
+ print(f"Filtered warnings for file '{file}':")
+ for w in res:
+ print(w)
+ return res
+
+
+def extract_role_links(app, filename):
+ t = (app.outdir / filename).read_text(encoding='utf8')
+ lis = [l for l in t.split('\n') if l.startswith("<li")]
+ entries = []
+ for l in lis:
+ li = ElementTree.fromstring(l) # NoQA: S314 # using known data in tests
+ aList = list(li.iter('a'))
+ assert len(aList) == 1
+ a = aList[0]
+ target = a.attrib['href'].lstrip('#')
+ title = a.attrib['title']
+ assert len(a) == 1
+ code = a[0]
+ assert code.tag == 'code'
+ text = ''.join(code.itertext())
+ entries.append((target, title, text))
+ return entries
+
+
+@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
+def test_domain_c_build(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "index")
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
+def test_domain_c_build_namespace(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "namespace")
+ assert len(ws) == 0
+ t = (app.outdir / "namespace.html").read_text(encoding='utf8')
+ for id_ in ('NS.NSVar', 'NULLVar', 'ZeroVar', 'NS2.NS3.NS2NS3Var', 'PopVar'):
+ assert f'id="c.{id_}"' in t
+
+
+@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
+def test_domain_c_build_anon_dup_decl(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "anon-dup-decl")
+ assert len(ws) == 2
+ assert "WARNING: c:identifier reference target not found: @a" in ws[0]
+ assert "WARNING: c:identifier reference target not found: @b" in ws[1]
+
+
+@pytest.mark.sphinx(confoverrides={'nitpicky': True})
+def test_domain_c_build_semicolon(app, warning):
+ text = """
+.. c:member:: int member;
+.. c:var:: int var;
+.. c:function:: void f();
+.. .. c:macro:: NO_SEMICOLON;
+.. c:struct:: Struct;
+.. c:union:: Union;
+.. c:enum:: Enum;
+.. c:enumerator:: Enumerator;
+.. c:type:: Type;
+.. c:type:: int TypeDef;
+"""
+ restructuredtext.parse(app, text)
+ ws = split_warnigns(warning)
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
+def test_domain_c_build_function_param_target(app, warning):
+ # the anchor for function parameters should be the function
+ app.builder.build_all()
+ ws = filter_warnings(warning, "function_param_target")
+ assert len(ws) == 0
+ entries = extract_role_links(app, "function_param_target.html")
+ assert entries == [
+ ('c.function_param_target.f', 'i', 'i'),
+ ('c.function_param_target.f', 'f.i', 'f.i'),
+ ]
+
+
+@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
+def test_domain_c_build_ns_lookup(app, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "ns_lookup")
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-c', confoverrides={'nitpicky': True})
+def test_domain_c_build_field_role(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "field-role")
+ assert len(ws) == 0
+
+
+def _get_obj(app, queryName):
+ domain = app.env.get_domain('c')
+ for name, _dispname, objectType, docname, anchor, _prio in domain.get_objects():
+ if name == queryName:
+ return (docname, anchor, objectType)
+ return (queryName, "not", "found")
+
+
+@pytest.mark.sphinx(testroot='domain-c-intersphinx', confoverrides={'nitpicky': True})
+def test_domain_c_build_intersphinx(tmp_path, app, status, warning):
+ # a splitting of test_ids_vs_tags0 into the primary directives in a remote project,
+ # and then the references in the test project
+ origSource = """\
+.. c:member:: int _member
+.. c:var:: int _var
+.. c:function:: void _function()
+.. c:macro:: _macro
+.. c:struct:: _struct
+.. c:union:: _union
+.. c:enum:: _enum
+
+ .. c:enumerator:: _enumerator
+
+.. c:type:: _type
+.. c:function:: void _functionParam(int param)
+""" # noqa: F841
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(b'''\
+# Sphinx inventory version 2
+# Project: C Intersphinx Test
+# Version:
+# The remainder of this file is compressed using zlib.
+''' + zlib.compress(b'''\
+_enum c:enum 1 index.html#c.$ -
+_enum._enumerator c:enumerator 1 index.html#c.$ -
+_enumerator c:enumerator 1 index.html#c._enum.$ -
+_function c:function 1 index.html#c.$ -
+_functionParam c:function 1 index.html#c.$ -
+_functionParam.param c:functionParam 1 index.html#c._functionParam -
+_macro c:macro 1 index.html#c.$ -
+_member c:member 1 index.html#c.$ -
+_struct c:struct 1 index.html#c.$ -
+_type c:type 1 index.html#c.$ -
+_union c:union 1 index.html#c.$ -
+_var c:member 1 index.html#c.$ -
+''')) # noqa: W291
+ app.config.intersphinx_mapping = {
+ 'https://localhost/intersphinx/c/': str(inv_file),
+ }
+ app.config.intersphinx_cache_limit = 0
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ app.builder.build_all()
+ ws = filter_warnings(warning, "index")
+ assert len(ws) == 0
+
+
+def test_domain_c_parse_cfunction(app):
+ text = (".. c:function:: PyObject* "
+ "PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="c", objtype="function", no_index=False)
+
+ entry = _get_obj(app, 'PyType_GenericAlloc')
+ assert entry == ('index', 'c.PyType_GenericAlloc', 'function')
+
+
+def test_domain_c_parse_cmember(app):
+ text = ".. c:member:: PyObject* PyTypeObject.tp_bases"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1], addnodes.desc, desctype="member",
+ domain="c", objtype="member", no_index=False)
+
+ entry = _get_obj(app, 'PyTypeObject.tp_bases')
+ assert entry == ('index', 'c.PyTypeObject.tp_bases', 'member')
+
+
+def test_domain_c_parse_cvar(app):
+ text = ".. c:var:: PyObject* PyClass_Type"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1], addnodes.desc, desctype="var",
+ domain="c", objtype="var", no_index=False)
+
+ entry = _get_obj(app, 'PyClass_Type')
+ assert entry == ('index', 'c.PyClass_Type', 'member')
+
+
+def test_domain_c_parse_no_index_entry(app):
+ text = (".. c:function:: void f()\n"
+ ".. c:function:: void g()\n"
+ " :no-index-entry:\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, desc, addnodes.index, desc))
+ assert_node(doctree[0], addnodes.index, entries=[('single', 'f (C function)', 'c.f', '', None)])
+ assert_node(doctree[2], addnodes.index, entries=[])
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'c_maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cfunction_signature_with_c_maximum_signature_line_length_equal(app):
+ text = ".. c:function:: str hello(str name)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, "hello"]],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="c", objtype="function", no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, "str"]],
+ desc_sig_space,
+ [desc_sig_name, "name"],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'c_maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cfunction_signature_with_c_maximum_signature_line_length_force_single(app):
+ text = (".. c:function:: str hello(str names)\n"
+ " :single-line-parameter-list:")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, "hello"]],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="c", objtype="function", no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, "str"]],
+ desc_sig_space,
+ [desc_sig_name, "names"],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'c_maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cfunction_signature_with_c_maximum_signature_line_length_break(app):
+ text = ".. c:function:: str hello(str names)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, "hello"]],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="c", objtype="function", no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, "str"]],
+ desc_sig_space,
+ [desc_sig_name, "names"],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cfunction_signature_with_maximum_signature_line_length_equal(app):
+ text = ".. c:function:: str hello(str name)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, "hello"]],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="c", objtype="function", no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, "str"]],
+ desc_sig_space,
+ [desc_sig_name, "name"],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cfunction_signature_with_maximum_signature_line_length_force_single(app):
+ text = (".. c:function:: str hello(str names)\n"
+ " :single-line-parameter-list:")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, "hello"]],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="c", objtype="function", no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, "str"]],
+ desc_sig_space,
+ [desc_sig_name, "names"],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cfunction_signature_with_maximum_signature_line_length_break(app):
+ text = ".. c:function:: str hello(str names)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, "hello"]],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="c", objtype="function", no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, "str"]],
+ desc_sig_space,
+ [desc_sig_name, "names"],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'c_maximum_signature_line_length': len('str hello(str name)'),
+ 'maximum_signature_line_length': 1,
+})
+def test_c_maximum_signature_line_length_overrides_global(app):
+ text = '.. c:function:: str hello(str name)'
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, 'hello']],
+ desc_parameterlist,
+ )]
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='c', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, "str"]],
+ desc_sig_space,
+ [desc_sig_name, 'name'],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', testroot='domain-c-c_maximum_signature_line_length')
+def test_domain_c_c_maximum_signature_line_length_in_html(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf-8')
+ expected = """\
+
+<dl>
+<dd>\
+<span class="n"><span class="pre">str</span></span>\
+<span class="w"> </span>\
+<span class="n"><span class="pre">name</span></span>,\
+</dd>
+</dl>
+
+<span class="sig-paren">)</span>\
+<a class="headerlink" href="#c.hello" title="Link to this definition">¶</a>\
+<br />\
+</dt>
+"""
+ assert expected in content
+
+
+@pytest.mark.sphinx(
+ 'text', testroot='domain-c-c_maximum_signature_line_length',
+)
+def test_domain_c_c_maximum_signature_line_length_in_text(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ param_line_fmt = STDINDENT * " " + "{}\n"
+
+ expected_parameter_list_hello = "(\n{})".format(param_line_fmt.format("str name,"))
+
+ assert expected_parameter_list_hello in content
diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py
new file mode 100644
index 0000000..dcc2b0f
--- /dev/null
+++ b/tests/test_domain_cpp.py
@@ -0,0 +1,1744 @@
+"""Tests the C++ Domain"""
+
+import itertools
+import re
+import zlib
+
+import pytest
+
+import sphinx.domains.cpp
+from sphinx import addnodes
+from sphinx.addnodes import (
+ desc,
+ desc_content,
+ desc_name,
+ desc_parameter,
+ desc_parameterlist,
+ desc_sig_name,
+ desc_sig_space,
+ desc_signature,
+ desc_signature_line,
+ pending_xref,
+)
+from sphinx.domains.cpp import (
+ DefinitionError,
+ DefinitionParser,
+ NoOldIdError,
+ Symbol,
+ _id_prefix,
+ _max_id,
+)
+from sphinx.ext.intersphinx import load_mappings, normalize_intersphinx_mapping
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+from sphinx.writers.text import STDINDENT
+
+
+def parse(name, string):
+ class Config:
+ cpp_id_attributes = ["id_attr"]
+ cpp_paren_attributes = ["paren_attr"]
+ parser = DefinitionParser(string, location=None, config=Config())
+ parser.allowFallbackExpressionParsing = False
+ ast = parser.parse_declaration(name, name)
+ parser.assert_end()
+ # The scopedness would usually have been set by CPPEnumObject
+ if name == "enum":
+ ast.scoped = None # simulate unscoped enum
+ return ast
+
+
+def _check(name, input, idDict, output, key, asTextOutput):
+ if key is None:
+ key = name
+ key += ' '
+ if name in ('function', 'member'):
+ inputActual = input
+ outputAst = output
+ outputAsText = output
+ else:
+ inputActual = input.format(key='')
+ outputAst = output.format(key='')
+ outputAsText = output.format(key=key)
+ if asTextOutput is not None:
+ outputAsText = asTextOutput
+
+ # first a simple check of the AST
+ ast = parse(name, inputActual)
+ res = str(ast)
+ if res != outputAst:
+ print("")
+ print("Input: ", input)
+ print("Result: ", res)
+ print("Expected: ", outputAst)
+ raise DefinitionError
+ rootSymbol = Symbol(None, None, None, None, None, None, None)
+ symbol = rootSymbol.add_declaration(ast, docname="TestDoc", line=42)
+ parentNode = addnodes.desc()
+ signode = addnodes.desc_signature(input, '')
+ parentNode += signode
+ ast.describe_signature(signode, 'lastIsName', symbol, options={})
+ resAsText = parentNode.astext()
+ if resAsText != outputAsText:
+ print("")
+ print("Input: ", input)
+ print("astext(): ", resAsText)
+ print("Expected: ", outputAsText)
+ print("Node:", parentNode)
+ raise DefinitionError
+
+ idExpected = [None]
+ for i in range(1, _max_id + 1):
+ if i in idDict:
+ idExpected.append(idDict[i])
+ else:
+ idExpected.append(idExpected[i - 1])
+ idActual = [None]
+ for i in range(1, _max_id + 1):
+ try:
+ id = ast.get_id(version=i)
+ assert id is not None
+ idActual.append(id[len(_id_prefix[i]):])
+ except NoOldIdError:
+ idActual.append(None)
+
+ res = [True]
+ for i in range(1, _max_id + 1):
+ res.append(idExpected[i] == idActual[i])
+
+ if not all(res):
+ print("input: %s" % input.rjust(20))
+ for i in range(1, _max_id + 1):
+ if res[i]:
+ continue
+ print("Error in id version %d." % i)
+ print("result: %s" % idActual[i])
+ print("expected: %s" % idExpected[i])
+ print(rootSymbol.dump(0))
+ raise DefinitionError
+
+
+def check(name, input, idDict, output=None, key=None, asTextOutput=None):
+ if output is None:
+ output = input
+ # First, check without semicolon
+ _check(name, input, idDict, output, key, asTextOutput)
+ # Second, check with semicolon
+ _check(name, input + ' ;', idDict, output + ';', key,
+ asTextOutput + ';' if asTextOutput is not None else None)
+
+
+@pytest.mark.parametrize(('type_', 'id_v2'),
+ sphinx.domains.cpp._id_fundamental_v2.items())
+def test_domain_cpp_ast_fundamental_types(type_, id_v2):
+ # see https://en.cppreference.com/w/cpp/language/types
+ def make_id_v1():
+ if type_ == 'decltype(auto)':
+ return None
+ id_ = type_.replace(" ", "-").replace("long", "l")
+ if "__int" not in type_:
+ id_ = id_.replace("int", "i")
+ id_ = id_.replace("bool", "b").replace("char", "c")
+ id_ = id_.replace("wc_t", "wchar_t").replace("c16_t", "char16_t")
+ id_ = id_.replace("c8_t", "char8_t")
+ id_ = id_.replace("c32_t", "char32_t")
+ return f"f__{id_}"
+
+ def make_id_v2():
+ id_ = id_v2
+ if type_ == "std::nullptr_t":
+ id_ = "NSt9nullptr_tE"
+ return f"1f{id_}"
+
+ id1 = make_id_v1()
+ id2 = make_id_v2()
+
+ input = f"void f({type_.replace(' ', ' ')} arg)"
+ output = f"void f({type_} arg)"
+
+ check("function", input, {1: id1, 2: id2}, output=output)
+ if ' ' in type_:
+ # try permutations of all components
+ tcs = type_.split()
+ for p in itertools.permutations(tcs):
+ input = f"void f({' '.join(p)} arg)"
+ check("function", input, {1: id1, 2: id2})
+
+
+def test_domain_cpp_ast_expressions():
+ def exprCheck(expr, id, id4=None):
+ ids = 'IE1CIA%s_1aE'
+ # call .format() on the expr to unescape double curly braces
+ idDict = {2: ids % expr.format(), 3: ids % id}
+ if id4 is not None:
+ idDict[4] = ids % id4
+ check('class', 'template<> {key}C<a[%s]>' % expr, idDict)
+
+ class Config:
+ cpp_id_attributes = ["id_attr"]
+ cpp_paren_attributes = ["paren_attr"]
+
+ parser = DefinitionParser(expr, location=None,
+ config=Config())
+ parser.allowFallbackExpressionParsing = False
+ ast = parser.parse_expression()
+ res = str(ast)
+ if res != expr:
+ print("")
+ print("Input: ", expr)
+ print("Result: ", res)
+ raise DefinitionError
+ displayString = ast.get_display_string()
+ if res != displayString:
+ # note: if the expression contains an anon name then this will trigger a falsely
+ print("")
+ print("Input: ", expr)
+ print("Result: ", res)
+ print("Display: ", displayString)
+ raise DefinitionError
+
+ # primary
+ exprCheck('nullptr', 'LDnE')
+ exprCheck('true', 'L1E')
+ exprCheck('false', 'L0E')
+ ints = ['5', '0', '075', '0x0123456789ABCDEF', '0XF', '0b1', '0B1',
+ "0b0'1'0", "00'1'2", "0x0'1'2", "1'2'3"]
+ unsignedSuffix = ['', 'u', 'U']
+ longSuffix = ['', 'l', 'L', 'll', 'LL']
+ for i in ints:
+ for u in unsignedSuffix:
+ for l in longSuffix:
+ expr = i + u + l
+ exprCheck(expr, 'L' + expr.replace("'", "") + 'E')
+ expr = i + l + u
+ exprCheck(expr, 'L' + expr.replace("'", "") + 'E')
+ decimalFloats = ['5e42', '5e+42', '5e-42',
+ '5.', '5.e42', '5.e+42', '5.e-42',
+ '.5', '.5e42', '.5e+42', '.5e-42',
+ '5.0', '5.0e42', '5.0e+42', '5.0e-42',
+ "1'2'3e7'8'9", "1'2'3.e7'8'9",
+ ".4'5'6e7'8'9", "1'2'3.4'5'6e7'8'9"]
+ hexFloats = ['ApF', 'Ap+F', 'Ap-F',
+ 'A.', 'A.pF', 'A.p+F', 'A.p-F',
+ '.A', '.ApF', '.Ap+F', '.Ap-F',
+ 'A.B', 'A.BpF', 'A.Bp+F', 'A.Bp-F',
+ "A'B'Cp1'2'3", "A'B'C.p1'2'3",
+ ".D'E'Fp1'2'3", "A'B'C.D'E'Fp1'2'3"]
+ for suffix in ['', 'f', 'F', 'l', 'L']:
+ for e in decimalFloats:
+ expr = e + suffix
+ exprCheck(expr, 'L' + expr.replace("'", "") + 'E')
+ for e in hexFloats:
+ expr = "0x" + e + suffix
+ exprCheck(expr, 'L' + expr.replace("'", "") + 'E')
+ exprCheck('"abc\\"cba"', 'LA8_KcE') # string
+ exprCheck('this', 'fpT')
+ # character literals
+ charPrefixAndIds = [('', 'c'), ('u8', 'c'), ('u', 'Ds'), ('U', 'Di'), ('L', 'w')]
+ chars = [('a', '97'), ('\\n', '10'), ('\\012', '10'), ('\\0', '0'),
+ ('\\x0a', '10'), ('\\x0A', '10'), ('\\u0a42', '2626'), ('\\u0A42', '2626'),
+ ('\\U0001f34c', '127820'), ('\\U0001F34C', '127820')]
+ for p, t in charPrefixAndIds:
+ for c, val in chars:
+ exprCheck(f"{p}'{c}'", t + val)
+ # user-defined literals
+ for i in ints:
+ exprCheck(i + '_udl', 'clL_Zli4_udlEL' + i.replace("'", "") + 'EE')
+ exprCheck(i + 'uludl', 'clL_Zli5uludlEL' + i.replace("'", "") + 'EE')
+ for f in decimalFloats:
+ exprCheck(f + '_udl', 'clL_Zli4_udlEL' + f.replace("'", "") + 'EE')
+ exprCheck(f + 'fudl', 'clL_Zli4fudlEL' + f.replace("'", "") + 'EE')
+ for f in hexFloats:
+ exprCheck('0x' + f + '_udl', 'clL_Zli4_udlEL0x' + f.replace("'", "") + 'EE')
+ for p, t in charPrefixAndIds:
+ for c, val in chars:
+ exprCheck(f"{p}'{c}'_udl", 'clL_Zli4_udlE' + t + val + 'E')
+ exprCheck('"abc"_udl', 'clL_Zli4_udlELA3_KcEE')
+ # from issue #7294
+ exprCheck('6.62607015e-34q_J', 'clL_Zli3q_JEL6.62607015e-34EE')
+
+ # fold expressions, paren, name
+ exprCheck('(... + Ns)', '(... + Ns)', id4='flpl2Ns')
+ exprCheck('(Ns + ...)', '(Ns + ...)', id4='frpl2Ns')
+ exprCheck('(Ns + ... + 0)', '(Ns + ... + 0)', id4='fLpl2NsL0E')
+ exprCheck('(5)', 'L5E')
+ exprCheck('C', '1C')
+ # postfix
+ exprCheck('A(2)', 'cl1AL2EE')
+ exprCheck('A[2]', 'ix1AL2E')
+ exprCheck('a.b.c', 'dtdt1a1b1c')
+ exprCheck('a->b->c', 'ptpt1a1b1c')
+ exprCheck('i++', 'pp1i')
+ exprCheck('i--', 'mm1i')
+ exprCheck('dynamic_cast<T&>(i)++', 'ppdcR1T1i')
+ exprCheck('static_cast<T&>(i)++', 'ppscR1T1i')
+ exprCheck('reinterpret_cast<T&>(i)++', 'pprcR1T1i')
+ exprCheck('const_cast<T&>(i)++', 'ppccR1T1i')
+ exprCheck('typeid(T).name', 'dtti1T4name')
+ exprCheck('typeid(a + b).name', 'dttepl1a1b4name')
+ # unary
+ exprCheck('++5', 'pp_L5E')
+ exprCheck('--5', 'mm_L5E')
+ exprCheck('*5', 'deL5E')
+ exprCheck('&5', 'adL5E')
+ exprCheck('+5', 'psL5E')
+ exprCheck('-5', 'ngL5E')
+ exprCheck('!5', 'ntL5E')
+ exprCheck('not 5', 'ntL5E')
+ exprCheck('~5', 'coL5E')
+ exprCheck('compl 5', 'coL5E')
+ exprCheck('sizeof...(a)', 'sZ1a')
+ exprCheck('sizeof(T)', 'st1T')
+ exprCheck('sizeof -42', 'szngL42E')
+ exprCheck('alignof(T)', 'at1T')
+ exprCheck('noexcept(-42)', 'nxngL42E')
+ # new-expression
+ exprCheck('new int', 'nw_iE')
+ exprCheck('new volatile int', 'nw_ViE')
+ exprCheck('new int[42]', 'nw_AL42E_iE')
+ exprCheck('new int()', 'nw_ipiE')
+ exprCheck('new int(5, 42)', 'nw_ipiL5EL42EE')
+ exprCheck('::new int', 'nw_iE')
+ exprCheck('new int{{}}', 'nw_iilE')
+ exprCheck('new int{{5, 42}}', 'nw_iilL5EL42EE')
+ # delete-expression
+ exprCheck('delete p', 'dl1p')
+ exprCheck('delete [] p', 'da1p')
+ exprCheck('::delete p', 'dl1p')
+ exprCheck('::delete [] p', 'da1p')
+ # cast
+ exprCheck('(int)2', 'cviL2E')
+ # binary op
+ exprCheck('5 || 42', 'ooL5EL42E')
+ exprCheck('5 or 42', 'ooL5EL42E')
+ exprCheck('5 && 42', 'aaL5EL42E')
+ exprCheck('5 and 42', 'aaL5EL42E')
+ exprCheck('5 | 42', 'orL5EL42E')
+ exprCheck('5 bitor 42', 'orL5EL42E')
+ exprCheck('5 ^ 42', 'eoL5EL42E')
+ exprCheck('5 xor 42', 'eoL5EL42E')
+ exprCheck('5 & 42', 'anL5EL42E')
+ exprCheck('5 bitand 42', 'anL5EL42E')
+ # ['==', '!=']
+ exprCheck('5 == 42', 'eqL5EL42E')
+ exprCheck('5 != 42', 'neL5EL42E')
+ exprCheck('5 not_eq 42', 'neL5EL42E')
+ # ['<=', '>=', '<', '>', '<=>']
+ exprCheck('5 <= 42', 'leL5EL42E')
+ exprCheck('A <= 42', 'le1AL42E')
+ exprCheck('5 >= 42', 'geL5EL42E')
+ exprCheck('5 < 42', 'ltL5EL42E')
+ exprCheck('A < 42', 'lt1AL42E')
+ exprCheck('5 > 42', 'gtL5EL42E')
+ exprCheck('A > 42', 'gt1AL42E')
+ exprCheck('5 <=> 42', 'ssL5EL42E')
+ exprCheck('A <=> 42', 'ss1AL42E')
+ # ['<<', '>>']
+ exprCheck('5 << 42', 'lsL5EL42E')
+ exprCheck('A << 42', 'ls1AL42E')
+ exprCheck('5 >> 42', 'rsL5EL42E')
+ # ['+', '-']
+ exprCheck('5 + 42', 'plL5EL42E')
+ exprCheck('5 - 42', 'miL5EL42E')
+ # ['*', '/', '%']
+ exprCheck('5 * 42', 'mlL5EL42E')
+ exprCheck('5 / 42', 'dvL5EL42E')
+ exprCheck('5 % 42', 'rmL5EL42E')
+ # ['.*', '->*']
+ exprCheck('5 .* 42', 'dsL5EL42E')
+ exprCheck('5 ->* 42', 'pmL5EL42E')
+ # conditional
+ exprCheck('5 ? 7 : 3', 'quL5EL7EL3E')
+ # assignment
+ exprCheck('a = 5', 'aS1aL5E')
+ exprCheck('a *= 5', 'mL1aL5E')
+ exprCheck('a /= 5', 'dV1aL5E')
+ exprCheck('a %= 5', 'rM1aL5E')
+ exprCheck('a += 5', 'pL1aL5E')
+ exprCheck('a -= 5', 'mI1aL5E')
+ exprCheck('a >>= 5', 'rS1aL5E')
+ exprCheck('a <<= 5', 'lS1aL5E')
+ exprCheck('a &= 5', 'aN1aL5E')
+ exprCheck('a and_eq 5', 'aN1aL5E')
+ exprCheck('a ^= 5', 'eO1aL5E')
+ exprCheck('a xor_eq 5', 'eO1aL5E')
+ exprCheck('a |= 5', 'oR1aL5E')
+ exprCheck('a or_eq 5', 'oR1aL5E')
+ exprCheck('a = {{1, 2, 3}}', 'aS1ailL1EL2EL3EE')
+ # complex assignment and conditional
+ exprCheck('5 = 6 = 7', 'aSL5EaSL6EL7E')
+ exprCheck('5 = 6 ? 7 = 8 : 3', 'aSL5EquL6EaSL7EL8EL3E')
+ # comma operator
+ exprCheck('a, 5', 'cm1aL5E')
+
+ # Additional tests
+ # a < expression that starts with something that could be a template
+ exprCheck('A < 42', 'lt1AL42E')
+ check('function', 'template<> void f(A<B, 2> &v)',
+ {2: "IE1fR1AI1BX2EE", 3: "IE1fR1AI1BXL2EEE", 4: "IE1fvR1AI1BXL2EEE"})
+ exprCheck('A<1>::value', 'N1AIXL1EEE5valueE')
+ check('class', "template<int T = 42> {key}A", {2: "I_iE1A"})
+ check('enumerator', '{key}A = std::numeric_limits<unsigned long>::max()', {2: "1A"})
+
+ exprCheck('operator()()', 'clclE')
+ exprCheck('operator()<int>()', 'clclIiEE')
+
+ # pack expansion
+ exprCheck('a(b(c, 1 + d...)..., e(f..., g))', 'cl1aspcl1b1cspplL1E1dEcl1esp1f1gEE')
+
+
+def test_domain_cpp_ast_type_definitions():
+ check("type", "public bool b", {1: "b", 2: "1b"}, "{key}bool b", key='typedef')
+ check("type", "{key}bool A::b", {1: "A::b", 2: "N1A1bE"}, key='typedef')
+ check("type", "{key}bool *b", {1: "b", 2: "1b"}, key='typedef')
+ check("type", "{key}bool *const b", {1: "b", 2: "1b"}, key='typedef')
+ check("type", "{key}bool *volatile const b", {1: "b", 2: "1b"}, key='typedef')
+ check("type", "{key}bool *volatile const b", {1: "b", 2: "1b"}, key='typedef')
+ check("type", "{key}bool *volatile const *b", {1: "b", 2: "1b"}, key='typedef')
+ check("type", "{key}bool &b", {1: "b", 2: "1b"}, key='typedef')
+ check("type", "{key}bool b[]", {1: "b", 2: "1b"}, key='typedef')
+ check("type", "{key}std::pair<int, int> coord", {1: "coord", 2: "5coord"}, key='typedef')
+ check("type", "{key}long long int foo", {1: "foo", 2: "3foo"}, key='typedef')
+ check("type", '{key}std::vector<std::pair<std::string, long long>> module::blah',
+ {1: "module::blah", 2: "N6module4blahE"}, key='typedef')
+ check("type", "{key}std::function<void()> F", {1: "F", 2: "1F"}, key='typedef')
+ check("type", "{key}std::function<R(A1, A2)> F", {1: "F", 2: "1F"}, key='typedef')
+ check("type", "{key}std::function<R(A1, A2, A3)> F", {1: "F", 2: "1F"}, key='typedef')
+ check("type", "{key}std::function<R(A1, A2, A3, As...)> F", {1: "F", 2: "1F"}, key='typedef')
+ check("type", "{key}MyContainer::const_iterator",
+ {1: "MyContainer::const_iterator", 2: "N11MyContainer14const_iteratorE"})
+ check("type",
+ "public MyContainer::const_iterator",
+ {1: "MyContainer::const_iterator", 2: "N11MyContainer14const_iteratorE"},
+ output="{key}MyContainer::const_iterator")
+ # test decl specs on right
+ check("type", "{key}bool const b", {1: "b", 2: "1b"}, key='typedef')
+ # test name in global scope
+ check("type", "{key}bool ::B::b", {1: "B::b", 2: "N1B1bE"}, key='typedef')
+
+ check('type', '{key}A = B', {2: '1A'}, key='using')
+ check('type', '{key}A = decltype(b)', {2: '1A'}, key='using')
+
+ # from breathe#267 (named function parameters for function pointers
+ check('type', '{key}void (*gpio_callback_t)(struct device *port, uint32_t pin)',
+ {1: 'gpio_callback_t', 2: '15gpio_callback_t'}, key='typedef')
+ check('type', '{key}void (*f)(std::function<void(int i)> g)', {1: 'f', 2: '1f'},
+ key='typedef')
+
+ check('type', '{key}T = A::template B<int>::template C<double>', {2: '1T'}, key='using')
+
+ check('type', '{key}T = Q<A::operator()>', {2: '1T'}, key='using')
+ check('type', '{key}T = Q<A::operator()<int>>', {2: '1T'}, key='using')
+ check('type', '{key}T = Q<A::operator bool>', {2: '1T'}, key='using')
+
+
+def test_domain_cpp_ast_concept_definitions():
+ check('concept', 'template<typename Param> {key}A::B::Concept',
+ {2: 'I0EN1A1B7ConceptE'})
+ check('concept', 'template<typename A, typename B, typename ...C> {key}Foo',
+ {2: 'I00DpE3Foo'})
+ with pytest.raises(DefinitionError):
+ parse('concept', '{key}Foo')
+ with pytest.raises(DefinitionError):
+ parse('concept', 'template<typename T> template<typename U> {key}Foo')
+
+
+def test_domain_cpp_ast_member_definitions():
+ check('member', ' const std::string & name = 42',
+ {1: "name__ssCR", 2: "4name"}, output='const std::string &name = 42')
+ check('member', ' const std::string & name', {1: "name__ssCR", 2: "4name"},
+ output='const std::string &name')
+ check('member', ' const std::string & name [ n ]',
+ {1: "name__ssCRA", 2: "4name"}, output='const std::string &name[n]')
+ check('member', 'const std::vector< unsigned int, long> &name',
+ {1: "name__std::vector:unsigned-i.l:CR", 2: "4name"},
+ output='const std::vector<unsigned int, long> &name')
+ check('member', 'module::myclass foo[n]', {1: "foo__module::myclassA", 2: "3foo"})
+ check('member', 'int *const p', {1: 'p__iPC', 2: '1p'})
+ check('member', 'extern int myInt', {1: 'myInt__i', 2: '5myInt'})
+ check('member', 'thread_local int myInt', {1: 'myInt__i', 2: '5myInt'})
+ check('member', 'extern thread_local int myInt', {1: 'myInt__i', 2: '5myInt'})
+ check('member', 'thread_local extern int myInt', {1: 'myInt__i', 2: '5myInt'},
+ 'extern thread_local int myInt')
+
+ # tests based on https://en.cppreference.com/w/cpp/language/bit_field
+ check('member', 'int b : 3', {1: 'b__i', 2: '1b'})
+ check('member', 'int b : 8 = 42', {1: 'b__i', 2: '1b'})
+ check('member', 'int b : 8{42}', {1: 'b__i', 2: '1b'})
+ # TODO: enable once the ternary operator is supported
+ # check('member', 'int b : true ? 8 : a = 42', {1: 'b__i', 2: '1b'})
+ # TODO: enable once the ternary operator is supported
+ # check('member', 'int b : (true ? 8 : a) = 42', {1: 'b__i', 2: '1b'})
+ check('member', 'int b : 1 || new int{0}', {1: 'b__i', 2: '1b'})
+
+ check('member', 'inline int n', {1: 'n__i', 2: '1n'})
+ check('member', 'constinit int n', {1: 'n__i', 2: '1n'})
+
+
+def test_domain_cpp_ast_function_definitions():
+ check('function', 'void f(volatile int)', {1: "f__iV", 2: "1fVi"})
+ check('function', 'void f(std::size_t)', {1: "f__std::s", 2: "1fNSt6size_tE"})
+ check('function', 'operator bool() const', {1: "castto-b-operatorC", 2: "NKcvbEv"})
+ check('function', 'A::operator bool() const',
+ {1: "A::castto-b-operatorC", 2: "NK1AcvbEv"})
+ check('function', 'A::operator bool() volatile const &',
+ {1: "A::castto-b-operatorVCR", 2: "NVKR1AcvbEv"})
+ check('function', 'A::operator bool() volatile const &&',
+ {1: "A::castto-b-operatorVCO", 2: "NVKO1AcvbEv"})
+ check('function', 'bool namespaced::theclass::method(arg1, arg2)',
+ {1: "namespaced::theclass::method__arg1.arg2",
+ 2: "N10namespaced8theclass6methodE4arg14arg2"})
+ x = 'std::vector<std::pair<std::string, int>> &module::test(register int ' \
+ 'foo, bar, std::string baz = "foobar, blah, bleh") const = 0'
+ check('function', x, {1: "module::test__i.bar.ssC",
+ 2: "NK6module4testEi3barNSt6stringE"})
+ check('function', 'void f(std::pair<A, B>)',
+ {1: "f__std::pair:A.B:", 2: "1fNSt4pairI1A1BEE"})
+ check('function', 'explicit module::myclass::foo::foo()',
+ {1: "module::myclass::foo::foo", 2: "N6module7myclass3foo3fooEv"})
+ check('function', 'module::myclass::foo::~foo()',
+ {1: "module::myclass::foo::~foo", 2: "N6module7myclass3fooD0Ev"})
+ check('function', 'int printf(const char *fmt, ...)',
+ {1: "printf__cCP.z", 2: "6printfPKcz"})
+ check('function', 'int foo(const unsigned int j)',
+ {1: "foo__unsigned-iC", 2: "3fooKj"})
+ check('function', 'int foo(const int *const ptr)',
+ {1: "foo__iCPC", 2: "3fooPCKi"})
+ check('function', 'module::myclass::operator std::vector<std::string>()',
+ {1: "module::myclass::castto-std::vector:ss:-operator",
+ 2: "N6module7myclasscvNSt6vectorINSt6stringEEEEv"})
+ check('function',
+ 'void operator()(const boost::array<VertexID, 2> &v) const',
+ {1: "call-operator__boost::array:VertexID.2:CRC",
+ 2: "NKclERKN5boost5arrayI8VertexIDX2EEE",
+ 3: "NKclERKN5boost5arrayI8VertexIDXL2EEEE"})
+ check('function',
+ 'void operator()(const boost::array<VertexID, 2, "foo, bar"> &v) const',
+ {1: 'call-operator__boost::array:VertexID.2."foo,--bar":CRC',
+ 2: 'NKclERKN5boost5arrayI8VertexIDX2EX"foo, bar"EEE',
+ 3: 'NKclERKN5boost5arrayI8VertexIDXL2EEXLA9_KcEEEE'})
+ check('function', 'MyClass::MyClass(MyClass::MyClass&&)',
+ {1: "MyClass::MyClass__MyClass::MyClassRR",
+ 2: "N7MyClass7MyClassERRN7MyClass7MyClassE"})
+ check('function', 'constexpr int get_value()', {1: "get_valueCE", 2: "9get_valuev"})
+ check('function', 'static constexpr int get_value()',
+ {1: "get_valueCE", 2: "9get_valuev"})
+ check('function', 'int get_value() const noexcept',
+ {1: "get_valueC", 2: "NK9get_valueEv"})
+ check('function', 'int get_value() const noexcept(std::is_nothrow_move_constructible<T>::value)',
+ {1: "get_valueC", 2: "NK9get_valueEv"})
+ check('function', 'int get_value() const noexcept("see below")',
+ {1: "get_valueC", 2: "NK9get_valueEv"})
+ check('function', 'int get_value() const noexcept = delete',
+ {1: "get_valueC", 2: "NK9get_valueEv"})
+ check('function', 'int get_value() volatile const',
+ {1: "get_valueVC", 2: "NVK9get_valueEv"})
+ check('function', 'MyClass::MyClass(MyClass::MyClass&&) = default',
+ {1: "MyClass::MyClass__MyClass::MyClassRR",
+ 2: "N7MyClass7MyClassERRN7MyClass7MyClassE"})
+ check('function', 'virtual MyClass::a_virtual_function() const override',
+ {1: "MyClass::a_virtual_functionC", 2: "NK7MyClass18a_virtual_functionEv"})
+ check('function', 'A B() override', {1: "B", 2: "1Bv"})
+ check('function', 'A B() final', {1: "B", 2: "1Bv"})
+ check('function', 'A B() final override', {1: "B", 2: "1Bv"})
+ check('function', 'A B() override final', {1: "B", 2: "1Bv"},
+ output='A B() final override')
+ check('function', 'MyClass::a_member_function() volatile',
+ {1: "MyClass::a_member_functionV", 2: "NV7MyClass17a_member_functionEv"})
+ check('function', 'MyClass::a_member_function() volatile const',
+ {1: "MyClass::a_member_functionVC", 2: "NVK7MyClass17a_member_functionEv"})
+ check('function', 'MyClass::a_member_function() &&',
+ {1: "MyClass::a_member_functionO", 2: "NO7MyClass17a_member_functionEv"})
+ check('function', 'MyClass::a_member_function() &',
+ {1: "MyClass::a_member_functionR", 2: "NR7MyClass17a_member_functionEv"})
+ check('function', 'MyClass::a_member_function() const &',
+ {1: "MyClass::a_member_functionCR", 2: "NKR7MyClass17a_member_functionEv"})
+ check('function', 'int main(int argc, char *argv[])',
+ {1: "main__i.cPA", 2: "4mainiA_Pc"})
+ check('function', 'MyClass &MyClass::operator++()',
+ {1: "MyClass::inc-operator", 2: "N7MyClassppEv"})
+ check('function', 'MyClass::pointer MyClass::operator->()',
+ {1: "MyClass::pointer-operator", 2: "N7MyClassptEv"})
+
+ x = 'std::vector<std::pair<std::string, int>> &module::test(register int ' \
+ 'foo, bar[n], std::string baz = "foobar, blah, bleh") const = 0'
+ check('function', x, {1: "module::test__i.barA.ssC",
+ 2: "NK6module4testEiAn_3barNSt6stringE",
+ 3: "NK6module4testEiA1n_3barNSt6stringE"})
+ check('function',
+ 'int foo(Foo f = Foo(double(), std::make_pair(int(2), double(3.4))))',
+ {1: "foo__Foo", 2: "3foo3Foo"})
+ check('function', 'int foo(A a = x(a))', {1: "foo__A", 2: "3foo1A"})
+ with pytest.raises(DefinitionError):
+ parse('function', 'int foo(B b=x(a)')
+ with pytest.raises(DefinitionError):
+ parse('function', 'int foo)C c=x(a))')
+ with pytest.raises(DefinitionError):
+ parse('function', 'int foo(D d=x(a')
+ check('function', 'int foo(const A&... a)', {1: "foo__ACRDp", 2: "3fooDpRK1A"})
+ check('function', 'int foo(const A&...)', {1: "foo__ACRDp", 2: "3fooDpRK1A"})
+ check('function', 'int foo(const A*... a)', {1: "foo__ACPDp", 2: "3fooDpPK1A"})
+ check('function', 'int foo(const A*...)', {1: "foo__ACPDp", 2: "3fooDpPK1A"})
+ check('function', 'int foo(const int A::*... a)', {2: "3fooDpM1AKi"})
+ check('function', 'int foo(const int A::*...)', {2: "3fooDpM1AKi"})
+ # check('function', 'int foo(int (*a)(A)...)', {1: "foo__ACRDp", 2: "3fooDpPK1A"})
+ # check('function', 'int foo(int (*)(A)...)', {1: "foo__ACRDp", 2: "3fooDpPK1A"})
+ check('function', 'virtual void f()', {1: "f", 2: "1fv"})
+ # test for ::nestedName, from issue 1738
+ check("function", "result(int val, ::std::error_category const &cat)",
+ {1: "result__i.std::error_categoryCR", 2: "6resultiRKNSt14error_categoryE"})
+ check("function", "int *f()", {1: "f", 2: "1fv"})
+ # tests derived from issue #1753 (skip to keep sanity)
+ check("function", "f(int (&array)[10])", {2: "1fRA10_i", 3: "1fRAL10E_i"})
+ check("function", "void f(int (&array)[10])", {2: "1fRA10_i", 3: "1fRAL10E_i"})
+ check("function", "void f(float *q(double))", {2: "1fFPfdE"})
+ check("function", "void f(float *(*q)(double))", {2: "1fPFPfdE"})
+ check("function", "void f(float (*q)(double))", {2: "1fPFfdE"})
+ check("function", "int (*f(double d))(float)", {1: "f__double", 2: "1fd"})
+ check("function", "int (*f(bool b))[5]", {1: "f__b", 2: "1fb"})
+ check("function", "int (*A::f(double d) const)(float)",
+ {1: "A::f__doubleC", 2: "NK1A1fEd"})
+ check("function", "void f(std::shared_ptr<int(double)> ptr)",
+ {2: "1fNSt10shared_ptrIFidEEE"})
+ check("function", "void f(int *const p)", {1: "f__iPC", 2: "1fPCi"})
+ check("function", "void f(int *volatile const p)", {1: "f__iPVC", 2: "1fPVCi"})
+
+ check('function', 'extern int f()', {1: 'f', 2: '1fv'})
+ check('function', 'consteval int f()', {1: 'f', 2: '1fv'})
+
+ check('function', 'explicit(true) void f()', {1: 'f', 2: '1fv'})
+
+ check('function', 'decltype(auto) f()', {1: 'f', 2: "1fv"})
+
+ # TODO: make tests for functions in a template, e.g., Test<int&&()>
+ # such that the id generation for function type types is correct.
+
+ check('function', 'friend std::ostream &f(std::ostream &s, int i)',
+ {1: 'f__osR.i', 2: '1fRNSt7ostreamEi'})
+
+ # from breathe#223
+ check('function', 'void f(struct E e)', {1: 'f__E', 2: '1f1E'})
+ check('function', 'void f(class E e)', {1: 'f__E', 2: '1f1E'})
+ check('function', 'void f(typename E e)', {1: 'f__E', 2: '1f1E'})
+ check('function', 'void f(enum E e)', {1: 'f__E', 2: '1f1E'})
+ check('function', 'void f(union E e)', {1: 'f__E', 2: '1f1E'})
+
+ # pointer to member (function)
+ check('function', 'void f(int C::*)', {2: '1fM1Ci'})
+ check('function', 'void f(int C::* p)', {2: '1fM1Ci'})
+ check('function', 'void f(int ::C::* p)', {2: '1fM1Ci'})
+ check('function', 'void f(int C::*const)', {2: '1fKM1Ci'})
+ check('function', 'void f(int C::*const&)', {2: '1fRKM1Ci'})
+ check('function', 'void f(int C::*volatile)', {2: '1fVM1Ci'})
+ check('function', 'void f(int C::*const volatile)', {2: '1fVKM1Ci'},
+ output='void f(int C::*volatile const)')
+ check('function', 'void f(int C::*volatile const)', {2: '1fVKM1Ci'})
+ check('function', 'void f(int (C::*)(float, double))', {2: '1fM1CFifdE'})
+ check('function', 'void f(int (C::* p)(float, double))', {2: '1fM1CFifdE'})
+ check('function', 'void f(int (::C::* p)(float, double))', {2: '1fM1CFifdE'})
+ check('function', 'void f(void (C::*)() const &)', {2: '1fM1CKRFvvE'})
+ check('function', 'int C::* f(int, double)', {2: '1fid'})
+ check('function', 'void f(int C::* *p)', {2: '1fPM1Ci'})
+ check('function', 'void f(int C::**)', {2: '1fPM1Ci'})
+ check('function', 'void f(int C::*const *p)', {2: '1fPKM1Ci'})
+ check('function', 'void f(int C::*const*)', {2: '1fPKM1Ci'})
+
+ # exceptions from return type mangling
+ check('function', 'template<typename T> C()', {2: 'I0E1Cv'})
+ check('function', 'template<typename T> operator int()', {2: 'I0Ecviv'})
+
+ # trailing return types
+ ids = {1: 'f', 2: '1fv'}
+ check('function', 'int f()', ids)
+ check('function', 'auto f() -> int', ids)
+ check('function', 'virtual auto f() -> int = 0', ids)
+ check('function', 'virtual auto f() -> int final', ids)
+ check('function', 'virtual auto f() -> int override', ids)
+
+ ids = {2: 'I0E1fv', 4: 'I0E1fiv'}
+ check('function', 'template<typename T> int f()', ids)
+ check('function', 'template<typename T> f() -> int', ids)
+
+ # from breathe#441
+ check('function', 'auto MakeThingy() -> Thingy*', {1: 'MakeThingy', 2: '10MakeThingyv'})
+
+ # from #8960
+ check('function', 'void f(void (*p)(int, double), int i)', {2: '1fPFvidEi'})
+
+ # from #9535 comment
+ check('function', 'void f(void (*p)(int) = &foo)', {2: '1fPFviE'})
+
+
+def test_domain_cpp_ast_operators():
+ check('function', 'void operator new()', {1: "new-operator", 2: "nwv"})
+ check('function', 'void operator new[]()', {1: "new-array-operator", 2: "nav"})
+ check('function', 'void operator delete()', {1: "delete-operator", 2: "dlv"})
+ check('function', 'void operator delete[]()', {1: "delete-array-operator", 2: "dav"})
+ check('function', 'operator bool() const', {1: "castto-b-operatorC", 2: "NKcvbEv"})
+ check('function', 'void operator""_udl()', {2: 'li4_udlv'})
+
+ check('function', 'void operator~()', {1: "inv-operator", 2: "cov"})
+ check('function', 'void operator compl()', {2: "cov"})
+ check('function', 'void operator+()', {1: "add-operator", 2: "plv"})
+ check('function', 'void operator-()', {1: "sub-operator", 2: "miv"})
+ check('function', 'void operator*()', {1: "mul-operator", 2: "mlv"})
+ check('function', 'void operator/()', {1: "div-operator", 2: "dvv"})
+ check('function', 'void operator%()', {1: "mod-operator", 2: "rmv"})
+ check('function', 'void operator&()', {1: "and-operator", 2: "anv"})
+ check('function', 'void operator bitand()', {2: "anv"})
+ check('function', 'void operator|()', {1: "or-operator", 2: "orv"})
+ check('function', 'void operator bitor()', {2: "orv"})
+ check('function', 'void operator^()', {1: "xor-operator", 2: "eov"})
+ check('function', 'void operator xor()', {2: "eov"})
+ check('function', 'void operator=()', {1: "assign-operator", 2: "aSv"})
+ check('function', 'void operator+=()', {1: "add-assign-operator", 2: "pLv"})
+ check('function', 'void operator-=()', {1: "sub-assign-operator", 2: "mIv"})
+ check('function', 'void operator*=()', {1: "mul-assign-operator", 2: "mLv"})
+ check('function', 'void operator/=()', {1: "div-assign-operator", 2: "dVv"})
+ check('function', 'void operator%=()', {1: "mod-assign-operator", 2: "rMv"})
+ check('function', 'void operator&=()', {1: "and-assign-operator", 2: "aNv"})
+ check('function', 'void operator and_eq()', {2: "aNv"})
+ check('function', 'void operator|=()', {1: "or-assign-operator", 2: "oRv"})
+ check('function', 'void operator or_eq()', {2: "oRv"})
+ check('function', 'void operator^=()', {1: "xor-assign-operator", 2: "eOv"})
+ check('function', 'void operator xor_eq()', {2: "eOv"})
+ check('function', 'void operator<<()', {1: "lshift-operator", 2: "lsv"})
+ check('function', 'void operator>>()', {1: "rshift-operator", 2: "rsv"})
+ check('function', 'void operator<<=()', {1: "lshift-assign-operator", 2: "lSv"})
+ check('function', 'void operator>>=()', {1: "rshift-assign-operator", 2: "rSv"})
+ check('function', 'void operator==()', {1: "eq-operator", 2: "eqv"})
+ check('function', 'void operator!=()', {1: "neq-operator", 2: "nev"})
+ check('function', 'void operator not_eq()', {2: "nev"})
+ check('function', 'void operator<()', {1: "lt-operator", 2: "ltv"})
+ check('function', 'void operator>()', {1: "gt-operator", 2: "gtv"})
+ check('function', 'void operator<=()', {1: "lte-operator", 2: "lev"})
+ check('function', 'void operator>=()', {1: "gte-operator", 2: "gev"})
+ check('function', 'void operator<=>()', {2: "ssv"})
+ check('function', 'void operator!()', {1: "not-operator", 2: "ntv"})
+ check('function', 'void operator not()', {2: "ntv"})
+ check('function', 'void operator&&()', {1: "sand-operator", 2: "aav"})
+ check('function', 'void operator and()', {2: "aav"})
+ check('function', 'void operator||()', {1: "sor-operator", 2: "oov"})
+ check('function', 'void operator or()', {2: "oov"})
+ check('function', 'void operator++()', {1: "inc-operator", 2: "ppv"})
+ check('function', 'void operator--()', {1: "dec-operator", 2: "mmv"})
+ check('function', 'void operator,()', {1: "comma-operator", 2: "cmv"})
+ check('function', 'void operator->*()', {1: "pointer-by-pointer-operator", 2: "pmv"})
+ check('function', 'void operator->()', {1: "pointer-operator", 2: "ptv"})
+ check('function', 'void operator()()', {1: "call-operator", 2: "clv"})
+ check('function', 'void operator[]()', {1: "subscript-operator", 2: "ixv"})
+
+
+def test_domain_cpp_ast_nested_name():
+ check('class', '{key}::A', {1: "A", 2: "1A"})
+ check('class', '{key}::A::B', {1: "A::B", 2: "N1A1BE"})
+ check('function', 'void f(::A a)', {1: "f__A", 2: "1f1A"})
+ check('function', 'void f(::A::B a)', {1: "f__A::B", 2: "1fN1A1BE"})
+
+
+def test_domain_cpp_ast_class_definitions():
+ check('class', 'public A', {1: "A", 2: "1A"}, output='{key}A')
+ check('class', 'private {key}A', {1: "A", 2: "1A"})
+ check('class', '{key}A final', {1: 'A', 2: '1A'})
+
+ # test bases
+ check('class', '{key}A', {1: "A", 2: "1A"})
+ check('class', '{key}A::B::C', {1: "A::B::C", 2: "N1A1B1CE"})
+ check('class', '{key}A : B', {1: "A", 2: "1A"})
+ check('class', '{key}A : private B', {1: "A", 2: "1A"})
+ check('class', '{key}A : public B', {1: "A", 2: "1A"})
+ check('class', '{key}A : B, C', {1: "A", 2: "1A"})
+ check('class', '{key}A : B, protected C, D', {1: "A", 2: "1A"})
+ check('class', 'A : virtual private B', {1: 'A', 2: '1A'}, output='{key}A : private virtual B')
+ check('class', '{key}A : private virtual B', {1: 'A', 2: '1A'})
+ check('class', '{key}A : B, virtual C', {1: 'A', 2: '1A'})
+ check('class', '{key}A : public virtual B', {1: 'A', 2: '1A'})
+ check('class', '{key}A : B, C...', {1: 'A', 2: '1A'})
+ check('class', '{key}A : B..., C', {1: 'A', 2: '1A'})
+
+ # from #4094
+ check('class', 'template<class, class = std::void_t<>> {key}has_var', {2: 'I00E7has_var'})
+ check('class', 'template<class T> {key}has_var<T, std::void_t<decltype(&T::var)>>',
+ {2: 'I0E7has_varI1TNSt6void_tIDTadN1T3varEEEEE'})
+
+ check('class', 'template<typename ...Ts> {key}T<int (*)(Ts)...>',
+ {2: 'IDpE1TIJPFi2TsEEE'})
+ check('class', 'template<int... Is> {key}T<(Is)...>',
+ {2: 'I_DpiE1TIJX(Is)EEE', 3: 'I_DpiE1TIJX2IsEEE'})
+
+
+def test_domain_cpp_ast_union_definitions():
+ check('union', '{key}A', {2: "1A"})
+
+
+def test_domain_cpp_ast_enum_definitions():
+ check('enum', '{key}A', {2: "1A"})
+ check('enum', '{key}A : std::underlying_type<B>::type', {2: "1A"})
+ check('enum', '{key}A : unsigned int', {2: "1A"})
+ check('enum', 'public A', {2: "1A"}, output='{key}A')
+ check('enum', 'private {key}A', {2: "1A"})
+
+ check('enumerator', '{key}A', {2: "1A"})
+ check('enumerator', '{key}A = std::numeric_limits<unsigned long>::max()', {2: "1A"})
+
+
+def test_domain_cpp_ast_anon_definitions():
+ check('class', '@a', {3: "Ut1_a"}, asTextOutput='class [anonymous]')
+ check('union', '@a', {3: "Ut1_a"}, asTextOutput='union [anonymous]')
+ check('enum', '@a', {3: "Ut1_a"}, asTextOutput='enum [anonymous]')
+ check('class', '@1', {3: "Ut1_1"}, asTextOutput='class [anonymous]')
+ check('class', '@a::A', {3: "NUt1_a1AE"}, asTextOutput='class [anonymous]::A')
+
+ check('function', 'int f(int @a)', {1: 'f__i', 2: '1fi'},
+ asTextOutput='int f(int [anonymous])')
+
+
+def test_domain_cpp_ast_templates():
+ check('class', "A<T>", {2: "IE1AI1TE"}, output="template<> {key}A<T>")
+ # first just check which objects support templating
+ check('class', "template<> {key}A", {2: "IE1A"})
+ check('function', "template<> void A()", {2: "IE1Av", 4: "IE1Avv"})
+ check('member', "template<> A a", {2: "IE1a"})
+ check('type', "template<> {key}a = A", {2: "IE1a"}, key='using')
+ with pytest.raises(DefinitionError):
+ parse('enum', "template<> A")
+ with pytest.raises(DefinitionError):
+ parse('enumerator', "template<> A")
+ # then all the real tests
+ check('class', "template<typename T1, typename T2> {key}A", {2: "I00E1A"})
+ check('type', "template<> {key}a", {2: "IE1a"}, key='using')
+
+ check('class', "template<typename T> {key}A", {2: "I0E1A"})
+ check('class', "template<class T> {key}A", {2: "I0E1A"})
+ check('class', "template<typename ...T> {key}A", {2: "IDpE1A"})
+ check('class', "template<typename...> {key}A", {2: "IDpE1A"})
+ check('class', "template<typename = Test> {key}A", {2: "I0E1A"})
+ check('class', "template<typename T = Test> {key}A", {2: "I0E1A"})
+
+ check('class', "template<template<typename> typename T> {key}A", {2: "II0E0E1A"})
+ check('class', "template<template<typename> class T> {key}A", {2: "II0E0E1A"})
+ check('class', "template<template<typename> typename> {key}A", {2: "II0E0E1A"})
+ check('class', "template<template<typename> typename ...T> {key}A", {2: "II0EDpE1A"})
+ check('class', "template<template<typename> typename...> {key}A", {2: "II0EDpE1A"})
+ check('class', "template<typename T, template<typename> typename...> {key}A", {2: "I0I0EDpE1A"})
+
+ check('class', "template<int> {key}A", {2: "I_iE1A"})
+ check('class', "template<int T> {key}A", {2: "I_iE1A"})
+ check('class', "template<int... T> {key}A", {2: "I_DpiE1A"})
+ check('class', "template<int T = 42> {key}A", {2: "I_iE1A"})
+ check('class', "template<int = 42> {key}A", {2: "I_iE1A"})
+
+ check('class', "template<typename A<B>::C> {key}A", {2: "I_N1AI1BE1CEE1A"})
+ check('class', "template<typename A<B>::C = 42> {key}A", {2: "I_N1AI1BE1CEE1A"})
+ # from #7944
+ check('function', "template<typename T, "
+ "typename std::enable_if<!has_overloaded_addressof<T>::value, bool>::type = false"
+ "> constexpr T *static_addressof(T &ref)",
+ {2: "I0_NSt9enable_ifIX!has_overloaded_addressof<T>::valueEbE4typeEE16static_addressofR1T",
+ 3: "I0_NSt9enable_ifIXntN24has_overloaded_addressofI1TE5valueEEbE4typeEE16static_addressofR1T",
+ 4: "I0_NSt9enable_ifIXntN24has_overloaded_addressofI1TE5valueEEbE4typeEE16static_addressofP1TR1T"})
+
+ check('class', "template<> {key}A<NS::B<>>", {2: "IE1AIN2NS1BIEEE"})
+
+ # from #2058
+ check('function',
+ "template<typename Char, typename Traits> "
+ "inline std::basic_ostream<Char, Traits> &operator<<("
+ "std::basic_ostream<Char, Traits> &os, "
+ "const c_string_view_base<const Char, Traits> &str)",
+ {2: "I00ElsRNSt13basic_ostreamI4Char6TraitsEE"
+ "RK18c_string_view_baseIK4Char6TraitsE",
+ 4: "I00Els"
+ "RNSt13basic_ostreamI4Char6TraitsEE"
+ "RNSt13basic_ostreamI4Char6TraitsEE"
+ "RK18c_string_view_baseIK4Char6TraitsE"})
+
+ # template introductions
+ with pytest.raises(DefinitionError):
+ parse('enum', 'abc::ns::foo{id_0, id_1, id_2} A')
+ with pytest.raises(DefinitionError):
+ parse('enumerator', 'abc::ns::foo{id_0, id_1, id_2} A')
+ check('class', 'abc::ns::foo{{id_0, id_1, id_2}} {key}xyz::bar',
+ {2: 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barE'})
+ check('class', 'abc::ns::foo{{id_0, id_1, ...id_2}} {key}xyz::bar',
+ {2: 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barE'})
+ check('class', 'abc::ns::foo{{id_0, id_1, id_2}} {key}xyz::bar<id_0, id_1, id_2>',
+ {2: 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barE'})
+ check('class', 'abc::ns::foo{{id_0, id_1, ...id_2}} {key}xyz::bar<id_0, id_1, id_2...>',
+ {2: 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barE'})
+
+ check('class', 'template<> Concept{{U}} {key}A<int>::B', {2: 'IEI0EX7ConceptI1UEEN1AIiE1BE'})
+
+ check('type', 'abc::ns::foo{{id_0, id_1, id_2}} {key}xyz::bar = ghi::qux',
+ {2: 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barE'}, key='using')
+ check('type', 'abc::ns::foo{{id_0, id_1, ...id_2}} {key}xyz::bar = ghi::qux',
+ {2: 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barE'}, key='using')
+ check('function', 'abc::ns::foo{id_0, id_1, id_2} void xyz::bar()',
+ {2: 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barEv',
+ 4: 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barEvv'})
+ check('function', 'abc::ns::foo{id_0, id_1, ...id_2} void xyz::bar()',
+ {2: 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barEv',
+ 4: 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barEvv'})
+ check('member', 'abc::ns::foo{id_0, id_1, id_2} ghi::qux xyz::bar',
+ {2: 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barE'})
+ check('member', 'abc::ns::foo{id_0, id_1, ...id_2} ghi::qux xyz::bar',
+ {2: 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barE'})
+ check('concept', 'Iterator{{T, U}} {key}Another', {2: 'I00EX8IteratorI1T1UEE7Another'})
+ check('concept', 'template<typename ...Pack> {key}Numerics = (... && Numeric<Pack>)',
+ {2: 'IDpE8Numerics'})
+
+ # explicit specializations of members
+ check('member', 'template<> int A<int>::a', {2: 'IEN1AIiE1aE'})
+ check('member', 'template int A<int>::a', {2: 'IEN1AIiE1aE'},
+ output='template<> int A<int>::a') # same as above
+ check('member', 'template<> template<> int A<int>::B<int>::b', {2: 'IEIEN1AIiE1BIiE1bE'})
+ check('member', 'template int A<int>::B<int>::b', {2: 'IEIEN1AIiE1BIiE1bE'},
+ output='template<> template<> int A<int>::B<int>::b') # same as above
+
+ # defaulted constrained type parameters
+ check('type', 'template<C T = int&> {key}A', {2: 'I_1CE1A'}, key='using')
+
+ # pack expansion after non-type template parameter
+ check('type', 'template<int (X::*)(bool)...> {key}A', {2: 'I_DpM1XFibEE1A'}, key='using')
+
+
+def test_domain_cpp_ast_placeholder_types():
+ check('function', 'void f(Sortable auto &v)', {1: 'f__SortableR', 2: '1fR8Sortable'})
+ check('function', 'void f(const Sortable auto &v)', {1: 'f__SortableCR', 2: '1fRK8Sortable'})
+ check('function', 'void f(Sortable decltype(auto) &v)', {1: 'f__SortableR', 2: '1fR8Sortable'})
+ check('function', 'void f(const Sortable decltype(auto) &v)', {1: 'f__SortableCR', 2: '1fRK8Sortable'})
+ check('function', 'void f(Sortable decltype ( auto ) &v)', {1: 'f__SortableR', 2: '1fR8Sortable'},
+ output='void f(Sortable decltype(auto) &v)')
+
+
+def test_domain_cpp_ast_requires_clauses():
+ check('function', 'template<typename T> requires A auto f() -> void requires B',
+ {4: 'I0EIQaa1A1BE1fvv'})
+ check('function', 'template<typename T> requires A || B or C void f()',
+ {4: 'I0EIQoo1Aoo1B1CE1fvv'})
+ check('function', 'void f() requires A || B || C',
+ {4: 'IQoo1Aoo1B1CE1fv'})
+ check('function', 'Foo() requires A || B || C',
+ {4: 'IQoo1Aoo1B1CE3Foov'})
+ check('function', 'template<typename T> requires A && B || C and D void f()',
+ {4: 'I0EIQooaa1A1Baa1C1DE1fvv'})
+ check('function',
+ 'template<typename T> requires R<T> ' +
+ 'template<typename U> requires S<T> ' +
+ 'void A<T>::f() requires B',
+ {4: 'I0EIQ1RI1TEEI0EIQaa1SI1TE1BEN1A1fEvv'})
+ check('function',
+ 'template<template<typename T> requires R<T> typename X> ' +
+ 'void f()',
+ {2: 'II0EIQ1RI1TEE0E1fv', 4: 'II0EIQ1RI1TEE0E1fvv'})
+ check('type',
+ 'template<typename T> requires IsValid<T> {key}T = true_type',
+ {4: 'I0EIQ7IsValidI1TEE1T'}, key='using')
+ check('class',
+ 'template<typename T> requires IsValid<T> {key}T : Base',
+ {4: 'I0EIQ7IsValidI1TEE1T'}, key='class')
+ check('union',
+ 'template<typename T> requires IsValid<T> {key}T',
+ {4: 'I0EIQ7IsValidI1TEE1T'}, key='union')
+ check('member',
+ 'template<typename T> requires IsValid<T> int Val = 7',
+ {4: 'I0EIQ7IsValidI1TEE3Val'})
+
+
+def test_domain_cpp_ast_template_args():
+ # from breathe#218
+ check('function',
+ "template<typename F> "
+ "void allow(F *f, typename func<F, B, G != 1>::type tt)",
+ {2: "I0E5allowP1FN4funcI1F1BXG != 1EE4typeE",
+ 3: "I0E5allowP1FN4funcI1F1BXne1GL1EEE4typeE",
+ 4: "I0E5allowvP1FN4funcI1F1BXne1GL1EEE4typeE"})
+ # from #3542
+ check('type', "template<typename T> {key}"
+ "enable_if_not_array_t = std::enable_if_t<!is_array<T>::value, int>",
+ {2: "I0E21enable_if_not_array_t"},
+ key='using')
+
+
+def test_domain_cpp_ast_initializers():
+ idsMember = {1: 'v__T', 2: '1v'}
+ idsFunction = {1: 'f__T', 2: '1f1T'}
+ idsTemplate = {2: 'I_1TE1fv', 4: 'I_1TE1fvv'}
+ # no init
+ check('member', 'T v', idsMember)
+ check('function', 'void f(T v)', idsFunction)
+ check('function', 'template<T v> void f()', idsTemplate)
+ # with '=', assignment-expression
+ check('member', 'T v = 42', idsMember)
+ check('function', 'void f(T v = 42)', idsFunction)
+ check('function', 'template<T v = 42> void f()', idsTemplate)
+ # with '=', braced-init
+ check('member', 'T v = {}', idsMember)
+ check('function', 'void f(T v = {})', idsFunction)
+ check('function', 'template<T v = {}> void f()', idsTemplate)
+ check('member', 'T v = {42, 42, 42}', idsMember)
+ check('function', 'void f(T v = {42, 42, 42})', idsFunction)
+ check('function', 'template<T v = {42, 42, 42}> void f()', idsTemplate)
+ check('member', 'T v = {42, 42, 42,}', idsMember)
+ check('function', 'void f(T v = {42, 42, 42,})', idsFunction)
+ check('function', 'template<T v = {42, 42, 42,}> void f()', idsTemplate)
+ check('member', 'T v = {42, 42, args...}', idsMember)
+ check('function', 'void f(T v = {42, 42, args...})', idsFunction)
+ check('function', 'template<T v = {42, 42, args...}> void f()', idsTemplate)
+ # without '=', braced-init
+ check('member', 'T v{}', idsMember)
+ check('member', 'T v{42, 42, 42}', idsMember)
+ check('member', 'T v{42, 42, 42,}', idsMember)
+ check('member', 'T v{42, 42, args...}', idsMember)
+ # other
+ check('member', 'T v = T{}', idsMember)
+
+
+def test_domain_cpp_ast_attributes():
+ # style: C++
+ check('member', '[[]] int f', {1: 'f__i', 2: '1f'})
+ check('member', '[ [ ] ] int f', {1: 'f__i', 2: '1f'},
+ # this will fail when the proper grammar is implemented
+ output='[[ ]] int f')
+ check('member', '[[a]] int f', {1: 'f__i', 2: '1f'})
+ # style: GNU
+ check('member', '__attribute__(()) int f', {1: 'f__i', 2: '1f'})
+ check('member', '__attribute__((a)) int f', {1: 'f__i', 2: '1f'})
+ check('member', '__attribute__((a, b)) int f', {1: 'f__i', 2: '1f'})
+ check('member', '__attribute__((optimize(3))) int f', {1: 'f__i', 2: '1f'})
+ check('member', '__attribute__((format(printf, 1, 2))) int f', {1: 'f__i', 2: '1f'})
+ # style: user-defined id
+ check('member', 'id_attr int f', {1: 'f__i', 2: '1f'})
+ # style: user-defined paren
+ check('member', 'paren_attr() int f', {1: 'f__i', 2: '1f'})
+ check('member', 'paren_attr(a) int f', {1: 'f__i', 2: '1f'})
+ check('member', 'paren_attr("") int f', {1: 'f__i', 2: '1f'})
+ check('member', 'paren_attr(()[{}][]{}) int f', {1: 'f__i', 2: '1f'})
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr(() int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr([) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr({) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr([)]) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr((])) int f')
+ with pytest.raises(DefinitionError):
+ parse('member', 'paren_attr({]}) int f')
+
+ # position: decl specs
+ check('function', 'static inline __attribute__(()) void f()',
+ {1: 'f', 2: '1fv'},
+ output='__attribute__(()) static inline void f()')
+ check('function', '[[attr1]] [[attr2]] void f()', {1: 'f', 2: '1fv'})
+ # position: declarator
+ check('member', 'int *[[attr1]] [[attr2]] i', {1: 'i__iP', 2: '1i'})
+ check('member', 'int *const [[attr1]] [[attr2]] volatile i', {1: 'i__iPVC', 2: '1i'},
+ output='int *[[attr1]] [[attr2]] volatile const i')
+ check('member', 'int &[[attr1]] [[attr2]] i', {1: 'i__iR', 2: '1i'})
+ check('member', 'int *[[attr1]] [[attr2]] *i', {1: 'i__iPP', 2: '1i'})
+ # position: parameters and qualifiers
+ check('function', 'void f() [[attr1]] [[attr2]]', {1: 'f', 2: '1fv'})
+
+ # position: class, union, enum
+ check('class', '{key}[[attr1]] [[attr2]] Foo', {1: 'Foo', 2: '3Foo'}, key='class')
+ check('union', '{key}[[attr1]] [[attr2]] Foo', {2: '3Foo'}, key='union')
+ check('enum', '{key}[[attr1]] [[attr2]] Foo', {2: '3Foo'}, key='enum')
+ # position: enumerator
+ check('enumerator', '{key}Foo [[attr1]] [[attr2]]', {2: '3Foo'})
+ check('enumerator', '{key}Foo [[attr1]] [[attr2]] = 42', {2: '3Foo'})
+
+
+def test_domain_cpp_ast_xref_parsing():
+ def check(target):
+ class Config:
+ cpp_id_attributes = ["id_attr"]
+ cpp_paren_attributes = ["paren_attr"]
+ parser = DefinitionParser(target, location=None,
+ config=Config())
+ ast, isShorthand = parser.parse_xref_object()
+ parser.assert_end()
+ check('f')
+ check('f()')
+ check('void f()')
+ check('T f()')
+
+
+@pytest.mark.parametrize(
+ ("param", "is_pack"),
+ [('typename', False),
+ ('typename T', False),
+ ('typename...', True),
+ ('typename... T', True),
+ ('int', False),
+ ('int N', False),
+ ('int* N', False),
+ ('int& N', False),
+ ('int&... N', True),
+ ('int*... N', True),
+ ('int...', True),
+ ('int... N', True),
+ ('auto', False),
+ ('auto...', True),
+ ('int X::*', False),
+ ('int X::*...', True),
+ ('int (X::*)(bool)', False),
+ ('int (X::*x)(bool)', False),
+ ('int (X::*)(bool)...', True),
+ ('template<typename> class', False),
+ ('template<typename> class...', True),
+ ])
+def test_domain_cpp_template_parameters_is_pack(param: str, is_pack: bool):
+ def parse_template_parameter(param: str):
+ ast = parse('type', 'template<' + param + '> X')
+ return ast.templatePrefix.templates[0].params[0]
+ ast = parse_template_parameter(param)
+ assert ast.isPack == is_pack
+
+
+# def test_print():
+# # used for getting all the ids out for checking
+# for a in ids:
+# print(a)
+# raise DefinitionError
+
+
+def filter_warnings(warning, file):
+ lines = warning.getvalue().split("\n")
+ res = [l for l in lines if "domain-cpp" in l and f"{file}.rst" in l and
+ "WARNING: document isn't included in any toctree" not in l]
+ print(f"Filtered warnings for file '{file}':")
+ for w in res:
+ print(w)
+ return res
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_domain_cpp_build_multi_decl_lookup(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "lookup-key-overload")
+ assert len(ws) == 0
+
+ ws = filter_warnings(warning, "multi-decl-lookup")
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_domain_cpp_build_warn_template_param_qualified_name(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "warn-template-param-qualified-name")
+ assert len(ws) == 2
+ assert "WARNING: cpp:type reference target not found: T::typeWarn" in ws[0]
+ assert "WARNING: cpp:type reference target not found: T::U::typeWarn" in ws[1]
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_domain_cpp_build_backslash_ok_true(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "backslash")
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_domain_cpp_build_semicolon(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "semicolon")
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-cpp',
+ confoverrides={'nitpicky': True, 'strip_signature_backslash': True})
+def test_domain_cpp_build_backslash_ok_false(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "backslash")
+ assert len(ws) == 1
+ assert "WARNING: Parsing of expression failed. Using fallback parser." in ws[0]
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_domain_cpp_build_anon_dup_decl(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "anon-dup-decl")
+ assert len(ws) == 2
+ assert "WARNING: cpp:identifier reference target not found: @a" in ws[0]
+ assert "WARNING: cpp:identifier reference target not found: @b" in ws[1]
+
+
+@pytest.mark.sphinx(testroot='domain-cpp')
+def test_domain_cpp_build_misuse_of_roles(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "roles-targets-ok")
+ assert len(ws) == 0
+
+ ws = filter_warnings(warning, "roles-targets-warn")
+ # the roles that should be able to generate warnings:
+ allRoles = ['class', 'struct', 'union', 'func', 'member', 'var', 'type', 'concept', 'enum', 'enumerator']
+ ok = [ # targetType, okRoles
+ ('class', ['class', 'struct', 'type']),
+ ('union', ['union', 'type']),
+ ('func', ['func', 'type']),
+ ('member', ['member', 'var']),
+ ('type', ['type']),
+ ('concept', ['concept']),
+ ('enum', ['type', 'enum']),
+ ('enumerator', ['enumerator']),
+ ('functionParam', ['member', 'var']),
+ ('templateParam', ['class', 'struct', 'union', 'member', 'var', 'type']),
+ ]
+ warn = []
+ for targetType, roles in ok:
+ txtTargetType = "function" if targetType == "func" else targetType
+ for r in allRoles:
+ if r not in roles:
+ warn.append(f"WARNING: cpp:{r} targets a {txtTargetType} (")
+ if targetType == 'templateParam':
+ warn.append(f"WARNING: cpp:{r} targets a {txtTargetType} (")
+ warn.append(f"WARNING: cpp:{r} targets a {txtTargetType} (")
+ warn = sorted(warn)
+ for w in ws:
+ assert "targets a" in w
+ ws = [w[w.index("WARNING:"):] for w in ws]
+ ws = sorted(ws)
+ print("Expected warnings:")
+ for w in warn:
+ print(w)
+ print("Actual warnings:")
+ for w in ws:
+ print(w)
+
+ for i in range(min(len(warn), len(ws))):
+ assert ws[i].startswith(warn[i])
+
+ assert len(ws) == len(warn)
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'add_function_parentheses': True})
+def test_domain_cpp_build_with_add_function_parentheses_is_True(app, status, warning):
+ app.builder.build_all()
+
+ def check(spec, text, file):
+ pattern = '<li><p>%s<a .*?><code .*?><span .*?>%s</span></code></a></p></li>' % spec
+ res = re.search(pattern, text)
+ if not res:
+ print(f"Pattern\n\t{pattern}\nnot found in {file}")
+ raise AssertionError
+ rolePatterns = [
+ ('', 'Sphinx'),
+ ('', 'Sphinx::version'),
+ ('', 'version'),
+ ('', 'List'),
+ ('', 'MyEnum'),
+ ]
+ parenPatterns = [
+ ('ref function without parens ', r'paren_1\(\)'),
+ ('ref function with parens ', r'paren_2\(\)'),
+ ('ref function without parens, explicit title ', 'paren_3_title'),
+ ('ref function with parens, explicit title ', 'paren_4_title'),
+ ('ref op call without parens ', r'paren_5::operator\(\)\(\)'),
+ ('ref op call with parens ', r'paren_6::operator\(\)\(\)'),
+ ('ref op call without parens, explicit title ', 'paren_7_title'),
+ ('ref op call with parens, explicit title ', 'paren_8_title'),
+ ]
+
+ f = 'roles.html'
+ t = (app.outdir / f).read_text(encoding='utf8')
+ for s in rolePatterns:
+ check(s, t, f)
+ for s in parenPatterns:
+ check(s, t, f)
+
+ f = 'any-role.html'
+ t = (app.outdir / f).read_text(encoding='utf8')
+ for s in parenPatterns:
+ check(s, t, f)
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'add_function_parentheses': False})
+def test_domain_cpp_build_with_add_function_parentheses_is_False(app, status, warning):
+ app.builder.build_all()
+
+ def check(spec, text, file):
+ pattern = '<li><p>%s<a .*?><code .*?><span .*?>%s</span></code></a></p></li>' % spec
+ res = re.search(pattern, text)
+ if not res:
+ print(f"Pattern\n\t{pattern}\nnot found in {file}")
+ raise AssertionError
+ rolePatterns = [
+ ('', 'Sphinx'),
+ ('', 'Sphinx::version'),
+ ('', 'version'),
+ ('', 'List'),
+ ('', 'MyEnum'),
+ ]
+ parenPatterns = [
+ ('ref function without parens ', 'paren_1'),
+ ('ref function with parens ', 'paren_2'),
+ ('ref function without parens, explicit title ', 'paren_3_title'),
+ ('ref function with parens, explicit title ', 'paren_4_title'),
+ ('ref op call without parens ', r'paren_5::operator\(\)'),
+ ('ref op call with parens ', r'paren_6::operator\(\)'),
+ ('ref op call without parens, explicit title ', 'paren_7_title'),
+ ('ref op call with parens, explicit title ', 'paren_8_title'),
+ ]
+
+ f = 'roles.html'
+ t = (app.outdir / f).read_text(encoding='utf8')
+ for s in rolePatterns:
+ check(s, t, f)
+ for s in parenPatterns:
+ check(s, t, f)
+
+ f = 'any-role.html'
+ t = (app.outdir / f).read_text(encoding='utf8')
+ for s in parenPatterns:
+ check(s, t, f)
+
+
+@pytest.mark.sphinx(testroot='domain-cpp')
+def test_domain_cpp_build_xref_consistency(app, status, warning):
+ app.builder.build_all()
+
+ test = 'xref_consistency.html'
+ output = (app.outdir / test).read_text(encoding='utf8')
+
+ def classes(role, tag):
+ pattern = (fr'{role}-role:.*?'
+ fr'<(?P<tag>{tag}) .*?class=["\'](?P<classes>.*?)["\'].*?>'
+ r'.*'
+ r'</(?P=tag)>')
+ result = re.search(pattern, output)
+ expect = f'''\
+Pattern for role `{role}` with tag `{tag}`
+\t{pattern}
+not found in `{test}`
+'''
+ assert result, expect
+ return set(result.group('classes').split())
+
+ class RoleClasses:
+ """Collect the classes from the layout that was generated for a given role."""
+
+ def __init__(self, role, root, contents):
+ self.name = role
+ self.classes = classes(role, root)
+ self.content_classes = {}
+ for tag in contents:
+ self.content_classes[tag] = classes(role, tag)
+
+ # not actually used as a reference point
+ # code_role = RoleClasses('code', 'code', [])
+ any_role = RoleClasses('any', 'a', ['code'])
+ cpp_any_role = RoleClasses('cpp-any', 'a', ['code'])
+ # NYI: consistent looks
+ # texpr_role = RoleClasses('cpp-texpr', 'span', ['a', 'code'])
+ expr_role = RoleClasses('cpp-expr', 'span', ['a'])
+ texpr_role = RoleClasses('cpp-texpr', 'span', ['a', 'span'])
+
+ # XRefRole-style classes
+
+ # any and cpp:any do not put these classes at the root
+
+ # n.b. the generic any machinery finds the specific 'cpp-class' object type
+ expect = 'any uses XRefRole classes'
+ assert {'xref', 'any', 'cpp', 'cpp-class'} <= any_role.content_classes['code'], expect
+
+ expect = 'cpp:any uses XRefRole classes'
+ assert {'xref', 'cpp-any', 'cpp'} <= cpp_any_role.content_classes['code'], expect
+
+ for role in (expr_role, texpr_role):
+ name = role.name
+ expect = f'`{name}` puts the domain and role classes at its root'
+ assert {'sig', 'sig-inline', 'cpp', name} <= role.classes, expect
+
+ # reference classes
+
+ expect = 'the xref roles use the same reference classes'
+ assert any_role.classes == cpp_any_role.classes, expect
+ assert any_role.classes == expr_role.content_classes['a'], expect
+ assert any_role.classes == texpr_role.content_classes['a'], expect
+
+
+@pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'nitpicky': True})
+def test_domain_cpp_build_field_role(app, status, warning):
+ app.builder.build_all()
+ ws = filter_warnings(warning, "field-role")
+ assert len(ws) == 0
+
+
+@pytest.mark.sphinx(testroot='domain-cpp-intersphinx', confoverrides={'nitpicky': True})
+def test_domain_cpp_build_intersphinx(tmp_path, app, status, warning):
+ origSource = """\
+.. cpp:class:: _class
+.. cpp:struct:: _struct
+.. cpp:union:: _union
+.. cpp:function:: void _function()
+.. cpp:member:: int _member
+.. cpp:var:: int _var
+.. cpp:type:: _type
+.. cpp:concept:: template<typename T> _concept
+.. cpp:enum:: _enum
+
+ .. cpp:enumerator:: _enumerator
+
+.. cpp:enum-struct:: _enumStruct
+
+ .. cpp:enumerator:: _scopedEnumerator
+
+.. cpp:enum-class:: _enumClass
+.. cpp:function:: void _functionParam(int param)
+.. cpp:function:: template<typename TParam> void _templateParam()
+""" # noqa: F841
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(b'''\
+# Sphinx inventory version 2
+# Project: C Intersphinx Test
+# Version:
+# The remainder of this file is compressed using zlib.
+''' + zlib.compress(b'''\
+_class cpp:class 1 index.html#_CPPv46$ -
+_concept cpp:concept 1 index.html#_CPPv4I0E8$ -
+_concept::T cpp:templateParam 1 index.html#_CPPv4I0E8_concept -
+_enum cpp:enum 1 index.html#_CPPv45$ -
+_enum::_enumerator cpp:enumerator 1 index.html#_CPPv4N5_enum11_enumeratorE -
+_enumClass cpp:enum 1 index.html#_CPPv410$ -
+_enumStruct cpp:enum 1 index.html#_CPPv411$ -
+_enumStruct::_scopedEnumerator cpp:enumerator 1 index.html#_CPPv4N11_enumStruct17_scopedEnumeratorE -
+_enumerator cpp:enumerator 1 index.html#_CPPv4N5_enum11_enumeratorE -
+_function cpp:function 1 index.html#_CPPv49_functionv -
+_functionParam cpp:function 1 index.html#_CPPv414_functionParami -
+_functionParam::param cpp:functionParam 1 index.html#_CPPv414_functionParami -
+_member cpp:member 1 index.html#_CPPv47$ -
+_struct cpp:class 1 index.html#_CPPv47$ -
+_templateParam cpp:function 1 index.html#_CPPv4I0E14_templateParamvv -
+_templateParam::TParam cpp:templateParam 1 index.html#_CPPv4I0E14_templateParamvv -
+_type cpp:type 1 index.html#_CPPv45$ -
+_union cpp:union 1 index.html#_CPPv46$ -
+_var cpp:member 1 index.html#_CPPv44$ -
+''')) # noqa: W291
+ app.config.intersphinx_mapping = {
+ 'https://localhost/intersphinx/cpp/': str(inv_file),
+ }
+ app.config.intersphinx_cache_limit = 0
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ app.builder.build_all()
+ ws = filter_warnings(warning, "index")
+ assert len(ws) == 0
+
+
+def test_domain_cpp_parse_no_index_entry(app):
+ text = (".. cpp:function:: void f()\n"
+ ".. cpp:function:: void g()\n"
+ " :no-index-entry:\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, desc, addnodes.index, desc))
+ assert_node(doctree[0], addnodes.index, entries=[('single', 'f (C++ function)', '_CPPv41fv', '', None)])
+ assert_node(doctree[2], addnodes.index, entries=[])
+
+
+def test_domain_cpp_parse_mix_decl_duplicate(app, warning):
+ # Issue 8270
+ text = (".. cpp:struct:: A\n"
+ ".. cpp:function:: void A()\n"
+ ".. cpp:struct:: A\n")
+ restructuredtext.parse(app, text)
+ ws = warning.getvalue().split("\n")
+ assert len(ws) == 5
+ assert "index.rst:2: WARNING: Duplicate C++ declaration, also defined at index:1." in ws[0]
+ assert "Declaration is '.. cpp:function:: void A()'." in ws[1]
+ assert "index.rst:3: WARNING: Duplicate C++ declaration, also defined at index:1." in ws[2]
+ assert "Declaration is '.. cpp:struct:: A'." in ws[3]
+ assert ws[4] == ""
+
+
+# For some reason, using the default testroot of "root" leads to the contents of
+# `test-root/objects.txt` polluting the symbol table depending on the test
+# execution order. Using a testroot of "config" seems to avoid that problem.
+@pytest.mark.sphinx(testroot='config')
+def test_domain_cpp_normalize_unspecialized_template_args(make_app, app_params):
+ args, kwargs = app_params
+
+ text1 = (".. cpp:class:: template <typename T> A\n")
+ text2 = (".. cpp:class:: template <typename T> template <typename U> A<T>::B\n")
+
+ app1 = make_app(*args, **kwargs)
+ restructuredtext.parse(app=app1, text=text1, docname='text1')
+ root1 = app1.env.domaindata['cpp']['root_symbol']
+
+ assert root1.dump(1) == (
+ ' ::\n'
+ ' template<typename T> \n'
+ ' A: {class} template<typename T> A\t(text1)\n'
+ ' T: {templateParam} typename T\t(text1)\n'
+ )
+
+ app2 = make_app(*args, **kwargs)
+ restructuredtext.parse(app=app2, text=text2, docname='text2')
+ root2 = app2.env.domaindata['cpp']['root_symbol']
+
+ assert root2.dump(1) == (
+ ' ::\n'
+ ' template<typename T> \n'
+ ' A\n'
+ ' T\n'
+ ' template<typename U> \n'
+ ' B: {class} template<typename T> template<typename U> A<T>::B\t(text2)\n'
+ ' U: {templateParam} typename U\t(text2)\n'
+ )
+
+ root2.merge_with(root1, ['text1'], app2.env)
+
+ assert root2.dump(1) == (
+ ' ::\n'
+ ' template<typename T> \n'
+ ' A: {class} template<typename T> A\t(text1)\n'
+ ' T: {templateParam} typename T\t(text1)\n'
+ ' template<typename U> \n'
+ ' B: {class} template<typename T> template<typename U> A<T>::B\t(text2)\n'
+ ' U: {templateParam} typename U\t(text2)\n'
+ )
+ warning = app2._warning.getvalue()
+ assert 'Internal C++ domain error during symbol merging' not in warning
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'cpp_maximum_signature_line_length': len('str hello(str name)'),
+})
+def test_cpp_function_signature_with_cpp_maximum_signature_line_length_equal(app):
+ text = '.. cpp:function:: str hello(str name)'
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, 'hello']],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='cpp', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, 'str']],
+ desc_sig_space,
+ [desc_sig_name, 'name'],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'cpp_maximum_signature_line_length': len('str hello(str name)'),
+})
+def test_cpp_function_signature_with_cpp_maximum_signature_line_length_force_single(app):
+ text = ('.. cpp:function:: str hello(str names)\n'
+ ' :single-line-parameter-list:')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, 'hello']],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='cpp', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, 'str']],
+ desc_sig_space,
+ [desc_sig_name, 'names']),
+ ])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'cpp_maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cpp_function_signature_with_cpp_maximum_signature_line_length_break(app):
+ text = '.. cpp:function:: str hello(str names)'
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, 'hello']],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='cpp', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, 'str']],
+ desc_sig_space,
+ [desc_sig_name, 'names']),
+ ])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len('str hello(str name)'),
+})
+def test_cpp_function_signature_with_maximum_signature_line_length_equal(app):
+ text = '.. cpp:function:: str hello(str name)'
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, 'hello']],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='cpp', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, 'str']],
+ desc_sig_space,
+ [desc_sig_name, 'name'],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len('str hello(str name)'),
+})
+def test_cpp_function_signature_with_maximum_signature_line_length_force_single(app):
+ text = ('.. cpp:function:: str hello(str names)\n'
+ ' :single-line-parameter-list:')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, 'hello']],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='cpp', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, 'str']],
+ desc_sig_space,
+ [desc_sig_name, 'names']),
+ ])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("str hello(str name)"),
+})
+def test_cpp_function_signature_with_maximum_signature_line_length_break(app):
+ text = '.. cpp:function:: str hello(str names)'
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_signature_line, (
+ pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, 'hello']],
+ desc_parameterlist,
+ )],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='cpp', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, 'str']],
+ desc_sig_space,
+ [desc_sig_name, 'names']),
+ ])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'cpp_maximum_signature_line_length': len('str hello(str name)'),
+ 'maximum_signature_line_length': 1,
+})
+def test_cpp_maximum_signature_line_length_overrides_global(app):
+ text = '.. cpp:function:: str hello(str name)'
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, ([desc_signature, ([desc_signature_line, (pending_xref,
+ desc_sig_space,
+ [desc_name, [desc_sig_name, "hello"]],
+ desc_parameterlist)])],
+ desc_content)],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype='function',
+ domain='cpp', objtype='function', no_index=False)
+ assert_node(doctree[1][0][0][3], [desc_parameterlist, desc_parameter, (
+ [pending_xref, [desc_sig_name, 'str']],
+ desc_sig_space,
+ [desc_sig_name, 'name'],
+ )])
+ assert_node(doctree[1][0][0][3], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', testroot='domain-cpp-cpp_maximum_signature_line_length')
+def test_domain_cpp_cpp_maximum_signature_line_length_in_html(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf-8')
+ expected = """\
+
+<dl>
+<dd>\
+<span class="n"><span class="pre">str</span></span>\
+<span class="w"> </span>\
+<span class="n sig-param"><span class="pre">name</span></span>,\
+</dd>
+</dl>
+
+<span class="sig-paren">)</span>\
+<a class="headerlink" href=\
+"""
+ assert expected in content
+
+
+@pytest.mark.sphinx(
+ 'text', testroot='domain-cpp-cpp_maximum_signature_line_length',
+)
+def test_domain_cpp_cpp_maximum_signature_line_length_in_text(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ param_line_fmt = STDINDENT * " " + "{}\n"
+
+ expected_parameter_list_hello = "(\n{})".format(param_line_fmt.format("str name,"))
+
+ assert expected_parameter_list_hello in content
diff --git a/tests/test_domain_js.py b/tests/test_domain_js.py
new file mode 100644
index 0000000..bf4c3fe
--- /dev/null
+++ b/tests/test_domain_js.py
@@ -0,0 +1,505 @@
+"""Tests the JavaScript Domain"""
+
+from unittest.mock import Mock
+
+import docutils.utils
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.addnodes import (
+ desc,
+ desc_annotation,
+ desc_content,
+ desc_name,
+ desc_parameter,
+ desc_parameterlist,
+ desc_sig_keyword,
+ desc_sig_name,
+ desc_sig_space,
+ desc_signature,
+)
+from sphinx.domains.javascript import JavaScriptDomain
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+from sphinx.writers.text import STDINDENT
+
+
+@pytest.mark.sphinx('dummy', testroot='domain-js')
+def test_domain_js_xrefs(app, status, warning):
+ """Domain objects have correct prefixes when looking up xrefs"""
+ app.builder.build_all()
+
+ def assert_refnode(node, mod_name, prefix, target, reftype=None,
+ domain='js'):
+ attributes = {
+ 'refdomain': domain,
+ 'reftarget': target,
+ }
+ if reftype is not None:
+ attributes['reftype'] = reftype
+ if mod_name is not False:
+ attributes['js:module'] = mod_name
+ if prefix is not False:
+ attributes['js:object'] = prefix
+ assert_node(node, **attributes)
+
+ doctree = app.env.get_doctree('roles')
+ refnodes = list(doctree.findall(addnodes.pending_xref))
+ assert_refnode(refnodes[0], None, None, 'TopLevel', 'class')
+ assert_refnode(refnodes[1], None, None, 'top_level', 'func')
+ assert_refnode(refnodes[2], None, 'NestedParentA', 'child_1', 'func')
+ assert_refnode(refnodes[3], None, 'NestedParentA', 'NestedChildA.subchild_2', 'func')
+ assert_refnode(refnodes[4], None, 'NestedParentA', 'child_2', 'func')
+ assert_refnode(refnodes[5], False, 'NestedParentA', 'any_child', domain='')
+ assert_refnode(refnodes[6], None, 'NestedParentA', 'NestedChildA', 'class')
+ assert_refnode(refnodes[7], None, 'NestedParentA.NestedChildA', 'subchild_2', 'func')
+ assert_refnode(refnodes[8], None, 'NestedParentA.NestedChildA',
+ 'NestedParentA.child_1', 'func')
+ assert_refnode(refnodes[9], None, 'NestedParentA', 'NestedChildA.subchild_1', 'func')
+ assert_refnode(refnodes[10], None, 'NestedParentB', 'child_1', 'func')
+ assert_refnode(refnodes[11], None, 'NestedParentB', 'NestedParentB', 'class')
+ assert_refnode(refnodes[12], None, None, 'NestedParentA.NestedChildA', 'class')
+ assert len(refnodes) == 13
+
+ doctree = app.env.get_doctree('module')
+ refnodes = list(doctree.findall(addnodes.pending_xref))
+ assert_refnode(refnodes[0], 'module_a.submodule', None, 'ModTopLevel',
+ 'class')
+ assert_refnode(refnodes[1], 'module_a.submodule', 'ModTopLevel',
+ 'mod_child_1', 'meth')
+ assert_refnode(refnodes[2], 'module_a.submodule', 'ModTopLevel',
+ 'ModTopLevel.mod_child_1', 'meth')
+ assert_refnode(refnodes[3], 'module_a.submodule', 'ModTopLevel',
+ 'mod_child_2', 'meth')
+ assert_refnode(refnodes[4], 'module_a.submodule', 'ModTopLevel',
+ 'module_a.submodule.ModTopLevel.mod_child_1', 'meth')
+ assert_refnode(refnodes[5], 'module_b.submodule', None, 'ModTopLevel',
+ 'class')
+ assert_refnode(refnodes[6], 'module_b.submodule', 'ModTopLevel',
+ 'module_a.submodule', 'mod')
+ assert len(refnodes) == 7
+
+
+@pytest.mark.sphinx('dummy', testroot='domain-js')
+def test_domain_js_objects(app, status, warning):
+ app.builder.build_all()
+
+ modules = app.env.domains['js'].data['modules']
+ objects = app.env.domains['js'].data['objects']
+
+ assert 'module_a.submodule' in modules
+ assert 'module_a.submodule' in objects
+ assert 'module_b.submodule' in modules
+ assert 'module_b.submodule' in objects
+
+ assert objects['module_a.submodule.ModTopLevel'][2] == 'class'
+ assert objects['module_a.submodule.ModTopLevel.mod_child_1'][2] == 'method'
+ assert objects['module_a.submodule.ModTopLevel.mod_child_2'][2] == 'method'
+ assert objects['module_b.submodule.ModTopLevel'][2] == 'class'
+
+ assert objects['TopLevel'][2] == 'class'
+ assert objects['top_level'][2] == 'function'
+ assert objects['NestedParentA'][2] == 'class'
+ assert objects['NestedParentA.child_1'][2] == 'function'
+ assert objects['NestedParentA.any_child'][2] == 'function'
+ assert objects['NestedParentA.NestedChildA'][2] == 'class'
+ assert objects['NestedParentA.NestedChildA.subchild_1'][2] == 'function'
+ assert objects['NestedParentA.NestedChildA.subchild_2'][2] == 'function'
+ assert objects['NestedParentA.child_2'][2] == 'function'
+ assert objects['NestedParentB'][2] == 'class'
+ assert objects['NestedParentB.child_1'][2] == 'function'
+
+
+@pytest.mark.sphinx('dummy', testroot='domain-js')
+def test_domain_js_find_obj(app, status, warning):
+
+ def find_obj(mod_name, prefix, obj_name, obj_type, searchmode=0):
+ return app.env.domains['js'].find_obj(
+ app.env, mod_name, prefix, obj_name, obj_type, searchmode)
+
+ app.builder.build_all()
+
+ assert (find_obj(None, None, 'NONEXISTANT', 'class') == (None, None))
+ assert (find_obj(None, None, 'NestedParentA', 'class') ==
+ ('NestedParentA', ('roles', 'NestedParentA', 'class')))
+ assert (find_obj(None, None, 'NestedParentA.NestedChildA', 'class') ==
+ ('NestedParentA.NestedChildA',
+ ('roles', 'NestedParentA.NestedChildA', 'class')))
+ assert (find_obj(None, 'NestedParentA', 'NestedChildA', 'class') ==
+ ('NestedParentA.NestedChildA',
+ ('roles', 'NestedParentA.NestedChildA', 'class')))
+ assert (find_obj(None, None, 'NestedParentA.NestedChildA.subchild_1', 'func') ==
+ ('NestedParentA.NestedChildA.subchild_1',
+ ('roles', 'NestedParentA.NestedChildA.subchild_1', 'function')))
+ assert (find_obj(None, 'NestedParentA', 'NestedChildA.subchild_1', 'func') ==
+ ('NestedParentA.NestedChildA.subchild_1',
+ ('roles', 'NestedParentA.NestedChildA.subchild_1', 'function')))
+ assert (find_obj(None, 'NestedParentA.NestedChildA', 'subchild_1', 'func') ==
+ ('NestedParentA.NestedChildA.subchild_1',
+ ('roles', 'NestedParentA.NestedChildA.subchild_1', 'function')))
+ assert (find_obj('module_a.submodule', 'ModTopLevel', 'mod_child_2', 'meth') ==
+ ('module_a.submodule.ModTopLevel.mod_child_2',
+ ('module', 'module_a.submodule.ModTopLevel.mod_child_2', 'method')))
+ assert (find_obj('module_b.submodule', 'ModTopLevel', 'module_a.submodule', 'mod') ==
+ ('module_a.submodule',
+ ('module', 'module-module_a.submodule', 'module')))
+
+
+def test_get_full_qualified_name():
+ env = Mock(domaindata={})
+ domain = JavaScriptDomain(env)
+
+ # non-js references
+ node = nodes.reference()
+ assert domain.get_full_qualified_name(node) is None
+
+ # simple reference
+ node = nodes.reference(reftarget='func')
+ assert domain.get_full_qualified_name(node) == 'func'
+
+ # with js:module context
+ kwargs = {'js:module': 'module1'}
+ node = nodes.reference(reftarget='func', **kwargs)
+ assert domain.get_full_qualified_name(node) == 'module1.func'
+
+ # with js:object context
+ kwargs = {'js:object': 'Class'}
+ node = nodes.reference(reftarget='func', **kwargs)
+ assert domain.get_full_qualified_name(node) == 'Class.func'
+
+ # with both js:module and js:object context
+ kwargs = {'js:module': 'module1', 'js:object': 'Class'}
+ node = nodes.reference(reftarget='func', **kwargs)
+ assert domain.get_full_qualified_name(node) == 'module1.Class.func'
+
+
+def test_js_module(app):
+ text = ".. js:module:: sphinx"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ nodes.target))
+ assert_node(doctree[0], addnodes.index,
+ entries=[("single", "sphinx (module)", "module-sphinx", "", None)])
+ assert_node(doctree[1], nodes.target, ids=["module-sphinx"])
+
+
+def test_js_function(app):
+ text = ".. js:function:: sum(a, b)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, ([desc_sig_name, "sum"])],
+ desc_parameterlist)],
+ [desc_content, ()])]))
+ assert_node(doctree[1][0][1], [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "a"])],
+ [desc_parameter, ([desc_sig_name, "b"])])])
+ assert_node(doctree[0], addnodes.index,
+ entries=[("single", "sum() (built-in function)", "sum", "", None)])
+ assert_node(doctree[1], addnodes.desc, domain="js", objtype="function", no_index=False)
+
+
+def test_js_class(app):
+ text = ".. js:class:: Application"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ([desc_sig_keyword, 'class'],
+ desc_sig_space)],
+ [desc_name, ([desc_sig_name, "Application"])],
+ [desc_parameterlist, ()])],
+ [desc_content, ()])]))
+ assert_node(doctree[0], addnodes.index,
+ entries=[("single", "Application() (class)", "Application", "", None)])
+ assert_node(doctree[1], addnodes.desc, domain="js", objtype="class", no_index=False)
+
+
+def test_js_data(app):
+ text = ".. js:data:: name"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, ([desc_sig_name, "name"])])],
+ [desc_content, ()])]))
+ assert_node(doctree[0], addnodes.index,
+ entries=[("single", "name (global variable or constant)", "name", "", None)])
+ assert_node(doctree[1], addnodes.desc, domain="js", objtype="data", no_index=False)
+
+
+def test_no_index_entry(app):
+ text = (".. js:function:: f()\n"
+ ".. js:function:: g()\n"
+ " :no-index-entry:\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, desc, addnodes.index, desc))
+ assert_node(doctree[0], addnodes.index, entries=[('single', 'f() (built-in function)', 'f', '', None)])
+ assert_node(doctree[2], addnodes.index, entries=[])
+
+
+def test_module_content_line_number(app):
+ text = (".. js:module:: foo\n" +
+ "\n" +
+ " Some link here: :ref:`abc`\n")
+ doc = restructuredtext.parse(app, text)
+ xrefs = list(doc.findall(condition=addnodes.pending_xref))
+ assert len(xrefs) == 1
+ source, line = docutils.utils.get_source_line(xrefs[0])
+ assert 'index.rst' in source
+ assert line == 3
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'javascript_maximum_signature_line_length': len("hello(name)"),
+})
+def test_jsfunction_signature_with_javascript_maximum_signature_line_length_equal(app):
+ text = ".. js:function:: hello(name)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, ([desc_sig_name, "hello"])],
+ desc_parameterlist,
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], desc, desctype="function",
+ domain="js", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, desc_parameter, ([desc_sig_name, "name"])])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'javascript_maximum_signature_line_length': len("hello(name)"),
+})
+def test_jsfunction_signature_with_javascript_maximum_signature_line_length_force_single(app):
+ text = (".. js:function:: hello(names)\n"
+ " :single-line-parameter-list:")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, ([desc_sig_name, "hello"])],
+ desc_parameterlist,
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], desc, desctype="function",
+ domain="js", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, desc_parameter, ([desc_sig_name, "names"])])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'javascript_maximum_signature_line_length': len("hello(name)"),
+})
+def test_jsfunction_signature_with_javascript_maximum_signature_line_length_break(app):
+ text = ".. js:function:: hello(names)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, ([desc_sig_name, "hello"])],
+ desc_parameterlist,
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], desc, desctype="function",
+ domain="js", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, desc_parameter, ([desc_sig_name, "names"])])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("hello(name)"),
+})
+def test_jsfunction_signature_with_maximum_signature_line_length_equal(app):
+ text = ".. js:function:: hello(name)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, ([desc_sig_name, "hello"])],
+ desc_parameterlist,
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], desc, desctype="function",
+ domain="js", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, desc_parameter, ([desc_sig_name, "name"])])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("hello(name)"),
+})
+def test_jsfunction_signature_with_maximum_signature_line_length_force_single(app):
+ text = (".. js:function:: hello(names)\n"
+ " :single-line-parameter-list:")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, ([desc_sig_name, "hello"])],
+ desc_parameterlist,
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], desc, desctype="function",
+ domain="js", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, desc_parameter, ([desc_sig_name, "names"])])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("hello(name)"),
+})
+def test_jsfunction_signature_with_maximum_signature_line_length_break(app):
+ text = ".. js:function:: hello(names)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, ([desc_sig_name, "hello"])],
+ desc_parameterlist,
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], desc, desctype="function",
+ domain="js", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, desc_parameter, ([desc_sig_name, "names"])])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx(
+ 'html',
+ confoverrides={
+ 'javascript_maximum_signature_line_length': len("hello(name)"),
+ 'maximum_signature_line_length': 1,
+ },
+)
+def test_javascript_maximum_signature_line_length_overrides_global(app):
+ text = ".. js:function:: hello(name)"
+ doctree = restructuredtext.parse(app, text)
+ expected_doctree = (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, ([desc_sig_name, "hello"])],
+ desc_parameterlist)],
+ desc_content)])
+ assert_node(doctree, expected_doctree)
+ assert_node(doctree[1], desc, desctype="function",
+ domain="js", objtype="function", no_index=False)
+ expected_sig = [desc_parameterlist, desc_parameter, [desc_sig_name, "name"]]
+ assert_node(doctree[1][0][1], expected_sig)
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx(
+ 'html', testroot='domain-js-javascript_maximum_signature_line_length',
+)
+def test_domain_js_javascript_maximum_signature_line_length_in_html(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ expected_parameter_list_hello = """\
+
+<dl>
+<dd>\
+<em class="sig-param">\
+<span class="n"><span class="pre">name</span></span>\
+</em>,\
+</dd>
+</dl>
+
+<span class="sig-paren">)</span>\
+<a class="headerlink" href="#hello" title="Link to this definition">¶</a>\
+</dt>\
+"""
+ assert expected_parameter_list_hello in content
+
+ param_line_fmt = '<dd>{}</dd>\n'
+ param_name_fmt = (
+ '<em class="sig-param"><span class="n"><span class="pre">{}</span></span></em>'
+ )
+ optional_fmt = '<span class="optional">{}</span>'
+
+ expected_a = param_line_fmt.format(
+ optional_fmt.format("[") + param_name_fmt.format("a") + "," + optional_fmt.format("["),
+ )
+ assert expected_a in content
+
+ expected_b = param_line_fmt.format(
+ param_name_fmt.format("b") + "," + optional_fmt.format("]") + optional_fmt.format("]"),
+ )
+ assert expected_b in content
+
+ expected_c = param_line_fmt.format(param_name_fmt.format("c") + ",")
+ assert expected_c in content
+
+ expected_d = param_line_fmt.format(param_name_fmt.format("d") + optional_fmt.format("[") + ",")
+ assert expected_d in content
+
+ expected_e = param_line_fmt.format(param_name_fmt.format("e") + ",")
+ assert expected_e in content
+
+ expected_f = param_line_fmt.format(param_name_fmt.format("f") + "," + optional_fmt.format("]"))
+ assert expected_f in content
+
+ expected_parameter_list_foo = """\
+
+<dl>
+{}{}{}{}{}{}</dl>
+
+<span class="sig-paren">)</span>\
+<a class="headerlink" href="#foo" title="Link to this definition">¶</a>\
+</dt>\
+""".format(expected_a, expected_b, expected_c, expected_d, expected_e, expected_f)
+ assert expected_parameter_list_foo in content
+
+
+@pytest.mark.sphinx(
+ 'text', testroot='domain-js-javascript_maximum_signature_line_length',
+)
+def test_domain_js_javascript_maximum_signature_line_length_in_text(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ param_line_fmt = STDINDENT * " " + "{}\n"
+
+ expected_parameter_list_hello = "(\n{})".format(param_line_fmt.format("name,"))
+
+ assert expected_parameter_list_hello in content
+
+ expected_a = param_line_fmt.format("[a,[")
+ assert expected_a in content
+
+ expected_b = param_line_fmt.format("b,]]")
+ assert expected_b in content
+
+ expected_c = param_line_fmt.format("c,")
+ assert expected_c in content
+
+ expected_d = param_line_fmt.format("d[,")
+ assert expected_d in content
+
+ expected_e = param_line_fmt.format("e,")
+ assert expected_e in content
+
+ expected_f = param_line_fmt.format("f,]")
+ assert expected_f in content
+
+ expected_parameter_list_foo = "(\n{}{}{}{}{}{})".format(
+ expected_a, expected_b, expected_c, expected_d, expected_e, expected_f,
+ )
+ assert expected_parameter_list_foo in content
diff --git a/tests/test_domain_py.py b/tests/test_domain_py.py
new file mode 100644
index 0000000..c5a044b
--- /dev/null
+++ b/tests/test_domain_py.py
@@ -0,0 +1,2123 @@
+"""Tests the Python Domain"""
+
+from __future__ import annotations
+
+import re
+from unittest.mock import Mock
+
+import docutils.utils
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.addnodes import (
+ desc,
+ desc_addname,
+ desc_annotation,
+ desc_content,
+ desc_name,
+ desc_optional,
+ desc_parameter,
+ desc_parameterlist,
+ desc_returns,
+ desc_sig_keyword,
+ desc_sig_literal_number,
+ desc_sig_literal_string,
+ desc_sig_name,
+ desc_sig_operator,
+ desc_sig_punctuation,
+ desc_sig_space,
+ desc_signature,
+ desc_type_parameter,
+ desc_type_parameter_list,
+ pending_xref,
+)
+from sphinx.domains import IndexEntry
+from sphinx.domains.python import (
+ PythonDomain,
+ PythonModuleIndex,
+ _parse_annotation,
+ _pseudo_parse_arglist,
+ py_sig_re,
+)
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+from sphinx.writers.text import STDINDENT
+
+
+def parse(sig):
+ m = py_sig_re.match(sig)
+ if m is None:
+ raise ValueError
+ name_prefix, tp_list, name, arglist, retann = m.groups()
+ signode = addnodes.desc_signature(sig, '')
+ _pseudo_parse_arglist(signode, arglist)
+ return signode.astext()
+
+
+def test_function_signatures():
+ rv = parse('func(a=1) -> int object')
+ assert rv == '(a=1)'
+
+ rv = parse('func(a=1, [b=None])')
+ assert rv == '(a=1, [b=None])'
+
+ rv = parse('func(a=1[, b=None])')
+ assert rv == '(a=1, [b=None])'
+
+ rv = parse("compile(source : string, filename, symbol='file')")
+ assert rv == "(source : string, filename, symbol='file')"
+
+ rv = parse('func(a=[], [b=None])')
+ assert rv == '(a=[], [b=None])'
+
+ rv = parse('func(a=[][, b=None])')
+ assert rv == '(a=[], [b=None])'
+
+
+@pytest.mark.sphinx('dummy', testroot='domain-py')
+def test_domain_py_xrefs(app, status, warning):
+ """Domain objects have correct prefixes when looking up xrefs"""
+ app.builder.build_all()
+
+ def assert_refnode(node, module_name, class_name, target, reftype=None,
+ domain='py'):
+ attributes = {
+ 'refdomain': domain,
+ 'reftarget': target,
+ }
+ if reftype is not None:
+ attributes['reftype'] = reftype
+ if module_name is not False:
+ attributes['py:module'] = module_name
+ if class_name is not False:
+ attributes['py:class'] = class_name
+ assert_node(node, **attributes)
+
+ doctree = app.env.get_doctree('roles')
+ refnodes = list(doctree.findall(pending_xref))
+ assert_refnode(refnodes[0], None, None, 'TopLevel', 'class')
+ assert_refnode(refnodes[1], None, None, 'top_level', 'meth')
+ assert_refnode(refnodes[2], None, 'NestedParentA', 'child_1', 'meth')
+ assert_refnode(refnodes[3], None, 'NestedParentA', 'NestedChildA.subchild_2', 'meth')
+ assert_refnode(refnodes[4], None, 'NestedParentA', 'child_2', 'meth')
+ assert_refnode(refnodes[5], False, 'NestedParentA', 'any_child', domain='')
+ assert_refnode(refnodes[6], None, 'NestedParentA', 'NestedChildA', 'class')
+ assert_refnode(refnodes[7], None, 'NestedParentA.NestedChildA', 'subchild_2', 'meth')
+ assert_refnode(refnodes[8], None, 'NestedParentA.NestedChildA',
+ 'NestedParentA.child_1', 'meth')
+ assert_refnode(refnodes[9], None, 'NestedParentA', 'NestedChildA.subchild_1', 'meth')
+ assert_refnode(refnodes[10], None, 'NestedParentB', 'child_1', 'meth')
+ assert_refnode(refnodes[11], None, 'NestedParentB', 'NestedParentB', 'class')
+ assert_refnode(refnodes[12], None, None, 'NestedParentA.NestedChildA', 'class')
+ assert len(refnodes) == 13
+
+ doctree = app.env.get_doctree('module')
+ refnodes = list(doctree.findall(pending_xref))
+ assert_refnode(refnodes[0], 'module_a.submodule', None,
+ 'ModTopLevel', 'class')
+ assert_refnode(refnodes[1], 'module_a.submodule', 'ModTopLevel',
+ 'mod_child_1', 'meth')
+ assert_refnode(refnodes[2], 'module_a.submodule', 'ModTopLevel',
+ 'ModTopLevel.mod_child_1', 'meth')
+ assert_refnode(refnodes[3], 'module_a.submodule', 'ModTopLevel',
+ 'mod_child_2', 'meth')
+ assert_refnode(refnodes[4], 'module_a.submodule', 'ModTopLevel',
+ 'module_a.submodule.ModTopLevel.mod_child_1', 'meth')
+ assert_refnode(refnodes[5], 'module_a.submodule', 'ModTopLevel',
+ 'prop', 'attr')
+ assert_refnode(refnodes[6], 'module_a.submodule', 'ModTopLevel',
+ 'prop', 'meth')
+ assert_refnode(refnodes[7], 'module_b.submodule', None,
+ 'ModTopLevel', 'class')
+ assert_refnode(refnodes[8], 'module_b.submodule', 'ModTopLevel',
+ 'ModNoModule', 'class')
+ assert_refnode(refnodes[9], False, False, 'int', 'class')
+ assert_refnode(refnodes[10], False, False, 'tuple', 'class')
+ assert_refnode(refnodes[11], False, False, 'str', 'class')
+ assert_refnode(refnodes[12], False, False, 'float', 'class')
+ assert_refnode(refnodes[13], False, False, 'list', 'class')
+ assert_refnode(refnodes[14], False, False, 'ModTopLevel', 'class')
+ assert_refnode(refnodes[15], False, False, 'index', 'doc', domain='std')
+ assert len(refnodes) == 16
+
+ doctree = app.env.get_doctree('module_option')
+ refnodes = list(doctree.findall(pending_xref))
+ print(refnodes)
+ print(refnodes[0])
+ print(refnodes[1])
+ assert_refnode(refnodes[0], 'test.extra', 'B', 'foo', 'meth')
+ assert_refnode(refnodes[1], 'test.extra', 'B', 'foo', 'meth')
+ assert len(refnodes) == 2
+
+
+@pytest.mark.sphinx('html', testroot='domain-py')
+def test_domain_py_xrefs_abbreviations(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'abbr.html').read_text(encoding='utf8')
+ assert re.search(r'normal: <a .* href="module.html#module_a.submodule.ModTopLevel.'
+ r'mod_child_1" .*><.*>module_a.submodule.ModTopLevel.mod_child_1\(\)'
+ r'<.*></a>',
+ content)
+ assert re.search(r'relative: <a .* href="module.html#module_a.submodule.ModTopLevel.'
+ r'mod_child_1" .*><.*>ModTopLevel.mod_child_1\(\)<.*></a>',
+ content)
+ assert re.search(r'short name: <a .* href="module.html#module_a.submodule.ModTopLevel.'
+ r'mod_child_1" .*><.*>mod_child_1\(\)<.*></a>',
+ content)
+ assert re.search(r'relative \+ short name: <a .* href="module.html#module_a.submodule.'
+ r'ModTopLevel.mod_child_1" .*><.*>mod_child_1\(\)<.*></a>',
+ content)
+ assert re.search(r'short name \+ relative: <a .* href="module.html#module_a.submodule.'
+ r'ModTopLevel.mod_child_1" .*><.*>mod_child_1\(\)<.*></a>',
+ content)
+
+
+@pytest.mark.sphinx('dummy', testroot='domain-py')
+def test_domain_py_objects(app, status, warning):
+ app.builder.build_all()
+
+ modules = app.env.domains['py'].data['modules']
+ objects = app.env.domains['py'].data['objects']
+
+ assert 'module_a.submodule' in modules
+ assert 'module_a.submodule' in objects
+ assert 'module_b.submodule' in modules
+ assert 'module_b.submodule' in objects
+
+ assert objects['module_a.submodule.ModTopLevel'][2] == 'class'
+ assert objects['module_a.submodule.ModTopLevel.mod_child_1'][2] == 'method'
+ assert objects['module_a.submodule.ModTopLevel.mod_child_2'][2] == 'method'
+ assert 'ModTopLevel.ModNoModule' not in objects
+ assert objects['ModNoModule'][2] == 'class'
+ assert objects['module_b.submodule.ModTopLevel'][2] == 'class'
+
+ assert objects['TopLevel'][2] == 'class'
+ assert objects['top_level'][2] == 'method'
+ assert objects['NestedParentA'][2] == 'class'
+ assert objects['NestedParentA.child_1'][2] == 'method'
+ assert objects['NestedParentA.any_child'][2] == 'method'
+ assert objects['NestedParentA.NestedChildA'][2] == 'class'
+ assert objects['NestedParentA.NestedChildA.subchild_1'][2] == 'method'
+ assert objects['NestedParentA.NestedChildA.subchild_2'][2] == 'method'
+ assert objects['NestedParentA.child_2'][2] == 'method'
+ assert objects['NestedParentB'][2] == 'class'
+ assert objects['NestedParentB.child_1'][2] == 'method'
+
+
+@pytest.mark.sphinx('html', testroot='domain-py')
+def test_resolve_xref_for_properties(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'module.html').read_text(encoding='utf8')
+ assert ('Link to <a class="reference internal" href="#module_a.submodule.ModTopLevel.prop"'
+ ' title="module_a.submodule.ModTopLevel.prop">'
+ '<code class="xref py py-attr docutils literal notranslate"><span class="pre">'
+ 'prop</span> <span class="pre">attribute</span></code></a>' in content)
+ assert ('Link to <a class="reference internal" href="#module_a.submodule.ModTopLevel.prop"'
+ ' title="module_a.submodule.ModTopLevel.prop">'
+ '<code class="xref py py-meth docutils literal notranslate"><span class="pre">'
+ 'prop</span> <span class="pre">method</span></code></a>' in content)
+ assert ('Link to <a class="reference internal" href="#module_a.submodule.ModTopLevel.prop"'
+ ' title="module_a.submodule.ModTopLevel.prop">'
+ '<code class="xref py py-attr docutils literal notranslate"><span class="pre">'
+ 'prop</span> <span class="pre">attribute</span></code></a>' in content)
+
+
+@pytest.mark.sphinx('dummy', testroot='domain-py')
+def test_domain_py_find_obj(app, status, warning):
+
+ def find_obj(modname, prefix, obj_name, obj_type, searchmode=0):
+ return app.env.domains['py'].find_obj(
+ app.env, modname, prefix, obj_name, obj_type, searchmode)
+
+ app.builder.build_all()
+
+ assert (find_obj(None, None, 'NONEXISTANT', 'class') == [])
+ assert (find_obj(None, None, 'NestedParentA', 'class') ==
+ [('NestedParentA', ('roles', 'NestedParentA', 'class', False))])
+ assert (find_obj(None, None, 'NestedParentA.NestedChildA', 'class') ==
+ [('NestedParentA.NestedChildA',
+ ('roles', 'NestedParentA.NestedChildA', 'class', False))])
+ assert (find_obj(None, 'NestedParentA', 'NestedChildA', 'class') ==
+ [('NestedParentA.NestedChildA',
+ ('roles', 'NestedParentA.NestedChildA', 'class', False))])
+ assert (find_obj(None, None, 'NestedParentA.NestedChildA.subchild_1', 'meth') ==
+ [('NestedParentA.NestedChildA.subchild_1',
+ ('roles', 'NestedParentA.NestedChildA.subchild_1', 'method', False))])
+ assert (find_obj(None, 'NestedParentA', 'NestedChildA.subchild_1', 'meth') ==
+ [('NestedParentA.NestedChildA.subchild_1',
+ ('roles', 'NestedParentA.NestedChildA.subchild_1', 'method', False))])
+ assert (find_obj(None, 'NestedParentA.NestedChildA', 'subchild_1', 'meth') ==
+ [('NestedParentA.NestedChildA.subchild_1',
+ ('roles', 'NestedParentA.NestedChildA.subchild_1', 'method', False))])
+
+
+@pytest.mark.sphinx('html', testroot='domain-py', freshenv=True)
+def test_domain_py_canonical(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'canonical.html').read_text(encoding='utf8')
+ assert ('<a class="reference internal" href="#canonical.Foo" title="canonical.Foo">'
+ '<code class="xref py py-class docutils literal notranslate">'
+ '<span class="pre">Foo</span></code></a>' in content)
+ assert warning.getvalue() == ''
+
+
+def test_get_full_qualified_name():
+ env = Mock(domaindata={})
+ domain = PythonDomain(env)
+
+ # non-python references
+ node = nodes.reference()
+ assert domain.get_full_qualified_name(node) is None
+
+ # simple reference
+ node = nodes.reference(reftarget='func')
+ assert domain.get_full_qualified_name(node) == 'func'
+
+ # with py:module context
+ kwargs = {'py:module': 'module1'}
+ node = nodes.reference(reftarget='func', **kwargs)
+ assert domain.get_full_qualified_name(node) == 'module1.func'
+
+ # with py:class context
+ kwargs = {'py:class': 'Class'}
+ node = nodes.reference(reftarget='func', **kwargs)
+ assert domain.get_full_qualified_name(node) == 'Class.func'
+
+ # with both py:module and py:class context
+ kwargs = {'py:module': 'module1', 'py:class': 'Class'}
+ node = nodes.reference(reftarget='func', **kwargs)
+ assert domain.get_full_qualified_name(node) == 'module1.Class.func'
+
+
+def test_parse_annotation(app):
+ doctree = _parse_annotation("int", app.env)
+ assert_node(doctree, ([pending_xref, "int"],))
+ assert_node(doctree[0], pending_xref, refdomain="py", reftype="class", reftarget="int")
+
+ doctree = _parse_annotation("List[int]", app.env)
+ assert_node(doctree, ([pending_xref, "List"],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "int"],
+ [desc_sig_punctuation, "]"]))
+
+ doctree = _parse_annotation("Tuple[int, int]", app.env)
+ assert_node(doctree, ([pending_xref, "Tuple"],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "int"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [pending_xref, "int"],
+ [desc_sig_punctuation, "]"]))
+
+ doctree = _parse_annotation("Tuple[()]", app.env)
+ assert_node(doctree, ([pending_xref, "Tuple"],
+ [desc_sig_punctuation, "["],
+ [desc_sig_punctuation, "("],
+ [desc_sig_punctuation, ")"],
+ [desc_sig_punctuation, "]"]))
+
+ doctree = _parse_annotation("Tuple[int, ...]", app.env)
+ assert_node(doctree, ([pending_xref, "Tuple"],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "int"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [desc_sig_punctuation, "..."],
+ [desc_sig_punctuation, "]"]))
+
+ doctree = _parse_annotation("Callable[[int, int], int]", app.env)
+ assert_node(doctree, ([pending_xref, "Callable"],
+ [desc_sig_punctuation, "["],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "int"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [pending_xref, "int"],
+ [desc_sig_punctuation, "]"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [pending_xref, "int"],
+ [desc_sig_punctuation, "]"]))
+
+ doctree = _parse_annotation("Callable[[], int]", app.env)
+ assert_node(doctree, ([pending_xref, "Callable"],
+ [desc_sig_punctuation, "["],
+ [desc_sig_punctuation, "["],
+ [desc_sig_punctuation, "]"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [pending_xref, "int"],
+ [desc_sig_punctuation, "]"]))
+
+ doctree = _parse_annotation("List[None]", app.env)
+ assert_node(doctree, ([pending_xref, "List"],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "None"],
+ [desc_sig_punctuation, "]"]))
+
+ # None type makes an object-reference (not a class reference)
+ doctree = _parse_annotation("None", app.env)
+ assert_node(doctree, ([pending_xref, "None"],))
+ assert_node(doctree[0], pending_xref, refdomain="py", reftype="obj", reftarget="None")
+
+ # Literal type makes an object-reference (not a class reference)
+ doctree = _parse_annotation("typing.Literal['a', 'b']", app.env)
+ assert_node(doctree, ([pending_xref, "Literal"],
+ [desc_sig_punctuation, "["],
+ [desc_sig_literal_string, "'a'"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [desc_sig_literal_string, "'b'"],
+ [desc_sig_punctuation, "]"]))
+ assert_node(doctree[0], pending_xref, refdomain="py", reftype="obj", reftarget="typing.Literal")
+
+
+def test_parse_annotation_suppress(app):
+ doctree = _parse_annotation("~typing.Dict[str, str]", app.env)
+ assert_node(doctree, ([pending_xref, "Dict"],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "str"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [pending_xref, "str"],
+ [desc_sig_punctuation, "]"]))
+ assert_node(doctree[0], pending_xref, refdomain="py", reftype="obj", reftarget="typing.Dict")
+
+
+def test_parse_annotation_Literal(app):
+ doctree = _parse_annotation("Literal[True, False]", app.env)
+ assert_node(doctree, ([pending_xref, "Literal"],
+ [desc_sig_punctuation, "["],
+ [desc_sig_keyword, "True"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [desc_sig_keyword, "False"],
+ [desc_sig_punctuation, "]"]))
+
+ doctree = _parse_annotation("typing.Literal[0, 1, 'abc']", app.env)
+ assert_node(doctree, ([pending_xref, "Literal"],
+ [desc_sig_punctuation, "["],
+ [desc_sig_literal_number, "0"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [desc_sig_literal_number, "1"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [desc_sig_literal_string, "'abc'"],
+ [desc_sig_punctuation, "]"]))
+
+
+def test_pyfunction_signature(app):
+ text = ".. py:function:: hello(name: str) -> str"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"])],
+ desc_content)]))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, desc_parameter, ([desc_sig_name, "name"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"])])
+
+
+def test_pyfunction_signature_full(app):
+ text = (".. py:function:: hello(a: str, b = 1, *args: str, "
+ "c: bool = True, d: tuple = (1, 2), **kwargs: str) -> str")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"])],
+ desc_content)]))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "a"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [desc_sig_name, pending_xref, "str"])],
+ [desc_parameter, ([desc_sig_name, "b"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "1"])],
+ [desc_parameter, ([desc_sig_operator, "*"],
+ [desc_sig_name, "args"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [desc_sig_name, pending_xref, "str"])],
+ [desc_parameter, ([desc_sig_name, "c"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [desc_sig_name, pending_xref, "bool"],
+ desc_sig_space,
+ [desc_sig_operator, "="],
+ desc_sig_space,
+ [nodes.inline, "True"])],
+ [desc_parameter, ([desc_sig_name, "d"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [desc_sig_name, pending_xref, "tuple"],
+ desc_sig_space,
+ [desc_sig_operator, "="],
+ desc_sig_space,
+ [nodes.inline, "(1, 2)"])],
+ [desc_parameter, ([desc_sig_operator, "**"],
+ [desc_sig_name, "kwargs"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [desc_sig_name, pending_xref, "str"])])])
+ # case: separator at head
+ text = ".. py:function:: hello(*, a)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, nodes.inline, "*"],
+ [desc_parameter, desc_sig_name, "a"])])
+
+ # case: separator in the middle
+ text = ".. py:function:: hello(a, /, b, *, c)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, desc_sig_name, "a"],
+ [desc_parameter, desc_sig_operator, "/"],
+ [desc_parameter, desc_sig_name, "b"],
+ [desc_parameter, desc_sig_operator, "*"],
+ [desc_parameter, desc_sig_name, "c"])])
+
+ # case: separator in the middle (2)
+ text = ".. py:function:: hello(a, /, *, b)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, desc_sig_name, "a"],
+ [desc_parameter, desc_sig_operator, "/"],
+ [desc_parameter, desc_sig_operator, "*"],
+ [desc_parameter, desc_sig_name, "b"])])
+
+ # case: separator at tail
+ text = ".. py:function:: hello(a, /)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, desc_sig_name, "a"],
+ [desc_parameter, desc_sig_operator, "/"])])
+
+
+def test_pyfunction_with_unary_operators(app):
+ text = ".. py:function:: menu(egg=+1, bacon=-1, sausage=~1, spam=not spam)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "egg"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "+1"])],
+ [desc_parameter, ([desc_sig_name, "bacon"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "-1"])],
+ [desc_parameter, ([desc_sig_name, "sausage"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "~1"])],
+ [desc_parameter, ([desc_sig_name, "spam"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "not spam"])])])
+
+
+def test_pyfunction_with_binary_operators(app):
+ text = ".. py:function:: menu(spam=2**64)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "spam"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "2**64"])])])
+
+
+def test_pyfunction_with_number_literals(app):
+ text = ".. py:function:: hello(age=0x10, height=1_6_0)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "age"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "0x10"])],
+ [desc_parameter, ([desc_sig_name, "height"],
+ [desc_sig_operator, "="],
+ [nodes.inline, "1_6_0"])])])
+
+
+def test_pyfunction_with_union_type_operator(app):
+ text = ".. py:function:: hello(age: int | None)"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0][1],
+ [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "age"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [desc_sig_name, ([pending_xref, "int"],
+ desc_sig_space,
+ [desc_sig_punctuation, "|"],
+ desc_sig_space,
+ [pending_xref, "None"])])])])
+
+
+def test_optional_pyfunction_signature(app):
+ text = ".. py:function:: compile(source [, filename [, symbol]]) -> ast object"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "compile"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "ast object"])],
+ desc_content)]))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1],
+ ([desc_parameter, ([desc_sig_name, "source"])],
+ [desc_optional, ([desc_parameter, ([desc_sig_name, "filename"])],
+ [desc_optional, desc_parameter, ([desc_sig_name, "symbol"])])]))
+
+
+def test_pyexception_signature(app):
+ text = ".. py:exception:: builtins.IOError"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ('exception', desc_sig_space)],
+ [desc_addname, "builtins."],
+ [desc_name, "IOError"])],
+ desc_content)]))
+ assert_node(doctree[1], desc, desctype="exception",
+ domain="py", objtype="exception", no_index=False)
+
+
+def test_pydata_signature(app):
+ text = (".. py:data:: version\n"
+ " :type: int\n"
+ " :value: 1\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "version"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "int"])],
+ [desc_annotation, (
+ desc_sig_space,
+ [desc_sig_punctuation, '='],
+ desc_sig_space,
+ "1")],
+ )],
+ desc_content)]))
+ assert_node(doctree[1], addnodes.desc, desctype="data",
+ domain="py", objtype="data", no_index=False)
+
+
+def test_pydata_signature_old(app):
+ text = (".. py:data:: version\n"
+ " :annotation: = 1\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "version"],
+ [desc_annotation, (desc_sig_space,
+ "= 1")])],
+ desc_content)]))
+ assert_node(doctree[1], addnodes.desc, desctype="data",
+ domain="py", objtype="data", no_index=False)
+
+
+def test_pydata_with_union_type_operator(app):
+ text = (".. py:data:: version\n"
+ " :type: int | str")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree[1][0],
+ ([desc_name, "version"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "int"],
+ desc_sig_space,
+ [desc_sig_punctuation, "|"],
+ desc_sig_space,
+ [pending_xref, "str"])]))
+
+
+def test_pyobject_prefix(app):
+ text = (".. py:class:: Foo\n"
+ "\n"
+ " .. py:method:: Foo.say\n"
+ " .. py:method:: FooBar.say")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ('class', desc_sig_space)],
+ [desc_name, "Foo"])],
+ [desc_content, (addnodes.index,
+ desc,
+ addnodes.index,
+ desc)])]))
+ assert doctree[1][1][1].astext().strip() == 'say()' # prefix is stripped
+ assert doctree[1][1][3].astext().strip() == 'FooBar.say()' # not stripped
+
+
+def test_pydata(app):
+ text = (".. py:module:: example\n"
+ ".. py:data:: var\n"
+ " :type: int\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ addnodes.index,
+ nodes.target,
+ [desc, ([desc_signature, ([desc_addname, "example."],
+ [desc_name, "var"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "int"])])],
+ [desc_content, ()])]))
+ assert_node(doctree[3][0][2][2], pending_xref, **{"py:module": "example"})
+ assert 'example.var' in domain.objects
+ assert domain.objects['example.var'] == ('index', 'example.var', 'data', False)
+
+
+def test_pyfunction(app):
+ text = (".. py:function:: func1\n"
+ ".. py:module:: example\n"
+ ".. py:function:: func2\n"
+ " :async:\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "func1"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()])],
+ addnodes.index,
+ addnodes.index,
+ nodes.target,
+ [desc, ([desc_signature, ([desc_annotation, ([desc_sig_keyword, 'async'],
+ desc_sig_space)],
+ [desc_addname, "example."],
+ [desc_name, "func2"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()])]))
+ assert_node(doctree[0], addnodes.index,
+ entries=[('pair', 'built-in function; func1()', 'func1', '', None)])
+ assert_node(doctree[2], addnodes.index,
+ entries=[('pair', 'module; example', 'module-example', '', None)])
+ assert_node(doctree[3], addnodes.index,
+ entries=[('single', 'func2() (in module example)', 'example.func2', '', None)])
+
+ assert 'func1' in domain.objects
+ assert domain.objects['func1'] == ('index', 'func1', 'function', False)
+ assert 'example.func2' in domain.objects
+ assert domain.objects['example.func2'] == ('index', 'example.func2', 'function', False)
+
+
+def test_pyclass_options(app):
+ text = (".. py:class:: Class1\n"
+ ".. py:class:: Class2\n"
+ " :final:\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_name, "Class1"])],
+ [desc_content, ()])],
+ addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("final",
+ desc_sig_space,
+ "class",
+ desc_sig_space)],
+ [desc_name, "Class2"])],
+ [desc_content, ()])]))
+
+ # class
+ assert_node(doctree[0], addnodes.index,
+ entries=[('single', 'Class1 (built-in class)', 'Class1', '', None)])
+ assert 'Class1' in domain.objects
+ assert domain.objects['Class1'] == ('index', 'Class1', 'class', False)
+
+ # :final:
+ assert_node(doctree[2], addnodes.index,
+ entries=[('single', 'Class2 (built-in class)', 'Class2', '', None)])
+ assert 'Class2' in domain.objects
+ assert domain.objects['Class2'] == ('index', 'Class2', 'class', False)
+
+
+def test_pymethod_options(app):
+ text = (".. py:class:: Class\n"
+ "\n"
+ " .. py:method:: meth1\n"
+ " .. py:method:: meth2\n"
+ " :classmethod:\n"
+ " .. py:method:: meth3\n"
+ " :staticmethod:\n"
+ " .. py:method:: meth4\n"
+ " :async:\n"
+ " .. py:method:: meth5\n"
+ " :abstractmethod:\n"
+ " .. py:method:: meth6\n"
+ " :final:\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_name, "Class"])],
+ [desc_content, (addnodes.index,
+ desc,
+ addnodes.index,
+ desc,
+ addnodes.index,
+ desc,
+ addnodes.index,
+ desc,
+ addnodes.index,
+ desc,
+ addnodes.index,
+ desc)])]))
+
+ # method
+ assert_node(doctree[1][1][0], addnodes.index,
+ entries=[('single', 'meth1() (Class method)', 'Class.meth1', '', None)])
+ assert_node(doctree[1][1][1], ([desc_signature, ([desc_name, "meth1"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth1' in domain.objects
+ assert domain.objects['Class.meth1'] == ('index', 'Class.meth1', 'method', False)
+
+ # :classmethod:
+ assert_node(doctree[1][1][2], addnodes.index,
+ entries=[('single', 'meth2() (Class class method)', 'Class.meth2', '', None)])
+ assert_node(doctree[1][1][3], ([desc_signature, ([desc_annotation, ("classmethod", desc_sig_space)],
+ [desc_name, "meth2"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth2' in domain.objects
+ assert domain.objects['Class.meth2'] == ('index', 'Class.meth2', 'method', False)
+
+ # :staticmethod:
+ assert_node(doctree[1][1][4], addnodes.index,
+ entries=[('single', 'meth3() (Class static method)', 'Class.meth3', '', None)])
+ assert_node(doctree[1][1][5], ([desc_signature, ([desc_annotation, ("static", desc_sig_space)],
+ [desc_name, "meth3"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth3' in domain.objects
+ assert domain.objects['Class.meth3'] == ('index', 'Class.meth3', 'method', False)
+
+ # :async:
+ assert_node(doctree[1][1][6], addnodes.index,
+ entries=[('single', 'meth4() (Class method)', 'Class.meth4', '', None)])
+ assert_node(doctree[1][1][7], ([desc_signature, ([desc_annotation, ("async", desc_sig_space)],
+ [desc_name, "meth4"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth4' in domain.objects
+ assert domain.objects['Class.meth4'] == ('index', 'Class.meth4', 'method', False)
+
+ # :abstractmethod:
+ assert_node(doctree[1][1][8], addnodes.index,
+ entries=[('single', 'meth5() (Class method)', 'Class.meth5', '', None)])
+ assert_node(doctree[1][1][9], ([desc_signature, ([desc_annotation, ("abstract", desc_sig_space)],
+ [desc_name, "meth5"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth5' in domain.objects
+ assert domain.objects['Class.meth5'] == ('index', 'Class.meth5', 'method', False)
+
+ # :final:
+ assert_node(doctree[1][1][10], addnodes.index,
+ entries=[('single', 'meth6() (Class method)', 'Class.meth6', '', None)])
+ assert_node(doctree[1][1][11], ([desc_signature, ([desc_annotation, ("final", desc_sig_space)],
+ [desc_name, "meth6"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth6' in domain.objects
+ assert domain.objects['Class.meth6'] == ('index', 'Class.meth6', 'method', False)
+
+
+def test_pyclassmethod(app):
+ text = (".. py:class:: Class\n"
+ "\n"
+ " .. py:classmethod:: meth\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_name, "Class"])],
+ [desc_content, (addnodes.index,
+ desc)])]))
+ assert_node(doctree[1][1][0], addnodes.index,
+ entries=[('single', 'meth() (Class class method)', 'Class.meth', '', None)])
+ assert_node(doctree[1][1][1], ([desc_signature, ([desc_annotation, ("classmethod", desc_sig_space)],
+ [desc_name, "meth"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth' in domain.objects
+ assert domain.objects['Class.meth'] == ('index', 'Class.meth', 'method', False)
+
+
+def test_pystaticmethod(app):
+ text = (".. py:class:: Class\n"
+ "\n"
+ " .. py:staticmethod:: meth\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_name, "Class"])],
+ [desc_content, (addnodes.index,
+ desc)])]))
+ assert_node(doctree[1][1][0], addnodes.index,
+ entries=[('single', 'meth() (Class static method)', 'Class.meth', '', None)])
+ assert_node(doctree[1][1][1], ([desc_signature, ([desc_annotation, ("static", desc_sig_space)],
+ [desc_name, "meth"],
+ [desc_parameterlist, ()])],
+ [desc_content, ()]))
+ assert 'Class.meth' in domain.objects
+ assert domain.objects['Class.meth'] == ('index', 'Class.meth', 'method', False)
+
+
+def test_pyattribute(app):
+ text = (".. py:class:: Class\n"
+ "\n"
+ " .. py:attribute:: attr\n"
+ " :type: Optional[str]\n"
+ " :value: ''\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_name, "Class"])],
+ [desc_content, (addnodes.index,
+ desc)])]))
+ assert_node(doctree[1][1][0], addnodes.index,
+ entries=[('single', 'attr (Class attribute)', 'Class.attr', '', None)])
+ assert_node(doctree[1][1][1], ([desc_signature, ([desc_name, "attr"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "str"],
+ desc_sig_space,
+ [desc_sig_punctuation, "|"],
+ desc_sig_space,
+ [pending_xref, "None"])],
+ [desc_annotation, (desc_sig_space,
+ [desc_sig_punctuation, '='],
+ desc_sig_space,
+ "''")],
+ )],
+ [desc_content, ()]))
+ assert_node(doctree[1][1][1][0][1][2], pending_xref, **{"py:class": "Class"})
+ assert_node(doctree[1][1][1][0][1][6], pending_xref, **{"py:class": "Class"})
+ assert 'Class.attr' in domain.objects
+ assert domain.objects['Class.attr'] == ('index', 'Class.attr', 'attribute', False)
+
+
+def test_pyproperty(app):
+ text = (".. py:class:: Class\n"
+ "\n"
+ " .. py:property:: prop1\n"
+ " :abstractmethod:\n"
+ " :type: str\n"
+ "\n"
+ " .. py:property:: prop2\n"
+ " :classmethod:\n"
+ " :type: str\n")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_name, "Class"])],
+ [desc_content, (addnodes.index,
+ desc,
+ addnodes.index,
+ desc)])]))
+ assert_node(doctree[1][1][0], addnodes.index,
+ entries=[('single', 'prop1 (Class property)', 'Class.prop1', '', None)])
+ assert_node(doctree[1][1][1], ([desc_signature, ([desc_annotation, ("abstract", desc_sig_space,
+ "property", desc_sig_space)],
+ [desc_name, "prop1"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "str"])])],
+ [desc_content, ()]))
+ assert_node(doctree[1][1][2], addnodes.index,
+ entries=[('single', 'prop2 (Class property)', 'Class.prop2', '', None)])
+ assert_node(doctree[1][1][3], ([desc_signature, ([desc_annotation, ("class", desc_sig_space,
+ "property", desc_sig_space)],
+ [desc_name, "prop2"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "str"])])],
+ [desc_content, ()]))
+ assert 'Class.prop1' in domain.objects
+ assert domain.objects['Class.prop1'] == ('index', 'Class.prop1', 'property', False)
+ assert 'Class.prop2' in domain.objects
+ assert domain.objects['Class.prop2'] == ('index', 'Class.prop2', 'property', False)
+
+
+def test_pydecorator_signature(app):
+ text = ".. py:decorator:: deco"
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_addname, "@"],
+ [desc_name, "deco"])],
+ desc_content)]))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+
+ assert 'deco' in domain.objects
+ assert domain.objects['deco'] == ('index', 'deco', 'function', False)
+
+
+def test_pydecoratormethod_signature(app):
+ text = ".. py:decoratormethod:: deco"
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_addname, "@"],
+ [desc_name, "deco"])],
+ desc_content)]))
+ assert_node(doctree[1], addnodes.desc, desctype="method",
+ domain="py", objtype="method", no_index=False)
+
+ assert 'deco' in domain.objects
+ assert domain.objects['deco'] == ('index', 'deco', 'method', False)
+
+
+def test_canonical(app):
+ text = (".. py:class:: io.StringIO\n"
+ " :canonical: _io.StringIO")
+ domain = app.env.get_domain('py')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_addname, "io."],
+ [desc_name, "StringIO"])],
+ desc_content)]))
+ assert 'io.StringIO' in domain.objects
+ assert domain.objects['io.StringIO'] == ('index', 'io.StringIO', 'class', False)
+ assert domain.objects['_io.StringIO'] == ('index', 'io.StringIO', 'class', True)
+
+
+def test_canonical_definition_overrides(app, warning):
+ text = (".. py:class:: io.StringIO\n"
+ " :canonical: _io.StringIO\n"
+ ".. py:class:: _io.StringIO\n")
+ restructuredtext.parse(app, text)
+ assert warning.getvalue() == ""
+
+ domain = app.env.get_domain('py')
+ assert domain.objects['_io.StringIO'] == ('index', 'id0', 'class', False)
+
+
+def test_canonical_definition_skip(app, warning):
+ text = (".. py:class:: _io.StringIO\n"
+ ".. py:class:: io.StringIO\n"
+ " :canonical: _io.StringIO\n")
+
+ restructuredtext.parse(app, text)
+ assert warning.getvalue() == ""
+
+ domain = app.env.get_domain('py')
+ assert domain.objects['_io.StringIO'] == ('index', 'io.StringIO', 'class', False)
+
+
+def test_canonical_duplicated(app, warning):
+ text = (".. py:class:: mypackage.StringIO\n"
+ " :canonical: _io.StringIO\n"
+ ".. py:class:: io.StringIO\n"
+ " :canonical: _io.StringIO\n")
+
+ restructuredtext.parse(app, text)
+ assert warning.getvalue() != ""
+
+
+def test_info_field_list(app):
+ text = (".. py:module:: example\n"
+ ".. py:class:: Class\n"
+ "\n"
+ " :meta blah: this meta-field must not show up in the toc-tree\n"
+ " :param str name: blah blah\n"
+ " :meta another meta field:\n"
+ " :param age: blah blah\n"
+ " :type age: int\n"
+ " :param items: blah blah\n"
+ " :type items: Tuple[str, ...]\n"
+ " :param Dict[str, str] params: blah blah\n")
+ doctree = restructuredtext.parse(app, text)
+ print(doctree)
+
+ assert_node(doctree, (addnodes.index,
+ addnodes.index,
+ nodes.target,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_addname, "example."],
+ [desc_name, "Class"])],
+ [desc_content, nodes.field_list, nodes.field])]))
+ assert_node(doctree[3][1][0][0],
+ ([nodes.field_name, "Parameters"],
+ [nodes.field_body, nodes.bullet_list, ([nodes.list_item, nodes.paragraph],
+ [nodes.list_item, nodes.paragraph],
+ [nodes.list_item, nodes.paragraph],
+ [nodes.list_item, nodes.paragraph])]))
+
+ # :param str name:
+ assert_node(doctree[3][1][0][0][1][0][0][0],
+ ([addnodes.literal_strong, "name"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ ")",
+ " -- ",
+ "blah blah"))
+ assert_node(doctree[3][1][0][0][1][0][0][0][2], pending_xref,
+ refdomain="py", reftype="class", reftarget="str",
+ **{"py:module": "example", "py:class": "Class"})
+
+ # :param age: + :type age:
+ assert_node(doctree[3][1][0][0][1][0][1][0],
+ ([addnodes.literal_strong, "age"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "int"],
+ ")",
+ " -- ",
+ "blah blah"))
+ assert_node(doctree[3][1][0][0][1][0][1][0][2], pending_xref,
+ refdomain="py", reftype="class", reftarget="int",
+ **{"py:module": "example", "py:class": "Class"})
+
+ # :param items: + :type items:
+ assert_node(doctree[3][1][0][0][1][0][2][0],
+ ([addnodes.literal_strong, "items"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "Tuple"],
+ [addnodes.literal_emphasis, "["],
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ [addnodes.literal_emphasis, ", "],
+ [addnodes.literal_emphasis, "..."],
+ [addnodes.literal_emphasis, "]"],
+ ")",
+ " -- ",
+ "blah blah"))
+ assert_node(doctree[3][1][0][0][1][0][2][0][2], pending_xref,
+ refdomain="py", reftype="class", reftarget="Tuple",
+ **{"py:module": "example", "py:class": "Class"})
+ assert_node(doctree[3][1][0][0][1][0][2][0][4], pending_xref,
+ refdomain="py", reftype="class", reftarget="str",
+ **{"py:module": "example", "py:class": "Class"})
+
+ # :param Dict[str, str] params:
+ assert_node(doctree[3][1][0][0][1][0][3][0],
+ ([addnodes.literal_strong, "params"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "Dict"],
+ [addnodes.literal_emphasis, "["],
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ [addnodes.literal_emphasis, ", "],
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ [addnodes.literal_emphasis, "]"],
+ ")",
+ " -- ",
+ "blah blah"))
+ assert_node(doctree[3][1][0][0][1][0][3][0][2], pending_xref,
+ refdomain="py", reftype="class", reftarget="Dict",
+ **{"py:module": "example", "py:class": "Class"})
+ assert_node(doctree[3][1][0][0][1][0][3][0][4], pending_xref,
+ refdomain="py", reftype="class", reftarget="str",
+ **{"py:module": "example", "py:class": "Class"})
+ assert_node(doctree[3][1][0][0][1][0][3][0][6], pending_xref,
+ refdomain="py", reftype="class", reftarget="str",
+ **{"py:module": "example", "py:class": "Class"})
+
+
+def test_info_field_list_piped_type(app):
+ text = (".. py:module:: example\n"
+ ".. py:class:: Class\n"
+ "\n"
+ " :param age: blah blah\n"
+ " :type age: int | str\n")
+ doctree = restructuredtext.parse(app, text)
+
+ assert_node(doctree,
+ (addnodes.index,
+ addnodes.index,
+ nodes.target,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_addname, "example."],
+ [desc_name, "Class"])],
+ [desc_content, nodes.field_list, nodes.field, (nodes.field_name,
+ nodes.field_body)])]))
+ assert_node(doctree[3][1][0][0][1],
+ ([nodes.paragraph, ([addnodes.literal_strong, "age"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "int"],
+ [addnodes.literal_emphasis, " | "],
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ ")",
+ " -- ",
+ "blah blah")],))
+ assert_node(doctree[3][1][0][0][1][0][2], pending_xref,
+ refdomain="py", reftype="class", reftarget="int",
+ **{"py:module": "example", "py:class": "Class"})
+ assert_node(doctree[3][1][0][0][1][0][4], pending_xref,
+ refdomain="py", reftype="class", reftarget="str",
+ **{"py:module": "example", "py:class": "Class"})
+
+
+def test_info_field_list_Literal(app):
+ text = (".. py:module:: example\n"
+ ".. py:class:: Class\n"
+ "\n"
+ " :param age: blah blah\n"
+ " :type age: Literal['foo', 'bar', 'baz']\n")
+ doctree = restructuredtext.parse(app, text)
+
+ assert_node(doctree,
+ (addnodes.index,
+ addnodes.index,
+ nodes.target,
+ [desc, ([desc_signature, ([desc_annotation, ("class", desc_sig_space)],
+ [desc_addname, "example."],
+ [desc_name, "Class"])],
+ [desc_content, nodes.field_list, nodes.field, (nodes.field_name,
+ nodes.field_body)])]))
+ assert_node(doctree[3][1][0][0][1],
+ ([nodes.paragraph, ([addnodes.literal_strong, "age"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "Literal"],
+ [addnodes.literal_emphasis, "["],
+ [addnodes.literal_emphasis, "'foo'"],
+ [addnodes.literal_emphasis, ", "],
+ [addnodes.literal_emphasis, "'bar'"],
+ [addnodes.literal_emphasis, ", "],
+ [addnodes.literal_emphasis, "'baz'"],
+ [addnodes.literal_emphasis, "]"],
+ ")",
+ " -- ",
+ "blah blah")],))
+ assert_node(doctree[3][1][0][0][1][0][2], pending_xref,
+ refdomain="py", reftype="class", reftarget="Literal",
+ **{"py:module": "example", "py:class": "Class"})
+
+
+def test_info_field_list_var(app):
+ text = (".. py:class:: Class\n"
+ "\n"
+ " :var int attr: blah blah\n")
+ doctree = restructuredtext.parse(app, text)
+
+ assert_node(doctree, (addnodes.index,
+ [desc, (desc_signature,
+ [desc_content, nodes.field_list, nodes.field])]))
+ assert_node(doctree[1][1][0][0], ([nodes.field_name, "Variables"],
+ [nodes.field_body, nodes.paragraph]))
+
+ # :var int attr:
+ assert_node(doctree[1][1][0][0][1][0],
+ ([addnodes.literal_strong, "attr"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "int"],
+ ")",
+ " -- ",
+ "blah blah"))
+ assert_node(doctree[1][1][0][0][1][0][2], pending_xref,
+ refdomain="py", reftype="class", reftarget="int", **{"py:class": "Class"})
+
+
+def test_info_field_list_napoleon_deliminator_of(app):
+ text = (".. py:module:: example\n"
+ ".. py:class:: Class\n"
+ "\n"
+ " :param list_str_var: example description.\n"
+ " :type list_str_var: list of str\n"
+ " :param tuple_int_var: example description.\n"
+ " :type tuple_int_var: tuple of tuple of int\n"
+ )
+ doctree = restructuredtext.parse(app, text)
+
+ # :param list of str list_str_var:
+ assert_node(doctree[3][1][0][0][1][0][0][0],
+ ([addnodes.literal_strong, "list_str_var"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "list"],
+ [addnodes.literal_emphasis, " of "],
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ ")",
+ " -- ",
+ "example description."))
+
+ # :param tuple of tuple of int tuple_int_var:
+ assert_node(doctree[3][1][0][0][1][0][1][0],
+ ([addnodes.literal_strong, "tuple_int_var"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "tuple"],
+ [addnodes.literal_emphasis, " of "],
+ [pending_xref, addnodes.literal_emphasis, "tuple"],
+ [addnodes.literal_emphasis, " of "],
+ [pending_xref, addnodes.literal_emphasis, "int"],
+ ")",
+ " -- ",
+ "example description."))
+
+
+def test_info_field_list_napoleon_deliminator_or(app):
+ text = (".. py:module:: example\n"
+ ".. py:class:: Class\n"
+ "\n"
+ " :param bool_str_var: example description.\n"
+ " :type bool_str_var: bool or str\n"
+ " :param str_float_int_var: example description.\n"
+ " :type str_float_int_var: str or float or int\n"
+ )
+ doctree = restructuredtext.parse(app, text)
+
+ # :param bool or str bool_str_var:
+ assert_node(doctree[3][1][0][0][1][0][0][0],
+ ([addnodes.literal_strong, "bool_str_var"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "bool"],
+ [addnodes.literal_emphasis, " or "],
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ ")",
+ " -- ",
+ "example description."))
+
+ # :param str or float or int str_float_int_var:
+ assert_node(doctree[3][1][0][0][1][0][1][0],
+ ([addnodes.literal_strong, "str_float_int_var"],
+ " (",
+ [pending_xref, addnodes.literal_emphasis, "str"],
+ [addnodes.literal_emphasis, " or "],
+ [pending_xref, addnodes.literal_emphasis, "float"],
+ [addnodes.literal_emphasis, " or "],
+ [pending_xref, addnodes.literal_emphasis, "int"],
+ ")",
+ " -- ",
+ "example description."))
+
+
+def test_type_field(app):
+ text = (".. py:data:: var1\n"
+ " :type: .int\n"
+ ".. py:data:: var2\n"
+ " :type: ~builtins.int\n"
+ ".. py:data:: var3\n"
+ " :type: typing.Optional[typing.Tuple[int, typing.Any]]\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "var1"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "int"])])],
+ [desc_content, ()])],
+ addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "var2"],
+ [desc_annotation, ([desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [pending_xref, "int"])])],
+ [desc_content, ()])],
+ addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "var3"],
+ [desc_annotation, ([desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [pending_xref, "Optional"],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "Tuple"],
+ [desc_sig_punctuation, "["],
+ [pending_xref, "int"],
+ [desc_sig_punctuation, ","],
+ desc_sig_space,
+ [pending_xref, "Any"],
+ [desc_sig_punctuation, "]"],
+ [desc_sig_punctuation, "]"])])],
+ [desc_content, ()])]))
+ assert_node(doctree[1][0][1][2], pending_xref, reftarget='int', refspecific=True)
+ assert_node(doctree[3][0][1][2], pending_xref, reftarget='builtins.int', refspecific=False)
+ assert_node(doctree[5][0][1][2], pending_xref, reftarget='typing.Optional', refspecific=False)
+ assert_node(doctree[5][0][1][4], pending_xref, reftarget='typing.Tuple', refspecific=False)
+ assert_node(doctree[5][0][1][6], pending_xref, reftarget='int', refspecific=False)
+ assert_node(doctree[5][0][1][9], pending_xref, reftarget='typing.Any', refspecific=False)
+
+
+@pytest.mark.sphinx(freshenv=True)
+def test_module_index(app):
+ text = (".. py:module:: docutils\n"
+ ".. py:module:: sphinx\n"
+ ".. py:module:: sphinx.config\n"
+ ".. py:module:: sphinx.builders\n"
+ ".. py:module:: sphinx.builders.html\n"
+ ".. py:module:: sphinx_intl\n")
+ restructuredtext.parse(app, text)
+ index = PythonModuleIndex(app.env.get_domain('py'))
+ assert index.generate() == (
+ [('d', [IndexEntry('docutils', 0, 'index', 'module-docutils', '', '', '')]),
+ ('s', [IndexEntry('sphinx', 1, 'index', 'module-sphinx', '', '', ''),
+ IndexEntry('sphinx.builders', 2, 'index', 'module-sphinx.builders', '', '', ''),
+ IndexEntry('sphinx.builders.html', 2, 'index', 'module-sphinx.builders.html', '', '', ''),
+ IndexEntry('sphinx.config', 2, 'index', 'module-sphinx.config', '', '', ''),
+ IndexEntry('sphinx_intl', 0, 'index', 'module-sphinx_intl', '', '', '')])],
+ False,
+ )
+
+
+@pytest.mark.sphinx(freshenv=True)
+def test_module_index_submodule(app):
+ text = ".. py:module:: sphinx.config\n"
+ restructuredtext.parse(app, text)
+ index = PythonModuleIndex(app.env.get_domain('py'))
+ assert index.generate() == (
+ [('s', [IndexEntry('sphinx', 1, '', '', '', '', ''),
+ IndexEntry('sphinx.config', 2, 'index', 'module-sphinx.config', '', '', '')])],
+ False,
+ )
+
+
+@pytest.mark.sphinx(freshenv=True)
+def test_module_index_not_collapsed(app):
+ text = (".. py:module:: docutils\n"
+ ".. py:module:: sphinx\n")
+ restructuredtext.parse(app, text)
+ index = PythonModuleIndex(app.env.get_domain('py'))
+ assert index.generate() == (
+ [('d', [IndexEntry('docutils', 0, 'index', 'module-docutils', '', '', '')]),
+ ('s', [IndexEntry('sphinx', 0, 'index', 'module-sphinx', '', '', '')])],
+ True,
+ )
+
+
+@pytest.mark.sphinx(freshenv=True, confoverrides={'modindex_common_prefix': ['sphinx.']})
+def test_modindex_common_prefix(app):
+ text = (".. py:module:: docutils\n"
+ ".. py:module:: sphinx\n"
+ ".. py:module:: sphinx.config\n"
+ ".. py:module:: sphinx.builders\n"
+ ".. py:module:: sphinx.builders.html\n"
+ ".. py:module:: sphinx_intl\n")
+ restructuredtext.parse(app, text)
+ index = PythonModuleIndex(app.env.get_domain('py'))
+ assert index.generate() == (
+ [('b', [IndexEntry('sphinx.builders', 1, 'index', 'module-sphinx.builders', '', '', ''),
+ IndexEntry('sphinx.builders.html', 2, 'index', 'module-sphinx.builders.html', '', '', '')]),
+ ('c', [IndexEntry('sphinx.config', 0, 'index', 'module-sphinx.config', '', '', '')]),
+ ('d', [IndexEntry('docutils', 0, 'index', 'module-docutils', '', '', '')]),
+ ('s', [IndexEntry('sphinx', 0, 'index', 'module-sphinx', '', '', ''),
+ IndexEntry('sphinx_intl', 0, 'index', 'module-sphinx_intl', '', '', '')])],
+ True,
+ )
+
+
+def test_no_index_entry(app):
+ text = (".. py:function:: f()\n"
+ ".. py:function:: g()\n"
+ " :no-index-entry:\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, desc, addnodes.index, desc))
+ assert_node(doctree[0], addnodes.index, entries=[('pair', 'built-in function; f()', 'f', '', None)])
+ assert_node(doctree[2], addnodes.index, entries=[])
+
+ text = (".. py:class:: f\n"
+ ".. py:class:: g\n"
+ " :no-index-entry:\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index, desc, addnodes.index, desc))
+ assert_node(doctree[0], addnodes.index, entries=[('single', 'f (built-in class)', 'f', '', None)])
+ assert_node(doctree[2], addnodes.index, entries=[])
+
+
+@pytest.mark.sphinx('html', testroot='domain-py-python_use_unqualified_type_names')
+def test_python_python_use_unqualified_type_names(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<span class="n"><a class="reference internal" href="#foo.Name" title="foo.Name">'
+ '<span class="pre">Name</span></a></span>' in content)
+ assert '<span class="n"><span class="pre">foo.Age</span></span>' in content
+ assert ('<p><strong>name</strong> (<a class="reference internal" href="#foo.Name" '
+ 'title="foo.Name"><em>Name</em></a>) – blah blah</p>' in content)
+ assert '<p><strong>age</strong> (<em>foo.Age</em>) – blah blah</p>' in content
+
+
+@pytest.mark.sphinx('html', testroot='domain-py-python_use_unqualified_type_names',
+ confoverrides={'python_use_unqualified_type_names': False})
+def test_python_python_use_unqualified_type_names_disabled(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<span class="n"><a class="reference internal" href="#foo.Name" title="foo.Name">'
+ '<span class="pre">foo.Name</span></a></span>' in content)
+ assert '<span class="n"><span class="pre">foo.Age</span></span>' in content
+ assert ('<p><strong>name</strong> (<a class="reference internal" href="#foo.Name" '
+ 'title="foo.Name"><em>foo.Name</em></a>) – blah blah</p>' in content)
+ assert '<p><strong>age</strong> (<em>foo.Age</em>) – blah blah</p>' in content
+
+
+@pytest.mark.sphinx('dummy', testroot='domain-py-xref-warning')
+def test_warn_missing_reference(app, status, warning):
+ app.build()
+ assert "index.rst:6: WARNING: undefined label: 'no-label'" in warning.getvalue()
+ assert ("index.rst:6: WARNING: Failed to create a cross reference. "
+ "A title or caption not found: 'existing-label'") in warning.getvalue()
+
+
+@pytest.mark.sphinx(confoverrides={'nitpicky': True})
+@pytest.mark.parametrize('include_options', [True, False])
+def test_signature_line_number(app, include_options):
+ text = (".. py:function:: foo(bar : string)\n" +
+ (" :no-index-entry:\n" if include_options else ""))
+ doc = restructuredtext.parse(app, text)
+ xrefs = list(doc.findall(condition=addnodes.pending_xref))
+ assert len(xrefs) == 1
+ source, line = docutils.utils.get_source_line(xrefs[0])
+ assert 'index.rst' in source
+ assert line == 1
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'python_maximum_signature_line_length': len("hello(name: str) -> str"),
+})
+def test_pyfunction_signature_with_python_maximum_signature_line_length_equal(app):
+ text = ".. py:function:: hello(name: str) -> str"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1], [desc_parameterlist, desc_parameter, (
+ [desc_sig_name, "name"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"],
+ )])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'python_maximum_signature_line_length': len("hello(name: str) -> str"),
+})
+def test_pyfunction_signature_with_python_maximum_signature_line_length_force_single(app):
+ text = (".. py:function:: hello(names: str) -> str\n"
+ " :single-line-parameter-list:")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1], [desc_parameterlist, desc_parameter, (
+ [desc_sig_name, "names"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"],
+ )])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'python_maximum_signature_line_length': len("hello(name: str) -> str"),
+})
+def test_pyfunction_signature_with_python_maximum_signature_line_length_break(app):
+ text = ".. py:function:: hello(names: str) -> str"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1], [desc_parameterlist, desc_parameter, (
+ [desc_sig_name, "names"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"],
+ )])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("hello(name: str) -> str"),
+})
+def test_pyfunction_signature_with_maximum_signature_line_length_equal(app):
+ text = ".. py:function:: hello(name: str) -> str"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1], [desc_parameterlist, desc_parameter, (
+ [desc_sig_name, "name"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"],
+ )])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("hello(name: str) -> str"),
+})
+def test_pyfunction_signature_with_maximum_signature_line_length_force_single(app):
+ text = (".. py:function:: hello(names: str) -> str\n"
+ " :single-line-parameter-list:")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1], [desc_parameterlist, desc_parameter, (
+ [desc_sig_name, "names"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"],
+ )])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx('html', confoverrides={
+ 'maximum_signature_line_length': len("hello(name: str) -> str"),
+})
+def test_pyfunction_signature_with_maximum_signature_line_length_break(app):
+ text = ".. py:function:: hello(names: str) -> str"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"],
+ )],
+ desc_content,
+ )],
+ ))
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ assert_node(doctree[1][0][1], [desc_parameterlist, desc_parameter, (
+ [desc_sig_name, "names"],
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"],
+ )])
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=True)
+
+
+@pytest.mark.sphinx(
+ 'html',
+ confoverrides={
+ 'python_maximum_signature_line_length': len("hello(name: str) -> str"),
+ 'maximum_signature_line_length': 1,
+ },
+)
+def test_python_maximum_signature_line_length_overrides_global(app):
+ text = ".. py:function:: hello(name: str) -> str"
+ doctree = restructuredtext.parse(app, text)
+ expected_doctree = (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "hello"],
+ desc_parameterlist,
+ [desc_returns, pending_xref, "str"])],
+ desc_content)])
+ assert_node(doctree, expected_doctree)
+ assert_node(doctree[1], addnodes.desc, desctype="function",
+ domain="py", objtype="function", no_index=False)
+ signame_node = [desc_sig_name, "name"]
+ expected_sig = [desc_parameterlist, desc_parameter, (signame_node,
+ [desc_sig_punctuation, ":"],
+ desc_sig_space,
+ [nodes.inline, pending_xref, "str"])]
+ assert_node(doctree[1][0][1], expected_sig)
+ assert_node(doctree[1][0][1], desc_parameterlist, multi_line_parameter_list=False)
+
+
+@pytest.mark.sphinx(
+ 'html', testroot='domain-py-python_maximum_signature_line_length',
+)
+def test_domain_py_python_maximum_signature_line_length_in_html(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ expected_parameter_list_hello = """\
+
+<dl>
+<dd>\
+<em class="sig-param">\
+<span class="n"><span class="pre">name</span></span>\
+<span class="p"><span class="pre">:</span></span>\
+<span class="w"> </span>\
+<span class="n"><span class="pre">str</span></span>\
+</em>,\
+</dd>
+</dl>
+
+<span class="sig-paren">)</span> \
+<span class="sig-return">\
+<span class="sig-return-icon">&#x2192;</span> \
+<span class="sig-return-typehint"><span class="pre">str</span></span>\
+</span>\
+<a class="headerlink" href="#hello" title="Link to this definition">¶</a>\
+</dt>\
+"""
+ assert expected_parameter_list_hello in content
+
+ param_line_fmt = '<dd>{}</dd>\n'
+ param_name_fmt = (
+ '<em class="sig-param"><span class="n"><span class="pre">{}</span></span></em>'
+ )
+ optional_fmt = '<span class="optional">{}</span>'
+
+ expected_a = param_line_fmt.format(
+ optional_fmt.format("[") + param_name_fmt.format("a") + "," + optional_fmt.format("["),
+ )
+ assert expected_a in content
+
+ expected_b = param_line_fmt.format(
+ param_name_fmt.format("b") + "," + optional_fmt.format("]") + optional_fmt.format("]"),
+ )
+ assert expected_b in content
+
+ expected_c = param_line_fmt.format(param_name_fmt.format("c") + ",")
+ assert expected_c in content
+
+ expected_d = param_line_fmt.format(param_name_fmt.format("d") + optional_fmt.format("[") + ",")
+ assert expected_d in content
+
+ expected_e = param_line_fmt.format(param_name_fmt.format("e") + ",")
+ assert expected_e in content
+
+ expected_f = param_line_fmt.format(param_name_fmt.format("f") + "," + optional_fmt.format("]"))
+ assert expected_f in content
+
+ expected_parameter_list_foo = """\
+
+<dl>
+{}{}{}{}{}{}</dl>
+
+<span class="sig-paren">)</span>\
+<a class="headerlink" href="#foo" title="Link to this definition">¶</a>\
+</dt>\
+""".format(expected_a, expected_b, expected_c, expected_d, expected_e, expected_f)
+ assert expected_parameter_list_foo in content
+
+
+@pytest.mark.sphinx(
+ 'text', testroot='domain-py-python_maximum_signature_line_length',
+)
+def test_domain_py_python_maximum_signature_line_length_in_text(app, status, warning):
+ app.build()
+ content = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ param_line_fmt = STDINDENT * " " + "{}\n"
+
+ expected_parameter_list_hello = "(\n{}) -> str".format(param_line_fmt.format("name: str,"))
+
+ assert expected_parameter_list_hello in content
+
+ expected_a = param_line_fmt.format("[a,[")
+ assert expected_a in content
+
+ expected_b = param_line_fmt.format("b,]]")
+ assert expected_b in content
+
+ expected_c = param_line_fmt.format("c,")
+ assert expected_c in content
+
+ expected_d = param_line_fmt.format("d[,")
+ assert expected_d in content
+
+ expected_e = param_line_fmt.format("e,")
+ assert expected_e in content
+
+ expected_f = param_line_fmt.format("f,]")
+ assert expected_f in content
+
+ expected_parameter_list_foo = "(\n{}{}{}{}{}{})".format(
+ expected_a, expected_b, expected_c, expected_d, expected_e, expected_f,
+ )
+ assert expected_parameter_list_foo in content
+
+
+def test_module_content_line_number(app):
+ text = (".. py:module:: foo\n" +
+ "\n" +
+ " Some link here: :ref:`abc`\n")
+ doc = restructuredtext.parse(app, text)
+ xrefs = list(doc.findall(condition=addnodes.pending_xref))
+ assert len(xrefs) == 1
+ source, line = docutils.utils.get_source_line(xrefs[0])
+ assert 'index.rst' in source
+ assert line == 3
+
+
+@pytest.mark.sphinx(freshenv=True, confoverrides={'python_display_short_literal_types': True})
+def test_short_literal_types(app):
+ text = """\
+.. py:function:: literal_ints(x: Literal[1, 2, 3] = 1) -> None
+.. py:function:: literal_union(x: Union[Literal["a"], Literal["b"], Literal["c"]]) -> None
+"""
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, 'literal_ints'],
+ [desc_parameterlist, (
+ [desc_parameter, (
+ [desc_sig_name, 'x'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, (
+ [desc_sig_literal_number, '1'],
+ desc_sig_space,
+ [desc_sig_punctuation, '|'],
+ desc_sig_space,
+ [desc_sig_literal_number, '2'],
+ desc_sig_space,
+ [desc_sig_punctuation, '|'],
+ desc_sig_space,
+ [desc_sig_literal_number, '3'],
+ )],
+ desc_sig_space,
+ [desc_sig_operator, '='],
+ desc_sig_space,
+ [nodes.inline, '1'],
+ )],
+ )],
+ [desc_returns, pending_xref, 'None'],
+ )],
+ [desc_content, ()],
+ )],
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, 'literal_union'],
+ [desc_parameterlist, (
+ [desc_parameter, (
+ [desc_sig_name, 'x'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, (
+ [desc_sig_literal_string, "'a'"],
+ desc_sig_space,
+ [desc_sig_punctuation, '|'],
+ desc_sig_space,
+ [desc_sig_literal_string, "'b'"],
+ desc_sig_space,
+ [desc_sig_punctuation, '|'],
+ desc_sig_space,
+ [desc_sig_literal_string, "'c'"],
+ )],
+ )],
+ )],
+ [desc_returns, pending_xref, 'None'],
+ )],
+ [desc_content, ()],
+ )],
+ ))
+
+
+def test_function_pep_695(app):
+ text = """.. py:function:: func[\
+ S,\
+ T: int,\
+ U: (int, str),\
+ R: int | int,\
+ A: int | Annotated[int, ctype("char")],\
+ *V,\
+ **P\
+ ]
+ """
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_name, 'func'],
+ [desc_type_parameter_list, (
+ [desc_type_parameter, ([desc_sig_name, 'S'])],
+ [desc_type_parameter, (
+ [desc_sig_name, 'T'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, ([pending_xref, 'int'])],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_name, 'U'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_punctuation, '('],
+ [desc_sig_name, (
+ [pending_xref, 'int'],
+ [desc_sig_punctuation, ','],
+ desc_sig_space,
+ [pending_xref, 'str'],
+ )],
+ [desc_sig_punctuation, ')'],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_name, 'R'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, (
+ [pending_xref, 'int'],
+ desc_sig_space,
+ [desc_sig_punctuation, '|'],
+ desc_sig_space,
+ [pending_xref, 'int'],
+ )],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_name, 'A'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, ([pending_xref, 'int | Annotated[int, ctype("char")]'])],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_operator, '*'],
+ [desc_sig_name, 'V'],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_operator, '**'],
+ [desc_sig_name, 'P'],
+ )],
+ )],
+ [desc_parameterlist, ()],
+ )],
+ [desc_content, ()],
+ )],
+ ))
+
+
+def test_class_def_pep_695(app):
+ # Non-concrete unbound generics are allowed at runtime but type checkers
+ # should fail (https://peps.python.org/pep-0695/#type-parameter-scopes)
+ text = """.. py:class:: Class[S: Sequence[T], T, KT, VT](Dict[KT, VT])"""
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_annotation, ('class', desc_sig_space)],
+ [desc_name, 'Class'],
+ [desc_type_parameter_list, (
+ [desc_type_parameter, (
+ [desc_sig_name, 'S'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, (
+ [pending_xref, 'Sequence'],
+ [desc_sig_punctuation, '['],
+ [pending_xref, 'T'],
+ [desc_sig_punctuation, ']'],
+ )],
+ )],
+ [desc_type_parameter, ([desc_sig_name, 'T'])],
+ [desc_type_parameter, ([desc_sig_name, 'KT'])],
+ [desc_type_parameter, ([desc_sig_name, 'VT'])],
+ )],
+ [desc_parameterlist, ([desc_parameter, 'Dict[KT, VT]'])],
+ )],
+ [desc_content, ()],
+ )],
+ ))
+
+
+def test_class_def_pep_696(app):
+ # test default values for type variables without using PEP 696 AST parser
+ text = """.. py:class:: Class[\
+ T, KT, VT,\
+ J: int,\
+ K = list,\
+ S: str = str,\
+ L: (T, tuple[T, ...], collections.abc.Iterable[T]) = set[T],\
+ Q: collections.abc.Mapping[KT, VT] = dict[KT, VT],\
+ *V = *tuple[*Ts, bool],\
+ **P = [int, Annotated[int, ValueRange(3, 10), ctype("char")]]\
+ ](Other[T, KT, VT, J, S, L, Q, *V, **P])
+ """
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ addnodes.index,
+ [desc, (
+ [desc_signature, (
+ [desc_annotation, ('class', desc_sig_space)],
+ [desc_name, 'Class'],
+ [desc_type_parameter_list, (
+ [desc_type_parameter, ([desc_sig_name, 'T'])],
+ [desc_type_parameter, ([desc_sig_name, 'KT'])],
+ [desc_type_parameter, ([desc_sig_name, 'VT'])],
+ # J: int
+ [desc_type_parameter, (
+ [desc_sig_name, 'J'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, ([pending_xref, 'int'])],
+ )],
+ # K = list
+ [desc_type_parameter, (
+ [desc_sig_name, 'K'],
+ desc_sig_space,
+ [desc_sig_operator, '='],
+ desc_sig_space,
+ [nodes.inline, 'list'],
+ )],
+ # S: str = str
+ [desc_type_parameter, (
+ [desc_sig_name, 'S'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, ([pending_xref, 'str'])],
+ desc_sig_space,
+ [desc_sig_operator, '='],
+ desc_sig_space,
+ [nodes.inline, 'str'],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_name, 'L'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_punctuation, '('],
+ [desc_sig_name, (
+ # T
+ [pending_xref, 'T'],
+ [desc_sig_punctuation, ','],
+ desc_sig_space,
+ # tuple[T, ...]
+ [pending_xref, 'tuple'],
+ [desc_sig_punctuation, '['],
+ [pending_xref, 'T'],
+ [desc_sig_punctuation, ','],
+ desc_sig_space,
+ [desc_sig_punctuation, '...'],
+ [desc_sig_punctuation, ']'],
+ [desc_sig_punctuation, ','],
+ desc_sig_space,
+ # collections.abc.Iterable[T]
+ [pending_xref, 'collections.abc.Iterable'],
+ [desc_sig_punctuation, '['],
+ [pending_xref, 'T'],
+ [desc_sig_punctuation, ']'],
+ )],
+ [desc_sig_punctuation, ')'],
+ desc_sig_space,
+ [desc_sig_operator, '='],
+ desc_sig_space,
+ [nodes.inline, 'set[T]'],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_name, 'Q'],
+ [desc_sig_punctuation, ':'],
+ desc_sig_space,
+ [desc_sig_name, (
+ [pending_xref, 'collections.abc.Mapping'],
+ [desc_sig_punctuation, '['],
+ [pending_xref, 'KT'],
+ [desc_sig_punctuation, ','],
+ desc_sig_space,
+ [pending_xref, 'VT'],
+ [desc_sig_punctuation, ']'],
+ )],
+ desc_sig_space,
+ [desc_sig_operator, '='],
+ desc_sig_space,
+ [nodes.inline, 'dict[KT, VT]'],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_operator, '*'],
+ [desc_sig_name, 'V'],
+ desc_sig_space,
+ [desc_sig_operator, '='],
+ desc_sig_space,
+ [nodes.inline, '*tuple[*Ts, bool]'],
+ )],
+ [desc_type_parameter, (
+ [desc_sig_operator, '**'],
+ [desc_sig_name, 'P'],
+ desc_sig_space,
+ [desc_sig_operator, '='],
+ desc_sig_space,
+ [nodes.inline, '[int, Annotated[int, ValueRange(3, 10), ctype("char")]]'],
+ )],
+ )],
+ [desc_parameterlist, (
+ [desc_parameter, 'Other[T, KT, VT, J, S, L, Q, *V, **P]'],
+ )],
+ )],
+ [desc_content, ()],
+ )],
+ ))
+
+
+@pytest.mark.parametrize(('tp_list', 'tptext'), [
+ ('[T:int]', '[T: int]'),
+ ('[T:*Ts]', '[T: *Ts]'),
+ ('[T:int|(*Ts)]', '[T: int | (*Ts)]'),
+ ('[T:(*Ts)|int]', '[T: (*Ts) | int]'),
+ ('[T:(int|(*Ts))]', '[T: (int | (*Ts))]'),
+ ('[T:((*Ts)|int)]', '[T: ((*Ts) | int)]'),
+ ('[T:Annotated[int,ctype("char")]]', '[T: Annotated[int, ctype("char")]]'),
+])
+def test_pep_695_and_pep_696_whitespaces_in_bound(app, tp_list, tptext):
+ text = f'.. py:function:: f{tp_list}()'
+ doctree = restructuredtext.parse(app, text)
+ assert doctree.astext() == f'\n\nf{tptext}()\n\n'
+
+
+@pytest.mark.parametrize(('tp_list', 'tptext'), [
+ ('[T:(int,str)]', '[T: (int, str)]'),
+ ('[T:(int|str,*Ts)]', '[T: (int | str, *Ts)]'),
+])
+def test_pep_695_and_pep_696_whitespaces_in_constraints(app, tp_list, tptext):
+ text = f'.. py:function:: f{tp_list}()'
+ doctree = restructuredtext.parse(app, text)
+ assert doctree.astext() == f'\n\nf{tptext}()\n\n'
+
+
+@pytest.mark.parametrize(('tp_list', 'tptext'), [
+ ('[T=int]', '[T = int]'),
+ ('[T:int=int]', '[T: int = int]'),
+ ('[*V=*Ts]', '[*V = *Ts]'),
+ ('[*V=(*Ts)]', '[*V = (*Ts)]'),
+ ('[*V=*tuple[str,...]]', '[*V = *tuple[str, ...]]'),
+ ('[*V=*tuple[*Ts,...]]', '[*V = *tuple[*Ts, ...]]'),
+ ('[*V=*tuple[int,*Ts]]', '[*V = *tuple[int, *Ts]]'),
+ ('[*V=*tuple[*Ts,int]]', '[*V = *tuple[*Ts, int]]'),
+ ('[**P=[int,*Ts]]', '[**P = [int, *Ts]]'),
+ ('[**P=[int, int*3]]', '[**P = [int, int * 3]]'),
+ ('[**P=[int, *Ts*3]]', '[**P = [int, *Ts * 3]]'),
+ ('[**P=[int,A[int,ctype("char")]]]', '[**P = [int, A[int, ctype("char")]]]'),
+])
+def test_pep_695_and_pep_696_whitespaces_in_default(app, tp_list, tptext):
+ text = f'.. py:function:: f{tp_list}()'
+ doctree = restructuredtext.parse(app, text)
+ assert doctree.astext() == f'\n\nf{tptext}()\n\n'
diff --git a/tests/test_domain_rst.py b/tests/test_domain_rst.py
new file mode 100644
index 0000000..4445da1
--- /dev/null
+++ b/tests/test_domain_rst.py
@@ -0,0 +1,137 @@
+"""Tests the reStructuredText domain."""
+
+from sphinx import addnodes
+from sphinx.addnodes import (
+ desc,
+ desc_addname,
+ desc_annotation,
+ desc_content,
+ desc_name,
+ desc_signature,
+)
+from sphinx.domains.rst import parse_directive
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+
+
+def test_parse_directive():
+ s = parse_directive(' foö ')
+ assert s == ('foö', '')
+
+ s = parse_directive(' .. foö :: ')
+ assert s == ('foö', '')
+
+ s = parse_directive('.. foö:: args1 args2')
+ assert s == ('foö', ' args1 args2')
+
+ s = parse_directive('.. :: bar')
+ assert s == ('.. :: bar', '')
+
+
+def test_rst_directive(app):
+ # bare
+ text = ".. rst:directive:: toctree"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, desc_name, ".. toctree::"],
+ [desc_content, ()])]))
+ assert_node(doctree[0],
+ entries=[("single", "toctree (directive)", "directive-toctree", "", None)])
+ assert_node(doctree[1], addnodes.desc, desctype="directive",
+ domain="rst", objtype="directive", no_index=False)
+
+ # decorated
+ text = ".. rst:directive:: .. toctree::"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, desc_name, ".. toctree::"],
+ [desc_content, ()])]))
+ assert_node(doctree[0],
+ entries=[("single", "toctree (directive)", "directive-toctree", "", None)])
+ assert_node(doctree[1], addnodes.desc, desctype="directive",
+ domain="rst", objtype="directive", no_index=False)
+
+
+def test_rst_directive_with_argument(app):
+ text = ".. rst:directive:: .. toctree:: foo bar baz"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, ".. toctree::"],
+ [desc_addname, " foo bar baz"])],
+ [desc_content, ()])]))
+ assert_node(doctree[0],
+ entries=[("single", "toctree (directive)", "directive-toctree", "", None)])
+ assert_node(doctree[1], addnodes.desc, desctype="directive",
+ domain="rst", objtype="directive", no_index=False)
+
+
+def test_rst_directive_option(app):
+ text = ".. rst:directive:option:: foo"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, desc_name, ":foo:"],
+ [desc_content, ()])]))
+ assert_node(doctree[0],
+ entries=[("single", ":foo: (directive option)",
+ "directive-option-foo", "", "F")])
+ assert_node(doctree[1], addnodes.desc, desctype="directive:option",
+ domain="rst", objtype="directive:option", no_index=False)
+
+
+def test_rst_directive_option_with_argument(app):
+ text = ".. rst:directive:option:: foo: bar baz"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, ":foo:"],
+ [desc_annotation, " bar baz"])],
+ [desc_content, ()])]))
+ assert_node(doctree[0],
+ entries=[("single", ":foo: (directive option)",
+ "directive-option-foo", "", "F")])
+ assert_node(doctree[1], addnodes.desc, desctype="directive:option",
+ domain="rst", objtype="directive:option", no_index=False)
+
+
+def test_rst_directive_option_type(app):
+ text = (".. rst:directive:option:: foo\n"
+ " :type: directives.flags\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, ":foo:"],
+ [desc_annotation, " (directives.flags)"])],
+ [desc_content, ()])]))
+ assert_node(doctree[0],
+ entries=[("single", ":foo: (directive option)",
+ "directive-option-foo", "", "F")])
+ assert_node(doctree[1], addnodes.desc, desctype="directive:option",
+ domain="rst", objtype="directive:option", no_index=False)
+
+
+def test_rst_directive_and_directive_option(app):
+ text = (".. rst:directive:: foo\n"
+ "\n"
+ " .. rst:directive:option:: bar\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, desc_name, ".. foo::"],
+ [desc_content, (addnodes.index,
+ desc)])]))
+ assert_node(doctree[1][1][0],
+ entries=[("pair", "foo (directive); :bar: (directive option)",
+ "directive-option-foo-bar", "", "B")])
+ assert_node(doctree[1][1][1], ([desc_signature, desc_name, ":bar:"],
+ [desc_content, ()]))
+ assert_node(doctree[1][1][1], addnodes.desc, desctype="directive:option",
+ domain="rst", objtype="directive:option", no_index=False)
+
+
+def test_rst_role(app):
+ text = ".. rst:role:: ref"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, desc_name, ":ref:"],
+ [desc_content, ()])]))
+ assert_node(doctree[0],
+ entries=[("single", "ref (role)", "role-ref", "", None)])
+ assert_node(doctree[1], addnodes.desc, desctype="role",
+ domain="rst", objtype="role", no_index=False)
diff --git a/tests/test_domain_std.py b/tests/test_domain_std.py
new file mode 100644
index 0000000..6d7ab53
--- /dev/null
+++ b/tests/test_domain_std.py
@@ -0,0 +1,495 @@
+"""Tests the std domain"""
+
+from unittest import mock
+
+import pytest
+from docutils import nodes
+from docutils.nodes import definition, definition_list, definition_list_item, term
+from html5lib import HTMLParser
+
+from sphinx import addnodes
+from sphinx.addnodes import (
+ desc,
+ desc_addname,
+ desc_content,
+ desc_name,
+ desc_signature,
+ glossary,
+ index,
+ pending_xref,
+)
+from sphinx.domains.std import StandardDomain
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+
+
+def test_process_doc_handle_figure_caption():
+ env = mock.Mock(domaindata={})
+ env.app.registry.enumerable_nodes = {}
+ figure_node = nodes.figure(
+ '',
+ nodes.caption('caption text', 'caption text'),
+ )
+ document = mock.Mock(
+ nametypes={'testname': True},
+ nameids={'testname': 'testid'},
+ ids={'testid': figure_node},
+ citation_refs={},
+ )
+ document.findall.return_value = []
+
+ domain = StandardDomain(env)
+ if 'testname' in domain.data['labels']:
+ del domain.data['labels']['testname']
+ domain.process_doc(env, 'testdoc', document)
+ assert 'testname' in domain.data['labels']
+ assert domain.data['labels']['testname'] == (
+ 'testdoc', 'testid', 'caption text')
+
+
+def test_process_doc_handle_table_title():
+ env = mock.Mock(domaindata={})
+ env.app.registry.enumerable_nodes = {}
+ table_node = nodes.table(
+ '',
+ nodes.title('title text', 'title text'),
+ )
+ document = mock.Mock(
+ nametypes={'testname': True},
+ nameids={'testname': 'testid'},
+ ids={'testid': table_node},
+ citation_refs={},
+ )
+ document.findall.return_value = []
+
+ domain = StandardDomain(env)
+ if 'testname' in domain.data['labels']:
+ del domain.data['labels']['testname']
+ domain.process_doc(env, 'testdoc', document)
+ assert 'testname' in domain.data['labels']
+ assert domain.data['labels']['testname'] == (
+ 'testdoc', 'testid', 'title text')
+
+
+def test_get_full_qualified_name():
+ env = mock.Mock(domaindata={})
+ env.app.registry.enumerable_nodes = {}
+ domain = StandardDomain(env)
+
+ # normal references
+ node = nodes.reference()
+ assert domain.get_full_qualified_name(node) is None
+
+ # simple reference to options
+ node = nodes.reference(reftype='option', reftarget='-l')
+ assert domain.get_full_qualified_name(node) is None
+
+ # options with std:program context
+ kwargs = {'std:program': 'ls'}
+ node = nodes.reference(reftype='option', reftarget='-l', **kwargs)
+ assert domain.get_full_qualified_name(node) == 'ls.-l'
+
+
+def test_cmd_option_with_optional_value(app):
+ text = ".. option:: -j[=N]"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (index,
+ [desc, ([desc_signature, ([desc_name, '-j'],
+ [desc_addname, '[=N]'])],
+ [desc_content, ()])]))
+ assert_node(doctree[0], addnodes.index,
+ entries=[('pair', 'command line option; -j', 'cmdoption-j', '', None)])
+
+ objects = list(app.env.get_domain("std").get_objects())
+ assert ('-j', '-j', 'cmdoption', 'index', 'cmdoption-j', 1) in objects
+
+
+def test_cmd_option_starting_with_bracket(app):
+ text = ".. option:: [enable=]PATTERN"
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (index,
+ [desc, ([desc_signature, ([desc_name, '[enable'],
+ [desc_addname, '=]PATTERN'])],
+ [desc_content, ()])]))
+ objects = list(app.env.get_domain("std").get_objects())
+ assert ('[enable', '[enable', 'cmdoption', 'index', 'cmdoption-arg-enable', 1) in objects
+
+
+def test_glossary(app):
+ text = (".. glossary::\n"
+ "\n"
+ " term1\n"
+ " TERM2\n"
+ " description\n"
+ "\n"
+ " term3 : classifier\n"
+ " description\n"
+ " description\n"
+ "\n"
+ " term4 : class1 : class2\n"
+ " description\n")
+
+ # doctree
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ [glossary, definition_list, ([definition_list_item, ([term, ("term1",
+ index)],
+ [term, ("TERM2",
+ index)],
+ definition)],
+ [definition_list_item, ([term, ("term3",
+ index)],
+ definition)],
+ [definition_list_item, ([term, ("term4",
+ index)],
+ definition)])],
+ ))
+ assert_node(doctree[0][0][0][0][1],
+ entries=[("single", "term1", "term-term1", "main", None)])
+ assert_node(doctree[0][0][0][1][1],
+ entries=[("single", "TERM2", "term-TERM2", "main", None)])
+ assert_node(doctree[0][0][0][2],
+ [definition, nodes.paragraph, "description"])
+ assert_node(doctree[0][0][1][0][1],
+ entries=[("single", "term3", "term-term3", "main", "classifier")])
+ assert_node(doctree[0][0][1][1],
+ [definition, nodes.paragraph, ("description\n"
+ "description")])
+ assert_node(doctree[0][0][2][0][1],
+ entries=[("single", "term4", "term-term4", "main", "class1")])
+ assert_node(doctree[0][0][2][1],
+ [nodes.definition, nodes.paragraph, "description"])
+
+ # index
+ domain = app.env.get_domain("std")
+ objects = list(domain.get_objects())
+ assert ("term1", "term1", "term", "index", "term-term1", -1) in objects
+ assert ("TERM2", "TERM2", "term", "index", "term-TERM2", -1) in objects
+ assert ("term3", "term3", "term", "index", "term-term3", -1) in objects
+ assert ("term4", "term4", "term", "index", "term-term4", -1) in objects
+
+ # term reference (case sensitive)
+ refnode = domain.resolve_xref(app.env, 'index', app.builder, 'term', 'term1',
+ pending_xref(), nodes.paragraph())
+ assert_node(refnode, nodes.reference, refid="term-term1")
+
+ # term reference (case insensitive)
+ refnode = domain.resolve_xref(app.env, 'index', app.builder, 'term', 'term2',
+ pending_xref(), nodes.paragraph())
+ assert_node(refnode, nodes.reference, refid="term-TERM2")
+
+
+def test_glossary_warning(app, status, warning):
+ # empty line between terms
+ text = (".. glossary::\n"
+ "\n"
+ " term1\n"
+ "\n"
+ " term2\n")
+ restructuredtext.parse(app, text, "case1")
+ assert ("case1.rst:4: WARNING: glossary terms must not be separated by empty lines"
+ in warning.getvalue())
+
+ # glossary starts with indented item
+ text = (".. glossary::\n"
+ "\n"
+ " description\n"
+ " term\n")
+ restructuredtext.parse(app, text, "case2")
+ assert ("case2.rst:3: WARNING: glossary term must be preceded by empty line"
+ in warning.getvalue())
+
+ # empty line between terms
+ text = (".. glossary::\n"
+ "\n"
+ " term1\n"
+ " description\n"
+ " term2\n")
+ restructuredtext.parse(app, text, "case3")
+ assert ("case3.rst:4: WARNING: glossary term must be preceded by empty line"
+ in warning.getvalue())
+
+ # duplicated terms
+ text = (".. glossary::\n"
+ "\n"
+ " term-case4\n"
+ " term-case4\n")
+ restructuredtext.parse(app, text, "case4")
+ assert ("case4.rst:3: WARNING: duplicate term description of term-case4, "
+ "other instance in case4" in warning.getvalue())
+
+
+def test_glossary_comment(app):
+ text = (".. glossary::\n"
+ "\n"
+ " term1\n"
+ " description\n"
+ " .. term2\n"
+ " description\n"
+ " description\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ [glossary, definition_list, definition_list_item, ([term, ("term1",
+ index)],
+ definition)],
+ ))
+ assert_node(doctree[0][0][0][1],
+ [nodes.definition, nodes.paragraph, "description"])
+
+
+def test_glossary_comment2(app):
+ text = (".. glossary::\n"
+ "\n"
+ " term1\n"
+ " description\n"
+ "\n"
+ " .. term2\n"
+ " term3\n"
+ " description\n"
+ " description\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ [glossary, definition_list, ([definition_list_item, ([term, ("term1",
+ index)],
+ definition)],
+ [definition_list_item, ([term, ("term3",
+ index)],
+ definition)])],
+ ))
+ assert_node(doctree[0][0][0][1],
+ [nodes.definition, nodes.paragraph, "description"])
+ assert_node(doctree[0][0][1][1],
+ [nodes.definition, nodes.paragraph, ("description\n"
+ "description")])
+
+
+def test_glossary_sorted(app):
+ text = (".. glossary::\n"
+ " :sorted:\n"
+ "\n"
+ " term3\n"
+ " description\n"
+ "\n"
+ " term2\n"
+ " term1\n"
+ " description\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (
+ [glossary, definition_list, ([definition_list_item, ([term, ("term2",
+ index)],
+ [term, ("term1",
+ index)],
+ definition)],
+ [definition_list_item, ([term, ("term3",
+ index)],
+ definition)])],
+ ))
+ assert_node(doctree[0][0][0][2],
+ [nodes.definition, nodes.paragraph, "description"])
+ assert_node(doctree[0][0][1][1],
+ [nodes.definition, nodes.paragraph, "description"])
+
+
+def test_glossary_alphanumeric(app):
+ text = (".. glossary::\n"
+ "\n"
+ " 1\n"
+ " /\n")
+ restructuredtext.parse(app, text)
+ objects = list(app.env.get_domain("std").get_objects())
+ assert ("1", "1", "term", "index", "term-1", -1) in objects
+ assert ("/", "/", "term", "index", "term-0", -1) in objects
+
+
+def test_glossary_conflicted_labels(app):
+ text = (".. _term-foo:\n"
+ ".. glossary::\n"
+ "\n"
+ " foo\n")
+ restructuredtext.parse(app, text)
+ objects = list(app.env.get_domain("std").get_objects())
+ assert ("foo", "foo", "term", "index", "term-0", -1) in objects
+
+
+def test_cmdoption(app):
+ text = (".. program:: ls\n"
+ "\n"
+ ".. option:: -l\n")
+ domain = app.env.get_domain('std')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "-l"],
+ [desc_addname, ()])],
+ [desc_content, ()])]))
+ assert_node(doctree[0], addnodes.index,
+ entries=[('pair', 'ls command line option; -l', 'cmdoption-ls-l', '', None)])
+ assert ('ls', '-l') in domain.progoptions
+ assert domain.progoptions[('ls', '-l')] == ('index', 'cmdoption-ls-l')
+
+
+def test_cmdoption_for_None(app):
+ text = (".. program:: ls\n"
+ ".. program:: None\n"
+ "\n"
+ ".. option:: -l\n")
+ domain = app.env.get_domain('std')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "-l"],
+ [desc_addname, ()])],
+ [desc_content, ()])]))
+ assert_node(doctree[0], addnodes.index,
+ entries=[('pair', 'command line option; -l', 'cmdoption-l', '', None)])
+ assert (None, '-l') in domain.progoptions
+ assert domain.progoptions[(None, '-l')] == ('index', 'cmdoption-l')
+
+
+def test_multiple_cmdoptions(app):
+ text = (".. program:: cmd\n"
+ "\n"
+ ".. option:: -o directory, --output directory\n")
+ domain = app.env.get_domain('std')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ [desc, ([desc_signature, ([desc_name, "-o"],
+ [desc_addname, " directory"],
+ [desc_addname, ", "],
+ [desc_name, "--output"],
+ [desc_addname, " directory"])],
+ [desc_content, ()])]))
+ assert_node(doctree[0], addnodes.index,
+ entries=[('pair', 'cmd command line option; -o', 'cmdoption-cmd-o', '', None),
+ ('pair', 'cmd command line option; --output', 'cmdoption-cmd-o', '', None)])
+ assert ('cmd', '-o') in domain.progoptions
+ assert ('cmd', '--output') in domain.progoptions
+ assert domain.progoptions[('cmd', '-o')] == ('index', 'cmdoption-cmd-o')
+ assert domain.progoptions[('cmd', '--output')] == ('index', 'cmdoption-cmd-o')
+
+
+@pytest.mark.sphinx(testroot='productionlist')
+def test_productionlist(app, status, warning):
+ app.builder.build_all()
+
+ warnings = warning.getvalue().split("\n")
+ assert len(warnings) == 2
+ assert warnings[-1] == ''
+ assert "Dup2.rst:4: WARNING: duplicate token description of Dup, other instance in Dup1" in warnings[0]
+
+ with (app.outdir / 'index.html').open('rb') as f:
+ etree = HTMLParser(namespaceHTMLElements=False).parse(f)
+ ul = list(etree.iter('ul'))[1]
+ cases = []
+ for li in list(ul):
+ assert len(list(li)) == 1
+ p = list(li)[0]
+ assert p.tag == 'p'
+ text = str(p.text).strip(' :')
+ assert len(list(p)) == 1
+ a = list(p)[0]
+ assert a.tag == 'a'
+ link = a.get('href')
+ assert len(list(a)) == 1
+ code = list(a)[0]
+ assert code.tag == 'code'
+ assert len(list(code)) == 1
+ span = list(code)[0]
+ assert span.tag == 'span'
+ linkText = span.text.strip()
+ cases.append((text, link, linkText))
+ assert cases == [
+ ('A', 'Bare.html#grammar-token-A', 'A'),
+ ('B', 'Bare.html#grammar-token-B', 'B'),
+ ('P1:A', 'P1.html#grammar-token-P1-A', 'P1:A'),
+ ('P1:B', 'P1.html#grammar-token-P1-B', 'P1:B'),
+ ('P2:A', 'P1.html#grammar-token-P1-A', 'P1:A'),
+ ('P2:B', 'P2.html#grammar-token-P2-B', 'P2:B'),
+ ('Explicit title A, plain', 'Bare.html#grammar-token-A', 'MyTitle'),
+ ('Explicit title A, colon', 'Bare.html#grammar-token-A', 'My:Title'),
+ ('Explicit title P1:A, plain', 'P1.html#grammar-token-P1-A', 'MyTitle'),
+ ('Explicit title P1:A, colon', 'P1.html#grammar-token-P1-A', 'My:Title'),
+ ('Tilde A', 'Bare.html#grammar-token-A', 'A'),
+ ('Tilde P1:A', 'P1.html#grammar-token-P1-A', 'A'),
+ ('Tilde explicit title P1:A', 'P1.html#grammar-token-P1-A', '~MyTitle'),
+ ('Tilde, explicit title P1:A', 'P1.html#grammar-token-P1-A', 'MyTitle'),
+ ('Dup', 'Dup2.html#grammar-token-Dup', 'Dup'),
+ ('FirstLine', 'firstLineRule.html#grammar-token-FirstLine', 'FirstLine'),
+ ('SecondLine', 'firstLineRule.html#grammar-token-SecondLine', 'SecondLine'),
+ ]
+
+ text = (app.outdir / 'LineContinuation.html').read_text(encoding='utf8')
+ assert "A</strong> ::= B C D E F G" in text
+
+
+def test_productionlist2(app):
+ text = (".. productionlist:: P2\n"
+ " A: `:A` `A`\n"
+ " B: `P1:B` `~P1:B`\n")
+ doctree = restructuredtext.parse(app, text)
+ refnodes = list(doctree.findall(pending_xref))
+ assert_node(refnodes[0], pending_xref, reftarget="A")
+ assert_node(refnodes[1], pending_xref, reftarget="P2:A")
+ assert_node(refnodes[2], pending_xref, reftarget="P1:B")
+ assert_node(refnodes[3], pending_xref, reftarget="P1:B")
+ assert_node(refnodes[0], [pending_xref, nodes.literal, "A"])
+ assert_node(refnodes[1], [pending_xref, nodes.literal, "A"])
+ assert_node(refnodes[2], [pending_xref, nodes.literal, "P1:B"])
+ assert_node(refnodes[3], [pending_xref, nodes.literal, "B"])
+
+
+def test_disabled_docref(app):
+ text = (":doc:`index`\n"
+ ":doc:`!index`\n")
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, ([nodes.paragraph, ([pending_xref, nodes.inline, "index"],
+ "\n",
+ [nodes.inline, "index"])],))
+
+
+def test_labeled_rubric(app):
+ text = (".. _label:\n"
+ ".. rubric:: blah *blah* blah\n")
+ restructuredtext.parse(app, text)
+
+ domain = app.env.get_domain("std")
+ assert 'label' in domain.labels
+ assert domain.labels['label'] == ('index', 'label', 'blah blah blah')
+
+
+def test_labeled_definition(app):
+ text = (".. _label1:\n"
+ "\n"
+ "Foo blah *blah* blah\n"
+ " Definition\n"
+ "\n"
+ ".. _label2:\n"
+ "\n"
+ "Bar blah *blah* blah\n"
+ " Definition\n"
+ "\n")
+ restructuredtext.parse(app, text)
+
+ domain = app.env.get_domain("std")
+ assert 'label1' in domain.labels
+ assert domain.labels['label1'] == ('index', 'label1', 'Foo blah blah blah')
+ assert 'label2' in domain.labels
+ assert domain.labels['label2'] == ('index', 'label2', 'Bar blah blah blah')
+
+
+def test_labeled_field(app):
+ text = (".. _label1:\n"
+ "\n"
+ ":Foo blah *blah* blah:\n"
+ " Definition\n"
+ "\n"
+ ".. _label2:\n"
+ "\n"
+ ":Bar blah *blah* blah:\n"
+ " Definition\n"
+ "\n")
+ restructuredtext.parse(app, text)
+
+ domain = app.env.get_domain("std")
+ assert 'label1' in domain.labels
+ assert domain.labels['label1'] == ('index', 'label1', 'Foo blah blah blah')
+ assert 'label2' in domain.labels
+ assert domain.labels['label2'] == ('index', 'label2', 'Bar blah blah blah')
diff --git a/tests/test_environment.py b/tests/test_environment.py
new file mode 100644
index 0000000..8a34457
--- /dev/null
+++ b/tests/test_environment.py
@@ -0,0 +1,145 @@
+"""Test the BuildEnvironment class."""
+import os
+import shutil
+from pathlib import Path
+
+import pytest
+
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.builders.latex import LaTeXBuilder
+from sphinx.environment import CONFIG_CHANGED, CONFIG_EXTENSIONS_CHANGED, CONFIG_NEW, CONFIG_OK
+
+
+@pytest.mark.sphinx('dummy', testroot='basic')
+def test_config_status(make_app, app_params):
+ args, kwargs = app_params
+
+ # clean build
+ app1 = make_app(*args, freshenv=True, **kwargs)
+ assert app1.env.config_status == CONFIG_NEW
+ app1.build()
+ assert '[new config] 1 added' in app1._status.getvalue()
+
+ # incremental build (no config changed)
+ app2 = make_app(*args, **kwargs)
+ assert app2.env.config_status == CONFIG_OK
+ app2.build()
+ assert "0 added, 0 changed, 0 removed" in app2._status.getvalue()
+
+ # incremental build (config entry changed)
+ app3 = make_app(*args, confoverrides={'root_doc': 'indexx'}, **kwargs)
+ fname = os.path.join(app3.srcdir, 'index.rst')
+ assert os.path.isfile(fname)
+ shutil.move(fname, fname[:-4] + 'x.rst')
+ assert app3.env.config_status == CONFIG_CHANGED
+ app3.build()
+ shutil.move(fname[:-4] + 'x.rst', fname)
+ assert "[config changed ('root_doc')] 1 added" in app3._status.getvalue()
+
+ # incremental build (extension changed)
+ app4 = make_app(*args, confoverrides={'extensions': ['sphinx.ext.autodoc']}, **kwargs)
+ assert app4.env.config_status == CONFIG_EXTENSIONS_CHANGED
+ app4.build()
+ want_str = "[extensions changed ('sphinx.ext.autodoc')] 1 added"
+ assert want_str in app4._status.getvalue()
+
+
+@pytest.mark.sphinx('dummy')
+def test_images(app):
+ app.build()
+
+ tree = app.env.get_doctree('images')
+ htmlbuilder = StandaloneHTMLBuilder(app, app.env)
+ htmlbuilder.init()
+ htmlbuilder.imgpath = 'dummy'
+ htmlbuilder.post_process_images(tree)
+ assert set(htmlbuilder.images.keys()) == \
+ {'subdir/img.png', 'img.png', 'subdir/simg.png', 'svgimg.svg', 'img.foo.png'}
+ assert set(htmlbuilder.images.values()) == \
+ {'img.png', 'img1.png', 'simg.png', 'svgimg.svg', 'img.foo.png'}
+
+ latexbuilder = LaTeXBuilder(app, app.env)
+ latexbuilder.init()
+ latexbuilder.post_process_images(tree)
+ assert set(latexbuilder.images.keys()) == \
+ {'subdir/img.png', 'subdir/simg.png', 'img.png', 'img.pdf',
+ 'svgimg.pdf', 'img.foo.png'}
+ assert set(latexbuilder.images.values()) == \
+ {'img.pdf', 'img.png', 'img1.png', 'simg.png',
+ 'svgimg.pdf', 'img.foo.png'}
+
+
+@pytest.mark.sphinx('dummy')
+def test_object_inventory(app):
+ app.build()
+ refs = app.env.domaindata['py']['objects']
+
+ assert 'func_without_module' in refs
+ assert refs['func_without_module'] == ('objects', 'func_without_module', 'function', False)
+ assert 'func_without_module2' in refs
+ assert 'mod.func_in_module' in refs
+ assert 'mod.Cls' in refs
+ assert 'mod.Cls.meth1' in refs
+ assert 'mod.Cls.meth2' in refs
+ assert 'mod.Cls.meths' in refs
+
+ assert 'mod.Error' not in refs
+ assert 'errmod.Error' in refs
+
+ assert 'func_in_module' not in refs
+ assert 'func_noindex' not in refs
+
+ assert app.env.domaindata['py']['modules']['mod'] == \
+ ('objects', 'module-mod', 'Module synopsis.', 'UNIX', False)
+
+ assert app.env.domains['py'].data is app.env.domaindata['py']
+ assert app.env.domains['c'].data is app.env.domaindata['c']
+
+
+@pytest.mark.sphinx('dummy', testroot='basic')
+def test_env_relfn2path(app):
+ # relative filename and root document
+ relfn, absfn = app.env.relfn2path('logo.jpg', 'index')
+ assert relfn == 'logo.jpg'
+ assert absfn == str(app.srcdir / 'logo.jpg')
+
+ # absolute filename and root document
+ relfn, absfn = app.env.relfn2path('/logo.jpg', 'index')
+ assert relfn == 'logo.jpg'
+ assert absfn == str(app.srcdir / 'logo.jpg')
+
+ # relative filename and a document in subdir
+ relfn, absfn = app.env.relfn2path('logo.jpg', 'subdir/index')
+ assert Path(relfn) == Path('subdir/logo.jpg')
+ assert absfn == str(app.srcdir / 'subdir' / 'logo.jpg')
+
+ # absolute filename and a document in subdir
+ relfn, absfn = app.env.relfn2path('/logo.jpg', 'subdir/index')
+ assert relfn == 'logo.jpg'
+ assert absfn == str(app.srcdir / 'logo.jpg')
+
+ # relative filename having subdir
+ relfn, absfn = app.env.relfn2path('images/logo.jpg', 'index')
+ assert relfn == 'images/logo.jpg'
+ assert absfn == str(app.srcdir / 'images' / 'logo.jpg')
+
+ # relative path traversal
+ relfn, absfn = app.env.relfn2path('../logo.jpg', 'index')
+ assert relfn == '../logo.jpg'
+ assert absfn == str(app.srcdir.parent / 'logo.jpg')
+
+ # relative path traversal
+ relfn, absfn = app.env.relfn2path('subdir/../logo.jpg', 'index')
+ assert relfn == 'logo.jpg'
+ assert absfn == str(app.srcdir / 'logo.jpg')
+
+ # omit docname (w/ current docname)
+ app.env.temp_data['docname'] = 'subdir/document'
+ relfn, absfn = app.env.relfn2path('images/logo.jpg')
+ assert Path(relfn) == Path('subdir/images/logo.jpg')
+ assert absfn == str(app.srcdir / 'subdir' / 'images' / 'logo.jpg')
+
+ # omit docname (w/o current docname)
+ app.env.temp_data.clear()
+ with pytest.raises(KeyError):
+ app.env.relfn2path('images/logo.jpg')
diff --git a/tests/test_environment_indexentries.py b/tests/test_environment_indexentries.py
new file mode 100644
index 0000000..4cfdc28
--- /dev/null
+++ b/tests/test_environment_indexentries.py
@@ -0,0 +1,166 @@
+"""Test the sphinx.environment.adapters.indexentries."""
+
+import pytest
+
+from sphinx.environment.adapters.indexentries import IndexEntries
+from sphinx.testing import restructuredtext
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_single_index(app):
+ text = (".. index:: docutils\n"
+ ".. index:: Python\n"
+ ".. index:: pip; install\n"
+ ".. index:: pip; upgrade\n"
+ ".. index:: Sphinx\n"
+ ".. index:: Ель\n"
+ ".. index:: ёлка\n"
+ ".. index:: \N{RIGHT-TO-LEFT MARK}\u05e2\u05d1\u05e8\u05d9\u05ea\N{LEFT-TO-RIGHT MARK}\n"
+ ".. index:: 9-symbol\n"
+ ".. index:: &-symbol\n"
+ ".. index:: £100\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+ assert len(index) == 6
+ assert index[0] == ('Symbols', [('&-symbol', [[('', '#index-9')], [], None]),
+ ('9-symbol', [[('', '#index-8')], [], None]),
+ ('£100', [[('', '#index-10')], [], None])])
+ assert index[1] == ('D', [('docutils', [[('', '#index-0')], [], None])])
+ assert index[2] == ('P', [('pip', [[], [('install', [('', '#index-2')]),
+ ('upgrade', [('', '#index-3')])], None]),
+ ('Python', [[('', '#index-1')], [], None])])
+ assert index[3] == ('S', [('Sphinx', [[('', '#index-4')], [], None])])
+ assert index[4] == ('Е',
+ [('ёлка', [[('', '#index-6')], [], None]),
+ ('Ель', [[('', '#index-5')], [], None])])
+ # Here the word starts with U+200F RIGHT-TO-LEFT MARK, which should be
+ # ignored when getting the first letter.
+ assert index[5] == ('\u05e2', [(
+ '\N{RIGHT-TO-LEFT MARK}\u05e2\u05d1\u05e8\u05d9\u05ea\N{LEFT-TO-RIGHT MARK}',
+ [[('', '#index-7')], [], None],
+ )])
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_pair_index(app):
+ text = (".. index:: pair: docutils; reStructuredText\n"
+ ".. index:: pair: Python; interpreter\n"
+ ".. index:: pair: Sphinx; documentation tool\n"
+ ".. index:: pair: Sphinx; :+1:\n"
+ ".. index:: pair: Sphinx; Ель\n"
+ ".. index:: pair: Sphinx; ёлка\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+ assert len(index) == 7
+ assert index[0] == ('Symbols', [(':+1:', [[], [('Sphinx', [('', '#index-3')])], None])])
+ assert index[1] == ('D',
+ [('documentation tool', [[], [('Sphinx', [('', '#index-2')])], None]),
+ ('docutils', [[], [('reStructuredText', [('', '#index-0')])], None])])
+ assert index[2] == ('I', [('interpreter', [[], [('Python', [('', '#index-1')])], None])])
+ assert index[3] == ('P', [('Python', [[], [('interpreter', [('', '#index-1')])], None])])
+ assert index[4] == ('R',
+ [('reStructuredText', [[], [('docutils', [('', '#index-0')])], None])])
+ assert index[5] == ('S',
+ [('Sphinx', [[],
+ [(':+1:', [('', '#index-3')]),
+ ('documentation tool', [('', '#index-2')]),
+ ('ёлка', [('', '#index-5')]),
+ ('Ель', [('', '#index-4')])],
+ None])])
+ assert index[6] == ('Е',
+ [('ёлка', [[], [('Sphinx', [('', '#index-5')])], None]),
+ ('Ель', [[], [('Sphinx', [('', '#index-4')])], None])])
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_triple_index(app):
+ text = (".. index:: triple: foo; bar; baz\n"
+ ".. index:: triple: Python; Sphinx; reST\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+ assert len(index) == 5
+ assert index[0] == ('B', [('bar', [[], [('baz, foo', [('', '#index-0')])], None]),
+ ('baz', [[], [('foo bar', [('', '#index-0')])], None])])
+ assert index[1] == ('F', [('foo', [[], [('bar baz', [('', '#index-0')])], None])])
+ assert index[2] == ('P', [('Python', [[], [('Sphinx reST', [('', '#index-1')])], None])])
+ assert index[3] == ('R', [('reST', [[], [('Python Sphinx', [('', '#index-1')])], None])])
+ assert index[4] == ('S', [('Sphinx', [[], [('reST, Python', [('', '#index-1')])], None])])
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_see_index(app):
+ text = (".. index:: see: docutils; reStructuredText\n"
+ ".. index:: see: Python; interpreter\n"
+ ".. index:: see: Sphinx; documentation tool\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+ assert len(index) == 3
+ assert index[0] == ('D', [('docutils', [[], [('see reStructuredText', [])], None])])
+ assert index[1] == ('P', [('Python', [[], [('see interpreter', [])], None])])
+ assert index[2] == ('S', [('Sphinx', [[], [('see documentation tool', [])], None])])
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_seealso_index(app):
+ text = (".. index:: seealso: docutils; reStructuredText\n"
+ ".. index:: seealso: Python; interpreter\n"
+ ".. index:: seealso: Sphinx; documentation tool\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+ assert len(index) == 3
+ assert index[0] == ('D', [('docutils', [[], [('see also reStructuredText', [])], None])])
+ assert index[1] == ('P', [('Python', [[], [('see also interpreter', [])], None])])
+ assert index[2] == ('S', [('Sphinx', [[], [('see also documentation tool', [])], None])])
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_main_index(app):
+ text = (".. index:: !docutils\n"
+ ".. index:: docutils\n"
+ ".. index:: pip; install\n"
+ ".. index:: !pip; install\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+ assert len(index) == 2
+ assert index[0] == ('D', [('docutils', [[('main', '#index-0'),
+ ('', '#index-1')], [], None])])
+ assert index[1] == ('P', [('pip', [[], [('install', [('main', '#index-3'),
+ ('', '#index-2')])], None])])
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_index_with_name(app):
+ text = (".. index:: single: docutils\n"
+ " :name: ref1\n"
+ ".. index:: single: Python\n"
+ " :name: ref2\n"
+ ".. index:: Sphinx\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+
+ # check index is created correctly
+ assert len(index) == 3
+ assert index[0] == ('D', [('docutils', [[('', '#ref1')], [], None])])
+ assert index[1] == ('P', [('Python', [[('', '#ref2')], [], None])])
+ assert index[2] == ('S', [('Sphinx', [[('', '#index-0')], [], None])])
+
+ # check the reference labels are created correctly
+ std = app.env.get_domain('std')
+ assert std.anonlabels['ref1'] == ('index', 'ref1')
+ assert std.anonlabels['ref2'] == ('index', 'ref2')
+
+
+@pytest.mark.sphinx('dummy', freshenv=True)
+def test_create_index_by_key(app):
+ # At present, only glossary directive is able to create index key
+ text = (".. glossary::\n"
+ "\n"
+ " docutils\n"
+ " Python\n"
+ " スフィンクス : ス\n")
+ restructuredtext.parse(app, text)
+ index = IndexEntries(app.env).create_index(app.builder)
+ assert len(index) == 3
+ assert index[0] == ('D', [('docutils', [[('main', '#term-docutils')], [], None])])
+ assert index[1] == ('P', [('Python', [[('main', '#term-Python')], [], None])])
+ assert index[2] == ('ス', [('スフィンクス', [[('main', '#term-0')], [], 'ス'])])
diff --git a/tests/test_environment_record_dependencies.py b/tests/test_environment_record_dependencies.py
new file mode 100644
index 0000000..0a17253
--- /dev/null
+++ b/tests/test_environment_record_dependencies.py
@@ -0,0 +1,10 @@
+"""Tests for ``record_dependencies``."""
+
+import pytest
+
+
+@pytest.mark.sphinx('html', testroot='environment-record-dependencies')
+def test_record_dependencies_cleared(app):
+ app.builder.read()
+ assert app.env.dependencies['index'] == set()
+ assert app.env.dependencies['api'] == {'example_module.py'}
diff --git a/tests/test_environment_toctree.py b/tests/test_environment_toctree.py
new file mode 100644
index 0000000..5123715
--- /dev/null
+++ b/tests/test_environment_toctree.py
@@ -0,0 +1,396 @@
+"""Test the sphinx.environment.adapters.toctree."""
+
+import pytest
+from docutils import nodes
+from docutils.nodes import bullet_list, list_item, literal, reference, title
+
+from sphinx import addnodes
+from sphinx.addnodes import compact_paragraph, only
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.environment.adapters.toctree import document_toc, global_toctree_for_doc
+from sphinx.testing.util import assert_node
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_process_doc(app):
+ app.build()
+ # tocs
+ toctree = app.env.tocs['index']
+ assert_node(toctree,
+ [bullet_list, ([list_item, (compact_paragraph, # [0][0]
+ [bullet_list, (addnodes.toctree, # [0][1][0]
+ only, # [0][1][1]
+ list_item)])], # [0][1][2]
+ [list_item, (compact_paragraph, # [1][0]
+ [bullet_list, (addnodes.toctree, # [1][1][0]
+ addnodes.toctree)])], # [1][1][1]
+ list_item)])
+
+ assert_node(toctree[0][0],
+ [compact_paragraph, reference, "Welcome to Sphinx Tests’s documentation!"])
+ assert_node(toctree[0][0][0], reference, anchorname='')
+ assert_node(toctree[0][1][0], addnodes.toctree,
+ caption="Table of Contents", glob=False, hidden=False,
+ titlesonly=False, maxdepth=2, numbered=999,
+ entries=[(None, 'foo'), (None, 'bar'), (None, 'http://sphinx-doc.org/'),
+ (None, 'self')],
+ includefiles=['foo', 'bar'])
+
+ # only branch
+ assert_node(toctree[0][1][1], addnodes.only, expr="html")
+ assert_node(toctree[0][1][1],
+ [only, list_item, ([compact_paragraph, reference, "Section for HTML"],
+ [bullet_list, addnodes.toctree])])
+ assert_node(toctree[0][1][1][0][0][0], reference, anchorname='#section-for-html')
+ assert_node(toctree[0][1][1][0][1][0], addnodes.toctree,
+ caption=None, glob=False, hidden=False, entries=[(None, 'baz')],
+ includefiles=['baz'], titlesonly=False, maxdepth=-1, numbered=0)
+ assert_node(toctree[0][1][2],
+ ([compact_paragraph, reference, "subsection"],
+ [bullet_list, list_item, compact_paragraph, reference, "subsubsection"]))
+
+ assert_node(toctree[1][0],
+ [compact_paragraph, reference, "Test for issue #1157"])
+ assert_node(toctree[1][0][0], reference, anchorname='#test-for-issue-1157')
+ assert_node(toctree[1][1][0], addnodes.toctree,
+ caption=None, entries=[], glob=False, hidden=False,
+ titlesonly=False, maxdepth=-1, numbered=0)
+ assert_node(toctree[1][1][1], addnodes.toctree,
+ caption=None, glob=False, hidden=True,
+ titlesonly=False, maxdepth=-1, numbered=0,
+ entries=[('Latest reference', 'http://sphinx-doc.org/latest/'),
+ ('Python', 'http://python.org/')])
+
+ assert_node(toctree[2][0],
+ [compact_paragraph, reference, "Indices and tables"])
+
+ # other collections
+ assert app.env.toc_num_entries['index'] == 6
+ assert app.env.toctree_includes['index'] == ['foo', 'bar', 'baz']
+ assert app.env.files_to_rebuild['foo'] == {'index'}
+ assert app.env.files_to_rebuild['bar'] == {'index'}
+ assert app.env.files_to_rebuild['baz'] == {'index'}
+ assert app.env.glob_toctrees == set()
+ assert app.env.numbered_toctrees == {'index'}
+
+ # qux has no section title
+ assert len(app.env.tocs['qux']) == 0
+ assert_node(app.env.tocs['qux'], nodes.bullet_list)
+ assert app.env.toc_num_entries['qux'] == 0
+ assert 'qux' not in app.env.toctree_includes
+
+
+@pytest.mark.sphinx('dummy', testroot='toctree-glob')
+def test_glob(app):
+ includefiles = ['foo', 'bar/index', 'bar/bar_1', 'bar/bar_2',
+ 'bar/bar_3', 'baz', 'qux/index']
+
+ app.build()
+
+ # tocs
+ toctree = app.env.tocs['index']
+ assert_node(toctree,
+ [bullet_list, list_item, (compact_paragraph, # [0][0]
+ [bullet_list, (list_item, # [0][1][0]
+ list_item)])]) # [0][1][1]
+
+ assert_node(toctree[0][0],
+ [compact_paragraph, reference, "test-toctree-glob"])
+ assert_node(toctree[0][1][0],
+ [list_item, ([compact_paragraph, reference, "normal order"],
+ [bullet_list, addnodes.toctree])]) # [0][1][0][1][0]
+ assert_node(toctree[0][1][0][1][0], addnodes.toctree, caption=None,
+ glob=True, hidden=False, titlesonly=False,
+ maxdepth=-1, numbered=0, includefiles=includefiles,
+ entries=[(None, 'foo'), (None, 'bar/index'), (None, 'bar/bar_1'),
+ (None, 'bar/bar_2'), (None, 'bar/bar_3'), (None, 'baz'),
+ (None, 'qux/index'),
+ ('hyperref', 'https://sphinx-doc.org/?q=sphinx')])
+ assert_node(toctree[0][1][1],
+ [list_item, ([compact_paragraph, reference, "reversed order"],
+ [bullet_list, addnodes.toctree])]) # [0][1][1][1][0]
+ assert_node(toctree[0][1][1][1][0], addnodes.toctree, caption=None,
+ glob=True, hidden=False, titlesonly=False,
+ maxdepth=-1, numbered=0, includefiles=list(reversed(includefiles)),
+ entries=[(None, 'qux/index'), (None, 'baz'), (None, 'bar/bar_3'),
+ (None, 'bar/bar_2'), (None, 'bar/bar_1'), (None, 'bar/index'),
+ (None, 'foo')])
+
+ # other collections
+ assert app.env.toc_num_entries['index'] == 3
+ assert app.env.toctree_includes['index'] == includefiles + list(reversed(includefiles))
+ for file in includefiles:
+ assert 'index' in app.env.files_to_rebuild[file]
+ assert 'index' in app.env.glob_toctrees
+ assert app.env.numbered_toctrees == set()
+
+
+@pytest.mark.sphinx('dummy', testroot='toctree-domain-objects')
+def test_domain_objects(app):
+ app.build()
+
+ assert app.env.toc_num_entries['index'] == 0
+ assert app.env.toc_num_entries['domains'] == 9
+ assert app.env.toctree_includes['index'] == ['domains']
+ assert 'index' in app.env.files_to_rebuild['domains']
+ assert app.env.glob_toctrees == set()
+ assert app.env.numbered_toctrees == {'index'}
+
+ # tocs
+ toctree = app.env.tocs['domains']
+ assert_node(toctree,
+ [bullet_list, list_item, (compact_paragraph, # [0][0]
+ [bullet_list, (list_item, # [0][1][0]
+ [list_item, # [0][1][1]
+ (compact_paragraph, # [0][1][1][0]
+ [bullet_list, (list_item, # [0][1][1][1][0]
+ list_item,
+ list_item,
+ list_item)])], # [0][1][1][1][3]
+ list_item,
+ list_item)])]) # [0][1][1]
+
+ assert_node(toctree[0][0],
+ [compact_paragraph, reference, "test-domain-objects"])
+
+ assert_node(toctree[0][1][0],
+ [list_item, ([compact_paragraph, reference, literal, "world()"])])
+
+ assert_node(toctree[0][1][1][1][3],
+ [list_item, ([compact_paragraph, reference, literal, "HelloWorldPrinter.print()"])])
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_document_toc(app):
+ app.build()
+ toctree = document_toc(app.env, 'index', app.builder.tags)
+
+ assert_node(toctree,
+ [bullet_list, ([list_item, (compact_paragraph, # [0][0]
+ [bullet_list, (addnodes.toctree, # [0][1][0]
+ list_item)])], # [0][1][1]
+ [list_item, (compact_paragraph, # [1][0]
+ [bullet_list, (addnodes.toctree,
+ addnodes.toctree)])],
+ [list_item, compact_paragraph])]) # [2][0]
+ assert_node(toctree[0][0],
+ [compact_paragraph, reference, "Welcome to Sphinx Tests’s documentation!"])
+ assert_node(toctree[0][1][1],
+ ([compact_paragraph, reference, "subsection"],
+ [bullet_list, list_item, compact_paragraph, reference, "subsubsection"]))
+ assert_node(toctree[1][0],
+ [compact_paragraph, reference, "Test for issue #1157"])
+ assert_node(toctree[2][0],
+ [compact_paragraph, reference, "Indices and tables"])
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_document_toc_only(app):
+ app.build()
+ builder = StandaloneHTMLBuilder(app, app.env)
+ toctree = document_toc(app.env, 'index', builder.tags)
+
+ assert_node(toctree,
+ [bullet_list, ([list_item, (compact_paragraph, # [0][0]
+ [bullet_list, (addnodes.toctree, # [0][1][0]
+ list_item, # [0][1][1]
+ list_item)])], # [0][1][2]
+ [list_item, (compact_paragraph, # [1][0]
+ [bullet_list, (addnodes.toctree,
+ addnodes.toctree)])],
+ [list_item, compact_paragraph])]) # [2][0]
+ assert_node(toctree[0][0],
+ [compact_paragraph, reference, "Welcome to Sphinx Tests’s documentation!"])
+ assert_node(toctree[0][1][1],
+ ([compact_paragraph, reference, "Section for HTML"],
+ [bullet_list, addnodes.toctree]))
+ assert_node(toctree[0][1][2],
+ ([compact_paragraph, reference, "subsection"],
+ [bullet_list, list_item, compact_paragraph, reference, "subsubsection"]))
+ assert_node(toctree[1][0],
+ [compact_paragraph, reference, "Test for issue #1157"])
+ assert_node(toctree[2][0],
+ [compact_paragraph, reference, "Indices and tables"])
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_document_toc_tocdepth(app):
+ app.build()
+ toctree = document_toc(app.env, 'tocdepth', app.builder.tags)
+
+ assert_node(toctree,
+ [bullet_list, list_item, (compact_paragraph, # [0][0]
+ bullet_list)]) # [0][1]
+ assert_node(toctree[0][0],
+ [compact_paragraph, reference, "level 1"])
+ assert_node(toctree[0][1],
+ [bullet_list, list_item, compact_paragraph, reference, "level 2"])
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_global_toctree_for_doc(app):
+ app.build()
+ toctree = global_toctree_for_doc(app.env, 'index', app.builder, collapse=False)
+ assert_node(toctree,
+ [compact_paragraph, ([title, "Table of Contents"],
+ bullet_list,
+ bullet_list,
+ bullet_list)])
+
+ assert_node(toctree[1],
+ ([list_item, ([compact_paragraph, reference, "foo"],
+ bullet_list)],
+ [list_item, compact_paragraph, reference, "bar"],
+ [list_item, compact_paragraph, reference, "http://sphinx-doc.org/"],
+ [list_item, compact_paragraph, reference,
+ "Welcome to Sphinx Tests’s documentation!"]))
+ assert_node(toctree[1][0][1],
+ ([list_item, compact_paragraph, reference, "quux"],
+ [list_item, compact_paragraph, reference, "foo.1"],
+ [list_item, compact_paragraph, reference, "foo.2"]))
+
+ assert_node(toctree[1][0][0][0], reference, refuri="foo", secnumber=[1])
+ assert_node(toctree[1][0][1][0][0][0], reference, refuri="quux", secnumber=[1, 1])
+ assert_node(toctree[1][0][1][1][0][0], reference, refuri="foo#foo-1", secnumber=[1, 2])
+ assert_node(toctree[1][0][1][2][0][0], reference, refuri="foo#foo-2", secnumber=[1, 3])
+ assert_node(toctree[1][1][0][0], reference, refuri="bar", secnumber=[2])
+ assert_node(toctree[1][2][0][0], reference, refuri="http://sphinx-doc.org/")
+ assert_node(toctree[1][3][0][0], reference, refuri="")
+
+ assert_node(toctree[2],
+ [bullet_list, list_item, compact_paragraph, reference, "baz"])
+ assert_node(toctree[3],
+ ([list_item, compact_paragraph, reference, "Latest reference"],
+ [list_item, compact_paragraph, reference, "Python"]))
+ assert_node(toctree[3][0][0][0], reference, refuri="http://sphinx-doc.org/latest/")
+ assert_node(toctree[3][1][0][0], reference, refuri="http://python.org/")
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_global_toctree_for_doc_collapse(app):
+ app.build()
+ toctree = global_toctree_for_doc(app.env, 'index', app.builder, collapse=True)
+ assert_node(toctree,
+ [compact_paragraph, ([title, "Table of Contents"],
+ bullet_list,
+ bullet_list,
+ bullet_list)])
+
+ assert_node(toctree[1],
+ ([list_item, compact_paragraph, reference, "foo"],
+ [list_item, compact_paragraph, reference, "bar"],
+ [list_item, compact_paragraph, reference, "http://sphinx-doc.org/"],
+ [list_item, compact_paragraph, reference,
+ "Welcome to Sphinx Tests’s documentation!"]))
+ assert_node(toctree[1][0][0][0], reference, refuri="foo", secnumber=[1])
+ assert_node(toctree[1][1][0][0], reference, refuri="bar", secnumber=[2])
+ assert_node(toctree[1][2][0][0], reference, refuri="http://sphinx-doc.org/")
+ assert_node(toctree[1][3][0][0], reference, refuri="")
+
+ assert_node(toctree[2],
+ [bullet_list, list_item, compact_paragraph, reference, "baz"])
+ assert_node(toctree[3],
+ ([list_item, compact_paragraph, reference, "Latest reference"],
+ [list_item, compact_paragraph, reference, "Python"]))
+ assert_node(toctree[3][0][0][0], reference, refuri="http://sphinx-doc.org/latest/")
+ assert_node(toctree[3][1][0][0], reference, refuri="http://python.org/")
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_global_toctree_for_doc_maxdepth(app):
+ app.build()
+ toctree = global_toctree_for_doc(app.env, 'index', app.builder,
+ collapse=False, maxdepth=3)
+ assert_node(toctree,
+ [compact_paragraph, ([title, "Table of Contents"],
+ bullet_list,
+ bullet_list,
+ bullet_list)])
+
+ assert_node(toctree[1],
+ ([list_item, ([compact_paragraph, reference, "foo"],
+ bullet_list)],
+ [list_item, compact_paragraph, reference, "bar"],
+ [list_item, compact_paragraph, reference, "http://sphinx-doc.org/"],
+ [list_item, compact_paragraph, reference,
+ "Welcome to Sphinx Tests’s documentation!"]))
+ assert_node(toctree[1][0][1],
+ ([list_item, compact_paragraph, reference, "quux"],
+ [list_item, ([compact_paragraph, reference, "foo.1"],
+ bullet_list)],
+ [list_item, compact_paragraph, reference, "foo.2"]))
+ assert_node(toctree[1][0][1][1][1],
+ [bullet_list, list_item, compact_paragraph, reference, "foo.1-1"])
+
+ assert_node(toctree[1][0][0][0], reference, refuri="foo", secnumber=[1])
+ assert_node(toctree[1][0][1][0][0][0], reference, refuri="quux", secnumber=[1, 1])
+ assert_node(toctree[1][0][1][1][0][0], reference, refuri="foo#foo-1", secnumber=[1, 2])
+ assert_node(toctree[1][0][1][1][1][0][0][0],
+ reference, refuri="foo#foo-1-1", secnumber=[1, 2, 1])
+ assert_node(toctree[1][0][1][2][0][0], reference, refuri="foo#foo-2", secnumber=[1, 3])
+ assert_node(toctree[1][1][0][0], reference, refuri="bar", secnumber=[2])
+ assert_node(toctree[1][2][0][0], reference, refuri="http://sphinx-doc.org/")
+ assert_node(toctree[1][3][0][0], reference, refuri="")
+
+ assert_node(toctree[2],
+ [bullet_list, list_item, compact_paragraph, reference, "baz"])
+ assert_node(toctree[3],
+ ([list_item, compact_paragraph, reference, "Latest reference"],
+ [list_item, compact_paragraph, reference, "Python"]))
+ assert_node(toctree[3][0][0][0], reference, refuri="http://sphinx-doc.org/latest/")
+ assert_node(toctree[3][1][0][0], reference, refuri="http://python.org/")
+
+
+@pytest.mark.sphinx('xml', testroot='toctree')
+@pytest.mark.test_params(shared_result='test_environment_toctree_basic')
+def test_global_toctree_for_doc_includehidden(app):
+ app.build()
+ toctree = global_toctree_for_doc(app.env, 'index', app.builder,
+ collapse=False, includehidden=False)
+ assert_node(toctree,
+ [compact_paragraph, ([title, "Table of Contents"],
+ bullet_list,
+ bullet_list)])
+
+ assert_node(toctree[1],
+ ([list_item, ([compact_paragraph, reference, "foo"],
+ bullet_list)],
+ [list_item, compact_paragraph, reference, "bar"],
+ [list_item, compact_paragraph, reference, "http://sphinx-doc.org/"],
+ [list_item, compact_paragraph, reference,
+ "Welcome to Sphinx Tests’s documentation!"]))
+ assert_node(toctree[1][0][1],
+ ([list_item, compact_paragraph, reference, "quux"],
+ [list_item, compact_paragraph, reference, "foo.1"],
+ [list_item, compact_paragraph, reference, "foo.2"]))
+
+ assert_node(toctree[1][0][0][0], reference, refuri="foo", secnumber=[1])
+ assert_node(toctree[1][0][1][0][0][0], reference, refuri="quux", secnumber=[1, 1])
+ assert_node(toctree[1][0][1][1][0][0], reference, refuri="foo#foo-1", secnumber=[1, 2])
+ assert_node(toctree[1][0][1][2][0][0], reference, refuri="foo#foo-2", secnumber=[1, 3])
+ assert_node(toctree[1][1][0][0], reference, refuri="bar", secnumber=[2])
+ assert_node(toctree[1][2][0][0], reference, refuri="http://sphinx-doc.org/")
+
+ assert_node(toctree[2],
+ [bullet_list, list_item, compact_paragraph, reference, "baz"])
+
+
+@pytest.mark.sphinx('xml', testroot='toctree-index')
+def test_toctree_index(app):
+ app.build()
+ toctree = app.env.tocs['index']
+ assert_node(toctree,
+ [bullet_list, ([list_item, (compact_paragraph, # [0][0]
+ [bullet_list, (addnodes.toctree, # [0][1][0]
+ addnodes.toctree)])])]) # [0][1][1]
+ assert_node(toctree[0][1][1], addnodes.toctree,
+ caption="Indices", glob=False, hidden=False,
+ titlesonly=False, maxdepth=-1, numbered=0,
+ entries=[(None, 'genindex'), (None, 'modindex'), (None, 'search')])
diff --git a/tests/test_errors.py b/tests/test_errors.py
new file mode 100644
index 0000000..6378760
--- /dev/null
+++ b/tests/test_errors.py
@@ -0,0 +1,11 @@
+from sphinx.errors import ExtensionError
+
+
+def test_extension_error_repr():
+ exc = ExtensionError("foo")
+ assert repr(exc) == "ExtensionError('foo')"
+
+
+def test_extension_error_with_orig_exc_repr():
+ exc = ExtensionError("foo", Exception("bar"))
+ assert repr(exc) == "ExtensionError('foo', Exception('bar'))"
diff --git a/tests/test_events.py b/tests/test_events.py
new file mode 100644
index 0000000..d850a91
--- /dev/null
+++ b/tests/test_events.py
@@ -0,0 +1,56 @@
+"""Test the EventManager class."""
+
+import pytest
+
+from sphinx.errors import ExtensionError
+from sphinx.events import EventManager
+
+
+def test_event_priority():
+ result = []
+ events = EventManager(object()) # pass an dummy object as an app
+ events.connect('builder-inited', lambda app: result.append(1), priority = 500)
+ events.connect('builder-inited', lambda app: result.append(2), priority = 500)
+ events.connect('builder-inited', lambda app: result.append(3), priority = 200) # earlier
+ events.connect('builder-inited', lambda app: result.append(4), priority = 700) # later
+ events.connect('builder-inited', lambda app: result.append(5), priority = 500)
+
+ events.emit('builder-inited')
+ assert result == [3, 1, 2, 5, 4]
+
+
+class FakeApp:
+ def __init__(self, pdb: bool = False):
+ self.pdb = pdb
+
+
+def test_event_allowed_exceptions():
+ def raise_error(app):
+ raise RuntimeError
+
+ events = EventManager(FakeApp()) # pass an dummy object as an app
+ events.connect('builder-inited', raise_error, priority=500)
+
+ # all errors are converted to ExtensionError
+ with pytest.raises(ExtensionError):
+ events.emit('builder-inited')
+
+ # Allow RuntimeError (pass-through)
+ with pytest.raises(RuntimeError):
+ events.emit('builder-inited', allowed_exceptions=(RuntimeError,))
+
+
+def test_event_pdb():
+ def raise_error(app):
+ raise RuntimeError
+
+ events = EventManager(FakeApp(pdb=True)) # pass an dummy object as an app
+ events.connect('builder-inited', raise_error, priority=500)
+
+ # errors aren't converted
+ with pytest.raises(RuntimeError):
+ events.emit('builder-inited')
+
+ # Allow RuntimeError (pass-through)
+ with pytest.raises(RuntimeError):
+ events.emit('builder-inited', allowed_exceptions=(RuntimeError,))
diff --git a/tests/test_ext_apidoc.py b/tests/test_ext_apidoc.py
new file mode 100644
index 0000000..1e089a3
--- /dev/null
+++ b/tests/test_ext_apidoc.py
@@ -0,0 +1,665 @@
+"""Test the sphinx.apidoc module."""
+
+import os.path
+from collections import namedtuple
+
+import pytest
+
+import sphinx.ext.apidoc
+from sphinx.ext.apidoc import main as apidoc_main
+
+
+@pytest.fixture()
+def apidoc(rootdir, tmp_path, apidoc_params):
+ _, kwargs = apidoc_params
+ coderoot = rootdir / kwargs.get('coderoot', 'test-root')
+ outdir = tmp_path / 'out'
+ excludes = [str(coderoot / e) for e in kwargs.get('excludes', [])]
+ args = ['-o', str(outdir), '-F', str(coderoot)] + excludes + kwargs.get('options', [])
+ apidoc_main(args)
+ return namedtuple('apidoc', 'coderoot,outdir')(coderoot, outdir)
+
+
+@pytest.fixture()
+def apidoc_params(request):
+ pargs = {}
+ kwargs = {}
+
+ for info in reversed(list(request.node.iter_markers("apidoc"))):
+ for i, a in enumerate(info.args):
+ pargs[i] = a
+ kwargs.update(info.kwargs)
+
+ args = [pargs[i] for i in sorted(pargs.keys())]
+ return args, kwargs
+
+
+@pytest.mark.apidoc(coderoot='test-root')
+def test_simple(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'index.rst').is_file()
+
+ app = make_app('text', srcdir=outdir)
+ app.build()
+ print(app._status.getvalue())
+ print(app._warning.getvalue())
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-pep420/a',
+ options=["--implicit-namespaces"],
+)
+def test_pep_0420_enabled(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'a.b.c.rst').is_file()
+ assert (outdir / 'a.b.e.rst').is_file()
+ assert (outdir / 'a.b.x.rst').is_file()
+
+ with open(outdir / 'a.b.c.rst', encoding='utf-8') as f:
+ rst = f.read()
+ assert "automodule:: a.b.c.d\n" in rst
+ assert "automodule:: a.b.c\n" in rst
+
+ with open(outdir / 'a.b.e.rst', encoding='utf-8') as f:
+ rst = f.read()
+ assert "automodule:: a.b.e.f\n" in rst
+
+ with open(outdir / 'a.b.x.rst', encoding='utf-8') as f:
+ rst = f.read()
+ assert "automodule:: a.b.x.y\n" in rst
+ assert "automodule:: a.b.x\n" not in rst
+
+ app = make_app('text', srcdir=outdir)
+ app.build()
+ print(app._status.getvalue())
+ print(app._warning.getvalue())
+
+ builddir = outdir / '_build' / 'text'
+ assert (builddir / 'a.b.c.txt').is_file()
+ assert (builddir / 'a.b.e.txt').is_file()
+ assert (builddir / 'a.b.x.txt').is_file()
+
+ with open(builddir / 'a.b.c.txt', encoding='utf-8') as f:
+ txt = f.read()
+ assert "a.b.c package\n" in txt
+
+ with open(builddir / 'a.b.e.txt', encoding='utf-8') as f:
+ txt = f.read()
+ assert "a.b.e.f module\n" in txt
+
+ with open(builddir / 'a.b.x.txt', encoding='utf-8') as f:
+ txt = f.read()
+ assert "a.b.x namespace\n" in txt
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-pep420/a',
+ options=["--implicit-namespaces", "--separate"],
+)
+def test_pep_0420_enabled_separate(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'a.b.c.rst').is_file()
+ assert (outdir / 'a.b.e.rst').is_file()
+ assert (outdir / 'a.b.e.f.rst').is_file()
+ assert (outdir / 'a.b.x.rst').is_file()
+ assert (outdir / 'a.b.x.y.rst').is_file()
+
+ with open(outdir / 'a.b.c.rst', encoding='utf-8') as f:
+ rst = f.read()
+ assert ".. toctree::\n :maxdepth: 4\n\n a.b.c.d\n" in rst
+
+ with open(outdir / 'a.b.e.rst', encoding='utf-8') as f:
+ rst = f.read()
+ assert ".. toctree::\n :maxdepth: 4\n\n a.b.e.f\n" in rst
+
+ with open(outdir / 'a.b.x.rst', encoding='utf-8') as f:
+ rst = f.read()
+ assert ".. toctree::\n :maxdepth: 4\n\n a.b.x.y\n" in rst
+
+ app = make_app('text', srcdir=outdir)
+ app.build()
+ print(app._status.getvalue())
+ print(app._warning.getvalue())
+
+ builddir = outdir / '_build' / 'text'
+ assert (builddir / 'a.b.c.txt').is_file()
+ assert (builddir / 'a.b.e.txt').is_file()
+ assert (builddir / 'a.b.e.f.txt').is_file()
+ assert (builddir / 'a.b.x.txt').is_file()
+ assert (builddir / 'a.b.x.y.txt').is_file()
+
+ with open(builddir / 'a.b.c.txt', encoding='utf-8') as f:
+ txt = f.read()
+ assert "a.b.c package\n" in txt
+
+ with open(builddir / 'a.b.e.f.txt', encoding='utf-8') as f:
+ txt = f.read()
+ assert "a.b.e.f module\n" in txt
+
+ with open(builddir / 'a.b.x.txt', encoding='utf-8') as f:
+ txt = f.read()
+ assert "a.b.x namespace\n" in txt
+
+
+@pytest.mark.apidoc(coderoot='test-apidoc-pep420/a')
+def test_pep_0420_disabled(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert not (outdir / 'a.b.c.rst').exists()
+ assert not (outdir / 'a.b.x.rst').exists()
+
+ app = make_app('text', srcdir=outdir)
+ app.build()
+ print(app._status.getvalue())
+ print(app._warning.getvalue())
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-pep420/a/b')
+def test_pep_0420_disabled_top_level_verify(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'c.rst').is_file()
+ assert not (outdir / 'x.rst').exists()
+
+ with open(outdir / 'c.rst', encoding='utf-8') as f:
+ rst = f.read()
+ assert "c package\n" in rst
+ assert "automodule:: c.d\n" in rst
+ assert "automodule:: c\n" in rst
+
+ app = make_app('text', srcdir=outdir)
+ app.build()
+ print(app._status.getvalue())
+ print(app._warning.getvalue())
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-trailing-underscore')
+def test_trailing_underscore(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'package_.rst').is_file()
+
+ app = make_app('text', srcdir=outdir)
+ app.build()
+ print(app._status.getvalue())
+ print(app._warning.getvalue())
+
+ builddir = outdir / '_build' / 'text'
+ with open(builddir / 'package_.txt', encoding='utf-8') as f:
+ rst = f.read()
+ assert "package_ package\n" in rst
+ assert "package_.module_ module\n" in rst
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-pep420/a',
+ excludes=["b/c/d.py", "b/e/f.py", "b/e/__init__.py"],
+ options=["--implicit-namespaces", "--separate"],
+)
+def test_excludes(apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'a.rst').is_file()
+ assert (outdir / 'a.b.rst').is_file()
+ assert (outdir / 'a.b.c.rst').is_file() # generated because not empty
+ assert not (outdir / 'a.b.e.rst').is_file() # skipped because of empty after excludes
+ assert (outdir / 'a.b.x.rst').is_file()
+ assert (outdir / 'a.b.x.y.rst').is_file()
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-pep420/a',
+ excludes=["b/e"],
+ options=["--implicit-namespaces", "--separate"],
+)
+def test_excludes_subpackage_should_be_skipped(apidoc):
+ """Subpackage exclusion should work."""
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'a.rst').is_file()
+ assert (outdir / 'a.b.rst').is_file()
+ assert (outdir / 'a.b.c.rst').is_file() # generated because not empty
+ assert not (outdir / 'a.b.e.f.rst').is_file() # skipped because 'b/e' subpackage is skipped
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-pep420/a',
+ excludes=["b/e/f.py"],
+ options=["--implicit-namespaces", "--separate"],
+)
+def test_excludes_module_should_be_skipped(apidoc):
+ """Module exclusion should work."""
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'a.rst').is_file()
+ assert (outdir / 'a.b.rst').is_file()
+ assert (outdir / 'a.b.c.rst').is_file() # generated because not empty
+ assert not (outdir / 'a.b.e.f.rst').is_file() # skipped because of empty after excludes
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-pep420/a',
+ excludes=[],
+ options=["--implicit-namespaces", "--separate"],
+)
+def test_excludes_module_should_not_be_skipped(apidoc):
+ """Module should be included if no excludes are used."""
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'a.rst').is_file()
+ assert (outdir / 'a.b.rst').is_file()
+ assert (outdir / 'a.b.c.rst').is_file() # generated because not empty
+ assert (outdir / 'a.b.e.f.rst').is_file() # skipped because of empty after excludes
+
+
+@pytest.mark.apidoc(
+ coderoot='test-root',
+ options=[
+ '--doc-project', 'プロジェクトå',
+ '--doc-author', '著者å',
+ '--doc-version', 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³',
+ '--doc-release', 'リリース',
+ ],
+)
+def test_multibyte_parameters(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+ assert (outdir / 'index.rst').is_file()
+
+ conf_py = (outdir / 'conf.py').read_text(encoding='utf8')
+ assert "project = 'プロジェクトå'" in conf_py
+ assert "author = '著者å'" in conf_py
+ assert "version = 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³'" in conf_py
+ assert "release = 'リリース'" in conf_py
+
+ app = make_app('text', srcdir=outdir)
+ app.build()
+ print(app._status.getvalue())
+ print(app._warning.getvalue())
+
+
+@pytest.mark.apidoc(
+ coderoot='test-root',
+ options=['--ext-mathjax'],
+)
+def test_extension_parsed(make_app, apidoc):
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+
+ with open(outdir / 'conf.py', encoding='utf-8') as f:
+ rst = f.read()
+ assert "sphinx.ext.mathjax" in rst
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-toc/mypackage',
+ options=["--implicit-namespaces"],
+)
+def test_toc_all_references_should_exist_pep420_enabled(make_app, apidoc):
+ """All references in toc should exist. This test doesn't say if
+ directories with empty __init__.py and and nothing else should be
+ skipped, just ensures consistency between what's referenced in the toc
+ and what is created. This is the variant with pep420 enabled.
+ """
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+
+ toc = extract_toc(outdir / 'mypackage.rst')
+
+ refs = [l.strip() for l in toc.splitlines() if l.strip()]
+ found_refs = []
+ missing_files = []
+ for ref in refs:
+ if ref and ref[0] in (':', '#'):
+ continue
+ found_refs.append(ref)
+ filename = f"{ref}.rst"
+ if not (outdir / filename).is_file():
+ missing_files.append(filename)
+
+ assert len(missing_files) == 0, \
+ 'File(s) referenced in TOC not found: {}\n' \
+ 'TOC:\n{}'.format(", ".join(missing_files), toc)
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-toc/mypackage',
+)
+def test_toc_all_references_should_exist_pep420_disabled(make_app, apidoc):
+ """All references in toc should exist. This test doesn't say if
+ directories with empty __init__.py and and nothing else should be
+ skipped, just ensures consistency between what's referenced in the toc
+ and what is created. This is the variant with pep420 disabled.
+ """
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+
+ toc = extract_toc(outdir / 'mypackage.rst')
+
+ refs = [l.strip() for l in toc.splitlines() if l.strip()]
+ found_refs = []
+ missing_files = []
+ for ref in refs:
+ if ref and ref[0] in (':', '#'):
+ continue
+ filename = f"{ref}.rst"
+ found_refs.append(ref)
+ if not (outdir / filename).is_file():
+ missing_files.append(filename)
+
+ assert len(missing_files) == 0, \
+ 'File(s) referenced in TOC not found: {}\n' \
+ 'TOC:\n{}'.format(", ".join(missing_files), toc)
+
+
+def extract_toc(path):
+ """Helper: Extract toc section from package rst file"""
+ with open(path, encoding='utf-8') as f:
+ rst = f.read()
+
+ # Read out the part containing the toctree
+ toctree_start = "\n.. toctree::\n"
+ toctree_end = "\nSubmodules"
+
+ start_idx = rst.index(toctree_start)
+ end_idx = rst.index(toctree_end, start_idx)
+ toctree = rst[start_idx + len(toctree_start):end_idx]
+
+ return toctree
+
+
+@pytest.mark.apidoc(
+ coderoot='test-apidoc-subpackage-in-toc',
+ options=['--separate'],
+)
+def test_subpackage_in_toc(make_app, apidoc):
+ """Make sure that empty subpackages with non-empty subpackages in them
+ are not skipped (issue #4520)
+ """
+ outdir = apidoc.outdir
+ assert (outdir / 'conf.py').is_file()
+
+ assert (outdir / 'parent.rst').is_file()
+ with open(outdir / 'parent.rst', encoding='utf-8') as f:
+ parent = f.read()
+ assert 'parent.child' in parent
+
+ assert (outdir / 'parent.child.rst').is_file()
+ with open(outdir / 'parent.child.rst', encoding='utf-8') as f:
+ parent_child = f.read()
+ assert 'parent.child.foo' in parent_child
+
+ assert (outdir / 'parent.child.foo.rst').is_file()
+
+
+def test_private(tmp_path):
+ (tmp_path / 'hello.py').write_text('', encoding='utf8')
+ (tmp_path / '_world.py').write_text('', encoding='utf8')
+
+ # without --private option
+ apidoc_main(['-o', str(tmp_path), str(tmp_path)])
+ assert (tmp_path / 'hello.rst').exists()
+ assert ':private-members:' not in (tmp_path / 'hello.rst').read_text(encoding='utf8')
+ assert not (tmp_path / '_world.rst').exists()
+
+ # with --private option
+ apidoc_main(['--private', '-f', '-o', str(tmp_path), str(tmp_path)])
+ assert (tmp_path / 'hello.rst').exists()
+ assert ':private-members:' in (tmp_path / 'hello.rst').read_text(encoding='utf8')
+ assert (tmp_path / '_world.rst').exists()
+
+
+def test_toc_file(tmp_path):
+ outdir = tmp_path
+ (outdir / 'module').mkdir(parents=True, exist_ok=True)
+ (outdir / 'example.py').write_text('', encoding='utf8')
+ (outdir / 'module' / 'example.py').write_text('', encoding='utf8')
+ apidoc_main(['-o', str(tmp_path), str(tmp_path)])
+ assert (outdir / 'modules.rst').exists()
+
+ content = (outdir / 'modules.rst').read_text(encoding='utf8')
+ assert content == ("test_toc_file0\n"
+ "==============\n"
+ "\n"
+ ".. toctree::\n"
+ " :maxdepth: 4\n"
+ "\n"
+ " example\n")
+
+
+def test_module_file(tmp_path):
+ outdir = tmp_path
+ (outdir / 'example.py').write_text('', encoding='utf8')
+ apidoc_main(['-o', str(tmp_path), str(tmp_path)])
+ assert (outdir / 'example.rst').exists()
+
+ content = (outdir / 'example.rst').read_text(encoding='utf8')
+ assert content == ("example module\n"
+ "==============\n"
+ "\n"
+ ".. automodule:: example\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+
+def test_module_file_noheadings(tmp_path):
+ outdir = tmp_path
+ (outdir / 'example.py').write_text('', encoding='utf8')
+ apidoc_main(['--no-headings', '-o', str(tmp_path), str(tmp_path)])
+ assert (outdir / 'example.rst').exists()
+
+ content = (outdir / 'example.rst').read_text(encoding='utf8')
+ assert content == (".. automodule:: example\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+
+def test_package_file(tmp_path):
+ outdir = tmp_path
+ (outdir / 'testpkg').mkdir(parents=True, exist_ok=True)
+ (outdir / 'testpkg' / '__init__.py').write_text('', encoding='utf8')
+ (outdir / 'testpkg' / 'hello.py').write_text('', encoding='utf8')
+ (outdir / 'testpkg' / 'world.py').write_text('', encoding='utf8')
+ (outdir / 'testpkg' / 'subpkg').mkdir(parents=True, exist_ok=True)
+ (outdir / 'testpkg' / 'subpkg' / '__init__.py').write_text('', encoding='utf8')
+ apidoc_main(['-o', str(outdir), str(outdir / 'testpkg')])
+ assert (outdir / 'testpkg.rst').exists()
+ assert (outdir / 'testpkg.subpkg.rst').exists()
+
+ content = (outdir / 'testpkg.rst').read_text(encoding='utf8')
+ assert content == ("testpkg package\n"
+ "===============\n"
+ "\n"
+ "Subpackages\n"
+ "-----------\n"
+ "\n"
+ ".. toctree::\n"
+ " :maxdepth: 4\n"
+ "\n"
+ " testpkg.subpkg\n"
+ "\n"
+ "Submodules\n"
+ "----------\n"
+ "\n"
+ "testpkg.hello module\n"
+ "--------------------\n"
+ "\n"
+ ".. automodule:: testpkg.hello\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n"
+ "\n"
+ "testpkg.world module\n"
+ "--------------------\n"
+ "\n"
+ ".. automodule:: testpkg.world\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n"
+ "\n"
+ "Module contents\n"
+ "---------------\n"
+ "\n"
+ ".. automodule:: testpkg\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+ content = (outdir / 'testpkg.subpkg.rst').read_text(encoding='utf8')
+ assert content == ("testpkg.subpkg package\n"
+ "======================\n"
+ "\n"
+ "Module contents\n"
+ "---------------\n"
+ "\n"
+ ".. automodule:: testpkg.subpkg\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+
+def test_package_file_separate(tmp_path):
+ outdir = tmp_path
+ (outdir / 'testpkg').mkdir(parents=True, exist_ok=True)
+ (outdir / 'testpkg' / '__init__.py').write_text('', encoding='utf8')
+ (outdir / 'testpkg' / 'example.py').write_text('', encoding='utf8')
+ apidoc_main(['--separate', '-o', str(tmp_path), str(tmp_path / 'testpkg')])
+ assert (outdir / 'testpkg.rst').exists()
+ assert (outdir / 'testpkg.example.rst').exists()
+
+ content = (outdir / 'testpkg.rst').read_text(encoding='utf8')
+ assert content == ("testpkg package\n"
+ "===============\n"
+ "\n"
+ "Submodules\n"
+ "----------\n"
+ "\n"
+ ".. toctree::\n"
+ " :maxdepth: 4\n"
+ "\n"
+ " testpkg.example\n"
+ "\n"
+ "Module contents\n"
+ "---------------\n"
+ "\n"
+ ".. automodule:: testpkg\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+ content = (outdir / 'testpkg.example.rst').read_text(encoding='utf8')
+ assert content == ("testpkg.example module\n"
+ "======================\n"
+ "\n"
+ ".. automodule:: testpkg.example\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+
+def test_package_file_module_first(tmp_path):
+ outdir = tmp_path
+ (outdir / 'testpkg').mkdir(parents=True, exist_ok=True)
+ (outdir / 'testpkg' / '__init__.py').write_text('', encoding='utf8')
+ (outdir / 'testpkg' / 'example.py').write_text('', encoding='utf8')
+ apidoc_main(['--module-first', '-o', str(tmp_path), str(tmp_path)])
+
+ content = (outdir / 'testpkg.rst').read_text(encoding='utf8')
+ assert content == ("testpkg package\n"
+ "===============\n"
+ "\n"
+ ".. automodule:: testpkg\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n"
+ "\n"
+ "Submodules\n"
+ "----------\n"
+ "\n"
+ "testpkg.example module\n"
+ "----------------------\n"
+ "\n"
+ ".. automodule:: testpkg.example\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+
+def test_package_file_without_submodules(tmp_path):
+ outdir = tmp_path
+ (outdir / 'testpkg').mkdir(parents=True, exist_ok=True)
+ (outdir / 'testpkg' / '__init__.py').write_text('', encoding='utf8')
+ apidoc_main(['-o', str(tmp_path), str(tmp_path / 'testpkg')])
+ assert (outdir / 'testpkg.rst').exists()
+
+ content = (outdir / 'testpkg.rst').read_text(encoding='utf8')
+ assert content == ("testpkg package\n"
+ "===============\n"
+ "\n"
+ "Module contents\n"
+ "---------------\n"
+ "\n"
+ ".. automodule:: testpkg\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+
+def test_namespace_package_file(tmp_path):
+ outdir = tmp_path
+ (outdir / 'testpkg').mkdir(parents=True, exist_ok=True)
+ (outdir / 'testpkg' / 'example.py').write_text('', encoding='utf8')
+ apidoc_main(['--implicit-namespace', '-o', str(tmp_path), str(tmp_path / 'testpkg')])
+ assert (outdir / 'testpkg.rst').exists()
+
+ content = (outdir / 'testpkg.rst').read_text(encoding='utf8')
+ assert content == ("testpkg namespace\n"
+ "=================\n"
+ "\n"
+ ".. py:module:: testpkg\n"
+ "\n"
+ "Submodules\n"
+ "----------\n"
+ "\n"
+ "testpkg.example module\n"
+ "----------------------\n"
+ "\n"
+ ".. automodule:: testpkg.example\n"
+ " :members:\n"
+ " :undoc-members:\n"
+ " :show-inheritance:\n")
+
+
+def test_no_duplicates(rootdir, tmp_path):
+ """Make sure that a ".pyx" and ".so" don't cause duplicate listings.
+
+ We can't use pytest.mark.apidoc here as we use a different set of arguments
+ to apidoc_main
+ """
+
+ original_suffixes = sphinx.ext.apidoc.PY_SUFFIXES
+ try:
+ # Ensure test works on Windows
+ sphinx.ext.apidoc.PY_SUFFIXES += ('.so',)
+
+ package = rootdir / 'test-apidoc-duplicates' / 'fish_licence'
+ outdir = tmp_path / 'out'
+ apidoc_main(['-o', str(outdir), "-T", str(package), "--implicit-namespaces"])
+
+ # Ensure the module has been documented
+ assert os.path.isfile(outdir / 'fish_licence.rst')
+
+ # Ensure the submodule only appears once
+ text = (outdir / 'fish_licence.rst').read_text(encoding="utf-8")
+ count_submodules = text.count(r'fish\_licence.halibut module')
+ assert count_submodules == 1
+
+ finally:
+ sphinx.ext.apidoc.PY_SUFFIXES = original_suffixes
diff --git a/tests/test_ext_autodoc.py b/tests/test_ext_autodoc.py
new file mode 100644
index 0000000..7062763
--- /dev/null
+++ b/tests/test_ext_autodoc.py
@@ -0,0 +1,2537 @@
+"""Test the autodoc extension.
+
+This tests mainly the Documenters; the auto directives are tested in a test
+source file translated by test_build.
+"""
+
+import sys
+from types import SimpleNamespace
+from unittest.mock import Mock
+from warnings import catch_warnings
+
+import pytest
+from docutils.statemachine import ViewList
+
+from sphinx import addnodes
+from sphinx.ext.autodoc import ALL, ModuleLevelDocumenter, Options
+from sphinx.ext.autodoc.directive import DocumenterBridge, process_documenter_options
+from sphinx.util.docutils import LoggingReporter
+
+try:
+ # Enable pyximport to test cython module
+ import pyximport
+ pyximport.install()
+except ImportError:
+ pyximport = None
+
+
+def do_autodoc(app, objtype, name, options=None):
+ if options is None:
+ options = {}
+ app.env.temp_data.setdefault('docname', 'index') # set dummy docname
+ doccls = app.registry.documenters[objtype]
+ docoptions = process_documenter_options(doccls, app.config, options)
+ state = Mock()
+ state.document.settings.tab_width = 8
+ bridge = DocumenterBridge(app.env, LoggingReporter(''), docoptions, 1, state)
+ documenter = doccls(bridge, name)
+ documenter.generate()
+
+ return bridge.result
+
+
+def make_directive_bridge(env):
+ options = Options(
+ inherited_members = False,
+ undoc_members = False,
+ private_members = False,
+ special_members = False,
+ imported_members = False,
+ show_inheritance = False,
+ no_index = False,
+ annotation = None,
+ synopsis = '',
+ platform = '',
+ deprecated = False,
+ members = [],
+ member_order = 'alphabetical',
+ exclude_members = set(),
+ ignore_module_all = False,
+ )
+
+ directive = SimpleNamespace(
+ env = env,
+ genopt = options,
+ result = ViewList(),
+ record_dependencies = set(),
+ state = Mock(),
+ )
+ directive.state.document.settings.tab_width = 8
+
+ return directive
+
+
+processed_signatures = []
+
+
+def process_signature(app, what, name, obj, options, args, retann):
+ processed_signatures.append((what, name))
+ if name == 'bar':
+ return '42', None
+ return None
+
+
+def skip_member(app, what, name, obj, skip, options):
+ if name in ('__special1__', '__special2__'):
+ return skip
+ if name.startswith('__'):
+ return True
+ if name == 'skipmeth':
+ return True
+ return None
+
+
+def test_parse_name(app):
+ def verify(objtype, name, result):
+ inst = app.registry.documenters[objtype](directive, name)
+ assert inst.parse_name()
+ assert (inst.modname, inst.objpath, inst.args, inst.retann) == result
+
+ directive = make_directive_bridge(app.env)
+
+ # for modules
+ verify('module', 'test_ext_autodoc', ('test_ext_autodoc', [], None, None))
+ verify('module', 'test.test_ext_autodoc', ('test.test_ext_autodoc', [], None, None))
+ verify('module', 'test(arg)', ('test', [], 'arg', None))
+ assert 'signature arguments' in app._warning.getvalue()
+
+ # for functions/classes
+ verify('function', 'test_ext_autodoc.raises',
+ ('test_ext_autodoc', ['raises'], None, None))
+ verify('function', 'test_ext_autodoc.raises(exc) -> None',
+ ('test_ext_autodoc', ['raises'], 'exc', 'None'))
+ directive.env.temp_data['autodoc:module'] = 'test_ext_autodoc'
+ verify('function', 'raises', ('test_ext_autodoc', ['raises'], None, None))
+ del directive.env.temp_data['autodoc:module']
+ directive.env.ref_context['py:module'] = 'test_ext_autodoc'
+ verify('function', 'raises', ('test_ext_autodoc', ['raises'], None, None))
+ verify('class', 'Base', ('test_ext_autodoc', ['Base'], None, None))
+
+ # for members
+ directive.env.ref_context['py:module'] = 'sphinx.testing.util'
+ verify('method', 'SphinxTestApp.cleanup',
+ ('sphinx.testing.util', ['SphinxTestApp', 'cleanup'], None, None))
+ directive.env.ref_context['py:module'] = 'sphinx.testing.util'
+ directive.env.ref_context['py:class'] = 'Foo'
+ directive.env.temp_data['autodoc:class'] = 'SphinxTestApp'
+ verify('method', 'cleanup',
+ ('sphinx.testing.util', ['SphinxTestApp', 'cleanup'], None, None))
+ verify('method', 'SphinxTestApp.cleanup',
+ ('sphinx.testing.util', ['SphinxTestApp', 'cleanup'], None, None))
+
+
+def test_format_signature(app):
+ app.connect('autodoc-process-signature', process_signature)
+ app.connect('autodoc-skip-member', skip_member)
+
+ directive = make_directive_bridge(app.env)
+
+ def formatsig(objtype, name, obj, args, retann):
+ inst = app.registry.documenters[objtype](directive, name)
+ inst.fullname = name
+ inst.doc_as_attr = False # for class objtype
+ inst.parent = object # dummy
+ inst.object = obj
+ inst.objpath = [name]
+ inst.args = args
+ inst.retann = retann
+ res = inst.format_signature()
+ print(res)
+ return res
+
+ # no signatures for modules
+ assert formatsig('module', 'test', None, None, None) == ''
+
+ # test for functions
+ def f(a, b, c=1, **d):
+ pass
+
+ def g(a='\n'):
+ pass
+ assert formatsig('function', 'f', f, None, None) == '(a, b, c=1, **d)'
+ assert formatsig('function', 'f', f, 'a, b, c, d', None) == '(a, b, c, d)'
+ assert formatsig('function', 'g', g, None, None) == r"(a='\n')"
+
+ # test for classes
+ class D:
+ pass
+
+ class E:
+ def __init__(self):
+ pass
+
+ # an empty init and no init are the same
+ for C in (D, E):
+ assert formatsig('class', 'D', C, None, None) == '()'
+
+ class SomeMeta(type):
+ def __call__(cls, a, b=None):
+ return type.__call__(cls, a, b)
+
+ # these three are all equivalent
+ class F:
+ def __init__(self, a, b=None):
+ pass
+
+ class FNew:
+ def __new__(cls, a, b=None):
+ return super().__new__(cls)
+
+ class FMeta(metaclass=SomeMeta):
+ pass
+
+ # and subclasses should always inherit
+ class G(F):
+ pass
+
+ class GNew(FNew):
+ pass
+
+ class GMeta(FMeta):
+ pass
+
+ # subclasses inherit
+ for C in (F, FNew, FMeta, G, GNew, GMeta):
+ assert formatsig('class', 'C', C, None, None) == '(a, b=None)'
+ assert formatsig('class', 'C', D, 'a, b', 'X') == '(a, b) -> X'
+
+ class ListSubclass(list):
+ pass
+
+ # only supported if the python implementation decides to document it
+ if getattr(list, '__text_signature__', None) is not None:
+ assert formatsig('class', 'C', ListSubclass, None, None) == '(iterable=(), /)'
+ else:
+ assert formatsig('class', 'C', ListSubclass, None, None) == ''
+
+ class ExceptionSubclass(Exception):
+ pass
+
+ # Exception has no __text_signature__ at least in Python 3.11
+ if getattr(Exception, '__text_signature__', None) is None:
+ assert formatsig('class', 'C', ExceptionSubclass, None, None) == ''
+
+ # __init__ have signature at first line of docstring
+ directive.env.config.autoclass_content = 'both'
+
+ class F2:
+ """some docstring for F2."""
+ def __init__(self, *args, **kw):
+ """
+ __init__(a1, a2, kw1=True, kw2=False)
+
+ some docstring for __init__.
+ """
+ class G2(F2):
+ pass
+
+ assert formatsig('class', 'F2', F2, None, None) == \
+ '(a1, a2, kw1=True, kw2=False)'
+ assert formatsig('class', 'G2', G2, None, None) == \
+ '(a1, a2, kw1=True, kw2=False)'
+
+ # test for methods
+ class H:
+ def foo1(self, b, *c):
+ pass
+
+ def foo2(b, *c):
+ pass
+
+ def foo3(self, d='\n'):
+ pass
+ assert formatsig('method', 'H.foo', H.foo1, None, None) == '(b, *c)'
+ assert formatsig('method', 'H.foo', H.foo1, 'a', None) == '(a)'
+ assert formatsig('method', 'H.foo', H.foo2, None, None) == '(*c)'
+ assert formatsig('method', 'H.foo', H.foo3, None, None) == r"(d='\n')"
+
+ # test bound methods interpreted as functions
+ assert formatsig('function', 'foo', H().foo1, None, None) == '(b, *c)'
+ assert formatsig('function', 'foo', H().foo2, None, None) == '(*c)'
+ assert formatsig('function', 'foo', H().foo3, None, None) == r"(d='\n')"
+
+ # test exception handling (exception is caught and args is '')
+ directive.env.config.autodoc_docstring_signature = False
+ assert formatsig('function', 'int', int, None, None) == ''
+
+ # test processing by event handler
+ assert formatsig('method', 'bar', H.foo1, None, None) == '42'
+
+ # test functions created via functools.partial
+ from functools import partial
+ curried1 = partial(lambda a, b, c: None, 'A')
+ assert formatsig('function', 'curried1', curried1, None, None) == \
+ '(b, c)'
+ curried2 = partial(lambda a, b, c=42: None, 'A')
+ assert formatsig('function', 'curried2', curried2, None, None) == \
+ '(b, c=42)'
+ curried3 = partial(lambda a, b, *c: None, 'A')
+ assert formatsig('function', 'curried3', curried3, None, None) == \
+ '(b, *c)'
+ curried4 = partial(lambda a, b, c=42, *d, **e: None, 'A')
+ assert formatsig('function', 'curried4', curried4, None, None) == \
+ '(b, c=42, *d, **e)'
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_process_signature_typing_generic(app):
+ actual = do_autodoc(app, 'class', 'target.generic_class.A', {})
+
+ assert list(actual) == [
+ '',
+ '.. py:class:: A(a, b=None)',
+ ' :module: target.generic_class',
+ '',
+ ' docstring for A',
+ '',
+ ]
+
+
+def test_autodoc_process_signature_typehints(app):
+ captured = []
+
+ def process_signature(*args):
+ captured.append(args)
+
+ app.connect('autodoc-process-signature', process_signature)
+
+ def func(x: int, y: int) -> int:
+ pass
+
+ directive = make_directive_bridge(app.env)
+ inst = app.registry.documenters['function'](directive, 'func')
+ inst.fullname = 'func'
+ inst.object = func
+ inst.objpath = ['func']
+ inst.format_signature()
+ assert captured == [(app, 'function', 'func', func,
+ directive.genopt, '(x: int, y: int)', 'int')]
+
+
+def test_get_doc(app):
+ directive = make_directive_bridge(app.env)
+
+ def getdocl(objtype, obj):
+ inst = app.registry.documenters[objtype](directive, 'tmp')
+ inst.parent = object # dummy
+ inst.object = obj
+ inst.objpath = [obj.__name__]
+ inst.doc_as_attr = False
+ inst.format_signature() # handle docstring signatures!
+ ds = inst.get_doc()
+ # for testing purposes, concat them and strip the empty line at the end
+ res = sum(ds, [])[:-1]
+ print(res)
+ return res
+
+ # objects without docstring
+ def f():
+ pass
+ assert getdocl('function', f) == []
+
+ # standard function, diverse docstring styles...
+ def f():
+ """Docstring"""
+ def g():
+ """
+ Docstring
+ """
+ for func in (f, g):
+ assert getdocl('function', func) == ['Docstring']
+
+ # first line vs. other lines indentation
+ def f():
+ """First line
+
+ Other
+ lines
+ """
+ assert getdocl('function', f) == ['First line', '', 'Other', ' lines']
+
+ # charset guessing (this module is encoded in utf-8)
+ def f():
+ """Döcstring"""
+ assert getdocl('function', f) == ['Döcstring']
+
+ # verify that method docstrings get extracted in both normal case
+ # and in case of bound method posing as a function
+ class J:
+ def foo(self):
+ """Method docstring"""
+ assert getdocl('method', J.foo) == ['Method docstring']
+ assert getdocl('function', J().foo) == ['Method docstring']
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_new_documenter(app):
+ class MyDocumenter(ModuleLevelDocumenter):
+ objtype = 'integer'
+ directivetype = 'integer'
+ priority = 100
+
+ @classmethod
+ def can_document_member(cls, member, membername, isattr, parent):
+ return isinstance(member, int)
+
+ def document_members(self, all_members=False):
+ return
+
+ app.add_autodocumenter(MyDocumenter)
+
+ options = {"members": 'integer'}
+ actual = do_autodoc(app, 'module', 'target', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target',
+ '',
+ '',
+ '.. py:integer:: integer',
+ ' :module: target',
+ '',
+ ' documentation for the integer',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_attrgetter_using(app):
+ directive = make_directive_bridge(app.env)
+ directive.genopt['members'] = ALL
+
+ directive.genopt['inherited_members'] = False
+ with catch_warnings(record=True):
+ _assert_getter_works(app, directive, 'class', 'target.Class', ['meth'])
+
+ directive.genopt['inherited_members'] = True
+ with catch_warnings(record=True):
+ _assert_getter_works(app, directive, 'class', 'target.inheritance.Derived', ['inheritedmeth'])
+
+
+def _assert_getter_works(app, directive, objtype, name, attrs=(), **kw):
+ getattr_spy = []
+
+ def _special_getattr(obj, attr_name, *defargs):
+ if attr_name in attrs:
+ getattr_spy.append((obj, attr_name))
+ return None
+ return getattr(obj, attr_name, *defargs)
+
+ app.add_autodoc_attrgetter(type, _special_getattr)
+
+ getattr_spy.clear()
+ app.registry.documenters[objtype](directive, name).generate(**kw)
+
+ hooked_members = {s[1] for s in getattr_spy}
+ documented_members = {s[1] for s in processed_signatures}
+ for attr in attrs:
+ fullname = '.'.join((name, attr))
+ assert attr in hooked_members
+ assert fullname not in documented_members, f'{fullname!r} not intercepted'
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_py_module(app, warning):
+ # without py:module
+ actual = do_autodoc(app, 'method', 'Class.meth')
+ assert list(actual) == []
+ assert ("don't know which module to import for autodocumenting 'Class.meth'"
+ in warning.getvalue())
+
+ # with py:module
+ app.env.ref_context['py:module'] = 'target'
+ warning.truncate(0)
+
+ actual = do_autodoc(app, 'method', 'Class.meth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Class.meth()',
+ ' :module: target',
+ '',
+ ' Function.',
+ '',
+ ]
+ assert ("don't know which module to import for autodocumenting 'Class.meth'"
+ not in warning.getvalue())
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_decorator(app):
+ actual = do_autodoc(app, 'decorator', 'target.decorator.deco1')
+ assert list(actual) == [
+ '',
+ '.. py:decorator:: deco1',
+ ' :module: target.decorator',
+ '',
+ ' docstring for deco1',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'decorator', 'target.decorator.deco2')
+ assert list(actual) == [
+ '',
+ '.. py:decorator:: deco2(condition, message)',
+ ' :module: target.decorator',
+ '',
+ ' docstring for deco2',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_exception(app):
+ actual = do_autodoc(app, 'exception', 'target.CustomEx')
+ assert list(actual) == [
+ '',
+ '.. py:exception:: CustomEx',
+ ' :module: target',
+ '',
+ ' My custom exception.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_warnings(app, warning):
+ app.env.temp_data['docname'] = 'dummy'
+
+ # can't import module
+ do_autodoc(app, 'module', 'unknown')
+ assert "failed to import module 'unknown'" in warning.getvalue()
+
+ # missing function
+ do_autodoc(app, 'function', 'unknown')
+ assert "import for autodocumenting 'unknown'" in warning.getvalue()
+
+ do_autodoc(app, 'function', 'target.unknown')
+ assert "failed to import function 'unknown' from module 'target'" in warning.getvalue()
+
+ # missing method
+ do_autodoc(app, 'method', 'target.Class.unknown')
+ assert "failed to import method 'Class.unknown' from module 'target'" in warning.getvalue()
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_attributes(app):
+ options = {"synopsis": 'Synopsis',
+ "platform": "Platform",
+ "deprecated": None}
+ actual = do_autodoc(app, 'module', 'target', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target',
+ ' :synopsis: Synopsis',
+ ' :platform: Platform',
+ ' :deprecated:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_members(app):
+ # default (no-members)
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base')
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ]
+
+ # default ALL-members
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ' .. py:method:: Base.inheritedmeth()',
+ ' .. py:method:: Base.inheritedstaticmeth(cls)',
+ ]
+
+ # default specific-members
+ options = {"members": "inheritedmeth,inheritedstaticmeth"}
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:method:: Base.inheritedmeth()',
+ ' .. py:method:: Base.inheritedstaticmeth(cls)',
+ ]
+
+ # ALL-members override autodoc_default_options
+ options = {"members": None}
+ app.config.autodoc_default_options["members"] = "inheritedstaticmeth"
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ' .. py:method:: Base.inheritedmeth()',
+ ' .. py:method:: Base.inheritedstaticmeth(cls)',
+ ]
+
+ # members override autodoc_default_options
+ options = {"members": "inheritedmeth"}
+ app.config.autodoc_default_options["members"] = "inheritedstaticmeth"
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:method:: Base.inheritedmeth()',
+ ]
+
+ # members extends autodoc_default_options
+ options = {"members": "+inheritedmeth"}
+ app.config.autodoc_default_options["members"] = "inheritedstaticmeth"
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:method:: Base.inheritedmeth()',
+ ' .. py:method:: Base.inheritedstaticmeth(cls)',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_exclude_members(app):
+ options = {"members": None,
+ "exclude-members": "inheritedmeth,inheritedstaticmeth"}
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ]
+
+ # members vs exclude-members
+ options = {"members": "inheritedmeth",
+ "exclude-members": "inheritedmeth"}
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ]
+
+ # + has no effect when autodoc_default_options are not present
+ options = {"members": None,
+ "exclude-members": "+inheritedmeth,inheritedstaticmeth"}
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ]
+
+ # exclude-members overrides autodoc_default_options
+ options = {"members": None,
+ "exclude-members": "inheritedmeth"}
+ app.config.autodoc_default_options["exclude-members"] = "inheritedstaticmeth"
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ' .. py:method:: Base.inheritedstaticmeth(cls)',
+ ]
+
+ # exclude-members extends autodoc_default_options
+ options = {"members": None,
+ "exclude-members": "+inheritedmeth"}
+ app.config.autodoc_default_options["exclude-members"] = "inheritedstaticmeth"
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ]
+
+ # no exclude-members causes use autodoc_default_options
+ options = {"members": None}
+ app.config.autodoc_default_options["exclude-members"] = "inheritedstaticmeth,inheritedmeth"
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ]
+
+ # empty exclude-members cancels autodoc_default_options
+ options = {"members": None,
+ "exclude-members": None}
+ app.config.autodoc_default_options["exclude-members"] = "inheritedstaticmeth,inheritedmeth"
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Base()',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ' .. py:method:: Base.inheritedmeth()',
+ ' .. py:method:: Base.inheritedstaticmeth(cls)',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_undoc_members(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:method:: Class.roger(a, *, b=2, c=3, d=4, e=5, f=6)',
+ ' .. py:attribute:: Class.skipattr',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:attribute:: Class.udocattr',
+ ' .. py:method:: Class.undocmeth()',
+ ]
+
+ # use autodoc_default_options
+ options = {"members": None}
+ app.config.autodoc_default_options["undoc-members"] = None
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:method:: Class.roger(a, *, b=2, c=3, d=4, e=5, f=6)',
+ ' .. py:attribute:: Class.skipattr',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:attribute:: Class.udocattr',
+ ' .. py:method:: Class.undocmeth()',
+ ]
+
+ # options negation work check
+ options = {"members": None,
+ "no-undoc-members": None}
+ app.config.autodoc_default_options["undoc-members"] = None
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:attribute:: Class.udocattr',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_undoc_members_for_metadata_only(app):
+ # metadata only member is not displayed
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.metadata', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.metadata',
+ '',
+ ]
+
+ # metadata only member is displayed when undoc-member given
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.metadata', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.metadata',
+ '',
+ '',
+ '.. py:function:: foo()',
+ ' :module: target.metadata',
+ '',
+ ' :meta metadata-only-docstring:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_inherited_members(app):
+ options = {"members": None,
+ "inherited-members": None}
+ actual = do_autodoc(app, 'class', 'target.inheritance.Derived', options)
+ assert list(filter(lambda l: 'method::' in l, actual)) == [
+ ' .. py:method:: Derived.inheritedclassmeth()',
+ ' .. py:method:: Derived.inheritedmeth()',
+ ' .. py:method:: Derived.inheritedstaticmeth(cls)',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_inherited_members_Base(app):
+ options = {"members": None,
+ "inherited-members": "Base",
+ "special-members": None}
+
+ # check methods for object class are shown
+ actual = do_autodoc(app, 'class', 'target.inheritance.Derived', options)
+ assert ' .. py:method:: Derived.inheritedmeth()' in actual
+ assert ' .. py:method:: Derived.inheritedclassmeth' not in actual
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_inherited_members_None(app):
+ options = {"members": None,
+ "inherited-members": "None",
+ "special-members": None}
+
+ # check methods for object class are shown
+ actual = do_autodoc(app, 'class', 'target.inheritance.Derived', options)
+ assert ' .. py:method:: Derived.__init__()' in actual
+ assert ' .. py:method:: Derived.__str__()' in actual
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_imported_members(app):
+ options = {"members": None,
+ "imported-members": None,
+ "ignore-module-all": None}
+ actual = do_autodoc(app, 'module', 'target', options)
+ assert '.. py:function:: function_to_be_imported(app: ~sphinx.application.Sphinx | None) -> str' in actual
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_special_members(app):
+ # specific special methods
+ options = {"undoc-members": None,
+ "special-members": "__init__,__special1__"}
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.__init__(arg)',
+ ' .. py:method:: Class.__special1__()',
+ ]
+
+ # combination with specific members
+ options = {"members": "attr,docattr",
+ "undoc-members": None,
+ "special-members": "__init__,__special1__"}
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.__init__(arg)',
+ ' .. py:method:: Class.__special1__()',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ]
+
+ # all special methods
+ options = {"members": None,
+ "undoc-members": None,
+ "special-members": None}
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:attribute:: Class.__annotations__',
+ ' .. py:attribute:: Class.__dict__',
+ ' .. py:method:: Class.__init__(arg)',
+ ' .. py:attribute:: Class.__module__',
+ ' .. py:method:: Class.__special1__()',
+ ' .. py:method:: Class.__special2__()',
+ ' .. py:attribute:: Class.__weakref__',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:method:: Class.roger(a, *, b=2, c=3, d=4, e=5, f=6)',
+ ' .. py:attribute:: Class.skipattr',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:attribute:: Class.udocattr',
+ ' .. py:method:: Class.undocmeth()',
+ ]
+
+ # specific special methods from autodoc_default_options
+ options = {"undoc-members": None}
+ app.config.autodoc_default_options["special-members"] = "__special2__"
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.__special2__()',
+ ]
+
+ # specific special methods option with autodoc_default_options
+ options = {"undoc-members": None,
+ "special-members": "__init__,__special1__"}
+ app.config.autodoc_default_options["special-members"] = "__special2__"
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.__init__(arg)',
+ ' .. py:method:: Class.__special1__()',
+ ]
+
+ # specific special methods merge with autodoc_default_options
+ options = {"undoc-members": None,
+ "special-members": "+__init__,__special1__"}
+ app.config.autodoc_default_options["special-members"] = "__special2__"
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.__init__(arg)',
+ ' .. py:method:: Class.__special1__()',
+ ' .. py:method:: Class.__special2__()',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_ignore_module_all(app):
+ # default (no-ignore-module-all)
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target', options)
+ assert list(filter(lambda l: 'class::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ]
+
+ # ignore-module-all
+ options = {"members": None,
+ "ignore-module-all": None}
+ actual = do_autodoc(app, 'module', 'target', options)
+ assert list(filter(lambda l: 'class::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ '.. py:class:: CustomDict',
+ '.. py:class:: InnerChild()',
+ '.. py:class:: InstAttCls()',
+ '.. py:class:: Outer()',
+ ' .. py:class:: Outer.Inner()',
+ '.. py:class:: StrRepr',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_noindex(app):
+ options = {"no-index": None}
+ actual = do_autodoc(app, 'module', 'target', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target',
+ ' :no-index:',
+ '',
+ ]
+
+ # TODO: :no-index: should be propagated to children of target item.
+
+ actual = do_autodoc(app, 'class', 'target.inheritance.Base', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Base()',
+ ' :no-index:',
+ ' :module: target.inheritance',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_subclass_of_builtin_class(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.CustomDict', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: CustomDict',
+ ' :module: target',
+ '',
+ ' Docstring.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_inner_class(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.Outer', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Outer()',
+ ' :module: target',
+ '',
+ ' Foo',
+ '',
+ '',
+ ' .. py:class:: Outer.Inner()',
+ ' :module: target',
+ '',
+ ' Foo',
+ '',
+ '',
+ ' .. py:method:: Outer.Inner.meth()',
+ ' :module: target',
+ '',
+ ' Foo',
+ '',
+ '',
+ ' .. py:attribute:: Outer.factory',
+ ' :module: target',
+ '',
+ ' alias of :py:class:`dict`',
+ ]
+
+ actual = do_autodoc(app, 'class', 'target.Outer.Inner', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Inner()',
+ ' :module: target.Outer',
+ '',
+ ' Foo',
+ '',
+ '',
+ ' .. py:method:: Inner.meth()',
+ ' :module: target.Outer',
+ '',
+ ' Foo',
+ '',
+ ]
+
+ options['show-inheritance'] = None
+ actual = do_autodoc(app, 'class', 'target.InnerChild', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: InnerChild()',
+ ' :module: target', '',
+ ' Bases: :py:class:`~target.Outer.Inner`',
+ '',
+ ' InnerChild docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_classmethod(app):
+ actual = do_autodoc(app, 'method', 'target.inheritance.Base.inheritedclassmeth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Base.inheritedclassmeth()',
+ ' :module: target.inheritance',
+ ' :classmethod:',
+ '',
+ ' Inherited class method.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_staticmethod(app):
+ actual = do_autodoc(app, 'method', 'target.inheritance.Base.inheritedstaticmeth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Base.inheritedstaticmeth(cls)',
+ ' :module: target.inheritance',
+ ' :staticmethod:',
+ '',
+ ' Inherited static method.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_descriptor(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.descriptor.Class', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Class()',
+ ' :module: target.descriptor',
+ '',
+ '',
+ ' .. py:attribute:: Class.descr',
+ ' :module: target.descriptor',
+ '',
+ ' Descriptor instance docstring.',
+ '',
+ '',
+ ' .. py:property:: Class.prop',
+ ' :module: target.descriptor',
+ '',
+ ' Property.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_cached_property(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.cached_property.Foo', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.cached_property',
+ '',
+ '',
+ ' .. py:property:: Foo.prop',
+ ' :module: target.cached_property',
+ ' :type: int',
+ '',
+ '',
+ ' .. py:property:: Foo.prop_with_type_comment',
+ ' :module: target.cached_property',
+ ' :type: int',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_member_order(app):
+ # case member-order='bysource'
+ options = {"members": None,
+ 'member-order': 'bysource',
+ "undoc-members": None,
+ 'private-members': None}
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.undocmeth()',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:attribute:: Class.skipattr',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:attribute:: Class.udocattr',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:method:: Class.roger(a, *, b=2, c=3, d=4, e=5, f=6)',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ' .. py:attribute:: Class._private_inst_attr',
+ ]
+
+ # case member-order='groupwise'
+ options = {"members": None,
+ 'member-order': 'groupwise',
+ "undoc-members": None,
+ 'private-members': None}
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:method:: Class.roger(a, *, b=2, c=3, d=4, e=5, f=6)',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:method:: Class.undocmeth()',
+ ' .. py:attribute:: Class._private_inst_attr',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:attribute:: Class.skipattr',
+ ' .. py:attribute:: Class.udocattr',
+ ]
+
+ # case member-order=None
+ options = {"members": None,
+ "undoc-members": None,
+ 'private-members': None}
+ actual = do_autodoc(app, 'class', 'target.Class', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:attribute:: Class._private_inst_attr',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:method:: Class.roger(a, *, b=2, c=3, d=4, e=5, f=6)',
+ ' .. py:attribute:: Class.skipattr',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:attribute:: Class.udocattr',
+ ' .. py:method:: Class.undocmeth()',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_module_member_order(app):
+ # case member-order='bysource'
+ options = {"members": 'foo, Bar, baz, qux, Quux, foobar',
+ 'member-order': 'bysource',
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.sort_by_all', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:module:: target.sort_by_all',
+ '.. py:function:: baz()',
+ '.. py:function:: foo()',
+ '.. py:class:: Bar()',
+ '.. py:class:: Quux()',
+ '.. py:function:: foobar()',
+ '.. py:function:: qux()',
+ ]
+
+ # case member-order='bysource' and ignore-module-all
+ options = {"members": 'foo, Bar, baz, qux, Quux, foobar',
+ 'member-order': 'bysource',
+ "undoc-members": None,
+ "ignore-module-all": None}
+ actual = do_autodoc(app, 'module', 'target.sort_by_all', options)
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:module:: target.sort_by_all',
+ '.. py:function:: foo()',
+ '.. py:class:: Bar()',
+ '.. py:function:: baz()',
+ '.. py:function:: qux()',
+ '.. py:class:: Quux()',
+ '.. py:function:: foobar()',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_module_scope(app):
+ app.env.temp_data['autodoc:module'] = 'target'
+ actual = do_autodoc(app, 'attribute', 'Class.mdocattr')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Class.mdocattr',
+ ' :module: target',
+ ' :value: <_io.StringIO object>',
+ '',
+ ' should be documented as well - süß',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_class_scope(app):
+ app.env.temp_data['autodoc:module'] = 'target'
+ app.env.temp_data['autodoc:class'] = 'Class'
+ actual = do_autodoc(app, 'attribute', 'mdocattr')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Class.mdocattr',
+ ' :module: target',
+ ' :value: <_io.StringIO object>',
+ '',
+ ' should be documented as well - süß',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_class_attributes(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.AttCls', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: AttCls()',
+ ' :module: target',
+ '',
+ '',
+ ' .. py:attribute:: AttCls.a1',
+ ' :module: target',
+ ' :value: hello world',
+ '',
+ '',
+ ' .. py:attribute:: AttCls.a2',
+ ' :module: target',
+ ' :value: None',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoclass_instance_attributes(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.InstAttCls', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: InstAttCls()',
+ ' :module: target',
+ '',
+ ' Class with documented class and instance attributes.',
+ '',
+ '',
+ ' .. py:attribute:: InstAttCls.ca1',
+ ' :module: target',
+ " :value: 'a'",
+ '',
+ ' Doc comment for class attribute InstAttCls.ca1.',
+ ' It can have multiple lines.',
+ '',
+ '',
+ ' .. py:attribute:: InstAttCls.ca2',
+ ' :module: target',
+ " :value: 'b'",
+ '',
+ ' Doc comment for InstAttCls.ca2. One line only.',
+ '',
+ '',
+ ' .. py:attribute:: InstAttCls.ca3',
+ ' :module: target',
+ " :value: 'c'",
+ '',
+ ' Docstring for class attribute InstAttCls.ca3.',
+ '',
+ '',
+ ' .. py:attribute:: InstAttCls.ia1',
+ ' :module: target',
+ '',
+ ' Doc comment for instance attribute InstAttCls.ia1',
+ '',
+ '',
+ ' .. py:attribute:: InstAttCls.ia2',
+ ' :module: target',
+ '',
+ ' Docstring for instance attribute InstAttCls.ia2.',
+ '',
+ ]
+
+ # pick up arbitrary attributes
+ options = {"members": 'ca1,ia1'}
+ actual = do_autodoc(app, 'class', 'target.InstAttCls', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: InstAttCls()',
+ ' :module: target',
+ '',
+ ' Class with documented class and instance attributes.',
+ '',
+ '',
+ ' .. py:attribute:: InstAttCls.ca1',
+ ' :module: target',
+ " :value: 'a'",
+ '',
+ ' Doc comment for class attribute InstAttCls.ca1.',
+ ' It can have multiple lines.',
+ '',
+ '',
+ ' .. py:attribute:: InstAttCls.ia1',
+ ' :module: target',
+ '',
+ ' Doc comment for instance attribute InstAttCls.ia1',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_instance_attributes(app):
+ actual = do_autodoc(app, 'attribute', 'target.InstAttCls.ia1')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: InstAttCls.ia1',
+ ' :module: target',
+ '',
+ ' Doc comment for instance attribute InstAttCls.ia1',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_slots(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.slots', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.slots',
+ '',
+ '',
+ '.. py:class:: Bar()',
+ ' :module: target.slots',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr1',
+ ' :module: target.slots',
+ ' :type: int',
+ '',
+ ' docstring of attr1',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr2',
+ ' :module: target.slots',
+ '',
+ ' docstring of instance attr2',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr3',
+ ' :module: target.slots',
+ '',
+ '',
+ '.. py:class:: Baz()',
+ ' :module: target.slots',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Baz.attr',
+ ' :module: target.slots',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.slots',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Foo.attr',
+ ' :module: target.slots',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_enum_class(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls', options)
+
+ if sys.version_info[:2] >= (3, 12):
+ args = ('(value, names=None, *values, module=None, '
+ 'qualname=None, type=None, start=1, boundary=None)')
+ elif sys.version_info[:2] >= (3, 11):
+ args = ('(value, names=None, *, module=None, qualname=None, '
+ 'type=None, start=1, boundary=None)')
+ else:
+ args = '(value)'
+
+ assert list(actual) == [
+ '',
+ '.. py:class:: EnumCls' + args,
+ ' :module: target.enums',
+ '',
+ ' this is enum class',
+ '',
+ '',
+ ' .. py:method:: EnumCls.say_goodbye()',
+ ' :module: target.enums',
+ ' :classmethod:',
+ '',
+ ' a classmethod says good-bye to you.',
+ '',
+ '',
+ ' .. py:method:: EnumCls.say_hello()',
+ ' :module: target.enums',
+ '',
+ ' a method says hello to you.',
+ '',
+ '',
+ ' .. py:attribute:: EnumCls.val1',
+ ' :module: target.enums',
+ ' :value: 12',
+ '',
+ ' doc for val1',
+ '',
+ '',
+ ' .. py:attribute:: EnumCls.val2',
+ ' :module: target.enums',
+ ' :value: 23',
+ '',
+ ' doc for val2',
+ '',
+ '',
+ ' .. py:attribute:: EnumCls.val3',
+ ' :module: target.enums',
+ ' :value: 34',
+ '',
+ ' doc for val3',
+ '',
+ ]
+
+ # checks for an attribute of EnumClass
+ actual = do_autodoc(app, 'attribute', 'target.enums.EnumCls.val1')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: EnumCls.val1',
+ ' :module: target.enums',
+ ' :value: 12',
+ '',
+ ' doc for val1',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_descriptor_class(app):
+ options = {"members": 'CustomDataDescriptor,CustomDataDescriptor2'}
+ actual = do_autodoc(app, 'module', 'target.descriptor', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.descriptor',
+ '',
+ '',
+ '.. py:class:: CustomDataDescriptor(doc)',
+ ' :module: target.descriptor',
+ '',
+ ' Descriptor class docstring.',
+ '',
+ '',
+ ' .. py:method:: CustomDataDescriptor.meth()',
+ ' :module: target.descriptor',
+ '',
+ ' Function.',
+ '',
+ '',
+ '.. py:class:: CustomDataDescriptor2(doc)',
+ ' :module: target.descriptor',
+ '',
+ ' Descriptor class with custom metaclass docstring.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_automethod_for_builtin(app):
+ actual = do_autodoc(app, 'method', 'builtins.int.__add__')
+ assert list(actual) == [
+ '',
+ '.. py:method:: int.__add__(value, /)',
+ ' :module: builtins',
+ '',
+ ' Return self+value.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_automethod_for_decorated(app):
+ actual = do_autodoc(app, 'method', 'target.decorator.Bar.meth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Bar.meth(name=None, age=None)',
+ ' :module: target.decorator',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_abstractmethods(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.abstractmethods', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.abstractmethods',
+ '',
+ '',
+ '.. py:class:: Base()',
+ ' :module: target.abstractmethods',
+ '',
+ '',
+ ' .. py:method:: Base.abstractmeth()',
+ ' :module: target.abstractmethods',
+ ' :abstractmethod:',
+ '',
+ '',
+ ' .. py:method:: Base.classmeth()',
+ ' :module: target.abstractmethods',
+ ' :abstractmethod:',
+ ' :classmethod:',
+ '',
+ '',
+ ' .. py:method:: Base.coroutinemeth()',
+ ' :module: target.abstractmethods',
+ ' :abstractmethod:',
+ ' :async:',
+ '',
+ '',
+ ' .. py:method:: Base.meth()',
+ ' :module: target.abstractmethods',
+ '',
+ '',
+ ' .. py:property:: Base.prop',
+ ' :module: target.abstractmethods',
+ ' :abstractmethod:',
+ '',
+ '',
+ ' .. py:method:: Base.staticmeth()',
+ ' :module: target.abstractmethods',
+ ' :abstractmethod:',
+ ' :staticmethod:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_partialfunction(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.partialfunction', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.partialfunction',
+ '',
+ '',
+ '.. py:function:: func1(a, b, c)',
+ ' :module: target.partialfunction',
+ '',
+ ' docstring of func1',
+ '',
+ '',
+ '.. py:function:: func2(b, c)',
+ ' :module: target.partialfunction',
+ '',
+ ' docstring of func1',
+ '',
+ '',
+ '.. py:function:: func3(c)',
+ ' :module: target.partialfunction',
+ '',
+ ' docstring of func3',
+ '',
+ '',
+ '.. py:function:: func4()',
+ ' :module: target.partialfunction',
+ '',
+ ' docstring of func3',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_imported_partialfunction_should_not_shown_without_imported_members(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.imported_members', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.imported_members',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_bound_method(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.bound_method', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.bound_method',
+ '',
+ '',
+ '.. py:function:: bound_method()',
+ ' :module: target.bound_method',
+ '',
+ ' Method docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_partialmethod(app):
+ expected = [
+ '',
+ '.. py:class:: Cell()',
+ ' :module: target.partialmethod',
+ '',
+ ' An example for partialmethod.',
+ '',
+ ' refs: https://docs.python.jp/3/library/functools.html#functools.partialmethod',
+ '',
+ '',
+ ' .. py:method:: Cell.set_alive()',
+ ' :module: target.partialmethod',
+ '',
+ ' Make a cell alive.',
+ '',
+ '',
+ ' .. py:method:: Cell.set_state(state)',
+ ' :module: target.partialmethod',
+ '',
+ ' Update state of cell to *state*.',
+ '',
+ ]
+
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.partialmethod.Cell', options)
+ assert list(actual) == expected
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_partialmethod_undoc_members(app):
+ expected = [
+ '',
+ '.. py:class:: Cell()',
+ ' :module: target.partialmethod',
+ '',
+ ' An example for partialmethod.',
+ '',
+ ' refs: https://docs.python.jp/3/library/functools.html#functools.partialmethod',
+ '',
+ '',
+ ' .. py:method:: Cell.set_alive()',
+ ' :module: target.partialmethod',
+ '',
+ ' Make a cell alive.',
+ '',
+ '',
+ ' .. py:method:: Cell.set_dead()',
+ ' :module: target.partialmethod',
+ '',
+ '',
+ ' .. py:method:: Cell.set_state(state)',
+ ' :module: target.partialmethod',
+ '',
+ ' Update state of cell to *state*.',
+ '',
+ ]
+
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.partialmethod.Cell', options)
+ assert list(actual) == expected
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_typed_instance_variables(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.typed_vars', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.typed_vars',
+ '',
+ '',
+ '.. py:attribute:: Alias',
+ ' :module: target.typed_vars',
+ '',
+ ' alias of :py:class:`~target.typed_vars.Derived`',
+ '',
+ '.. py:class:: Class()',
+ ' :module: target.typed_vars',
+ '',
+ '',
+ ' .. py:attribute:: Class.attr1',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ ' :value: 0',
+ '',
+ '',
+ ' .. py:attribute:: Class.attr2',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ '',
+ ' .. py:attribute:: Class.attr3',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ ' :value: 0',
+ '',
+ '',
+ ' .. py:attribute:: Class.attr4',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr4',
+ '',
+ '',
+ ' .. py:attribute:: Class.attr5',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr5',
+ '',
+ '',
+ ' .. py:attribute:: Class.attr6',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr6',
+ '',
+ '',
+ ' .. py:attribute:: Class.descr4',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' This is descr4',
+ '',
+ '',
+ '.. py:class:: Derived()',
+ ' :module: target.typed_vars',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr7',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ '',
+ '.. py:data:: attr1',
+ ' :module: target.typed_vars',
+ ' :type: str',
+ " :value: ''",
+ '',
+ ' attr1',
+ '',
+ '',
+ '.. py:data:: attr2',
+ ' :module: target.typed_vars',
+ ' :type: str',
+ '',
+ ' attr2',
+ '',
+ '',
+ '.. py:data:: attr3',
+ ' :module: target.typed_vars',
+ ' :type: str',
+ " :value: ''",
+ '',
+ ' attr3',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_typed_inherited_instance_variables(app):
+ options = {"members": None,
+ "undoc-members": None,
+ "inherited-members": None}
+ actual = do_autodoc(app, 'class', 'target.typed_vars.Derived', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Derived()',
+ ' :module: target.typed_vars',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr1',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ ' :value: 0',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr2',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr3',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ ' :value: 0',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr4',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr4',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr5',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr5',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr6',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr6',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr7',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ '',
+ ' .. py:attribute:: Derived.descr4',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_GenericAlias(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.genericalias', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.genericalias',
+ '',
+ '',
+ '.. py:class:: Class()',
+ ' :module: target.genericalias',
+ '',
+ '',
+ ' .. py:attribute:: Class.T',
+ ' :module: target.genericalias',
+ '',
+ ' A list of int',
+ '',
+ ' alias of :py:class:`~typing.List`\\ [:py:class:`int`]',
+ '',
+ '',
+ '.. py:data:: L',
+ ' :module: target.genericalias',
+ '',
+ ' A list of Class',
+ '',
+ ' alias of :py:class:`~typing.List`\\ '
+ '[:py:class:`~target.genericalias.Class`]',
+ '',
+ '',
+ '.. py:data:: T',
+ ' :module: target.genericalias',
+ '',
+ ' A list of int',
+ '',
+ ' alias of :py:class:`~typing.List`\\ [:py:class:`int`]',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_TypeVar(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.typevar', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.typevar',
+ '',
+ '',
+ '.. py:class:: Class()',
+ ' :module: target.typevar',
+ '',
+ '',
+ ' .. py:class:: Class.T1',
+ ' :module: target.typevar',
+ '',
+ ' T1',
+ '',
+ " alias of TypeVar('T1')",
+ '',
+ '',
+ ' .. py:class:: Class.T6',
+ ' :module: target.typevar',
+ '',
+ ' T6',
+ '',
+ ' alias of :py:class:`~datetime.date`',
+ '',
+ '',
+ '.. py:class:: T1',
+ ' :module: target.typevar',
+ '',
+ ' T1',
+ '',
+ " alias of TypeVar('T1')",
+ '',
+ '',
+ '.. py:class:: T3',
+ ' :module: target.typevar',
+ '',
+ ' T3',
+ '',
+ " alias of TypeVar('T3', int, str)",
+ '',
+ '',
+ '.. py:class:: T4',
+ ' :module: target.typevar',
+ '',
+ ' T4',
+ '',
+ " alias of TypeVar('T4', covariant=True)",
+ '',
+ '',
+ '.. py:class:: T5',
+ ' :module: target.typevar',
+ '',
+ ' T5',
+ '',
+ " alias of TypeVar('T5', contravariant=True)",
+ '',
+ '',
+ '.. py:class:: T6',
+ ' :module: target.typevar',
+ '',
+ ' T6',
+ '',
+ ' alias of :py:class:`~datetime.date`',
+ '',
+ '',
+ '.. py:class:: T7',
+ ' :module: target.typevar',
+ '',
+ ' T7',
+ '',
+ " alias of TypeVar('T7', bound=\\ :py:class:`int`)",
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_Annotated(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.annotated', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.annotated',
+ '',
+ '',
+ '.. py:function:: hello(name: str) -> None',
+ ' :module: target.annotated',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_TYPE_CHECKING(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.TYPE_CHECKING', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.TYPE_CHECKING',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.TYPE_CHECKING',
+ '',
+ '',
+ ' .. py:attribute:: Foo.attr1',
+ ' :module: target.TYPE_CHECKING',
+ ' :type: ~_io.StringIO',
+ '',
+ '',
+ '.. py:function:: spam(ham: ~collections.abc.Iterable[str]) -> tuple[~gettext.NullTranslations, bool]',
+ ' :module: target.TYPE_CHECKING',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_TYPE_CHECKING_circular_import(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'circular_import', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: circular_import',
+ '',
+ ]
+ assert sys.modules["circular_import"].a is sys.modules["circular_import.a"]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_singledispatch(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.singledispatch', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.singledispatch',
+ '',
+ '',
+ '.. py:function:: func(arg, kwarg=None)',
+ ' func(arg: float, kwarg=None)',
+ ' func(arg: int, kwarg=None)',
+ ' func(arg: str, kwarg=None)',
+ ' func(arg: dict, kwarg=None)',
+ ' :module: target.singledispatch',
+ '',
+ ' A function for general use.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_singledispatchmethod(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.singledispatchmethod', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.singledispatchmethod',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.singledispatchmethod',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Foo.meth(arg, kwarg=None)',
+ ' Foo.meth(arg: float, kwarg=None)',
+ ' Foo.meth(arg: int, kwarg=None)',
+ ' Foo.meth(arg: str, kwarg=None)',
+ ' Foo.meth(arg: dict, kwarg=None)',
+ ' :module: target.singledispatchmethod',
+ '',
+ ' A method for general use.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_singledispatchmethod_automethod(app):
+ options = {}
+ actual = do_autodoc(app, 'method', 'target.singledispatchmethod.Foo.meth', options)
+ assert list(actual) == [
+ '',
+ '.. py:method:: Foo.meth(arg, kwarg=None)',
+ ' Foo.meth(arg: float, kwarg=None)',
+ ' Foo.meth(arg: int, kwarg=None)',
+ ' Foo.meth(arg: str, kwarg=None)',
+ ' Foo.meth(arg: dict, kwarg=None)',
+ ' :module: target.singledispatchmethod',
+ '',
+ ' A method for general use.',
+ '',
+ ]
+
+
+@pytest.mark.skipif(sys.version_info[:2] >= (3, 13),
+ reason='Cython does not support Python 3.13 yet.')
+@pytest.mark.skipif(pyximport is None, reason='cython is not installed')
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_cython(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.cython', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.cython',
+ '',
+ '',
+ '.. py:class:: Class()',
+ ' :module: target.cython',
+ '',
+ ' Docstring.',
+ '',
+ '',
+ ' .. py:method:: Class.meth(name: str, age: int = 0) -> None',
+ ' :module: target.cython',
+ '',
+ ' Docstring.',
+ '',
+ '',
+ '.. py:function:: foo(x: int, *args, y: str, **kwargs)',
+ ' :module: target.cython',
+ '',
+ ' Docstring.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_final(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.final', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.final',
+ '',
+ '',
+ '.. py:class:: Class()',
+ ' :module: target.final',
+ ' :final:',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Class.meth1()',
+ ' :module: target.final',
+ ' :final:',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Class.meth2()',
+ ' :module: target.final',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_overload(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.overload', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.overload',
+ '',
+ '',
+ '.. py:class:: Bar(x: int, y: int)',
+ ' Bar(x: str, y: str)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Baz(x: int, y: int)',
+ ' Baz(x: str, y: str)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Foo(x: int, y: int)',
+ ' Foo(x: str, y: str)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Math()',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Math.sum(x: int, y: int = 0) -> int',
+ ' Math.sum(x: float, y: float = 0.0) -> float',
+ ' Math.sum(x: str, y: str = None) -> str',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: sum(x: int, y: int = 0) -> int',
+ ' sum(x: float, y: float = 0.0) -> float',
+ ' sum(x: str, y: str = None) -> str',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_overload2(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.overload2', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.overload2',
+ '',
+ '',
+ '.. py:class:: Baz(x: int, y: int)',
+ ' Baz(x: str, y: str)',
+ ' :module: target.overload2',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_pymodule_for_ModuleLevelDocumenter(app):
+ app.env.ref_context['py:module'] = 'target.classes'
+ actual = do_autodoc(app, 'class', 'Foo')
+ assert list(actual) == [
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.classes',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_pymodule_for_ClassLevelDocumenter(app):
+ app.env.ref_context['py:module'] = 'target.methods'
+ actual = do_autodoc(app, 'method', 'Base.meth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Base.meth()',
+ ' :module: target.methods',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_pyclass_for_ClassLevelDocumenter(app):
+ app.env.ref_context['py:module'] = 'target.methods'
+ app.env.ref_context['py:class'] = 'Base'
+ actual = do_autodoc(app, 'method', 'meth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Base.meth()',
+ ' :module: target.methods',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autodoc')
+def test_autodoc(app, status, warning):
+ app.builder.build_all()
+
+ content = app.env.get_doctree('index')
+ assert isinstance(content[3], addnodes.desc)
+ assert content[3][0].astext() == 'autodoc_dummy_module.test()'
+ assert content[3][1].astext() == 'Dummy function using dummy.*'
+
+ # issue sphinx-doc/sphinx#2437
+ assert content[11][-1].astext() == """Dummy class Bar with alias.
+
+
+
+my_name
+
+alias of Foo"""
+ assert warning.getvalue() == ''
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_name_conflict(app):
+ actual = do_autodoc(app, 'class', 'target.name_conflict.foo')
+ assert list(actual) == [
+ '',
+ '.. py:class:: foo()',
+ ' :module: target.name_conflict',
+ '',
+ ' docstring of target.name_conflict::foo.',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'class', 'target.name_conflict.foo.bar')
+ assert list(actual) == [
+ '',
+ '.. py:class:: bar()',
+ ' :module: target.name_conflict.foo',
+ '',
+ ' docstring of target.name_conflict.foo::bar.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_name_mangling(app):
+ options = {"members": None,
+ "undoc-members": None,
+ "private-members": None}
+ actual = do_autodoc(app, 'module', 'target.name_mangling', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.name_mangling',
+ '',
+ '',
+ '.. py:class:: Bar()',
+ ' :module: target.name_mangling',
+ '',
+ '',
+ ' .. py:attribute:: Bar._Baz__email',
+ ' :module: target.name_mangling',
+ ' :value: None',
+ '',
+ ' a member having mangled-like name',
+ '',
+ '',
+ ' .. py:attribute:: Bar.__address',
+ ' :module: target.name_mangling',
+ ' :value: None',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.name_mangling',
+ '',
+ '',
+ ' .. py:attribute:: Foo.__age',
+ ' :module: target.name_mangling',
+ ' :value: None',
+ '',
+ '',
+ ' .. py:attribute:: Foo.__name',
+ ' :module: target.name_mangling',
+ ' :value: None',
+ '',
+ ' name of Foo',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_type_union_operator(app):
+ options = {'members': None}
+ actual = do_autodoc(app, 'module', 'target.pep604', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.pep604',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.pep604',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Foo.attr',
+ ' :module: target.pep604',
+ ' :type: int | str',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Foo.meth(x: int | str, y: int | str) -> int | str',
+ ' :module: target.pep604',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: attr',
+ ' :module: target.pep604',
+ ' :type: int | str',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: sum(x: int | str, y: int | str) -> int | str',
+ ' :module: target.pep604',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_hide_value(app):
+ options = {'members': None}
+ actual = do_autodoc(app, 'module', 'target.hide_value', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.hide_value',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.hide_value',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Foo.SENTINEL1',
+ ' :module: target.hide_value',
+ '',
+ ' docstring',
+ '',
+ ' :meta hide-value:',
+ '',
+ '',
+ ' .. py:attribute:: Foo.SENTINEL2',
+ ' :module: target.hide_value',
+ '',
+ ' :meta hide-value:',
+ '',
+ '',
+ '.. py:data:: SENTINEL1',
+ ' :module: target.hide_value',
+ '',
+ ' docstring',
+ '',
+ ' :meta hide-value:',
+ '',
+ '',
+ '.. py:data:: SENTINEL2',
+ ' :module: target.hide_value',
+ '',
+ ' :meta hide-value:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_canonical(app):
+ options = {'members': None,
+ 'imported-members': None}
+ actual = do_autodoc(app, 'module', 'target.canonical', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.canonical',
+ '',
+ '',
+ '.. py:class:: Bar()',
+ ' :module: target.canonical',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.canonical',
+ ' :canonical: target.canonical.original.Foo',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Foo.meth()',
+ ' :module: target.canonical',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_literal_render(app):
+ def bounded_typevar_rst(name, bound):
+ return [
+ '',
+ f'.. py:class:: {name}',
+ ' :module: target.literal',
+ '',
+ ' docstring',
+ '',
+ f' alias of TypeVar({name!r}, bound={bound})',
+ '',
+ ]
+
+ def function_rst(name, sig):
+ return [
+ '',
+ f'.. py:function:: {name}({sig})',
+ ' :module: target.literal',
+ '',
+ ' docstring',
+ '',
+ ]
+
+ # autodoc_typehints_format can take 'short' or 'fully-qualified' values
+ # and this will be interpreted as 'smart' or 'fully-qualified-except-typing' by restify()
+ # and 'smart' or 'fully-qualified' by stringify_annotation().
+
+ options = {'members': None, 'exclude-members': 'MyEnum'}
+ app.config.autodoc_typehints_format = 'short'
+ actual = do_autodoc(app, 'module', 'target.literal', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.literal',
+ '',
+ *bounded_typevar_rst('T', r'\ :py:obj:`~typing.Literal`\ [1234]'),
+ *bounded_typevar_rst('U', r'\ :py:obj:`~typing.Literal`\ [:py:attr:`~target.literal.MyEnum.a`]'),
+ *function_rst('bar', 'x: ~typing.Literal[1234]'),
+ *function_rst('foo', 'x: ~typing.Literal[MyEnum.a]'),
+ ]
+
+ # restify() assumes that 'fully-qualified' is 'fully-qualified-except-typing'
+ # because it is more likely that a user wants to suppress 'typing.*'
+ app.config.autodoc_typehints_format = 'fully-qualified'
+ actual = do_autodoc(app, 'module', 'target.literal', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.literal',
+ '',
+ *bounded_typevar_rst('T', r'\ :py:obj:`~typing.Literal`\ [1234]'),
+ *bounded_typevar_rst('U', r'\ :py:obj:`~typing.Literal`\ [:py:attr:`target.literal.MyEnum.a`]'),
+ *function_rst('bar', 'x: typing.Literal[1234]'),
+ *function_rst('foo', 'x: typing.Literal[target.literal.MyEnum.a]'),
+ ]
diff --git a/tests/test_ext_autodoc_autoattribute.py b/tests/test_ext_autodoc_autoattribute.py
new file mode 100644
index 0000000..0424af0
--- /dev/null
+++ b/tests/test_ext_autodoc_autoattribute.py
@@ -0,0 +1,176 @@
+"""Test the autodoc extension.
+
+This tests mainly the Documenters; the auto directives are tested in a test
+source file translated by test_build.
+"""
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute(app):
+ actual = do_autodoc(app, 'attribute', 'target.Class.attr')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Class.attr',
+ ' :module: target',
+ " :value: 'bar'",
+ '',
+ ' should be documented -- süß',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_novalue(app):
+ options = {'no-value': None}
+ actual = do_autodoc(app, 'attribute', 'target.Class.attr', options)
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Class.attr',
+ ' :module: target',
+ '',
+ ' should be documented -- süß',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_typed_variable(app):
+ actual = do_autodoc(app, 'attribute', 'target.typed_vars.Class.attr2')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Class.attr2',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_typed_variable_in_alias(app):
+ actual = do_autodoc(app, 'attribute', 'target.typed_vars.Alias.attr2')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Alias.attr2',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_instance_variable(app):
+ actual = do_autodoc(app, 'attribute', 'target.typed_vars.Class.attr4')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Class.attr4',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr4',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_instance_variable_in_alias(app):
+ actual = do_autodoc(app, 'attribute', 'target.typed_vars.Alias.attr4')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Alias.attr4',
+ ' :module: target.typed_vars',
+ ' :type: int',
+ '',
+ ' attr4',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_instance_variable_without_comment(app):
+ actual = do_autodoc(app, 'attribute', 'target.instance_variable.Bar.attr4')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Bar.attr4',
+ ' :module: target.instance_variable',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_slots_variable_list(app):
+ actual = do_autodoc(app, 'attribute', 'target.slots.Foo.attr')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Foo.attr',
+ ' :module: target.slots',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_slots_variable_dict(app):
+ actual = do_autodoc(app, 'attribute', 'target.slots.Bar.attr1')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Bar.attr1',
+ ' :module: target.slots',
+ ' :type: int',
+ '',
+ ' docstring of attr1',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_slots_variable_str(app):
+ actual = do_autodoc(app, 'attribute', 'target.slots.Baz.attr')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Baz.attr',
+ ' :module: target.slots',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_GenericAlias(app):
+ actual = do_autodoc(app, 'attribute', 'target.genericalias.Class.T')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Class.T',
+ ' :module: target.genericalias',
+ '',
+ ' A list of int',
+ '',
+ ' alias of :py:class:`~typing.List`\\ [:py:class:`int`]',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_hide_value(app):
+ actual = do_autodoc(app, 'attribute', 'target.hide_value.Foo.SENTINEL1')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Foo.SENTINEL1',
+ ' :module: target.hide_value',
+ '',
+ ' docstring',
+ '',
+ ' :meta hide-value:',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'attribute', 'target.hide_value.Foo.SENTINEL2')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Foo.SENTINEL2',
+ ' :module: target.hide_value',
+ '',
+ ' :meta hide-value:',
+ '',
+ ]
diff --git a/tests/test_ext_autodoc_autoclass.py b/tests/test_ext_autodoc_autoclass.py
new file mode 100644
index 0000000..92c259a
--- /dev/null
+++ b/tests/test_ext_autodoc_autoclass.py
@@ -0,0 +1,517 @@
+"""Test the autodoc extension.
+
+This tests mainly the Documenters; the auto directives are tested in a test
+source file translated by test_build.
+"""
+
+from __future__ import annotations
+
+import typing
+from typing import Union
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_classes(app):
+ actual = do_autodoc(app, 'function', 'target.classes.Foo')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Foo()',
+ ' :module: target.classes',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'function', 'target.classes.Bar')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Bar(x, y)',
+ ' :module: target.classes',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'function', 'target.classes.Baz')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Baz(x, y)',
+ ' :module: target.classes',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'function', 'target.classes.Qux')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Qux(foo, bar)',
+ ' :module: target.classes',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_instance_variable(app):
+ options = {'members': None}
+ actual = do_autodoc(app, 'class', 'target.instance_variable.Bar', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Bar()',
+ ' :module: target.instance_variable',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr2',
+ ' :module: target.instance_variable',
+ '',
+ ' docstring bar',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr3',
+ ' :module: target.instance_variable',
+ '',
+ ' docstring bar',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_inherited_instance_variable(app):
+ options = {'members': None,
+ 'inherited-members': None}
+ actual = do_autodoc(app, 'class', 'target.instance_variable.Bar', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Bar()',
+ ' :module: target.instance_variable',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr1',
+ ' :module: target.instance_variable',
+ '',
+ ' docstring foo',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr2',
+ ' :module: target.instance_variable',
+ '',
+ ' docstring bar',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr3',
+ ' :module: target.instance_variable',
+ '',
+ ' docstring bar',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_uninitialized_attributes(app):
+ options = {"members": None,
+ "inherited-members": None}
+ actual = do_autodoc(app, 'class', 'target.uninitialized_attributes.Derived', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Derived()',
+ ' :module: target.uninitialized_attributes',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr1',
+ ' :module: target.uninitialized_attributes',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr3',
+ ' :module: target.uninitialized_attributes',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_undocumented_uninitialized_attributes(app):
+ options = {"members": None,
+ "inherited-members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.uninitialized_attributes.Derived', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Derived()',
+ ' :module: target.uninitialized_attributes',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr1',
+ ' :module: target.uninitialized_attributes',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr2',
+ ' :module: target.uninitialized_attributes',
+ ' :type: str',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr3',
+ ' :module: target.uninitialized_attributes',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Derived.attr4',
+ ' :module: target.uninitialized_attributes',
+ ' :type: str',
+ '',
+ ]
+
+
+def test_decorators(app):
+ actual = do_autodoc(app, 'class', 'target.decorator.Baz')
+ assert list(actual) == [
+ '',
+ '.. py:class:: Baz(name=None, age=None)',
+ ' :module: target.decorator',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'class', 'target.decorator.Qux')
+ assert list(actual) == [
+ '',
+ '.. py:class:: Qux(name=None, age=None)',
+ ' :module: target.decorator',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'class', 'target.decorator.Quux')
+ assert list(actual) == [
+ '',
+ '.. py:class:: Quux(name=None, age=None)',
+ ' :module: target.decorator',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_properties(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.properties.Foo', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.properties',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: Foo.prop1',
+ ' :module: target.properties',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: Foo.prop1_with_type_comment',
+ ' :module: target.properties',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: Foo.prop2',
+ ' :module: target.properties',
+ ' :classmethod:',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: Foo.prop2_with_type_comment',
+ ' :module: target.properties',
+ ' :classmethod:',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_slots_attribute(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.slots.Bar', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Bar()',
+ ' :module: target.slots',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr1',
+ ' :module: target.slots',
+ ' :type: int',
+ '',
+ ' docstring of attr1',
+ '',
+ '',
+ ' .. py:attribute:: Bar.attr2',
+ ' :module: target.slots',
+ '',
+ ' docstring of instance attr2',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_show_inheritance_for_subclass_of_generic_type(app):
+ options = {'show-inheritance': None}
+ actual = do_autodoc(app, 'class', 'target.classes.Quux', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Quux(iterable=(), /)',
+ ' :module: target.classes',
+ '',
+ ' Bases: :py:class:`~typing.List`\\ '
+ '[:py:obj:`~typing.Union`\\ [:py:class:`int`, :py:class:`float`]]',
+ '',
+ ' A subclass of List[Union[int, float]]',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_show_inheritance_for_decendants_of_generic_type(app):
+ options = {'show-inheritance': None}
+ actual = do_autodoc(app, 'class', 'target.classes.Corge', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Corge(iterable=(), /)',
+ ' :module: target.classes',
+ '',
+ ' Bases: :py:class:`~target.classes.Quux`',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_process_bases(app):
+ def autodoc_process_bases(app, name, obj, options, bases):
+ assert name == 'target.classes.Quux'
+ assert obj.__module__ == 'target.classes'
+ assert obj.__name__ == 'Quux'
+ assert options == {'show-inheritance': True,
+ 'members': []}
+ assert bases == [typing.List[Union[int, float]]] # NoQA: UP006
+
+ bases.pop()
+ bases.extend([int, str])
+
+ app.connect('autodoc-process-bases', autodoc_process_bases)
+
+ options = {'show-inheritance': None}
+ actual = do_autodoc(app, 'class', 'target.classes.Quux', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Quux(iterable=(), /)',
+ ' :module: target.classes',
+ '',
+ ' Bases: :py:class:`int`, :py:class:`str`',
+ '',
+ ' A subclass of List[Union[int, float]]',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_class_doc_from_class(app):
+ options = {"members": None,
+ "class-doc-from": "class"}
+ actual = do_autodoc(app, 'class', 'target.autoclass_content.C', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: C()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having __init__, no __new__',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_class_doc_from_init(app):
+ options = {"members": None,
+ "class-doc-from": "init"}
+ actual = do_autodoc(app, 'class', 'target.autoclass_content.C', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: C()',
+ ' :module: target.autoclass_content',
+ '',
+ ' __init__ docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_class_doc_from_both(app):
+ options = {"members": None,
+ "class-doc-from": "both"}
+ actual = do_autodoc(app, 'class', 'target.autoclass_content.C', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: C()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having __init__, no __new__',
+ '',
+ ' __init__ docstring',
+ '',
+ ]
+
+
+def test_class_alias(app):
+ def autodoc_process_docstring(*args):
+ """A handler always raises an error.
+ This confirms this handler is never called for class aliases.
+ """
+ raise
+
+ app.connect('autodoc-process-docstring', autodoc_process_docstring)
+ actual = do_autodoc(app, 'class', 'target.classes.Alias')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Alias',
+ ' :module: target.classes',
+ '',
+ ' alias of :py:class:`~target.classes.Foo`',
+ ]
+
+
+def test_class_alias_having_doccomment(app):
+ actual = do_autodoc(app, 'class', 'target.classes.OtherAlias')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: OtherAlias',
+ ' :module: target.classes',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+def test_class_alias_for_imported_object_having_doccomment(app):
+ actual = do_autodoc(app, 'class', 'target.classes.IntAlias')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: IntAlias',
+ ' :module: target.classes',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_coroutine(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.coroutine.AsyncClass', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: AsyncClass()',
+ ' :module: target.coroutine',
+ '',
+ '',
+ ' .. py:method:: AsyncClass.do_asyncgen()',
+ ' :module: target.coroutine',
+ ' :async:',
+ '',
+ ' A documented async generator',
+ '',
+ '',
+ ' .. py:method:: AsyncClass.do_coroutine()',
+ ' :module: target.coroutine',
+ ' :async:',
+ '',
+ ' A documented coroutine function',
+ '',
+ '',
+ ' .. py:method:: AsyncClass.do_coroutine2()',
+ ' :module: target.coroutine',
+ ' :async:',
+ ' :classmethod:',
+ '',
+ ' A documented coroutine classmethod',
+ '',
+ '',
+ ' .. py:method:: AsyncClass.do_coroutine3()',
+ ' :module: target.coroutine',
+ ' :async:',
+ ' :staticmethod:',
+ '',
+ ' A documented coroutine staticmethod',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata_NewType_module_level(app):
+ actual = do_autodoc(app, 'class', 'target.typevar.T6')
+ assert list(actual) == [
+ '',
+ '.. py:class:: T6',
+ ' :module: target.typevar',
+ '',
+ ' T6',
+ '',
+ ' alias of :py:class:`~datetime.date`',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_NewType_class_level(app):
+ actual = do_autodoc(app, 'class', 'target.typevar.Class.T6')
+ assert list(actual) == [
+ '',
+ '.. py:class:: Class.T6',
+ ' :module: target.typevar',
+ '',
+ ' T6',
+ '',
+ ' alias of :py:class:`~datetime.date`',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata_TypeVar_class_level(app):
+ actual = do_autodoc(app, 'class', 'target.typevar.T1')
+ assert list(actual) == [
+ '',
+ '.. py:class:: T1',
+ ' :module: target.typevar',
+ '',
+ ' T1',
+ '',
+ " alias of TypeVar('T1')",
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoattribute_TypeVar_module_level(app):
+ actual = do_autodoc(app, 'class', 'target.typevar.Class.T1')
+ assert list(actual) == [
+ '',
+ '.. py:class:: Class.T1',
+ ' :module: target.typevar',
+ '',
+ ' T1',
+ '',
+ " alias of TypeVar('T1')",
+ '',
+ ]
diff --git a/tests/test_ext_autodoc_autodata.py b/tests/test_ext_autodoc_autodata.py
new file mode 100644
index 0000000..83647d9
--- /dev/null
+++ b/tests/test_ext_autodoc_autodata.py
@@ -0,0 +1,106 @@
+"""Test the autodoc extension.
+
+This tests mainly the Documenters; the auto directives are tested in a test
+source file translated by test_build.
+"""
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata(app):
+ actual = do_autodoc(app, 'data', 'target.integer')
+ assert list(actual) == [
+ '',
+ '.. py:data:: integer',
+ ' :module: target',
+ ' :value: 1',
+ '',
+ ' documentation for the integer',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata_novalue(app):
+ options = {'no-value': None}
+ actual = do_autodoc(app, 'data', 'target.integer', options)
+ assert list(actual) == [
+ '',
+ '.. py:data:: integer',
+ ' :module: target',
+ '',
+ ' documentation for the integer',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata_typed_variable(app):
+ actual = do_autodoc(app, 'data', 'target.typed_vars.attr2')
+ assert list(actual) == [
+ '',
+ '.. py:data:: attr2',
+ ' :module: target.typed_vars',
+ ' :type: str',
+ '',
+ ' attr2',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata_type_comment(app):
+ actual = do_autodoc(app, 'data', 'target.typed_vars.attr3')
+ assert list(actual) == [
+ '',
+ '.. py:data:: attr3',
+ ' :module: target.typed_vars',
+ ' :type: str',
+ " :value: ''",
+ '',
+ ' attr3',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata_GenericAlias(app):
+ actual = do_autodoc(app, 'data', 'target.genericalias.T')
+ assert list(actual) == [
+ '',
+ '.. py:data:: T',
+ ' :module: target.genericalias',
+ '',
+ ' A list of int',
+ '',
+ ' alias of :py:class:`~typing.List`\\ [:py:class:`int`]',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodata_hide_value(app):
+ actual = do_autodoc(app, 'data', 'target.hide_value.SENTINEL1')
+ assert list(actual) == [
+ '',
+ '.. py:data:: SENTINEL1',
+ ' :module: target.hide_value',
+ '',
+ ' docstring',
+ '',
+ ' :meta hide-value:',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'data', 'target.hide_value.SENTINEL2')
+ assert list(actual) == [
+ '',
+ '.. py:data:: SENTINEL2',
+ ' :module: target.hide_value',
+ '',
+ ' :meta hide-value:',
+ '',
+ ]
diff --git a/tests/test_ext_autodoc_autofunction.py b/tests/test_ext_autodoc_autofunction.py
new file mode 100644
index 0000000..b0cd7d9
--- /dev/null
+++ b/tests/test_ext_autodoc_autofunction.py
@@ -0,0 +1,201 @@
+"""Test the autodoc extension.
+
+This tests mainly the Documenters; the auto directives are tested in a test
+source file translated by test_build.
+"""
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_classes(app):
+ actual = do_autodoc(app, 'function', 'target.classes.Foo')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Foo()',
+ ' :module: target.classes',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'function', 'target.classes.Bar')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Bar(x, y)',
+ ' :module: target.classes',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'function', 'target.classes.Baz')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Baz(x, y)',
+ ' :module: target.classes',
+ '',
+ ]
+
+ actual = do_autodoc(app, 'function', 'target.classes.Qux')
+ assert list(actual) == [
+ '',
+ '.. py:function:: Qux(foo, bar)',
+ ' :module: target.classes',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_callable(app):
+ actual = do_autodoc(app, 'function', 'target.callable.function')
+ assert list(actual) == [
+ '',
+ '.. py:function:: function(arg1, arg2, **kwargs)',
+ ' :module: target.callable',
+ '',
+ ' A callable object that behaves like a function.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_method(app):
+ actual = do_autodoc(app, 'function', 'target.callable.method')
+ assert list(actual) == [
+ '',
+ '.. py:function:: method(arg1, arg2)',
+ ' :module: target.callable',
+ '',
+ ' docstring of Callable.method().',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_builtin_function(app):
+ actual = do_autodoc(app, 'function', 'os.umask')
+ assert list(actual) == [
+ '',
+ '.. py:function:: umask(mask, /)',
+ ' :module: os',
+ '',
+ ' Set the current numeric umask and return the previous umask.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_methoddescriptor(app):
+ actual = do_autodoc(app, 'function', 'builtins.int.__add__')
+ assert list(actual) == [
+ '',
+ '.. py:function:: __add__(self, value, /)',
+ ' :module: builtins.int',
+ '',
+ ' Return self+value.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_decorated(app):
+ actual = do_autodoc(app, 'function', 'target.decorator.foo')
+ assert list(actual) == [
+ '',
+ '.. py:function:: foo(name=None, age=None)',
+ ' :module: target.decorator',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_singledispatch(app):
+ options = {}
+ actual = do_autodoc(app, 'function', 'target.singledispatch.func', options)
+ assert list(actual) == [
+ '',
+ '.. py:function:: func(arg, kwarg=None)',
+ ' func(arg: float, kwarg=None)',
+ ' func(arg: int, kwarg=None)',
+ ' func(arg: str, kwarg=None)',
+ ' func(arg: dict, kwarg=None)',
+ ' :module: target.singledispatch',
+ '',
+ ' A function for general use.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_cfunction(app):
+ actual = do_autodoc(app, 'function', 'time.asctime')
+ assert list(actual) == [
+ '',
+ '.. py:function:: asctime([tuple]) -> string',
+ ' :module: time',
+ '',
+ " Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.",
+ ' When the time tuple is not present, current time as returned by localtime()',
+ ' is used.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_wrapped_function(app):
+ actual = do_autodoc(app, 'function', 'target.wrappedfunction.slow_function')
+ assert list(actual) == [
+ '',
+ '.. py:function:: slow_function(message, timeout)',
+ ' :module: target.wrappedfunction',
+ '',
+ ' This function is slow.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_wrapped_function_contextmanager(app):
+ actual = do_autodoc(app, 'function', 'target.wrappedfunction.feeling_good')
+ assert list(actual) == [
+ '',
+ '.. py:function:: feeling_good(x: int, y: int) -> ~typing.Generator',
+ ' :module: target.wrappedfunction',
+ '',
+ " You'll feel better in this context!",
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_coroutine(app):
+ actual = do_autodoc(app, 'function', 'target.functions.coroutinefunc')
+ assert list(actual) == [
+ '',
+ '.. py:function:: coroutinefunc()',
+ ' :module: target.functions',
+ ' :async:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_synchronized_coroutine(app):
+ actual = do_autodoc(app, 'function', 'target.coroutine.sync_func')
+ assert list(actual) == [
+ '',
+ '.. py:function:: sync_func()',
+ ' :module: target.coroutine',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_async_generator(app):
+ actual = do_autodoc(app, 'function', 'target.functions.asyncgenerator')
+ assert list(actual) == [
+ '',
+ '.. py:function:: asyncgenerator()',
+ ' :module: target.functions',
+ ' :async:',
+ '',
+ ]
diff --git a/tests/test_ext_autodoc_automodule.py b/tests/test_ext_autodoc_automodule.py
new file mode 100644
index 0000000..2855020
--- /dev/null
+++ b/tests/test_ext_autodoc_automodule.py
@@ -0,0 +1,192 @@
+"""Test the autodoc extension.
+
+This tests mainly the Documenters; the auto directives are tested in a test
+source file translated by test_build.
+"""
+
+import sys
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_empty_all(app):
+ options = {'members': None}
+ actual = do_autodoc(app, 'module', 'target.empty_all', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.empty_all',
+ '',
+ ' docsting of empty_all module.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_automodule(app):
+ options = {'members': None}
+ actual = do_autodoc(app, 'module', 'target.module', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.module',
+ '',
+ '',
+ '.. py:data:: annotated',
+ ' :module: target.module',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: documented',
+ ' :module: target.module',
+ ' :value: 1',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_automodule_undoc_members(app):
+ options = {'members': None,
+ 'undoc-members': None}
+ actual = do_autodoc(app, 'module', 'target.module', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.module',
+ '',
+ '',
+ '.. py:data:: annotated',
+ ' :module: target.module',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: documented',
+ ' :module: target.module',
+ ' :value: 1',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: undoc_annotated',
+ ' :module: target.module',
+ ' :type: int',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_automodule_special_members(app):
+ options = {'members': None,
+ 'special-members': None}
+ actual = do_autodoc(app, 'module', 'target.module', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.module',
+ '',
+ '',
+ '.. py:data:: __documented_special__',
+ ' :module: target.module',
+ ' :value: 1',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: annotated',
+ ' :module: target.module',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: documented',
+ ' :module: target.module',
+ ' :value: 1',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_automodule_inherited_members(app):
+ options = {'members': None,
+ 'undoc-members': None,
+ 'inherited-members': 'Base, list'}
+ actual = do_autodoc(app, 'module', 'target.inheritance', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.inheritance',
+ '',
+ '',
+ '.. py:class:: Base()',
+ ' :module: target.inheritance',
+ '',
+ '',
+ ' .. py:attribute:: Base.inheritedattr',
+ ' :module: target.inheritance',
+ ' :value: None',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Base.inheritedclassmeth()',
+ ' :module: target.inheritance',
+ ' :classmethod:',
+ '',
+ ' Inherited class method.',
+ '',
+ '',
+ ' .. py:method:: Base.inheritedmeth()',
+ ' :module: target.inheritance',
+ '',
+ ' Inherited function.',
+ '',
+ '',
+ ' .. py:method:: Base.inheritedstaticmeth(cls)',
+ ' :module: target.inheritance',
+ ' :staticmethod:',
+ '',
+ ' Inherited static method.',
+ '',
+ '',
+ '.. py:class:: Derived()',
+ ' :module: target.inheritance',
+ '',
+ '',
+ ' .. py:method:: Derived.inheritedmeth()',
+ ' :module: target.inheritance',
+ '',
+ ' Inherited function.',
+ '',
+ '',
+ '.. py:class:: MyList(iterable=(), /)',
+ ' :module: target.inheritance',
+ '',
+ '',
+ ' .. py:method:: MyList.meth()',
+ ' :module: target.inheritance',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_mock_imports': ['missing_module',
+ 'missing_package1',
+ 'missing_package2',
+ 'missing_package3',
+ 'sphinx.missing_module4']})
+@pytest.mark.usefixtures("rollback_sysmodules")
+def test_subclass_of_mocked_object(app):
+ sys.modules.pop('target', None) # unload target module to clear the module cache
+
+ options = {'members': None}
+ actual = do_autodoc(app, 'module', 'target.need_mocks', options)
+ assert '.. py:class:: Inherited(*args: ~typing.Any, **kwargs: ~typing.Any)' in actual
diff --git a/tests/test_ext_autodoc_autoproperty.py b/tests/test_ext_autodoc_autoproperty.py
new file mode 100644
index 0000000..ca8b981
--- /dev/null
+++ b/tests/test_ext_autodoc_autoproperty.py
@@ -0,0 +1,91 @@
+"""Test the autodoc extension.
+
+This tests mainly the Documenters; the auto directives are tested in a test
+source file translated by test_build.
+"""
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_properties(app):
+ actual = do_autodoc(app, 'property', 'target.properties.Foo.prop1')
+ assert list(actual) == [
+ '',
+ '.. py:property:: Foo.prop1',
+ ' :module: target.properties',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_class_properties(app):
+ actual = do_autodoc(app, 'property', 'target.properties.Foo.prop2')
+ assert list(actual) == [
+ '',
+ '.. py:property:: Foo.prop2',
+ ' :module: target.properties',
+ ' :classmethod:',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_properties_with_type_comment(app):
+ actual = do_autodoc(app, 'property', 'target.properties.Foo.prop1_with_type_comment')
+ assert list(actual) == [
+ '',
+ '.. py:property:: Foo.prop1_with_type_comment',
+ ' :module: target.properties',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_class_properties_with_type_comment(app):
+ actual = do_autodoc(app, 'property', 'target.properties.Foo.prop2_with_type_comment')
+ assert list(actual) == [
+ '',
+ '.. py:property:: Foo.prop2_with_type_comment',
+ ' :module: target.properties',
+ ' :classmethod:',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_cached_properties(app):
+ actual = do_autodoc(app, 'property', 'target.cached_property.Foo.prop')
+ assert list(actual) == [
+ '',
+ '.. py:property:: Foo.prop',
+ ' :module: target.cached_property',
+ ' :type: int',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_cached_properties_with_type_comment(app):
+ actual = do_autodoc(app, 'property', 'target.cached_property.Foo.prop_with_type_comment')
+ assert list(actual) == [
+ '',
+ '.. py:property:: Foo.prop_with_type_comment',
+ ' :module: target.cached_property',
+ ' :type: int',
+ '',
+ ]
diff --git a/tests/test_ext_autodoc_configs.py b/tests/test_ext_autodoc_configs.py
new file mode 100644
index 0000000..45bc729
--- /dev/null
+++ b/tests/test_ext_autodoc_configs.py
@@ -0,0 +1,1727 @@
+"""Test the autodoc extension. This tests mainly for config variables"""
+
+import platform
+import sys
+from contextlib import contextmanager
+
+import pytest
+
+from sphinx.testing import restructuredtext
+
+from .test_ext_autodoc import do_autodoc
+
+IS_PYPY = platform.python_implementation() == 'PyPy'
+
+
+@contextmanager
+def overwrite_file(path, content):
+ current_content = path.read_bytes() if path.exists() else None
+ try:
+ path.write_text(content, encoding='utf-8')
+ yield
+ finally:
+ if current_content is not None:
+ path.write_bytes(current_content)
+ else:
+ path.unlink()
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoclass_content_class(app):
+ app.config.autoclass_content = 'class'
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.autoclass_content', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.autoclass_content',
+ '',
+ '',
+ '.. py:class:: A()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, no __new__',
+ '',
+ '',
+ '.. py:class:: B()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having __init__(no docstring), no __new__',
+ '',
+ '',
+ '.. py:class:: C()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having __init__, no __new__',
+ '',
+ '',
+ '.. py:class:: D()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, __new__(no docstring)',
+ '',
+ '',
+ '.. py:class:: E()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, __new__',
+ '',
+ '',
+ '.. py:class:: F()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having both __init__ and __new__',
+ '',
+ '',
+ '.. py:class:: G()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class inherits __init__ without docstring.',
+ '',
+ '',
+ '.. py:class:: H()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class inherits __new__ without docstring.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoclass_content_init(app):
+ app.config.autoclass_content = 'init'
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.autoclass_content', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.autoclass_content',
+ '',
+ '',
+ '.. py:class:: A()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, no __new__',
+ '',
+ '',
+ '.. py:class:: B()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having __init__(no docstring), no __new__',
+ '',
+ '',
+ '.. py:class:: C()',
+ ' :module: target.autoclass_content',
+ '',
+ ' __init__ docstring',
+ '',
+ '',
+ '.. py:class:: D()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, __new__(no docstring)',
+ '',
+ '',
+ '.. py:class:: E()',
+ ' :module: target.autoclass_content',
+ '',
+ ' __new__ docstring',
+ '',
+ '',
+ '.. py:class:: F()',
+ ' :module: target.autoclass_content',
+ '',
+ ' __init__ docstring',
+ '',
+ '',
+ '.. py:class:: G()',
+ ' :module: target.autoclass_content',
+ '',
+ ' __init__ docstring',
+ '',
+ '',
+ '.. py:class:: H()',
+ ' :module: target.autoclass_content',
+ '',
+ ' __new__ docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_class_signature_mixed(app):
+ app.config.autodoc_class_signature = 'mixed'
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.classes.Bar', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Bar(x, y)',
+ ' :module: target.classes',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_class_signature_separated_init(app):
+ app.config.autodoc_class_signature = 'separated'
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.classes.Bar', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Bar',
+ ' :module: target.classes',
+ '',
+ '',
+ ' .. py:method:: Bar.__init__(x, y)',
+ ' :module: target.classes',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_class_signature_separated_new(app):
+ app.config.autodoc_class_signature = 'separated'
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'class', 'target.classes.Baz', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Baz',
+ ' :module: target.classes',
+ '',
+ '',
+ ' .. py:method:: Baz.__new__(cls, x, y)',
+ ' :module: target.classes',
+ ' :staticmethod:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoclass_content_both(app):
+ app.config.autoclass_content = 'both'
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.autoclass_content', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.autoclass_content',
+ '',
+ '',
+ '.. py:class:: A()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, no __new__',
+ '',
+ '',
+ '.. py:class:: B()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having __init__(no docstring), no __new__',
+ '',
+ '',
+ '.. py:class:: C()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having __init__, no __new__',
+ '',
+ ' __init__ docstring',
+ '',
+ '',
+ '.. py:class:: D()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, __new__(no docstring)',
+ '',
+ '',
+ '.. py:class:: E()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having no __init__, __new__',
+ '',
+ ' __new__ docstring',
+ '',
+ '',
+ '.. py:class:: F()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class having both __init__ and __new__',
+ '',
+ ' __init__ docstring',
+ '',
+ '',
+ '.. py:class:: G()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class inherits __init__ without docstring.',
+ '',
+ ' __init__ docstring',
+ '',
+ '',
+ '.. py:class:: H()',
+ ' :module: target.autoclass_content',
+ '',
+ ' A class inherits __new__ without docstring.',
+ '',
+ ' __new__ docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_inherit_docstrings(app):
+ assert app.config.autodoc_inherit_docstrings is True # default
+ actual = do_autodoc(app, 'method', 'target.inheritance.Derived.inheritedmeth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Derived.inheritedmeth()',
+ ' :module: target.inheritance',
+ '',
+ ' Inherited function.',
+ '',
+ ]
+
+ # disable autodoc_inherit_docstrings
+ app.config.autodoc_inherit_docstrings = False
+ actual = do_autodoc(app, 'method', 'target.inheritance.Derived.inheritedmeth')
+ assert list(actual) == [
+ '',
+ '.. py:method:: Derived.inheritedmeth()',
+ ' :module: target.inheritance',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_inherit_docstrings_for_inherited_members(app):
+ options = {"members": None,
+ "inherited-members": None}
+
+ assert app.config.autodoc_inherit_docstrings is True # default
+ actual = do_autodoc(app, 'class', 'target.inheritance.Derived', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Derived()',
+ ' :module: target.inheritance',
+ '',
+ '',
+ ' .. py:attribute:: Derived.inheritedattr',
+ ' :module: target.inheritance',
+ ' :value: None',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Derived.inheritedclassmeth()',
+ ' :module: target.inheritance',
+ ' :classmethod:',
+ '',
+ ' Inherited class method.',
+ '',
+ '',
+ ' .. py:method:: Derived.inheritedmeth()',
+ ' :module: target.inheritance',
+ '',
+ ' Inherited function.',
+ '',
+ '',
+ ' .. py:method:: Derived.inheritedstaticmeth(cls)',
+ ' :module: target.inheritance',
+ ' :staticmethod:',
+ '',
+ ' Inherited static method.',
+ '',
+ ]
+
+ # disable autodoc_inherit_docstrings
+ app.config.autodoc_inherit_docstrings = False
+ actual = do_autodoc(app, 'class', 'target.inheritance.Derived', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Derived()',
+ ' :module: target.inheritance',
+ '',
+ '',
+ ' .. py:method:: Derived.inheritedclassmeth()',
+ ' :module: target.inheritance',
+ ' :classmethod:',
+ '',
+ ' Inherited class method.',
+ '',
+ '',
+ ' .. py:method:: Derived.inheritedstaticmeth(cls)',
+ ' :module: target.inheritance',
+ ' :staticmethod:',
+ '',
+ ' Inherited static method.',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_docstring_signature(app):
+ options = {"members": None, "special-members": "__init__, __new__"}
+ actual = do_autodoc(app, 'class', 'target.DocstringSig', options)
+ assert list(actual) == [
+ '',
+ # FIXME: Ideally this would instead be: `DocstringSig(d, e=1)` but
+ # currently `ClassDocumenter` does not apply the docstring signature
+ # logic when extracting a signature from a __new__ or __init__ method.
+ '.. py:class:: DocstringSig(*new_args, **new_kwargs)',
+ ' :module: target',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.__init__(self, a, b=1) -> None',
+ ' :module: target',
+ '',
+ ' First line of docstring',
+ '',
+ ' rest of docstring',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.__new__(cls, d, e=1) -> DocstringSig',
+ ' :module: target',
+ ' :staticmethod:',
+ '',
+ ' First line of docstring',
+ '',
+ ' rest of docstring',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.meth(FOO, BAR=1) -> BAZ',
+ ' :module: target',
+ '',
+ ' First line of docstring',
+ '',
+ ' rest of docstring',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.meth2()',
+ ' :module: target',
+ '',
+ ' First line, no signature',
+ ' Second line followed by indentation::',
+ '',
+ ' indented line',
+ '',
+ '',
+ ' .. py:property:: DocstringSig.prop1',
+ ' :module: target',
+ '',
+ ' First line of docstring',
+ '',
+ '',
+ ' .. py:property:: DocstringSig.prop2',
+ ' :module: target',
+ '',
+ ' First line of docstring',
+ ' Second line of docstring',
+ '',
+ ]
+
+ # disable autodoc_docstring_signature
+ app.config.autodoc_docstring_signature = False
+ actual = do_autodoc(app, 'class', 'target.DocstringSig', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: DocstringSig(*new_args, **new_kwargs)',
+ ' :module: target',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.__init__(*init_args, **init_kwargs)',
+ ' :module: target',
+ '',
+ ' __init__(self, a, b=1) -> None',
+ ' First line of docstring',
+ '',
+ ' rest of docstring',
+ '',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.__new__(cls, *new_args, **new_kwargs)',
+ ' :module: target',
+ ' :staticmethod:',
+ '',
+ ' __new__(cls, d, e=1) -> DocstringSig',
+ ' First line of docstring',
+ '',
+ ' rest of docstring',
+ '',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.meth()',
+ ' :module: target',
+ '',
+ ' meth(FOO, BAR=1) -> BAZ',
+ ' First line of docstring',
+ '',
+ ' rest of docstring',
+ '',
+ '',
+ '',
+ ' .. py:method:: DocstringSig.meth2()',
+ ' :module: target',
+ '',
+ ' First line, no signature',
+ ' Second line followed by indentation::',
+ '',
+ ' indented line',
+ '',
+ '',
+ ' .. py:property:: DocstringSig.prop1',
+ ' :module: target',
+ '',
+ ' DocstringSig.prop1(self)',
+ ' First line of docstring',
+ '',
+ '',
+ ' .. py:property:: DocstringSig.prop2',
+ ' :module: target',
+ '',
+ ' First line of docstring',
+ ' Second line of docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoclass_content_and_docstring_signature_class(app):
+ app.config.autoclass_content = 'class'
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.docstring_signature', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: A(foo, bar)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: B(foo, bar)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: C(foo, bar)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: D()',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: E()',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: F()',
+ ' :module: target.docstring_signature',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoclass_content_and_docstring_signature_init(app):
+ app.config.autoclass_content = 'init'
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.docstring_signature', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: A(foo, bar)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: B(foo, bar, baz)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: C(foo, bar, baz)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: D(foo, bar, baz)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: E(foo: int, bar: int, baz: int)',
+ ' E(foo: str, bar: str, baz: str)',
+ ' E(foo: float, bar: float, baz: float)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: F(foo: int, bar: int, baz: int)',
+ ' F(foo: str, bar: str, baz: str)',
+ ' F(foo: float, bar: float, baz: float)',
+ ' :module: target.docstring_signature',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autoclass_content_and_docstring_signature_both(app):
+ app.config.autoclass_content = 'both'
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.docstring_signature', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: A(foo, bar)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: B(foo, bar)',
+ ' :module: target.docstring_signature',
+ '',
+ ' B(foo, bar, baz)',
+ '',
+ '',
+ '.. py:class:: C(foo, bar)',
+ ' :module: target.docstring_signature',
+ '',
+ ' C(foo, bar, baz)',
+ '',
+ '',
+ '.. py:class:: D(foo, bar, baz)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: E(foo: int, bar: int, baz: int)',
+ ' E(foo: str, bar: str, baz: str)',
+ ' E(foo: float, bar: float, baz: float)',
+ ' :module: target.docstring_signature',
+ '',
+ '',
+ '.. py:class:: F(foo: int, bar: int, baz: int)',
+ ' F(foo: str, bar: str, baz: str)',
+ ' F(foo: float, bar: float, baz: float)',
+ ' :module: target.docstring_signature',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+@pytest.mark.usefixtures("rollback_sysmodules")
+def test_mocked_module_imports(app, warning):
+ sys.modules.pop('target', None) # unload target module to clear the module cache
+
+ # no autodoc_mock_imports
+ options = {"members": 'TestAutodoc,decoratedFunction,func,Alias'}
+ actual = do_autodoc(app, 'module', 'target.need_mocks', options)
+ assert list(actual) == []
+ assert "autodoc: failed to import module 'need_mocks'" in warning.getvalue()
+
+ # with autodoc_mock_imports
+ app.config.autodoc_mock_imports = [
+ 'missing_module',
+ 'missing_package1',
+ 'missing_package2',
+ 'missing_package3',
+ 'sphinx.missing_module4',
+ ]
+
+ warning.truncate(0)
+ actual = do_autodoc(app, 'module', 'target.need_mocks', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.need_mocks',
+ '',
+ '',
+ '.. py:data:: Alias',
+ ' :module: target.need_mocks',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: TestAutodoc()',
+ ' :module: target.need_mocks',
+ '',
+ ' TestAutodoc docstring.',
+ '',
+ '',
+ ' .. py:attribute:: TestAutodoc.Alias',
+ ' :module: target.need_mocks',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: TestAutodoc.decoratedMethod()',
+ ' :module: target.need_mocks',
+ '',
+ ' TestAutodoc::decoratedMethod docstring',
+ '',
+ '',
+ '.. py:function:: decoratedFunction()',
+ ' :module: target.need_mocks',
+ '',
+ ' decoratedFunction docstring',
+ '',
+ '',
+ '.. py:function:: func(arg: missing_module.Class)',
+ ' :module: target.need_mocks',
+ '',
+ ' a function takes mocked object as an argument',
+ '',
+ ]
+ assert warning.getvalue() == ''
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "signature"})
+def test_autodoc_typehints_signature(app):
+ if sys.version_info[:2] <= (3, 10):
+ type_o = "~typing.Any | None"
+ else:
+ type_o = "~typing.Any"
+
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.typehints', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.typehints',
+ '',
+ '',
+ '.. py:data:: CONST1',
+ ' :module: target.typehints',
+ ' :type: int',
+ '',
+ '',
+ '.. py:data:: CONST2',
+ ' :module: target.typehints',
+ ' :type: int',
+ ' :value: 1',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: CONST3',
+ ' :module: target.typehints',
+ ' :type: ~pathlib.PurePosixPath',
+ " :value: PurePosixPath('/a/b/c')",
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Math(s: str, o: %s = None)' % type_o,
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST1',
+ ' :module: target.typehints',
+ ' :type: int',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST2',
+ ' :module: target.typehints',
+ ' :type: int',
+ ' :value: 1',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST3',
+ ' :module: target.typehints',
+ ' :type: ~pathlib.PurePosixPath',
+ " :value: PurePosixPath('/a/b/c')",
+ '',
+ '',
+ ' .. py:method:: Math.decr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.horse(a: str, b: int) -> None',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.incr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.nothing() -> None',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:property:: Math.path',
+ ' :module: target.typehints',
+ ' :type: ~pathlib.PurePosixPath',
+ '',
+ '',
+ ' .. py:property:: Math.prop',
+ ' :module: target.typehints',
+ ' :type: int',
+ '',
+ '',
+ '.. py:class:: NewAnnotation(i: int)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: NewComment(i: int)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: SignatureFromMetaclass(a: int)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: T',
+ ' :module: target.typehints',
+ '',
+ ' docstring',
+ '',
+ " alias of TypeVar('T', bound=\\ :py:class:`~pathlib.PurePosixPath`)",
+ '',
+ '',
+ '.. py:function:: complex_func(arg1: str, arg2: List[int], arg3: Tuple[int, '
+ 'Union[str, Unknown]] = None, *args: str, **kwargs: str) -> None',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: decr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: incr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: missing_attr(c, a: str, b: Optional[str] = None) -> str',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: tuple_args(x: tuple[int, int | str]) -> tuple[int, int]',
+ ' :module: target.typehints',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "none"})
+def test_autodoc_typehints_none(app):
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.typehints', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.typehints',
+ '',
+ '',
+ '.. py:data:: CONST1',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:data:: CONST2',
+ ' :module: target.typehints',
+ ' :value: 1',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: CONST3',
+ ' :module: target.typehints',
+ " :value: PurePosixPath('/a/b/c')",
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Math(s, o=None)',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST1',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST2',
+ ' :module: target.typehints',
+ ' :value: 1',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST3',
+ ' :module: target.typehints',
+ " :value: PurePosixPath('/a/b/c')",
+ '',
+ '',
+ ' .. py:method:: Math.decr(a, b=1)',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.horse(a, b)',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.incr(a, b=1)',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.nothing()',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:property:: Math.path',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:property:: Math.prop',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: NewAnnotation(i)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: NewComment(i)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: SignatureFromMetaclass(a)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: T',
+ ' :module: target.typehints',
+ '',
+ ' docstring',
+ '',
+ " alias of TypeVar('T', bound=\\ :py:class:`~pathlib.PurePosixPath`)",
+ '',
+ '',
+ '.. py:function:: complex_func(arg1, arg2, arg3=None, *args, **kwargs)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: decr(a, b=1)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: incr(a, b=1)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: missing_attr(c, a, b=None)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: tuple_args(x)',
+ ' :module: target.typehints',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': 'none'})
+def test_autodoc_typehints_none_for_overload(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.overload', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.overload',
+ '',
+ '',
+ '.. py:class:: Bar(x, y)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Baz(x, y)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Foo(x, y)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Math()',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Math.sum(x, y=None)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: sum(x, y=None)',
+ ' :module: target.overload',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "description"},
+ freshenv=True)
+def test_autodoc_typehints_description(app):
+ app.build()
+ context = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert ('target.typehints.incr(a, b=1)\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **a** (*int*) --\n'
+ '\n'
+ ' * **b** (*int*) --\n'
+ '\n'
+ ' Return type:\n'
+ ' int\n'
+ in context)
+ assert ('target.typehints.tuple_args(x)\n'
+ '\n'
+ ' Parameters:\n'
+ ' **x** (*tuple**[**int**, **int** | **str**]*) --\n'
+ '\n'
+ ' Return type:\n'
+ ' tuple[int, int]\n'
+ in context)
+
+ # Overloads still get displayed in the signature
+ assert ('target.overload.sum(x: int, y: int = 0) -> int\n'
+ 'target.overload.sum(x: float, y: float = 0.0) -> float\n'
+ 'target.overload.sum(x: str, y: str = None) -> str\n'
+ '\n'
+ ' docstring\n'
+ in context)
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "description",
+ 'autodoc_typehints_description_target': 'documented'})
+def test_autodoc_typehints_description_no_undoc(app):
+ # No :type: or :rtype: will be injected for `incr`, which does not have
+ # a description for its parameters or its return. `tuple_args` does
+ # describe them, so :type: and :rtype: will be added.
+ with overwrite_file(app.srcdir / 'index.rst',
+ '.. autofunction:: target.typehints.incr\n'
+ '\n'
+ '.. autofunction:: target.typehints.decr\n'
+ '\n'
+ ' :returns: decremented number\n'
+ '\n'
+ '.. autofunction:: target.typehints.tuple_args\n'
+ '\n'
+ ' :param x: arg\n'
+ ' :return: another tuple\n'):
+ app.build()
+ # Restore the original content of the file
+ context = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert ('target.typehints.incr(a, b=1)\n'
+ '\n'
+ 'target.typehints.decr(a, b=1)\n'
+ '\n'
+ ' Returns:\n'
+ ' decremented number\n'
+ '\n'
+ ' Return type:\n'
+ ' int\n'
+ '\n'
+ 'target.typehints.tuple_args(x)\n'
+ '\n'
+ ' Parameters:\n'
+ ' **x** (*tuple**[**int**, **int** | **str**]*) -- arg\n'
+ '\n'
+ ' Returns:\n'
+ ' another tuple\n'
+ '\n'
+ ' Return type:\n'
+ ' tuple[int, int]\n'
+ in context)
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "description",
+ 'autodoc_typehints_description_target': 'documented_params'})
+def test_autodoc_typehints_description_no_undoc_doc_rtype(app):
+ # No :type: will be injected for `incr`, which does not have a description
+ # for its parameters or its return, just :rtype: will be injected due to
+ # autodoc_typehints_description_target. `tuple_args` does describe both, so
+ # :type: and :rtype: will be added. `nothing` has no parameters but a return
+ # type of None, which will be added.
+ with overwrite_file(app.srcdir / 'index.rst',
+ '.. autofunction:: target.typehints.incr\n'
+ '\n'
+ '.. autofunction:: target.typehints.decr\n'
+ '\n'
+ ' :returns: decremented number\n'
+ '\n'
+ '.. autofunction:: target.typehints.tuple_args\n'
+ '\n'
+ ' :param x: arg\n'
+ ' :return: another tuple\n'
+ '\n'
+ '.. autofunction:: target.typehints.Math.nothing\n'
+ '\n'
+ '.. autofunction:: target.typehints.Math.horse\n'
+ '\n'
+ ' :return: nothing\n'):
+ app.build()
+ context = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert context == (
+ 'target.typehints.incr(a, b=1)\n'
+ '\n'
+ ' Return type:\n'
+ ' int\n'
+ '\n'
+ 'target.typehints.decr(a, b=1)\n'
+ '\n'
+ ' Returns:\n'
+ ' decremented number\n'
+ '\n'
+ ' Return type:\n'
+ ' int\n'
+ '\n'
+ 'target.typehints.tuple_args(x)\n'
+ '\n'
+ ' Parameters:\n'
+ ' **x** (*tuple**[**int**, **int** | **str**]*) -- arg\n'
+ '\n'
+ ' Returns:\n'
+ ' another tuple\n'
+ '\n'
+ ' Return type:\n'
+ ' tuple[int, int]\n'
+ '\n'
+ 'target.typehints.Math.nothing(self)\n'
+ '\n'
+ 'target.typehints.Math.horse(self, a, b)\n'
+ '\n'
+ ' Returns:\n'
+ ' nothing\n'
+ '\n'
+ ' Return type:\n'
+ ' None\n'
+ )
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "description"})
+def test_autodoc_typehints_description_with_documented_init(app):
+ with overwrite_file(app.srcdir / 'index.rst',
+ '.. autoclass:: target.typehints._ClassWithDocumentedInit\n'
+ ' :special-members: __init__\n'):
+ app.build()
+ context = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert context == (
+ 'class target.typehints._ClassWithDocumentedInit(x, *args, **kwargs)\n'
+ '\n'
+ ' Class docstring.\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **x** (*int*) --\n'
+ '\n'
+ ' * **args** (*int*) --\n'
+ '\n'
+ ' * **kwargs** (*int*) --\n'
+ '\n'
+ ' __init__(x, *args, **kwargs)\n'
+ '\n'
+ ' Init docstring.\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **x** (*int*) -- Some integer\n'
+ '\n'
+ ' * **args** (*int*) -- Some integer\n'
+ '\n'
+ ' * **kwargs** (*int*) -- Some integer\n'
+ '\n'
+ ' Return type:\n'
+ ' None\n'
+ )
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "description",
+ 'autodoc_typehints_description_target': 'documented'})
+def test_autodoc_typehints_description_with_documented_init_no_undoc(app):
+ with overwrite_file(app.srcdir / 'index.rst',
+ '.. autoclass:: target.typehints._ClassWithDocumentedInit\n'
+ ' :special-members: __init__\n'):
+ app.build()
+ context = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert context == (
+ 'class target.typehints._ClassWithDocumentedInit(x, *args, **kwargs)\n'
+ '\n'
+ ' Class docstring.\n'
+ '\n'
+ ' __init__(x, *args, **kwargs)\n'
+ '\n'
+ ' Init docstring.\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **x** (*int*) -- Some integer\n'
+ '\n'
+ ' * **args** (*int*) -- Some integer\n'
+ '\n'
+ ' * **kwargs** (*int*) -- Some integer\n'
+ )
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "description",
+ 'autodoc_typehints_description_target': 'documented_params'})
+def test_autodoc_typehints_description_with_documented_init_no_undoc_doc_rtype(app):
+ # see test_autodoc_typehints_description_with_documented_init_no_undoc
+ # returnvalue_and_documented_params should not change class or method
+ # docstring.
+ with overwrite_file(app.srcdir / 'index.rst',
+ '.. autoclass:: target.typehints._ClassWithDocumentedInit\n'
+ ' :special-members: __init__\n'):
+ app.build()
+ context = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert context == (
+ 'class target.typehints._ClassWithDocumentedInit(x, *args, **kwargs)\n'
+ '\n'
+ ' Class docstring.\n'
+ '\n'
+ ' __init__(x, *args, **kwargs)\n'
+ '\n'
+ ' Init docstring.\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **x** (*int*) -- Some integer\n'
+ '\n'
+ ' * **args** (*int*) -- Some integer\n'
+ '\n'
+ ' * **kwargs** (*int*) -- Some integer\n'
+ )
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "description"})
+def test_autodoc_typehints_description_for_invalid_node(app):
+ text = ".. py:function:: hello; world"
+ restructuredtext.parse(app, text) # raises no error
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints': "both"})
+def test_autodoc_typehints_both(app):
+ with overwrite_file(app.srcdir / 'index.rst',
+ '.. autofunction:: target.typehints.incr\n'
+ '\n'
+ '.. autofunction:: target.typehints.tuple_args\n'
+ '\n'
+ '.. autofunction:: target.overload.sum\n'):
+ app.build()
+ context = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert ('target.typehints.incr(a: int, b: int = 1) -> int\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **a** (*int*) --\n'
+ '\n'
+ ' * **b** (*int*) --\n'
+ '\n'
+ ' Return type:\n'
+ ' int\n'
+ in context)
+ assert ('target.typehints.tuple_args(x: tuple[int, int | str]) -> tuple[int, int]\n'
+ '\n'
+ ' Parameters:\n'
+ ' **x** (*tuple**[**int**, **int** | **str**]*) --\n'
+ '\n'
+ ' Return type:\n'
+ ' tuple[int, int]\n'
+ in context)
+
+ # Overloads still get displayed in the signature
+ assert ('target.overload.sum(x: int, y: int = 0) -> int\n'
+ 'target.overload.sum(x: float, y: float = 0.0) -> float\n'
+ 'target.overload.sum(x: str, y: str = None) -> str\n'
+ '\n'
+ ' docstring\n'
+ in context)
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc')
+def test_autodoc_type_aliases(app):
+ # default
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.autodoc_type_aliases', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.autodoc_type_aliases',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Foo.attr1',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Foo.attr2',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: mult(x: int, y: int) -> int',
+ ' mult(x: float, y: float) -> float',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: read(r: ~_io.BytesIO) -> ~_io.StringIO',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: sum(x: int, y: int) -> int',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: variable',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: int',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: variable2',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: int',
+ ' :value: None',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: variable3',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: int | None',
+ '',
+ ' docstring',
+ '',
+ ]
+
+ # define aliases
+ app.config.autodoc_type_aliases = {'myint': 'myint',
+ 'io.StringIO': 'my.module.StringIO'}
+ actual = do_autodoc(app, 'module', 'target.autodoc_type_aliases', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.autodoc_type_aliases',
+ '',
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Foo.attr1',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: myint',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: Foo.attr2',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: myint',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: mult(x: myint, y: myint) -> myint',
+ ' mult(x: float, y: float) -> float',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: read(r: ~_io.BytesIO) -> my.module.StringIO',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: sum(x: myint, y: myint) -> myint',
+ ' :module: target.autodoc_type_aliases',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: variable',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: myint',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: variable2',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: myint',
+ ' :value: None',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: variable3',
+ ' :module: target.autodoc_type_aliases',
+ ' :type: myint | None',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('text', testroot='ext-autodoc',
+ srcdir='autodoc_typehints_description_and_type_aliases',
+ confoverrides={'autodoc_typehints': "description",
+ 'autodoc_type_aliases': {'myint': 'myint'}})
+def test_autodoc_typehints_description_and_type_aliases(app):
+ with overwrite_file(app.srcdir / 'autodoc_type_aliases.rst',
+ '.. autofunction:: target.autodoc_type_aliases.sum'):
+ app.build()
+ context = (app.outdir / 'autodoc_type_aliases.txt').read_text(encoding='utf8')
+ assert context == (
+ 'target.autodoc_type_aliases.sum(x, y)\n'
+ '\n'
+ ' docstring\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **x** (*myint*) --\n'
+ '\n'
+ ' * **y** (*myint*) --\n'
+ '\n'
+ ' Return type:\n'
+ ' myint\n'
+ )
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints_format': "fully-qualified"})
+def test_autodoc_typehints_format_fully_qualified(app):
+ if sys.version_info[:2] <= (3, 10):
+ type_o = "typing.Any | None"
+ else:
+ type_o = "typing.Any"
+
+ options = {"members": None,
+ "undoc-members": None}
+ actual = do_autodoc(app, 'module', 'target.typehints', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.typehints',
+ '',
+ '',
+ '.. py:data:: CONST1',
+ ' :module: target.typehints',
+ ' :type: int',
+ '',
+ '',
+ '.. py:data:: CONST2',
+ ' :module: target.typehints',
+ ' :type: int',
+ ' :value: 1',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: CONST3',
+ ' :module: target.typehints',
+ ' :type: pathlib.PurePosixPath',
+ " :value: PurePosixPath('/a/b/c')",
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: Math(s: str, o: %s = None)' % type_o,
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST1',
+ ' :module: target.typehints',
+ ' :type: int',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST2',
+ ' :module: target.typehints',
+ ' :type: int',
+ ' :value: 1',
+ '',
+ '',
+ ' .. py:attribute:: Math.CONST3',
+ ' :module: target.typehints',
+ ' :type: pathlib.PurePosixPath',
+ " :value: PurePosixPath('/a/b/c')",
+ '',
+ '',
+ ' .. py:method:: Math.decr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.horse(a: str, b: int) -> None',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.incr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:method:: Math.nothing() -> None',
+ ' :module: target.typehints',
+ '',
+ '',
+ ' .. py:property:: Math.path',
+ ' :module: target.typehints',
+ ' :type: pathlib.PurePosixPath',
+ '',
+ '',
+ ' .. py:property:: Math.prop',
+ ' :module: target.typehints',
+ ' :type: int',
+ '',
+ '',
+ '.. py:class:: NewAnnotation(i: int)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: NewComment(i: int)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: SignatureFromMetaclass(a: int)',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:class:: T',
+ ' :module: target.typehints',
+ '',
+ ' docstring',
+ '',
+ " alias of TypeVar('T', bound=\\ :py:class:`pathlib.PurePosixPath`)",
+ '',
+ '',
+ '.. py:function:: complex_func(arg1: str, arg2: List[int], arg3: Tuple[int, '
+ 'Union[str, Unknown]] = None, *args: str, **kwargs: str) -> None',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: decr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: incr(a: int, b: int = 1) -> int',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: missing_attr(c, a: str, b: Optional[str] = None) -> str',
+ ' :module: target.typehints',
+ '',
+ '',
+ '.. py:function:: tuple_args(x: tuple[int, int | str]) -> tuple[int, int]',
+ ' :module: target.typehints',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints_format': "fully-qualified"})
+def test_autodoc_typehints_format_fully_qualified_for_class_alias(app):
+ actual = do_autodoc(app, 'class', 'target.classes.Alias')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: Alias',
+ ' :module: target.classes',
+ '',
+ ' alias of :py:class:`target.classes.Foo`',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints_format': "fully-qualified"})
+def test_autodoc_typehints_format_fully_qualified_for_generic_alias(app):
+ actual = do_autodoc(app, 'data', 'target.genericalias.L')
+ assert list(actual) == [
+ '',
+ '.. py:data:: L',
+ ' :module: target.genericalias',
+ '',
+ ' A list of Class',
+ '',
+ ' alias of :py:class:`~typing.List`\\ [:py:class:`target.genericalias.Class`]',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_typehints_format': "fully-qualified"})
+def test_autodoc_typehints_format_fully_qualified_for_newtype_alias(app):
+ actual = do_autodoc(app, 'class', 'target.typevar.T6')
+ assert list(actual) == [
+ '',
+ '.. py:class:: T6',
+ ' :module: target.typevar',
+ '',
+ ' T6',
+ '',
+ ' alias of :py:class:`datetime.date`',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_default_options(app):
+ # no settings
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls')
+ assert ' .. py:attribute:: EnumCls.val1' not in actual
+ assert ' .. py:attribute:: EnumCls.val4' not in actual
+ actual = do_autodoc(app, 'class', 'target.CustomIter')
+ assert ' .. py:method:: target.CustomIter' not in actual
+ actual = do_autodoc(app, 'module', 'target')
+ assert '.. py:function:: function_to_be_imported(app)' not in actual
+
+ # with :members:
+ app.config.autodoc_default_options = {'members': None}
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls')
+ assert ' .. py:attribute:: EnumCls.val1' in actual
+ assert ' .. py:attribute:: EnumCls.val4' not in actual
+
+ # with :members: = True
+ app.config.autodoc_default_options = {'members': None}
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls')
+ assert ' .. py:attribute:: EnumCls.val1' in actual
+ assert ' .. py:attribute:: EnumCls.val4' not in actual
+
+ # with :members: and :undoc-members:
+ app.config.autodoc_default_options = {
+ 'members': None,
+ 'undoc-members': None,
+ }
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls')
+ assert ' .. py:attribute:: EnumCls.val1' in actual
+ assert ' .. py:attribute:: EnumCls.val4' in actual
+
+ # with :special-members:
+ # Note that :members: must be *on* for :special-members: to work.
+ app.config.autodoc_default_options = {
+ 'members': None,
+ 'special-members': None,
+ }
+ actual = do_autodoc(app, 'class', 'target.CustomIter')
+ assert ' .. py:method:: CustomIter.__init__()' in actual
+ assert ' Create a new `CustomIter`.' in actual
+ assert ' .. py:method:: CustomIter.__iter__()' in actual
+ assert ' Iterate squares of each value.' in actual
+ if not IS_PYPY:
+ assert ' .. py:attribute:: CustomIter.__weakref__' in actual
+ assert ' list of weak references to the object (if defined)' in actual
+
+ # :exclude-members: None - has no effect. Unlike :members:,
+ # :special-members:, etc. where None == "include all", here None means
+ # "no/false/off".
+ app.config.autodoc_default_options = {
+ 'members': None,
+ 'exclude-members': None,
+ }
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls')
+ assert ' .. py:attribute:: EnumCls.val1' in actual
+ assert ' .. py:attribute:: EnumCls.val4' not in actual
+ app.config.autodoc_default_options = {
+ 'members': None,
+ 'special-members': None,
+ 'exclude-members': None,
+ }
+ actual = do_autodoc(app, 'class', 'target.CustomIter')
+ assert ' .. py:method:: CustomIter.__init__()' in actual
+ assert ' Create a new `CustomIter`.' in actual
+ assert ' .. py:method:: CustomIter.__iter__()' in actual
+ assert ' Iterate squares of each value.' in actual
+ if not IS_PYPY:
+ assert ' .. py:attribute:: CustomIter.__weakref__' in actual
+ assert ' list of weak references to the object (if defined)' in actual
+ assert ' .. py:method:: CustomIter.snafucate()' in actual
+ assert ' Makes this snafucated.' in actual
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_autodoc_default_options_with_values(app):
+ # with :members:
+ app.config.autodoc_default_options = {'members': 'val1,val2'}
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls')
+ assert ' .. py:attribute:: EnumCls.val1' in actual
+ assert ' .. py:attribute:: EnumCls.val2' in actual
+ assert ' .. py:attribute:: EnumCls.val3' not in actual
+ assert ' .. py:attribute:: EnumCls.val4' not in actual
+
+ # with :member-order:
+ app.config.autodoc_default_options = {
+ 'members': None,
+ 'member-order': 'bysource',
+ }
+ actual = do_autodoc(app, 'class', 'target.Class')
+ assert list(filter(lambda l: '::' in l, actual)) == [
+ '.. py:class:: Class(arg)',
+ ' .. py:method:: Class.meth()',
+ ' .. py:method:: Class.skipmeth()',
+ ' .. py:method:: Class.excludemeth()',
+ ' .. py:attribute:: Class.attr',
+ ' .. py:attribute:: Class.docattr',
+ ' .. py:attribute:: Class.udocattr',
+ ' .. py:attribute:: Class.mdocattr',
+ ' .. py:method:: Class.moore(a, e, f) -> happiness',
+ ' .. py:attribute:: Class.inst_attr_inline',
+ ' .. py:attribute:: Class.inst_attr_comment',
+ ' .. py:attribute:: Class.inst_attr_string',
+ ]
+
+ # with :special-members:
+ app.config.autodoc_default_options = {
+ 'special-members': '__init__,__iter__',
+ }
+ actual = do_autodoc(app, 'class', 'target.CustomIter')
+ assert ' .. py:method:: CustomIter.__init__()' in actual
+ assert ' Create a new `CustomIter`.' in actual
+ assert ' .. py:method:: CustomIter.__iter__()' in actual
+ assert ' Iterate squares of each value.' in actual
+ if not IS_PYPY:
+ assert ' .. py:attribute:: CustomIter.__weakref__' not in actual
+ assert ' list of weak references to the object (if defined)' not in actual
+
+ # with :exclude-members:
+ app.config.autodoc_default_options = {
+ 'members': None,
+ 'exclude-members': 'val1',
+ }
+ actual = do_autodoc(app, 'class', 'target.enums.EnumCls')
+ assert ' .. py:attribute:: EnumCls.val1' not in actual
+ assert ' .. py:attribute:: EnumCls.val2' in actual
+ assert ' .. py:attribute:: EnumCls.val3' in actual
+ assert ' .. py:attribute:: EnumCls.val4' not in actual
+ app.config.autodoc_default_options = {
+ 'members': None,
+ 'special-members': None,
+ 'exclude-members': '__weakref__,snafucate',
+ }
+ actual = do_autodoc(app, 'class', 'target.CustomIter')
+ assert ' .. py:method:: CustomIter.__init__()' in actual
+ assert ' Create a new `CustomIter`.' in actual
+ assert ' .. py:method:: CustomIter.__iter__()' in actual
+ assert ' Iterate squares of each value.' in actual
+ if not IS_PYPY:
+ assert ' .. py:attribute:: CustomIter.__weakref__' not in actual
+ assert ' list of weak references to the object (if defined)' not in actual
+ assert ' .. py:method:: CustomIter.snafucate()' not in actual
+ assert ' Makes this snafucated.' not in actual
diff --git a/tests/test_ext_autodoc_events.py b/tests/test_ext_autodoc_events.py
new file mode 100644
index 0000000..d821f4c
--- /dev/null
+++ b/tests/test_ext_autodoc_events.py
@@ -0,0 +1,118 @@
+"""Test the autodoc extension. This tests mainly for autodoc events"""
+
+import pytest
+
+from sphinx.ext.autodoc import between, cut_lines
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_process_docstring(app):
+ def on_process_docstring(app, what, name, obj, options, lines):
+ lines.clear()
+ lines.append('my docstring')
+
+ app.connect('autodoc-process-docstring', on_process_docstring)
+
+ actual = do_autodoc(app, 'function', 'target.process_docstring.func')
+ assert list(actual) == [
+ '',
+ '.. py:function:: func()',
+ ' :module: target.process_docstring',
+ '',
+ ' my docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_process_docstring_for_nondatadescriptor(app):
+ def on_process_docstring(app, what, name, obj, options, lines):
+ raise
+
+ app.connect('autodoc-process-docstring', on_process_docstring)
+
+ actual = do_autodoc(app, 'attribute', 'target.AttCls.a1')
+ assert list(actual) == [
+ '',
+ '.. py:attribute:: AttCls.a1',
+ ' :module: target',
+ ' :value: hello world',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_cut_lines(app):
+ app.connect('autodoc-process-docstring',
+ cut_lines(2, 2, ['function']))
+
+ actual = do_autodoc(app, 'function', 'target.process_docstring.func')
+ assert list(actual) == [
+ '',
+ '.. py:function:: func()',
+ ' :module: target.process_docstring',
+ '',
+ ' second line',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_between(app):
+ app.connect('autodoc-process-docstring',
+ between('---', ['function']))
+
+ actual = do_autodoc(app, 'function', 'target.process_docstring.func')
+ assert list(actual) == [
+ '',
+ '.. py:function:: func()',
+ ' :module: target.process_docstring',
+ '',
+ ' second line',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_between_exclude(app):
+ app.connect('autodoc-process-docstring',
+ between('---', ['function'], exclude=True))
+
+ actual = do_autodoc(app, 'function', 'target.process_docstring.func')
+ assert list(actual) == [
+ '',
+ '.. py:function:: func()',
+ ' :module: target.process_docstring',
+ '',
+ ' first line',
+ ' third line',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_skip_module_member(app):
+ def autodoc_skip_member(app, what, name, obj, skip, options):
+ if name == "Class":
+ return True # Skip "Class" class in __all__
+ elif name == "raises":
+ return False # Show "raises()" function (not in __all__)
+ return None
+
+ app.connect('autodoc-skip-member', autodoc_skip_member)
+
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target',
+ '',
+ '',
+ '.. py:function:: raises(exc, func, *args, **kwds)',
+ ' :module: target',
+ '',
+ ' Raise AssertionError if ``func(*args, **kwds)`` does not raise *exc*.',
+ '',
+ ]
diff --git a/tests/test_ext_autodoc_mock.py b/tests/test_ext_autodoc_mock.py
new file mode 100644
index 0000000..3b90693
--- /dev/null
+++ b/tests/test_ext_autodoc_mock.py
@@ -0,0 +1,152 @@
+"""Test the autodoc extension."""
+
+from __future__ import annotations
+
+import abc
+import sys
+from importlib import import_module
+from typing import TypeVar
+
+import pytest
+
+from sphinx.ext.autodoc.mock import _MockModule, _MockObject, ismock, mock, undecorate
+
+
+def test_MockModule():
+ mock = _MockModule('mocked_module')
+ assert isinstance(mock.some_attr, _MockObject)
+ assert isinstance(mock.some_method, _MockObject)
+ assert isinstance(mock.attr1.attr2, _MockObject)
+ assert isinstance(mock.attr1.attr2.meth(), _MockObject)
+
+ assert repr(mock.some_attr) == 'mocked_module.some_attr'
+ assert repr(mock.some_method) == 'mocked_module.some_method'
+ assert repr(mock.attr1.attr2) == 'mocked_module.attr1.attr2'
+ assert repr(mock.attr1.attr2.meth) == 'mocked_module.attr1.attr2.meth'
+
+ assert repr(mock) == 'mocked_module'
+
+
+def test_MockObject():
+ mock = _MockObject()
+ assert isinstance(mock.some_attr, _MockObject)
+ assert isinstance(mock.some_method, _MockObject)
+ assert isinstance(mock.attr1.attr2, _MockObject)
+ assert isinstance(mock.attr1.attr2.meth(), _MockObject)
+
+ # subclassing
+ class SubClass(mock.SomeClass):
+ """docstring of SubClass"""
+
+ def method(self):
+ return "string"
+
+ obj = SubClass()
+ assert SubClass.__doc__ == "docstring of SubClass"
+ assert isinstance(obj, SubClass)
+ assert obj.method() == "string"
+ assert isinstance(obj.other_method(), SubClass)
+
+ # parametrized type
+ T = TypeVar('T')
+
+ class SubClass2(mock.SomeClass[T]):
+ """docstring of SubClass"""
+
+ obj2 = SubClass2()
+ assert SubClass2.__doc__ == "docstring of SubClass"
+ assert isinstance(obj2, SubClass2)
+
+
+def test_mock():
+ modname = 'sphinx.unknown'
+ submodule = modname + '.submodule'
+ assert modname not in sys.modules
+ with pytest.raises(ImportError):
+ import_module(modname)
+
+ with mock([modname]):
+ import_module(modname)
+ assert modname in sys.modules
+ assert isinstance(sys.modules[modname], _MockModule)
+
+ # submodules are also mocked
+ import_module(submodule)
+ assert submodule in sys.modules
+ assert isinstance(sys.modules[submodule], _MockModule)
+
+ assert modname not in sys.modules
+ with pytest.raises(ImportError):
+ import_module(modname)
+
+
+def test_mock_does_not_follow_upper_modules():
+ with mock(['sphinx.unknown.module']): # NoQA: SIM117
+ with pytest.raises(ImportError):
+ import_module('sphinx.unknown')
+
+
+def test_abc_MockObject():
+ mock = _MockObject()
+
+ class Base:
+ @abc.abstractmethod
+ def __init__(self):
+ pass
+
+ class Derived(Base, mock.SubClass):
+ pass
+
+ obj = Derived()
+ assert isinstance(obj, Base)
+ assert isinstance(obj, _MockObject)
+ assert isinstance(obj.some_method(), Derived)
+
+
+def test_mock_decorator():
+ mock = _MockObject()
+
+ @mock.function_deco
+ def func():
+ pass
+
+ class Foo:
+ @mock.method_deco
+ def meth(self):
+ pass
+
+ @classmethod
+ @mock.method_deco
+ def class_meth(cls):
+ pass
+
+ @mock.class_deco
+ class Bar:
+ pass
+
+ @mock.funcion_deco(Foo)
+ class Baz:
+ pass
+
+ assert undecorate(func).__name__ == "func"
+ assert undecorate(Foo.meth).__name__ == "meth"
+ assert undecorate(Foo.class_meth).__name__ == "class_meth"
+ assert undecorate(Bar).__name__ == "Bar"
+ assert undecorate(Baz).__name__ == "Baz"
+
+
+def test_ismock():
+ with mock(['sphinx.unknown']):
+ mod1 = import_module('sphinx.unknown')
+ mod2 = import_module('sphinx.application')
+
+ class Inherited(mod1.Class):
+ pass
+
+ assert ismock(mod1) is True
+ assert ismock(mod1.Class) is True
+ assert ismock(mod1.submod.Class) is True
+ assert ismock(Inherited) is False
+
+ assert ismock(mod2) is False
+ assert ismock(mod2.Sphinx) is False
diff --git a/tests/test_ext_autodoc_preserve_defaults.py b/tests/test_ext_autodoc_preserve_defaults.py
new file mode 100644
index 0000000..70b6146
--- /dev/null
+++ b/tests/test_ext_autodoc_preserve_defaults.py
@@ -0,0 +1,192 @@
+"""Test the autodoc extension."""
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_preserve_defaults': True})
+def test_preserve_defaults(app):
+ color = "0xFFFFFF"
+
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.preserve_defaults', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.preserve_defaults',
+ '',
+ '',
+ '.. py:class:: Class()',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Class.clsmeth(name: str = CONSTANT, sentinel: ~typing.Any = '
+ 'SENTINEL, now: ~datetime.datetime = datetime.now(), color: int = %s, *, '
+ 'kwarg1, kwarg2=%s) -> None' % (color, color),
+ ' :module: target.preserve_defaults',
+ ' :classmethod:',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:method:: Class.meth(name: str = CONSTANT, sentinel: ~typing.Any = '
+ 'SENTINEL, now: ~datetime.datetime = datetime.now(), color: int = %s, *, '
+ 'kwarg1, kwarg2=%s) -> None' % (color, color),
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: MultiLine()',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: MultiLine.prop1',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: MultiLine.prop2',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: MultiLine.prop3',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: MultiLine.prop4',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:property:: MultiLine.prop5',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: foo(name: str = CONSTANT, sentinel: ~typing.Any = SENTINEL, '
+ 'now: ~datetime.datetime = datetime.now(), color: int = %s, *, kwarg1, '
+ 'kwarg2=%s) -> None' % (color, color),
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: get_sentinel(custom=SENTINEL)',
+ ' :module: target.preserve_defaults',
+ '',
+ ' docstring',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc',
+ confoverrides={'autodoc_preserve_defaults': True})
+def test_preserve_defaults_special_constructs(app):
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.preserve_defaults_special_constructs', options)
+
+ # * dataclasses.dataclass:
+ # - __init__ source code is not available
+ # - default values specified at class level are not discovered
+ # - values wrapped in a field(...) expression cannot be analyzed
+ # easily even if annotations were to be parsed
+ # * typing.NamedTuple:
+ # - __init__ source code is not available
+ # - default values specified at class level are not discovered
+ # * collections.namedtuple:
+ # - default values are specified as "default=(d1, d2, ...)"
+ #
+ # In the future, it might be possible to find some additional default
+ # values by parsing the source code of the annotations but the task is
+ # rather complex.
+
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.preserve_defaults_special_constructs',
+ '',
+ '',
+ '.. py:class:: DataClass('
+ 'a: int, b: object = <object object>, c: list[int] = <factory>)',
+ ' :module: target.preserve_defaults_special_constructs',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: DataClassNoInit()',
+ ' :module: target.preserve_defaults_special_constructs',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: MyNamedTuple1('
+ 'a: int, b: object = <object object>, c: list[int] = [1, 2, 3])',
+ ' :module: target.preserve_defaults_special_constructs',
+ '',
+ ' docstring',
+ '',
+ '',
+ ' .. py:attribute:: MyNamedTuple1.a',
+ ' :module: target.preserve_defaults_special_constructs',
+ ' :type: int',
+ '',
+ ' Alias for field number 0',
+ '',
+ '',
+ ' .. py:attribute:: MyNamedTuple1.b',
+ ' :module: target.preserve_defaults_special_constructs',
+ ' :type: object',
+ '',
+ ' Alias for field number 1',
+ '',
+ '',
+ ' .. py:attribute:: MyNamedTuple1.c',
+ ' :module: target.preserve_defaults_special_constructs',
+ ' :type: list[int]',
+ '',
+ ' Alias for field number 2',
+ '',
+ '',
+ '.. py:class:: MyNamedTuple2(a=0, b=<object object>)',
+ ' :module: target.preserve_defaults_special_constructs',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:class:: MyTypedDict',
+ ' :module: target.preserve_defaults_special_constructs',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:data:: SENTINEL',
+ ' :module: target.preserve_defaults_special_constructs',
+ ' :value: <object object>',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: foo(x, y, z=SENTINEL)',
+ ' :module: target.preserve_defaults_special_constructs',
+ '',
+ ' docstring',
+ '',
+ '',
+ '.. py:function:: ze_lambda(z=SENTINEL)',
+ ' :module: target.preserve_defaults_special_constructs',
+ '',
+ ' docstring',
+ '',
+ ]
diff --git a/tests/test_ext_autodoc_private_members.py b/tests/test_ext_autodoc_private_members.py
new file mode 100644
index 0000000..bf707bf
--- /dev/null
+++ b/tests/test_ext_autodoc_private_members.py
@@ -0,0 +1,158 @@
+"""Test the autodoc extension. This tests mainly for private-members option.
+"""
+
+import pytest
+
+from .test_ext_autodoc import do_autodoc
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_private_field(app):
+ app.config.autoclass_content = 'class'
+ options = {"members": None}
+ actual = do_autodoc(app, 'module', 'target.private', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.private',
+ '',
+ '',
+ '.. py:data:: _PUBLIC_CONSTANT',
+ ' :module: target.private',
+ ' :value: None',
+ '',
+ ' :meta public:',
+ '',
+ '',
+ '.. py:function:: _public_function(name)',
+ ' :module: target.private',
+ '',
+ ' public_function is a docstring().',
+ '',
+ ' :meta public:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_private_field_and_private_members(app):
+ app.config.autoclass_content = 'class'
+ options = {"members": None,
+ "private-members": None}
+ actual = do_autodoc(app, 'module', 'target.private', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.private',
+ '',
+ '',
+ '.. py:data:: PRIVATE_CONSTANT',
+ ' :module: target.private',
+ ' :value: None',
+ '',
+ ' :meta private:',
+ '',
+ '',
+ '.. py:data:: _PUBLIC_CONSTANT',
+ ' :module: target.private',
+ ' :value: None',
+ '',
+ ' :meta public:',
+ '',
+ '',
+ '.. py:function:: _public_function(name)',
+ ' :module: target.private',
+ '',
+ ' public_function is a docstring().',
+ '',
+ ' :meta public:',
+ '',
+ '',
+ '.. py:function:: private_function(name)',
+ ' :module: target.private',
+ '',
+ ' private_function is a docstring().',
+ '',
+ ' :meta private:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_private_members(app):
+ app.config.autoclass_content = 'class'
+ options = {"members": None,
+ "private-members": "_PUBLIC_CONSTANT,_public_function"}
+ actual = do_autodoc(app, 'module', 'target.private', options)
+ assert list(actual) == [
+ '',
+ '.. py:module:: target.private',
+ '',
+ '',
+ '.. py:data:: _PUBLIC_CONSTANT',
+ ' :module: target.private',
+ ' :value: None',
+ '',
+ ' :meta public:',
+ '',
+ '',
+ '.. py:function:: _public_function(name)',
+ ' :module: target.private',
+ '',
+ ' public_function is a docstring().',
+ '',
+ ' :meta public:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_private_attributes(app):
+ app.config.autoclass_content = 'class'
+ options = {"members": None}
+ actual = do_autodoc(app, 'class', 'target.private.Foo', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.private',
+ '',
+ '',
+ ' .. py:attribute:: Foo._public_attribute',
+ ' :module: target.private',
+ ' :value: 47',
+ '',
+ ' A public class attribute whose name starts with an underscore.',
+ '',
+ ' :meta public:',
+ '',
+ ]
+
+
+@pytest.mark.sphinx('html', testroot='ext-autodoc')
+def test_private_attributes_and_private_members(app):
+ app.config.autoclass_content = 'class'
+ options = {"members": None,
+ "private-members": None}
+ actual = do_autodoc(app, 'class', 'target.private.Foo', options)
+ assert list(actual) == [
+ '',
+ '.. py:class:: Foo()',
+ ' :module: target.private',
+ '',
+ '',
+ ' .. py:attribute:: Foo._public_attribute',
+ ' :module: target.private',
+ ' :value: 47',
+ '',
+ ' A public class attribute whose name starts with an underscore.',
+ '',
+ ' :meta public:',
+ '',
+ '',
+ ' .. py:attribute:: Foo.private_attribute',
+ ' :module: target.private',
+ ' :value: 11',
+ '',
+ ' A private class attribute whose name does not start with an underscore.',
+ '',
+ ' :meta private:',
+ '',
+ ]
diff --git a/tests/test_ext_autosectionlabel.py b/tests/test_ext_autosectionlabel.py
new file mode 100644
index 0000000..f99a6d3
--- /dev/null
+++ b/tests/test_ext_autosectionlabel.py
@@ -0,0 +1,77 @@
+"""Test sphinx.ext.autosectionlabel extension."""
+
+import re
+
+import pytest
+
+
+@pytest.mark.sphinx('html', testroot='ext-autosectionlabel')
+def test_autosectionlabel_html(app, status, warning, skipped_labels=False):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ html = ('<li><p><a class="reference internal" href="#introduce-of-sphinx">'
+ '<span class=".*?">Introduce of Sphinx</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ html = ('<li><p><a class="reference internal" href="#installation">'
+ '<span class="std std-ref">Installation</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ html = ('<li><p><a class="reference internal" href="#for-windows-users">'
+ '<span class="std std-ref">For Windows users</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ html = ('<li><p><a class="reference internal" href="#for-unix-users">'
+ '<span class="std std-ref">For UNIX users</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ html = ('<li><p><a class="reference internal" href="#linux">'
+ '<span class="std std-ref">Linux</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ html = ('<li><p><a class="reference internal" href="#freebsd">'
+ '<span class="std std-ref">FreeBSD</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ # for smart_quotes (refs: #4027)
+ html = ('<li><p><a class="reference internal" '
+ 'href="#this-one-s-got-an-apostrophe">'
+ '<span class="std std-ref">This one’s got an apostrophe'
+ '</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+
+# Re-use test definition from above, just change the test root directory
+@pytest.mark.sphinx('html', testroot='ext-autosectionlabel-prefix-document')
+def test_autosectionlabel_prefix_document_html(app, status, warning):
+ test_autosectionlabel_html(app, status, warning)
+
+
+@pytest.mark.sphinx('html', testroot='ext-autosectionlabel',
+ confoverrides={'autosectionlabel_maxdepth': 3})
+def test_autosectionlabel_maxdepth(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ # depth: 1
+ html = ('<li><p><a class="reference internal" href="#test-ext-autosectionlabel">'
+ '<span class=".*?">test-ext-autosectionlabel</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ # depth: 2
+ html = ('<li><p><a class="reference internal" href="#installation">'
+ '<span class="std std-ref">Installation</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ # depth: 3
+ html = ('<li><p><a class="reference internal" href="#for-windows-users">'
+ '<span class="std std-ref">For Windows users</span></a></p></li>')
+ assert re.search(html, content, re.S)
+
+ # depth: 4
+ html = '<li><p><span class="xref std std-ref">Linux</span></p></li>'
+ assert re.search(html, content, re.S)
+
+ assert "WARNING: undefined label: 'linux'" in warning.getvalue()
diff --git a/tests/test_ext_autosummary.py b/tests/test_ext_autosummary.py
new file mode 100644
index 0000000..43f3ae0
--- /dev/null
+++ b/tests/test_ext_autosummary.py
@@ -0,0 +1,686 @@
+"""Test the autosummary extension."""
+
+import sys
+from io import StringIO
+from pathlib import Path
+from unittest.mock import Mock, patch
+
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.ext.autosummary import (
+ autosummary_table,
+ autosummary_toc,
+ extract_summary,
+ import_by_name,
+ mangle_signature,
+)
+from sphinx.ext.autosummary.generate import (
+ AutosummaryEntry,
+ generate_autosummary_content,
+ generate_autosummary_docs,
+)
+from sphinx.ext.autosummary.generate import main as autogen_main
+from sphinx.testing.util import assert_node, etree_parse
+from sphinx.util.docutils import new_document
+
+try:
+ from contextlib import chdir
+except ImportError:
+ from sphinx.util.osutil import _chdir as chdir
+
+html_warnfile = StringIO()
+
+
+default_kw = {
+ 'testroot': 'autosummary',
+ 'confoverrides': {
+ 'extensions': ['sphinx.ext.autosummary'],
+ 'autosummary_generate': True,
+ 'autosummary_generate_overwrite': False,
+ 'source_suffix': '.rst',
+ },
+}
+
+
+@pytest.fixture(autouse=True)
+def _unload_target_module():
+ sys.modules.pop('target', None)
+
+
+def test_mangle_signature():
+ TEST = """
+ () :: ()
+ (a, b, c, d, e) :: (a, b, c, d, e)
+ (a, b, c=1, d=2, e=3) :: (a, b[, c, d, e])
+ (a, b, aaa=1, bbb=1, ccc=1, eee=1, fff=1, ggg=1, hhh=1, iii=1, jjj=1)\
+ :: (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=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])
+ (a=1, b=T(a=1, b=2), c=3) :: ([a, b, c])
+ (a: Tuple[int, str], b: int) -> str :: (a, b)
+ """
+
+ TEST = [[y.strip() for y in x.split("::")] for x in TEST.split("\n")
+ if '::' in x]
+ for inp, outp in TEST:
+ res = mangle_signature(inp).strip().replace("\u00a0", " ")
+ assert res == outp, (f"'{inp}' -> '{res}' != '{outp}'")
+
+
+def test_extract_summary(capsys):
+ settings = Mock(language_code='en',
+ id_prefix='',
+ auto_id_prefix='',
+ pep_reference=False,
+ rfc_reference=False)
+ document = new_document('', settings)
+
+ # normal case
+ doc = ['',
+ 'This is a first sentence. And second one.',
+ '',
+ 'Second block is here']
+ assert extract_summary(doc, document) == 'This is a first sentence.'
+
+ # inliner case
+ doc = ['This sentence contains *emphasis text having dots.*,',
+ 'it does not break sentence.']
+ assert extract_summary(doc, document) == ' '.join(doc)
+
+ # abbreviations
+ doc = ['Blabla, i.e. bla.']
+ assert extract_summary(doc, document) == ' '.join(doc)
+
+ doc = ['Blabla, (i.e. bla).']
+ assert extract_summary(doc, document) == ' '.join(doc)
+
+ doc = ['Blabla, e.g. bla.']
+ assert extract_summary(doc, document) == ' '.join(doc)
+
+ doc = ['Blabla, (e.g. bla).']
+ assert extract_summary(doc, document) == ' '.join(doc)
+
+ doc = ['Blabla, et al. bla.']
+ assert extract_summary(doc, document) == ' '.join(doc)
+
+ # literal
+ doc = ['blah blah::']
+ assert extract_summary(doc, document) == 'blah blah.'
+
+ # heading
+ doc = ['blah blah',
+ '=========']
+ assert extract_summary(doc, document) == 'blah blah'
+
+ doc = ['=========',
+ 'blah blah',
+ '=========']
+ assert extract_summary(doc, document) == 'blah blah'
+
+ # hyperlink target
+ doc = ['Do `this <https://www.sphinx-doc.org/>`_ and that. '
+ 'blah blah blah.']
+ assert (extract_summary(doc, document) ==
+ 'Do `this <https://www.sphinx-doc.org/>`_ and that.')
+
+ _, err = capsys.readouterr()
+ assert err == ''
+
+
+@pytest.mark.sphinx('dummy', **default_kw)
+def test_get_items_summary(make_app, app_params):
+ import sphinx.ext.autosummary
+ import sphinx.ext.autosummary.generate
+ args, kwargs = app_params
+ app = make_app(*args, **kwargs)
+ sphinx.ext.autosummary.generate.setup_documenters(app)
+ # monkey-patch Autosummary.get_items so we can easily get access to it's
+ # results..
+ orig_get_items = sphinx.ext.autosummary.Autosummary.get_items
+
+ autosummary_items = {}
+
+ def new_get_items(self, names, *args, **kwargs):
+ results = orig_get_items(self, names, *args, **kwargs)
+ for name, result in zip(names, results):
+ autosummary_items[name] = result
+ return results
+
+ def handler(app, what, name, obj, options, lines):
+ assert isinstance(lines, list)
+
+ # ensure no docstring is processed twice:
+ assert 'THIS HAS BEEN HANDLED' not in lines
+ lines.append('THIS HAS BEEN HANDLED')
+ app.connect('autodoc-process-docstring', handler)
+
+ sphinx.ext.autosummary.Autosummary.get_items = new_get_items
+ try:
+ app.builder.build_all()
+ finally:
+ sphinx.ext.autosummary.Autosummary.get_items = orig_get_items
+
+ html_warnings = app._warning.getvalue()
+ assert html_warnings == ''
+
+ expected_values = {
+ 'withSentence': 'I have a sentence which spans multiple lines.',
+ 'noSentence': "this doesn't start with a capital.",
+ 'emptyLine': "This is the real summary",
+ 'module_attr': 'This is a module attribute',
+ 'C.class_attr': 'This is a class attribute',
+ 'C.instance_attr': 'This is an instance attribute',
+ 'C.prop_attr1': 'This is a function docstring',
+ 'C.prop_attr2': 'This is a attribute docstring',
+ 'C.C2': 'This is a nested inner class docstring',
+ }
+ for key, expected in expected_values.items():
+ assert autosummary_items[key][2] == expected, 'Summary for %s was %r -'\
+ ' expected %r' % (key, autosummary_items[key], expected)
+
+ # check an item in detail
+ assert 'func' in autosummary_items
+ func_attrs = ('func',
+ '(arg_, *args, **kwargs)',
+ 'Test function take an argument ended with underscore.',
+ 'dummy_module.func')
+ assert autosummary_items['func'] == func_attrs
+
+
+def str_content(elem):
+ if elem.text is not None:
+ return elem.text
+ else:
+ return ''.join(str_content(e) for e in elem)
+
+
+@pytest.mark.sphinx('xml', **default_kw)
+def test_escaping(app, status, warning):
+ app.builder.build_all()
+
+ outdir = Path(app.builder.outdir)
+
+ docpage = outdir / 'underscore_module_.xml'
+ assert docpage.exists()
+
+ title = etree_parse(docpage).find('section/title')
+
+ assert str_content(title) == 'underscore_module_'
+
+
+@pytest.mark.sphinx(testroot='ext-autosummary')
+def test_autosummary_generate_content_for_module(app):
+ import autosummary_dummy_module
+ template = Mock()
+
+ generate_autosummary_content('autosummary_dummy_module', autosummary_dummy_module, None,
+ template, None, False, app, False, {})
+ assert template.render.call_args[0][0] == 'module'
+
+ context = template.render.call_args[0][1]
+ assert context['members'] == ['CONSTANT1', 'CONSTANT2', 'Exc', 'Foo', '_Baz', '_Exc',
+ '__all__', '__builtins__', '__cached__', '__doc__',
+ '__file__', '__name__', '__package__', '_quux', 'bar',
+ 'non_imported_member', 'quuz', 'qux']
+ assert context['functions'] == ['bar']
+ assert context['all_functions'] == ['_quux', 'bar']
+ assert context['classes'] == ['Foo']
+ assert context['all_classes'] == ['Foo', '_Baz']
+ assert context['exceptions'] == ['Exc']
+ assert context['all_exceptions'] == ['Exc', '_Exc']
+ assert context['attributes'] == ['CONSTANT1', 'qux', 'quuz', 'non_imported_member']
+ assert context['all_attributes'] == ['CONSTANT1', 'qux', 'quuz', 'non_imported_member']
+ assert context['fullname'] == 'autosummary_dummy_module'
+ assert context['module'] == 'autosummary_dummy_module'
+ assert context['objname'] == ''
+ assert context['name'] == ''
+ assert context['objtype'] == 'module'
+
+
+@pytest.mark.sphinx(testroot='ext-autosummary')
+def test_autosummary_generate_content_for_module___all__(app):
+ import autosummary_dummy_module
+ template = Mock()
+ app.config.autosummary_ignore_module_all = False
+
+ generate_autosummary_content('autosummary_dummy_module', autosummary_dummy_module, None,
+ template, None, False, app, False, {})
+ assert template.render.call_args[0][0] == 'module'
+
+ context = template.render.call_args[0][1]
+ assert context['members'] == ['CONSTANT1', 'Exc', 'Foo', '_Baz', 'bar', 'qux', 'path']
+ assert context['functions'] == ['bar']
+ assert context['all_functions'] == ['bar']
+ assert context['classes'] == ['Foo']
+ assert context['all_classes'] == ['Foo', '_Baz']
+ assert context['exceptions'] == ['Exc']
+ assert context['all_exceptions'] == ['Exc']
+ assert context['attributes'] == ['CONSTANT1', 'qux']
+ assert context['all_attributes'] == ['CONSTANT1', 'qux']
+ assert context['fullname'] == 'autosummary_dummy_module'
+ assert context['module'] == 'autosummary_dummy_module'
+ assert context['objname'] == ''
+ assert context['name'] == ''
+ assert context['objtype'] == 'module'
+
+
+@pytest.mark.sphinx(testroot='ext-autosummary')
+def test_autosummary_generate_content_for_module_skipped(app):
+ import autosummary_dummy_module
+ template = Mock()
+
+ def skip_member(app, what, name, obj, skip, options):
+ if name in ('Foo', 'bar', 'Exc'):
+ return True
+ return None
+
+ app.connect('autodoc-skip-member', skip_member)
+ generate_autosummary_content('autosummary_dummy_module', autosummary_dummy_module, None,
+ template, None, False, app, False, {})
+ context = template.render.call_args[0][1]
+ assert context['members'] == ['CONSTANT1', 'CONSTANT2', '_Baz', '_Exc', '__all__',
+ '__builtins__', '__cached__', '__doc__', '__file__',
+ '__name__', '__package__', '_quux', 'non_imported_member',
+ 'quuz', 'qux']
+ assert context['functions'] == []
+ assert context['classes'] == []
+ assert context['exceptions'] == []
+
+
+@pytest.mark.sphinx(testroot='ext-autosummary')
+def test_autosummary_generate_content_for_module_imported_members(app):
+ import autosummary_dummy_module
+ template = Mock()
+
+ generate_autosummary_content('autosummary_dummy_module', autosummary_dummy_module, None,
+ template, None, True, app, False, {})
+ assert template.render.call_args[0][0] == 'module'
+
+ context = template.render.call_args[0][1]
+ assert context['members'] == ['CONSTANT1', 'CONSTANT2', 'Class', 'Exc', 'Foo', 'Union',
+ '_Baz', '_Exc', '__all__', '__builtins__', '__cached__',
+ '__doc__', '__file__', '__loader__', '__name__',
+ '__package__', '__spec__', '_quux', 'bar',
+ 'considered_as_imported', 'non_imported_member', 'path',
+ 'quuz', 'qux']
+ assert context['functions'] == ['bar']
+ assert context['all_functions'] == ['_quux', 'bar']
+ assert context['classes'] == ['Class', 'Foo']
+ assert context['all_classes'] == ['Class', 'Foo', '_Baz']
+ assert context['exceptions'] == ['Exc']
+ assert context['all_exceptions'] == ['Exc', '_Exc']
+ assert context['attributes'] == ['CONSTANT1', 'qux', 'quuz', 'non_imported_member']
+ assert context['all_attributes'] == ['CONSTANT1', 'qux', 'quuz', 'non_imported_member']
+ assert context['fullname'] == 'autosummary_dummy_module'
+ assert context['module'] == 'autosummary_dummy_module'
+ assert context['objname'] == ''
+ assert context['name'] == ''
+ assert context['objtype'] == 'module'
+
+
+@pytest.mark.sphinx(testroot='ext-autosummary')
+def test_autosummary_generate_content_for_module_imported_members_inherited_module(app):
+ import autosummary_dummy_inherited_module
+ template = Mock()
+
+ generate_autosummary_content('autosummary_dummy_inherited_module',
+ autosummary_dummy_inherited_module, None,
+ template, None, True, app, False, {})
+ assert template.render.call_args[0][0] == 'module'
+
+ context = template.render.call_args[0][1]
+ assert context['members'] == ['Foo', 'InheritedAttrClass', '__all__', '__builtins__', '__cached__',
+ '__doc__', '__file__', '__loader__', '__name__',
+ '__package__', '__spec__']
+ assert context['functions'] == []
+ assert context['classes'] == ['Foo', 'InheritedAttrClass']
+ assert context['exceptions'] == []
+ assert context['all_exceptions'] == []
+ assert context['attributes'] == []
+ assert context['all_attributes'] == []
+ assert context['fullname'] == 'autosummary_dummy_inherited_module'
+ assert context['module'] == 'autosummary_dummy_inherited_module'
+ assert context['objname'] == ''
+ assert context['name'] == ''
+ assert context['objtype'] == 'module'
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary')
+def test_autosummary_generate(app, status, warning):
+ app.builder.build_all()
+
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree, (nodes.paragraph,
+ nodes.paragraph,
+ addnodes.tabular_col_spec,
+ autosummary_table,
+ [autosummary_toc, addnodes.toctree]))
+ assert_node(doctree[3],
+ [autosummary_table, nodes.table, nodes.tgroup, (nodes.colspec,
+ nodes.colspec,
+ [nodes.tbody, (nodes.row,
+ nodes.row,
+ nodes.row,
+ nodes.row,
+ nodes.row,
+ nodes.row,
+ nodes.row,
+ nodes.row)])])
+ assert_node(doctree[4][0], addnodes.toctree, caption="An autosummary")
+
+ assert len(doctree[3][0][0][2]) == 8
+ assert doctree[3][0][0][2][0].astext() == 'autosummary_dummy_module\n\n'
+ assert doctree[3][0][0][2][1].astext() == 'autosummary_dummy_module.Foo()\n\n'
+ assert doctree[3][0][0][2][2].astext() == 'autosummary_dummy_module.Foo.Bar()\n\n'
+ assert doctree[3][0][0][2][3].astext() == 'autosummary_dummy_module.Foo.value\n\ndocstring'
+ assert doctree[3][0][0][2][4].astext() == 'autosummary_dummy_module.bar(x[, y])\n\n'
+ assert doctree[3][0][0][2][5].astext() == 'autosummary_dummy_module.qux\n\na module-level attribute'
+ assert doctree[3][0][0][2][6].astext() == 'autosummary_dummy_inherited_module.InheritedAttrClass()\n\n'
+ assert doctree[3][0][0][2][7].astext() == 'autosummary_dummy_inherited_module.InheritedAttrClass.subclassattr\n\nother docstring'
+
+ module = (app.srcdir / 'generated' / 'autosummary_dummy_module.rst').read_text(encoding='utf8')
+
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' Foo\n'
+ ' \n' in module)
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' CONSTANT1\n'
+ ' qux\n'
+ ' quuz\n'
+ ' non_imported_member\n'
+ ' \n' in module)
+
+ Foo = (app.srcdir / 'generated' / 'autosummary_dummy_module.Foo.rst').read_text(encoding='utf8')
+ assert '.. automethod:: __init__' in Foo
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' ~Foo.__init__\n'
+ ' ~Foo.bar\n'
+ ' \n' in Foo)
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' ~Foo.CONSTANT3\n'
+ ' ~Foo.CONSTANT4\n'
+ ' ~Foo.baz\n'
+ ' ~Foo.value\n'
+ ' \n' in Foo)
+
+ FooBar = (app.srcdir / 'generated' / 'autosummary_dummy_module.Foo.Bar.rst').read_text(encoding='utf8')
+ assert ('.. currentmodule:: autosummary_dummy_module\n'
+ '\n'
+ '.. autoclass:: Foo.Bar\n' in FooBar)
+
+ Foo_value = (app.srcdir / 'generated' / 'autosummary_dummy_module.Foo.value.rst').read_text(encoding='utf8')
+ assert ('.. currentmodule:: autosummary_dummy_module\n'
+ '\n'
+ '.. autoattribute:: Foo.value' in Foo_value)
+
+ qux = (app.srcdir / 'generated' / 'autosummary_dummy_module.qux.rst').read_text(encoding='utf8')
+ assert ('.. currentmodule:: autosummary_dummy_module\n'
+ '\n'
+ '.. autodata:: qux' in qux)
+
+ InheritedAttrClass = (app.srcdir / 'generated' / 'autosummary_dummy_inherited_module.InheritedAttrClass.rst').read_text(encoding='utf8')
+ print(InheritedAttrClass)
+ assert '.. automethod:: __init__' in Foo
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' ~InheritedAttrClass.__init__\n'
+ ' ~InheritedAttrClass.bar\n'
+ ' \n' in InheritedAttrClass)
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' ~InheritedAttrClass.CONSTANT3\n'
+ ' ~InheritedAttrClass.CONSTANT4\n'
+ ' ~InheritedAttrClass.baz\n'
+ ' ~InheritedAttrClass.subclassattr\n'
+ ' ~InheritedAttrClass.value\n'
+ ' \n' in InheritedAttrClass)
+
+ InheritedAttrClass_subclassattr = (app.srcdir / 'generated' / 'autosummary_dummy_inherited_module.InheritedAttrClass.subclassattr.rst').read_text(encoding='utf8')
+ assert ('.. currentmodule:: autosummary_dummy_inherited_module\n'
+ '\n'
+ '.. autoattribute:: InheritedAttrClass.subclassattr' in InheritedAttrClass_subclassattr)
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary',
+ confoverrides={'autosummary_generate_overwrite': False})
+def test_autosummary_generate_overwrite1(app_params, make_app):
+ args, kwargs = app_params
+ srcdir = kwargs.get('srcdir')
+
+ (srcdir / 'generated').mkdir(parents=True, exist_ok=True)
+ (srcdir / 'generated' / 'autosummary_dummy_module.rst').write_text('', encoding='utf8')
+
+ app = make_app(*args, **kwargs)
+ content = (srcdir / 'generated' / 'autosummary_dummy_module.rst').read_text(encoding='utf8')
+ assert content == ''
+ assert 'autosummary_dummy_module.rst' not in app._warning.getvalue()
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary',
+ confoverrides={'autosummary_generate_overwrite': True})
+def test_autosummary_generate_overwrite2(app_params, make_app):
+ args, kwargs = app_params
+ srcdir = kwargs.get('srcdir')
+
+ (srcdir / 'generated').mkdir(parents=True, exist_ok=True)
+ (srcdir / 'generated' / 'autosummary_dummy_module.rst').write_text('', encoding='utf8')
+
+ app = make_app(*args, **kwargs)
+ content = (srcdir / 'generated' / 'autosummary_dummy_module.rst').read_text(encoding='utf8')
+ assert content != ''
+ assert 'autosummary_dummy_module.rst' not in app._warning.getvalue()
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary-recursive')
+@pytest.mark.usefixtures("rollback_sysmodules")
+def test_autosummary_recursive(app, status, warning):
+ sys.modules.pop('package', None) # unload target module to clear the module cache
+
+ app.build()
+
+ # autosummary having :recursive: option
+ assert (app.srcdir / 'generated' / 'package.rst').exists()
+ assert (app.srcdir / 'generated' / 'package.module.rst').exists()
+ assert (app.srcdir / 'generated' / 'package.module_importfail.rst').exists() is False
+ assert (app.srcdir / 'generated' / 'package.package.rst').exists()
+ assert (app.srcdir / 'generated' / 'package.package.module.rst').exists()
+
+ # autosummary not having :recursive: option
+ assert (app.srcdir / 'generated' / 'package2.rst').exists()
+ assert (app.srcdir / 'generated' / 'package2.module.rst').exists() is False
+
+ # Check content of recursively generated stub-files
+ content = (app.srcdir / 'generated' / 'package.rst').read_text(encoding='utf8')
+ assert 'package.module' in content
+ assert 'package.package' in content
+ assert 'package.module_importfail' in content
+
+ content = (app.srcdir / 'generated' / 'package.package.rst').read_text(encoding='utf8')
+ assert 'package.package.module' in content
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary-recursive',
+ srcdir='test_autosummary_recursive_skips_mocked_modules',
+ confoverrides={'autosummary_mock_imports': ['package.package']})
+@pytest.mark.usefixtures("rollback_sysmodules")
+def test_autosummary_recursive_skips_mocked_modules(app, status, warning):
+ sys.modules.pop('package', None) # unload target module to clear the module cache
+ app.build()
+
+ assert (app.srcdir / 'generated' / 'package.rst').exists()
+ assert (app.srcdir / 'generated' / 'package.module.rst').exists()
+ assert (app.srcdir / 'generated' / 'package.package.rst').exists() is False
+ assert (app.srcdir / 'generated' / 'package.package.module.rst').exists() is False
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary-filename-map')
+def test_autosummary_filename_map(app, status, warning):
+ app.build()
+
+ assert (app.srcdir / 'generated' / 'module_mangled.rst').exists()
+ assert not (app.srcdir / 'generated' / 'autosummary_dummy_module.rst').exists()
+ assert (app.srcdir / 'generated' / 'bar.rst').exists()
+ assert not (app.srcdir / 'generated' / 'autosummary_dummy_module.bar.rst').exists()
+ assert (app.srcdir / 'generated' / 'autosummary_dummy_module.Foo.rst').exists()
+
+ html_warnings = app._warning.getvalue()
+ assert html_warnings == ''
+
+
+@pytest.mark.sphinx('latex', **default_kw)
+def test_autosummary_latex_table_colspec(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ print(status.getvalue())
+ print(warning.getvalue())
+ assert r'\begin{longtable}{\X{1}{2}\X{1}{2}}' in result
+ assert r'p{0.5\linewidth}' not in result
+
+
+def test_import_by_name():
+ import sphinx
+ import sphinx.ext.autosummary
+
+ prefixed_name, obj, parent, modname = import_by_name('sphinx')
+ assert prefixed_name == 'sphinx'
+ assert obj is sphinx
+ assert parent is None
+ assert modname == 'sphinx'
+
+ prefixed_name, obj, parent, modname = import_by_name('sphinx.ext.autosummary.__name__')
+ assert prefixed_name == 'sphinx.ext.autosummary.__name__'
+ assert obj is sphinx.ext.autosummary.__name__
+ assert parent is sphinx.ext.autosummary
+ assert modname == 'sphinx.ext.autosummary'
+
+ prefixed_name, obj, parent, modname = \
+ import_by_name('sphinx.ext.autosummary.Autosummary.get_items')
+ assert prefixed_name == 'sphinx.ext.autosummary.Autosummary.get_items'
+ assert obj == sphinx.ext.autosummary.Autosummary.get_items
+ assert parent is sphinx.ext.autosummary.Autosummary
+ assert modname == 'sphinx.ext.autosummary'
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary-mock_imports')
+def test_autosummary_mock_imports(app, status, warning):
+ try:
+ app.build()
+ assert warning.getvalue() == ''
+
+ # generated/foo is generated successfully
+ assert app.env.get_doctree('generated/foo')
+ finally:
+ sys.modules.pop('foo', None) # unload foo module
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary-imported_members')
+def test_autosummary_imported_members(app, status, warning):
+ try:
+ app.build()
+ # generated/foo is generated successfully
+ assert app.env.get_doctree('generated/autosummary_dummy_package')
+
+ module = (app.srcdir / 'generated' / 'autosummary_dummy_package.rst').read_text(encoding='utf8')
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' Bar\n'
+ ' \n' in module)
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' foo\n'
+ ' \n' in module)
+ finally:
+ sys.modules.pop('autosummary_dummy_package', None)
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary-module_all')
+def test_autosummary_module_all(app, status, warning):
+ try:
+ app.build()
+ # generated/foo is generated successfully
+ assert app.env.get_doctree('generated/autosummary_dummy_package_all')
+ module = (app.srcdir / 'generated' / 'autosummary_dummy_package_all.rst').read_text(encoding='utf8')
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' PublicBar\n'
+ ' \n' in module)
+ assert (' .. autosummary::\n'
+ ' \n'
+ ' public_foo\n'
+ ' public_baz\n'
+ ' \n' in module)
+ assert ('.. autosummary::\n'
+ ' :toctree:\n'
+ ' :recursive:\n\n'
+ ' autosummary_dummy_package_all.extra_dummy_module\n\n' in module)
+ finally:
+ sys.modules.pop('autosummary_dummy_package_all', None)
+
+
+@pytest.mark.sphinx(testroot='ext-autodoc',
+ confoverrides={'extensions': ['sphinx.ext.autosummary']})
+def test_generate_autosummary_docs_property(app):
+ with patch('sphinx.ext.autosummary.generate.find_autosummary_in_files') as mock:
+ mock.return_value = [AutosummaryEntry('target.methods.Base.prop', 'prop', None, False)]
+ generate_autosummary_docs([], output_dir=app.srcdir, app=app)
+
+ content = (app.srcdir / 'target.methods.Base.prop.rst').read_text(encoding='utf8')
+ assert content == ("target.methods.Base.prop\n"
+ "========================\n"
+ "\n"
+ ".. currentmodule:: target.methods\n"
+ "\n"
+ ".. autoproperty:: Base.prop")
+
+
+@pytest.mark.sphinx(testroot='ext-autosummary-skip-member')
+def test_autosummary_skip_member(app):
+ app.build()
+
+ content = (app.srcdir / 'generate' / 'target.Foo.rst').read_text(encoding='utf8')
+ assert 'Foo.skipmeth' not in content
+ assert 'Foo._privatemeth' in content
+
+
+@pytest.mark.sphinx(testroot='ext-autosummary-template')
+def test_autosummary_template(app):
+ app.build()
+
+ content = (app.srcdir / 'generate' / 'target.Foo.rst').read_text(encoding='utf8')
+ assert 'EMPTY' in content
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary',
+ confoverrides={'autosummary_generate': []})
+def test_empty_autosummary_generate(app, status, warning):
+ app.build()
+ assert ("WARNING: autosummary: failed to import autosummary_importfail"
+ in warning.getvalue())
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-autosummary',
+ confoverrides={'autosummary_generate': ['unknown']})
+def test_invalid_autosummary_generate(app, status, warning):
+ assert 'WARNING: autosummary_generate: file not found: unknown.rst' in warning.getvalue()
+
+
+def test_autogen(rootdir, tmp_path):
+ with chdir(rootdir / 'test-templating'):
+ args = ['-o', str(tmp_path), '-t', '.', 'autosummary_templating.txt']
+ autogen_main(args)
+ assert (tmp_path / 'sphinx.application.TemplateBridge.rst').exists()
diff --git a/tests/test_ext_coverage.py b/tests/test_ext_coverage.py
new file mode 100644
index 0000000..af8cf53
--- /dev/null
+++ b/tests/test_ext_coverage.py
@@ -0,0 +1,101 @@
+"""Test the coverage builder."""
+
+import pickle
+
+import pytest
+
+
+@pytest.mark.sphinx('coverage')
+def test_build(app, status, warning):
+ app.builder.build_all()
+
+ py_undoc = (app.outdir / 'python.txt').read_text(encoding='utf8')
+ assert py_undoc.startswith('Undocumented Python objects\n'
+ '===========================\n')
+ assert 'autodoc_target\n--------------\n' in py_undoc
+ assert ' * Class -- missing methods:\n' in py_undoc
+ assert ' * raises\n' in py_undoc
+ 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 py_undoc # in the "failed import" section
+
+ assert "undocumented py" not in status.getvalue()
+
+ c_undoc = (app.outdir / 'c.txt').read_text(encoding='utf8')
+ 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, py_undocumented, py_documented = pickle.loads((app.outdir / 'undoc.pickle').read_bytes())
+ assert len(undoc_c) == 1
+ # the key is the full path to the header file, which isn't testable
+ assert list(undoc_c.values())[0] == {('function', 'Py_SphinxTest')}
+
+ assert 'autodoc_target' in undoc_py
+ assert 'funcs' in undoc_py['autodoc_target']
+ assert 'raises' in undoc_py['autodoc_target']['funcs']
+ assert 'classes' in undoc_py['autodoc_target']
+ assert 'Class' in undoc_py['autodoc_target']['classes']
+ assert 'undocmeth' in undoc_py['autodoc_target']['classes']['Class']
+
+ assert "undocumented c" not in status.getvalue()
+
+
+@pytest.mark.sphinx('coverage', testroot='ext-coverage')
+def test_coverage_ignore_pyobjects(app, status, warning):
+ app.builder.build_all()
+ actual = (app.outdir / 'python.txt').read_text(encoding='utf8')
+ expected = '''\
+Undocumented Python objects
+===========================
+
+Statistics
+----------
+
++----------------------+----------+--------------+
+| Module | Coverage | Undocumented |
++======================+==========+==============+
+| coverage_not_ignored | 0.00% | 2 |
++----------------------+----------+--------------+
+| TOTAL | 0.00% | 2 |
++----------------------+----------+--------------+
+
+coverage_not_ignored
+--------------------
+
+Classes:
+ * Documented -- missing methods:
+
+ - not_ignored1
+ - not_ignored2
+ * NotIgnored
+
+'''
+ assert actual == expected
+
+
+@pytest.mark.sphinx('coverage', confoverrides={'coverage_show_missing_items': True})
+def test_show_missing_items(app, status, warning):
+ app.builder.build_all()
+
+ assert "undocumented" in status.getvalue()
+
+ assert "py function raises" in status.getvalue()
+ assert "py class Base" in status.getvalue()
+ assert "py method Class.roger" in status.getvalue()
+
+ assert "c api Py_SphinxTest [ function]" in status.getvalue()
+
+
+@pytest.mark.sphinx('coverage', confoverrides={'coverage_show_missing_items': True})
+def test_show_missing_items_quiet(app, status, warning):
+ app.quiet = True
+ app.builder.build_all()
+
+ assert "undocumented python function: autodoc_target :: raises" in warning.getvalue()
+ assert "undocumented python class: autodoc_target :: Base" in warning.getvalue()
+ assert "undocumented python method: autodoc_target :: Class :: roger" in warning.getvalue()
+
+ assert "undocumented c api: Py_SphinxTest [function]" in warning.getvalue()
diff --git a/tests/test_ext_doctest.py b/tests/test_ext_doctest.py
new file mode 100644
index 0000000..c83e582
--- /dev/null
+++ b/tests/test_ext_doctest.py
@@ -0,0 +1,136 @@
+"""Test the doctest extension."""
+import os
+from collections import Counter
+
+import pytest
+from docutils import nodes
+from packaging.specifiers import InvalidSpecifier
+from packaging.version import InvalidVersion
+
+from sphinx.ext.doctest import is_allowed_version
+
+cleanup_called = 0
+
+
+@pytest.mark.sphinx('doctest', testroot='ext-doctest')
+def test_build(app, status, warning):
+ global cleanup_called
+ cleanup_called = 0
+ app.builder.build_all()
+ if app.statuscode != 0:
+ raise AssertionError('failures in doctests:' + status.getvalue())
+ # 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'
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-doctest')
+def test_highlight_language_default(app, status, warning):
+ app.build()
+ doctree = app.env.get_doctree('doctest')
+ for node in doctree.findall(nodes.literal_block):
+ assert node['language'] in {'python', 'pycon', 'none'}
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-doctest',
+ confoverrides={'highlight_language': 'python'})
+def test_highlight_language_python3(app, status, warning):
+ app.build()
+ doctree = app.env.get_doctree('doctest')
+ for node in doctree.findall(nodes.literal_block):
+ assert node['language'] in {'python', 'pycon', 'none'}
+
+
+def test_is_allowed_version():
+ assert is_allowed_version('<3.4', '3.3') is True
+ assert is_allowed_version('<3.4', '3.3') is True
+ assert is_allowed_version('<3.2', '3.3') is False
+ assert is_allowed_version('<=3.4', '3.3') is True
+ assert is_allowed_version('<=3.2', '3.3') is False
+ assert is_allowed_version('==3.3', '3.3') is True
+ assert is_allowed_version('==3.4', '3.3') is False
+ assert is_allowed_version('>=3.2', '3.3') is True
+ assert is_allowed_version('>=3.4', '3.3') is False
+ assert is_allowed_version('>3.2', '3.3') is True
+ assert is_allowed_version('>3.4', '3.3') is False
+ assert is_allowed_version('~=3.4', '3.4.5') is True
+ assert is_allowed_version('~=3.4', '3.5.0') is True
+
+ # invalid spec
+ with pytest.raises(InvalidSpecifier):
+ is_allowed_version('&3.4', '3.5')
+
+ # invalid version
+ with pytest.raises(InvalidVersion):
+ is_allowed_version('>3.4', 'Sphinx')
+
+
+def cleanup_call():
+ global cleanup_called
+ cleanup_called += 1
+
+
+recorded_calls = Counter()
+
+
+@pytest.mark.sphinx('doctest', testroot='ext-doctest-skipif')
+def test_skipif(app, status, warning):
+ """Tests for the :skipif: option
+
+ The tests are separated into a different test root directory since the
+ ``app`` object only evaluates options once in its lifetime. If these tests
+ were combined with the other doctest tests, the ``:skipif:`` evaluations
+ would be recorded only on the first ``app.builder.build_all()`` run, i.e.
+ in ``test_build`` above, and the assertion below would fail.
+
+ """
+ global recorded_calls
+ recorded_calls = Counter()
+ app.builder.build_all()
+ if app.statuscode != 0:
+ raise AssertionError('failures in doctests:' + status.getvalue())
+ # The `:skipif:` expressions are always run.
+ # Actual tests and setup/cleanup code is only run if the `:skipif:`
+ # expression evaluates to a False value.
+ # Global setup/cleanup are run before/after evaluating the `:skipif:`
+ # option in each directive - thus 11 additional invocations for each on top
+ # of the ones made for the whole test file.
+ assert recorded_calls == {('doctest_global_setup', 'body', True): 13,
+ ('testsetup', ':skipif:', True): 1,
+ ('testsetup', ':skipif:', False): 1,
+ ('testsetup', 'body', False): 1,
+ ('doctest', ':skipif:', True): 1,
+ ('doctest', ':skipif:', False): 1,
+ ('doctest', 'body', False): 1,
+ ('testcode', ':skipif:', True): 1,
+ ('testcode', ':skipif:', False): 1,
+ ('testcode', 'body', False): 1,
+ ('testoutput-1', ':skipif:', True): 1,
+ ('testoutput-2', ':skipif:', True): 1,
+ ('testoutput-2', ':skipif:', False): 1,
+ ('testcleanup', ':skipif:', True): 1,
+ ('testcleanup', ':skipif:', False): 1,
+ ('testcleanup', 'body', False): 1,
+ ('doctest_global_cleanup', 'body', True): 13}
+
+
+def record(directive, part, should_skip):
+ recorded_calls[(directive, part, should_skip)] += 1
+ return f'Recorded {directive} {part} {should_skip}'
+
+
+@pytest.mark.sphinx('doctest', testroot='ext-doctest-with-autodoc')
+def test_reporting_with_autodoc(app, status, warning, capfd):
+ # Patch builder to get a copy of the output
+ written = []
+ app.builder._warn_out = written.append
+ app.builder.build_all()
+
+ failures = [line.replace(os.sep, '/')
+ for line in '\n'.join(written).splitlines()
+ if line.startswith('File')]
+
+ assert 'File "dir/inner.rst", line 1, in default' in failures
+ assert 'File "dir/bar.py", line ?, in default' in failures
+ assert 'File "foo.py", line ?, in default' in failures
+ assert 'File "index.rst", line 4, in default' in failures
diff --git a/tests/test_ext_duration.py b/tests/test_ext_duration.py
new file mode 100644
index 0000000..4fa4dfc
--- /dev/null
+++ b/tests/test_ext_duration.py
@@ -0,0 +1,14 @@
+"""Test sphinx.ext.duration extension."""
+
+import re
+
+import pytest
+
+
+@pytest.mark.sphinx('dummy', testroot='basic',
+ confoverrides={'extensions': ['sphinx.ext.duration']})
+def test_githubpages(app, status, warning):
+ app.build()
+
+ assert 'slowest reading durations' in status.getvalue()
+ assert re.search('\\d+\\.\\d{3} index\n', status.getvalue())
diff --git a/tests/test_ext_extlinks.py b/tests/test_ext_extlinks.py
new file mode 100644
index 0000000..7634db6
--- /dev/null
+++ b/tests/test_ext_extlinks.py
@@ -0,0 +1,45 @@
+import pytest
+
+
+@pytest.mark.sphinx('html', testroot='ext-extlinks-hardcoded-urls',
+ confoverrides={'extlinks_detect_hardcoded_links': False})
+def test_extlinks_detect_candidates(app, warning):
+ app.build()
+ assert warning.getvalue() == ''
+
+
+@pytest.mark.sphinx('html', testroot='ext-extlinks-hardcoded-urls')
+def test_replaceable_uris_emit_extlinks_warnings(app, warning):
+ app.build()
+ warning_output = warning.getvalue()
+
+ # there should be exactly three warnings for replaceable URLs
+ message = (
+ "index.rst:%d: WARNING: hardcoded link 'https://github.com/sphinx-doc/sphinx/issues/1' "
+ "could be replaced by an extlink (try using '%s' instead)"
+ )
+ assert message % (11, ":issue:`1`") in warning_output
+ assert message % (13, ":issue:`inline replaceable link <1>`") in warning_output
+ assert message % (15, ":issue:`replaceable link <1>`") in warning_output
+
+
+@pytest.mark.sphinx('html', testroot='ext-extlinks-hardcoded-urls-multiple-replacements')
+def test_all_replacements_suggested_if_multiple_replacements_possible(app, warning):
+ app.build()
+ warning_output = warning.getvalue()
+ # there should be six warnings for replaceable URLs, three pairs per link
+ assert warning_output.count("WARNING: hardcoded link") == 6
+ message = (
+ "index.rst:%d: WARNING: hardcoded link 'https://github.com/octocat' "
+ "could be replaced by an extlink (try using '%s' instead)"
+ )
+ assert message % (14, ":user:`octocat`") in warning_output
+ assert message % (16, ":user:`inline replaceable link <octocat>`") in warning_output
+ assert message % (18, ":user:`replaceable link <octocat>`") in warning_output
+ message = (
+ "index.rst:%d: WARNING: hardcoded link 'https://github.com/octocat' "
+ "could be replaced by an extlink (try using '%s' instead)"
+ )
+ assert message % (14, ":repo:`octocat`") in warning_output
+ assert message % (16, ":repo:`inline replaceable link <octocat>`") in warning_output
+ assert message % (18, ":repo:`replaceable link <octocat>`") in warning_output
diff --git a/tests/test_ext_githubpages.py b/tests/test_ext_githubpages.py
new file mode 100644
index 0000000..8e41537
--- /dev/null
+++ b/tests/test_ext_githubpages.py
@@ -0,0 +1,26 @@
+"""Test sphinx.ext.githubpages extension."""
+
+import pytest
+
+
+@pytest.mark.sphinx('html', testroot='ext-githubpages')
+def test_githubpages(app, status, warning):
+ app.builder.build_all()
+ assert (app.outdir / '.nojekyll').exists()
+ assert not (app.outdir / 'CNAME').exists()
+
+
+@pytest.mark.sphinx('html', testroot='ext-githubpages',
+ confoverrides={'html_baseurl': 'https://sphinx-doc.github.io'})
+def test_no_cname_for_github_io_domain(app, status, warning):
+ app.builder.build_all()
+ assert (app.outdir / '.nojekyll').exists()
+ assert not (app.outdir / 'CNAME').exists()
+
+
+@pytest.mark.sphinx('html', testroot='ext-githubpages',
+ confoverrides={'html_baseurl': 'https://sphinx-doc.org'})
+def test_cname_for_custom_domain(app, status, warning):
+ app.builder.build_all()
+ assert (app.outdir / '.nojekyll').exists()
+ assert (app.outdir / 'CNAME').read_text(encoding='utf8') == 'sphinx-doc.org'
diff --git a/tests/test_ext_graphviz.py b/tests/test_ext_graphviz.py
new file mode 100644
index 0000000..d63dc2a
--- /dev/null
+++ b/tests/test_ext_graphviz.py
@@ -0,0 +1,196 @@
+"""Test sphinx.ext.graphviz extension."""
+
+import re
+import sys
+
+import pytest
+
+from sphinx.ext.graphviz import ClickableMapDefinition
+
+
+@pytest.mark.sphinx('html', testroot='ext-graphviz')
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_graphviz_png_html(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ html = (r'<figure class="align-default" .*?>\s*'
+ r'<div class="graphviz"><img .*?/></div>\s*<figcaption>\s*'
+ r'<p><span class="caption-text">caption of graph</span>.*</p>\s*'
+ r'</figcaption>\s*</figure>')
+ assert re.search(html, content, re.S)
+
+ html = 'Hello <div class="graphviz"><img .*?/></div>\n graphviz world'
+ assert re.search(html, content, re.S)
+
+ html = ('<img src=".*?" alt="digraph foo {\nbaz -&gt; qux\n}" '
+ 'class="graphviz neato-graph" />')
+ assert re.search(html, content, re.S)
+
+ html = (r'<figure class="align-right" .*?>\s*'
+ r'<div class="graphviz"><img .*?/></div>\s*<figcaption>\s*'
+ r'<p><span class="caption-text">on <em>right</em></span>.*</p>\s*'
+ r'</figcaption>\s*</figure>')
+ assert re.search(html, content, re.S)
+
+ html = (r'<div align=\"center\" class=\"align-center\">'
+ r'<div class="graphviz"><img src=\".*\.png\" alt=\"digraph foo {\n'
+ r'centered\n'
+ r'}\" class="graphviz" /></div>\n</div>')
+ assert re.search(html, content, re.S)
+
+
+@pytest.mark.sphinx('html', testroot='ext-graphviz',
+ confoverrides={'graphviz_output_format': 'svg'})
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_graphviz_svg_html(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ html = (r'<figure class=\"align-default\" .*?>\n'
+ r'<div class="graphviz"><object data=\".*\.svg\".*>\n'
+ r'\s*<p class=\"warning\">digraph foo {\n'
+ r'bar -&gt; baz\n'
+ r'}</p></object></div>\n'
+ r'<figcaption>\n'
+ r'<p><span class=\"caption-text\">caption of graph</span>.*</p>\n'
+ r'</figcaption>\n'
+ r'</figure>')
+ assert re.search(html, content, re.S)
+
+ html = (r'Hello <div class="graphviz"><object.*>\n'
+ r'\s*<p class=\"warning\">graph</p></object></div>\n'
+ r' graphviz world')
+ assert re.search(html, content, re.S)
+
+ html = (r'<figure class=\"align-right\" .*\>\n'
+ r'<div class="graphviz"><object data=\".*\.svg\".*>\n'
+ r'\s*<p class=\"warning\">digraph bar {\n'
+ r'foo -&gt; bar\n'
+ r'}</p></object></div>\n'
+ r'<figcaption>\n'
+ r'<p><span class=\"caption-text\">on <em>right</em></span>.*</p>\n'
+ r'</figcaption>\n'
+ r'</figure>')
+ assert re.search(html, content, re.S)
+
+ html = (r'<div align=\"center\" class=\"align-center\">'
+ r'<div class="graphviz"><object data=\".*\.svg\".*>\n'
+ r'\s*<p class=\"warning\">digraph foo {\n'
+ r'centered\n'
+ r'}</p></object></div>\n'
+ r'</div>')
+ assert re.search(html, content, re.S)
+
+ image_re = r'.*data="([^"]+)".*?digraph test'
+ image_path_match = re.search(image_re, content, re.S)
+ assert image_path_match
+
+ image_path = image_path_match.group(1)
+ image_content = (app.outdir / image_path).read_text(encoding='utf8')
+ if sys.platform == 'win32':
+ assert '".\\_static\\' not in image_content
+ assert r'<ns0:image ns1:href="..\_static\images\test.svg"' in image_content
+ assert r'<ns0:a ns1:href="..\_static\images\test.svg"' in image_content
+ else:
+ assert '"./_static/' not in image_content
+ assert '<ns0:image ns1:href="../_static/images/test.svg"' in image_content
+ assert '<ns0:a ns1:href="../_static/images/test.svg"' in image_content
+ assert '<ns0:a ns1:href="..#graphviz"' in image_content
+
+
+@pytest.mark.sphinx('latex', testroot='ext-graphviz')
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_graphviz_latex(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ macro = ('\\\\begin{figure}\\[htbp\\]\n\\\\centering\n\\\\capstart\n\n'
+ '\\\\sphinxincludegraphics\\[\\]{graphviz-\\w+.pdf}\n'
+ '\\\\caption{caption of graph}\\\\label{.*}\\\\end{figure}')
+ assert re.search(macro, content, re.S)
+
+ macro = 'Hello \\\\sphinxincludegraphics\\[\\]{graphviz-\\w+.pdf} graphviz world'
+ assert re.search(macro, content, re.S)
+
+ macro = ('\\\\begin{wrapfigure}{r}{0pt}\n\\\\centering\n'
+ '\\\\sphinxincludegraphics\\[\\]{graphviz-\\w+.pdf}\n'
+ '\\\\caption{on \\\\sphinxstyleemphasis{right}}'
+ '\\\\label{.*}\\\\end{wrapfigure}')
+ assert re.search(macro, content, re.S)
+
+ macro = (r'\{\\hfill'
+ r'\\sphinxincludegraphics\[\]{graphviz-.*}'
+ r'\\hspace\*{\\fill}}')
+ assert re.search(macro, content, re.S)
+
+
+@pytest.mark.sphinx('html', testroot='ext-graphviz', confoverrides={'language': 'xx'})
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_graphviz_i18n(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ html = '<img src=".*?" alt="digraph {\n BAR -&gt; BAZ\n}" class="graphviz" />'
+ assert re.search(html, content, re.M)
+
+
+def test_graphviz_parse_mapfile():
+ # empty graph
+ code = ('# digraph {\n'
+ '# }\n')
+ content = ('<map id="%3" name="%3">\n'
+ '</map>')
+ cmap = ClickableMapDefinition('dummy.map', content, code)
+ assert cmap.filename == 'dummy.map'
+ assert cmap.id == 'grapvizb08107169e'
+ assert len(cmap.clickable) == 0
+ assert cmap.generate_clickable_map() == ''
+
+ # normal graph
+ code = ('digraph {\n'
+ ' foo [href="http://www.google.com/"];\n'
+ ' foo -> bar;\n'
+ '}\n')
+ content = ('<map id="%3" name="%3">\n'
+ '<area shape="poly" id="node1" href="http://www.google.com/" title="foo" alt=""'
+ ' coords="77,29,76,22,70,15,62,10,52,7,41,5,30,7,20,10,12,15,7,22,5,29,7,37,12,'
+ '43,20,49,30,52,41,53,52,52,62,49,70,43,76,37"/>\n'
+ '</map>')
+ cmap = ClickableMapDefinition('dummy.map', content, code)
+ assert cmap.filename == 'dummy.map'
+ assert cmap.id == 'grapviza4ccdd48ce'
+ assert len(cmap.clickable) == 1
+ assert cmap.generate_clickable_map() == content.replace('%3', cmap.id)
+
+ # inheritance-diagram:: sphinx.builders.html
+ content = (
+ '<map id="inheritance66ff5471b9" name="inheritance66ff5471b9">\n'
+ '<area shape="rect" id="node1" title="Builds target formats from the reST sources."'
+ ' alt="" coords="26,95,125,110"/>\n'
+ '<area shape="rect" id="node5" title="Builds standalone HTML docs."'
+ ' alt="" coords="179,95,362,110"/>\n'
+ '<area shape="rect" id="node2" title="buildinfo file manipulator." '
+ ' alt="" coords="14,64,138,80"/>\n'
+ '<area shape="rect" id="node3" title="The container of stylesheets."'
+ ' alt="" coords="3,34,148,49"/>\n'
+ '<area shape="rect" id="node4" title="A StandaloneHTMLBuilder that creates all HTML'
+ ' pages as &quot;index.html&quot; in" alt="" coords="395,64,569,80"/>\n'
+ '<area shape="rect" id="node7" title="An abstract builder that serializes'
+ ' the generated HTML." alt="" coords="392,95,571,110"/>\n'
+ '<area shape="rect" id="node9" title="A StandaloneHTMLBuilder subclass that puts'
+ ' the whole document tree on one" alt="" coords="393,125,570,141"/>\n'
+ '<area shape="rect" id="node6" title="A builder that dumps the generated HTML'
+ ' into JSON files." alt="" coords="602,80,765,95"/>\n'
+ '<area shape="rect" id="node8" title="A Builder that dumps the generated HTML'
+ ' into pickle files." alt="" coords="602,110,765,125"/>\n'
+ '<area shape="rect" id="node10" title="The metadata of stylesheet."'
+ ' alt="" coords="11,3,141,19"/>\n'
+ '</map>'
+ )
+ cmap = ClickableMapDefinition('dummy.map', content, 'dummy_code')
+ assert cmap.filename == 'dummy.map'
+ assert cmap.id == 'inheritance66ff5471b9'
+ assert len(cmap.clickable) == 0
+ assert cmap.generate_clickable_map() == ''
diff --git a/tests/test_ext_ifconfig.py b/tests/test_ext_ifconfig.py
new file mode 100644
index 0000000..0292699
--- /dev/null
+++ b/tests/test_ext_ifconfig.py
@@ -0,0 +1,28 @@
+"""Test sphinx.ext.ifconfig extension."""
+
+import docutils.utils
+import pytest
+
+from sphinx import addnodes
+from sphinx.testing import restructuredtext
+
+
+@pytest.mark.sphinx('text', testroot='ext-ifconfig')
+def test_ifconfig(app, status, warning):
+ app.builder.build_all()
+ result = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert 'spam' in result
+ assert 'ham' not in result
+
+
+def test_ifconfig_content_line_number(app):
+ app.setup_extension("sphinx.ext.ifconfig")
+ text = (".. ifconfig:: confval1\n" +
+ "\n" +
+ " Some link here: :ref:`abc`\n")
+ doc = restructuredtext.parse(app, text)
+ xrefs = list(doc.findall(condition=addnodes.pending_xref))
+ assert len(xrefs) == 1
+ source, line = docutils.utils.get_source_line(xrefs[0])
+ assert 'index.rst' in source
+ assert line == 3
diff --git a/tests/test_ext_imgconverter.py b/tests/test_ext_imgconverter.py
new file mode 100644
index 0000000..18be700
--- /dev/null
+++ b/tests/test_ext_imgconverter.py
@@ -0,0 +1,34 @@
+"""Test sphinx.ext.imgconverter extension."""
+
+import subprocess
+
+import pytest
+
+
+@pytest.fixture()
+def _if_converter_found(app):
+ image_converter = getattr(app.config, 'image_converter', '')
+ try:
+ if image_converter:
+ subprocess.run([image_converter, '-version'], capture_output=True) # show version
+ return
+ except OSError: # No such file or directory
+ pass
+
+ pytest.skip('image_converter "%s" is not available' % image_converter)
+
+
+@pytest.mark.usefixtures('_if_converter_found')
+@pytest.mark.sphinx('latex', testroot='ext-imgconverter')
+def test_ext_imgconverter(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ # supported image (not converted)
+ assert '\\sphinxincludegraphics{{img}.pdf}' in content
+
+ # non supported image (converted)
+ assert '\\sphinxincludegraphics{{svgimg}.png}' in content
+ assert not (app.outdir / 'svgimg.svg').exists()
+ assert (app.outdir / 'svgimg.png').exists()
diff --git a/tests/test_ext_imgmockconverter.py b/tests/test_ext_imgmockconverter.py
new file mode 100644
index 0000000..b5d4e79
--- /dev/null
+++ b/tests/test_ext_imgmockconverter.py
@@ -0,0 +1,17 @@
+"""Test image converter with identical basenames"""
+
+import pytest
+
+
+@pytest.mark.sphinx('latex', testroot='ext-imgmockconverter')
+def test_ext_imgmockconverter(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ # check identical basenames give distinct files
+ assert '\\sphinxincludegraphics{{svgimg}.pdf}' in content
+ assert '\\sphinxincludegraphics{{svgimg1}.pdf}' in content
+ assert not (app.outdir / 'svgimg.svg').exists()
+ assert (app.outdir / 'svgimg.pdf').exists()
+ assert (app.outdir / 'svgimg1.pdf').exists()
diff --git a/tests/test_ext_inheritance_diagram.py b/tests/test_ext_inheritance_diagram.py
new file mode 100644
index 0000000..9ace5ad
--- /dev/null
+++ b/tests/test_ext_inheritance_diagram.py
@@ -0,0 +1,342 @@
+"""Test sphinx.ext.inheritance_diagram extension."""
+
+import os
+import re
+import sys
+import zlib
+
+import pytest
+
+from sphinx.ext.inheritance_diagram import (
+ InheritanceDiagram,
+ InheritanceException,
+ import_classes,
+)
+from sphinx.ext.intersphinx import load_mappings, normalize_intersphinx_mapping
+
+
+@pytest.mark.sphinx(buildername="html", testroot="inheritance")
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_inheritance_diagram(app, status, warning):
+ # monkey-patch InheritaceDiagram.run() so we can get access to its
+ # results.
+ orig_run = InheritanceDiagram.run
+ graphs = {}
+
+ def new_run(self):
+ result = orig_run(self)
+ node = result[0]
+ source = os.path.basename(node.document.current_source).replace(".rst", "")
+ graphs[source] = node['graph']
+ return result
+
+ InheritanceDiagram.run = new_run
+
+ try:
+ app.builder.build_all()
+ finally:
+ InheritanceDiagram.run = orig_run
+
+ assert app.statuscode == 0
+
+ html_warnings = warning.getvalue()
+ assert html_warnings == ""
+
+ # note: it is better to split these asserts into separate test functions
+ # but I can't figure out how to build only a specific .rst file
+
+ # basic inheritance diagram showing all classes
+ for cls in graphs['basic_diagram'].class_info:
+ # use in b/c traversing order is different sometimes
+ assert cls in [
+ ('dummy.test.A', 'dummy.test.A', [], None),
+ ('dummy.test.F', 'dummy.test.F', ['dummy.test.C'], None),
+ ('dummy.test.C', 'dummy.test.C', ['dummy.test.A'], None),
+ ('dummy.test.E', 'dummy.test.E', ['dummy.test.B'], None),
+ ('dummy.test.D', 'dummy.test.D', ['dummy.test.B', 'dummy.test.C'], None),
+ ('dummy.test.B', 'dummy.test.B', ['dummy.test.A'], None),
+ ]
+
+ # inheritance diagram using :parts: 1 option
+ for cls in graphs['diagram_w_parts'].class_info:
+ assert cls in [
+ ('A', 'dummy.test.A', [], None),
+ ('F', 'dummy.test.F', ['C'], None),
+ ('C', 'dummy.test.C', ['A'], None),
+ ('E', 'dummy.test.E', ['B'], None),
+ ('D', 'dummy.test.D', ['B', 'C'], None),
+ ('B', 'dummy.test.B', ['A'], None),
+ ]
+
+ # inheritance diagram with 1 top class
+ # :top-classes: dummy.test.B
+ # rendering should be
+ # A
+ # \
+ # B C
+ # / \ / \
+ # E D F
+ #
+ for cls in graphs['diagram_w_1_top_class'].class_info:
+ assert cls in [
+ ('dummy.test.A', 'dummy.test.A', [], None),
+ ('dummy.test.F', 'dummy.test.F', ['dummy.test.C'], None),
+ ('dummy.test.C', 'dummy.test.C', ['dummy.test.A'], None),
+ ('dummy.test.E', 'dummy.test.E', ['dummy.test.B'], None),
+ ('dummy.test.D', 'dummy.test.D', ['dummy.test.B', 'dummy.test.C'], None),
+ ('dummy.test.B', 'dummy.test.B', [], None),
+ ]
+
+ # inheritance diagram with 2 top classes
+ # :top-classes: dummy.test.B, dummy.test.C
+ # Note: we're specifying separate classes, not the entire module here
+ # rendering should be
+ #
+ # B C
+ # / \ / \
+ # E D F
+ #
+ for cls in graphs['diagram_w_2_top_classes'].class_info:
+ assert cls in [
+ ('dummy.test.F', 'dummy.test.F', ['dummy.test.C'], None),
+ ('dummy.test.C', 'dummy.test.C', [], None),
+ ('dummy.test.E', 'dummy.test.E', ['dummy.test.B'], None),
+ ('dummy.test.D', 'dummy.test.D', ['dummy.test.B', 'dummy.test.C'], None),
+ ('dummy.test.B', 'dummy.test.B', [], None),
+ ]
+
+ # inheritance diagram with 2 top classes and specifying the entire module
+ # rendering should be
+ #
+ # A
+ # B C
+ # / \ / \
+ # E D F
+ #
+ # Note: dummy.test.A is included in the graph before its descendants are even processed
+ # b/c we've specified to load the entire module. The way InheritanceGraph works it is very
+ # hard to exclude parent classes once after they have been included in the graph.
+ # If you'd like to not show class A in the graph don't specify the entire module.
+ # this is a known issue.
+ for cls in graphs['diagram_module_w_2_top_classes'].class_info:
+ assert cls in [
+ ('dummy.test.F', 'dummy.test.F', ['dummy.test.C'], None),
+ ('dummy.test.C', 'dummy.test.C', [], None),
+ ('dummy.test.E', 'dummy.test.E', ['dummy.test.B'], None),
+ ('dummy.test.D', 'dummy.test.D', ['dummy.test.B', 'dummy.test.C'], None),
+ ('dummy.test.B', 'dummy.test.B', [], None),
+ ('dummy.test.A', 'dummy.test.A', [], None),
+ ]
+
+ # inheritance diagram involving a base class nested within another class
+ for cls in graphs['diagram_w_nested_classes'].class_info:
+ assert cls in [
+ ('dummy.test_nested.A', 'dummy.test_nested.A', [], None),
+ ('dummy.test_nested.C', 'dummy.test_nested.C', ['dummy.test_nested.A.B'], None),
+ ('dummy.test_nested.A.B', 'dummy.test_nested.A.B', [], None),
+ ]
+
+
+# An external inventory to test intersphinx links in inheritance diagrams
+external_inventory = b'''\
+# Sphinx inventory version 2
+# Project: external
+# Version: 1.0
+# The remainder of this file is compressed using zlib.
+''' + zlib.compress(b'''\
+external.other.Bob py:class 1 foo.html#external.other.Bob -
+''')
+
+
+@pytest.mark.sphinx('html', testroot='ext-inheritance_diagram')
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_inheritance_diagram_png_html(tmp_path, app):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(external_inventory)
+ app.config.intersphinx_mapping = {
+ 'https://example.org': str(inv_file),
+ }
+ app.config.intersphinx_cache_limit = 0
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ base_maps = re.findall('<map .+\n.+\n</map>', content)
+
+ pattern = ('<figure class="align-default" id="id1">\n'
+ '<div class="graphviz">'
+ '<img src="_images/inheritance-\\w+.png" alt="Inheritance diagram of test.Foo" '
+ 'class="inheritance graphviz" /></div>\n<figcaption>\n<p>'
+ '<span class="caption-text">Test Foo!</span><a class="headerlink" href="#id1" '
+ 'title="Link to this image">\xb6</a></p>\n</figcaption>\n</figure>\n')
+ assert re.search(pattern, content, re.M)
+
+ subdir_content = (app.outdir / 'subdir/page1.html').read_text(encoding='utf8')
+ subdir_maps = re.findall('<map .+\n.+\n</map>', subdir_content)
+ subdir_maps = [re.sub('href="(\\S+)"', 'href="subdir/\\g<1>"', s) for s in subdir_maps]
+
+ # Go through the clickmap for every PNG inheritance diagram
+ for diagram_content in base_maps + subdir_maps:
+ # Verify that an intersphinx link was created via the external inventory
+ if 'subdir.' in diagram_content:
+ assert "https://example.org" in diagram_content
+
+ # Extract every link in the inheritance diagram
+ for href in re.findall('href="(\\S+?)"', diagram_content):
+ if '://' in href:
+ # Verify that absolute URLs are not prefixed with ../
+ assert href.startswith("https://example.org/")
+ else:
+ # Verify that relative URLs point to existing documents
+ reluri = href.rsplit('#', 1)[0] # strip the anchor at the end
+ assert (app.outdir / reluri).exists()
+
+
+@pytest.mark.sphinx('html', testroot='ext-inheritance_diagram',
+ confoverrides={'graphviz_output_format': 'svg'})
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_inheritance_diagram_svg_html(tmp_path, app):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(external_inventory)
+ app.config.intersphinx_mapping = {
+ "subdir": ('https://example.org', str(inv_file)),
+ }
+ app.config.intersphinx_cache_limit = 0
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ base_svgs = re.findall('<object data="(_images/inheritance-\\w+.svg?)"', content)
+
+ pattern = ('<figure class="align-default" id="id1">\n'
+ '<div class="graphviz">'
+ '<object data="_images/inheritance-\\w+.svg" '
+ 'type="image/svg\\+xml" class="inheritance graphviz">\n'
+ '<p class=\"warning\">Inheritance diagram of test.Foo</p>'
+ '</object></div>\n<figcaption>\n<p><span class="caption-text">'
+ 'Test Foo!</span><a class="headerlink" href="#id1" '
+ 'title="Link to this image">\xb6</a></p>\n</figcaption>\n</figure>\n')
+
+ assert re.search(pattern, content, re.M)
+
+ subdir_content = (app.outdir / 'subdir/page1.html').read_text(encoding='utf8')
+ subdir_svgs = re.findall('<object data="../(_images/inheritance-\\w+.svg?)"', subdir_content)
+
+ # Go through every SVG inheritance diagram
+ for diagram in base_svgs + subdir_svgs:
+ diagram_content = (app.outdir / diagram).read_text(encoding='utf8')
+
+ # Verify that an intersphinx link was created via the external inventory
+ if 'subdir.' in diagram_content:
+ assert "https://example.org" in diagram_content
+
+ # Extract every link in the inheritance diagram
+ for href in re.findall('href="(\\S+?)"', diagram_content):
+ if '://' in href:
+ # Verify that absolute URLs are not prefixed with ../
+ assert href.startswith("https://example.org/")
+ else:
+ # Verify that relative URLs point to existing documents
+ reluri = href.rsplit('#', 1)[0] # strip the anchor at the end
+ abs_uri = (app.outdir / app.builder.imagedir / reluri).resolve()
+ assert abs_uri.exists()
+
+
+@pytest.mark.sphinx('latex', testroot='ext-inheritance_diagram')
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_inheritance_diagram_latex(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ pattern = ('\\\\begin{figure}\\[htbp]\n\\\\centering\n\\\\capstart\n\n'
+ '\\\\sphinxincludegraphics\\[\\]{inheritance-\\w+.pdf}\n'
+ '\\\\caption{Test Foo!}\\\\label{\\\\detokenize{index:id1}}\\\\end{figure}')
+ assert re.search(pattern, content, re.M)
+
+
+@pytest.mark.sphinx('html', testroot='ext-inheritance_diagram',
+ srcdir='ext-inheritance_diagram-alias')
+@pytest.mark.usefixtures('if_graphviz_found')
+def test_inheritance_diagram_latex_alias(app, status, warning):
+ app.config.inheritance_alias = {'test.Foo': 'alias.Foo'}
+ app.builder.build_all()
+
+ doc = app.env.get_and_resolve_doctree('index', app)
+ aliased_graph = doc.children[0].children[3]['graph'].class_info
+ assert len(aliased_graph) == 4
+ assert ('test.DocSubDir2', 'test.DocSubDir2', ['test.DocSubDir1'], None) in aliased_graph
+ assert ('test.DocSubDir1', 'test.DocSubDir1', ['test.DocHere'], None) in aliased_graph
+ assert ('test.DocHere', 'test.DocHere', ['alias.Foo'], None) in aliased_graph
+ assert ('alias.Foo', 'alias.Foo', [], None) in aliased_graph
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+
+ pattern = ('<figure class="align-default" id="id1">\n'
+ '<div class="graphviz">'
+ '<img src="_images/inheritance-\\w+.png" alt="Inheritance diagram of test.Foo" '
+ 'class="inheritance graphviz" /></div>\n<figcaption>\n<p>'
+ '<span class="caption-text">Test Foo!</span><a class="headerlink" href="#id1" '
+ 'title="Link to this image">\xb6</a></p>\n</figcaption>\n</figure>\n')
+ assert re.search(pattern, content, re.M)
+
+
+def test_import_classes(rootdir):
+ from sphinx.parsers import Parser, RSTParser
+ from sphinx.util.i18n import CatalogInfo
+
+ try:
+ sys.path.append(str(rootdir / 'test-ext-inheritance_diagram'))
+ from example.sphinx import DummyClass
+
+ # got exception for unknown class or module
+ with pytest.raises(InheritanceException):
+ import_classes('unknown', None)
+ with pytest.raises(InheritanceException):
+ import_classes('unknown.Unknown', None)
+
+ # got exception InheritanceException for wrong class or module
+ # not AttributeError (refs: #4019)
+ with pytest.raises(InheritanceException):
+ import_classes('unknown', '.')
+ with pytest.raises(InheritanceException):
+ import_classes('unknown.Unknown', '.')
+ with pytest.raises(InheritanceException):
+ import_classes('.', None)
+
+ # a module having no classes
+ classes = import_classes('sphinx', None)
+ assert classes == []
+
+ classes = import_classes('sphinx', 'foo')
+ assert classes == []
+
+ # all of classes in the module
+ classes = import_classes('sphinx.parsers', None)
+ assert set(classes) == {Parser, RSTParser}
+
+ # specified class in the module
+ classes = import_classes('sphinx.parsers.Parser', None)
+ assert classes == [Parser]
+
+ # specified class in current module
+ classes = import_classes('Parser', 'sphinx.parsers')
+ assert classes == [Parser]
+
+ # relative module name to current module
+ classes = import_classes('i18n.CatalogInfo', 'sphinx.util')
+ assert classes == [CatalogInfo]
+
+ # got exception for functions
+ with pytest.raises(InheritanceException):
+ import_classes('encode_uri', 'sphinx.util')
+
+ # import submodule on current module (refs: #3164)
+ classes = import_classes('sphinx', 'example')
+ assert classes == [DummyClass]
+ finally:
+ sys.path.pop()
diff --git a/tests/test_ext_intersphinx.py b/tests/test_ext_intersphinx.py
new file mode 100644
index 0000000..82bec9e
--- /dev/null
+++ b/tests/test_ext_intersphinx.py
@@ -0,0 +1,568 @@
+"""Test the intersphinx extension."""
+
+import http.server
+from unittest import mock
+
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.ext.intersphinx import (
+ INVENTORY_FILENAME,
+ _get_safe_url,
+ _strip_basic_auth,
+ fetch_inventory,
+ inspect_main,
+ load_mappings,
+ missing_reference,
+ normalize_intersphinx_mapping,
+)
+from sphinx.ext.intersphinx import setup as intersphinx_setup
+
+from .test_util_inventory import inventory_v2, inventory_v2_not_having_version
+from .utils import http_server
+
+
+def fake_node(domain, type, target, content, **attrs):
+ contnode = nodes.emphasis(content, content)
+ node = addnodes.pending_xref('')
+ node['reftarget'] = target
+ node['reftype'] = type
+ node['refdomain'] = domain
+ node.attributes.update(attrs)
+ node += contnode
+ return node, contnode
+
+
+def reference_check(app, *args, **kwds):
+ node, contnode = fake_node(*args, **kwds)
+ return missing_reference(app, app.env, node, contnode)
+
+
+def set_config(app, mapping):
+ app.config.intersphinx_mapping = mapping
+ app.config.intersphinx_cache_limit = 0
+ app.config.intersphinx_disabled_reftypes = []
+
+
+@mock.patch('sphinx.ext.intersphinx.InventoryFile')
+@mock.patch('sphinx.ext.intersphinx._read_from_url')
+def test_fetch_inventory_redirection(_read_from_url, InventoryFile, app, status, warning): # NoQA: PT019
+ intersphinx_setup(app)
+ _read_from_url().readline.return_value = b'# Sphinx inventory version 2'
+
+ # same uri and inv, not redirected
+ _read_from_url().url = 'http://hostname/' + INVENTORY_FILENAME
+ fetch_inventory(app, 'http://hostname/', 'http://hostname/' + INVENTORY_FILENAME)
+ assert 'intersphinx inventory has moved' not in status.getvalue()
+ assert InventoryFile.load.call_args[0][1] == 'http://hostname/'
+
+ # same uri and inv, redirected
+ status.seek(0)
+ status.truncate(0)
+ _read_from_url().url = 'http://hostname/new/' + INVENTORY_FILENAME
+
+ fetch_inventory(app, 'http://hostname/', 'http://hostname/' + INVENTORY_FILENAME)
+ assert status.getvalue() == ('intersphinx inventory has moved: '
+ 'http://hostname/%s -> http://hostname/new/%s\n' %
+ (INVENTORY_FILENAME, INVENTORY_FILENAME))
+ assert InventoryFile.load.call_args[0][1] == 'http://hostname/new'
+
+ # different uri and inv, not redirected
+ status.seek(0)
+ status.truncate(0)
+ _read_from_url().url = 'http://hostname/new/' + INVENTORY_FILENAME
+
+ fetch_inventory(app, 'http://hostname/', 'http://hostname/new/' + INVENTORY_FILENAME)
+ assert 'intersphinx inventory has moved' not in status.getvalue()
+ assert InventoryFile.load.call_args[0][1] == 'http://hostname/'
+
+ # different uri and inv, redirected
+ status.seek(0)
+ status.truncate(0)
+ _read_from_url().url = 'http://hostname/other/' + INVENTORY_FILENAME
+
+ fetch_inventory(app, 'http://hostname/', 'http://hostname/new/' + INVENTORY_FILENAME)
+ assert status.getvalue() == ('intersphinx inventory has moved: '
+ 'http://hostname/new/%s -> http://hostname/other/%s\n' %
+ (INVENTORY_FILENAME, INVENTORY_FILENAME))
+ assert InventoryFile.load.call_args[0][1] == 'http://hostname/'
+
+
+def test_missing_reference(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {
+ 'https://docs.python.org/': str(inv_file),
+ 'py3k': ('https://docs.python.org/py3k/', str(inv_file)),
+ 'py3krel': ('py3k', str(inv_file)), # relative path
+ 'py3krelparent': ('../../py3k', str(inv_file)), # relative path, parent dir
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+ inv = app.env.intersphinx_inventory
+
+ assert inv['py:module']['module2'] == \
+ ('foo', '2.0', 'https://docs.python.org/foo.html#module-module2', '-')
+
+ # check resolution when a target is found
+ rn = reference_check(app, 'py', 'func', 'module1.func', 'foo')
+ assert isinstance(rn, nodes.reference)
+ assert rn['refuri'] == 'https://docs.python.org/sub/foo.html#module1.func'
+ assert rn['reftitle'] == '(in foo v2.0)'
+ assert rn[0].astext() == 'foo'
+
+ # create unresolvable nodes and check None return value
+ assert reference_check(app, 'py', 'foo', 'module1.func', 'foo') is None
+ assert reference_check(app, 'py', 'func', 'foo', 'foo') is None
+ assert reference_check(app, 'py', 'func', 'foo', 'foo') is None
+
+ # check handling of prefixes
+
+ # prefix given, target found: prefix is stripped
+ rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'py3k:module2')
+ assert rn[0].astext() == 'module2'
+
+ # prefix given, but not in title: nothing stripped
+ rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'module2')
+ assert rn[0].astext() == 'module2'
+
+ # prefix given, but explicit: nothing stripped
+ rn = reference_check(app, 'py', 'mod', 'py3k:module2', 'py3k:module2',
+ refexplicit=True)
+ assert rn[0].astext() == 'py3k:module2'
+
+ # prefix given, target not found and nonexplicit title: prefix is not stripped
+ node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown',
+ refexplicit=False)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn is None
+ assert contnode[0].astext() == 'py3k:unknown'
+
+ # prefix given, target not found and explicit title: nothing is changed
+ node, contnode = fake_node('py', 'mod', 'py3k:unknown', 'py3k:unknown',
+ refexplicit=True)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn is None
+ assert contnode[0].astext() == 'py3k:unknown'
+
+ # check relative paths
+ rn = reference_check(app, 'py', 'mod', 'py3krel:module1', 'foo')
+ assert rn['refuri'] == 'py3k/foo.html#module-module1'
+
+ rn = reference_check(app, 'py', 'mod', 'py3krelparent:module1', 'foo')
+ assert rn['refuri'] == '../../py3k/foo.html#module-module1'
+
+ rn = reference_check(app, 'py', 'mod', 'py3krel:module1', 'foo', refdoc='sub/dir/test')
+ assert rn['refuri'] == '../../py3k/foo.html#module-module1'
+
+ rn = reference_check(app, 'py', 'mod', 'py3krelparent:module1', 'foo',
+ refdoc='sub/dir/test')
+ assert rn['refuri'] == '../../../../py3k/foo.html#module-module1'
+
+ # check refs of standard domain
+ rn = reference_check(app, 'std', 'doc', 'docname', 'docname')
+ assert rn['refuri'] == 'https://docs.python.org/docname.html'
+
+
+def test_missing_reference_pydomain(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {
+ 'https://docs.python.org/': str(inv_file),
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ # no context data
+ kwargs = {}
+ node, contnode = fake_node('py', 'func', 'func', 'func()', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn is None
+
+ # py:module context helps to search objects
+ kwargs = {'py:module': 'module1'}
+ node, contnode = fake_node('py', 'func', 'func', 'func()', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn.astext() == 'func()'
+
+ # py:attr context helps to search objects
+ kwargs = {'py:module': 'module1'}
+ node, contnode = fake_node('py', 'attr', 'Foo.bar', 'Foo.bar', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn.astext() == 'Foo.bar'
+
+ # term reference (normal)
+ node, contnode = fake_node('std', 'term', 'a term', 'a term')
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn.astext() == 'a term'
+
+ # term reference (case insensitive)
+ node, contnode = fake_node('std', 'term', 'A TERM', 'A TERM')
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn.astext() == 'A TERM'
+
+
+def test_missing_reference_stddomain(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {
+ 'cmd': ('https://docs.python.org/', str(inv_file)),
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ # no context data
+ kwargs = {}
+ node, contnode = fake_node('std', 'option', '-l', '-l', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn is None
+
+ # std:program context helps to search objects
+ kwargs = {'std:program': 'ls'}
+ node, contnode = fake_node('std', 'option', '-l', 'ls -l', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn.astext() == 'ls -l'
+
+ # refers inventory by name
+ kwargs = {}
+ node, contnode = fake_node('std', 'option', 'cmd:ls -l', '-l', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn.astext() == '-l'
+
+
+@pytest.mark.sphinx('html', testroot='ext-intersphinx-cppdomain')
+def test_missing_reference_cppdomain(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {
+ 'https://docs.python.org/': str(inv_file),
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ app.build()
+ html = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<a class="reference external"'
+ ' href="https://docs.python.org/index.html#cpp_foo_bar"'
+ ' title="(in foo v2.0)">'
+ '<code class="xref cpp cpp-class docutils literal notranslate">'
+ '<span class="pre">Bar</span></code></a>' in html)
+ assert ('<a class="reference external"'
+ ' href="https://docs.python.org/index.html#foons"'
+ ' title="(in foo v2.0)"><span class="n"><span class="pre">foons</span></span></a>' in html)
+ assert ('<a class="reference external"'
+ ' href="https://docs.python.org/index.html#foons_bartype"'
+ ' title="(in foo v2.0)"><span class="n"><span class="pre">bartype</span></span></a>' in html)
+
+
+def test_missing_reference_jsdomain(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {
+ 'https://docs.python.org/': str(inv_file),
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ # no context data
+ kwargs = {}
+ node, contnode = fake_node('js', 'meth', 'baz', 'baz()', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn is None
+
+ # js:module and js:object context helps to search objects
+ kwargs = {'js:module': 'foo', 'js:object': 'bar'}
+ node, contnode = fake_node('js', 'meth', 'baz', 'baz()', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert rn.astext() == 'baz()'
+
+
+def test_missing_reference_disabled_domain(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {
+ 'inv': ('https://docs.python.org/', str(inv_file)),
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ def case(*, term, doc, py):
+ def assert_(rn, expected):
+ if expected is None:
+ assert rn is None
+ else:
+ assert rn.astext() == expected
+
+ kwargs = {}
+
+ node, contnode = fake_node('std', 'term', 'a term', 'a term', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert_(rn, 'a term' if term else None)
+
+ node, contnode = fake_node('std', 'term', 'inv:a term', 'a term', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert_(rn, 'a term')
+
+ node, contnode = fake_node('std', 'doc', 'docname', 'docname', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert_(rn, 'docname' if doc else None)
+
+ node, contnode = fake_node('std', 'doc', 'inv:docname', 'docname', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert_(rn, 'docname')
+
+ # an arbitrary ref in another domain
+ node, contnode = fake_node('py', 'func', 'module1.func', 'func()', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert_(rn, 'func()' if py else None)
+
+ node, contnode = fake_node('py', 'func', 'inv:module1.func', 'func()', **kwargs)
+ rn = missing_reference(app, app.env, node, contnode)
+ assert_(rn, 'func()')
+
+ # the base case, everything should resolve
+ assert app.config.intersphinx_disabled_reftypes == []
+ case(term=True, doc=True, py=True)
+
+ # disabled a single ref type
+ app.config.intersphinx_disabled_reftypes = ['std:doc']
+ case(term=True, doc=False, py=True)
+
+ # disabled a whole domain
+ app.config.intersphinx_disabled_reftypes = ['std:*']
+ case(term=False, doc=False, py=True)
+
+ # disabled all domains
+ app.config.intersphinx_disabled_reftypes = ['*']
+ case(term=False, doc=False, py=False)
+
+
+def test_inventory_not_having_version(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2_not_having_version)
+ set_config(app, {
+ 'https://docs.python.org/': str(inv_file),
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ rn = reference_check(app, 'py', 'mod', 'module1', 'foo')
+ assert isinstance(rn, nodes.reference)
+ assert rn['refuri'] == 'https://docs.python.org/foo.html#module-module1'
+ assert rn['reftitle'] == '(in foo)'
+ assert rn[0].astext() == 'Long Module desc'
+
+
+def test_load_mappings_warnings(tmp_path, app, status, warning):
+ """
+ load_mappings issues a warning if new-style mapping
+ identifiers are not string
+ """
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {
+ 'https://docs.python.org/': str(inv_file),
+ 'py3k': ('https://docs.python.org/py3k/', str(inv_file)),
+ 'repoze.workflow': ('http://docs.repoze.org/workflow/', str(inv_file)),
+ 'django-taggit': ('http://django-taggit.readthedocs.org/en/latest/',
+ str(inv_file)),
+ 12345: ('http://www.sphinx-doc.org/en/stable/', str(inv_file)),
+ })
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+ warnings = warning.getvalue().splitlines()
+ assert len(warnings) == 2
+ assert "The pre-Sphinx 1.0 'intersphinx_mapping' format is " in warnings[0]
+ assert 'intersphinx identifier 12345 is not string. Ignored' in warnings[1]
+
+
+def test_load_mappings_fallback(tmp_path, app, status, warning):
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ set_config(app, {})
+
+ # connect to invalid path
+ app.config.intersphinx_mapping = {
+ 'fallback': ('https://docs.python.org/py3k/', '/invalid/inventory/path'),
+ }
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+ assert "failed to reach any of the inventories" in warning.getvalue()
+
+ rn = reference_check(app, 'py', 'func', 'module1.func', 'foo')
+ assert rn is None
+
+ # clear messages
+ status.truncate(0)
+ warning.truncate(0)
+
+ # add fallbacks to mapping
+ app.config.intersphinx_mapping = {
+ 'fallback': ('https://docs.python.org/py3k/', ('/invalid/inventory/path',
+ str(inv_file))),
+ }
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+ assert "encountered some issues with some of the inventories" in status.getvalue()
+ assert warning.getvalue() == ""
+
+ rn = reference_check(app, 'py', 'func', 'module1.func', 'foo')
+ assert isinstance(rn, nodes.reference)
+
+
+class TestStripBasicAuth:
+ """Tests for sphinx.ext.intersphinx._strip_basic_auth()"""
+ def test_auth_stripped(self):
+ """basic auth creds stripped from URL containing creds"""
+ url = 'https://user:12345@domain.com/project/objects.inv'
+ expected = 'https://domain.com/project/objects.inv'
+ actual = _strip_basic_auth(url)
+ assert expected == actual
+
+ def test_no_auth(self):
+ """url unchanged if param doesn't contain basic auth creds"""
+ url = 'https://domain.com/project/objects.inv'
+ expected = 'https://domain.com/project/objects.inv'
+ actual = _strip_basic_auth(url)
+ assert expected == actual
+
+ def test_having_port(self):
+ """basic auth creds correctly stripped from URL containing creds even if URL
+ contains port"""
+ url = 'https://user:12345@domain.com:8080/project/objects.inv'
+ expected = 'https://domain.com:8080/project/objects.inv'
+ actual = _strip_basic_auth(url)
+ assert expected == actual
+
+
+def test_getsafeurl_authed():
+ """_get_safe_url() with a url with basic auth"""
+ url = 'https://user:12345@domain.com/project/objects.inv'
+ expected = 'https://user@domain.com/project/objects.inv'
+ actual = _get_safe_url(url)
+ assert expected == actual
+
+
+def test_getsafeurl_authed_having_port():
+ """_get_safe_url() with a url with basic auth having port"""
+ url = 'https://user:12345@domain.com:8080/project/objects.inv'
+ expected = 'https://user@domain.com:8080/project/objects.inv'
+ actual = _get_safe_url(url)
+ assert expected == actual
+
+
+def test_getsafeurl_unauthed():
+ """_get_safe_url() with a url without basic auth"""
+ url = 'https://domain.com/project/objects.inv'
+ expected = 'https://domain.com/project/objects.inv'
+ actual = _get_safe_url(url)
+ assert expected == actual
+
+
+def test_inspect_main_noargs(capsys):
+ """inspect_main interface, without arguments"""
+ assert inspect_main([]) == 1
+
+ expected = (
+ "Print out an inventory file.\n"
+ "Error: must specify local path or URL to an inventory file."
+ )
+ stdout, stderr = capsys.readouterr()
+ assert stdout == ""
+ assert stderr == expected + "\n"
+
+
+def test_inspect_main_file(capsys, tmp_path):
+ """inspect_main interface, with file argument"""
+ inv_file = tmp_path / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+
+ inspect_main([str(inv_file)])
+
+ stdout, stderr = capsys.readouterr()
+ assert stdout.startswith("c:function\n")
+ assert stderr == ""
+
+
+def test_inspect_main_url(capsys):
+ """inspect_main interface, with url argument"""
+ class InventoryHandler(http.server.BaseHTTPRequestHandler):
+ def do_GET(self):
+ self.send_response(200, "OK")
+ self.end_headers()
+ self.wfile.write(inventory_v2)
+
+ def log_message(*args, **kwargs):
+ # Silenced.
+ pass
+
+ url = 'http://localhost:7777/' + INVENTORY_FILENAME
+
+ with http_server(InventoryHandler):
+ inspect_main([url])
+
+ stdout, stderr = capsys.readouterr()
+ assert stdout.startswith("c:function\n")
+ assert stderr == ""
+
+
+@pytest.mark.sphinx('html', testroot='ext-intersphinx-role')
+def test_intersphinx_role(app, warning):
+ inv_file = app.srcdir / 'inventory'
+ inv_file.write_bytes(inventory_v2)
+ app.config.intersphinx_mapping = {
+ 'inv': ('http://example.org/', str(inv_file)),
+ }
+ app.config.intersphinx_cache_limit = 0
+ app.config.nitpicky = True
+
+ # load the inventory and check if it's done correctly
+ normalize_intersphinx_mapping(app, app.config)
+ load_mappings(app)
+
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ wStr = warning.getvalue()
+
+ html = '<a class="reference external" href="http://example.org/{}" title="(in foo v2.0)">'
+ assert html.format('foo.html#module-module1') in content
+ assert html.format('foo.html#module-module2') in content
+ assert "WARNING: external py:mod reference target not found: module3" in wStr
+ assert "WARNING: external py:mod reference target not found: module10" in wStr
+
+ assert html.format('sub/foo.html#module1.func') in content
+ assert "WARNING: external py:meth reference target not found: inv:Foo.bar" in wStr
+
+ assert "WARNING: role for external cross-reference not found: py:nope" in wStr
+
+ # default domain
+ assert html.format('index.html#std_uint8_t') in content
+ assert "WARNING: role for external cross-reference not found: nope" in wStr
+
+ # std roles without domain prefix
+ assert html.format('docname.html') in content
+ assert html.format('index.html#cmdoption-ls-l') in content
+
+ # explicit inventory
+ assert html.format('cfunc.html#CFunc') in content
+ assert "WARNING: inventory for external cross-reference not found: invNope" in wStr
+
+ # explicit title
+ assert html.format('index.html#foons') in content
diff --git a/tests/test_ext_math.py b/tests/test_ext_math.py
new file mode 100644
index 0000000..d5331f8
--- /dev/null
+++ b/tests/test_ext_math.py
@@ -0,0 +1,345 @@
+"""Test math extensions."""
+
+import re
+import shutil
+import subprocess
+import warnings
+
+import pytest
+from docutils import nodes
+
+from sphinx.ext.mathjax import MATHJAX_URL
+from sphinx.testing.util import assert_node
+
+
+def has_binary(binary):
+ try:
+ subprocess.check_output([binary])
+ except FileNotFoundError:
+ return False
+ except OSError:
+ pass
+ return True
+
+
+@pytest.mark.skipif(not has_binary('dvipng'),
+ reason='Requires dvipng" binary')
+@pytest.mark.sphinx('html', testroot='ext-math-simple',
+ confoverrides = {'extensions': ['sphinx.ext.imgmath']})
+def test_imgmath_png(app, status, warning):
+ app.builder.build_all()
+ if "LaTeX command 'latex' cannot be run" in warning.getvalue():
+ msg = 'LaTeX command "latex" is not available'
+ raise pytest.skip.Exception(msg)
+ if "dvipng command 'dvipng' cannot be run" in warning.getvalue():
+ msg = 'dvipng command "dvipng" is not available'
+ raise pytest.skip.Exception(msg)
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ shutil.rmtree(app.outdir)
+ html = (r'<div class="math">\s*<p>\s*<img src="_images/math/\w+.png"'
+ r'\s*alt="a\^2\+b\^2=c\^2"/>\s*</p>\s*</div>')
+ assert re.search(html, content, re.S)
+
+
+@pytest.mark.skipif(not has_binary('dvisvgm'),
+ reason='Requires dvisvgm" binary')
+@pytest.mark.sphinx('html', testroot='ext-math-simple',
+ confoverrides={'extensions': ['sphinx.ext.imgmath'],
+ 'imgmath_image_format': 'svg'})
+def test_imgmath_svg(app, status, warning):
+ app.builder.build_all()
+ if "LaTeX command 'latex' cannot be run" in warning.getvalue():
+ msg = 'LaTeX command "latex" is not available'
+ raise pytest.skip.Exception(msg)
+ if "dvisvgm command 'dvisvgm' cannot be run" in warning.getvalue():
+ msg = 'dvisvgm command "dvisvgm" is not available'
+ raise pytest.skip.Exception(msg)
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ shutil.rmtree(app.outdir)
+ html = (r'<div class="math">\s*<p>\s*<img src="_images/math/\w+.svg"'
+ r'\s*alt="a\^2\+b\^2=c\^2"/>\s*</p>\s*</div>')
+ assert re.search(html, content, re.S)
+
+
+@pytest.mark.skipif(not has_binary('dvisvgm'),
+ reason='Requires dvisvgm" binary')
+@pytest.mark.sphinx('html', testroot='ext-math-simple',
+ confoverrides={'extensions': ['sphinx.ext.imgmath'],
+ 'imgmath_image_format': 'svg',
+ 'imgmath_embed': True})
+def test_imgmath_svg_embed(app, status, warning):
+ app.builder.build_all()
+ if "LaTeX command 'latex' cannot be run" in warning.getvalue():
+ msg = 'LaTeX command "latex" is not available'
+ raise pytest.skip.Exception(msg)
+ if "dvisvgm command 'dvisvgm' cannot be run" in warning.getvalue():
+ msg = 'dvisvgm command "dvisvgm" is not available'
+ raise pytest.skip.Exception(msg)
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ shutil.rmtree(app.outdir)
+ html = r'<img src="data:image/svg\+xml;base64,[\w\+/=]+"'
+ assert re.search(html, content, re.DOTALL)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'mathjax_options': {'integrity': 'sha384-0123456789'}})
+def test_mathjax_options(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ shutil.rmtree(app.outdir)
+ assert ('<script async="async" integrity="sha384-0123456789" '
+ 'src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">'
+ '</script>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax']})
+def test_mathjax_align(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ shutil.rmtree(app.outdir)
+ html = (r'<div class="math notranslate nohighlight">\s*'
+ r'\\\[ \\begin\{align\}\\begin\{aligned\}S \&amp;= \\pi r\^2\\\\'
+ r'V \&amp;= \\frac\{4\}\{3\} \\pi r\^3\\end\{aligned\}\\end\{align\} \\\]</div>')
+ assert re.search(html, content, re.S)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'math_number_all': True,
+ 'extensions': ['sphinx.ext.mathjax']})
+def test_math_number_all_mathjax(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ html = (r'<div class="math notranslate nohighlight" id="equation-index-0">\s*'
+ r'<span class="eqno">\(1\)<a .*>\xb6</a></span>\\\[a\^2\+b\^2=c\^2\\\]</div>')
+ assert re.search(html, content, re.S)
+
+
+@pytest.mark.sphinx('latex', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax']})
+def test_math_number_all_latex(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ macro = (r'\\begin{equation\*}\s*'
+ r'\\begin{split}a\^2\+b\^2=c\^2\\end{split}\s*'
+ r'\\end{equation\*}')
+ assert re.search(macro, content, re.S)
+
+ macro = r'Inline \\\(E=mc\^2\\\)'
+ assert re.search(macro, content, re.S)
+
+ macro = (r'\\begin{equation\*}\s*'
+ r'\\begin{split}e\^{i\\pi}\+1=0\\end{split}\s+'
+ r'\\end{equation\*}')
+ assert re.search(macro, content, re.S)
+
+ macro = (r'\\begin{align\*}\\!\\begin{aligned}\s*'
+ r'S &= \\pi r\^2\\\\\s*'
+ r'V &= \\frac\{4}\{3} \\pi r\^3\\\\\s*'
+ r'\\end{aligned}\\end{align\*}')
+ assert re.search(macro, content, re.S)
+
+ macro = r'Referencing equation \\eqref{equation:math:foo}.'
+ assert re.search(macro, content, re.S)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'math_eqref_format': 'Eq.{number}'})
+def test_math_eqref_format_html(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'math.html').read_text(encoding='utf8')
+ html = ('<p>Referencing equation <a class="reference internal" '
+ 'href="#equation-foo">Eq.1</a> and <a class="reference internal" '
+ 'href="#equation-foo">Eq.1</a>.</p>')
+ assert html in content
+
+
+@pytest.mark.sphinx('latex', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'math_eqref_format': 'Eq.{number}'})
+def test_math_eqref_format_latex(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ macro = (r'Referencing equation Eq.\\ref{equation:math:foo} and '
+ r'Eq.\\ref{equation:math:foo}.')
+ assert re.search(macro, content, re.S)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'numfig': True,
+ 'math_numfig': True})
+def test_mathjax_numfig_html(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'math.html').read_text(encoding='utf8')
+ html = ('<div class="math notranslate nohighlight" id="equation-math-0">\n'
+ '<span class="eqno">(1.2)')
+ assert html in content
+ html = ('<p>Referencing equation <a class="reference internal" '
+ 'href="#equation-foo">(1.1)</a> and '
+ '<a class="reference internal" href="#equation-foo">(1.1)</a>.</p>')
+ assert html in content
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.imgmath'],
+ 'numfig': True,
+ 'numfig_secnum_depth': 0,
+ 'math_numfig': True})
+def test_imgmath_numfig_html(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'page.html').read_text(encoding='utf8')
+ html = '<span class="eqno">(3)<a class="headerlink" href="#equation-bar"'
+ assert html in content
+ html = ('<p>Referencing equations <a class="reference internal" '
+ 'href="math.html#equation-foo">(1)</a> and '
+ '<a class="reference internal" href="#equation-bar">(3)</a>.</p>')
+ assert html in content
+
+
+@pytest.mark.sphinx('dummy', testroot='ext-math-compat')
+def test_math_compat(app, status, warning):
+ with warnings.catch_warnings(record=True):
+ app.builder.build_all()
+ doctree = app.env.get_and_resolve_doctree('index', app.builder)
+
+ assert_node(doctree,
+ [nodes.document, nodes.section, (nodes.title,
+ [nodes.section, (nodes.title,
+ nodes.paragraph)],
+ nodes.section)])
+ assert_node(doctree[0][1][1],
+ ('Inline: ',
+ [nodes.math, "E=mc^2"],
+ '\nInline my math: ',
+ [nodes.math, "E = mc^2"]))
+ assert_node(doctree[0][2],
+ ([nodes.title, "block"],
+ [nodes.math_block, "a^2+b^2=c^2\n\n"],
+ [nodes.paragraph, "Second math"],
+ [nodes.math_block, "e^{i\\pi}+1=0\n\n"],
+ [nodes.paragraph, "Multi math equations"],
+ [nodes.math_block, "E = mc^2"]))
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'mathjax3_config': {'extensions': ['tex2jax.js']}})
+def test_mathjax3_config(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert MATHJAX_URL in content
+ assert ('<script defer="defer" src="%s">' % MATHJAX_URL in content)
+ assert ('<script>window.MathJax = {"extensions": ["tex2jax.js"]}</script>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'mathjax2_config': {'extensions': ['tex2jax.js']}})
+def test_mathjax2_config(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<script async="async" src="%s">' % MATHJAX_URL in content)
+ assert ('<script type="text/x-mathjax-config">'
+ 'MathJax.Hub.Config({"extensions": ["tex2jax.js"]})'
+ '</script>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'mathjax_options': {'async': 'async'},
+ 'mathjax3_config': {'extensions': ['tex2jax.js']}})
+def test_mathjax_options_async_for_mathjax3(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert MATHJAX_URL in content
+ assert ('<script async="async" src="%s">' % MATHJAX_URL in content)
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax'],
+ 'mathjax_options': {'defer': 'defer'},
+ 'mathjax2_config': {'extensions': ['tex2jax.js']}})
+def test_mathjax_options_defer_for_mathjax2(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<script defer="defer" src="%s">' % MATHJAX_URL in content)
+
+
+@pytest.mark.sphinx(
+ 'html', testroot='ext-math',
+ confoverrides={
+ 'extensions': ['sphinx.ext.mathjax'],
+ 'mathjax_path': 'MathJax.js',
+ },
+)
+def test_mathjax_path(app):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<script async="async" src="_static/MathJax.js"></script>' in content
+
+
+@pytest.mark.sphinx(
+ 'html', testroot='ext-math',
+ confoverrides={
+ 'extensions': ['sphinx.ext.mathjax'],
+ 'mathjax_path': 'MathJax.js?config=scipy-mathjax',
+ },
+)
+def test_mathjax_path_config(app):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<script async="async" src="_static/MathJax.js?config=scipy-mathjax"></script>' in content
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax']})
+def test_mathjax_is_installed_only_if_document_having_math(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert MATHJAX_URL in content
+
+ content = (app.outdir / 'nomath.html').read_text(encoding='utf8')
+ assert MATHJAX_URL not in content
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ confoverrides={'extensions': ['sphinx.ext.mathjax']})
+def test_mathjax_is_not_installed_if_no_equations(app, status, warning):
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert 'MathJax.js' not in content
+
+
+@pytest.mark.sphinx('html', testroot='ext-math',
+ confoverrides={'extensions': ['sphinx.ext.mathjax']})
+def test_mathjax_is_installed_if_no_equations_when_forced(app, status, warning):
+ app.set_html_assets_policy('always')
+ app.builder.build_all()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert MATHJAX_URL in content
+
+ content = (app.outdir / 'nomath.html').read_text(encoding='utf8')
+ assert MATHJAX_URL in content
diff --git a/tests/test_ext_napoleon.py b/tests/test_ext_napoleon.py
new file mode 100644
index 0000000..00b7ac1
--- /dev/null
+++ b/tests/test_ext_napoleon.py
@@ -0,0 +1,218 @@
+"""Tests for :mod:`sphinx.ext.napoleon.__init__` module."""
+
+import functools
+from collections import namedtuple
+from unittest import mock
+
+import pytest
+
+from sphinx.application import Sphinx
+from sphinx.ext.napoleon import Config, _process_docstring, _skip_member, setup
+
+
+def simple_decorator(f):
+ """
+ A simple decorator that does nothing, for tests to use.
+ """
+ @functools.wraps(f)
+ def wrapper(*args, **kwargs):
+ return f(*args, **kwargs)
+ return wrapper
+
+
+def _private_doc():
+ """module._private_doc.DOCSTRING"""
+ pass
+
+
+def _private_undoc():
+ pass
+
+
+def __special_doc__():
+ """module.__special_doc__.DOCSTRING"""
+ pass
+
+
+def __special_undoc__():
+ pass
+
+
+class SampleClass:
+ def _private_doc(self):
+ """SampleClass._private_doc.DOCSTRING"""
+ pass
+
+ def _private_undoc(self):
+ pass
+
+ def __special_doc__(self):
+ """SampleClass.__special_doc__.DOCSTRING"""
+ pass
+
+ def __special_undoc__(self):
+ pass
+
+ @simple_decorator
+ def __decorated_func__(self):
+ """doc"""
+ pass
+
+
+class SampleError(Exception):
+ def _private_doc(self):
+ """SampleError._private_doc.DOCSTRING"""
+ pass
+
+ def _private_undoc(self):
+ pass
+
+ def __special_doc__(self):
+ """SampleError.__special_doc__.DOCSTRING"""
+ pass
+
+ def __special_undoc__(self):
+ pass
+
+
+SampleNamedTuple = namedtuple('SampleNamedTuple', 'user_id block_type def_id')
+
+
+class TestProcessDocstring:
+ def test_modify_in_place(self):
+ lines = ['Summary line.',
+ '',
+ 'Args:',
+ ' arg1: arg1 description']
+ app = mock.Mock()
+ app.config = Config()
+ _process_docstring(app, 'class', 'SampleClass', SampleClass,
+ mock.Mock(), lines)
+
+ expected = ['Summary line.',
+ '',
+ ':param arg1: arg1 description',
+ '']
+ assert expected == lines
+
+
+class TestSetup:
+ def test_unknown_app_type(self):
+ setup(object())
+
+ def test_add_config_values(self):
+ app = mock.Mock(Sphinx)
+ setup(app)
+ for name in Config._config_values:
+ has_config = False
+ for method_name, args, _kwargs in app.method_calls:
+ if (
+ method_name == 'add_config_value' and
+ args[0] == name
+ ):
+ has_config = True
+ if not has_config:
+ pytest.fail('Config value was not added to app %s' % name)
+
+ has_process_docstring = False
+ has_skip_member = False
+ for method_name, args, _kwargs in app.method_calls:
+ if method_name == 'connect':
+ if (
+ args[0] == 'autodoc-process-docstring' and
+ args[1] == _process_docstring
+ ):
+ has_process_docstring = True
+ elif (
+ args[0] == 'autodoc-skip-member' and
+ args[1] == _skip_member
+ ):
+ has_skip_member = True
+ if not has_process_docstring:
+ pytest.fail('autodoc-process-docstring never connected')
+ if not has_skip_member:
+ pytest.fail('autodoc-skip-member never connected')
+
+
+class TestSkipMember:
+ def assert_skip(self, what, member, obj, expect_default_skip, config_name):
+ skip = True
+ app = mock.Mock()
+ app.config = Config()
+ setattr(app.config, config_name, True)
+ if expect_default_skip:
+ assert None is _skip_member(app, what, member, obj, skip, mock.Mock())
+ else:
+ assert _skip_member(app, what, member, obj, skip, mock.Mock()) is False
+ setattr(app.config, config_name, False)
+ assert None is _skip_member(app, what, member, obj, skip, mock.Mock())
+
+ def test_namedtuple(self):
+ # Since python 3.7, namedtuple._asdict() has not been documented
+ # because there is no way to check the method is a member of the
+ # namedtuple class. This testcase confirms only it does not
+ # raise an error on building document (refs: #1455)
+ self.assert_skip('class', '_asdict',
+ SampleNamedTuple._asdict, True,
+ 'napoleon_include_private_with_doc')
+
+ def test_class_private_doc(self):
+ self.assert_skip('class', '_private_doc',
+ SampleClass._private_doc, False,
+ 'napoleon_include_private_with_doc')
+
+ def test_class_private_undoc(self):
+ self.assert_skip('class', '_private_undoc',
+ SampleClass._private_undoc, True,
+ 'napoleon_include_private_with_doc')
+
+ def test_class_special_doc(self):
+ self.assert_skip('class', '__special_doc__',
+ SampleClass.__special_doc__, False,
+ 'napoleon_include_special_with_doc')
+
+ def test_class_special_undoc(self):
+ self.assert_skip('class', '__special_undoc__',
+ SampleClass.__special_undoc__, True,
+ 'napoleon_include_special_with_doc')
+
+ def test_class_decorated_doc(self):
+ self.assert_skip('class', '__decorated_func__',
+ SampleClass.__decorated_func__, False,
+ 'napoleon_include_special_with_doc')
+
+ def test_exception_private_doc(self):
+ self.assert_skip('exception', '_private_doc',
+ SampleError._private_doc, False,
+ 'napoleon_include_private_with_doc')
+
+ def test_exception_private_undoc(self):
+ self.assert_skip('exception', '_private_undoc',
+ SampleError._private_undoc, True,
+ 'napoleon_include_private_with_doc')
+
+ def test_exception_special_doc(self):
+ self.assert_skip('exception', '__special_doc__',
+ SampleError.__special_doc__, False,
+ 'napoleon_include_special_with_doc')
+
+ def test_exception_special_undoc(self):
+ self.assert_skip('exception', '__special_undoc__',
+ SampleError.__special_undoc__, True,
+ 'napoleon_include_special_with_doc')
+
+ def test_module_private_doc(self):
+ self.assert_skip('module', '_private_doc', _private_doc, False,
+ 'napoleon_include_private_with_doc')
+
+ def test_module_private_undoc(self):
+ self.assert_skip('module', '_private_undoc', _private_undoc, True,
+ 'napoleon_include_private_with_doc')
+
+ def test_module_special_doc(self):
+ self.assert_skip('module', '__special_doc__', __special_doc__, False,
+ 'napoleon_include_special_with_doc')
+
+ def test_module_special_undoc(self):
+ self.assert_skip('module', '__special_undoc__', __special_undoc__, True,
+ 'napoleon_include_special_with_doc')
diff --git a/tests/test_ext_napoleon_docstring.py b/tests/test_ext_napoleon_docstring.py
new file mode 100644
index 0000000..87fad61
--- /dev/null
+++ b/tests/test_ext_napoleon_docstring.py
@@ -0,0 +1,2660 @@
+"""Tests for :mod:`sphinx.ext.napoleon.docstring` module."""
+
+import re
+from collections import namedtuple
+from inspect import cleandoc
+from textwrap import dedent
+from unittest import mock
+
+import pytest
+
+from sphinx.ext.napoleon import Config
+from sphinx.ext.napoleon.docstring import (
+ GoogleDocstring,
+ NumpyDocstring,
+ _convert_numpy_type_spec,
+ _recombine_set_tokens,
+ _token_type,
+ _tokenize_type_spec,
+)
+
+from .ext_napoleon_pep526_data_google import PEP526GoogleClass
+from .ext_napoleon_pep526_data_numpy import PEP526NumpyClass
+
+
+class NamedtupleSubclass(namedtuple('NamedtupleSubclass', ('attr1', 'attr2'))):
+ """Sample namedtuple subclass
+
+ Attributes
+ ----------
+ attr1 : Arbitrary type
+ Quick description of attr1
+ attr2 : Another arbitrary type
+ Quick description of attr2
+ attr3 : Type
+
+ Adds a newline after the type
+
+ """
+ # To avoid creating a dict, as a namedtuple doesn't have it:
+ __slots__ = ()
+
+ def __new__(cls, attr1, attr2=None):
+ return super().__new__(cls, attr1, attr2)
+
+
+class TestNamedtupleSubclass:
+ def test_attributes_docstring(self):
+ config = Config()
+ actual = str(NumpyDocstring(cleandoc(NamedtupleSubclass.__doc__),
+ config=config, app=None, what='class',
+ name='NamedtupleSubclass', obj=NamedtupleSubclass))
+ expected = """\
+Sample namedtuple subclass
+
+.. attribute:: attr1
+
+ Quick description of attr1
+
+ :type: Arbitrary type
+
+.. attribute:: attr2
+
+ Quick description of attr2
+
+ :type: Another arbitrary type
+
+.. attribute:: attr3
+
+ Adds a newline after the type
+
+ :type: Type
+"""
+
+ assert expected == actual
+
+
+class TestInlineAttribute:
+ inline_google_docstring = ('inline description with '
+ '``a : in code``, '
+ 'a :ref:`reference`, '
+ 'a `link <https://foo.bar>`_, '
+ 'a :meta public:, '
+ 'a :meta field: value and '
+ 'an host:port and HH:MM strings.')
+
+ @staticmethod
+ def _docstring(source):
+ rst = GoogleDocstring(source, config=Config(), app=None, what='attribute', name='some_data', obj=0)
+ return str(rst)
+
+ def test_class_data_member(self):
+ source = 'data member description:\n\n- a: b'
+ actual = self._docstring(source).splitlines()
+ assert actual == ['data member description:', '', '- a: b']
+
+ def test_class_data_member_inline(self):
+ source = f'CustomType: {self.inline_google_docstring}'
+ actual = self._docstring(source).splitlines()
+ assert actual == [self.inline_google_docstring, '', ':type: CustomType']
+
+ def test_class_data_member_inline_no_type(self):
+ source = self.inline_google_docstring
+ actual = self._docstring(source).splitlines()
+ assert actual == [source]
+
+ def test_class_data_member_inline_ref_in_type(self):
+ source = f':class:`int`: {self.inline_google_docstring}'
+ actual = self._docstring(source).splitlines()
+ assert actual == [self.inline_google_docstring, '', ':type: :class:`int`']
+
+
+class TestGoogleDocstring:
+ docstrings = [(
+ """Single line summary""",
+ """Single line summary""",
+ ), (
+ """
+ Single line summary
+
+ Extended description
+
+ """,
+ """
+ Single line summary
+
+ Extended description
+ """,
+ ), (
+ """
+ Single line summary
+
+ Args:
+ arg1(str):Extended
+ description of arg1
+ """,
+ """
+ Single line summary
+
+ :Parameters: **arg1** (*str*) -- Extended
+ description of arg1
+ """,
+ ), (
+ """
+ Single line summary
+
+ Args:
+ arg1(str):Extended
+ description of arg1
+ arg2 ( int ) : Extended
+ description of arg2
+
+ Keyword Args:
+ kwarg1(str):Extended
+ description of kwarg1
+ kwarg2 ( int ) : Extended
+ description of kwarg2""",
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (*str*) -- Extended
+ description of arg1
+ * **arg2** (*int*) -- Extended
+ description of arg2
+
+ :Keyword Arguments: * **kwarg1** (*str*) -- Extended
+ description of kwarg1
+ * **kwarg2** (*int*) -- Extended
+ description of kwarg2
+ """,
+ ), (
+ """
+ Single line summary
+
+ Arguments:
+ arg1(str):Extended
+ description of arg1
+ arg2 ( int ) : Extended
+ description of arg2
+
+ Keyword Arguments:
+ kwarg1(str):Extended
+ description of kwarg1
+ kwarg2 ( int ) : Extended
+ description of kwarg2""",
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (*str*) -- Extended
+ description of arg1
+ * **arg2** (*int*) -- Extended
+ description of arg2
+
+ :Keyword Arguments: * **kwarg1** (*str*) -- Extended
+ description of kwarg1
+ * **kwarg2** (*int*) -- Extended
+ description of kwarg2
+ """,
+ ), (
+ """
+ Single line summary
+
+ Return:
+ str:Extended
+ description of return value
+ """,
+ """
+ Single line summary
+
+ :returns: *str* -- Extended
+ description of return value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Returns:
+ str:Extended
+ description of return value
+ """,
+ """
+ Single line summary
+
+ :returns: *str* -- Extended
+ description of return value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Returns:
+ Extended
+ description of return value
+ """,
+ """
+ Single line summary
+
+ :returns: Extended
+ description of return value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Returns:
+ Extended
+ """,
+ """
+ Single line summary
+
+ :returns: Extended
+ """,
+ ), (
+ """
+ Single line summary
+
+ Args:
+ arg1(str):Extended
+ description of arg1
+ *args: Variable length argument list.
+ **kwargs: Arbitrary keyword arguments.
+ """,
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (*str*) -- Extended
+ description of arg1
+ * **\\*args** -- Variable length argument list.
+ * **\\*\\*kwargs** -- Arbitrary keyword arguments.
+ """,
+ ), (
+ """
+ Single line summary
+
+ Args:
+ arg1 (list(int)): Description
+ arg2 (list[int]): Description
+ arg3 (dict(str, int)): Description
+ arg4 (dict[str, int]): Description
+ """,
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (*list(int)*) -- Description
+ * **arg2** (*list[int]*) -- Description
+ * **arg3** (*dict(str, int)*) -- Description
+ * **arg4** (*dict[str, int]*) -- Description
+ """,
+ ), (
+ """
+ Single line summary
+
+ Receive:
+ arg1 (list(int)): Description
+ arg2 (list[int]): Description
+ """,
+ """
+ Single line summary
+
+ :Receives: * **arg1** (*list(int)*) -- Description
+ * **arg2** (*list[int]*) -- Description
+ """,
+ ), (
+ """
+ Single line summary
+
+ Receives:
+ arg1 (list(int)): Description
+ arg2 (list[int]): Description
+ """,
+ """
+ Single line summary
+
+ :Receives: * **arg1** (*list(int)*) -- Description
+ * **arg2** (*list[int]*) -- Description
+ """,
+ ), (
+ """
+ Single line summary
+
+ Yield:
+ str:Extended
+ description of yielded value
+ """,
+ """
+ Single line summary
+
+ :Yields: *str* -- Extended
+ description of yielded value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Yields:
+ Extended
+ description of yielded value
+ """,
+ """
+ Single line summary
+
+ :Yields: Extended
+ description of yielded value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Args:
+
+ arg1 (list of str): Extended
+ description of arg1.
+ arg2 (tuple of int): Extended
+ description of arg2.
+ arg3 (tuple of list of float): Extended
+ description of arg3.
+ arg4 (int, float, or list of bool): Extended
+ description of arg4.
+ arg5 (list of int, float, or bool): Extended
+ description of arg5.
+ arg6 (list of int or float): Extended
+ description of arg6.
+ """,
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (*list of str*) -- Extended
+ description of arg1.
+ * **arg2** (*tuple of int*) -- Extended
+ description of arg2.
+ * **arg3** (*tuple of list of float*) -- Extended
+ description of arg3.
+ * **arg4** (*int, float, or list of bool*) -- Extended
+ description of arg4.
+ * **arg5** (*list of int, float, or bool*) -- Extended
+ description of arg5.
+ * **arg6** (*list of int or float*) -- Extended
+ description of arg6.
+ """,
+ )]
+
+ def test_sphinx_admonitions(self):
+ admonition_map = {
+ 'Attention': 'attention',
+ 'Caution': 'caution',
+ 'Danger': 'danger',
+ 'Error': 'error',
+ 'Hint': 'hint',
+ 'Important': 'important',
+ 'Note': 'note',
+ 'Tip': 'tip',
+ 'Todo': 'todo',
+ 'Warning': 'warning',
+ 'Warnings': 'warning',
+ }
+ config = Config()
+ for section, admonition in admonition_map.items():
+ # Multiline
+ actual = str(GoogleDocstring(f"{section}:\n"
+ " this is the first line\n"
+ "\n"
+ " and this is the second line\n",
+ config))
+ expect = (f".. {admonition}::\n"
+ "\n"
+ " this is the first line\n"
+ " \n"
+ " and this is the second line\n"
+ )
+ assert expect == actual
+
+ # Single line
+ actual = str(GoogleDocstring(f"{section}:\n"
+ " this is a single line\n",
+ config))
+ expect = f".. {admonition}:: this is a single line\n"
+ assert expect == actual
+
+ def test_docstrings(self):
+ config = Config(
+ napoleon_use_param=False,
+ napoleon_use_rtype=False,
+ napoleon_use_keyword=False,
+ )
+ for docstring, expected in self.docstrings:
+ actual = str(GoogleDocstring(dedent(docstring), config))
+ expected = dedent(expected)
+ assert expected == actual
+
+ def test_parameters_with_class_reference(self):
+ docstring = """\
+Construct a new XBlock.
+
+This class should only be used by runtimes.
+
+Arguments:
+ runtime (:class:`~typing.Dict`\\[:class:`int`,:class:`str`\\]): Use it to
+ access the environment. It is available in XBlock code
+ as ``self.runtime``.
+
+ field_data (:class:`FieldData`): Interface used by the XBlock
+ fields to access their data from wherever it is persisted.
+
+ scope_ids (:class:`ScopeIds`): Identifiers needed to resolve scopes.
+
+"""
+
+ actual = str(GoogleDocstring(docstring))
+ expected = """\
+Construct a new XBlock.
+
+This class should only be used by runtimes.
+
+:param runtime: Use it to
+ access the environment. It is available in XBlock code
+ as ``self.runtime``.
+:type runtime: :class:`~typing.Dict`\\[:class:`int`,:class:`str`\\]
+:param field_data: Interface used by the XBlock
+ fields to access their data from wherever it is persisted.
+:type field_data: :class:`FieldData`
+:param scope_ids: Identifiers needed to resolve scopes.
+:type scope_ids: :class:`ScopeIds`
+"""
+ assert expected == actual
+
+ def test_attributes_with_class_reference(self):
+ docstring = """\
+Attributes:
+ in_attr(:class:`numpy.ndarray`): super-dooper attribute
+"""
+
+ actual = str(GoogleDocstring(docstring))
+ expected = """\
+.. attribute:: in_attr
+
+ super-dooper attribute
+
+ :type: :class:`numpy.ndarray`
+"""
+ assert expected == actual
+
+ docstring = """\
+Attributes:
+ in_attr(numpy.ndarray): super-dooper attribute
+"""
+
+ actual = str(GoogleDocstring(docstring))
+ expected = """\
+.. attribute:: in_attr
+
+ super-dooper attribute
+
+ :type: numpy.ndarray
+"""
+
+ def test_attributes_with_use_ivar(self):
+ docstring = """\
+Attributes:
+ foo (int): blah blah
+ bar (str): blah blah
+"""
+
+ config = Config(napoleon_use_ivar=True)
+ actual = str(GoogleDocstring(docstring, config, obj=self.__class__))
+ expected = """\
+:ivar foo: blah blah
+:vartype foo: int
+:ivar bar: blah blah
+:vartype bar: str
+"""
+ assert expected == actual
+
+ def test_code_block_in_returns_section(self):
+ docstring = """
+Returns:
+ foobar: foo::
+
+ codecode
+ codecode
+"""
+ expected = """
+:returns:
+
+ foo::
+
+ codecode
+ codecode
+:rtype: foobar
+"""
+ actual = str(GoogleDocstring(docstring))
+ assert expected == actual
+
+ def test_colon_in_return_type(self):
+ docstring = """Example property.
+
+Returns:
+ :py:class:`~.module.submodule.SomeClass`: an example instance
+ if available, None if not available.
+"""
+ expected = """Example property.
+
+:returns: an example instance
+ if available, None if not available.
+:rtype: :py:class:`~.module.submodule.SomeClass`
+"""
+ actual = str(GoogleDocstring(docstring))
+ assert expected == actual
+
+ def test_xrefs_in_return_type(self):
+ docstring = """Example Function
+
+Returns:
+ :class:`numpy.ndarray`: A :math:`n \\times 2` array containing
+ a bunch of math items
+"""
+ expected = """Example Function
+
+:returns: A :math:`n \\times 2` array containing
+ a bunch of math items
+:rtype: :class:`numpy.ndarray`
+"""
+ actual = str(GoogleDocstring(docstring))
+ assert expected == actual
+
+ def test_raises_types(self):
+ docstrings = [("""
+Example Function
+
+Raises:
+ RuntimeError:
+ A setting wasn't specified, or was invalid.
+ ValueError:
+ Something something value error.
+ :py:class:`AttributeError`
+ errors for missing attributes.
+ ~InvalidDimensionsError
+ If the dimensions couldn't be parsed.
+ `InvalidArgumentsError`
+ If the arguments are invalid.
+ :exc:`~ValueError`
+ If the arguments are wrong.
+
+""", """
+Example Function
+
+:raises RuntimeError: A setting wasn't specified, or was invalid.
+:raises ValueError: Something something value error.
+:raises AttributeError: errors for missing attributes.
+:raises ~InvalidDimensionsError: If the dimensions couldn't be parsed.
+:raises InvalidArgumentsError: If the arguments are invalid.
+:raises ~ValueError: If the arguments are wrong.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ InvalidDimensionsError
+
+""", """
+Example Function
+
+:raises InvalidDimensionsError:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ Invalid Dimensions Error
+
+""", """
+Example Function
+
+:raises Invalid Dimensions Error:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ Invalid Dimensions Error: With description
+
+""", """
+Example Function
+
+:raises Invalid Dimensions Error: With description
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ InvalidDimensionsError: If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises InvalidDimensionsError: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ Invalid Dimensions Error: If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises Invalid Dimensions Error: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises If the dimensions couldn't be parsed.:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ :class:`exc.InvalidDimensionsError`
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ :class:`exc.InvalidDimensionsError`: If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ :class:`exc.InvalidDimensionsError`: If the dimensions couldn't be parsed,
+ then a :class:`exc.InvalidDimensionsError` will be raised.
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError: If the dimensions couldn't be parsed,
+ then a :class:`exc.InvalidDimensionsError` will be raised.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ :class:`exc.InvalidDimensionsError`: If the dimensions couldn't be parsed.
+ :class:`exc.InvalidArgumentsError`: If the arguments are invalid.
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError: If the dimensions couldn't be parsed.
+:raises exc.InvalidArgumentsError: If the arguments are invalid.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises:
+ :class:`exc.InvalidDimensionsError`
+ :class:`exc.InvalidArgumentsError`
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError:
+:raises exc.InvalidArgumentsError:
+""")]
+ for docstring, expected in docstrings:
+ actual = str(GoogleDocstring(docstring))
+ assert expected == actual
+
+ def test_kwargs_in_arguments(self):
+ docstring = """Allows to create attributes binded to this device.
+
+Some other paragraph.
+
+Code sample for usage::
+
+ dev.bind(loopback=Loopback)
+ dev.loopback.configure()
+
+Arguments:
+ **kwargs: name/class pairs that will create resource-managers
+ bound as instance attributes to this instance. See code
+ example above.
+"""
+ expected = """Allows to create attributes binded to this device.
+
+Some other paragraph.
+
+Code sample for usage::
+
+ dev.bind(loopback=Loopback)
+ dev.loopback.configure()
+
+:param \\*\\*kwargs: name/class pairs that will create resource-managers
+ bound as instance attributes to this instance. See code
+ example above.
+"""
+ actual = str(GoogleDocstring(docstring))
+ assert expected == actual
+
+ def test_section_header_formatting(self):
+ docstrings = [("""
+Summary line
+
+Example:
+ Multiline reStructuredText
+ literal code block
+
+""", """
+Summary line
+
+.. rubric:: Example
+
+Multiline reStructuredText
+literal code block
+"""),
+ ################################
+ ("""
+Summary line
+
+Example::
+
+ Multiline reStructuredText
+ literal code block
+
+""", """
+Summary line
+
+Example::
+
+ Multiline reStructuredText
+ literal code block
+"""),
+ ################################
+ ("""
+Summary line
+
+:Example:
+
+ Multiline reStructuredText
+ literal code block
+
+""", """
+Summary line
+
+:Example:
+
+ Multiline reStructuredText
+ literal code block
+""")]
+ for docstring, expected in docstrings:
+ actual = str(GoogleDocstring(docstring))
+ assert expected == actual
+
+ def test_list_in_parameter_description(self):
+ docstring = """One line summary.
+
+Parameters:
+ no_list (int):
+ one_bullet_empty (int):
+ *
+ one_bullet_single_line (int):
+ - first line
+ one_bullet_two_lines (int):
+ + first line
+ continued
+ two_bullets_single_line (int):
+ - first line
+ - second line
+ two_bullets_two_lines (int):
+ * first line
+ continued
+ * second line
+ continued
+ one_enumeration_single_line (int):
+ 1. first line
+ one_enumeration_two_lines (int):
+ 1) first line
+ continued
+ two_enumerations_one_line (int):
+ (iii) first line
+ (iv) second line
+ two_enumerations_two_lines (int):
+ a. first line
+ continued
+ b. second line
+ continued
+ one_definition_one_line (int):
+ item 1
+ first line
+ one_definition_two_lines (int):
+ item 1
+ first line
+ continued
+ two_definitions_one_line (int):
+ item 1
+ first line
+ item 2
+ second line
+ two_definitions_two_lines (int):
+ item 1
+ first line
+ continued
+ item 2
+ second line
+ continued
+ one_definition_blank_line (int):
+ item 1
+
+ first line
+
+ extra first line
+
+ two_definitions_blank_lines (int):
+ item 1
+
+ first line
+
+ extra first line
+
+ item 2
+
+ second line
+
+ extra second line
+
+ definition_after_inline_text (int): text line
+
+ item 1
+ first line
+
+ definition_after_normal_text (int):
+ text line
+
+ item 1
+ first line
+"""
+
+ expected = """One line summary.
+
+:param no_list:
+:type no_list: int
+:param one_bullet_empty:
+ *
+:type one_bullet_empty: int
+:param one_bullet_single_line:
+ - first line
+:type one_bullet_single_line: int
+:param one_bullet_two_lines:
+ + first line
+ continued
+:type one_bullet_two_lines: int
+:param two_bullets_single_line:
+ - first line
+ - second line
+:type two_bullets_single_line: int
+:param two_bullets_two_lines:
+ * first line
+ continued
+ * second line
+ continued
+:type two_bullets_two_lines: int
+:param one_enumeration_single_line:
+ 1. first line
+:type one_enumeration_single_line: int
+:param one_enumeration_two_lines:
+ 1) first line
+ continued
+:type one_enumeration_two_lines: int
+:param two_enumerations_one_line:
+ (iii) first line
+ (iv) second line
+:type two_enumerations_one_line: int
+:param two_enumerations_two_lines:
+ a. first line
+ continued
+ b. second line
+ continued
+:type two_enumerations_two_lines: int
+:param one_definition_one_line:
+ item 1
+ first line
+:type one_definition_one_line: int
+:param one_definition_two_lines:
+ item 1
+ first line
+ continued
+:type one_definition_two_lines: int
+:param two_definitions_one_line:
+ item 1
+ first line
+ item 2
+ second line
+:type two_definitions_one_line: int
+:param two_definitions_two_lines:
+ item 1
+ first line
+ continued
+ item 2
+ second line
+ continued
+:type two_definitions_two_lines: int
+:param one_definition_blank_line:
+ item 1
+
+ first line
+
+ extra first line
+:type one_definition_blank_line: int
+:param two_definitions_blank_lines:
+ item 1
+
+ first line
+
+ extra first line
+
+ item 2
+
+ second line
+
+ extra second line
+:type two_definitions_blank_lines: int
+:param definition_after_inline_text: text line
+
+ item 1
+ first line
+:type definition_after_inline_text: int
+:param definition_after_normal_text: text line
+
+ item 1
+ first line
+:type definition_after_normal_text: int
+"""
+ config = Config(napoleon_use_param=True)
+ actual = str(GoogleDocstring(docstring, config))
+ assert expected == actual
+
+ expected = """One line summary.
+
+:Parameters: * **no_list** (*int*)
+ * **one_bullet_empty** (*int*) --
+
+ *
+ * **one_bullet_single_line** (*int*) --
+
+ - first line
+ * **one_bullet_two_lines** (*int*) --
+
+ + first line
+ continued
+ * **two_bullets_single_line** (*int*) --
+
+ - first line
+ - second line
+ * **two_bullets_two_lines** (*int*) --
+
+ * first line
+ continued
+ * second line
+ continued
+ * **one_enumeration_single_line** (*int*) --
+
+ 1. first line
+ * **one_enumeration_two_lines** (*int*) --
+
+ 1) first line
+ continued
+ * **two_enumerations_one_line** (*int*) --
+
+ (iii) first line
+ (iv) second line
+ * **two_enumerations_two_lines** (*int*) --
+
+ a. first line
+ continued
+ b. second line
+ continued
+ * **one_definition_one_line** (*int*) --
+
+ item 1
+ first line
+ * **one_definition_two_lines** (*int*) --
+
+ item 1
+ first line
+ continued
+ * **two_definitions_one_line** (*int*) --
+
+ item 1
+ first line
+ item 2
+ second line
+ * **two_definitions_two_lines** (*int*) --
+
+ item 1
+ first line
+ continued
+ item 2
+ second line
+ continued
+ * **one_definition_blank_line** (*int*) --
+
+ item 1
+
+ first line
+
+ extra first line
+ * **two_definitions_blank_lines** (*int*) --
+
+ item 1
+
+ first line
+
+ extra first line
+
+ item 2
+
+ second line
+
+ extra second line
+ * **definition_after_inline_text** (*int*) -- text line
+
+ item 1
+ first line
+ * **definition_after_normal_text** (*int*) -- text line
+
+ item 1
+ first line
+"""
+ config = Config(napoleon_use_param=False)
+ actual = str(GoogleDocstring(docstring, config))
+ assert expected == actual
+
+ def test_custom_generic_sections(self):
+
+ docstrings = (("""\
+Really Important Details:
+ You should listen to me!
+""", """.. rubric:: Really Important Details
+
+You should listen to me!
+"""),
+ ("""\
+Sooper Warning:
+ Stop hitting yourself!
+""", """:Warns: **Stop hitting yourself!**
+"""),
+ ("""\
+Params Style:
+ arg1 (int): Description of arg1
+ arg2 (str): Description of arg2
+
+""", """\
+:Params Style: * **arg1** (*int*) -- Description of arg1
+ * **arg2** (*str*) -- Description of arg2
+"""),
+ ("""\
+Returns Style:
+ description of custom section
+
+""", """:Returns Style: description of custom section
+"""))
+
+ testConfig = Config(napoleon_custom_sections=['Really Important Details',
+ ('Sooper Warning', 'warns'),
+ ('Params Style', 'params_style'),
+ ('Returns Style', 'returns_style')])
+
+ for docstring, expected in docstrings:
+ actual = str(GoogleDocstring(docstring, testConfig))
+ assert expected == actual
+
+ def test_noindex(self):
+ docstring = """
+Attributes:
+ arg
+ description
+
+Methods:
+ func(i, j)
+ description
+"""
+
+ expected = """
+.. attribute:: arg
+ :no-index:
+
+ description
+
+.. method:: func(i, j)
+ :no-index:
+
+
+ description
+""" # noqa: W293
+ config = Config()
+ actual = str(GoogleDocstring(docstring, config=config, app=None, what='module',
+ options={'no-index': True}))
+ assert expected == actual
+
+ def test_keywords_with_types(self):
+ docstring = """\
+Do as you please
+
+Keyword Args:
+ gotham_is_yours (None): shall interfere.
+"""
+ actual = str(GoogleDocstring(docstring))
+ expected = """\
+Do as you please
+
+:keyword gotham_is_yours: shall interfere.
+:kwtype gotham_is_yours: None
+"""
+ assert expected == actual
+
+ def test_pep526_annotations(self):
+ # Test class attributes annotations
+ config = Config(
+ napoleon_attr_annotations=True,
+ )
+ actual = str(GoogleDocstring(cleandoc(PEP526GoogleClass.__doc__), config, app=None, what="class",
+ obj=PEP526GoogleClass))
+ expected = """\
+Sample class with PEP 526 annotations and google docstring
+
+.. attribute:: attr1
+
+ Attr1 description.
+
+ :type: int
+
+.. attribute:: attr2
+
+ Attr2 description.
+
+ :type: str
+"""
+ assert expected == actual
+
+ def test_preprocess_types(self):
+ docstring = """\
+Do as you please
+
+Yield:
+ str:Extended
+"""
+ actual = str(GoogleDocstring(docstring))
+ expected = """\
+Do as you please
+
+:Yields: *str* -- Extended
+"""
+ assert expected == actual
+
+ config = Config(napoleon_preprocess_types=True)
+ actual = str(GoogleDocstring(docstring, config))
+ expected = """\
+Do as you please
+
+:Yields: :py:class:`str` -- Extended
+"""
+ assert expected == actual
+
+
+class TestNumpyDocstring:
+ docstrings = [(
+ """Single line summary""",
+ """Single line summary""",
+ ), (
+ """
+ Single line summary
+
+ Extended description
+
+ """,
+ """
+ Single line summary
+
+ Extended description
+ """,
+ ), (
+ """
+ Single line summary
+
+ Parameters
+ ----------
+ arg1:str
+ Extended
+ description of arg1
+ """,
+ """
+ Single line summary
+
+ :Parameters: **arg1** (:class:`str`) -- Extended
+ description of arg1
+ """,
+ ), (
+ """
+ Single line summary
+
+ Parameters
+ ----------
+ arg1:str
+ Extended
+ description of arg1
+ arg2 : int
+ Extended
+ description of arg2
+
+ Keyword Arguments
+ -----------------
+ kwarg1:str
+ Extended
+ description of kwarg1
+ kwarg2 : int
+ Extended
+ description of kwarg2
+ """,
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (:class:`str`) -- Extended
+ description of arg1
+ * **arg2** (:class:`int`) -- Extended
+ description of arg2
+
+ :Keyword Arguments: * **kwarg1** (:class:`str`) -- Extended
+ description of kwarg1
+ * **kwarg2** (:class:`int`) -- Extended
+ description of kwarg2
+ """,
+ ), (
+ """
+ Single line summary
+
+ Return
+ ------
+ str
+ Extended
+ description of return value
+ """,
+ """
+ Single line summary
+
+ :returns: :class:`str` -- Extended
+ description of return value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Returns
+ -------
+ str
+ Extended
+ description of return value
+ """,
+ """
+ Single line summary
+
+ :returns: :class:`str` -- Extended
+ description of return value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Parameters
+ ----------
+ arg1:str
+ Extended description of arg1
+ *args:
+ Variable length argument list.
+ **kwargs:
+ Arbitrary keyword arguments.
+ """,
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (:class:`str`) -- Extended description of arg1
+ * **\\*args** -- Variable length argument list.
+ * **\\*\\*kwargs** -- Arbitrary keyword arguments.
+ """,
+ ), (
+ """
+ Single line summary
+
+ Parameters
+ ----------
+ arg1:str
+ Extended description of arg1
+ *args, **kwargs:
+ Variable length argument list and arbitrary keyword arguments.
+ """,
+ """
+ Single line summary
+
+ :Parameters: * **arg1** (:class:`str`) -- Extended description of arg1
+ * **\\*args, \\*\\*kwargs** -- Variable length argument list and arbitrary keyword arguments.
+ """,
+ ), (
+ """
+ Single line summary
+
+ Receive
+ -------
+ arg1:str
+ Extended
+ description of arg1
+ arg2 : int
+ Extended
+ description of arg2
+ """,
+ """
+ Single line summary
+
+ :Receives: * **arg1** (:class:`str`) -- Extended
+ description of arg1
+ * **arg2** (:class:`int`) -- Extended
+ description of arg2
+ """,
+ ), (
+ """
+ Single line summary
+
+ Receives
+ --------
+ arg1:str
+ Extended
+ description of arg1
+ arg2 : int
+ Extended
+ description of arg2
+ """,
+ """
+ Single line summary
+
+ :Receives: * **arg1** (:class:`str`) -- Extended
+ description of arg1
+ * **arg2** (:class:`int`) -- Extended
+ description of arg2
+ """,
+ ), (
+ """
+ Single line summary
+
+ Yield
+ -----
+ str
+ Extended
+ description of yielded value
+ """,
+ """
+ Single line summary
+
+ :Yields: :class:`str` -- Extended
+ description of yielded value
+ """,
+ ), (
+ """
+ Single line summary
+
+ Yields
+ ------
+ str
+ Extended
+ description of yielded value
+ """,
+ """
+ Single line summary
+
+ :Yields: :class:`str` -- Extended
+ description of yielded value
+ """,
+ )]
+
+ def test_sphinx_admonitions(self):
+ admonition_map = {
+ 'Attention': 'attention',
+ 'Caution': 'caution',
+ 'Danger': 'danger',
+ 'Error': 'error',
+ 'Hint': 'hint',
+ 'Important': 'important',
+ 'Note': 'note',
+ 'Tip': 'tip',
+ 'Todo': 'todo',
+ 'Warning': 'warning',
+ 'Warnings': 'warning',
+ }
+ config = Config()
+ for section, admonition in admonition_map.items():
+ # Multiline
+ actual = str(NumpyDocstring(f"{section}\n"
+ f"{'-' * len(section)}\n"
+ " this is the first line\n"
+ "\n"
+ " and this is the second line\n",
+ config))
+ expect = (f".. {admonition}::\n"
+ "\n"
+ " this is the first line\n"
+ " \n"
+ " and this is the second line\n"
+ )
+ assert expect == actual
+
+ # Single line
+ actual = str(NumpyDocstring(f"{section}\n"
+ f"{'-' * len(section)}\n"
+ f" this is a single line\n",
+ config))
+ expect = f".. {admonition}:: this is a single line\n"
+ assert expect == actual
+
+ def test_docstrings(self):
+ config = Config(
+ napoleon_use_param=False,
+ napoleon_use_rtype=False,
+ napoleon_use_keyword=False,
+ napoleon_preprocess_types=True)
+ for docstring, expected in self.docstrings:
+ actual = str(NumpyDocstring(dedent(docstring), config))
+ expected = dedent(expected)
+ assert expected == actual
+
+ def test_type_preprocessor(self):
+ docstring = dedent("""
+ Single line summary
+
+ Parameters
+ ----------
+ arg1:str
+ Extended
+ description of arg1
+ """)
+
+ config = Config(napoleon_preprocess_types=False, napoleon_use_param=False)
+ actual = str(NumpyDocstring(docstring, config))
+ expected = dedent("""
+ Single line summary
+
+ :Parameters: **arg1** (*str*) -- Extended
+ description of arg1
+ """)
+ assert expected == actual
+
+ def test_parameters_with_class_reference(self):
+ docstring = """\
+Parameters
+----------
+param1 : :class:`MyClass <name.space.MyClass>` instance
+
+Other Parameters
+----------------
+param2 : :class:`MyClass <name.space.MyClass>` instance
+
+"""
+
+ config = Config(napoleon_use_param=False)
+ actual = str(NumpyDocstring(docstring, config))
+ expected = """\
+:Parameters: **param1** (:class:`MyClass <name.space.MyClass>` instance)
+
+:Other Parameters: **param2** (:class:`MyClass <name.space.MyClass>` instance)
+"""
+ assert expected == actual
+
+ config = Config(napoleon_use_param=True)
+ actual = str(NumpyDocstring(docstring, config))
+ expected = """\
+:param param1:
+:type param1: :class:`MyClass <name.space.MyClass>` instance
+
+:param param2:
+:type param2: :class:`MyClass <name.space.MyClass>` instance
+"""
+ assert expected == actual
+
+ def test_multiple_parameters(self):
+ docstring = """\
+Parameters
+----------
+x1, x2 : array_like
+ Input arrays, description of ``x1``, ``x2``.
+
+"""
+
+ config = Config(napoleon_use_param=False)
+ actual = str(NumpyDocstring(docstring, config))
+ expected = """\
+:Parameters: **x1, x2** (*array_like*) -- Input arrays, description of ``x1``, ``x2``.
+"""
+ assert expected == actual
+
+ config = Config(napoleon_use_param=True)
+ actual = str(NumpyDocstring(dedent(docstring), config))
+ expected = """\
+:param x1: Input arrays, description of ``x1``, ``x2``.
+:type x1: array_like
+:param x2: Input arrays, description of ``x1``, ``x2``.
+:type x2: array_like
+"""
+ assert expected == actual
+
+ def test_parameters_without_class_reference(self):
+ docstring = """\
+Parameters
+----------
+param1 : MyClass instance
+
+"""
+
+ config = Config(napoleon_use_param=False)
+ actual = str(NumpyDocstring(docstring, config))
+ expected = """\
+:Parameters: **param1** (*MyClass instance*)
+"""
+ assert expected == actual
+
+ config = Config(napoleon_use_param=True)
+ actual = str(NumpyDocstring(dedent(docstring), config))
+ expected = """\
+:param param1:
+:type param1: MyClass instance
+"""
+ assert expected == actual
+
+ def test_see_also_refs(self):
+ docstring = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+See Also
+--------
+some, other, funcs
+otherfunc : relationship
+
+"""
+
+ actual = str(NumpyDocstring(docstring))
+
+ expected = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+.. seealso::
+
+ :obj:`some`, :obj:`other`, :obj:`funcs`
+ \n\
+ :obj:`otherfunc`
+ relationship
+"""
+ assert expected == actual
+
+ docstring = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+See Also
+--------
+some, other, funcs
+otherfunc : relationship
+
+"""
+
+ config = Config()
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "method"))
+
+ expected = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+.. seealso::
+
+ :obj:`some`, :obj:`other`, :obj:`funcs`
+ \n\
+ :obj:`otherfunc`
+ relationship
+"""
+ assert expected == actual
+
+ docstring = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+See Also
+--------
+some, other, :func:`funcs`
+otherfunc : relationship
+
+"""
+ translations = {
+ "other": "MyClass.other",
+ "otherfunc": ":func:`~my_package.otherfunc`",
+ }
+ config = Config(napoleon_type_aliases=translations)
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "method"))
+
+ expected = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+.. seealso::
+
+ :obj:`some`, :obj:`MyClass.other`, :func:`funcs`
+ \n\
+ :func:`~my_package.otherfunc`
+ relationship
+"""
+ assert expected == actual
+
+ def test_colon_in_return_type(self):
+ docstring = """
+Summary
+
+Returns
+-------
+:py:class:`~my_mod.my_class`
+ an instance of :py:class:`~my_mod.my_class`
+"""
+
+ expected = """
+Summary
+
+:returns: an instance of :py:class:`~my_mod.my_class`
+:rtype: :py:class:`~my_mod.my_class`
+"""
+
+ config = Config()
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "method"))
+
+ assert expected == actual
+
+ def test_underscore_in_attribute(self):
+ docstring = """
+Attributes
+----------
+
+arg_ : type
+ some description
+"""
+
+ expected = """
+:ivar arg_: some description
+:vartype arg_: type
+"""
+
+ config = Config(napoleon_use_ivar=True)
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "class"))
+
+ assert expected == actual
+
+ def test_underscore_in_attribute_strip_signature_backslash(self):
+ docstring = """
+Attributes
+----------
+
+arg_ : type
+ some description
+"""
+
+ expected = """
+:ivar arg\\_: some description
+:vartype arg\\_: type
+"""
+
+ config = Config(napoleon_use_ivar=True)
+ config.strip_signature_backslash = True
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "class"))
+
+ assert expected == actual
+
+ def test_return_types(self):
+ docstring = dedent("""
+ Returns
+ -------
+ DataFrame
+ a dataframe
+ """)
+ expected = dedent("""
+ :returns: a dataframe
+ :rtype: :class:`~pandas.DataFrame`
+ """)
+ translations = {
+ "DataFrame": "~pandas.DataFrame",
+ }
+ config = Config(
+ napoleon_use_param=True,
+ napoleon_use_rtype=True,
+ napoleon_preprocess_types=True,
+ napoleon_type_aliases=translations,
+ )
+ actual = str(NumpyDocstring(docstring, config))
+ assert expected == actual
+
+ def test_yield_types(self):
+ docstring = dedent("""
+ Example Function
+
+ Yields
+ ------
+ scalar or array-like
+ The result of the computation
+ """)
+ expected = dedent("""
+ Example Function
+
+ :Yields: :term:`scalar` or :class:`array-like <numpy.ndarray>` -- The result of the computation
+ """)
+ translations = {
+ "scalar": ":term:`scalar`",
+ "array-like": ":class:`array-like <numpy.ndarray>`",
+ }
+ config = Config(napoleon_type_aliases=translations, napoleon_preprocess_types=True)
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "method"))
+ assert expected == actual
+
+ def test_raises_types(self):
+ docstrings = [("""
+Example Function
+
+Raises
+------
+ RuntimeError
+
+ A setting wasn't specified, or was invalid.
+ ValueError
+
+ Something something value error.
+
+""", """
+Example Function
+
+:raises RuntimeError: A setting wasn't specified, or was invalid.
+:raises ValueError: Something something value error.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+InvalidDimensionsError
+
+""", """
+Example Function
+
+:raises InvalidDimensionsError:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+Invalid Dimensions Error
+
+""", """
+Example Function
+
+:raises Invalid Dimensions Error:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+Invalid Dimensions Error
+ With description
+
+""", """
+Example Function
+
+:raises Invalid Dimensions Error: With description
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+InvalidDimensionsError
+ If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises InvalidDimensionsError: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+Invalid Dimensions Error
+ If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises Invalid Dimensions Error: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises If the dimensions couldn't be parsed.:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+:class:`exc.InvalidDimensionsError`
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError:
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+:class:`exc.InvalidDimensionsError`
+ If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+:class:`exc.InvalidDimensionsError`
+ If the dimensions couldn't be parsed,
+ then a :class:`exc.InvalidDimensionsError` will be raised.
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError: If the dimensions couldn't be parsed,
+ then a :class:`exc.InvalidDimensionsError` will be raised.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+:class:`exc.InvalidDimensionsError`
+ If the dimensions couldn't be parsed.
+:class:`exc.InvalidArgumentsError`
+ If the arguments are invalid.
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError: If the dimensions couldn't be parsed.
+:raises exc.InvalidArgumentsError: If the arguments are invalid.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+CustomError
+ If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises package.CustomError: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+AnotherError
+ If the dimensions couldn't be parsed.
+
+""", """
+Example Function
+
+:raises ~package.AnotherError: If the dimensions couldn't be parsed.
+"""),
+ ################################
+ ("""
+Example Function
+
+Raises
+------
+:class:`exc.InvalidDimensionsError`
+:class:`exc.InvalidArgumentsError`
+
+""", """
+Example Function
+
+:raises exc.InvalidDimensionsError:
+:raises exc.InvalidArgumentsError:
+""")]
+ for docstring, expected in docstrings:
+ translations = {
+ "CustomError": "package.CustomError",
+ "AnotherError": ":py:exc:`~package.AnotherError`",
+ }
+ config = Config(napoleon_type_aliases=translations, napoleon_preprocess_types=True)
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "method"))
+ assert expected == actual
+
+ def test_xrefs_in_return_type(self):
+ docstring = """
+Example Function
+
+Returns
+-------
+:class:`numpy.ndarray`
+ A :math:`n \\times 2` array containing
+ a bunch of math items
+"""
+ expected = """
+Example Function
+
+:returns: A :math:`n \\times 2` array containing
+ a bunch of math items
+:rtype: :class:`numpy.ndarray`
+"""
+ config = Config()
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "method"))
+ assert expected == actual
+
+ def test_section_header_underline_length(self):
+ docstrings = [("""
+Summary line
+
+Example
+-
+Multiline example
+body
+
+""", """
+Summary line
+
+Example
+-
+Multiline example
+body
+"""),
+ ################################
+ ("""
+Summary line
+
+Example
+--
+Multiline example
+body
+
+""", """
+Summary line
+
+.. rubric:: Example
+
+Multiline example
+body
+"""),
+ ################################
+ ("""
+Summary line
+
+Example
+-------
+Multiline example
+body
+
+""", """
+Summary line
+
+.. rubric:: Example
+
+Multiline example
+body
+"""),
+ ################################
+ ("""
+Summary line
+
+Example
+------------
+Multiline example
+body
+
+""", """
+Summary line
+
+.. rubric:: Example
+
+Multiline example
+body
+""")]
+ for docstring, expected in docstrings:
+ actual = str(NumpyDocstring(docstring))
+ assert expected == actual
+
+ def test_list_in_parameter_description(self):
+ docstring = """One line summary.
+
+Parameters
+----------
+no_list : int
+one_bullet_empty : int
+ *
+one_bullet_single_line : int
+ - first line
+one_bullet_two_lines : int
+ + first line
+ continued
+two_bullets_single_line : int
+ - first line
+ - second line
+two_bullets_two_lines : int
+ * first line
+ continued
+ * second line
+ continued
+one_enumeration_single_line : int
+ 1. first line
+one_enumeration_two_lines : int
+ 1) first line
+ continued
+two_enumerations_one_line : int
+ (iii) first line
+ (iv) second line
+two_enumerations_two_lines : int
+ a. first line
+ continued
+ b. second line
+ continued
+one_definition_one_line : int
+ item 1
+ first line
+one_definition_two_lines : int
+ item 1
+ first line
+ continued
+two_definitions_one_line : int
+ item 1
+ first line
+ item 2
+ second line
+two_definitions_two_lines : int
+ item 1
+ first line
+ continued
+ item 2
+ second line
+ continued
+one_definition_blank_line : int
+ item 1
+
+ first line
+
+ extra first line
+
+two_definitions_blank_lines : int
+ item 1
+
+ first line
+
+ extra first line
+
+ item 2
+
+ second line
+
+ extra second line
+
+definition_after_normal_text : int
+ text line
+
+ item 1
+ first line
+"""
+
+ expected = """One line summary.
+
+:param no_list:
+:type no_list: int
+:param one_bullet_empty:
+ *
+:type one_bullet_empty: int
+:param one_bullet_single_line:
+ - first line
+:type one_bullet_single_line: int
+:param one_bullet_two_lines:
+ + first line
+ continued
+:type one_bullet_two_lines: int
+:param two_bullets_single_line:
+ - first line
+ - second line
+:type two_bullets_single_line: int
+:param two_bullets_two_lines:
+ * first line
+ continued
+ * second line
+ continued
+:type two_bullets_two_lines: int
+:param one_enumeration_single_line:
+ 1. first line
+:type one_enumeration_single_line: int
+:param one_enumeration_two_lines:
+ 1) first line
+ continued
+:type one_enumeration_two_lines: int
+:param two_enumerations_one_line:
+ (iii) first line
+ (iv) second line
+:type two_enumerations_one_line: int
+:param two_enumerations_two_lines:
+ a. first line
+ continued
+ b. second line
+ continued
+:type two_enumerations_two_lines: int
+:param one_definition_one_line:
+ item 1
+ first line
+:type one_definition_one_line: int
+:param one_definition_two_lines:
+ item 1
+ first line
+ continued
+:type one_definition_two_lines: int
+:param two_definitions_one_line:
+ item 1
+ first line
+ item 2
+ second line
+:type two_definitions_one_line: int
+:param two_definitions_two_lines:
+ item 1
+ first line
+ continued
+ item 2
+ second line
+ continued
+:type two_definitions_two_lines: int
+:param one_definition_blank_line:
+ item 1
+
+ first line
+
+ extra first line
+:type one_definition_blank_line: int
+:param two_definitions_blank_lines:
+ item 1
+
+ first line
+
+ extra first line
+
+ item 2
+
+ second line
+
+ extra second line
+:type two_definitions_blank_lines: int
+:param definition_after_normal_text: text line
+
+ item 1
+ first line
+:type definition_after_normal_text: int
+"""
+ config = Config(napoleon_use_param=True)
+ actual = str(NumpyDocstring(docstring, config))
+ assert expected == actual
+
+ expected = """One line summary.
+
+:Parameters: * **no_list** (:class:`int`)
+ * **one_bullet_empty** (:class:`int`) --
+
+ *
+ * **one_bullet_single_line** (:class:`int`) --
+
+ - first line
+ * **one_bullet_two_lines** (:class:`int`) --
+
+ + first line
+ continued
+ * **two_bullets_single_line** (:class:`int`) --
+
+ - first line
+ - second line
+ * **two_bullets_two_lines** (:class:`int`) --
+
+ * first line
+ continued
+ * second line
+ continued
+ * **one_enumeration_single_line** (:class:`int`) --
+
+ 1. first line
+ * **one_enumeration_two_lines** (:class:`int`) --
+
+ 1) first line
+ continued
+ * **two_enumerations_one_line** (:class:`int`) --
+
+ (iii) first line
+ (iv) second line
+ * **two_enumerations_two_lines** (:class:`int`) --
+
+ a. first line
+ continued
+ b. second line
+ continued
+ * **one_definition_one_line** (:class:`int`) --
+
+ item 1
+ first line
+ * **one_definition_two_lines** (:class:`int`) --
+
+ item 1
+ first line
+ continued
+ * **two_definitions_one_line** (:class:`int`) --
+
+ item 1
+ first line
+ item 2
+ second line
+ * **two_definitions_two_lines** (:class:`int`) --
+
+ item 1
+ first line
+ continued
+ item 2
+ second line
+ continued
+ * **one_definition_blank_line** (:class:`int`) --
+
+ item 1
+
+ first line
+
+ extra first line
+ * **two_definitions_blank_lines** (:class:`int`) --
+
+ item 1
+
+ first line
+
+ extra first line
+
+ item 2
+
+ second line
+
+ extra second line
+ * **definition_after_normal_text** (:class:`int`) -- text line
+
+ item 1
+ first line
+"""
+ config = Config(napoleon_use_param=False, napoleon_preprocess_types=True)
+ actual = str(NumpyDocstring(docstring, config))
+ assert expected == actual
+
+ def test_token_type(self):
+ tokens = (
+ ("1", "literal"),
+ ("-4.6", "literal"),
+ ("2j", "literal"),
+ ("'string'", "literal"),
+ ('"another_string"', "literal"),
+ ("{1, 2}", "literal"),
+ ("{'va{ue', 'set'}", "literal"),
+ ("optional", "control"),
+ ("default", "control"),
+ (", ", "delimiter"),
+ (" of ", "delimiter"),
+ (" or ", "delimiter"),
+ (": ", "delimiter"),
+ ("True", "obj"),
+ ("None", "obj"),
+ ("name", "obj"),
+ (":py:class:`Enum`", "reference"),
+ )
+
+ for token, expected in tokens:
+ actual = _token_type(token)
+ assert expected == actual
+
+ def test_tokenize_type_spec(self):
+ specs = (
+ "str",
+ "defaultdict",
+ "int, float, or complex",
+ "int or float or None, optional",
+ "list of list of int or float, optional",
+ "tuple of list of str, float, or int",
+ '{"F", "C", "N"}',
+ "{'F', 'C', 'N'}, default: 'F'",
+ "{'F', 'C', 'N or C'}, default 'F'",
+ "str, default: 'F or C'",
+ "int, default: None",
+ "int, default None",
+ "int, default :obj:`None`",
+ '"ma{icious"',
+ r"'with \'quotes\''",
+ )
+
+ tokens = (
+ ["str"],
+ ["defaultdict"],
+ ["int", ", ", "float", ", or ", "complex"],
+ ["int", " or ", "float", " or ", "None", ", ", "optional"],
+ ["list", " of ", "list", " of ", "int", " or ", "float", ", ", "optional"],
+ ["tuple", " of ", "list", " of ", "str", ", ", "float", ", or ", "int"],
+ ["{", '"F"', ", ", '"C"', ", ", '"N"', "}"],
+ ["{", "'F'", ", ", "'C'", ", ", "'N'", "}", ", ", "default", ": ", "'F'"],
+ ["{", "'F'", ", ", "'C'", ", ", "'N or C'", "}", ", ", "default", " ", "'F'"],
+ ["str", ", ", "default", ": ", "'F or C'"],
+ ["int", ", ", "default", ": ", "None"],
+ ["int", ", ", "default", " ", "None"],
+ ["int", ", ", "default", " ", ":obj:`None`"],
+ ['"ma{icious"'],
+ [r"'with \'quotes\''"],
+ )
+
+ for spec, expected in zip(specs, tokens):
+ actual = _tokenize_type_spec(spec)
+ assert expected == actual
+
+ def test_recombine_set_tokens(self):
+ tokens = (
+ ["{", "1", ", ", "2", "}"],
+ ["{", '"F"', ", ", '"C"', ", ", '"N"', "}", ", ", "optional"],
+ ["{", "'F'", ", ", "'C'", ", ", "'N'", "}", ", ", "default", ": ", "None"],
+ ["{", "'F'", ", ", "'C'", ", ", "'N'", "}", ", ", "default", " ", "None"],
+ )
+
+ combined_tokens = (
+ ["{1, 2}"],
+ ['{"F", "C", "N"}', ", ", "optional"],
+ ["{'F', 'C', 'N'}", ", ", "default", ": ", "None"],
+ ["{'F', 'C', 'N'}", ", ", "default", " ", "None"],
+ )
+
+ for tokens_, expected in zip(tokens, combined_tokens):
+ actual = _recombine_set_tokens(tokens_)
+ assert expected == actual
+
+ def test_recombine_set_tokens_invalid(self):
+ tokens = (
+ ["{", "1", ", ", "2"],
+ ['"F"', ", ", '"C"', ", ", '"N"', "}", ", ", "optional"],
+ ["{", "1", ", ", "2", ", ", "default", ": ", "None"],
+ )
+ combined_tokens = (
+ ["{1, 2"],
+ ['"F"', ", ", '"C"', ", ", '"N"', "}", ", ", "optional"],
+ ["{1, 2", ", ", "default", ": ", "None"],
+ )
+
+ for tokens_, expected in zip(tokens, combined_tokens):
+ actual = _recombine_set_tokens(tokens_)
+ assert expected == actual
+
+ def test_convert_numpy_type_spec(self):
+ translations = {
+ "DataFrame": "pandas.DataFrame",
+ }
+
+ specs = (
+ "",
+ "optional",
+ "str, optional",
+ "int or float or None, default: None",
+ "list of tuple of str, optional",
+ "int, default None",
+ '{"F", "C", "N"}',
+ "{'F', 'C', 'N'}, default: 'N'",
+ "{'F', 'C', 'N'}, default 'N'",
+ "DataFrame, optional",
+ )
+
+ converted = (
+ "",
+ "*optional*",
+ ":class:`str`, *optional*",
+ ":class:`int` or :class:`float` or :obj:`None`, *default*: :obj:`None`",
+ ":class:`list` of :class:`tuple` of :class:`str`, *optional*",
+ ":class:`int`, *default* :obj:`None`",
+ '``{"F", "C", "N"}``',
+ "``{'F', 'C', 'N'}``, *default*: ``'N'``",
+ "``{'F', 'C', 'N'}``, *default* ``'N'``",
+ ":class:`pandas.DataFrame`, *optional*",
+ )
+
+ for spec, expected in zip(specs, converted):
+ actual = _convert_numpy_type_spec(spec, translations=translations)
+ assert expected == actual
+
+ def test_parameter_types(self):
+ docstring = dedent("""\
+ Parameters
+ ----------
+ param1 : DataFrame
+ the data to work on
+ param2 : int or float or None, optional
+ a parameter with different types
+ param3 : dict-like, optional
+ a optional mapping
+ param4 : int or float or None, optional
+ a optional parameter with different types
+ param5 : {"F", "C", "N"}, optional
+ a optional parameter with fixed values
+ param6 : int, default None
+ different default format
+ param7 : mapping of hashable to str, optional
+ a optional mapping
+ param8 : ... or Ellipsis
+ ellipsis
+ param9 : tuple of list of int
+ a parameter with tuple of list of int
+ """)
+ expected = dedent("""\
+ :param param1: the data to work on
+ :type param1: :class:`DataFrame`
+ :param param2: a parameter with different types
+ :type param2: :class:`int` or :class:`float` or :obj:`None`, *optional*
+ :param param3: a optional mapping
+ :type param3: :term:`dict-like <mapping>`, *optional*
+ :param param4: a optional parameter with different types
+ :type param4: :class:`int` or :class:`float` or :obj:`None`, *optional*
+ :param param5: a optional parameter with fixed values
+ :type param5: ``{"F", "C", "N"}``, *optional*
+ :param param6: different default format
+ :type param6: :class:`int`, *default* :obj:`None`
+ :param param7: a optional mapping
+ :type param7: :term:`mapping` of :term:`hashable` to :class:`str`, *optional*
+ :param param8: ellipsis
+ :type param8: :obj:`... <Ellipsis>` or :obj:`Ellipsis`
+ :param param9: a parameter with tuple of list of int
+ :type param9: :class:`tuple` of :class:`list` of :class:`int`
+ """)
+ translations = {
+ "dict-like": ":term:`dict-like <mapping>`",
+ "mapping": ":term:`mapping`",
+ "hashable": ":term:`hashable`",
+ }
+ config = Config(
+ napoleon_use_param=True,
+ napoleon_use_rtype=True,
+ napoleon_preprocess_types=True,
+ napoleon_type_aliases=translations,
+ )
+ actual = str(NumpyDocstring(docstring, config))
+ assert expected == actual
+
+ def test_token_type_invalid(self, warning):
+ tokens = (
+ "{1, 2",
+ "}",
+ "'abc",
+ "def'",
+ '"ghi',
+ 'jkl"',
+ )
+ errors = (
+ r".+: invalid value set \(missing closing brace\):",
+ r".+: invalid value set \(missing opening brace\):",
+ r".+: malformed string literal \(missing closing quote\):",
+ r".+: malformed string literal \(missing opening quote\):",
+ r".+: malformed string literal \(missing closing quote\):",
+ r".+: malformed string literal \(missing opening quote\):",
+ )
+ for token, error in zip(tokens, errors):
+ try:
+ _token_type(token)
+ finally:
+ raw_warnings = warning.getvalue()
+ warnings = [w for w in raw_warnings.split("\n") if w.strip()]
+
+ assert len(warnings) == 1
+ assert re.compile(error).match(warnings[0])
+ warning.truncate(0)
+
+ @pytest.mark.parametrize(
+ ("name", "expected"),
+ [
+ ("x, y, z", "x, y, z"),
+ ("*args, **kwargs", r"\*args, \*\*kwargs"),
+ ("*x, **y", r"\*x, \*\*y"),
+ ],
+ )
+ def test_escape_args_and_kwargs(self, name, expected):
+ numpy_docstring = NumpyDocstring("")
+ actual = numpy_docstring._escape_args_and_kwargs(name)
+
+ assert actual == expected
+
+ def test_pep526_annotations(self):
+ # test class attributes annotations
+ config = Config(
+ napoleon_attr_annotations=True,
+ )
+ actual = str(NumpyDocstring(cleandoc(PEP526NumpyClass.__doc__), config, app=None, what="class",
+ obj=PEP526NumpyClass))
+ expected = """\
+Sample class with PEP 526 annotations and numpy docstring
+
+.. attribute:: attr1
+
+ Attr1 description
+
+ :type: int
+
+.. attribute:: attr2
+
+ Attr2 description
+
+ :type: str
+"""
+ print(actual)
+ assert expected == actual
+
+
+@pytest.mark.sphinx('text', testroot='ext-napoleon',
+ confoverrides={'autodoc_typehints': 'description',
+ 'autodoc_typehints_description_target': 'all'})
+def test_napoleon_and_autodoc_typehints_description_all(app, status, warning):
+ app.build()
+ content = (app.outdir / 'typehints.txt').read_text(encoding='utf-8')
+ assert content == (
+ 'typehints\n'
+ '*********\n'
+ '\n'
+ 'mypackage.typehints.hello(x, *args, **kwargs)\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **x** (*int*) -- X\n'
+ '\n'
+ ' * ***args** (*int*) -- Additional arguments.\n'
+ '\n'
+ ' * ****kwargs** (*int*) -- Extra arguments.\n'
+ '\n'
+ ' Return type:\n'
+ ' None\n'
+ )
+
+
+@pytest.mark.sphinx('text', testroot='ext-napoleon',
+ confoverrides={'autodoc_typehints': 'description',
+ 'autodoc_typehints_description_target': 'documented_params'})
+def test_napoleon_and_autodoc_typehints_description_documented_params(app, status, warning):
+ app.build()
+ content = (app.outdir / 'typehints.txt').read_text(encoding='utf-8')
+ assert content == (
+ 'typehints\n'
+ '*********\n'
+ '\n'
+ 'mypackage.typehints.hello(x, *args, **kwargs)\n'
+ '\n'
+ ' Parameters:\n'
+ ' * **x** (*int*) -- X\n'
+ '\n'
+ ' * ***args** (*int*) -- Additional arguments.\n'
+ '\n'
+ ' * ****kwargs** (*int*) -- Extra arguments.\n'
+ )
diff --git a/tests/test_ext_todo.py b/tests/test_ext_todo.py
new file mode 100644
index 0000000..7d39495
--- /dev/null
+++ b/tests/test_ext_todo.py
@@ -0,0 +1,109 @@
+"""Test sphinx.ext.todo extension."""
+
+import re
+
+import pytest
+
+
+@pytest.mark.sphinx('html', testroot='ext-todo', freshenv=True,
+ confoverrides={'todo_include_todos': True, 'todo_emit_warnings': True})
+def test_todo(app, status, warning):
+ todos = []
+
+ def on_todo_defined(app, node):
+ todos.append(node)
+
+ app.connect('todo-defined', on_todo_defined)
+ app.builder.build_all()
+
+ # check todolist
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<p class="admonition-title">Todo</p>\n'
+ '<p>todo in foo</p>') in content
+
+ assert ('<p class="admonition-title">Todo</p>\n'
+ '<p>todo in bar</p>') in content
+
+ # check todo
+ content = (app.outdir / 'foo.html').read_text(encoding='utf8')
+ assert ('<p class="admonition-title">Todo</p>\n'
+ '<p>todo in foo</p>') in content
+
+ assert ('<p class="admonition-title">Todo</p>\n'
+ '<p>todo in param field</p>') in content
+
+ # check emitted warnings
+ assert 'WARNING: TODO entry found: todo in foo' in warning.getvalue()
+ assert 'WARNING: TODO entry found: todo in bar' in warning.getvalue()
+
+ # check handled event
+ assert len(todos) == 3
+ assert {todo[1].astext() for todo in todos} == {'todo in foo',
+ 'todo in bar',
+ 'todo in param field'}
+
+
+@pytest.mark.sphinx('html', testroot='ext-todo', freshenv=True,
+ confoverrides={'todo_include_todos': False, 'todo_emit_warnings': True})
+def test_todo_not_included(app, status, warning):
+ todos = []
+
+ def on_todo_defined(app, node):
+ todos.append(node)
+
+ app.connect('todo-defined', on_todo_defined)
+ app.builder.build_all()
+
+ # check todolist
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<p class="admonition-title">Todo</p>\n'
+ '<p>todo in foo</p>') not in content
+
+ assert ('<p class="admonition-title">Todo</p>\n'
+ '<p>todo in bar</p>') not in content
+
+ # check todo
+ content = (app.outdir / 'foo.html').read_text(encoding='utf8')
+ assert ('<p class="admonition-title">Todo</p>\n'
+ '<p>todo in foo</p>') not in content
+
+ # check emitted warnings
+ assert 'WARNING: TODO entry found: todo in foo' in warning.getvalue()
+ assert 'WARNING: TODO entry found: todo in bar' in warning.getvalue()
+
+ # check handled event
+ assert len(todos) == 3
+ assert {todo[1].astext() for todo in todos} == {'todo in foo',
+ 'todo in bar',
+ 'todo in param field'}
+
+
+@pytest.mark.sphinx('latex', testroot='ext-todo', freshenv=True,
+ confoverrides={'todo_include_todos': True})
+def test_todo_valid_link(app, status, warning):
+ """
+ Test that the inserted "original entry" links for todo items have a target
+ that exists in the LaTeX output. The target was previously incorrectly
+ omitted (GitHub issue #1020).
+ """
+
+ # Ensure the LaTeX output is built.
+ app.builder.build_all()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+
+ # Look for the link to foo. Note that there are two of them because the
+ # source document uses todolist twice. We could equally well look for links
+ # to bar.
+ link = (r'{\\hyperref\[\\detokenize{(.*?foo.*?)}]{\\sphinxcrossref{'
+ r'\\sphinxstyleemphasis{original entry}}}}')
+ m = re.findall(link, content)
+ assert len(m) == 4
+ target = m[0]
+
+ # Look for the targets of this link.
+ labels = re.findall(r'\\label{\\detokenize{([^}]*)}}', content)
+ matched = [l for l in labels if l == target]
+
+ # If everything is correct we should have exactly one target.
+ assert len(matched) == 1
diff --git a/tests/test_ext_viewcode.py b/tests/test_ext_viewcode.py
new file mode 100644
index 0000000..a1a0a6d
--- /dev/null
+++ b/tests/test_ext_viewcode.py
@@ -0,0 +1,137 @@
+"""Test sphinx.ext.viewcode extension."""
+
+import re
+import shutil
+
+import pytest
+
+
+def check_viewcode_output(app, warning):
+ warnings = re.sub(r'\\+', '/', warning.getvalue())
+ assert re.findall(
+ r"index.rst:\d+: WARNING: Object named 'func1' not found in include " +
+ r"file .*/spam/__init__.py'",
+ warnings,
+ )
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert result.count('href="_modules/spam/mod1.html#func1"') == 2
+ assert result.count('href="_modules/spam/mod2.html#func2"') == 2
+ assert result.count('href="_modules/spam/mod1.html#Class1"') == 2
+ assert result.count('href="_modules/spam/mod2.html#Class2"') == 2
+ assert result.count('@decorator') == 1
+
+ # test that the class attribute is correctly documented
+ assert result.count('this is Class3') == 2
+ assert 'this is the class attribute class_attr' in result
+ # the next assert fails, until the autodoc bug gets fixed
+ assert result.count('this is the class attribute class_attr') == 2
+
+ result = (app.outdir / '_modules/spam/mod1.html').read_text(encoding='utf8')
+ result = re.sub('<span class="[^"]{,2}">', '<span>', result) # filter pygments classes
+ assert ('<div class="viewcode-block" id="Class1">\n'
+ '<a class="viewcode-back" href="../../index.html#spam.Class1">[docs]</a>\n') in result
+ assert '<span>@decorator</span>\n' in result
+ assert '<span>class</span> <span>Class1</span><span>:</span>\n' in result
+ assert '<span> </span><span>&quot;&quot;&quot;</span>\n' in result
+ assert '<span> this is Class1</span>\n' in result
+ assert '<span> &quot;&quot;&quot;</span>\n' in result
+
+ return result
+
+
+@pytest.mark.sphinx(testroot='ext-viewcode', freshenv=True,
+ confoverrides={"viewcode_line_numbers": True})
+def test_viewcode_linenos(app, warning):
+ shutil.rmtree(app.outdir / '_modules', ignore_errors=True)
+ app.builder.build_all()
+
+ result = check_viewcode_output(app, warning)
+ assert '<span class="linenos"> 1</span>' in result
+
+
+@pytest.mark.sphinx(testroot='ext-viewcode', freshenv=True,
+ confoverrides={"viewcode_line_numbers": False})
+def test_viewcode(app, warning):
+ shutil.rmtree(app.outdir / '_modules', ignore_errors=True)
+ app.builder.build_all()
+
+ result = check_viewcode_output(app, warning)
+ assert 'class="linenos">' not in result
+
+
+@pytest.mark.sphinx('epub', testroot='ext-viewcode')
+def test_viewcode_epub_default(app, status, warning):
+ shutil.rmtree(app.outdir)
+ app.builder.build_all()
+
+ assert not (app.outdir / '_modules/spam/mod1.xhtml').exists()
+
+ result = (app.outdir / 'index.xhtml').read_text(encoding='utf8')
+ assert result.count('href="_modules/spam/mod1.xhtml#func1"') == 0
+
+
+@pytest.mark.sphinx('epub', testroot='ext-viewcode',
+ confoverrides={'viewcode_enable_epub': True})
+def test_viewcode_epub_enabled(app, status, warning):
+ app.builder.build_all()
+
+ assert (app.outdir / '_modules/spam/mod1.xhtml').exists()
+
+ result = (app.outdir / 'index.xhtml').read_text(encoding='utf8')
+ assert result.count('href="_modules/spam/mod1.xhtml#func1"') == 2
+
+
+@pytest.mark.sphinx(testroot='ext-viewcode', tags=['test_linkcode'])
+def test_linkcode(app, status, warning):
+ app.builder.build(['objects'])
+
+ stuff = (app.outdir / 'objects.html').read_text(encoding='utf8')
+
+ assert 'http://foobar/source/foolib.py' in stuff
+ assert 'http://foobar/js/' in stuff
+ assert 'http://foobar/c/' in stuff
+ assert 'http://foobar/cpp/' in stuff
+
+
+@pytest.mark.sphinx(testroot='ext-viewcode-find', freshenv=True)
+def test_local_source_files(app, status, warning):
+ def find_source(app, modname):
+ if modname == 'not_a_package':
+ source = (app.srcdir / 'not_a_package/__init__.py').read_text(encoding='utf8')
+ tags = {
+ 'func1': ('def', 1, 1),
+ 'Class1': ('class', 1, 1),
+ 'not_a_package.submodule.func1': ('def', 1, 1),
+ 'not_a_package.submodule.Class1': ('class', 1, 1),
+ }
+ else:
+ source = (app.srcdir / 'not_a_package/submodule.py').read_text(encoding='utf8')
+ tags = {
+ 'not_a_package.submodule.func1': ('def', 11, 15),
+ 'Class1': ('class', 19, 22),
+ 'not_a_package.submodule.Class1': ('class', 19, 22),
+ 'Class3': ('class', 25, 30),
+ 'not_a_package.submodule.Class3.class_attr': ('other', 29, 29),
+ }
+ return (source, tags)
+
+ app.connect('viewcode-find-source', find_source)
+ app.builder.build_all()
+
+ warnings = re.sub(r'\\+', '/', warning.getvalue())
+ assert re.findall(
+ r"index.rst:\d+: WARNING: Object named 'func1' not found in include " +
+ r"file .*/not_a_package/__init__.py'",
+ warnings,
+ )
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert result.count('href="_modules/not_a_package.html#func1"') == 1
+ assert result.count('href="_modules/not_a_package.html#not_a_package.submodule.func1"') == 1
+ assert result.count('href="_modules/not_a_package/submodule.html#Class1"') == 1
+ assert result.count('href="_modules/not_a_package/submodule.html#Class3"') == 1
+ assert result.count('href="_modules/not_a_package/submodule.html#not_a_package.submodule.Class1"') == 1
+
+ assert result.count('href="_modules/not_a_package/submodule.html#not_a_package.submodule.Class3.class_attr"') == 1
+ assert result.count('This is the class attribute class_attr') == 1
diff --git a/tests/test_extension.py b/tests/test_extension.py
new file mode 100644
index 0000000..d74743c
--- /dev/null
+++ b/tests/test_extension.py
@@ -0,0 +1,23 @@
+"""Test sphinx.extension module."""
+
+import pytest
+
+from sphinx.errors import VersionRequirementError
+from sphinx.extension import Extension, verify_needs_extensions
+
+
+def test_needs_extensions(app):
+ # empty needs_extensions
+ assert app.config.needs_extensions == {}
+ verify_needs_extensions(app, app.config)
+
+ # needs_extensions fulfilled
+ app.config.needs_extensions = {'test.extension': '3.9'}
+ app.extensions['test.extension'] = Extension('test.extension', 'test.extension', version='3.10')
+ verify_needs_extensions(app, app.config)
+
+ # needs_extensions not fulfilled
+ app.config.needs_extensions = {'test.extension': '3.11'}
+ app.extensions['test.extension'] = Extension('test.extension', 'test.extension', version='3.10')
+ with pytest.raises(VersionRequirementError):
+ verify_needs_extensions(app, app.config)
diff --git a/tests/test_highlighting.py b/tests/test_highlighting.py
new file mode 100644
index 0000000..a33ebb3
--- /dev/null
+++ b/tests/test_highlighting.py
@@ -0,0 +1,104 @@
+"""Test the Pygments highlighting bridge."""
+
+from unittest import mock
+
+from pygments.formatters.html import HtmlFormatter
+from pygments.lexer import RegexLexer
+from pygments.token import Name, Text
+
+from sphinx.highlighting import PygmentsBridge
+
+
+class MyLexer(RegexLexer):
+ name = 'testlexer'
+
+ tokens = {
+ 'root': [
+ ('a', Name),
+ ('b', Text),
+ ],
+ }
+
+
+class MyFormatter(HtmlFormatter):
+ def format(self, tokensource, outfile):
+ for tok in tokensource:
+ outfile.write(tok[1])
+
+
+class ComplainOnUnhighlighted(PygmentsBridge):
+ def unhighlighted(self, source):
+ raise AssertionError("should highlight %r" % source)
+
+
+def test_add_lexer(app, status, warning):
+ app.add_lexer('test', MyLexer)
+
+ bridge = PygmentsBridge('html')
+ ret = bridge.highlight_block('ab', 'test')
+ assert '<span class="n">a</span>b' in ret
+
+
+def test_detect_interactive():
+ bridge = ComplainOnUnhighlighted('html')
+ blocks = [
+ """
+ >>> testing()
+ True
+ """,
+ ]
+ for block in blocks:
+ ret = bridge.highlight_block(block.lstrip(), 'python')
+ assert ret.startswith("<div class=\"highlight\">")
+
+
+def test_lexer_options():
+ bridge = PygmentsBridge('html')
+ ret = bridge.highlight_block('//comment', 'php', opts={'startinline': True})
+ assert '<span class="c1">//comment</span>' in ret
+
+
+def test_set_formatter():
+ PygmentsBridge.html_formatter = MyFormatter
+ try:
+ bridge = PygmentsBridge('html')
+ ret = bridge.highlight_block('foo\n', 'python')
+ assert ret == 'foo\n'
+ finally:
+ PygmentsBridge.html_formatter = HtmlFormatter
+
+
+@mock.patch('sphinx.highlighting.logger')
+def test_default_highlight(logger):
+ bridge = PygmentsBridge('html')
+
+ # default: highlights as python3
+ ret = bridge.highlight_block('print "Hello sphinx world"', 'default')
+ assert ret == ('<div class="highlight"><pre><span></span><span class="nb">print</span> '
+ '<span class="s2">&quot;Hello sphinx world&quot;</span>\n</pre></div>\n')
+
+ # default: fallbacks to none if highlighting failed
+ ret = bridge.highlight_block('reST ``like`` text', 'default')
+ assert ret == '<div class="highlight"><pre><span></span>reST ``like`` text\n</pre></div>\n'
+
+ # python: highlights as python3
+ ret = bridge.highlight_block('print("Hello sphinx world")', 'python')
+ assert ret == ('<div class="highlight"><pre><span></span><span class="nb">print</span>'
+ '<span class="p">(</span>'
+ '<span class="s2">&quot;Hello sphinx world&quot;</span>'
+ '<span class="p">)</span>\n</pre></div>\n')
+
+ # python3: highlights as python3
+ ret = bridge.highlight_block('print("Hello sphinx world")', 'python3')
+ assert ret == ('<div class="highlight"><pre><span></span><span class="nb">print</span>'
+ '<span class="p">(</span>'
+ '<span class="s2">&quot;Hello sphinx world&quot;</span>'
+ '<span class="p">)</span>\n</pre></div>\n')
+
+ # python: raises error if highlighting failed
+ ret = bridge.highlight_block('reST ``like`` text', 'python')
+ logger.warning.assert_called_with('Lexing literal_block %r as "%s" resulted in an error at token: %r. '
+ 'Retrying in relaxed mode.',
+ 'reST ``like`` text', 'python', '`',
+ type='misc', subtype='highlighting_failure',
+ location=None)
diff --git a/tests/test_intl.py b/tests/test_intl.py
new file mode 100644
index 0000000..a07ebfb
--- /dev/null
+++ b/tests/test_intl.py
@@ -0,0 +1,1527 @@
+"""Test message patching for internationalization purposes.
+
+Runs the text builder in the test root.
+"""
+
+import os
+import os.path
+import re
+import shutil
+import time
+from pathlib import Path
+
+import pytest
+from babel.messages import mofile, pofile
+from babel.messages.catalog import Catalog
+from docutils import nodes
+
+from sphinx import locale
+from sphinx.testing.util import assert_node, etree_parse, strip_escseq
+from sphinx.util.nodes import NodeMatcher
+
+sphinx_intl = pytest.mark.sphinx(
+ testroot='intl',
+ confoverrides={
+ 'language': 'xx', 'locale_dirs': ['.'],
+ 'gettext_compact': False,
+ },
+)
+
+
+def read_po(pathname):
+ with open(pathname, encoding='utf-8') as f:
+ return pofile.read_po(f)
+
+
+def write_mo(pathname, po):
+ with open(pathname, 'wb') as f:
+ return mofile.write_mo(f, po)
+
+
+@pytest.fixture(autouse=True)
+def _setup_intl(app_params):
+ assert isinstance(app_params.kwargs['srcdir'], Path)
+ srcdir = app_params.kwargs['srcdir']
+ for dirpath, _dirs, files in os.walk(srcdir):
+ dirpath = Path(dirpath)
+ for f in [f for f in files if f.endswith('.po')]:
+ po = str(dirpath / f)
+ mo = srcdir / 'xx' / 'LC_MESSAGES' / (
+ os.path.relpath(po[:-3], srcdir) + '.mo')
+ if not mo.parent.exists():
+ mo.parent.mkdir(parents=True, exist_ok=True)
+
+ if not mo.exists() or os.stat(mo).st_mtime < os.stat(po).st_mtime:
+ # compile .mo file only if needed
+ write_mo(mo, read_po(po))
+
+
+@pytest.fixture(autouse=True)
+def _info(app):
+ yield
+ print('# language:', app.config.language)
+ print('# locale_dirs:', app.config.locale_dirs)
+
+
+def elem_gettexts(elem):
+ return [_f for _f in [s.strip() for s in elem.itertext()] if _f]
+
+
+def elem_getref(elem):
+ return elem.attrib.get('refid') or elem.attrib.get('refuri')
+
+
+def assert_elem(elem, texts=None, refs=None, names=None):
+ if texts is not None:
+ _texts = elem_gettexts(elem)
+ assert _texts == texts
+ if refs is not None:
+ _refs = [elem_getref(x) for x in elem.findall('reference')]
+ assert _refs == refs
+ if names is not None:
+ _names = elem.attrib.get('names').split()
+ assert _names == names
+
+
+def assert_count(expected_expr, result, count):
+ find_pair = (expected_expr, result)
+ assert len(re.findall(*find_pair)) == count, find_pair
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_emit_warnings(app, warning):
+ app.build()
+ # test warnings in translation
+ warnings = getwarning(warning)
+ warning_expr = ('.*/warnings.txt:4:<translated>:1: '
+ 'WARNING: Inline literal start-string without end-string.\n')
+ assert re.search(warning_expr, warnings), f'{warning_expr!r} did not match {warnings!r}'
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_warning_node(app):
+ app.build()
+ # test warnings in translation
+ result = (app.outdir / 'warnings.txt').read_text(encoding='utf8')
+ expect = ("3. I18N WITH REST WARNINGS"
+ "\n**************************\n"
+ "\nLINE OF >>``<<BROKEN LITERAL MARKUP.\n")
+ assert result == expect
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_title_underline(app):
+ app.build()
+ # --- simple translation; check title underlines
+ result = (app.outdir / 'bom.txt').read_text(encoding='utf8')
+ expect = ("2. Datei mit UTF-8"
+ "\n******************\n" # underline matches new translation
+ "\nThis file has umlauts: äöü.\n")
+ assert result == expect
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_subdirs(app):
+ app.build()
+ # --- check translation in subdirs
+ result = (app.outdir / 'subdir' / 'index.txt').read_text(encoding='utf8')
+ assert result.startswith('1. subdir contents\n******************\n')
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_inconsistency_warnings(app, warning):
+ app.build()
+ # --- check warnings for inconsistency in number of references
+ result = (app.outdir / 'refs_inconsistency.txt').read_text(encoding='utf8')
+ expect = ("8. I18N WITH REFS INCONSISTENCY"
+ "\n*******************************\n"
+ "\n* FOR CITATION [ref3].\n"
+ "\n* reference FOR reference.\n"
+ "\n* ORPHAN REFERENCE: I18N WITH REFS INCONSISTENCY.\n"
+ "\n[1] THIS IS A AUTO NUMBERED FOOTNOTE.\n"
+ "\n[ref2] THIS IS A CITATION.\n"
+ "\n[100] THIS IS A NUMBERED FOOTNOTE.\n")
+ assert result == expect
+
+ warnings = getwarning(warning)
+ warning_fmt = ('.*/refs_inconsistency.txt:\\d+: '
+ 'WARNING: inconsistent %(reftype)s in translated message.'
+ ' original: %(original)s, translated: %(translated)s\n')
+ expected_warning_expr = (
+ warning_fmt % {
+ 'reftype': 'footnote references',
+ 'original': "\\['\\[#\\]_'\\]",
+ 'translated': "\\[\\]",
+ } +
+ warning_fmt % {
+ 'reftype': 'footnote references',
+ 'original': "\\['\\[100\\]_'\\]",
+ 'translated': "\\[\\]",
+ } +
+ warning_fmt % {
+ 'reftype': 'references',
+ 'original': "\\['reference_'\\]",
+ 'translated': "\\['reference_', 'reference_'\\]",
+ } +
+ warning_fmt % {
+ 'reftype': 'references',
+ 'original': "\\[\\]",
+ 'translated': "\\['`I18N WITH REFS INCONSISTENCY`_'\\]",
+ })
+ assert re.search(expected_warning_expr, warnings), f'{expected_warning_expr!r} did not match {warnings!r}'
+
+ expected_citation_warning_expr = (
+ '.*/refs_inconsistency.txt:\\d+: WARNING: Citation \\[ref2\\] is not referenced.\n' +
+ '.*/refs_inconsistency.txt:\\d+: WARNING: citation not found: ref3')
+ assert re.search(expected_citation_warning_expr, warnings), f'{expected_citation_warning_expr!r} did not match {warnings!r}'
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_noqa(app, warning):
+ app.build()
+ result = (app.outdir / 'noqa.txt').read_text(encoding='utf8')
+ expect = r"""FIRST SECTION
+*************
+
+TRANSLATED TEXT WITHOUT REFERENCE.
+
+TEST noqa WHITESPACE INSENSITIVITY.
+
+"#noqa" IS ESCAPED AT THE END OF THIS STRING. #noqa
+
+
+NEXT SECTION WITH PARAGRAPH TO TEST BARE noqa
+*********************************************
+
+Some text, again referring to the section: NEXT SECTION WITH PARAGRAPH
+TO TEST BARE noqa.
+"""
+ assert result == expect
+ assert "next-section" not in getwarning(warning)
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_literalblock_warnings(app, warning):
+ app.build()
+ # --- check warning for literal block
+ result = (app.outdir / 'literalblock.txt').read_text(encoding='utf8')
+ expect = ("9. I18N WITH LITERAL BLOCK"
+ "\n**************************\n"
+ "\nCORRECT LITERAL BLOCK:\n"
+ "\n this is"
+ "\n literal block\n"
+ "\nMISSING LITERAL BLOCK:\n"
+ "\n<SYSTEM MESSAGE:")
+ assert result.startswith(expect)
+
+ warnings = getwarning(warning)
+ expected_warning_expr = ('.*/literalblock.txt:\\d+: '
+ 'WARNING: Literal block expected; none found.')
+ assert re.search(expected_warning_expr, warnings), f'{expected_warning_expr!r} did not match {warnings!r}'
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_definition_terms(app):
+ app.build()
+ # --- definition terms: regression test for #975, #2198, #2205
+ result = (app.outdir / 'definition_terms.txt').read_text(encoding='utf8')
+ expect = ("13. I18N WITH DEFINITION TERMS"
+ "\n******************************\n"
+ "\nSOME TERM"
+ "\n THE CORRESPONDING DEFINITION\n"
+ "\nSOME *TERM* WITH LINK"
+ "\n THE CORRESPONDING DEFINITION #2\n"
+ "\nSOME **TERM** WITH : CLASSIFIER1 : CLASSIFIER2"
+ "\n THE CORRESPONDING DEFINITION\n"
+ "\nSOME TERM WITH : CLASSIFIER[]"
+ "\n THE CORRESPONDING DEFINITION\n")
+ assert result == expect
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_glossary_term(app, warning):
+ app.build()
+ # --- glossary terms: regression test for #1090
+ result = (app.outdir / 'glossary_terms.txt').read_text(encoding='utf8')
+ expect = (r"""18. I18N WITH GLOSSARY TERMS
+****************************
+
+SOME NEW TERM
+ THE CORRESPONDING GLOSSARY
+
+SOME OTHER NEW TERM
+ THE CORRESPONDING GLOSSARY #2
+
+LINK TO *SOME NEW TERM*.
+
+TRANSLATED GLOSSARY SHOULD BE SORTED BY TRANSLATED TERMS:
+
+TRANSLATED TERM XXX
+ DEFINE XXX
+
+TRANSLATED TERM YYY
+ DEFINE YYY
+
+TRANSLATED TERM ZZZ
+VVV
+ DEFINE ZZZ
+""")
+ assert result == expect
+ warnings = getwarning(warning)
+ assert 'term not in glossary' not in warnings
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_glossary_term_inconsistencies(app, warning):
+ app.build()
+ # --- glossary term inconsistencies: regression test for #1090
+ result = (app.outdir / 'glossary_terms_inconsistency.txt').read_text(encoding='utf8')
+ expect = ("19. I18N WITH GLOSSARY TERMS INCONSISTENCY"
+ "\n******************************************\n"
+ "\n1. LINK TO *SOME NEW TERM*.\n")
+ assert result == expect
+
+ warnings = getwarning(warning)
+ expected_warning_expr = (
+ '.*/glossary_terms_inconsistency.txt:\\d+: '
+ 'WARNING: inconsistent term references in translated message.'
+ " original: \\[':term:`Some term`', ':term:`Some other term`'\\],"
+ " translated: \\[':term:`SOME NEW TERM`'\\]\n")
+ assert re.search(expected_warning_expr, warnings), f'{expected_warning_expr!r} did not match {warnings!r}'
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_section(app):
+ app.build()
+ # --- section
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'section.po')
+ actual = read_po(app.outdir / 'section.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_section(app):
+ app.build()
+ # --- section
+ result = (app.outdir / 'section.txt').read_text(encoding='utf8')
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'section.po')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.string in result
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_seealso(app):
+ app.build()
+ # --- seealso
+ result = (app.outdir / 'seealso.txt').read_text(encoding='utf8')
+ expect = ("12. I18N WITH SEEALSO"
+ "\n*********************\n"
+ "\nSee also: SHORT TEXT 1\n"
+ "\nSee also: LONG TEXT 1\n"
+ "\nSee also:\n"
+ "\n SHORT TEXT 2\n"
+ "\n LONG TEXT 2\n")
+ assert result == expect
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_figure_captions(app):
+ app.build()
+ # --- figure captions: regression test for #940
+ result = (app.outdir / 'figure.txt').read_text(encoding='utf8')
+ expect = ("14. I18N WITH FIGURE CAPTION"
+ "\n****************************\n"
+ "\n [image]MY CAPTION OF THE FIGURE\n"
+ "\n MY DESCRIPTION PARAGRAPH1 OF THE FIGURE.\n"
+ "\n MY DESCRIPTION PARAGRAPH2 OF THE FIGURE.\n"
+ "\n"
+ "\n14.1. FIGURE IN THE BLOCK"
+ "\n=========================\n"
+ "\nBLOCK\n"
+ "\n [image]MY CAPTION OF THE FIGURE\n"
+ "\n MY DESCRIPTION PARAGRAPH1 OF THE FIGURE.\n"
+ "\n MY DESCRIPTION PARAGRAPH2 OF THE FIGURE.\n"
+ "\n"
+ "\n"
+ "14.2. IMAGE URL AND ALT\n"
+ "=======================\n"
+ "\n"
+ "[image: I18N -> IMG][image]\n"
+ "\n"
+ " [image: IMG -> I18N][image]\n"
+ "\n"
+ "\n"
+ "14.3. IMAGE ON SUBSTITUTION\n"
+ "===========================\n"
+ "\n"
+ "\n"
+ "14.4. IMAGE UNDER NOTE\n"
+ "======================\n"
+ "\n"
+ "Note:\n"
+ "\n"
+ " [image: i18n under note][image]\n"
+ "\n"
+ " [image: img under note][image]\n")
+ assert result == expect
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_rubric(app):
+ app.build()
+ # --- rubric: regression test for pull request #190
+ result = (app.outdir / 'rubric.txt').read_text(encoding='utf8')
+ expect = ("I18N WITH RUBRIC"
+ "\n****************\n"
+ "\n-[ RUBRIC TITLE ]-\n"
+ "\n"
+ "\nRUBRIC IN THE BLOCK"
+ "\n===================\n"
+ "\nBLOCK\n"
+ "\n -[ RUBRIC TITLE ]-\n")
+ assert result == expect
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_docfields(app):
+ app.build()
+ # --- docfields
+ result = (app.outdir / 'docfields.txt').read_text(encoding='utf8')
+ expect = ("21. I18N WITH DOCFIELDS"
+ "\n***********************\n"
+ "\nclass Cls1\n"
+ "\n Parameters:"
+ "\n **param** -- DESCRIPTION OF PARAMETER param\n"
+ "\nclass Cls2\n"
+ "\n Parameters:"
+ "\n * **foo** -- DESCRIPTION OF PARAMETER foo\n"
+ "\n * **bar** -- DESCRIPTION OF PARAMETER bar\n"
+ "\nclass Cls3(values)\n"
+ "\n Raises:"
+ "\n **ValueError** -- IF THE VALUES ARE OUT OF RANGE\n"
+ "\nclass Cls4(values)\n"
+ "\n Raises:"
+ "\n * **TypeError** -- IF THE VALUES ARE NOT VALID\n"
+ "\n * **ValueError** -- IF THE VALUES ARE OUT OF RANGE\n"
+ "\nclass Cls5\n"
+ "\n Returns:"
+ '\n A NEW "Cls3" INSTANCE\n')
+ assert result == expect
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_admonitions(app):
+ app.build()
+ # --- admonitions
+ # #1206: gettext did not translate admonition directive's title
+ # seealso: https://docutils.sourceforge.io/docs/ref/rst/directives.html#admonitions
+ result = (app.outdir / 'admonitions.txt').read_text(encoding='utf8')
+ directives = (
+ "attention", "caution", "danger", "error", "hint",
+ "important", "note", "tip", "warning", "admonition")
+ for d in directives:
+ assert d.upper() + " TITLE" in result
+ assert d.upper() + " BODY" in result
+
+ # for #4938 `1. ` prefixed admonition title
+ assert "1. ADMONITION TITLE" in result
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_toctree(app):
+ app.build()
+ # --- toctree (index.rst)
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'index.po')
+ actual = read_po(app.outdir / 'index.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+ # --- toctree (toctree.rst)
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'toctree.po')
+ actual = read_po(app.outdir / 'toctree.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_table(app):
+ app.build()
+ # --- toctree
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'table.po')
+ actual = read_po(app.outdir / 'table.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_table(app):
+ app.build()
+ # --- toctree
+ result = (app.outdir / 'table.txt').read_text(encoding='utf8')
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'table.po')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.string in result
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_toctree(app):
+ app.build()
+ # --- toctree (index.rst)
+ # Note: index.rst contains contents that is not shown in text.
+ result = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert 'CONTENTS' in result
+ assert 'TABLE OF CONTENTS' in result
+ # --- toctree (toctree.rst)
+ result = (app.outdir / 'toctree.txt').read_text(encoding='utf8')
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'toctree.po')
+ for expect_msg in (m for m in expect if m.id):
+ assert expect_msg.string in result
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_topic(app):
+ app.build()
+ # --- topic
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'topic.po')
+ actual = read_po(app.outdir / 'topic.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_topic(app):
+ app.build()
+ # --- topic
+ result = (app.outdir / 'topic.txt').read_text(encoding='utf8')
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'topic.po')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.string in result
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_definition_terms(app):
+ app.build()
+ # --- definition terms: regression test for #2198, #2205
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'definition_terms.po')
+ actual = read_po(app.outdir / 'definition_terms.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_glossary_terms(app, warning):
+ app.build()
+ # --- glossary terms: regression test for #1090
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'glossary_terms.po')
+ actual = read_po(app.outdir / 'glossary_terms.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+ warnings = warning.getvalue().replace(os.sep, '/')
+ assert 'term not in glossary' not in warnings
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_glossary_term_inconsistencies(app):
+ app.build()
+ # --- glossary term inconsistencies: regression test for #1090
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'glossary_terms_inconsistency.po')
+ actual = read_po(app.outdir / 'glossary_terms_inconsistency.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_literalblock(app):
+ app.build()
+ # --- gettext builder always ignores ``only`` directive
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'literalblock.po')
+ actual = read_po(app.outdir / 'literalblock.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ if len(expect_msg.id.splitlines()) == 1:
+ # compare translations only labels
+ assert expect_msg.id in [m.id for m in actual if m.id]
+ else:
+ pass # skip code-blocks and literalblocks
+
+
+@sphinx_intl
+@pytest.mark.sphinx('gettext')
+@pytest.mark.test_params(shared_result='test_intl_gettext')
+def test_gettext_buildr_ignores_only_directive(app):
+ app.build()
+ # --- gettext builder always ignores ``only`` directive
+ expect = read_po(app.srcdir / 'xx' / 'LC_MESSAGES' / 'only.po')
+ actual = read_po(app.outdir / 'only.pot')
+ for expect_msg in [m for m in expect if m.id]:
+ assert expect_msg.id in [m.id for m in actual if m.id]
+
+
+@sphinx_intl
+def test_node_translated_attribute(app):
+ app.builder.build_specific([app.srcdir / 'translation_progress.txt'])
+
+ doctree = app.env.get_doctree('translation_progress')
+
+ translated_nodes = sum(1 for _ in doctree.findall(NodeMatcher(translated=True)))
+ assert translated_nodes == 10 + 1 # 10 lines + title
+
+ untranslated_nodes = sum(1 for _ in doctree.findall(NodeMatcher(translated=False)))
+ assert untranslated_nodes == 2 + 2 + 1 # 2 lines + 2 lines + substitution reference
+
+
+@sphinx_intl
+def test_translation_progress_substitution(app):
+ app.builder.build_specific([app.srcdir / 'translation_progress.txt'])
+
+ doctree = app.env.get_doctree('translation_progress')
+
+ assert doctree[0][19][0] == '68.75%' # 11 out of 16 lines are translated
+
+
+@pytest.mark.sphinx(testroot='intl', freshenv=True, confoverrides={
+ 'language': 'xx', 'locale_dirs': ['.'],
+ 'gettext_compact': False,
+ 'translation_progress_classes': True,
+})
+def test_translation_progress_classes_true(app):
+ app.builder.build_specific([app.srcdir / 'translation_progress.txt'])
+
+ doctree = app.env.get_doctree('translation_progress')
+
+ # title
+ assert 'translated' in doctree[0][0]['classes']
+
+ # translated lines
+ assert 'translated' in doctree[0][1]['classes']
+ assert 'translated' in doctree[0][2]['classes']
+ assert 'translated' in doctree[0][3]['classes']
+ assert 'translated' in doctree[0][4]['classes']
+ assert 'translated' in doctree[0][5]['classes']
+ assert 'translated' in doctree[0][6]['classes']
+ assert 'translated' in doctree[0][7]['classes']
+ assert 'translated' in doctree[0][8]['classes']
+
+ assert doctree[0][9]['classes'] == [] # comment node
+
+ # idempotent
+ assert 'translated' in doctree[0][10]['classes']
+ assert 'translated' in doctree[0][11]['classes']
+
+ assert doctree[0][12]['classes'] == [] # comment node
+
+ # untranslated
+ assert 'untranslated' in doctree[0][13]['classes']
+ assert 'untranslated' in doctree[0][14]['classes']
+
+ assert doctree[0][15]['classes'] == [] # comment node
+
+ # missing
+ assert 'untranslated' in doctree[0][16]['classes']
+ assert 'untranslated' in doctree[0][17]['classes']
+
+ assert doctree[0][18]['classes'] == [] # comment node
+
+ # substitution reference
+ assert 'untranslated' in doctree[0][19]['classes']
+
+ assert len(doctree[0]) == 20
+
+
+@sphinx_intl
+# use individual shared_result directory to avoid "incompatible doctree" error
+@pytest.mark.sphinx(testroot='builder-gettext-dont-rebuild-mo')
+def test_gettext_dont_rebuild_mo(make_app, app_params):
+ # --- don't rebuild by .mo mtime
+ def get_update_targets(app_):
+ app_.env.find_files(app_.config, app_.builder)
+ added, changed, removed = app_.env.get_outdated_files(config_changed=False)
+ return added, changed, removed
+
+ args, kwargs = app_params
+
+ # phase1: build document with non-gettext builder and generate mo file in srcdir
+ app0 = make_app('dummy', *args, **kwargs)
+ app0.build()
+ time.sleep(0.01)
+ assert (app0.srcdir / 'xx' / 'LC_MESSAGES' / 'bom.mo').exists()
+ # Since it is after the build, the number of documents to be updated is 0
+ update_targets = get_update_targets(app0)
+ assert update_targets[1] == set(), update_targets
+ # When rewriting the timestamp of mo file, the number of documents to be
+ # updated will be changed.
+ mtime = (app0.srcdir / 'xx' / 'LC_MESSAGES' / 'bom.mo').stat().st_mtime
+ os.utime(app0.srcdir / 'xx' / 'LC_MESSAGES' / 'bom.mo', (mtime + 5, mtime + 5))
+ update_targets = get_update_targets(app0)
+ assert update_targets[1] == {'bom'}, update_targets
+
+ # Because doctree for gettext builder can not be shared with other builders,
+ # erase doctreedir before gettext build.
+ shutil.rmtree(app0.doctreedir)
+
+ # phase2: build document with gettext builder.
+ # The mo file in the srcdir directory is retained.
+ app = make_app('gettext', *args, **kwargs)
+ app.build()
+ time.sleep(0.01)
+ # Since it is after the build, the number of documents to be updated is 0
+ update_targets = get_update_targets(app)
+ assert update_targets[1] == set(), update_targets
+ # Even if the timestamp of the mo file is updated, the number of documents
+ # to be updated is 0. gettext builder does not rebuild because of mo update.
+ os.utime(app0.srcdir / 'xx' / 'LC_MESSAGES' / 'bom.mo', (mtime + 10, mtime + 10))
+ update_targets = get_update_targets(app)
+ assert update_targets[1] == set(), update_targets
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_meta(app):
+ app.build()
+ # --- test for meta
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ expected_expr = '<meta content="TESTDATA FOR I18N" name="description" translated="True" />'
+ assert expected_expr in result
+ expected_expr = '<meta content="I18N, SPHINX, MARKUP" name="keywords" translated="True" />'
+ assert expected_expr in result
+ expected_expr = '<p class="caption" role="heading"><span class="caption-text">HIDDEN TOC</span></p>'
+ assert expected_expr in result
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_footnotes(app):
+ app.build()
+ # --- test for #955 cant-build-html-with-footnotes-when-using
+ # expect no error by build
+ (app.outdir / 'footnote.html').read_text(encoding='utf8')
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_undefined_refs(app):
+ app.build()
+ # --- links to undefined reference
+ result = (app.outdir / 'refs_inconsistency.html').read_text(encoding='utf8')
+
+ expected_expr = ('<a class="reference external" '
+ 'href="http://www.example.com">reference</a>')
+ assert len(re.findall(expected_expr, result)) == 2
+
+ expected_expr = ('<a class="reference internal" '
+ 'href="#reference">reference</a>')
+ assert len(re.findall(expected_expr, result)) == 0
+
+ expected_expr = ('<a class="reference internal" '
+ 'href="#i18n-with-refs-inconsistency">I18N WITH '
+ 'REFS INCONSISTENCY</a>')
+ assert len(re.findall(expected_expr, result)) == 1
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_index_entries(app):
+ app.build()
+ # --- index entries: regression test for #976
+ result = (app.outdir / 'genindex.html').read_text(encoding='utf8')
+
+ def wrap(tag, keyword):
+ start_tag = "<%s[^>]*>" % tag
+ end_tag = "</%s>" % tag
+ return fr"{start_tag}\s*{keyword}\s*{end_tag}"
+
+ def wrap_nest(parenttag, childtag, keyword):
+ start_tag1 = "<%s[^>]*>" % parenttag
+ start_tag2 = "<%s[^>]*>" % childtag
+ return fr"{start_tag1}\s*{keyword}\s*{start_tag2}"
+ expected_exprs = [
+ wrap('a', 'NEWSLETTER'),
+ wrap('a', 'MAILING LIST'),
+ wrap('a', 'RECIPIENTS LIST'),
+ wrap('a', 'FIRST SECOND'),
+ wrap('a', 'SECOND THIRD'),
+ wrap('a', 'THIRD, FIRST'),
+ wrap_nest('li', 'ul', 'ENTRY'),
+ wrap_nest('li', 'ul', 'SEE'),
+ ]
+ for expr in expected_exprs:
+ assert re.search(expr, result, re.MULTILINE), f'{expr!r} did not match {result!r}'
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_versionchanges(app):
+ app.build()
+ # --- versionchanges
+ result = (app.outdir / 'versionchange.html').read_text(encoding='utf8')
+
+ def get_content(result, name):
+ matched = re.search(r'<div class="%s">\n*(.*?)</div>' % name,
+ result, re.DOTALL)
+ if matched:
+ return matched.group(1)
+ else:
+ return ''
+
+ expect1 = (
+ """<p><span class="versionmodified deprecated">Deprecated since version 1.0: </span>"""
+ """THIS IS THE <em>FIRST</em> PARAGRAPH OF DEPRECATED.</p>\n"""
+ """<p>THIS IS THE <em>SECOND</em> PARAGRAPH OF DEPRECATED.</p>\n""")
+ matched_content = get_content(result, "deprecated")
+ assert expect1 == matched_content
+
+ expect2 = (
+ """<p><span class="versionmodified added">New in version 1.0: </span>"""
+ """THIS IS THE <em>FIRST</em> PARAGRAPH OF VERSIONADDED.</p>\n""")
+ matched_content = get_content(result, "versionadded")
+ assert expect2 == matched_content
+
+ expect3 = (
+ """<p><span class="versionmodified changed">Changed in version 1.0: </span>"""
+ """THIS IS THE <em>FIRST</em> PARAGRAPH OF VERSIONCHANGED.</p>\n""")
+ matched_content = get_content(result, "versionchanged")
+ assert expect3 == matched_content
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_docfields(app):
+ app.build()
+ # --- docfields
+ # expect no error by build
+ (app.outdir / 'docfields.html').read_text(encoding='utf8')
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_template(app):
+ app.build()
+ # --- gettext template
+ result = (app.outdir / 'contents.html').read_text(encoding='utf8')
+ assert "WELCOME" in result
+ assert "SPHINX 2013.120" in result
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_html_rebuild_mo(app):
+ app.build()
+ # --- rebuild by .mo mtime
+ app.builder.build_update()
+ app.env.find_files(app.config, app.builder)
+ _, updated, _ = app.env.get_outdated_files(config_changed=False)
+ assert len(updated) == 0
+
+ mtime = (app.srcdir / 'xx' / 'LC_MESSAGES' / 'bom.mo').stat().st_mtime
+ os.utime(app.srcdir / 'xx' / 'LC_MESSAGES' / 'bom.mo', (mtime + 5, mtime + 5))
+ app.env.find_files(app.config, app.builder)
+ _, updated, _ = app.env.get_outdated_files(config_changed=False)
+ assert len(updated) == 1
+
+
+@sphinx_intl
+@pytest.mark.sphinx('xml')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_xml_footnotes(app, warning):
+ app.build()
+ # --- footnotes: regression test for fix #955, #1176
+ et = etree_parse(app.outdir / 'footnote.xml')
+ secs = et.findall('section')
+
+ para0 = secs[0].findall('paragraph')
+ assert_elem(
+ para0[0],
+ ['I18N WITH FOOTNOTE', 'INCLUDE THIS CONTENTS',
+ '2', '[ref]', '1', '100', '*', '. SECOND FOOTNOTE_REF', '100', '.'],
+ ['i18n-with-footnote', 'ref'])
+
+ # check node_id for footnote_references which refer same footnote (refs: #3002)
+ assert para0[0][4].text == para0[0][6].text == '100'
+ assert para0[0][4].attrib['ids'] != para0[0][6].attrib['ids']
+
+ footnote0 = secs[0].findall('footnote')
+ assert_elem(
+ footnote0[0],
+ ['1', 'THIS IS A AUTO NUMBERED FOOTNOTE.'],
+ None,
+ ['1'])
+ assert_elem(
+ footnote0[1],
+ ['100', 'THIS IS A NUMBERED FOOTNOTE.'],
+ None,
+ ['100'])
+ assert_elem(
+ footnote0[2],
+ ['2', 'THIS IS A AUTO NUMBERED NAMED FOOTNOTE.'],
+ None,
+ ['named'])
+ assert_elem(
+ footnote0[3],
+ ['*', 'THIS IS A AUTO SYMBOL FOOTNOTE.'],
+ None,
+ None)
+
+ citation0 = secs[0].findall('citation')
+ assert_elem(
+ citation0[0],
+ ['ref', 'THIS IS A NAMED FOOTNOTE.'],
+ None,
+ ['ref'])
+
+ warnings = getwarning(warning)
+ warning_expr = '.*/footnote.xml:\\d*: SEVERE: Duplicate ID: ".*".\n'
+ assert not re.search(warning_expr, warnings), f'{warning_expr!r} did match {warnings!r}'
+
+
+@sphinx_intl
+@pytest.mark.sphinx('xml')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_xml_footnote_backlinks(app):
+ app.build()
+ # --- footnote backlinks: i18n test for #1058
+ et = etree_parse(app.outdir / 'footnote.xml')
+ secs = et.findall('section')
+
+ para0 = secs[0].findall('paragraph')
+ refs0 = para0[0].findall('footnote_reference')
+ refid2id = {r.attrib.get('refid'): r.attrib.get('ids') for r in refs0}
+
+ footnote0 = secs[0].findall('footnote')
+ for footnote in footnote0:
+ ids = footnote.attrib.get('ids')
+ backrefs = footnote.attrib.get('backrefs').split()
+ assert refid2id[ids] in backrefs
+
+
+@sphinx_intl
+@pytest.mark.sphinx('xml')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_xml_refs_in_python_domain(app):
+ app.build()
+ # --- refs in the Python domain
+ et = etree_parse(app.outdir / 'refs_python_domain.xml')
+ secs = et.findall('section')
+
+ # regression test for fix #1363
+ para0 = secs[0].findall('paragraph')
+ assert_elem(
+ para0[0],
+ ['SEE THIS DECORATOR:', 'sensitive_variables()', '.'],
+ ['sensitive.sensitive_variables'])
+
+
+@sphinx_intl
+@pytest.mark.sphinx('xml')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_xml_keep_external_links(app):
+ app.build()
+ # --- keep external links: regression test for #1044
+ et = etree_parse(app.outdir / 'external_links.xml')
+ secs = et.findall('section')
+
+ para0 = secs[0].findall('paragraph')
+ # external link check
+ assert_elem(
+ para0[0],
+ ['EXTERNAL LINK TO', 'Python', '.'],
+ ['http://python.org/index.html'])
+
+ # internal link check
+ assert_elem(
+ para0[1],
+ ['EXTERNAL LINKS', 'IS INTERNAL LINK.'],
+ ['i18n-with-external-links'])
+
+ # inline link check
+ assert_elem(
+ para0[2],
+ ['INLINE LINK BY', 'THE SPHINX SITE', '.'],
+ ['http://sphinx-doc.org'])
+
+ # unnamed link check
+ assert_elem(
+ para0[3],
+ ['UNNAMED', 'LINK', '.'],
+ ['http://google.com'])
+
+ # link target swapped translation
+ para1 = secs[1].findall('paragraph')
+ assert_elem(
+ para1[0],
+ ['LINK TO', 'external2', 'AND', 'external1', '.'],
+ ['https://www.google.com/external2',
+ 'https://www.google.com/external1'])
+ assert_elem(
+ para1[1],
+ ['LINK TO', 'THE PYTHON SITE', 'AND', 'THE SPHINX SITE', '.'],
+ ['http://python.org', 'http://sphinx-doc.org'])
+
+ # multiple references in the same line
+ para2 = secs[2].findall('paragraph')
+ assert_elem(
+ para2[0],
+ ['LINK TO', 'EXTERNAL LINKS', ',', 'Python', ',',
+ 'THE SPHINX SITE', ',', 'UNNAMED', 'AND',
+ 'THE PYTHON SITE', '.'],
+ ['i18n-with-external-links', 'http://python.org/index.html',
+ 'http://sphinx-doc.org', 'http://google.com',
+ 'http://python.org'])
+
+
+@sphinx_intl
+@pytest.mark.sphinx('xml')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_xml_role_xref(app):
+ app.build()
+ # --- role xref: regression test for #1090, #1193
+ et = etree_parse(app.outdir / 'role_xref.xml')
+ sec1, sec2 = et.findall('section')
+
+ para1, = sec1.findall('paragraph')
+ assert_elem(
+ para1,
+ ['LINK TO', "I18N ROCK'N ROLE XREF", ',', 'CONTENTS', ',',
+ 'SOME NEW TERM', '.'],
+ ['i18n-role-xref', 'index',
+ 'glossary_terms#term-Some-term'])
+
+ para2 = sec2.findall('paragraph')
+ assert_elem(
+ para2[0],
+ ['LINK TO', 'SOME OTHER NEW TERM', 'AND', 'SOME NEW TERM', '.'],
+ ['glossary_terms#term-Some-other-term',
+ 'glossary_terms#term-Some-term'])
+ assert_elem(
+ para2[1],
+ ['LINK TO', 'LABEL', 'AND',
+ 'SAME TYPE LINKS', 'AND', 'SAME TYPE LINKS', '.'],
+ ['i18n-role-xref', 'same-type-links', 'same-type-links'])
+ assert_elem(
+ para2[2],
+ ['LINK TO', 'I18N WITH GLOSSARY TERMS', 'AND', 'CONTENTS', '.'],
+ ['glossary_terms', 'index'])
+ assert_elem(
+ para2[3],
+ ['LINK TO', '--module', 'AND', '-m', '.'],
+ ['cmdoption-module', 'cmdoption-m'])
+ assert_elem(
+ para2[4],
+ ['LINK TO', 'env2', 'AND', 'env1', '.'],
+ ['envvar-env2', 'envvar-env1'])
+ assert_elem(
+ para2[5],
+ ['LINK TO', 'token2', 'AND', 'token1', '.'],
+ []) # TODO: how do I link token role to productionlist?
+ assert_elem(
+ para2[6],
+ ['LINK TO', 'same-type-links', 'AND', "i18n-role-xref", '.'],
+ ['same-type-links', 'i18n-role-xref'])
+
+
+@sphinx_intl
+@pytest.mark.sphinx('xml')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_xml_warnings(app, warning):
+ app.build()
+ # warnings
+ warnings = getwarning(warning)
+ assert 'term not in glossary' not in warnings
+ assert 'undefined label' not in warnings
+ assert 'unknown document' not in warnings
+
+
+@sphinx_intl
+@pytest.mark.sphinx('xml')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_xml_label_targets(app):
+ app.build()
+ # --- label targets: regression test for #1193, #1265
+ et = etree_parse(app.outdir / 'label_target.xml')
+ secs = et.findall('section')
+
+ para0 = secs[0].findall('paragraph')
+ assert_elem(
+ para0[0],
+ ['X SECTION AND LABEL', 'POINT TO', 'implicit-target', 'AND',
+ 'X SECTION AND LABEL', 'POINT TO', 'section-and-label', '.'],
+ ['implicit-target', 'section-and-label'])
+
+ para1 = secs[1].findall('paragraph')
+ assert_elem(
+ para1[0],
+ ['X EXPLICIT-TARGET', 'POINT TO', 'explicit-target', 'AND',
+ 'X EXPLICIT-TARGET', 'POINT TO DUPLICATED ID LIKE', 'id1',
+ '.'],
+ ['explicit-target', 'id1'])
+
+ para2 = secs[2].findall('paragraph')
+ assert_elem(
+ para2[0],
+ ['X IMPLICIT SECTION NAME', 'POINT TO',
+ 'implicit-section-name', '.'],
+ ['implicit-section-name'])
+
+ sec2 = secs[2].findall('section')
+
+ para2_0 = sec2[0].findall('paragraph')
+ assert_elem(
+ para2_0[0],
+ ['`X DUPLICATED SUB SECTION`_', 'IS BROKEN LINK.'],
+ [])
+
+ para3 = secs[3].findall('paragraph')
+ assert_elem(
+ para3[0],
+ ['X', 'bridge label',
+ 'IS NOT TRANSLATABLE BUT LINKED TO TRANSLATED ' +
+ 'SECTION TITLE.'],
+ ['label-bridged-target-section'])
+ assert_elem(
+ para3[1],
+ ['X', 'bridge label', 'POINT TO',
+ 'LABEL BRIDGED TARGET SECTION', 'AND', 'bridge label2',
+ 'POINT TO', 'SECTION AND LABEL', '. THE SECOND APPEARED',
+ 'bridge label2', 'POINT TO CORRECT TARGET.'],
+ ['label-bridged-target-section',
+ 'section-and-label',
+ 'section-and-label'])
+
+
+@sphinx_intl
+@pytest.mark.sphinx('html')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_additional_targets_should_not_be_translated(app):
+ app.build()
+ # [literalblock.txt]
+ result = (app.outdir / 'literalblock.html').read_text(encoding='utf8')
+
+ # title should be translated
+ expected_expr = 'CODE-BLOCKS'
+ assert_count(expected_expr, result, 2)
+
+ # ruby code block should not be translated but be highlighted
+ expected_expr = """<span class="s1">&#39;result&#39;</span>"""
+ assert_count(expected_expr, result, 1)
+
+ # C code block without lang should not be translated and *ruby* highlighted
+ expected_expr = """<span class="c1">#include &lt;stdlib.h&gt;</span>"""
+ assert_count(expected_expr, result, 1)
+
+ # C code block with lang should not be translated but be *C* highlighted
+ expected_expr = ("""<span class="cp">#include</span>"""
+ """<span class="w"> </span>"""
+ """<span class="cpf">&lt;stdio.h&gt;</span>""")
+ assert_count(expected_expr, result, 1)
+
+ # literal block in list item should not be translated
+ expected_expr = ("""<span class="n">literal</span>"""
+ """<span class="o">-</span>"""
+ """<span class="n">block</span>\n"""
+ """<span class="k">in</span>"""
+ """<span class="w"> </span>"""
+ """<span class="n">list</span>""")
+ assert_count(expected_expr, result, 1)
+
+ # doctest block should not be translated but be highlighted
+ expected_expr = (
+ """<span class="gp">&gt;&gt;&gt; </span>"""
+ """<span class="kn">import</span> <span class="nn">sys</span> """
+ """<span class="c1"># sys importing</span>""")
+ assert_count(expected_expr, result, 1)
+
+ # [raw.txt]
+
+ result = (app.outdir / 'raw.html').read_text(encoding='utf8')
+
+ # raw block should not be translated
+ expected_expr = """<iframe src="http://sphinx-doc.org"></iframe></section>"""
+ assert_count(expected_expr, result, 1)
+
+ # [figure.txt]
+
+ result = (app.outdir / 'figure.html').read_text(encoding='utf8')
+
+ # src for image block should not be translated (alt is translated)
+ expected_expr = """<img alt="I18N -&gt; IMG" src="_images/i18n.png" />"""
+ assert_count(expected_expr, result, 1)
+
+ # src for figure block should not be translated (alt is translated)
+ expected_expr = """<img alt="IMG -&gt; I18N" src="_images/img.png" />"""
+ assert_count(expected_expr, result, 1)
+
+
+@sphinx_intl
+@pytest.mark.sphinx(
+ 'html',
+ srcdir='test_additional_targets_should_be_translated',
+ confoverrides={
+ 'language': 'xx', 'locale_dirs': ['.'],
+ 'gettext_compact': False,
+ 'gettext_additional_targets': [
+ 'index',
+ 'literal-block',
+ 'doctest-block',
+ 'raw',
+ 'image',
+ ],
+ },
+)
+def test_additional_targets_should_be_translated(app):
+ app.build()
+ # [literalblock.txt]
+ result = (app.outdir / 'literalblock.html').read_text(encoding='utf8')
+
+ # title should be translated
+ expected_expr = 'CODE-BLOCKS'
+ assert_count(expected_expr, result, 2)
+
+ # ruby code block should be translated and be highlighted
+ expected_expr = """<span class="s1">&#39;RESULT&#39;</span>"""
+ assert_count(expected_expr, result, 1)
+
+ # C code block without lang should be translated and *ruby* highlighted
+ expected_expr = """<span class="c1">#include &lt;STDLIB.H&gt;</span>"""
+ assert_count(expected_expr, result, 1)
+
+ # C code block with lang should be translated and be *C* highlighted
+ expected_expr = ("""<span class="cp">#include</span>"""
+ """<span class="w"> </span>"""
+ """<span class="cpf">&lt;STDIO.H&gt;</span>""")
+ assert_count(expected_expr, result, 1)
+
+ # literal block in list item should be translated
+ expected_expr = ("""<span class="no">LITERAL</span>"""
+ """<span class="o">-</span>"""
+ """<span class="no">BLOCK</span>\n"""
+ """<span class="no">IN</span>"""
+ """<span class="w"> </span>"""
+ """<span class="no">LIST</span>""")
+ assert_count(expected_expr, result, 1)
+
+ # doctest block should not be translated but be highlighted
+ expected_expr = (
+ """<span class="gp">&gt;&gt;&gt; </span>"""
+ """<span class="kn">import</span> <span class="nn">sys</span> """
+ """<span class="c1"># SYS IMPORTING</span>""")
+ assert_count(expected_expr, result, 1)
+
+ # '#noqa' should remain in literal blocks.
+ assert_count("#noqa", result, 1)
+
+ # [raw.txt]
+
+ result = (app.outdir / 'raw.html').read_text(encoding='utf8')
+
+ # raw block should be translated
+ expected_expr = """<iframe src="HTTP://SPHINX-DOC.ORG"></iframe></section>"""
+ assert_count(expected_expr, result, 1)
+
+ # [figure.txt]
+
+ result = (app.outdir / 'figure.html').read_text(encoding='utf8')
+
+ # alt and src for image block should be translated
+ expected_expr = """<img alt="I18N -&gt; IMG" src="_images/img.png" />"""
+ assert_count(expected_expr, result, 1)
+
+ # alt and src for figure block should be translated
+ expected_expr = """<img alt="IMG -&gt; I18N" src="_images/i18n.png" />"""
+ assert_count(expected_expr, result, 1)
+
+
+@pytest.mark.sphinx(
+ 'html',
+ testroot='intl_substitution_definitions',
+ confoverrides={
+ 'language': 'xx', 'locale_dirs': ['.'],
+ 'gettext_compact': False,
+ 'gettext_additional_targets': [
+ 'index',
+ 'literal-block',
+ 'doctest-block',
+ 'raw',
+ 'image',
+ ],
+ },
+)
+def test_additional_targets_should_be_translated_substitution_definitions(app):
+ app.builder.build_all()
+
+ # [prolog_epilog_substitution.txt]
+
+ result = (app.outdir / 'prolog_epilog_substitution.html').read_text(encoding='utf8')
+
+ # alt and src for image block should be translated
+ expected_expr = """<img alt="SUBST_PROLOG_2 TRANSLATED" src="_images/i18n.png" />"""
+ assert_count(expected_expr, result, 1)
+
+ # alt and src for image block should be translated
+ expected_expr = """<img alt="SUBST_EPILOG_2 TRANSLATED" src="_images/img.png" />"""
+ assert_count(expected_expr, result, 1)
+
+
+@sphinx_intl
+@pytest.mark.sphinx('text')
+@pytest.mark.test_params(shared_result='test_intl_basic')
+def test_text_references(app, warning):
+ app.builder.build_specific([app.srcdir / 'refs.txt'])
+
+ warnings = warning.getvalue().replace(os.sep, '/')
+ warning_expr = 'refs.txt:\\d+: ERROR: Unknown target name:'
+ assert_count(warning_expr, warnings, 0)
+
+
+@pytest.mark.sphinx(
+ 'text',
+ testroot='intl_substitution_definitions',
+ confoverrides={
+ 'language': 'xx', 'locale_dirs': ['.'],
+ 'gettext_compact': False,
+ },
+)
+def test_text_prolog_epilog_substitution(app):
+ app.build()
+
+ result = (app.outdir / 'prolog_epilog_substitution.txt').read_text(encoding='utf8')
+
+ assert result == """\
+1. I18N WITH PROLOGUE AND EPILOGUE SUBSTITUTIONS
+************************************************
+
+THIS IS CONTENT THAT CONTAINS prologue substitute text.
+
+SUBSTITUTED IMAGE [image: SUBST_PROLOG_2 TRANSLATED][image] HERE.
+
+THIS IS CONTENT THAT CONTAINS epilogue substitute text.
+
+SUBSTITUTED IMAGE [image: SUBST_EPILOG_2 TRANSLATED][image] HERE.
+"""
+
+
+@pytest.mark.sphinx(
+ 'dummy', testroot='images',
+ srcdir='test_intl_images',
+ confoverrides={'language': 'xx'},
+)
+def test_image_glob_intl(app):
+ app.build()
+
+ # index.rst
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0][1], nodes.image, uri='rimg.xx.png',
+ candidates={'*': 'rimg.xx.png'})
+
+ assert isinstance(doctree[0][2], nodes.figure)
+ assert_node(doctree[0][2][0], nodes.image, uri='rimg.xx.png',
+ candidates={'*': 'rimg.xx.png'})
+
+ assert_node(doctree[0][3], nodes.image, uri='img.*',
+ candidates={'application/pdf': 'img.pdf',
+ 'image/gif': 'img.gif',
+ 'image/png': 'img.png'})
+
+ assert isinstance(doctree[0][4], nodes.figure)
+ assert_node(doctree[0][4][0], nodes.image, uri='img.*',
+ candidates={'application/pdf': 'img.pdf',
+ 'image/gif': 'img.gif',
+ 'image/png': 'img.png'})
+
+ # subdir/index.rst
+ doctree = app.env.get_doctree('subdir/index')
+ assert_node(doctree[0][1], nodes.image, uri='subdir/rimg.xx.png',
+ candidates={'*': 'subdir/rimg.xx.png'})
+
+ assert_node(doctree[0][2], nodes.image, uri='subdir/svgimg.*',
+ candidates={'application/pdf': 'subdir/svgimg.pdf',
+ 'image/svg+xml': 'subdir/svgimg.xx.svg'})
+
+ assert isinstance(doctree[0][3], nodes.figure)
+ assert_node(doctree[0][3][0], nodes.image, uri='subdir/svgimg.*',
+ candidates={'application/pdf': 'subdir/svgimg.pdf',
+ 'image/svg+xml': 'subdir/svgimg.xx.svg'})
+
+
+@pytest.mark.sphinx(
+ 'dummy', testroot='images',
+ srcdir='test_intl_images',
+ confoverrides={
+ 'language': 'xx',
+ 'figure_language_filename': '{root}{ext}.{language}',
+ },
+)
+def test_image_glob_intl_using_figure_language_filename(app):
+ app.build()
+
+ # index.rst
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0][1], nodes.image, uri='rimg.png.xx',
+ candidates={'*': 'rimg.png.xx'})
+
+ assert isinstance(doctree[0][2], nodes.figure)
+ assert_node(doctree[0][2][0], nodes.image, uri='rimg.png.xx',
+ candidates={'*': 'rimg.png.xx'})
+
+ assert_node(doctree[0][3], nodes.image, uri='img.*',
+ candidates={'application/pdf': 'img.pdf',
+ 'image/gif': 'img.gif',
+ 'image/png': 'img.png'})
+
+ assert isinstance(doctree[0][4], nodes.figure)
+ assert_node(doctree[0][4][0], nodes.image, uri='img.*',
+ candidates={'application/pdf': 'img.pdf',
+ 'image/gif': 'img.gif',
+ 'image/png': 'img.png'})
+
+ # subdir/index.rst
+ doctree = app.env.get_doctree('subdir/index')
+ assert_node(doctree[0][1], nodes.image, uri='subdir/rimg.png',
+ candidates={'*': 'subdir/rimg.png'})
+
+ assert_node(doctree[0][2], nodes.image, uri='subdir/svgimg.*',
+ candidates={'application/pdf': 'subdir/svgimg.pdf',
+ 'image/svg+xml': 'subdir/svgimg.svg'})
+
+ assert isinstance(doctree[0][3], nodes.figure)
+ assert_node(doctree[0][3][0], nodes.image, uri='subdir/svgimg.*',
+ candidates={'application/pdf': 'subdir/svgimg.pdf',
+ 'image/svg+xml': 'subdir/svgimg.svg'})
+
+
+def getwarning(warnings):
+ return strip_escseq(warnings.getvalue().replace(os.sep, '/'))
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ srcdir='gettext_allow_fuzzy_translations',
+ confoverrides={
+ 'language': 'de',
+ 'gettext_allow_fuzzy_translations': True,
+ })
+def test_gettext_allow_fuzzy_translations(app):
+ locale_dir = app.srcdir / 'locales' / 'de' / 'LC_MESSAGES'
+ locale_dir.mkdir(parents=True, exist_ok=True)
+ with (locale_dir / 'index.po').open('wb') as f:
+ catalog = Catalog()
+ catalog.add('features', 'FEATURES', flags=('fuzzy',))
+ pofile.write_po(f, catalog)
+
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert 'FEATURES' in content
+
+
+@pytest.mark.sphinx('html', testroot='basic',
+ srcdir='gettext_disallow_fuzzy_translations',
+ confoverrides={
+ 'language': 'de',
+ 'gettext_allow_fuzzy_translations': False,
+ })
+def test_gettext_disallow_fuzzy_translations(app):
+ locale_dir = app.srcdir / 'locales' / 'de' / 'LC_MESSAGES'
+ locale_dir.mkdir(parents=True, exist_ok=True)
+ with (locale_dir / 'index.po').open('wb') as f:
+ catalog = Catalog()
+ catalog.add('features', 'FEATURES', flags=('fuzzy',))
+ pofile.write_po(f, catalog)
+
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert 'FEATURES' not in content
+
+
+@pytest.mark.sphinx('html', testroot='basic', confoverrides={'language': 'de'})
+def test_customize_system_message(make_app, app_params, sphinx_test_tempdir):
+ try:
+ # clear translators cache
+ locale.translators.clear()
+
+ # prepare message catalog (.po)
+ locale_dir = sphinx_test_tempdir / 'basic' / 'locales' / 'de' / 'LC_MESSAGES'
+ locale_dir.mkdir(parents=True, exist_ok=True)
+ with (locale_dir / 'sphinx.po').open('wb') as f:
+ catalog = Catalog()
+ catalog.add('Quick search', 'QUICK SEARCH')
+ pofile.write_po(f, catalog)
+
+ # construct application and convert po file to .mo
+ args, kwargs = app_params
+ app = make_app(*args, **kwargs)
+ assert (locale_dir / 'sphinx.mo').exists()
+ assert app.translator.gettext('Quick search') == 'QUICK SEARCH'
+
+ app.build()
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert 'QUICK SEARCH' in content
+ finally:
+ locale.translators.clear()
+
+
+@pytest.mark.sphinx('html', testroot='intl', confoverrides={'today_fmt': '%Y-%m-%d'})
+def test_customize_today_date_format(app, monkeypatch):
+ with monkeypatch.context() as m:
+ m.setenv('SOURCE_DATE_EPOCH', '1439131307')
+ app.build()
+ content = (app.outdir / 'refs.html').read_text(encoding='utf8')
+
+ assert '2015-08-09' in content
diff --git a/tests/test_locale.py b/tests/test_locale.py
new file mode 100644
index 0000000..11dd95d
--- /dev/null
+++ b/tests/test_locale.py
@@ -0,0 +1,76 @@
+"""Test locale."""
+
+import pytest
+
+from sphinx import locale
+
+
+@pytest.fixture(autouse=True)
+def _cleanup_translations():
+ yield
+ locale.translators.clear()
+
+
+def test_init(rootdir):
+ # not initialized yet
+ _ = locale.get_translation('myext')
+ assert _('Hello world') == 'Hello world'
+ assert _('Hello sphinx') == 'Hello sphinx'
+ assert _('Hello reST') == 'Hello reST'
+
+ # load locale1
+ locale.init([rootdir / 'test-locale' / 'locale1'], 'en', 'myext')
+ _ = locale.get_translation('myext')
+ assert _('Hello world') == 'HELLO WORLD'
+ assert _('Hello sphinx') == 'Hello sphinx'
+ assert _('Hello reST') == 'Hello reST'
+
+ # load a catalog to unrelated namespace
+ locale.init([rootdir / 'test-locale' / 'locale2'], 'en', 'myext', 'mynamespace')
+ _ = locale.get_translation('myext')
+ assert _('Hello world') == 'HELLO WORLD'
+ assert _('Hello sphinx') == 'Hello sphinx' # nothing changed here
+ assert _('Hello reST') == 'Hello reST'
+
+ # load locale2 in addition
+ locale.init([rootdir / 'test-locale' / 'locale2'], 'en', 'myext')
+ _ = locale.get_translation('myext')
+ assert _('Hello world') == 'HELLO WORLD'
+ assert _('Hello sphinx') == 'HELLO SPHINX'
+ assert _('Hello reST') == 'Hello reST'
+
+
+def test_init_with_unknown_language(rootdir):
+ locale.init([rootdir / 'test-locale' / 'locale1'], 'unknown', 'myext')
+ _ = locale.get_translation('myext')
+ assert _('Hello world') == 'Hello world'
+ assert _('Hello sphinx') == 'Hello sphinx'
+ assert _('Hello reST') == 'Hello reST'
+
+
+def test_add_message_catalog(app, rootdir):
+ app.config.language = 'en'
+ app.add_message_catalog('myext', rootdir / 'test-locale' / 'locale1')
+ _ = locale.get_translation('myext')
+ assert _('Hello world') == 'HELLO WORLD'
+ assert _('Hello sphinx') == 'Hello sphinx'
+ assert _('Hello reST') == 'Hello reST'
+
+
+def _empty_language_translation(rootdir):
+ locale_dirs, catalog = [rootdir / 'test-locale' / 'locale1'], 'myext'
+ locale.translators.clear()
+ locale.init(locale_dirs, language=None, catalog=catalog)
+ return locale.get_translation(catalog)
+
+
+def test_init_environment_language(rootdir, monkeypatch):
+ with monkeypatch.context() as m:
+ m.setenv("LANGUAGE", "en_US:en")
+ _ = _empty_language_translation(rootdir)
+ assert _('Hello world') == 'HELLO WORLD'
+
+ with monkeypatch.context() as m:
+ m.setenv("LANGUAGE", "et_EE:et")
+ _ = _empty_language_translation(rootdir)
+ assert _('Hello world') == 'Tere maailm'
diff --git a/tests/test_markup.py b/tests/test_markup.py
new file mode 100644
index 0000000..0d877b3
--- /dev/null
+++ b/tests/test_markup.py
@@ -0,0 +1,619 @@
+"""Test various Sphinx-specific markup extensions."""
+
+import re
+import warnings
+from types import SimpleNamespace
+
+import pytest
+from docutils import frontend, nodes, utils
+from docutils.parsers.rst import Parser as RstParser
+
+from sphinx import addnodes
+from sphinx.builders.html.transforms import KeyboardTransform
+from sphinx.builders.latex import LaTeXBuilder
+from sphinx.environment import default_settings
+from sphinx.roles import XRefRole
+from sphinx.testing.util import assert_node
+from sphinx.transforms import SphinxSmartQuotes
+from sphinx.util import texescape
+from sphinx.util.docutils import sphinx_domains
+from sphinx.writers.html import HTML5Translator, HTMLWriter
+from sphinx.writers.latex import LaTeXTranslator, LaTeXWriter
+
+
+@pytest.fixture()
+def settings(app):
+ texescape.init() # otherwise done by the latex builder
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ # DeprecationWarning: The frontend.OptionParser class will be replaced
+ # by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
+ optparser = frontend.OptionParser(
+ components=(RstParser, HTMLWriter, LaTeXWriter),
+ defaults=default_settings)
+ settings = optparser.get_default_values()
+ settings.smart_quotes = True
+ settings.env = app.builder.env
+ settings.env.temp_data['docname'] = 'dummy'
+ settings.contentsname = 'dummy'
+ domain_context = sphinx_domains(settings.env)
+ domain_context.enable()
+ yield settings
+ domain_context.disable()
+
+
+@pytest.fixture()
+def new_document(settings):
+ def create():
+ document = utils.new_document('test data', settings)
+ document['file'] = 'dummy'
+ return document
+
+ return create
+
+
+@pytest.fixture()
+def inliner(new_document):
+ document = new_document()
+ document.reporter.get_source_and_line = lambda line=1: ('dummy.rst', line)
+ return SimpleNamespace(document=document, reporter=document.reporter)
+
+
+@pytest.fixture()
+def parse(new_document):
+ def parse_(rst):
+ document = new_document()
+ parser = RstParser()
+ parser.parse(rst, document)
+ SphinxSmartQuotes(document, startnode=None).apply()
+ for msg in list(document.findall(nodes.system_message)):
+ if msg['level'] == 1:
+ msg.replace_self([])
+ return document
+ return parse_
+
+
+# since we're not resolving the markup afterwards, these nodes may remain
+class ForgivingTranslator:
+ def visit_pending_xref(self, node):
+ pass
+
+ def depart_pending_xref(self, node):
+ pass
+
+
+class ForgivingHTMLTranslator(HTML5Translator, ForgivingTranslator):
+ pass
+
+
+class ForgivingLaTeXTranslator(LaTeXTranslator, ForgivingTranslator):
+ pass
+
+
+@pytest.fixture()
+def verify_re_html(app, parse):
+ def verify(rst, html_expected):
+ document = parse(rst)
+ KeyboardTransform(document).apply()
+ html_translator = ForgivingHTMLTranslator(document, app.builder)
+ document.walkabout(html_translator)
+ html_translated = ''.join(html_translator.fragment).strip()
+ assert re.match(html_expected, html_translated), 'from ' + rst
+ return verify
+
+
+@pytest.fixture()
+def verify_re_latex(app, parse):
+ def verify(rst, latex_expected):
+ document = parse(rst)
+ app.builder = LaTeXBuilder(app, app.env)
+ app.builder.init()
+ theme = app.builder.themes.get('manual')
+ latex_translator = ForgivingLaTeXTranslator(document, app.builder, theme)
+ latex_translator.first_document = -1 # don't write \begin{document}
+ document.walkabout(latex_translator)
+ latex_translated = ''.join(latex_translator.body).strip()
+ assert re.match(latex_expected, latex_translated), 'from ' + repr(rst)
+ return verify
+
+
+@pytest.fixture()
+def verify_re(verify_re_html, verify_re_latex):
+ def verify_re_(rst, html_expected, latex_expected):
+ if html_expected:
+ verify_re_html(rst, html_expected)
+ if latex_expected:
+ verify_re_latex(rst, latex_expected)
+ return verify_re_
+
+
+@pytest.fixture()
+def verify(verify_re_html, verify_re_latex):
+ def verify_(rst, html_expected, latex_expected):
+ if html_expected:
+ verify_re_html(rst, re.escape(html_expected) + '$')
+ if latex_expected:
+ verify_re_latex(rst, re.escape(latex_expected) + '$')
+ return verify_
+
+
+@pytest.fixture()
+def get_verifier(verify, verify_re):
+ v = {
+ 'verify': verify,
+ 'verify_re': verify_re,
+ }
+
+ def get(name):
+ return v[name]
+ return get
+
+
+@pytest.mark.parametrize(('type', 'rst', 'html_expected', 'latex_expected'), [
+ (
+ # pep role
+ 'verify',
+ ':pep:`8`',
+ ('<p><span class="target" id="index-0"></span><a class="pep reference external" '
+ 'href="https://peps.python.org/pep-0008/"><strong>PEP 8</strong></a></p>'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Python Enhancement Proposals@\\spxentry{Python Enhancement Proposals}'
+ '!PEP 8@\\spxentry{PEP 8}}\\sphinxhref{https://peps.python.org/pep-0008/}'
+ '{\\sphinxstylestrong{PEP 8}}'),
+ ),
+ (
+ # pep role with anchor
+ 'verify',
+ ':pep:`8#id1`',
+ ('<p><span class="target" id="index-0"></span><a class="pep reference external" '
+ 'href="https://peps.python.org/pep-0008/#id1">'
+ '<strong>PEP 8#id1</strong></a></p>'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{Python Enhancement Proposals@\\spxentry{Python Enhancement Proposals}'
+ '!PEP 8\\#id1@\\spxentry{PEP 8\\#id1}}\\sphinxhref'
+ '{https://peps.python.org/pep-0008/\\#id1}'
+ '{\\sphinxstylestrong{PEP 8\\#id1}}'),
+ ),
+ (
+ # rfc role
+ 'verify',
+ ':rfc:`2324`',
+ ('<p><span class="target" id="index-0"></span><a class="rfc reference external" '
+ 'href="https://datatracker.ietf.org/doc/html/rfc2324.html"><strong>RFC 2324</strong></a></p>'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{RFC@\\spxentry{RFC}!RFC 2324@\\spxentry{RFC 2324}}'
+ '\\sphinxhref{https://datatracker.ietf.org/doc/html/rfc2324.html}'
+ '{\\sphinxstylestrong{RFC 2324}}'),
+ ),
+ (
+ # rfc role with anchor
+ 'verify',
+ ':rfc:`2324#id1`',
+ ('<p><span class="target" id="index-0"></span><a class="rfc reference external" '
+ 'href="https://datatracker.ietf.org/doc/html/rfc2324.html#id1">'
+ '<strong>RFC 2324#id1</strong></a></p>'),
+ ('\\sphinxAtStartPar\n'
+ '\\index{RFC@\\spxentry{RFC}!RFC 2324\\#id1@\\spxentry{RFC 2324\\#id1}}'
+ '\\sphinxhref{https://datatracker.ietf.org/doc/html/rfc2324.html\\#id1}'
+ '{\\sphinxstylestrong{RFC 2324\\#id1}}'),
+ ),
+ (
+ # correct interpretation of code with whitespace
+ 'verify_re',
+ '``code sample``',
+ ('<p><code class="(samp )?docutils literal notranslate"><span class="pre">'
+ 'code</span>&#160;&#160; <span class="pre">sample</span></code></p>'),
+ r'\\sphinxAtStartPar\n\\sphinxcode{\\sphinxupquote{code sample}}',
+ ),
+ (
+ # interpolation of arrows in menuselection
+ 'verify',
+ ':menuselection:`a --> b`',
+ ('<p><span class="menuselection">a \N{TRIANGULAR BULLET} b</span></p>'),
+ '\\sphinxAtStartPar\n\\sphinxmenuselection{a \\(\\rightarrow\\) b}',
+ ),
+ (
+ # interpolation of ampersands in menuselection
+ 'verify',
+ ':menuselection:`&Foo -&&- &Bar`',
+ ('<p><span class="menuselection"><span class="accelerator">F</span>oo '
+ '-&amp;- <span class="accelerator">B</span>ar</span></p>'),
+ ('\\sphinxAtStartPar\n'
+ r'\sphinxmenuselection{\sphinxaccelerator{F}oo \sphinxhyphen{}'
+ r'\&\sphinxhyphen{} \sphinxaccelerator{B}ar}'),
+ ),
+ (
+ # interpolation of ampersands in guilabel
+ 'verify',
+ ':guilabel:`&Foo -&&- &Bar`',
+ ('<p><span class="guilabel"><span class="accelerator">F</span>oo '
+ '-&amp;- <span class="accelerator">B</span>ar</span></p>'),
+ ('\\sphinxAtStartPar\n'
+ r'\sphinxguilabel{\sphinxaccelerator{F}oo \sphinxhyphen{}\&\sphinxhyphen{} \sphinxaccelerator{B}ar}'),
+ ),
+ (
+ # no ampersands in guilabel
+ 'verify',
+ ':guilabel:`Foo`',
+ '<p><span class="guilabel">Foo</span></p>',
+ '\\sphinxAtStartPar\n\\sphinxguilabel{Foo}',
+ ),
+ (
+ # kbd role
+ 'verify',
+ ':kbd:`space`',
+ '<p><kbd class="kbd docutils literal notranslate">space</kbd></p>',
+ '\\sphinxAtStartPar\n\\sphinxkeyboard{\\sphinxupquote{space}}',
+ ),
+ (
+ # kbd role
+ 'verify',
+ ':kbd:`Control+X`',
+ ('<p><kbd class="kbd compound docutils literal notranslate">'
+ '<kbd class="kbd docutils literal notranslate">Control</kbd>'
+ '+'
+ '<kbd class="kbd docutils literal notranslate">X</kbd>'
+ '</kbd></p>'),
+ '\\sphinxAtStartPar\n\\sphinxkeyboard{\\sphinxupquote{Control+X}}',
+ ),
+ (
+ # kbd role
+ 'verify',
+ ':kbd:`Alt+^`',
+ ('<p><kbd class="kbd compound docutils literal notranslate">'
+ '<kbd class="kbd docutils literal notranslate">Alt</kbd>'
+ '+'
+ '<kbd class="kbd docutils literal notranslate">^</kbd>'
+ '</kbd></p>'),
+ ('\\sphinxAtStartPar\n'
+ '\\sphinxkeyboard{\\sphinxupquote{Alt+\\textasciicircum{}}}'),
+ ),
+ (
+ # kbd role
+ 'verify',
+ ':kbd:`M-x M-s`',
+ ('<p><kbd class="kbd compound docutils literal notranslate">'
+ '<kbd class="kbd docutils literal notranslate">M</kbd>'
+ '-'
+ '<kbd class="kbd docutils literal notranslate">x</kbd>'
+ ' '
+ '<kbd class="kbd docutils literal notranslate">M</kbd>'
+ '-'
+ '<kbd class="kbd docutils literal notranslate">s</kbd>'
+ '</kbd></p>'),
+ ('\\sphinxAtStartPar\n'
+ '\\sphinxkeyboard{\\sphinxupquote{M\\sphinxhyphen{}x M\\sphinxhyphen{}s}}'),
+ ),
+ (
+ # kbd role
+ 'verify',
+ ':kbd:`-`',
+ '<p><kbd class="kbd docutils literal notranslate">-</kbd></p>',
+ ('\\sphinxAtStartPar\n'
+ '\\sphinxkeyboard{\\sphinxupquote{\\sphinxhyphen{}}}'),
+ ),
+ (
+ # kbd role
+ 'verify',
+ ':kbd:`Caps Lock`',
+ '<p><kbd class="kbd docutils literal notranslate">Caps Lock</kbd></p>',
+ ('\\sphinxAtStartPar\n'
+ '\\sphinxkeyboard{\\sphinxupquote{Caps Lock}}'),
+ ),
+ (
+ # kbd role
+ 'verify',
+ ':kbd:`sys rq`',
+ '<p><kbd class="kbd docutils literal notranslate">sys rq</kbd></p>',
+ ('\\sphinxAtStartPar\n'
+ '\\sphinxkeyboard{\\sphinxupquote{sys rq}}'),
+ ),
+ (
+ # non-interpolation of dashes in option role
+ 'verify_re',
+ ':option:`--with-option`',
+ ('<p><code( class="xref std std-option docutils literal notranslate")?>'
+ '<span class="pre">--with-option</span></code></p>$'),
+ (r'\\sphinxAtStartPar\n'
+ r'\\sphinxcode{\\sphinxupquote{\\sphinxhyphen{}\\sphinxhyphen{}with\\sphinxhyphen{}option}}$'),
+ ),
+ (
+ # verify smarty-pants quotes
+ 'verify',
+ '"John"',
+ '<p>“Johnâ€</p>',
+ "\\sphinxAtStartPar\n“Johnâ€",
+ ),
+ (
+ # ... but not in literal text
+ 'verify',
+ '``"John"``',
+ ('<p><code class="docutils literal notranslate"><span class="pre">'
+ '&quot;John&quot;</span></code></p>'),
+ '\\sphinxAtStartPar\n\\sphinxcode{\\sphinxupquote{"John"}}',
+ ),
+ (
+ # verify classes for inline roles
+ 'verify',
+ ':manpage:`mp(1)`',
+ '<p><em class="manpage">mp(1)</em></p>',
+ '\\sphinxAtStartPar\n\\sphinxstyleliteralemphasis{\\sphinxupquote{mp(1)}}',
+ ),
+ (
+ # correct escaping in normal mode
+ 'verify',
+ 'Γ\\\\∞$',
+ None,
+ '\\sphinxAtStartPar\nΓ\\textbackslash{}\\(\\infty\\)\\$',
+ ),
+ (
+ # in verbatim code fragments
+ 'verify',
+ '::\n\n @Γ\\∞${}',
+ None,
+ ('\\begin{sphinxVerbatim}[commandchars=\\\\\\{\\}]\n'
+ '@Γ\\PYGZbs{}\\(\\infty\\)\\PYGZdl{}\\PYGZob{}\\PYGZcb{}\n'
+ '\\end{sphinxVerbatim}'),
+ ),
+ (
+ # in URIs
+ 'verify_re',
+ '`test <https://www.google.com/~me/>`_',
+ None,
+ r'\\sphinxAtStartPar\n\\sphinxhref{https://www.google.com/~me/}{test}.*',
+ ),
+ (
+ # description list: simple
+ 'verify',
+ 'term\n description',
+ '<dl class="simple">\n<dt>term</dt><dd><p>description</p>\n</dd>\n</dl>',
+ None,
+ ),
+ (
+ # description list: with classifiers
+ 'verify',
+ 'term : class1 : class2\n description',
+ ('<dl class="simple">\n<dt>term<span class="classifier">class1</span>'
+ '<span class="classifier">class2</span></dt><dd><p>description</p>\n</dd>\n</dl>'),
+ None,
+ ),
+ (
+ # glossary (description list): multiple terms
+ 'verify',
+ '.. glossary::\n\n term1\n term2\n description',
+ ('<dl class="simple glossary">\n'
+ '<dt id="term-term1">term1<a class="headerlink" href="#term-term1"'
+ ' title="Link to this term">¶</a></dt>'
+ '<dt id="term-term2">term2<a class="headerlink" href="#term-term2"'
+ ' title="Link to this term">¶</a></dt>'
+ '<dd><p>description</p>\n</dd>\n</dl>'),
+ None,
+ ),
+])
+def test_inline(get_verifier, type, rst, html_expected, latex_expected):
+ verifier = get_verifier(type)
+ verifier(rst, html_expected, latex_expected)
+
+
+@pytest.mark.parametrize(('type', 'rst', 'html_expected', 'latex_expected'), [
+ (
+ 'verify',
+ r'4 backslashes \\\\',
+ r'<p>4 backslashes \\</p>',
+ None,
+ ),
+])
+def test_inline_docutils16(get_verifier, type, rst, html_expected, latex_expected):
+ verifier = get_verifier(type)
+ verifier(rst, html_expected, latex_expected)
+
+
+@pytest.mark.sphinx(confoverrides={'latex_engine': 'xelatex'})
+@pytest.mark.parametrize(('type', 'rst', 'html_expected', 'latex_expected'), [
+ (
+ # in verbatim code fragments
+ 'verify',
+ '::\n\n @Γ\\∞${}',
+ None,
+ ('\\begin{sphinxVerbatim}[commandchars=\\\\\\{\\}]\n'
+ '@Γ\\PYGZbs{}∞\\PYGZdl{}\\PYGZob{}\\PYGZcb{}\n'
+ '\\end{sphinxVerbatim}'),
+ ),
+])
+def test_inline_for_unicode_latex_engine(get_verifier, type, rst,
+ html_expected, latex_expected):
+ verifier = get_verifier(type)
+ verifier(rst, html_expected, latex_expected)
+
+
+def test_samp_role(parse):
+ # no braces
+ text = ':samp:`a{b}c`'
+ doctree = parse(text)
+ assert_node(doctree[0], [nodes.paragraph, nodes.literal, ("a",
+ [nodes.emphasis, "b"],
+ "c")])
+ # nested braces
+ text = ':samp:`a{{b}}c`'
+ doctree = parse(text)
+ assert_node(doctree[0], [nodes.paragraph, nodes.literal, ("a",
+ [nodes.emphasis, "{b"],
+ "}c")])
+
+ # half-opened braces
+ text = ':samp:`a{bc`'
+ doctree = parse(text)
+ assert_node(doctree[0], [nodes.paragraph, nodes.literal, "a{bc"])
+
+ # escaped braces
+ text = ':samp:`a\\\\{b}c`'
+ doctree = parse(text)
+ assert_node(doctree[0], [nodes.paragraph, nodes.literal, "a{b}c"])
+
+ # no braces (whitespaces are keeped as is)
+ text = ':samp:`code sample`'
+ doctree = parse(text)
+ assert_node(doctree[0], [nodes.paragraph, nodes.literal, "code sample"])
+
+
+def test_download_role(parse):
+ # implicit
+ text = ':download:`sphinx.rst`'
+ doctree = parse(text)
+ assert_node(doctree[0], [nodes.paragraph, addnodes.download_reference,
+ nodes.literal, "sphinx.rst"])
+ assert_node(doctree[0][0], refdoc='dummy', refdomain='', reftype='download',
+ refexplicit=False, reftarget='sphinx.rst', refwarn=False)
+ assert_node(doctree[0][0][0], classes=['xref', 'download'])
+
+ # explicit
+ text = ':download:`reftitle <sphinx.rst>`'
+ doctree = parse(text)
+ assert_node(doctree[0], [nodes.paragraph, addnodes.download_reference,
+ nodes.literal, "reftitle"])
+ assert_node(doctree[0][0], refdoc='dummy', refdomain='', reftype='download',
+ refexplicit=True, reftarget='sphinx.rst', refwarn=False)
+ assert_node(doctree[0][0][0], classes=['xref', 'download'])
+
+
+def test_XRefRole(inliner):
+ role = XRefRole()
+
+ # implicit
+ doctrees, errors = role('ref', 'rawtext', 'text', 5, inliner, {}, [])
+ assert len(doctrees) == 1
+ assert_node(doctrees[0], [addnodes.pending_xref, nodes.literal, 'text'])
+ assert_node(doctrees[0], refdoc='dummy', refdomain='', reftype='ref', reftarget='text',
+ refexplicit=False, refwarn=False)
+ assert errors == []
+
+ # explicit
+ doctrees, errors = role('ref', 'rawtext', 'title <target>', 5, inliner, {}, [])
+ assert_node(doctrees[0], [addnodes.pending_xref, nodes.literal, 'title'])
+ assert_node(doctrees[0], refdoc='dummy', refdomain='', reftype='ref', reftarget='target',
+ refexplicit=True, refwarn=False)
+
+ # bang
+ doctrees, errors = role('ref', 'rawtext', '!title <target>', 5, inliner, {}, [])
+ assert_node(doctrees[0], [nodes.literal, 'title <target>'])
+
+ # refdomain
+ doctrees, errors = role('test:doc', 'rawtext', 'text', 5, inliner, {}, [])
+ assert_node(doctrees[0], [addnodes.pending_xref, nodes.literal, 'text'])
+ assert_node(doctrees[0], refdoc='dummy', refdomain='test', reftype='doc', reftarget='text',
+ refexplicit=False, refwarn=False)
+
+ # fix_parens
+ role = XRefRole(fix_parens=True)
+ doctrees, errors = role('ref', 'rawtext', 'text()', 5, inliner, {}, [])
+ assert_node(doctrees[0], [addnodes.pending_xref, nodes.literal, 'text()'])
+ assert_node(doctrees[0], refdoc='dummy', refdomain='', reftype='ref', reftarget='text',
+ refexplicit=False, refwarn=False)
+
+ # lowercase
+ role = XRefRole(lowercase=True)
+ doctrees, errors = role('ref', 'rawtext', 'TEXT', 5, inliner, {}, [])
+ assert_node(doctrees[0], [addnodes.pending_xref, nodes.literal, 'TEXT'])
+ assert_node(doctrees[0], refdoc='dummy', refdomain='', reftype='ref', reftarget='text',
+ refexplicit=False, refwarn=False)
+
+
+@pytest.mark.sphinx('dummy', testroot='prolog')
+def test_rst_prolog(app, status, warning):
+ app.builder.build_all()
+ rst = app.env.get_doctree('restructuredtext')
+ md = app.env.get_doctree('markdown')
+
+ # rst_prolog
+ assert_node(rst[0], nodes.paragraph)
+ assert_node(rst[0][0], nodes.emphasis)
+ assert_node(rst[0][0][0], nodes.Text)
+ assert rst[0][0][0] == 'Hello world'
+
+ # rst_epilog
+ assert_node(rst[-1], nodes.section)
+ assert_node(rst[-1][-1], nodes.paragraph)
+ assert_node(rst[-1][-1][0], nodes.emphasis)
+ assert_node(rst[-1][-1][0][0], nodes.Text)
+ assert rst[-1][-1][0][0] == 'Good-bye world'
+
+ # rst_prolog & rst_epilog on exlucding reST parser
+ assert not md.rawsource.startswith('*Hello world*.')
+ assert not md.rawsource.endswith('*Good-bye world*.\n')
+
+
+@pytest.mark.sphinx('dummy', testroot='keep_warnings')
+def test_keep_warnings_is_True(app, status, warning):
+ app.builder.build_all()
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0], nodes.section)
+ assert len(doctree[0]) == 2
+ assert_node(doctree[0][1], nodes.system_message)
+
+
+@pytest.mark.sphinx('dummy', testroot='keep_warnings',
+ confoverrides={'keep_warnings': False})
+def test_keep_warnings_is_False(app, status, warning):
+ app.builder.build_all()
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0], nodes.section)
+ assert len(doctree[0]) == 1
+
+
+@pytest.mark.sphinx('dummy', testroot='refonly_bullet_list')
+def test_compact_refonly_bullet_list(app, status, warning):
+ app.builder.build_all()
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0], nodes.section)
+ assert len(doctree[0]) == 5
+
+ assert doctree[0][1].astext() == 'List A:'
+ assert_node(doctree[0][2], nodes.bullet_list)
+ assert_node(doctree[0][2][0][0], addnodes.compact_paragraph)
+ assert doctree[0][2][0][0].astext() == 'genindex'
+
+ assert doctree[0][3].astext() == 'List B:'
+ assert_node(doctree[0][4], nodes.bullet_list)
+ assert_node(doctree[0][4][0][0], nodes.paragraph)
+ assert doctree[0][4][0][0].astext() == 'Hello'
+
+
+@pytest.mark.sphinx('dummy', testroot='default_role')
+def test_default_role1(app, status, warning):
+ app.builder.build_all()
+
+ # default-role: pep
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0], nodes.section)
+ assert_node(doctree[0][1], nodes.paragraph)
+ assert_node(doctree[0][1][0], addnodes.index)
+ assert_node(doctree[0][1][1], nodes.target)
+ assert_node(doctree[0][1][2], nodes.reference, classes=["pep"])
+
+ # no default-role
+ doctree = app.env.get_doctree('foo')
+ assert_node(doctree[0], nodes.section)
+ assert_node(doctree[0][1], nodes.paragraph)
+ assert_node(doctree[0][1][0], nodes.title_reference)
+ assert_node(doctree[0][1][1], nodes.Text)
+
+
+@pytest.mark.sphinx('dummy', testroot='default_role',
+ confoverrides={'default_role': 'guilabel'})
+def test_default_role2(app, status, warning):
+ app.builder.build_all()
+
+ # default-role directive is stronger than configratuion
+ doctree = app.env.get_doctree('index')
+ assert_node(doctree[0], nodes.section)
+ assert_node(doctree[0][1], nodes.paragraph)
+ assert_node(doctree[0][1][0], addnodes.index)
+ assert_node(doctree[0][1][1], nodes.target)
+ assert_node(doctree[0][1][2], nodes.reference, classes=["pep"])
+
+ # default_role changes the default behavior
+ doctree = app.env.get_doctree('foo')
+ assert_node(doctree[0], nodes.section)
+ assert_node(doctree[0][1], nodes.paragraph)
+ assert_node(doctree[0][1][0], nodes.inline, classes=["guilabel"])
+ assert_node(doctree[0][1][1], nodes.Text)
diff --git a/tests/test_metadata.py b/tests/test_metadata.py
new file mode 100644
index 0000000..7f31997
--- /dev/null
+++ b/tests/test_metadata.py
@@ -0,0 +1,43 @@
+"""Test our handling of metadata in files with bibliographic metadata."""
+
+# adapted from an example of bibliographic metadata at
+# https://docutils.sourceforge.io/docs/user/rst/demo.txt
+
+import pytest
+
+
+@pytest.mark.sphinx('dummy', testroot='metadata')
+def test_docinfo(app, status, warning):
+ """
+ Inspect the 'docinfo' metadata stored in the first node of the document.
+ Note this doesn't give us access to data stored in subsequence blocks
+ that might be considered document metadata, such as 'abstract' or
+ 'dedication' blocks, or the 'meta' role. Doing otherwise is probably more
+ messing with the internals of sphinx than this rare use case merits.
+ """
+ app.build()
+ expecteddocinfo = {
+ 'author': 'David Goodger',
+ 'authors': ['Me', 'Myself', 'I'],
+ 'address': '123 Example Street\nExample, EX Canada\nA1B 2C3',
+ 'field name': 'This is a generic bibliographic field.',
+ 'field name 2': ('Generic bibliographic fields may contain multiple '
+ 'body elements.\n\nLike this.'),
+ 'status': 'This is a “work in progressâ€',
+ 'version': '1',
+ 'copyright': ('This document has been placed in the public domain. '
+ 'You\nmay do with it as you wish. You may copy, modify,'
+ '\nredistribute, reattribute, sell, buy, rent, lease,\n'
+ 'destroy, or improve it, quote it at length, excerpt,\n'
+ 'incorporate, collate, fold, staple, or mutilate it, or '
+ 'do\nanything else to it that your or anyone else’s '
+ 'heart\ndesires.'),
+ 'contact': 'goodger@python.org',
+ 'date': '2006-05-21',
+ 'organization': 'humankind',
+ 'revision': '4564',
+ 'tocdepth': 1,
+ 'orphan': '',
+ 'nocomments': '',
+ }
+ assert app.env.metadata['index'] == expecteddocinfo
diff --git a/tests/test_parser.py b/tests/test_parser.py
new file mode 100644
index 0000000..86163c6
--- /dev/null
+++ b/tests/test_parser.py
@@ -0,0 +1,57 @@
+"""Tests parsers module."""
+
+from unittest.mock import Mock, patch
+
+import pytest
+
+from sphinx.parsers import RSTParser
+from sphinx.util.docutils import new_document
+
+
+@pytest.mark.sphinx(testroot='basic')
+@patch('docutils.parsers.rst.states.RSTStateMachine')
+def test_RSTParser_prolog_epilog(RSTStateMachine, app):
+ document = new_document('dummy.rst')
+ document.settings = Mock(tab_width=8, language_code='')
+ parser = RSTParser()
+ parser.set_application(app)
+
+ # normal case
+ text = ('hello Sphinx world\n'
+ 'Sphinx is a document generator')
+ parser.parse(text, document)
+ (content, _), _ = RSTStateMachine().run.call_args
+
+ assert list(content.xitems()) == [('dummy.rst', 0, 'hello Sphinx world'),
+ ('dummy.rst', 1, 'Sphinx is a document generator')]
+
+ # with rst_prolog
+ app.env.config.rst_prolog = 'this is rst_prolog\nhello reST!'
+ parser.parse(text, document)
+ (content, _), _ = RSTStateMachine().run.call_args
+ assert list(content.xitems()) == [('<rst_prolog>', 0, 'this is rst_prolog'),
+ ('<rst_prolog>', 1, 'hello reST!'),
+ ('<generated>', 0, ''),
+ ('dummy.rst', 0, 'hello Sphinx world'),
+ ('dummy.rst', 1, 'Sphinx is a document generator')]
+
+ # with rst_epilog
+ app.env.config.rst_prolog = None
+ app.env.config.rst_epilog = 'this is rst_epilog\ngood-bye reST!'
+ parser.parse(text, document)
+ (content, _), _ = RSTStateMachine().run.call_args
+ assert list(content.xitems()) == [('dummy.rst', 0, 'hello Sphinx world'),
+ ('dummy.rst', 1, 'Sphinx is a document generator'),
+ ('dummy.rst', 2, ''),
+ ('<rst_epilog>', 0, 'this is rst_epilog'),
+ ('<rst_epilog>', 1, 'good-bye reST!')]
+
+ # expandtabs / convert whitespaces
+ app.env.config.rst_prolog = None
+ app.env.config.rst_epilog = None
+ text = ('\thello Sphinx world\n'
+ '\v\fSphinx is a document generator')
+ parser.parse(text, document)
+ (content, _), _ = RSTStateMachine().run.call_args
+ assert list(content.xitems()) == [('dummy.rst', 0, ' hello Sphinx world'),
+ ('dummy.rst', 1, ' Sphinx is a document generator')]
diff --git a/tests/test_project.py b/tests/test_project.py
new file mode 100644
index 0000000..45ae7c8
--- /dev/null
+++ b/tests/test_project.py
@@ -0,0 +1,78 @@
+"""Tests project module."""
+
+import pytest
+
+from sphinx.project import Project
+
+DOCNAMES = {'autodoc', 'bom', 'extapi', 'extensions', 'footnote', 'images',
+ 'includes', 'index', 'lists', 'markup', 'math', 'objects',
+ 'subdir/excluded', 'subdir/images', 'subdir/includes'}
+SUBDIR_DOCNAMES = {'subdir/excluded', 'subdir/images', 'subdir/includes'}
+
+
+def test_project_discover_basic(rootdir):
+ # basic case
+ project = Project(rootdir / 'test-root', ['.txt'])
+ assert project.discover() == DOCNAMES
+
+
+def test_project_discover_exclude_patterns(rootdir):
+ project = Project(rootdir / 'test-root', ['.txt'])
+
+ # exclude_paths option
+ assert project.discover(['subdir/*']) == DOCNAMES - SUBDIR_DOCNAMES
+ assert project.discover(['.txt', 'subdir/*']) == DOCNAMES - SUBDIR_DOCNAMES
+
+
+def test_project_discover_multiple_suffixes(rootdir):
+ # multiple source_suffixes
+ project = Project(rootdir / 'test-root', ['.txt', '.foo'])
+ assert project.discover() == DOCNAMES | {'otherext'}
+
+
+def test_project_discover_complicated_suffix(rootdir):
+ # complicated source_suffix
+ project = Project(rootdir / 'test-root', ['.foo.png'])
+ assert project.discover() == {'img'}
+
+
+def test_project_discover_templates_path(rootdir):
+ # templates_path
+ project = Project(rootdir / 'test-root', ['.html'])
+ assert project.discover() == {'_templates/layout',
+ '_templates/customsb',
+ '_templates/contentssb'}
+
+ assert project.discover(['_templates']) == set()
+
+
+def test_project_path2doc(rootdir):
+ project = Project(rootdir / 'test-basic', {'.rst': 'restructuredtext'})
+ assert project.path2doc('index.rst') == 'index'
+ assert project.path2doc('index.foo') is None # unknown extension
+ assert project.path2doc('index.foo.rst') == 'index.foo'
+ assert project.path2doc('index') is None
+ assert project.path2doc('path/to/index.rst') == 'path/to/index'
+ assert project.path2doc(rootdir / 'test-basic' / 'to/index.rst') == 'to/index'
+
+
+@pytest.mark.sphinx(srcdir='project_doc2path', testroot='basic')
+def test_project_doc2path(app):
+ source_suffix = {'.rst': 'restructuredtext', '.txt': 'restructuredtext'}
+
+ project = Project(app.srcdir, source_suffix)
+ project.discover()
+
+ # absolute path
+ assert project.doc2path('index', absolute=True) == str(app.srcdir / 'index.rst')
+
+ # relative path
+ assert project.doc2path('index', absolute=False) == 'index.rst'
+
+ # first source_suffix is used for missing file
+ assert project.doc2path('foo', absolute=False) == 'foo.rst'
+
+ # matched source_suffix is used if exists
+ (app.srcdir / 'bar.txt').touch()
+ project.discover()
+ assert project.doc2path('bar', absolute=False) == 'bar.txt'
diff --git a/tests/test_pycode.py b/tests/test_pycode.py
new file mode 100644
index 0000000..5739787
--- /dev/null
+++ b/tests/test_pycode.py
@@ -0,0 +1,173 @@
+"""Test pycode."""
+
+import os
+import sys
+
+import pytest
+
+import sphinx
+from sphinx.errors import PycodeError
+from sphinx.pycode import ModuleAnalyzer
+
+SPHINX_MODULE_PATH = os.path.splitext(sphinx.__file__)[0] + '.py'
+
+
+def test_ModuleAnalyzer_get_module_source():
+ assert ModuleAnalyzer.get_module_source('sphinx') == (sphinx.__file__, sphinx.__loader__.get_source('sphinx'))
+
+ # failed to obtain source information from builtin modules
+ with pytest.raises(PycodeError):
+ ModuleAnalyzer.get_module_source('builtins')
+ with pytest.raises(PycodeError):
+ ModuleAnalyzer.get_module_source('itertools')
+
+
+def test_ModuleAnalyzer_for_string():
+ analyzer = ModuleAnalyzer.for_string('print("Hello world")', 'module_name')
+ assert analyzer.modname == 'module_name'
+ assert analyzer.srcname == '<string>'
+
+
+def test_ModuleAnalyzer_for_file():
+ analyzer = ModuleAnalyzer.for_string(SPHINX_MODULE_PATH, 'sphinx')
+ assert analyzer.modname == 'sphinx'
+ assert analyzer.srcname == '<string>'
+
+
+def test_ModuleAnalyzer_for_module(rootdir):
+ analyzer = ModuleAnalyzer.for_module('sphinx')
+ assert analyzer.modname == 'sphinx'
+ assert analyzer.srcname in (SPHINX_MODULE_PATH,
+ os.path.abspath(SPHINX_MODULE_PATH))
+
+ path = str(rootdir / 'test-pycode')
+ sys.path.insert(0, path)
+ try:
+ analyzer = ModuleAnalyzer.for_module('cp_1251_coded')
+ docs = analyzer.find_attr_docs()
+ assert docs == {('', 'X'): ['It MUST look like X="\u0425"', '']}
+ finally:
+ sys.path.pop(0)
+
+
+def test_ModuleAnalyzer_find_tags():
+ code = ('class Foo(object):\n' # line: 1
+ ' """class Foo!"""\n'
+ ' def __init__(self):\n'
+ ' pass\n'
+ '\n'
+ ' def bar(self, arg1, arg2=True, *args, **kwargs):\n'
+ ' """method Foo.bar"""\n'
+ ' pass\n'
+ '\n'
+ ' class Baz(object):\n'
+ ' def __init__(self):\n' # line: 11
+ ' pass\n'
+ '\n'
+ 'def qux():\n'
+ ' """function baz"""\n'
+ ' pass\n'
+ '\n'
+ '@decorator1\n'
+ '@decorator2\n'
+ 'def quux():\n'
+ ' pass\n' # line: 21
+ '\n'
+ 'class Corge(object):\n'
+ ' @decorator1\n'
+ ' @decorator2\n'
+ ' def grault(self):\n'
+ ' pass\n')
+ analyzer = ModuleAnalyzer.for_string(code, 'module')
+ tags = analyzer.find_tags()
+ assert set(tags.keys()) == {'Foo', 'Foo.__init__', 'Foo.bar',
+ 'Foo.Baz', 'Foo.Baz.__init__', 'qux', 'quux',
+ 'Corge', 'Corge.grault'}
+ assert tags['Foo'] == ('class', 1, 12) # type, start, end
+ assert tags['Foo.__init__'] == ('def', 3, 4)
+ assert tags['Foo.bar'] == ('def', 6, 8)
+ assert tags['Foo.Baz'] == ('class', 10, 12)
+ assert tags['Foo.Baz.__init__'] == ('def', 11, 12)
+ assert tags['qux'] == ('def', 14, 16)
+ assert tags['quux'] == ('def', 18, 21)
+ assert tags['Corge'] == ('class', 23, 27)
+ assert tags['Corge.grault'] == ('def', 24, 27)
+
+
+def test_ModuleAnalyzer_find_attr_docs():
+ code = ('class Foo(object):\n'
+ ' """class Foo!"""\n'
+ ' #: comment before attr1\n'
+ ' attr1 = None\n'
+ ' attr2 = None # attribute comment for attr2 (without colon)\n'
+ ' attr3 = None #: attribute comment for attr3\n'
+ ' attr4 = None #: long attribute comment\n'
+ ' #: for attr4\n'
+ ' #: comment before attr5\n'
+ ' attr5 = None #: attribute comment for attr5\n'
+ ' attr6, attr7 = 1, 2 #: this comment is ignored\n'
+ '\n'
+ ' def __init__(self):\n'
+ ' self.attr8 = None #: first attribute comment (ignored)\n'
+ ' self.attr8 = None #: attribute comment for attr8\n'
+ ' #: comment before attr9\n'
+ ' self.attr9 = None #: comment after attr9\n'
+ ' "string after attr9"\n'
+ '\n'
+ ' def bar(self, arg1, arg2=True, *args, **kwargs):\n'
+ ' """method Foo.bar"""\n'
+ ' pass\n'
+ '\n'
+ 'def baz():\n'
+ ' """function baz"""\n'
+ ' pass\n'
+ '\n'
+ 'class Qux: attr1 = 1; attr2 = 2')
+ analyzer = ModuleAnalyzer.for_string(code, 'module')
+ docs = analyzer.find_attr_docs()
+ assert set(docs) == {('Foo', 'attr1'),
+ ('Foo', 'attr3'),
+ ('Foo', 'attr4'),
+ ('Foo', 'attr5'),
+ ('Foo', 'attr6'),
+ ('Foo', 'attr7'),
+ ('Foo', 'attr8'),
+ ('Foo', 'attr9')}
+ assert docs[('Foo', 'attr1')] == ['comment before attr1', '']
+ assert docs[('Foo', 'attr3')] == ['attribute comment for attr3', '']
+ assert docs[('Foo', 'attr4')] == ['long attribute comment', '']
+ assert docs[('Foo', 'attr4')] == ['long attribute comment', '']
+ assert docs[('Foo', 'attr5')] == ['attribute comment for attr5', '']
+ assert docs[('Foo', 'attr6')] == ['this comment is ignored', '']
+ assert docs[('Foo', 'attr7')] == ['this comment is ignored', '']
+ assert docs[('Foo', 'attr8')] == ['attribute comment for attr8', '']
+ assert docs[('Foo', 'attr9')] == ['string after attr9', '']
+ assert analyzer.tagorder == {'Foo': 0,
+ 'Foo.__init__': 8,
+ 'Foo.attr1': 1,
+ 'Foo.attr2': 2,
+ 'Foo.attr3': 3,
+ 'Foo.attr4': 4,
+ 'Foo.attr5': 5,
+ 'Foo.attr6': 6,
+ 'Foo.attr7': 7,
+ 'Foo.attr8': 10,
+ 'Foo.attr9': 12,
+ 'Foo.bar': 13,
+ 'baz': 14,
+ 'Qux': 15,
+ 'Qux.attr1': 16,
+ 'Qux.attr2': 17}
+
+
+def test_ModuleAnalyzer_find_attr_docs_for_posonlyargs_method():
+ code = ('class Foo(object):\n'
+ ' def __init__(self, /):\n'
+ ' self.attr = None #: attribute comment\n')
+ analyzer = ModuleAnalyzer.for_string(code, 'module')
+ docs = analyzer.find_attr_docs()
+ assert set(docs) == {('Foo', 'attr')}
+ assert docs[('Foo', 'attr')] == ['attribute comment', '']
+ assert analyzer.tagorder == {'Foo': 0,
+ 'Foo.__init__': 1,
+ 'Foo.attr': 2}
diff --git a/tests/test_pycode_ast.py b/tests/test_pycode_ast.py
new file mode 100644
index 0000000..5efd0cb
--- /dev/null
+++ b/tests/test_pycode_ast.py
@@ -0,0 +1,62 @@
+"""Test pycode.ast"""
+
+import ast
+
+import pytest
+
+from sphinx.pycode.ast import unparse as ast_unparse
+
+
+@pytest.mark.parametrize(('source', 'expected'), [
+ ("a + b", "a + b"), # Add
+ ("a and b", "a and b"), # And
+ ("os.path", "os.path"), # Attribute
+ ("1 * 2", "1 * 2"), # BinOp
+ ("a & b", "a & b"), # BitAnd
+ ("a | b", "a | b"), # BitOr
+ ("a ^ b", "a ^ b"), # BitXor
+ ("a and b and c", "a and b and c"), # BoolOp
+ ("b'bytes'", "b'bytes'"), # Bytes
+ ("object()", "object()"), # Call
+ ("1234", "1234"), # Constant
+ ("{'key1': 'value1', 'key2': 'value2'}",
+ "{'key1': 'value1', 'key2': 'value2'}"), # Dict
+ ("a / b", "a / b"), # Div
+ ("...", "..."), # Ellipsis
+ ("a // b", "a // b"), # FloorDiv
+ ("Tuple[int, int]", "Tuple[int, int]"), # Index, Subscript
+ ("~1", "~1"), # Invert
+ ("lambda x, y: x + y",
+ "lambda x, y: ..."), # Lambda
+ ("[1, 2, 3]", "[1, 2, 3]"), # List
+ ("a << b", "a << b"), # LShift
+ ("a @ b", "a @ b"), # MatMult
+ ("a % b", "a % b"), # Mod
+ ("a * b", "a * b"), # Mult
+ ("sys", "sys"), # Name, NameConstant
+ ("1234", "1234"), # Num
+ ("not a", "not a"), # Not
+ ("a or b", "a or b"), # Or
+ ("a**b", "a**b"), # Pow
+ ("a >> b", "a >> b"), # RShift
+ ("{1, 2, 3}", "{1, 2, 3}"), # Set
+ ("a - b", "a - b"), # Sub
+ ("'str'", "'str'"), # Str
+ ("+a", "+a"), # UAdd
+ ("-1", "-1"), # UnaryOp
+ ("-a", "-a"), # USub
+ ("(1, 2, 3)", "(1, 2, 3)"), # Tuple
+ ("()", "()"), # Tuple (empty)
+ ("(1,)", "(1,)"), # Tuple (single item)
+ ("lambda x=0, /, y=1, *args, z, **kwargs: x + y + z",
+ "lambda x=0, /, y=1, *args, z, **kwargs: ..."), # posonlyargs
+ ("0x1234", "0x1234"), # Constant
+ ("1_000_000", "1_000_000"), # Constant
+])
+def test_unparse(source, expected):
+ module = ast.parse(source)
+ assert ast_unparse(module.body[0].value, source) == expected
+
+
+def test_unparse_None():
+ assert ast_unparse(None) is None
diff --git a/tests/test_pycode_parser.py b/tests/test_pycode_parser.py
new file mode 100644
index 0000000..fde648d
--- /dev/null
+++ b/tests/test_pycode_parser.py
@@ -0,0 +1,511 @@
+"""Test pycode.parser."""
+
+from sphinx.pycode.parser import Parser
+from sphinx.util.inspect import signature_from_str
+
+
+def test_comment_picker_basic():
+ source = ('a = 1 + 1 #: assignment\n'
+ 'b = 1 +\\\n 1 #: assignment including a CR\n'
+ 'c = (1 +\n 1) #: tuple \n'
+ 'd = {1, \n 1} #: set\n'
+ 'e = [1, \n 1] #: list #: additional comment\n'
+ 'f = "abc"\n'
+ '#: string; comment on next line (ignored)\n'
+ 'g = 1.0\n'
+ '"""float; string on next line"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): 'assignment',
+ ('', 'b'): 'assignment including a CR',
+ ('', 'c'): 'tuple ',
+ ('', 'd'): ' set',
+ ('', 'e'): 'list #: additional comment',
+ ('', 'g'): 'float; string on next line'}
+
+
+def test_comment_picker_location():
+ # multiple "before" comments
+ source = ('#: comment before assignment1\n'
+ '#:\n'
+ '#: comment before assignment2\n'
+ 'a = 1 + 1\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): ('comment before assignment1\n'
+ '\n'
+ 'comment before assignment2')}
+
+ # before and after comments
+ source = ('#: comment before assignment\n'
+ 'a = 1 + 1 #: comment after assignment\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): 'comment after assignment'}
+
+ # after comment and next line string
+ source = ('a = 1 + 1\n #: comment after assignment\n'
+ '"""string on next line"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): 'string on next line'}
+
+ # before comment and next line string
+ source = ('#: comment before assignment\n'
+ 'a = 1 + 1\n'
+ '"""string on next line"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): 'string on next line'}
+
+ # before comment, after comment and next line string
+ source = ('#: comment before assignment\n'
+ 'a = 1 + 1 #: comment after assignment\n'
+ '"""string on next line"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): 'string on next line'}
+
+ # inside __init__ method
+ source = ('class Foo(object):\n'
+ ' def __init__(self):\n'
+ ' #: comment before assignment\n'
+ ' self.attr1 = None\n'
+ ' self.attr2 = None #: comment after assignment\n'
+ '\n'
+ ' #: comment for attr3(1)\n'
+ ' self.attr3 = None #: comment for attr3(2)\n'
+ ' """comment for attr3(3)"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('Foo', 'attr1'): 'comment before assignment',
+ ('Foo', 'attr2'): 'comment after assignment',
+ ('Foo', 'attr3'): 'comment for attr3(3)'}
+
+
+def test_annotated_assignment():
+ source = ('a: str = "Sphinx" #: comment\n'
+ 'b: int = 1\n'
+ '"""string on next line"""\n'
+ 'c: int #: comment\n'
+ 'd = 1 # type: int\n'
+ '"""string on next line"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): 'comment',
+ ('', 'b'): 'string on next line',
+ ('', 'c'): 'comment',
+ ('', 'd'): 'string on next line'}
+ assert parser.annotations == {('', 'a'): 'str',
+ ('', 'b'): 'int',
+ ('', 'c'): 'int',
+ ('', 'd'): 'int'}
+ assert parser.definitions == {}
+
+
+def test_complex_assignment():
+ source = ('a = 1 + 1; b = a #: compound statement\n'
+ 'c, d = (1, 1) #: unpack assignment\n'
+ 'e = True #: first assignment\n'
+ 'e = False #: second assignment\n'
+ 'f = g = None #: multiple assignment at once\n'
+ '(theta, phi) = (0, 0.5) #: unpack assignment via tuple\n'
+ '[x, y] = (5, 6) #: unpack assignment via list\n'
+ 'h, *i, j = (1, 2, 3, 4) #: unpack assignment2\n'
+ 'k, *self.attr = (5, 6, 7) #: unpack assignment3\n'
+ 'l, *m[0] = (8, 9, 0) #: unpack assignment4\n'
+ )
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'b'): 'compound statement',
+ ('', 'c'): 'unpack assignment',
+ ('', 'd'): 'unpack assignment',
+ ('', 'e'): 'second assignment',
+ ('', 'f'): 'multiple assignment at once',
+ ('', 'g'): 'multiple assignment at once',
+ ('', 'theta'): 'unpack assignment via tuple',
+ ('', 'phi'): 'unpack assignment via tuple',
+ ('', 'x'): 'unpack assignment via list',
+ ('', 'y'): 'unpack assignment via list',
+ ('', 'h'): 'unpack assignment2',
+ ('', 'i'): 'unpack assignment2',
+ ('', 'j'): 'unpack assignment2',
+ ('', 'k'): 'unpack assignment3',
+ ('', 'l'): 'unpack assignment4',
+ }
+ assert parser.definitions == {}
+
+
+def test_assignment_in_try_clause():
+ source = ('try:\n'
+ ' a = None #: comment\n'
+ 'except:\n'
+ ' b = None #: ignored\n'
+ 'else:\n'
+ ' c = None #: comment\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'a'): 'comment',
+ ('', 'c'): 'comment'}
+ assert parser.deforders == {'a': 0,
+ 'c': 1}
+
+
+def test_obj_assignment():
+ source = ('obj = SomeObject() #: some object\n'
+ 'obj.attr = 1 #: attr1\n'
+ 'obj.attr.attr = 1 #: attr2\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'obj'): 'some object'}
+ assert parser.definitions == {}
+
+
+def test_container_assignment():
+ source = ('l = [] #: list\n'
+ 'l[1] = True #: list assignment\n'
+ 'l[0:0] = [] #: list assignment\n'
+ 'l[_from:_to] = [] #: list assignment\n'
+ 'd = {} #: dict\n'
+ 'd["doc"] = 1 #: dict assignment\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('', 'l'): 'list',
+ ('', 'd'): 'dict'}
+ assert parser.definitions == {}
+
+
+def test_function():
+ source = ('def some_function():\n'
+ ' """docstring"""\n'
+ ' a = 1 + 1 #: comment1\n'
+ '\n'
+ ' b = a #: comment2\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {}
+ assert parser.definitions == {'some_function': ('def', 1, 5)}
+ assert parser.deforders == {'some_function': 0}
+
+
+def test_nested_function():
+ source = ('def some_function():\n'
+ ' a = 1 + 1 #: comment1\n'
+ '\n'
+ ' def inner_function():\n'
+ ' b = 1 + 1 #: comment2\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {}
+ assert parser.definitions == {'some_function': ('def', 1, 5)}
+ assert parser.deforders == {'some_function': 0}
+
+
+def test_class():
+ source = ('class Foo(object):\n'
+ ' attr1 = None #: comment1\n'
+ ' attr2 = None #: comment2\n'
+ '\n'
+ ' def __init__(self):\n'
+ ' self.a = 1 + 1 #: comment3\n'
+ ' self.attr2 = 1 + 1 #: overridden\n'
+ ' b = 1 + 1 #: comment5\n'
+ '\n'
+ ' def some_method(self):\n'
+ ' c = 1 + 1 #: comment6\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('Foo', 'attr1'): 'comment1',
+ ('Foo', 'a'): 'comment3',
+ ('Foo', 'attr2'): 'overridden'}
+ assert parser.definitions == {'Foo': ('class', 1, 11),
+ 'Foo.__init__': ('def', 5, 8),
+ 'Foo.some_method': ('def', 10, 11)}
+ assert parser.deforders == {'Foo': 0,
+ 'Foo.attr1': 1,
+ 'Foo.__init__': 3,
+ 'Foo.a': 4,
+ 'Foo.attr2': 5,
+ 'Foo.some_method': 6}
+
+
+def test_class_uses_non_self():
+ source = ('class Foo(object):\n'
+ ' def __init__(this):\n'
+ ' this.a = 1 + 1 #: comment\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('Foo', 'a'): 'comment'}
+ assert parser.definitions == {'Foo': ('class', 1, 3),
+ 'Foo.__init__': ('def', 2, 3)}
+ assert parser.deforders == {'Foo': 0,
+ 'Foo.__init__': 1,
+ 'Foo.a': 2}
+
+
+def test_nested_class():
+ source = ('class Foo(object):\n'
+ ' attr1 = None #: comment1\n'
+ '\n'
+ ' class Bar(object):\n'
+ ' attr2 = None #: comment2\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('Foo', 'attr1'): 'comment1',
+ ('Foo.Bar', 'attr2'): 'comment2'}
+ assert parser.definitions == {'Foo': ('class', 1, 5),
+ 'Foo.Bar': ('class', 4, 5)}
+ assert parser.deforders == {'Foo': 0,
+ 'Foo.attr1': 1,
+ 'Foo.Bar': 2,
+ 'Foo.Bar.attr2': 3}
+
+
+def test_class_comment():
+ source = ('import logging\n'
+ 'logger = logging.getLogger(__name__)\n'
+ '\n'
+ 'class Foo(object):\n'
+ ' """Bar"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {}
+ assert parser.definitions == {'Foo': ('class', 4, 5)}
+
+
+def test_comment_picker_multiline_string():
+ source = ('class Foo(object):\n'
+ ' a = None\n'
+ ' """multiline\n'
+ ' docstring\n'
+ ' """\n'
+ ' b = None\n'
+ ' """\n'
+ ' docstring\n'
+ ' starts with::\n'
+ '\n'
+ ' empty line"""\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('Foo', 'a'): 'multiline\ndocstring',
+ ('Foo', 'b'): 'docstring\nstarts with::\n\n empty line'}
+
+
+def test_decorators():
+ source = ('@deco\n'
+ 'def func1(): pass\n'
+ '\n'
+ '@deco(param1, param2)\n'
+ 'def func2(): pass\n'
+ '\n'
+ '@deco1\n'
+ '@deco2\n'
+ 'def func3(): pass\n'
+ '\n'
+ '@deco\n'
+ 'class Foo():\n'
+ ' @deco1\n'
+ ' @deco2\n'
+ ' def method(self): pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.definitions == {'func1': ('def', 1, 2),
+ 'func2': ('def', 4, 5),
+ 'func3': ('def', 7, 9),
+ 'Foo': ('class', 11, 15),
+ 'Foo.method': ('def', 13, 15)}
+
+
+def test_async_function_and_method():
+ source = ('async def some_function():\n'
+ ' """docstring"""\n'
+ ' a = 1 + 1 #: comment1\n'
+ '\n'
+ 'class Foo:\n'
+ ' async def method(self):\n'
+ ' pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.definitions == {'some_function': ('def', 1, 3),
+ 'Foo': ('class', 5, 7),
+ 'Foo.method': ('def', 6, 7)}
+
+
+def test_imports():
+ source = ('import sys\n'
+ 'from os import environment, path\n'
+ '\n'
+ 'import sphinx as Sphinx\n'
+ 'from sphinx.application import Sphinx as App\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.definitions == {}
+ assert parser.deforders == {'sys': 0,
+ 'environment': 1,
+ 'path': 2,
+ 'Sphinx': 3,
+ 'App': 4}
+
+
+def test_formfeed_char():
+ source = ('class Foo:\n'
+ '\f\n'
+ ' attr = 1234 #: comment\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.comments == {('Foo', 'attr'): 'comment'}
+
+
+def test_typing_final():
+ source = ('import typing\n'
+ '\n'
+ '@typing.final\n'
+ 'def func(): pass\n'
+ '\n'
+ '@typing.final\n'
+ 'class Foo:\n'
+ ' @typing.final\n'
+ ' def meth(self):\n'
+ ' pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.finals == ['func', 'Foo', 'Foo.meth']
+
+
+def test_typing_final_from_import():
+ source = ('from typing import final\n'
+ '\n'
+ '@final\n'
+ 'def func(): pass\n'
+ '\n'
+ '@final\n'
+ 'class Foo:\n'
+ ' @final\n'
+ ' def meth(self):\n'
+ ' pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.finals == ['func', 'Foo', 'Foo.meth']
+
+
+def test_typing_final_import_as():
+ source = ('import typing as foo\n'
+ '\n'
+ '@foo.final\n'
+ 'def func(): pass\n'
+ '\n'
+ '@foo.final\n'
+ 'class Foo:\n'
+ ' @typing.final\n'
+ ' def meth(self):\n'
+ ' pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.finals == ['func', 'Foo']
+
+
+def test_typing_final_from_import_as():
+ source = ('from typing import final as bar\n'
+ '\n'
+ '@bar\n'
+ 'def func(): pass\n'
+ '\n'
+ '@bar\n'
+ 'class Foo:\n'
+ ' @final\n'
+ ' def meth(self):\n'
+ ' pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.finals == ['func', 'Foo']
+
+
+def test_typing_final_not_imported():
+ source = ('@typing.final\n'
+ 'def func(): pass\n'
+ '\n'
+ '@typing.final\n'
+ 'class Foo:\n'
+ ' @final\n'
+ ' def meth(self):\n'
+ ' pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.finals == []
+
+
+def test_typing_overload():
+ source = ('import typing\n'
+ '\n'
+ '@typing.overload\n'
+ 'def func(x: int, y: int) -> int: pass\n'
+ '\n'
+ '@typing.overload\n'
+ 'def func(x: str, y: str) -> str: pass\n'
+ '\n'
+ 'def func(x, y): pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
+ signature_from_str('(x: str, y: str) -> str')]}
+
+
+def test_typing_overload_from_import():
+ source = ('from typing import overload\n'
+ '\n'
+ '@overload\n'
+ 'def func(x: int, y: int) -> int: pass\n'
+ '\n'
+ '@overload\n'
+ 'def func(x: str, y: str) -> str: pass\n'
+ '\n'
+ 'def func(x, y): pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
+ signature_from_str('(x: str, y: str) -> str')]}
+
+
+def test_typing_overload_import_as():
+ source = ('import typing as foo\n'
+ '\n'
+ '@foo.overload\n'
+ 'def func(x: int, y: int) -> int: pass\n'
+ '\n'
+ '@foo.overload\n'
+ 'def func(x: str, y: str) -> str: pass\n'
+ '\n'
+ 'def func(x, y): pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
+ signature_from_str('(x: str, y: str) -> str')]}
+
+
+def test_typing_overload_from_import_as():
+ source = ('from typing import overload as bar\n'
+ '\n'
+ '@bar\n'
+ 'def func(x: int, y: int) -> int: pass\n'
+ '\n'
+ '@bar\n'
+ 'def func(x: str, y: str) -> str: pass\n'
+ '\n'
+ 'def func(x, y): pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.overloads == {'func': [signature_from_str('(x: int, y: int) -> int'),
+ signature_from_str('(x: str, y: str) -> str')]}
+
+
+def test_typing_overload_not_imported():
+ source = ('@typing.final\n'
+ 'def func(x: int, y: int) -> int: pass\n'
+ '\n'
+ '@typing.final\n'
+ 'def func(x: str, y: str) -> str: pass\n'
+ '\n'
+ 'def func(x, y): pass\n')
+ parser = Parser(source)
+ parser.parse()
+ assert parser.overloads == {}
diff --git a/tests/test_quickstart.py b/tests/test_quickstart.py
new file mode 100644
index 0000000..6a9f5c7
--- /dev/null
+++ b/tests/test_quickstart.py
@@ -0,0 +1,260 @@
+"""Test the sphinx.quickstart module."""
+
+import time
+from io import StringIO
+from os import path
+
+import pytest
+
+from sphinx import application
+from sphinx.cmd import quickstart as qs
+from sphinx.util.console import coloron, nocolor
+
+warnfile = StringIO()
+
+
+def setup_module():
+ nocolor()
+
+
+def mock_input(answers, needanswer=False):
+ called = set()
+
+ def input_(prompt):
+ if prompt in called:
+ raise AssertionError('answer for %r missing and no default '
+ 'present' % prompt)
+ called.add(prompt)
+ for question in answers:
+ if prompt.startswith(qs.PROMPT_PREFIX + question):
+ return answers[question]
+ if needanswer:
+ raise AssertionError('answer for %r missing' % prompt)
+ return ''
+ return input_
+
+
+real_input = input
+
+
+def teardown_module():
+ qs.term_input = real_input
+ coloron()
+
+
+def test_do_prompt():
+ answers = {
+ 'Q2': 'v2',
+ 'Q3': 'v3',
+ 'Q4': 'yes',
+ 'Q5': 'no',
+ 'Q6': 'foo',
+ }
+ qs.term_input = mock_input(answers)
+
+ assert qs.do_prompt('Q1', default='v1') == 'v1'
+ assert qs.do_prompt('Q3', default='v3_default') == 'v3'
+ assert qs.do_prompt('Q2') == 'v2'
+ assert qs.do_prompt('Q4', validator=qs.boolean) is True
+ assert qs.do_prompt('Q5', validator=qs.boolean) is False
+ with pytest.raises(AssertionError):
+ qs.do_prompt('Q6', validator=qs.boolean)
+
+
+def test_do_prompt_inputstrip():
+ answers = {
+ 'Q1': 'Y',
+ 'Q2': ' Yes ',
+ 'Q3': 'N',
+ 'Q4': 'N ',
+ }
+ qs.term_input = mock_input(answers)
+
+ assert qs.do_prompt('Q1') == 'Y'
+ assert qs.do_prompt('Q2') == 'Yes'
+ assert qs.do_prompt('Q3') == 'N'
+ assert qs.do_prompt('Q4') == 'N'
+
+
+def test_do_prompt_with_nonascii():
+ answers = {
+ 'Q1': '\u30c9\u30a4\u30c4',
+ }
+ qs.term_input = mock_input(answers)
+ result = qs.do_prompt('Q1', default='\u65e5\u672c')
+ assert result == '\u30c9\u30a4\u30c4'
+
+
+def test_quickstart_defaults(tmp_path):
+ answers = {
+ 'Root path': str(tmp_path),
+ 'Project name': 'Sphinx Test',
+ 'Author name': 'Georg Brandl',
+ 'Project version': '0.1',
+ }
+ qs.term_input = mock_input(answers)
+ d = {}
+ qs.ask_user(d)
+ qs.generate(d)
+
+ conffile = tmp_path / 'conf.py'
+ assert conffile.is_file()
+ ns = {}
+ exec(conffile.read_text(encoding='utf8'), ns) # NoQA: S102
+ assert ns['extensions'] == []
+ assert ns['templates_path'] == ['_templates']
+ assert ns['project'] == 'Sphinx Test'
+ assert ns['copyright'] == '%s, Georg Brandl' % time.strftime('%Y')
+ assert ns['version'] == '0.1'
+ assert ns['release'] == '0.1'
+ assert ns['html_static_path'] == ['_static']
+
+ assert (tmp_path / '_static').is_dir()
+ assert (tmp_path / '_templates').is_dir()
+ assert (tmp_path / 'index.rst').is_file()
+ assert (tmp_path / 'Makefile').is_file()
+ assert (tmp_path / 'make.bat').is_file()
+
+
+def test_quickstart_all_answers(tmp_path):
+ answers = {
+ 'Root path': str(tmp_path),
+ 'Separate source and build': 'y',
+ 'Name prefix for templates': '.',
+ 'Project name': 'STASIâ„¢',
+ 'Author name': "Wolfgang Schäuble & G'Beckstein",
+ 'Project version': '2.0',
+ 'Project release': '2.0.1',
+ 'Project language': 'de',
+ 'Source file suffix': '.txt',
+ 'Name of your master document': 'contents',
+ 'autodoc': 'y',
+ 'doctest': 'yes',
+ 'intersphinx': 'no',
+ 'todo': 'y',
+ 'coverage': 'no',
+ 'imgmath': 'N',
+ 'mathjax': 'no',
+ 'ifconfig': 'no',
+ 'viewcode': 'no',
+ 'githubpages': 'no',
+ 'Create Makefile': 'no',
+ 'Create Windows command file': 'no',
+ 'Do you want to use the epub builder': 'yes',
+ }
+ qs.term_input = mock_input(answers, needanswer=True)
+ d = {}
+ qs.ask_user(d)
+ qs.generate(d)
+
+ conffile = tmp_path / 'source' / 'conf.py'
+ assert conffile.is_file()
+ ns = {}
+ exec(conffile.read_text(encoding='utf8'), ns) # NoQA: S102
+ assert ns['extensions'] == [
+ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo',
+ ]
+ assert ns['templates_path'] == ['.templates']
+ assert ns['source_suffix'] == '.txt'
+ assert ns['root_doc'] == 'contents'
+ assert ns['project'] == 'STASIâ„¢'
+ assert ns['copyright'] == "%s, Wolfgang Schäuble & G'Beckstein" % \
+ time.strftime('%Y')
+ assert ns['version'] == '2.0'
+ assert ns['release'] == '2.0.1'
+ assert ns['todo_include_todos'] is True
+ assert ns['html_static_path'] == ['.static']
+
+ assert (tmp_path / 'build').is_dir()
+ assert (tmp_path / 'source' / '.static').is_dir()
+ assert (tmp_path / 'source' / '.templates').is_dir()
+ assert (tmp_path / 'source' / 'contents.txt').is_file()
+
+
+def test_generated_files_eol(tmp_path):
+ answers = {
+ 'Root path': str(tmp_path),
+ 'Project name': 'Sphinx Test',
+ 'Author name': 'Georg Brandl',
+ 'Project version': '0.1',
+ }
+ qs.term_input = mock_input(answers)
+ d = {}
+ qs.ask_user(d)
+ qs.generate(d)
+
+ def assert_eol(filename, eol):
+ content = filename.read_bytes().decode()
+ assert all(l[-len(eol):] == eol for l in content.splitlines(keepends=True))
+
+ assert_eol(tmp_path / 'make.bat', '\r\n')
+ assert_eol(tmp_path / 'Makefile', '\n')
+
+
+def test_quickstart_and_build(tmp_path):
+ answers = {
+ 'Root path': str(tmp_path),
+ 'Project name': 'Fullwidth characters: \u30c9\u30a4\u30c4',
+ 'Author name': 'Georg Brandl',
+ 'Project version': '0.1',
+ }
+ qs.term_input = mock_input(answers)
+ d = {}
+ qs.ask_user(d)
+ qs.generate(d)
+
+ app = application.Sphinx(
+ tmp_path, # srcdir
+ tmp_path, # confdir
+ (tmp_path / '_build' / 'html'), # outdir
+ (tmp_path / '_build' / '.doctree'), # doctreedir
+ 'html', # buildername
+ status=StringIO(),
+ warning=warnfile)
+ app.builder.build_all()
+ warnings = warnfile.getvalue()
+ assert not warnings
+
+
+def test_default_filename(tmp_path):
+ answers = {
+ 'Root path': str(tmp_path),
+ 'Project name': '\u30c9\u30a4\u30c4', # Fullwidth characters only
+ 'Author name': 'Georg Brandl',
+ 'Project version': '0.1',
+ }
+ qs.term_input = mock_input(answers)
+ d = {}
+ qs.ask_user(d)
+ qs.generate(d)
+
+ conffile = tmp_path / 'conf.py'
+ assert conffile.is_file()
+ ns = {}
+ exec(conffile.read_text(encoding='utf8'), ns) # NoQA: S102
+
+
+def test_extensions(tmp_path):
+ qs.main(['-q', '-p', 'project_name', '-a', 'author',
+ '--extensions', 'foo,bar,baz', str(tmp_path)])
+
+ conffile = tmp_path / 'conf.py'
+ assert conffile.is_file()
+ ns = {}
+ exec(conffile.read_text(encoding='utf8'), ns) # NoQA: S102
+ assert ns['extensions'] == ['foo', 'bar', 'baz']
+
+
+def test_exits_when_existing_confpy(monkeypatch):
+ # The code detects existing conf.py with path.is_file()
+ # so we mock it as True with pytest's monkeypatch
+ def mock_isfile(path):
+ return True
+ monkeypatch.setattr(path, 'isfile', mock_isfile)
+
+ qs.term_input = mock_input({
+ 'Please enter a new root path (or just Enter to exit)': '',
+ })
+ d = {}
+ with pytest.raises(SystemExit):
+ qs.ask_user(d)
diff --git a/tests/test_roles.py b/tests/test_roles.py
new file mode 100644
index 0000000..67a13c8
--- /dev/null
+++ b/tests/test_roles.py
@@ -0,0 +1,75 @@
+"""Test sphinx.roles"""
+
+from unittest.mock import Mock
+
+from docutils import nodes
+
+from sphinx.roles import EmphasizedLiteral
+from sphinx.testing.util import assert_node
+
+
+def test_samp():
+ emph_literal_role = EmphasizedLiteral()
+
+ # normal case
+ text = 'print 1+{variable}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, ("print 1+",
+ [nodes.emphasis, "variable"])])
+ assert msg == []
+
+ # two emphasis items
+ text = 'print {1}+{variable}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, ("print ",
+ [nodes.emphasis, "1"],
+ "+",
+ [nodes.emphasis, "variable"])])
+ assert msg == []
+
+ # empty curly brace
+ text = 'print 1+{}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, "print 1+{}"])
+ assert msg == []
+
+ # half-opened variable
+ text = 'print 1+{variable'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, "print 1+{variable"])
+ assert msg == []
+
+ # nested
+ text = 'print 1+{{variable}}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, ("print 1+",
+ [nodes.emphasis, "{variable"],
+ "}")])
+ assert msg == []
+
+ # emphasized item only
+ text = '{variable}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, nodes.emphasis, "variable"])
+ assert msg == []
+
+ # escaping
+ text = r'print 1+\{variable}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, "print 1+{variable}"])
+ assert msg == []
+
+ # escaping (2)
+ text = r'print 1+\{{variable}\}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, ("print 1+{",
+ [nodes.emphasis, "variable"],
+ "}")])
+ assert msg == []
+
+ # escape a backslash
+ text = r'print 1+\\{variable}'
+ ret, msg = emph_literal_role('samp', text, text, 0, Mock())
+ assert_node(ret[0], [nodes.literal, ("print 1+\\",
+ [nodes.emphasis, "variable"])])
+ assert msg == []
diff --git a/tests/test_search.py b/tests/test_search.py
new file mode 100644
index 0000000..68a7b01
--- /dev/null
+++ b/tests/test_search.py
@@ -0,0 +1,306 @@
+"""Test the search index builder."""
+
+import json
+import warnings
+from io import BytesIO
+
+import pytest
+from docutils import frontend, utils
+from docutils.parsers import rst
+
+from sphinx.search import IndexBuilder
+
+
+class DummyEnvironment:
+ def __init__(self, version, domains):
+ self.version = version
+ self.domains = domains
+
+ def __getattr__(self, name):
+ if name.startswith('_search_index_'):
+ setattr(self, name, {})
+ return getattr(self, name, {})
+
+ def __str__(self):
+ return f'DummyEnvironment({self.version!r}, {self.domains!r})'
+
+
+class DummyDomain:
+ def __init__(self, data):
+ self.data = data
+ self.object_types = {}
+
+ def get_objects(self):
+ return self.data
+
+
+settings = parser = None
+
+
+def setup_module():
+ global settings, parser
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ # DeprecationWarning: The frontend.OptionParser class will be replaced
+ # by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
+ optparser = frontend.OptionParser(components=(rst.Parser,))
+ settings = optparser.get_default_values()
+ parser = rst.Parser()
+
+
+def load_searchindex(path):
+ searchindex = path.read_text(encoding='utf8')
+ assert searchindex.startswith('Search.setIndex(')
+ assert searchindex.endswith(')')
+
+ return json.loads(searchindex[16:-1])
+
+
+def is_registered_term(index, keyword):
+ return index['terms'].get(keyword, []) != []
+
+
+FILE_CONTENTS = '''\
+section_title
+=============
+
+.. test that comments are not indexed: boson
+
+test that non-comments are indexed: fermion
+'''
+
+
+@pytest.mark.sphinx(testroot='ext-viewcode')
+def test_objects_are_escaped(app):
+ app.builder.build_all()
+ index = load_searchindex(app.outdir / 'searchindex.js')
+ for item in index.get('objects').get(''):
+ if item[-1] == 'n::Array&lt;T, d&gt;': # n::Array<T,d> is escaped
+ break
+ else:
+ raise AssertionError(index.get('objects').get(''))
+
+
+@pytest.mark.sphinx(testroot='search')
+def test_meta_keys_are_handled_for_language_en(app):
+ app.builder.build_all()
+ searchindex = load_searchindex(app.outdir / 'searchindex.js')
+ assert not is_registered_term(searchindex, 'thisnoteith')
+ assert is_registered_term(searchindex, 'thisonetoo')
+ assert is_registered_term(searchindex, 'findthiskei')
+ assert is_registered_term(searchindex, 'thistoo')
+ assert not is_registered_term(searchindex, 'onlygerman')
+ assert is_registered_term(searchindex, 'notgerman')
+ assert not is_registered_term(searchindex, 'onlytoogerman')
+
+
+@pytest.mark.sphinx(testroot='search', confoverrides={'html_search_language': 'de'}, freshenv=True)
+def test_meta_keys_are_handled_for_language_de(app):
+ app.builder.build_all()
+ searchindex = load_searchindex(app.outdir / 'searchindex.js')
+ assert not is_registered_term(searchindex, 'thisnoteith')
+ assert is_registered_term(searchindex, 'thisonetoo')
+ assert not is_registered_term(searchindex, 'findthiskei')
+ assert not is_registered_term(searchindex, 'thistoo')
+ assert is_registered_term(searchindex, 'onlygerman')
+ assert not is_registered_term(searchindex, 'notgerman')
+ assert is_registered_term(searchindex, 'onlytoogerman')
+
+
+@pytest.mark.sphinx(testroot='search')
+def test_stemmer_does_not_remove_short_words(app):
+ app.builder.build_all()
+ searchindex = (app.outdir / 'searchindex.js').read_text(encoding='utf8')
+ assert 'bat' in searchindex
+
+
+@pytest.mark.sphinx(testroot='search')
+def test_stemmer(app):
+ app.builder.build_all()
+ searchindex = load_searchindex(app.outdir / 'searchindex.js')
+ print(searchindex)
+ assert is_registered_term(searchindex, 'findthisstemmedkei')
+ assert is_registered_term(searchindex, 'intern')
+
+
+@pytest.mark.sphinx(testroot='search')
+def test_term_in_heading_and_section(app):
+ app.builder.build_all()
+ searchindex = (app.outdir / 'searchindex.js').read_text(encoding='utf8')
+ # if search term is in the title of one doc and in the text of another
+ # both documents should be a hit in the search index as a title,
+ # respectively text hit
+ assert '"textinhead": 2' in searchindex
+ assert '"textinhead": 0' in searchindex
+
+
+@pytest.mark.sphinx(testroot='search')
+def test_term_in_raw_directive(app):
+ app.builder.build_all()
+ searchindex = load_searchindex(app.outdir / 'searchindex.js')
+ assert not is_registered_term(searchindex, 'raw')
+ assert is_registered_term(searchindex, 'rawword')
+ assert not is_registered_term(searchindex, 'latex_keyword')
+
+
+def test_IndexBuilder():
+ domain1 = DummyDomain([('objname1', 'objdispname1', 'objtype1', 'docname1_1', '#anchor', 1),
+ ('objname2', 'objdispname2', 'objtype2', 'docname1_2', '', -1)])
+ domain2 = DummyDomain([('objname1', 'objdispname1', 'objtype1', 'docname2_1', '#anchor', 1),
+ ('objname2', 'objdispname2', 'objtype2', 'docname2_2', '', -1)])
+ env = DummyEnvironment('1.0', {'dummy1': domain1, 'dummy2': domain2})
+ doc = utils.new_document(b'test data', settings)
+ doc['file'] = 'dummy'
+ parser.parse(FILE_CONTENTS, doc)
+
+ # feed
+ index = IndexBuilder(env, 'en', {}, None)
+ index.feed('docname1_1', 'filename1_1', 'title1_1', doc)
+ index.feed('docname1_2', 'filename1_2', 'title1_2', doc)
+ index.feed('docname2_1', 'filename2_1', 'title2_1', doc)
+ index.feed('docname2_2', 'filename2_2', 'title2_2', doc)
+ assert index._titles == {'docname1_1': 'title1_1', 'docname1_2': 'title1_2',
+ 'docname2_1': 'title2_1', 'docname2_2': 'title2_2'}
+ assert index._filenames == {'docname1_1': 'filename1_1', 'docname1_2': 'filename1_2',
+ 'docname2_1': 'filename2_1', 'docname2_2': 'filename2_2'}
+ assert index._mapping == {
+ 'ar': {'docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'},
+ 'fermion': {'docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'},
+ 'comment': {'docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'},
+ 'non': {'docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'},
+ 'index': {'docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'},
+ 'test': {'docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'},
+ }
+ assert index._title_mapping == {'section_titl': {'docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'}}
+ assert index._objtypes == {}
+ assert index._objnames == {}
+
+ # freeze
+ assert index.freeze() == {
+ 'docnames': ('docname1_1', 'docname1_2', 'docname2_1', 'docname2_2'),
+ 'envversion': '1.0',
+ 'filenames': ['filename1_1', 'filename1_2', 'filename2_1', 'filename2_2'],
+ 'objects': {'': [(0, 0, 1, '#anchor', 'objdispname1'),
+ (2, 1, 1, '#anchor', 'objdispname1')]},
+ 'objnames': {0: ('dummy1', 'objtype1', 'objtype1'), 1: ('dummy2', 'objtype1', 'objtype1')},
+ 'objtypes': {0: 'dummy1:objtype1', 1: 'dummy2:objtype1'},
+ 'terms': {'ar': [0, 1, 2, 3],
+ 'comment': [0, 1, 2, 3],
+ 'fermion': [0, 1, 2, 3],
+ 'index': [0, 1, 2, 3],
+ 'non': [0, 1, 2, 3],
+ 'test': [0, 1, 2, 3]},
+ 'titles': ('title1_1', 'title1_2', 'title2_1', 'title2_2'),
+ 'titleterms': {'section_titl': [0, 1, 2, 3]},
+ 'alltitles': {'section_title': [(0, 'section-title'), (1, 'section-title'), (2, 'section-title'), (3, 'section-title')]},
+ 'indexentries': {},
+ }
+ assert index._objtypes == {('dummy1', 'objtype1'): 0, ('dummy2', 'objtype1'): 1}
+ assert index._objnames == {0: ('dummy1', 'objtype1', 'objtype1'),
+ 1: ('dummy2', 'objtype1', 'objtype1')}
+
+ env = DummyEnvironment('1.0', {'dummy1': domain1, 'dummy2': domain2})
+
+ # dump / load
+ stream = BytesIO()
+ index.dump(stream, 'pickle')
+ stream.seek(0)
+
+ index2 = IndexBuilder(env, 'en', {}, None)
+ index2.load(stream, 'pickle')
+
+ assert index2._titles == index._titles
+ assert index2._filenames == index._filenames
+ assert index2._mapping == index._mapping
+ assert index2._title_mapping == index._title_mapping
+ assert index2._objtypes == {}
+ assert index2._objnames == {}
+
+ # freeze after load
+ assert index2.freeze() == index.freeze()
+ assert index2._objtypes == index._objtypes
+ assert index2._objnames == index._objnames
+
+ # prune
+ index.prune(['docname1_2', 'docname2_2'])
+ assert index._titles == {'docname1_2': 'title1_2', 'docname2_2': 'title2_2'}
+ assert index._filenames == {'docname1_2': 'filename1_2', 'docname2_2': 'filename2_2'}
+ assert index._mapping == {
+ 'ar': {'docname1_2', 'docname2_2'},
+ 'fermion': {'docname1_2', 'docname2_2'},
+ 'comment': {'docname1_2', 'docname2_2'},
+ 'non': {'docname1_2', 'docname2_2'},
+ 'index': {'docname1_2', 'docname2_2'},
+ 'test': {'docname1_2', 'docname2_2'},
+ }
+ assert index._title_mapping == {'section_titl': {'docname1_2', 'docname2_2'}}
+ assert index._objtypes == {('dummy1', 'objtype1'): 0, ('dummy2', 'objtype1'): 1}
+ assert index._objnames == {0: ('dummy1', 'objtype1', 'objtype1'), 1: ('dummy2', 'objtype1', 'objtype1')}
+
+ # freeze after prune
+ assert index.freeze() == {
+ 'docnames': ('docname1_2', 'docname2_2'),
+ 'envversion': '1.0',
+ 'filenames': ['filename1_2', 'filename2_2'],
+ 'objects': {},
+ 'objnames': {0: ('dummy1', 'objtype1', 'objtype1'), 1: ('dummy2', 'objtype1', 'objtype1')},
+ 'objtypes': {0: 'dummy1:objtype1', 1: 'dummy2:objtype1'},
+ 'terms': {'ar': [0, 1],
+ 'comment': [0, 1],
+ 'fermion': [0, 1],
+ 'index': [0, 1],
+ 'non': [0, 1],
+ 'test': [0, 1]},
+ 'titles': ('title1_2', 'title2_2'),
+ 'titleterms': {'section_titl': [0, 1]},
+ 'alltitles': {'section_title': [(0, 'section-title'), (1, 'section-title')]},
+ 'indexentries': {},
+ }
+ assert index._objtypes == {('dummy1', 'objtype1'): 0, ('dummy2', 'objtype1'): 1}
+ assert index._objnames == {0: ('dummy1', 'objtype1', 'objtype1'),
+ 1: ('dummy2', 'objtype1', 'objtype1')}
+
+
+def test_IndexBuilder_lookup():
+ env = DummyEnvironment('1.0', {})
+
+ # zh
+ index = IndexBuilder(env, 'zh', {}, None)
+ assert index.lang.lang == 'zh'
+
+ # zh_CN
+ index = IndexBuilder(env, 'zh_CN', {}, None)
+ assert index.lang.lang == 'zh'
+
+
+@pytest.mark.sphinx(
+ testroot='search',
+ confoverrides={'html_search_language': 'zh'},
+ srcdir='search_zh',
+)
+def test_search_index_gen_zh(app):
+ app.builder.build_all()
+ index = load_searchindex(app.outdir / 'searchindex.js')
+ assert 'chinesetest ' not in index['terms']
+ assert 'chinesetest' in index['terms']
+ assert 'chinesetesttwo' in index['terms']
+ assert 'cas' in index['terms']
+
+
+@pytest.mark.sphinx(testroot='search', freshenv=True)
+def test_nosearch(app):
+ app.build()
+ index = load_searchindex(app.outdir / 'searchindex.js')
+ assert index['docnames'] == ['index', 'nosearch', 'tocitem']
+ assert 'latex' not in index['terms']
+ assert 'bat' in index['terms']
+ # bat is indexed from 'index.rst' and 'tocitem.rst' (document IDs 0, 2), and
+ # not from 'nosearch.rst' (document ID 1)
+ assert index['terms']['bat'] == [0, 2]
+
+
+@pytest.mark.sphinx(testroot='search', parallel=3, freshenv=True)
+def test_parallel(app):
+ app.build()
+ index = load_searchindex(app.outdir / 'searchindex.js')
+ assert index['docnames'] == ['index', 'nosearch', 'tocitem']
diff --git a/tests/test_smartquotes.py b/tests/test_smartquotes.py
new file mode 100644
index 0000000..1d4e8e1
--- /dev/null
+++ b/tests/test_smartquotes.py
@@ -0,0 +1,99 @@
+"""Test smart quotes."""
+
+import pytest
+from html5lib import HTMLParser
+
+
+@pytest.mark.sphinx(buildername='html', testroot='smartquotes', freshenv=True)
+def test_basic(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<p>– “Sphinx†is a tool that makes it easy …</p>' in content
+
+
+@pytest.mark.sphinx(buildername='html', testroot='smartquotes', freshenv=True)
+def test_literals(app, status, warning):
+ app.build()
+
+ with (app.outdir / 'literals.html').open(encoding='utf-8') as html_file:
+ etree = HTMLParser(namespaceHTMLElements=False).parse(html_file)
+
+ for code_element in etree.iter('code'):
+ code_text = ''.join(code_element.itertext())
+
+ if code_text.startswith('code role'):
+ assert "'quotes'" in code_text
+ elif code_text.startswith('{'):
+ assert code_text == "{'code': 'role', 'with': 'quotes'}"
+ elif code_text.startswith('literal'):
+ assert code_text == "literal with 'quotes'"
+
+
+@pytest.mark.sphinx(buildername='text', testroot='smartquotes', freshenv=True)
+def test_text_builder(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'index.txt').read_text(encoding='utf8')
+ assert '-- "Sphinx" is a tool that makes it easy ...' in content
+
+
+@pytest.mark.sphinx(buildername='man', testroot='smartquotes', freshenv=True)
+def test_man_builder(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'python.1').read_text(encoding='utf8')
+ assert r'\-\- \(dqSphinx\(dq is a tool that makes it easy ...' in content
+
+
+@pytest.mark.sphinx(buildername='latex', testroot='smartquotes', freshenv=True)
+def test_latex_builder(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert '\\textendash{} “Sphinx†is a tool that makes it easy …' in content
+
+
+@pytest.mark.sphinx(buildername='html', testroot='smartquotes', freshenv=True,
+ confoverrides={'language': 'ja'})
+def test_ja_html_builder(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<p>-- &quot;Sphinx&quot; is a tool that makes it easy ...</p>' in content
+
+
+@pytest.mark.sphinx(buildername='html', testroot='smartquotes', freshenv=True,
+ confoverrides={'smartquotes': False})
+def test_smartquotes_disabled(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<p>-- &quot;Sphinx&quot; is a tool that makes it easy ...</p>' in content
+
+
+@pytest.mark.sphinx(buildername='html', testroot='smartquotes', freshenv=True,
+ confoverrides={'smartquotes_action': 'q'})
+def test_smartquotes_action(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<p>-- “Sphinx†is a tool that makes it easy ...</p>' in content
+
+
+@pytest.mark.sphinx(buildername='html', testroot='smartquotes', freshenv=True,
+ confoverrides={'language': 'ja', 'smartquotes_excludes': {}})
+def test_smartquotes_excludes_language(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<p>– 「Sphinx〠is a tool that makes it easy …</p>' in content
+
+
+@pytest.mark.sphinx(buildername='man', testroot='smartquotes', freshenv=True,
+ confoverrides={'smartquotes_excludes': {}})
+def test_smartquotes_excludes_builders(app, status, warning):
+ app.build()
+
+ content = (app.outdir / 'python.1').read_text(encoding='utf8')
+ assert '– “Sphinx†is a tool that makes it easy …' in content
diff --git a/tests/test_templating.py b/tests/test_templating.py
new file mode 100644
index 0000000..a41af93
--- /dev/null
+++ b/tests/test_templating.py
@@ -0,0 +1,41 @@
+"""Test templating."""
+
+import pytest
+
+from sphinx.ext.autosummary.generate import setup_documenters
+
+
+@pytest.mark.sphinx('html', testroot='templating')
+def test_layout_overloading(make_app, app_params):
+ args, kwargs = app_params
+ app = make_app(*args, **kwargs)
+ setup_documenters(app)
+ app.builder.build_update()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<!-- layout overloading -->' in result
+
+
+@pytest.mark.sphinx('html', testroot='templating')
+def test_autosummary_class_template_overloading(make_app, app_params):
+ args, kwargs = app_params
+ app = make_app(*args, **kwargs)
+ setup_documenters(app)
+ app.builder.build_update()
+
+ result = (app.outdir / 'generated' / 'sphinx.application.TemplateBridge.html').read_text(encoding='utf8')
+ assert 'autosummary/class.rst method block overloading' in result
+ assert 'foobar' not in result
+
+
+@pytest.mark.sphinx('html', testroot='templating',
+ confoverrides={'autosummary_context': {'sentence': 'foobar'}})
+def test_autosummary_context(make_app, app_params):
+ args, kwargs = app_params
+ app = make_app(*args, **kwargs)
+ setup_documenters(app)
+ app.builder.build_update()
+
+ result = (app.outdir / 'generated' / 'sphinx.application.TemplateBridge.html').read_text(encoding='utf8')
+ assert 'autosummary/class.rst method block overloading' in result
+ assert 'foobar' in result
diff --git a/tests/test_theming.py b/tests/test_theming.py
new file mode 100644
index 0000000..b4c8511
--- /dev/null
+++ b/tests/test_theming.py
@@ -0,0 +1,131 @@
+"""Test the Theme class."""
+
+import os
+
+import alabaster
+import pytest
+
+import sphinx.builders.html
+from sphinx.theming import ThemeError
+
+
+@pytest.mark.sphinx(
+ testroot='theming',
+ confoverrides={'html_theme': 'ziptheme',
+ 'html_theme_options.testopt': 'foo'})
+def test_theme_api(app, status, warning):
+ cfg = app.config
+
+ themes = ['basic', 'default', 'scrolls', 'agogo', 'sphinxdoc', 'haiku',
+ 'traditional', 'epub', 'nature', 'pyramid', 'bizstyle', 'classic', 'nonav',
+ 'test-theme', 'ziptheme', 'staticfiles', 'parent', 'child']
+ try:
+ alabaster_version = alabaster.__version_info__
+ except AttributeError:
+ alabaster_version = alabaster.version.__version_info__
+ if alabaster_version >= (0, 7, 11):
+ themes.append('alabaster')
+
+ # test Theme class API
+ assert set(app.registry.html_themes.keys()) == set(themes)
+ assert app.registry.html_themes['test-theme'] == str(app.srcdir / 'test_theme' / 'test-theme')
+ assert app.registry.html_themes['ziptheme'] == str(app.srcdir / 'ziptheme.zip')
+ assert app.registry.html_themes['staticfiles'] == str(app.srcdir / 'test_theme' / 'staticfiles')
+
+ # test Theme instance API
+ theme = app.builder.theme
+ assert theme.name == 'ziptheme'
+ themedir = theme.themedir
+ assert theme.base.name == 'basic'
+ assert len(theme.get_theme_dirs()) == 2
+
+ # direct setting
+ assert theme.get_config('theme', 'stylesheet') == 'custom.css'
+ # inherited setting
+ assert theme.get_config('options', 'nosidebar') == 'false'
+ # nonexisting setting
+ assert theme.get_config('theme', 'foobar', 'def') == 'def'
+ with pytest.raises(ThemeError):
+ theme.get_config('theme', 'foobar')
+
+ # options API
+
+ options = theme.get_options({'nonexisting': 'foo'})
+ assert 'nonexisting' not in options
+
+ options = theme.get_options(cfg.html_theme_options)
+ assert options['testopt'] == 'foo'
+ assert options['nosidebar'] == 'false'
+
+ # cleanup temp directories
+ theme.cleanup()
+ assert not os.path.exists(themedir)
+
+
+@pytest.mark.sphinx(testroot='double-inheriting-theme')
+def test_double_inheriting_theme(app, status, warning):
+ assert app.builder.theme.name == 'base_theme2'
+ app.build() # => not raises TemplateNotFound
+
+
+@pytest.mark.sphinx(testroot='theming',
+ confoverrides={'html_theme': 'child'})
+def test_nested_zipped_theme(app, status, warning):
+ assert app.builder.theme.name == 'child'
+ app.build() # => not raises TemplateNotFound
+
+
+@pytest.mark.sphinx(testroot='theming',
+ confoverrides={'html_theme': 'staticfiles'})
+def test_staticfiles(app, status, warning):
+ app.build()
+ assert (app.outdir / '_static' / 'staticimg.png').exists()
+ assert (app.outdir / '_static' / 'statictmpl.html').exists()
+ assert (app.outdir / '_static' / 'statictmpl.html').read_text(encoding='utf8') == (
+ '<!-- testing static templates -->\n'
+ '<html><project>Python</project></html>'
+ )
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<meta name="testopt" content="optdefault" />' in result
+
+
+@pytest.mark.sphinx(testroot='theming',
+ confoverrides={'html_theme': 'test-theme'})
+def test_dark_style(app, monkeypatch):
+ monkeypatch.setattr(sphinx.builders.html, '_file_checksum', lambda o, f: '')
+
+ style = app.builder.dark_highlighter.formatter_args.get('style')
+ assert style.__name__ == 'MonokaiStyle'
+
+ app.build()
+ assert (app.outdir / '_static' / 'pygments_dark.css').exists()
+
+ css_file, properties = app.registry.css_files[0]
+ assert css_file == 'pygments_dark.css'
+ assert "media" in properties
+ assert properties["media"] == '(prefers-color-scheme: dark)'
+
+ assert sorted(f.filename for f in app.builder._css_files) == [
+ '_static/classic.css',
+ '_static/pygments.css',
+ '_static/pygments_dark.css',
+ ]
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<link rel="stylesheet" type="text/css" href="_static/pygments.css" />' in result
+ assert ('<link id="pygments_dark_css" media="(prefers-color-scheme: dark)" '
+ 'rel="stylesheet" type="text/css" '
+ 'href="_static/pygments_dark.css" />') in result
+
+
+@pytest.mark.sphinx(testroot='theming')
+def test_theme_sidebars(app, status, warning):
+ app.build()
+
+ # test-theme specifies globaltoc and searchbox as default sidebars
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<h3><a href="#">Table of Contents</a></h3>' in result
+ assert '<h3>Related Topics</h3>' not in result
+ assert '<h3>This Page</h3>' not in result
+ assert '<h3 id="searchlabel">Quick search</h3>' in result
diff --git a/tests/test_toctree.py b/tests/test_toctree.py
new file mode 100644
index 0000000..39d0916
--- /dev/null
+++ b/tests/test_toctree.py
@@ -0,0 +1,39 @@
+"""Test the HTML builder and check output against XPath."""
+import re
+
+import pytest
+
+
+@pytest.mark.sphinx(testroot='toctree-glob')
+def test_relations(app, status, warning):
+ app.builder.build_all()
+ assert app.builder.relations['index'] == [None, None, 'foo']
+ assert app.builder.relations['foo'] == ['index', 'index', 'bar/index']
+ assert app.builder.relations['bar/index'] == ['index', 'foo', 'bar/bar_1']
+ assert app.builder.relations['bar/bar_1'] == ['bar/index', 'bar/index', 'bar/bar_2']
+ assert app.builder.relations['bar/bar_2'] == ['bar/index', 'bar/bar_1', 'bar/bar_3']
+ assert app.builder.relations['bar/bar_3'] == ['bar/index', 'bar/bar_2', 'bar/bar_4/index']
+ assert app.builder.relations['bar/bar_4/index'] == ['bar/index', 'bar/bar_3', 'baz']
+ assert app.builder.relations['baz'] == ['index', 'bar/bar_4/index', 'qux/index']
+ assert app.builder.relations['qux/index'] == ['index', 'baz', 'qux/qux_1']
+ assert app.builder.relations['qux/qux_1'] == ['qux/index', 'qux/index', 'qux/qux_2']
+ assert app.builder.relations['qux/qux_2'] == ['qux/index', 'qux/qux_1', None]
+ assert 'quux' not in app.builder.relations
+
+
+@pytest.mark.sphinx('singlehtml', testroot='toctree-empty')
+def test_singlehtml_toctree(app, status, warning):
+ app.builder.build_all()
+ try:
+ app.builder._get_local_toctree('index')
+ except AttributeError:
+ pytest.fail('Unexpected AttributeError in app.builder.fix_refuris')
+
+
+@pytest.mark.sphinx(testroot='toctree', srcdir="numbered-toctree")
+def test_numbered_toctree(app, status, warning):
+ # give argument to :numbered: option
+ index = (app.srcdir / 'index.rst').read_text(encoding='utf8')
+ index = re.sub(':numbered:.*', ':numbered: 1', index)
+ (app.srcdir / 'index.rst').write_text(index, encoding='utf8')
+ app.builder.build_all()
diff --git a/tests/test_transforms_move_module_targets.py b/tests/test_transforms_move_module_targets.py
new file mode 100644
index 0000000..e0e9f1d
--- /dev/null
+++ b/tests/test_transforms_move_module_targets.py
@@ -0,0 +1,77 @@
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.testing.util import SphinxTestApp
+from sphinx.transforms import MoveModuleTargets
+
+CONTENT_PY = """\
+move-module-targets
+===================
+
+.. py:module:: fish_licence.halibut
+"""
+CONTENT_JS = """\
+move-module-targets
+===================
+
+.. js:module:: fish_licence.halibut
+"""
+
+
+@pytest.mark.parametrize('content', [
+ CONTENT_PY, # Python
+ CONTENT_JS, # JavaScript
+])
+@pytest.mark.usefixtures("rollback_sysmodules")
+def test_move_module_targets(tmp_path, content):
+ # Test for the MoveModuleTargets transform
+ tmp_path.joinpath("conf.py").touch()
+ tmp_path.joinpath("index.rst").write_text(content, encoding="utf-8")
+
+ app = SphinxTestApp('dummy', srcdir=tmp_path)
+ app.build(force_all=True)
+ document = app.env.get_doctree('index')
+ section = document[0]
+
+ # target ID has been lifted into the section node
+ assert section["ids"] == ['module-fish_licence.halibut', 'move-module-targets']
+ # nodes.target has been removed from 'section'
+ assert isinstance(section[0], nodes.title)
+ assert isinstance(section[1], addnodes.index)
+ assert len(section) == 2
+
+
+@pytest.mark.usefixtures("rollback_sysmodules")
+def test_move_module_targets_no_section(tmp_path):
+ # Test for the MoveModuleTargets transform
+ tmp_path.joinpath("conf.py").touch()
+ tmp_path.joinpath("index.rst").write_text(".. py:module:: fish_licence.halibut\n", encoding="utf-8")
+
+ app = SphinxTestApp('dummy', srcdir=tmp_path)
+ app.build(force_all=True)
+ document = app.env.get_doctree('index')
+
+ assert document["ids"] == []
+
+
+@pytest.mark.usefixtures("rollback_sysmodules")
+def test_move_module_targets_disabled(tmp_path):
+ # Test for the MoveModuleTargets transform
+ tmp_path.joinpath("conf.py").touch()
+ tmp_path.joinpath("index.rst").write_text(CONTENT_PY, encoding="utf-8")
+
+ app = SphinxTestApp('dummy', srcdir=tmp_path)
+ app.registry.transforms.remove(MoveModuleTargets) # disable the transform
+ app.build(force_all=True)
+ document = app.env.get_doctree('index')
+ section = document[0]
+
+ # target ID is not lifted into the section node
+ assert section["ids"] == ['move-module-targets']
+ assert section[2]["ids"] == ['module-fish_licence.halibut']
+ # nodes.target remains in 'section'
+ assert isinstance(section[0], nodes.title)
+ assert isinstance(section[1], addnodes.index)
+ assert isinstance(section[2], nodes.target)
+ assert len(section) == 3
diff --git a/tests/test_transforms_post_transforms.py b/tests/test_transforms_post_transforms.py
new file mode 100644
index 0000000..b9b6126
--- /dev/null
+++ b/tests/test_transforms_post_transforms.py
@@ -0,0 +1,268 @@
+"""Tests the post_transforms"""
+
+from __future__ import annotations
+
+import logging
+from typing import TYPE_CHECKING
+
+import pytest
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.addnodes import SIG_ELEMENTS
+from sphinx.testing.util import assert_node
+from sphinx.transforms.post_transforms import SigElementFallbackTransform
+from sphinx.util.docutils import new_document
+
+if TYPE_CHECKING:
+ from typing import Any, NoReturn
+
+ from _pytest.fixtures import SubRequest
+
+ from sphinx.testing.util import SphinxTestApp
+
+
+@pytest.mark.sphinx('html', testroot='transforms-post_transforms-missing-reference')
+def test_nitpicky_warning(app, warning):
+ app.build()
+ assert ('index.rst:4: WARNING: py:class reference target '
+ 'not found: io.StringIO' in warning.getvalue())
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert ('<p><code class="xref py py-class docutils literal notranslate"><span class="pre">'
+ 'io.StringIO</span></code></p>' in content)
+
+
+@pytest.mark.sphinx('html', testroot='transforms-post_transforms-missing-reference',
+ freshenv=True)
+def test_missing_reference(app, warning):
+ def missing_reference(app_, env_, node_, contnode_):
+ assert app_ is app
+ assert env_ is app.env
+ assert node_['reftarget'] == 'io.StringIO'
+ assert contnode_.astext() == 'io.StringIO'
+
+ return nodes.inline('', 'missing-reference.StringIO')
+
+ warning.truncate(0)
+ app.connect('missing-reference', missing_reference)
+ app.build()
+ assert warning.getvalue() == ''
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<p><span>missing-reference.StringIO</span></p>' in content
+
+
+@pytest.mark.sphinx('html', testroot='domain-py-python_use_unqualified_type_names',
+ freshenv=True)
+def test_missing_reference_conditional_pending_xref(app, warning):
+ def missing_reference(_app, _env, _node, contnode):
+ return contnode
+
+ warning.truncate(0)
+ app.connect('missing-reference', missing_reference)
+ app.build()
+ assert warning.getvalue() == ''
+
+ content = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert '<span class="n"><span class="pre">Age</span></span>' in content
+
+
+@pytest.mark.sphinx('html', testroot='transforms-post_transforms-keyboard',
+ freshenv=True)
+def test_keyboard_hyphen_spaces(app):
+ """Regression test for issue 10495, we want no crash."""
+ app.build()
+ assert "spanish" in (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert "inquisition" in (app.outdir / 'index.html').read_text(encoding='utf8')
+
+
+class TestSigElementFallbackTransform:
+ """Integration test for :class:`sphinx.transforms.post_transforms.SigElementFallbackTransform`."""
+ # safe copy of the "built-in" desc_sig_* nodes (during the test, instances of such nodes
+ # will be created sequentially, so we fix a possible order at the beginning using a tuple)
+ _builtin_sig_elements: tuple[type[addnodes.desc_sig_element], ...] = tuple(SIG_ELEMENTS)
+
+ @pytest.fixture(autouse=True)
+ def builtin_sig_elements(self) -> tuple[type[addnodes.desc_sig_element], ...]:
+ """Fixture returning an ordered view on the original value of :data:`!sphinx.addnodes.SIG_ELEMENTS`."""
+ return self._builtin_sig_elements
+
+ @pytest.fixture()
+ def document(
+ self, app: SphinxTestApp, builtin_sig_elements: tuple[type[addnodes.desc_sig_element], ...],
+ ) -> nodes.document:
+ """Fixture returning a new document with built-in ``desc_sig_*`` nodes and a final ``desc_inline`` node."""
+ doc = new_document('')
+ doc.settings.env = app.env
+ # Nodes that should be supported by a default custom translator class.
+ # It is important that builtin_sig_elements has a fixed order so that
+ # the nodes can be deterministically checked.
+ doc += [node_type('', '') for node_type in builtin_sig_elements]
+ doc += addnodes.desc_inline('py')
+ return doc
+
+ @pytest.fixture()
+ def with_desc_sig_elements(self, value: Any) -> bool:
+ """Dynamic fixture acting as the identity on booleans."""
+ assert isinstance(value, bool)
+ return value
+
+ @pytest.fixture()
+ def add_visitor_method_for(self, value: Any) -> list[str]:
+ """Dynamic fixture acting as the identity on a list of strings."""
+ assert isinstance(value, list)
+ assert all(isinstance(item, str) for item in value)
+ return value
+
+ @pytest.fixture(autouse=True)
+ def translator_class(self, request: SubRequest) -> type[nodes.NodeVisitor]:
+ """Minimal interface fixture similar to SphinxTranslator but orthogonal thereof."""
+ logger = logging.getLogger(__name__)
+
+ class BaseCustomTranslatorClass(nodes.NodeVisitor):
+ """Base class for a custom translator class, orthogonal to ``SphinxTranslator``."""
+
+ def __init__(self, document, *_a):
+ super().__init__(document)
+ # ignore other arguments
+
+ def dispatch_visit(self, node):
+ for node_class in node.__class__.__mro__:
+ if method := getattr(self, f'visit_{node_class.__name__}', None):
+ method(node)
+ break
+ else:
+ logger.info('generic visit: %r', node.__class__.__name__)
+ super().dispatch_visit(node)
+
+ def unknown_visit(self, node):
+ logger.warning('unknown visit: %r', node.__class__.__name__)
+ raise nodes.SkipDeparture # ignore unknown departure
+
+ def visit_document(self, node):
+ raise nodes.SkipDeparture # ignore departure
+
+ def mark_node(self, node: nodes.Node) -> NoReturn:
+ logger.info('mark: %r', node.__class__.__name__)
+ raise nodes.SkipDeparture # ignore departure
+
+ with_desc_sig_elements = request.getfixturevalue('with_desc_sig_elements')
+ if with_desc_sig_elements:
+ desc_sig_elements_list = request.getfixturevalue('builtin_sig_elements')
+ else:
+ desc_sig_elements_list = []
+ add_visitor_method_for = request.getfixturevalue('add_visitor_method_for')
+ visitor_methods = {f'visit_{tp.__name__}' for tp in desc_sig_elements_list}
+ visitor_methods.update(f'visit_{name}' for name in add_visitor_method_for)
+ class_dict = dict.fromkeys(visitor_methods, BaseCustomTranslatorClass.mark_node)
+ return type('CustomTranslatorClass', (BaseCustomTranslatorClass,), class_dict) # type: ignore[return-value]
+
+ @pytest.mark.parametrize(
+ 'add_visitor_method_for',
+ [[], ['desc_inline']],
+ ids=[
+ 'no_explicit_visitor',
+ 'explicit_desc_inline_visitor',
+ ],
+ )
+ @pytest.mark.parametrize(
+ 'with_desc_sig_elements',
+ [True, False],
+ ids=[
+ 'with_default_visitors_for_desc_sig_elements',
+ 'without_default_visitors_for_desc_sig_elements',
+ ],
+ )
+ @pytest.mark.sphinx('dummy')
+ def test_support_desc_inline(
+ self, document: nodes.document, with_desc_sig_elements: bool,
+ add_visitor_method_for: list[str], request: SubRequest,
+ ) -> None:
+ document, _, _ = self._exec(request)
+ # count the number of desc_inline nodes with the extra _sig_node_type field
+ desc_inline_typename = addnodes.desc_inline.__name__
+ visit_desc_inline = desc_inline_typename in add_visitor_method_for
+ if visit_desc_inline:
+ assert_node(document[-1], addnodes.desc_inline)
+ else:
+ assert_node(document[-1], nodes.inline, _sig_node_type=desc_inline_typename)
+
+ @pytest.mark.parametrize(
+ 'add_visitor_method_for',
+ [
+ [], # no support
+ ['desc_sig_space'], # enable desc_sig_space visitor
+ ['desc_sig_element'], # enable generic visitor
+ ['desc_sig_space', 'desc_sig_element'], # enable desc_sig_space and generic visitors
+ ],
+ ids=[
+ 'no_explicit_visitor',
+ 'explicit_desc_sig_space_visitor',
+ 'explicit_desc_sig_element_visitor',
+ 'explicit_desc_sig_space_and_desc_sig_element_visitors',
+ ],
+ )
+ @pytest.mark.parametrize(
+ 'with_desc_sig_elements',
+ [True, False],
+ ids=[
+ 'with_default_visitors_for_desc_sig_elements',
+ 'without_default_visitors_for_desc_sig_elements',
+ ],
+ )
+ @pytest.mark.sphinx('dummy')
+ def test_custom_implementation(
+ self,
+ document: nodes.document,
+ with_desc_sig_elements: bool,
+ add_visitor_method_for: list[str],
+ request: SubRequest,
+ ) -> None:
+ document, stdout, stderr = self._exec(request)
+ assert len(self._builtin_sig_elements) == len(document.children[:-1]) == len(stdout[:-1])
+
+ visit_desc_sig_element = addnodes.desc_sig_element.__name__ in add_visitor_method_for
+ ignore_sig_element_fallback_transform = visit_desc_sig_element or with_desc_sig_elements
+
+ if ignore_sig_element_fallback_transform:
+ # desc_sig_element is implemented or desc_sig_* nodes are properly handled (and left untouched)
+ for node_type, node, mess in zip(self._builtin_sig_elements, document.children[:-1], stdout[:-1]):
+ assert_node(node, node_type)
+ assert not node.hasattr('_sig_node_type')
+ assert mess == f'mark: {node_type.__name__!r}'
+ else:
+ # desc_sig_* nodes are converted into inline nodes
+ for node_type, node, mess in zip(self._builtin_sig_elements, document.children[:-1], stdout[:-1]):
+ assert_node(node, nodes.inline, _sig_node_type=node_type.__name__)
+ assert mess == f'generic visit: {nodes.inline.__name__!r}'
+
+ # desc_inline node is never handled and always transformed
+ assert addnodes.desc_inline.__name__ not in add_visitor_method_for
+ assert_node(document[-1], nodes.inline, _sig_node_type=addnodes.desc_inline.__name__)
+ assert stdout[-1] == f'generic visit: {nodes.inline.__name__!r}'
+
+ # nodes.inline are never handled
+ assert len(stderr) == 1 if ignore_sig_element_fallback_transform else len(document.children)
+ assert set(stderr) == {f'unknown visit: {nodes.inline.__name__!r}'}
+
+ @staticmethod
+ def _exec(request: SubRequest) -> tuple[nodes.document, list[str], list[str]]:
+ caplog = request.getfixturevalue('caplog')
+ caplog.set_level(logging.INFO, logger=__name__)
+
+ app = request.getfixturevalue('app')
+ translator_class = request.getfixturevalue('translator_class')
+ app.set_translator('dummy', translator_class)
+ # run the post-transform directly [building phase]
+ # document contains SIG_ELEMENTS nodes followed by a desc_inline node
+ document = request.getfixturevalue('document')
+ SigElementFallbackTransform(document).run()
+ # run the translator [writing phase]
+ translator = translator_class(document, app.builder)
+ document.walkabout(translator)
+ # extract messages
+ messages = caplog.record_tuples
+ stdout = [message for _, lvl, message in messages if lvl == logging.INFO]
+ stderr = [message for _, lvl, message in messages if lvl == logging.WARN]
+ return document, stdout, stderr
diff --git a/tests/test_transforms_post_transforms_code.py b/tests/test_transforms_post_transforms_code.py
new file mode 100644
index 0000000..4423d5b
--- /dev/null
+++ b/tests/test_transforms_post_transforms_code.py
@@ -0,0 +1,44 @@
+import pytest
+
+
+@pytest.mark.sphinx('html', testroot='trim_doctest_flags')
+def test_trim_doctest_flags_html(app, status, warning):
+ app.build()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert 'FOO' not in result
+ assert 'BAR' in result
+ assert 'BAZ' not in result
+ assert 'QUX' not in result
+ assert 'QUUX' not in result
+ assert 'CORGE' not in result
+ assert 'GRAULT' in result
+
+
+@pytest.mark.sphinx('html', testroot='trim_doctest_flags',
+ confoverrides={'trim_doctest_flags': False})
+def test_trim_doctest_flags_disabled(app, status, warning):
+ app.build()
+
+ result = (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert 'FOO' in result
+ assert 'BAR' in result
+ assert 'BAZ' in result
+ assert 'QUX' in result
+ assert 'QUUX' not in result
+ assert 'CORGE' not in result
+ assert 'GRAULT' in result
+
+
+@pytest.mark.sphinx('latex', testroot='trim_doctest_flags')
+def test_trim_doctest_flags_latex(app, status, warning):
+ app.build()
+
+ result = (app.outdir / 'python.tex').read_text(encoding='utf8')
+ assert 'FOO' not in result
+ assert 'BAR' in result
+ assert 'BAZ' not in result
+ assert 'QUX' not in result
+ assert 'QUUX' not in result
+ assert 'CORGE' not in result
+ assert 'GRAULT' in result
diff --git a/tests/test_transforms_reorder_nodes.py b/tests/test_transforms_reorder_nodes.py
new file mode 100644
index 0000000..7ffdae6
--- /dev/null
+++ b/tests/test_transforms_reorder_nodes.py
@@ -0,0 +1,96 @@
+"""Tests the transformations"""
+
+from docutils import nodes
+
+from sphinx import addnodes
+from sphinx.testing import restructuredtext
+from sphinx.testing.util import assert_node
+
+
+def test_transforms_reorder_consecutive_target_and_index_nodes_preserve_order(app):
+ text = ('.. index:: abc\n'
+ '.. index:: def\n'
+ '.. index:: ghi\n'
+ '.. index:: jkl\n'
+ '\n'
+ 'text\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ addnodes.index,
+ addnodes.index,
+ addnodes.index,
+ nodes.target,
+ nodes.target,
+ nodes.target,
+ nodes.target,
+ nodes.paragraph))
+ assert_node(doctree[0], addnodes.index, entries=[('single', 'abc', 'index-0', '', None)])
+ assert_node(doctree[1], addnodes.index, entries=[('single', 'def', 'index-1', '', None)])
+ assert_node(doctree[2], addnodes.index, entries=[('single', 'ghi', 'index-2', '', None)])
+ assert_node(doctree[3], addnodes.index, entries=[('single', 'jkl', 'index-3', '', None)])
+ assert_node(doctree[4], nodes.target, refid='index-0')
+ assert_node(doctree[5], nodes.target, refid='index-1')
+ assert_node(doctree[6], nodes.target, refid='index-2')
+ assert_node(doctree[7], nodes.target, refid='index-3')
+ # assert_node(doctree[8], nodes.paragraph)
+
+
+def test_transforms_reorder_consecutive_target_and_index_nodes_no_merge_across_other_nodes(app):
+ text = ('.. index:: abc\n'
+ '.. index:: def\n'
+ '\n'
+ 'text\n'
+ '\n'
+ '.. index:: ghi\n'
+ '.. index:: jkl\n'
+ '\n'
+ 'text\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (addnodes.index,
+ addnodes.index,
+ nodes.target,
+ nodes.target,
+ nodes.paragraph,
+ addnodes.index,
+ addnodes.index,
+ nodes.target,
+ nodes.target,
+ nodes.paragraph))
+ assert_node(doctree[0], addnodes.index, entries=[('single', 'abc', 'index-0', '', None)])
+ assert_node(doctree[1], addnodes.index, entries=[('single', 'def', 'index-1', '', None)])
+ assert_node(doctree[2], nodes.target, refid='index-0')
+ assert_node(doctree[3], nodes.target, refid='index-1')
+ # assert_node(doctree[4], nodes.paragraph)
+ assert_node(doctree[5], addnodes.index, entries=[('single', 'ghi', 'index-2', '', None)])
+ assert_node(doctree[6], addnodes.index, entries=[('single', 'jkl', 'index-3', '', None)])
+ assert_node(doctree[7], nodes.target, refid='index-2')
+ assert_node(doctree[8], nodes.target, refid='index-3')
+ # assert_node(doctree[9], nodes.paragraph)
+
+
+def test_transforms_reorder_consecutive_target_and_index_nodes_merge_with_labels(app):
+ text = ('.. _abc:\n'
+ '.. index:: def\n'
+ '.. _ghi:\n'
+ '.. index:: jkl\n'
+ '.. _mno:\n'
+ '\n'
+ 'Heading\n'
+ '=======\n')
+ doctree = restructuredtext.parse(app, text)
+ assert_node(doctree, (nodes.title,
+ addnodes.index,
+ addnodes.index,
+ nodes.target,
+ nodes.target,
+ nodes.target,
+ nodes.target,
+ nodes.target))
+ # assert_node(doctree[8], nodes.title)
+ assert_node(doctree[1], addnodes.index, entries=[('single', 'def', 'index-0', '', None)])
+ assert_node(doctree[2], addnodes.index, entries=[('single', 'jkl', 'index-1', '', None)])
+ assert_node(doctree[3], nodes.target, refid='abc')
+ assert_node(doctree[4], nodes.target, refid='index-0')
+ assert_node(doctree[5], nodes.target, refid='ghi')
+ assert_node(doctree[6], nodes.target, refid='index-1')
+ assert_node(doctree[7], nodes.target, refid='mno')
diff --git a/tests/test_util.py b/tests/test_util.py
new file mode 100644
index 0000000..4389894
--- /dev/null
+++ b/tests/test_util.py
@@ -0,0 +1,73 @@
+"""Tests util functions."""
+
+import os
+import tempfile
+
+import pytest
+
+from sphinx.errors import ExtensionError
+from sphinx.util import encode_uri, ensuredir, import_object, parselinenos
+
+
+def test_encode_uri():
+ expected = ('https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_'
+ '%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_'
+ '%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85')
+ uri = ('https://ru.wikipedia.org/wiki'
+ '/СиÑтема_управлениÑ_базами_данных')
+ assert expected == encode_uri(uri)
+
+ expected = ('https://github.com/search?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+is%3A'
+ 'sprint-friendly+user%3Ajupyter&type=Issues&ref=searchresults')
+ uri = ('https://github.com/search?utf8=✓&q=is%3Aissue+is%3Aopen+is%3A'
+ 'sprint-friendly+user%3Ajupyter&type=Issues&ref=searchresults')
+ assert expected == encode_uri(uri)
+
+
+def test_ensuredir():
+ with tempfile.TemporaryDirectory() as tmp_path:
+ # Does not raise an exception for an existing directory.
+ ensuredir(tmp_path)
+
+ path = os.path.join(tmp_path, 'a', 'b', 'c')
+ ensuredir(path)
+ assert os.path.isdir(path)
+
+
+def test_import_object():
+ module = import_object('sphinx')
+ assert module.__name__ == 'sphinx'
+
+ module = import_object('sphinx.application')
+ assert module.__name__ == 'sphinx.application'
+
+ obj = import_object('sphinx.application.Sphinx')
+ assert obj.__name__ == 'Sphinx'
+
+ with pytest.raises(ExtensionError) as exc:
+ import_object('sphinx.unknown_module')
+ assert exc.value.args[0] == 'Could not import sphinx.unknown_module'
+
+ with pytest.raises(ExtensionError) as exc:
+ import_object('sphinx.unknown_module', 'my extension')
+ assert exc.value.args[0] == ('Could not import sphinx.unknown_module '
+ '(needed for my extension)')
+
+
+def test_parselinenos():
+ assert parselinenos('1,2,3', 10) == [0, 1, 2]
+ assert parselinenos('4, 5, 6', 10) == [3, 4, 5]
+ assert parselinenos('-4', 10) == [0, 1, 2, 3]
+ assert parselinenos('7-9', 10) == [6, 7, 8]
+ assert parselinenos('7-', 10) == [6, 7, 8, 9]
+ assert parselinenos('1,7-', 10) == [0, 6, 7, 8, 9]
+ assert parselinenos('7-7', 10) == [6]
+ assert parselinenos('11-', 10) == [10]
+ with pytest.raises(ValueError, match="invalid line number spec: '1-2-3'"):
+ parselinenos('1-2-3', 10)
+ with pytest.raises(ValueError, match="invalid line number spec: 'abc-def'"):
+ parselinenos('abc-def', 10)
+ with pytest.raises(ValueError, match="invalid line number spec: '-'"):
+ parselinenos('-', 10)
+ with pytest.raises(ValueError, match="invalid line number spec: '3-1'"):
+ parselinenos('3-1', 10)
diff --git a/tests/test_util_display.py b/tests/test_util_display.py
new file mode 100644
index 0000000..9ecdd6a
--- /dev/null
+++ b/tests/test_util_display.py
@@ -0,0 +1,103 @@
+"""Tests util functions."""
+
+import pytest
+
+from sphinx.testing.util import strip_escseq
+from sphinx.util import logging
+from sphinx.util.display import (
+ SkipProgressMessage,
+ display_chunk,
+ progress_message,
+ status_iterator,
+)
+
+
+def test_display_chunk():
+ assert display_chunk('hello') == 'hello'
+ assert display_chunk(['hello']) == 'hello'
+ assert display_chunk(['hello', 'sphinx', 'world']) == 'hello .. world'
+ assert display_chunk(('hello',)) == 'hello'
+ assert display_chunk(('hello', 'sphinx', 'world')) == 'hello .. world'
+
+
+@pytest.mark.sphinx('dummy')
+def test_status_iterator_length_0(app, status, warning):
+ logging.setup(app, status, warning)
+
+ # test for status_iterator (length=0)
+ status.seek(0)
+ status.truncate(0)
+ yields = list(status_iterator(['hello', 'sphinx', 'world'], 'testing ... '))
+ output = strip_escseq(status.getvalue())
+ assert 'testing ... hello sphinx world \n' in output
+ assert yields == ['hello', 'sphinx', 'world']
+
+
+@pytest.mark.sphinx('dummy')
+def test_status_iterator_verbosity_0(app, status, warning):
+ logging.setup(app, status, warning)
+
+ # test for status_iterator (verbosity=0)
+ status.seek(0)
+ status.truncate(0)
+ yields = list(status_iterator(['hello', 'sphinx', 'world'], 'testing ... ',
+ length=3, verbosity=0))
+ output = strip_escseq(status.getvalue())
+ assert 'testing ... [ 33%] hello\r' in output
+ assert 'testing ... [ 67%] sphinx\r' in output
+ assert 'testing ... [100%] world\r\n' in output
+ assert yields == ['hello', 'sphinx', 'world']
+
+
+@pytest.mark.sphinx('dummy')
+def test_status_iterator_verbosity_1(app, status, warning):
+ logging.setup(app, status, warning)
+
+ # test for status_iterator (verbosity=1)
+ status.seek(0)
+ status.truncate(0)
+ yields = list(status_iterator(['hello', 'sphinx', 'world'], 'testing ... ',
+ length=3, verbosity=1))
+ output = strip_escseq(status.getvalue())
+ assert 'testing ... [ 33%] hello\n' in output
+ assert 'testing ... [ 67%] sphinx\n' in output
+ assert 'testing ... [100%] world\n\n' in output
+ assert yields == ['hello', 'sphinx', 'world']
+
+
+def test_progress_message(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ # standard case
+ with progress_message('testing'):
+ logger.info('blah ', nonl=True)
+
+ output = strip_escseq(status.getvalue())
+ assert 'testing... blah done\n' in output
+
+ # skipping case
+ with progress_message('testing'):
+ raise SkipProgressMessage('Reason: %s', 'error') # NoQA: EM101
+
+ output = strip_escseq(status.getvalue())
+ assert 'testing... skipped\nReason: error\n' in output
+
+ # error case
+ try:
+ with progress_message('testing'):
+ raise
+ except Exception:
+ pass
+
+ output = strip_escseq(status.getvalue())
+ assert 'testing... failed\n' in output
+
+ # decorator
+ @progress_message('testing')
+ def func():
+ logger.info('in func ', nonl=True)
+
+ func()
+ output = strip_escseq(status.getvalue())
+ assert 'testing... in func done\n' in output
diff --git a/tests/test_util_docstrings.py b/tests/test_util_docstrings.py
new file mode 100644
index 0000000..813e84e
--- /dev/null
+++ b/tests/test_util_docstrings.py
@@ -0,0 +1,88 @@
+"""Test sphinx.util.docstrings."""
+
+from sphinx.util.docstrings import prepare_commentdoc, prepare_docstring, separate_metadata
+
+
+def test_separate_metadata():
+ # metadata only
+ text = (":meta foo: bar\n"
+ ":meta baz:\n")
+ docstring, metadata = separate_metadata(text)
+ assert docstring == ''
+ assert metadata == {'foo': 'bar', 'baz': ''}
+
+ # non metadata field list item
+ text = (":meta foo: bar\n"
+ ":param baz:\n")
+ docstring, metadata = separate_metadata(text)
+ assert docstring == ':param baz:\n'
+ assert metadata == {'foo': 'bar'}
+
+ # field_list like text following just after paragraph is not a field_list
+ text = ("blah blah blah\n"
+ ":meta foo: bar\n"
+ ":meta baz:\n")
+ docstring, metadata = separate_metadata(text)
+ assert docstring == text
+ assert metadata == {}
+
+ # field_list like text following after blank line is a field_list
+ text = ("blah blah blah\n"
+ "\n"
+ ":meta foo: bar\n"
+ ":meta baz:\n")
+ docstring, metadata = separate_metadata(text)
+ assert docstring == "blah blah blah\n\n"
+ assert metadata == {'foo': 'bar', 'baz': ''}
+
+ # non field_list item breaks field_list
+ text = (":meta foo: bar\n"
+ "blah blah blah\n"
+ ":meta baz:\n")
+ docstring, metadata = separate_metadata(text)
+ assert docstring == ("blah blah blah\n"
+ ":meta baz:\n")
+ assert metadata == {'foo': 'bar'}
+
+
+def test_prepare_docstring():
+ docstring = """multiline docstring
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna
+ aliqua::
+
+ Ut enim ad minim veniam, quis nostrud exercitation
+ ullamco laboris nisi ut aliquip ex ea commodo consequat.
+ """
+
+ assert (prepare_docstring(docstring) ==
+ ["multiline docstring",
+ "",
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit,",
+ "sed do eiusmod tempor incididunt ut labore et dolore magna",
+ "aliqua::",
+ "",
+ " Ut enim ad minim veniam, quis nostrud exercitation",
+ " ullamco laboris nisi ut aliquip ex ea commodo consequat.",
+ ""])
+
+ docstring = """
+
+ multiline docstring with leading empty lines
+ """
+ assert (prepare_docstring(docstring) ==
+ ["multiline docstring with leading empty lines",
+ ""])
+
+ docstring = "single line docstring"
+ assert (prepare_docstring(docstring) ==
+ ["single line docstring",
+ ""])
+
+
+def test_prepare_commentdoc():
+ assert prepare_commentdoc("hello world") == []
+ assert prepare_commentdoc("#: hello world") == ["hello world", ""]
+ assert prepare_commentdoc("#: hello world") == [" hello world", ""]
+ assert prepare_commentdoc("#: hello\n#: world\n") == ["hello", "world", ""]
diff --git a/tests/test_util_docutils.py b/tests/test_util_docutils.py
new file mode 100644
index 0000000..69999eb
--- /dev/null
+++ b/tests/test_util_docutils.py
@@ -0,0 +1,92 @@
+"""Tests util.utils functions."""
+
+import os
+
+from docutils import nodes
+
+from sphinx.util.docutils import (
+ SphinxFileOutput,
+ SphinxTranslator,
+ docutils_namespace,
+ new_document,
+ register_node,
+)
+
+
+def test_register_node():
+ class custom_node(nodes.Element):
+ pass
+
+ with docutils_namespace():
+ register_node(custom_node)
+
+ # check registered
+ assert hasattr(nodes.GenericNodeVisitor, 'visit_custom_node')
+ assert hasattr(nodes.GenericNodeVisitor, 'depart_custom_node')
+ assert hasattr(nodes.SparseNodeVisitor, 'visit_custom_node')
+ assert hasattr(nodes.SparseNodeVisitor, 'depart_custom_node')
+
+ # check unregistered outside namespace
+ assert not hasattr(nodes.GenericNodeVisitor, 'visit_custom_node')
+ assert not hasattr(nodes.GenericNodeVisitor, 'depart_custom_node')
+ assert not hasattr(nodes.SparseNodeVisitor, 'visit_custom_node')
+ assert not hasattr(nodes.SparseNodeVisitor, 'depart_custom_node')
+
+
+def test_SphinxFileOutput(tmpdir):
+ content = 'Hello Sphinx World'
+
+ # write test.txt at first
+ filename = str(tmpdir / 'test.txt')
+ output = SphinxFileOutput(destination_path=filename)
+ output.write(content)
+ os.utime(filename, (0, 0))
+
+ # overwrite it again
+ output.write(content)
+ assert os.stat(filename).st_mtime != 0 # updated
+
+ # write test2.txt at first
+ filename = str(tmpdir / 'test2.txt')
+ output = SphinxFileOutput(destination_path=filename, overwrite_if_changed=True)
+ output.write(content)
+ os.utime(filename, (0, 0))
+
+ # overwrite it again
+ output.write(content)
+ assert os.stat(filename).st_mtime == 0 # not updated
+
+ # overwrite it again (content changed)
+ output.write(content + "; content change")
+ assert os.stat(filename).st_mtime != 0 # updated
+
+
+def test_SphinxTranslator(app):
+ class CustomNode(nodes.inline):
+ pass
+
+ class MyTranslator(SphinxTranslator):
+ def __init__(self, *args):
+ self.called = []
+ super().__init__(*args)
+
+ def visit_document(self, node):
+ pass
+
+ def depart_document(self, node):
+ pass
+
+ def visit_inline(self, node):
+ self.called.append('visit_inline')
+
+ def depart_inline(self, node):
+ self.called.append('depart_inline')
+
+ document = new_document('')
+ document += CustomNode()
+
+ translator = MyTranslator(document, app.builder)
+ document.walkabout(translator)
+
+ # MyTranslator does not have visit_CustomNode. But it calls visit_inline instead.
+ assert translator.called == ['visit_inline', 'depart_inline']
diff --git a/tests/test_util_fileutil.py b/tests/test_util_fileutil.py
new file mode 100644
index 0000000..9c23821
--- /dev/null
+++ b/tests/test_util_fileutil.py
@@ -0,0 +1,103 @@
+"""Tests sphinx.util.fileutil functions."""
+
+from unittest import mock
+
+from sphinx.jinja2glue import BuiltinTemplateLoader
+from sphinx.util.fileutil import copy_asset, copy_asset_file
+
+
+class DummyTemplateLoader(BuiltinTemplateLoader):
+ def __init__(self):
+ super().__init__()
+ builder = mock.Mock()
+ builder.config.templates_path = []
+ builder.app.translator = None
+ self.init(builder)
+
+
+def test_copy_asset_file(tmp_path):
+ renderer = DummyTemplateLoader()
+
+ # copy normal file
+ src = (tmp_path / 'asset.txt')
+ src.write_text('# test data', encoding='utf8')
+ dest = (tmp_path / 'output.txt')
+
+ copy_asset_file(src, dest)
+ assert dest.exists()
+ assert src.read_text(encoding='utf8') == dest.read_text(encoding='utf8')
+
+ # copy template file
+ src = (tmp_path / 'asset.txt_t')
+ src.write_text('# {{var1}} data', encoding='utf8')
+ dest = (tmp_path / 'output.txt_t')
+
+ copy_asset_file(str(src), str(dest), {'var1': 'template'}, renderer)
+ assert not dest.exists()
+ assert (tmp_path / 'output.txt').exists()
+ assert (tmp_path / 'output.txt').read_text(encoding='utf8') == '# template data'
+
+ # copy template file to subdir
+ src = (tmp_path / 'asset.txt_t')
+ src.write_text('# {{var1}} data', encoding='utf8')
+ subdir1 = (tmp_path / 'subdir')
+ subdir1.mkdir(parents=True, exist_ok=True)
+
+ copy_asset_file(src, subdir1, {'var1': 'template'}, renderer)
+ assert (subdir1 / 'asset.txt').exists()
+ assert (subdir1 / 'asset.txt').read_text(encoding='utf8') == '# template data'
+
+ # copy template file without context
+ src = (tmp_path / 'asset.txt_t')
+ subdir2 = (tmp_path / 'subdir2')
+ subdir2.mkdir(parents=True, exist_ok=True)
+
+ copy_asset_file(src, subdir2)
+ assert not (subdir2 / 'asset.txt').exists()
+ assert (subdir2 / 'asset.txt_t').exists()
+ assert (subdir2 / 'asset.txt_t').read_text(encoding='utf8') == '# {{var1}} data'
+
+
+def test_copy_asset(tmp_path):
+ renderer = DummyTemplateLoader()
+
+ # prepare source files
+ source = (tmp_path / 'source')
+ source.mkdir(parents=True, exist_ok=True)
+ (source / 'index.rst').write_text('index.rst', encoding='utf8')
+ (source / 'foo.rst_t').write_text('{{var1}}.rst', encoding='utf8')
+ (source / '_static').mkdir(parents=True, exist_ok=True)
+ (source / '_static' / 'basic.css').write_text('basic.css', encoding='utf8')
+ (source / '_templates').mkdir(parents=True, exist_ok=True)
+ (source / '_templates' / 'layout.html').write_text('layout.html', encoding='utf8')
+ (source / '_templates' / 'sidebar.html_t').write_text('sidebar: {{var2}}', encoding='utf8')
+
+ # copy a single file
+ assert not (tmp_path / 'test1').exists()
+ copy_asset(source / 'index.rst', tmp_path / 'test1')
+ assert (tmp_path / 'test1').exists()
+ assert (tmp_path / 'test1/index.rst').exists()
+
+ # copy directories
+ destdir = tmp_path / 'test2'
+ copy_asset(source, destdir, context={'var1': 'bar', 'var2': 'baz'}, renderer=renderer)
+ assert (destdir / 'index.rst').exists()
+ assert (destdir / 'foo.rst').exists()
+ assert (destdir / 'foo.rst').read_text(encoding='utf8') == 'bar.rst'
+ assert (destdir / '_static' / 'basic.css').exists()
+ assert (destdir / '_templates' / 'layout.html').exists()
+ assert (destdir / '_templates' / 'sidebar.html').exists()
+ assert (destdir / '_templates' / 'sidebar.html').read_text(encoding='utf8') == 'sidebar: baz'
+
+ # copy with exclusion
+ def excluded(path):
+ return ('sidebar.html' in path or 'basic.css' in path)
+
+ destdir = tmp_path / 'test3'
+ copy_asset(source, destdir, excluded,
+ context={'var1': 'bar', 'var2': 'baz'}, renderer=renderer)
+ assert (destdir / 'index.rst').exists()
+ assert (destdir / 'foo.rst').exists()
+ assert not (destdir / '_static' / 'basic.css').exists()
+ assert (destdir / '_templates' / 'layout.html').exists()
+ assert not (destdir / '_templates' / 'sidebar.html').exists()
diff --git a/tests/test_util_i18n.py b/tests/test_util_i18n.py
new file mode 100644
index 0000000..9a1ecc5
--- /dev/null
+++ b/tests/test_util_i18n.py
@@ -0,0 +1,190 @@
+"""Test i18n util."""
+
+import datetime
+import os
+
+import babel
+import pytest
+from babel.messages.mofile import read_mo
+
+from sphinx.errors import SphinxError
+from sphinx.util import i18n
+
+BABEL_VERSION = tuple(map(int, babel.__version__.split('.')))
+
+
+def test_catalog_info_for_file_and_path():
+ cat = i18n.CatalogInfo('path', 'domain', 'utf-8')
+ assert cat.po_file == 'domain.po'
+ assert cat.mo_file == 'domain.mo'
+ assert cat.po_path == os.path.join('path', 'domain.po')
+ assert cat.mo_path == os.path.join('path', 'domain.mo')
+
+
+def test_catalog_info_for_sub_domain_file_and_path():
+ cat = i18n.CatalogInfo('path', 'sub/domain', 'utf-8')
+ assert cat.po_file == 'sub/domain.po'
+ assert cat.mo_file == 'sub/domain.mo'
+ assert cat.po_path == os.path.join('path', 'sub/domain.po')
+ assert cat.mo_path == os.path.join('path', 'sub/domain.mo')
+
+
+def test_catalog_outdated(tmp_path):
+ (tmp_path / 'test.po').write_text('#', encoding='utf8')
+ cat = i18n.CatalogInfo(tmp_path, 'test', 'utf-8')
+ assert cat.is_outdated() # if mo is not exist
+
+ mo_file = (tmp_path / 'test.mo')
+ mo_file.write_text('#', encoding='utf8')
+ assert not cat.is_outdated() # if mo is exist and newer than po
+
+ os.utime(mo_file, (os.stat(mo_file).st_mtime - 10,) * 2) # to be outdate
+ assert cat.is_outdated() # if mo is exist and older than po
+
+
+def test_catalog_write_mo(tmp_path):
+ (tmp_path / 'test.po').write_text('#', encoding='utf8')
+ cat = i18n.CatalogInfo(tmp_path, 'test', 'utf-8')
+ cat.write_mo('en')
+ assert os.path.exists(cat.mo_path)
+ with open(cat.mo_path, 'rb') as f:
+ assert read_mo(f) is not None
+
+
+def test_format_date():
+ date = datetime.date(2016, 2, 7)
+
+ # strftime format
+ format = '%B %d, %Y'
+ assert i18n.format_date(format, date=date, language='') == 'February 07, 2016'
+ assert i18n.format_date(format, date=date, language='unknown') == 'February 07, 2016'
+ assert i18n.format_date(format, date=date, language='en') == 'February 07, 2016'
+ assert i18n.format_date(format, date=date, language='ja') == '2月 07, 2016'
+ assert i18n.format_date(format, date=date, language='de') == 'Februar 07, 2016'
+
+ # raw string
+ format = 'Mon Mar 28 12:37:08 2016, commit 4367aef'
+ assert i18n.format_date(format, date=date, language='en') == format
+
+ format = '%B %d, %Y, %H:%M:%S %I %p'
+ datet = datetime.datetime(2016, 2, 7, 5, 11, 17, 0) # NoQA: DTZ001
+ assert i18n.format_date(format, date=datet, language='en') == 'February 07, 2016, 05:11:17 05 AM'
+
+ format = '%B %-d, %Y, %-H:%-M:%-S %-I %p'
+ assert i18n.format_date(format, date=datet, language='en') == 'February 7, 2016, 5:11:17 5 AM'
+ format = '%x'
+ assert i18n.format_date(format, date=datet, language='en') == 'Feb 7, 2016'
+ format = '%X'
+ if BABEL_VERSION >= (2, 12):
+ assert i18n.format_date(format, date=datet, language='en') == '5:11:17\u202fAM'
+ else:
+ assert i18n.format_date(format, date=datet, language='en') == '5:11:17 AM'
+ assert i18n.format_date(format, date=date, language='en') == 'Feb 7, 2016'
+ format = '%c'
+ if BABEL_VERSION >= (2, 12):
+ assert i18n.format_date(format, date=datet, language='en') == 'Feb 7, 2016, 5:11:17\u202fAM'
+ else:
+ assert i18n.format_date(format, date=datet, language='en') == 'Feb 7, 2016, 5:11:17 AM'
+ assert i18n.format_date(format, date=date, language='en') == 'Feb 7, 2016'
+
+ # timezone
+ format = '%Z'
+ assert i18n.format_date(format, date=datet, language='en') == 'UTC'
+ format = '%z'
+ assert i18n.format_date(format, date=datet, language='en') == '+0000'
+
+
+def test_get_filename_for_language(app):
+ app.env.temp_data['docname'] = 'index'
+
+ # language is en
+ app.env.config.language = 'en'
+ assert i18n.get_image_filename_for_language('foo.png', app.env) == 'foo.en.png'
+ assert i18n.get_image_filename_for_language('foo.bar.png', app.env) == 'foo.bar.en.png'
+ assert i18n.get_image_filename_for_language('dir/foo.png', app.env) == 'dir/foo.en.png'
+ assert i18n.get_image_filename_for_language('../foo.png', app.env) == '../foo.en.png'
+ assert i18n.get_image_filename_for_language('foo', app.env) == 'foo.en'
+
+ # modify figure_language_filename and language is 'en'
+ app.env.config.language = 'en'
+ app.env.config.figure_language_filename = 'images/{language}/{root}{ext}'
+ assert i18n.get_image_filename_for_language('foo.png', app.env) == 'images/en/foo.png'
+ assert i18n.get_image_filename_for_language(
+ 'foo.bar.png', app.env) == 'images/en/foo.bar.png'
+ assert i18n.get_image_filename_for_language(
+ 'subdir/foo.png', app.env) == 'images/en/subdir/foo.png'
+ assert i18n.get_image_filename_for_language(
+ '../foo.png', app.env) == 'images/en/../foo.png'
+ assert i18n.get_image_filename_for_language('foo', app.env) == 'images/en/foo'
+
+ # new path and basename tokens
+ app.env.config.language = 'en'
+ app.env.config.figure_language_filename = '{path}{language}/{basename}{ext}'
+ assert i18n.get_image_filename_for_language('foo.png', app.env) == 'en/foo.png'
+ assert i18n.get_image_filename_for_language(
+ 'foo.bar.png', app.env) == 'en/foo.bar.png'
+ assert i18n.get_image_filename_for_language(
+ 'subdir/foo.png', app.env) == 'subdir/en/foo.png'
+ assert i18n.get_image_filename_for_language(
+ '../foo.png', app.env) == '../en/foo.png'
+ assert i18n.get_image_filename_for_language('foo', app.env) == 'en/foo'
+
+ # invalid figure_language_filename
+ app.env.config.figure_language_filename = '{root}.{invalid}{ext}'
+ with pytest.raises(SphinxError):
+ i18n.get_image_filename_for_language('foo.png', app.env)
+
+ # docpath (for a document in the top of source directory)
+ app.env.config.language = 'en'
+ app.env.config.figure_language_filename = '/{docpath}{language}/{basename}{ext}'
+ assert (i18n.get_image_filename_for_language('foo.png', app.env) ==
+ '/en/foo.png')
+
+ # docpath (for a document in the sub directory)
+ app.env.temp_data['docname'] = 'subdir/index'
+ assert (i18n.get_image_filename_for_language('foo.png', app.env) ==
+ '/subdir/en/foo.png')
+
+
+def test_CatalogRepository(tmp_path):
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES').mkdir(parents=True, exist_ok=True)
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES' / 'test1.po').write_text('#', encoding='utf8')
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES' / 'test2.po').write_text('#', encoding='utf8')
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES' / 'sub').mkdir(parents=True, exist_ok=True)
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES' / 'sub' / 'test3.po').write_text('#', encoding='utf8')
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES' / 'sub' / 'test4.po').write_text('#', encoding='utf8')
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES' / '.dotdir').mkdir(parents=True, exist_ok=True)
+ (tmp_path / 'loc1' / 'xx' / 'LC_MESSAGES' / '.dotdir' / 'test5.po').write_text('#', encoding='utf8')
+ (tmp_path / 'loc1' / 'yy' / 'LC_MESSAGES').mkdir(parents=True, exist_ok=True)
+ (tmp_path / 'loc1' / 'yy' / 'LC_MESSAGES' / 'test6.po').write_text('#', encoding='utf8')
+ (tmp_path / 'loc2' / 'xx' / 'LC_MESSAGES').mkdir(parents=True, exist_ok=True)
+ (tmp_path / 'loc2' / 'xx' / 'LC_MESSAGES' / 'test1.po').write_text('#', encoding='utf8')
+ (tmp_path / 'loc2' / 'xx' / 'LC_MESSAGES' / 'test7.po').write_text('#', encoding='utf8')
+
+ # for language xx
+ repo = i18n.CatalogRepository(tmp_path, ['loc1', 'loc2'], 'xx', 'utf-8')
+ assert list(repo.locale_dirs) == [str(tmp_path / 'loc1'),
+ str(tmp_path / 'loc2')]
+ assert all(isinstance(c, i18n.CatalogInfo) for c in repo.catalogs)
+ assert sorted(c.domain for c in repo.catalogs) == ['sub/test3', 'sub/test4',
+ 'test1', 'test1', 'test2', 'test7']
+
+ # for language yy
+ repo = i18n.CatalogRepository(tmp_path, ['loc1', 'loc2'], 'yy', 'utf-8')
+ assert sorted(c.domain for c in repo.catalogs) == ['test6']
+
+ # unknown languages
+ repo = i18n.CatalogRepository(tmp_path, ['loc1', 'loc2'], 'zz', 'utf-8')
+ assert sorted(c.domain for c in repo.catalogs) == []
+
+ # no languages
+ repo = i18n.CatalogRepository(tmp_path, ['loc1', 'loc2'], None, 'utf-8')
+ assert sorted(c.domain for c in repo.catalogs) == []
+
+ # unknown locale_dirs
+ repo = i18n.CatalogRepository(tmp_path, ['loc3'], None, 'utf-8')
+ assert sorted(c.domain for c in repo.catalogs) == []
+
+ # no locale_dirs
+ repo = i18n.CatalogRepository(tmp_path, [], None, 'utf-8')
+ assert sorted(c.domain for c in repo.catalogs) == []
diff --git a/tests/test_util_images.py b/tests/test_util_images.py
new file mode 100644
index 0000000..15853c7
--- /dev/null
+++ b/tests/test_util_images.py
@@ -0,0 +1,74 @@
+"""Test images util."""
+
+import pytest
+
+from sphinx.util.images import (
+ get_image_extension,
+ get_image_size,
+ guess_mimetype,
+ parse_data_uri,
+)
+
+GIF_FILENAME = 'img.gif'
+PNG_FILENAME = 'img.png'
+PDF_FILENAME = 'img.pdf'
+TXT_FILENAME = 'index.txt'
+
+
+def test_get_image_size(rootdir):
+ assert get_image_size(rootdir / 'test-root' / GIF_FILENAME) == (200, 181)
+ assert get_image_size(rootdir / 'test-root' / PNG_FILENAME) == (200, 181)
+ assert get_image_size(rootdir / 'test-root' / PDF_FILENAME) is None
+ assert get_image_size(rootdir / 'test-root' / TXT_FILENAME) is None
+
+
+@pytest.mark.filterwarnings('ignore:The content argument')
+def test_guess_mimetype():
+ # guess by filename
+ assert guess_mimetype('img.png') == 'image/png'
+ assert guess_mimetype('img.jpg') == 'image/jpeg'
+ assert guess_mimetype('img.txt') is None
+ assert guess_mimetype('img.txt', default='text/plain') == 'text/plain'
+ assert guess_mimetype('no_extension') is None
+ assert guess_mimetype('IMG.PNG') == 'image/png'
+
+ # default parameter is used when no extension
+ assert guess_mimetype('img.png', 'text/plain') == 'image/png'
+ assert guess_mimetype('no_extension', 'text/plain') == 'text/plain'
+
+
+def test_get_image_extension():
+ assert get_image_extension('image/png') == '.png'
+ assert get_image_extension('image/jpeg') == '.jpg'
+ assert get_image_extension('image/svg+xml') == '.svg'
+ assert get_image_extension('text/plain') is None
+
+
+def test_parse_data_uri():
+ # standard case
+ uri = ("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4"
+ "//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")
+ image = parse_data_uri(uri)
+ assert image is not None
+ assert image.mimetype == 'image/png'
+ assert image.charset == 'US-ASCII'
+
+ # no mimetype
+ uri = ("data:charset=utf-8,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElE"
+ "QVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")
+ image = parse_data_uri(uri)
+ assert image is not None
+ assert image.mimetype == 'text/plain'
+ assert image.charset == 'utf-8'
+
+ # non data URI
+ uri = ("image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4"
+ "//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")
+ image = parse_data_uri(uri)
+ assert image is None
+
+ # invalid data URI (no properties)
+ uri = ("data:iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4"
+ "//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==")
+ with pytest.raises(ValueError, match=r'not enough values to unpack \(expected 2, got 1\)'):
+ parse_data_uri(uri)
diff --git a/tests/test_util_inspect.py b/tests/test_util_inspect.py
new file mode 100644
index 0000000..73f9656
--- /dev/null
+++ b/tests/test_util_inspect.py
@@ -0,0 +1,869 @@
+"""Tests util.inspect functions."""
+
+from __future__ import annotations
+
+import ast
+import datetime
+import enum
+import functools
+import sys
+import types
+from inspect import Parameter
+from typing import Callable, List, Optional, Union # NoQA: UP035
+
+import pytest
+
+from sphinx.util import inspect
+from sphinx.util.inspect import TypeAliasForwardRef, TypeAliasNamespace, stringify_signature
+from sphinx.util.typing import stringify_annotation
+
+
+class Base:
+ def meth(self):
+ pass
+
+ @staticmethod
+ def staticmeth():
+ pass
+
+ @classmethod
+ def classmeth(cls):
+ pass
+
+ @property
+ def prop(self):
+ pass
+
+ partialmeth = functools.partialmethod(meth)
+
+ async def coroutinemeth(self):
+ pass
+
+ partial_coroutinemeth = functools.partialmethod(coroutinemeth)
+
+ @classmethod
+ async def coroutineclassmeth(cls):
+ """A documented coroutine classmethod"""
+ pass
+
+
+class Inherited(Base):
+ pass
+
+
+def func():
+ pass
+
+
+async def coroutinefunc():
+ pass
+
+
+async def asyncgenerator():
+ yield
+
+partial_func = functools.partial(func)
+partial_coroutinefunc = functools.partial(coroutinefunc)
+
+builtin_func = print
+partial_builtin_func = functools.partial(print)
+
+
+class Descriptor:
+ def __get__(self, obj, typ=None):
+ pass
+
+
+class _Callable:
+ def __call__(self):
+ pass
+
+
+def _decorator(f):
+ @functools.wraps(f)
+ def wrapper():
+ return f()
+ return wrapper
+
+
+def test_TypeAliasForwardRef():
+ alias = TypeAliasForwardRef('example')
+ assert stringify_annotation(alias, 'fully-qualified-except-typing') == 'example'
+
+ alias = Optional[alias]
+ assert stringify_annotation(alias, 'fully-qualified-except-typing') == 'example | None'
+
+
+def test_TypeAliasNamespace():
+ import logging.config
+ type_alias = TypeAliasNamespace({'logging.Filter': 'MyFilter',
+ 'logging.Handler': 'MyHandler',
+ 'logging.handlers.SyslogHandler': 'MySyslogHandler'})
+
+ assert type_alias['logging'].Filter == 'MyFilter'
+ assert type_alias['logging'].Handler == 'MyHandler'
+ assert type_alias['logging'].handlers.SyslogHandler == 'MySyslogHandler'
+ assert type_alias['logging'].Logger == logging.Logger
+ assert type_alias['logging'].config == logging.config
+
+ with pytest.raises(KeyError):
+ assert type_alias['log']
+
+ with pytest.raises(KeyError):
+ assert type_alias['unknown']
+
+
+def test_signature():
+ # literals
+ with pytest.raises(TypeError):
+ inspect.signature(1)
+
+ with pytest.raises(TypeError):
+ inspect.signature('')
+
+ # builtins are supported on a case-by-case basis, depending on whether
+ # they define __text_signature__
+ if getattr(list, '__text_signature__', None):
+ sig = inspect.stringify_signature(inspect.signature(list))
+ assert sig == '(iterable=(), /)'
+ else:
+ with pytest.raises(ValueError, match='no signature found for builtin type'):
+ inspect.signature(list)
+ with pytest.raises(ValueError, match='no signature found for builtin type'):
+ inspect.signature(range)
+
+ # normal function
+ def func(a, b, c=1, d=2, *e, **f):
+ pass
+
+ sig = inspect.stringify_signature(inspect.signature(func))
+ assert sig == '(a, b, c=1, d=2, *e, **f)'
+
+
+def test_signature_partial():
+ def fun(a, b, c=1, d=2):
+ pass
+ p = functools.partial(fun, 10, c=11)
+
+ sig = inspect.signature(p)
+ assert stringify_signature(sig) == '(b, *, c=11, d=2)'
+
+
+def test_signature_methods():
+ class Foo:
+ def meth1(self, arg1, **kwargs):
+ pass
+
+ @classmethod
+ def meth2(cls, arg1, *args, **kwargs):
+ pass
+
+ @staticmethod
+ def meth3(arg1, *args, **kwargs):
+ pass
+
+ @functools.wraps(Foo().meth1)
+ def wrapped_bound_method(*args, **kwargs):
+ pass
+
+ # unbound method
+ sig = inspect.signature(Foo.meth1)
+ assert stringify_signature(sig) == '(self, arg1, **kwargs)'
+
+ sig = inspect.signature(Foo.meth1, bound_method=True)
+ assert stringify_signature(sig) == '(arg1, **kwargs)'
+
+ # bound method
+ sig = inspect.signature(Foo().meth1)
+ assert stringify_signature(sig) == '(arg1, **kwargs)'
+
+ # class method
+ sig = inspect.signature(Foo.meth2)
+ assert stringify_signature(sig) == '(arg1, *args, **kwargs)'
+
+ sig = inspect.signature(Foo().meth2)
+ assert stringify_signature(sig) == '(arg1, *args, **kwargs)'
+
+ # static method
+ sig = inspect.signature(Foo.meth3)
+ assert stringify_signature(sig) == '(arg1, *args, **kwargs)'
+
+ sig = inspect.signature(Foo().meth3)
+ assert stringify_signature(sig) == '(arg1, *args, **kwargs)'
+
+ # wrapped bound method
+ sig = inspect.signature(wrapped_bound_method)
+ assert stringify_signature(sig) == '(arg1, **kwargs)'
+
+
+def test_signature_partialmethod():
+ from functools import partialmethod
+
+ class Foo:
+ def meth1(self, arg1, arg2, arg3=None, arg4=None):
+ pass
+
+ def meth2(self, arg1, arg2):
+ pass
+
+ foo = partialmethod(meth1, 1, 2)
+ bar = partialmethod(meth1, 1, arg3=3)
+ baz = partialmethod(meth2, 1, 2)
+
+ subject = Foo()
+ sig = inspect.signature(subject.foo)
+ assert stringify_signature(sig) == '(arg3=None, arg4=None)'
+
+ sig = inspect.signature(subject.bar)
+ assert stringify_signature(sig) == '(arg2, *, arg3=3, arg4=None)'
+
+ sig = inspect.signature(subject.baz)
+ assert stringify_signature(sig) == '()'
+
+
+def test_signature_annotations():
+ from .typing_test_data import (
+ Node,
+ f0,
+ f1,
+ f2,
+ f3,
+ f4,
+ f5,
+ f6,
+ f7,
+ f8,
+ f9,
+ f10,
+ f11,
+ f12,
+ f13,
+ f14,
+ f15,
+ f16,
+ f17,
+ f18,
+ f19,
+ f20,
+ f21,
+ f22,
+ f23,
+ f24,
+ f25,
+ )
+
+ # Class annotations
+ sig = inspect.signature(f0)
+ assert stringify_signature(sig) == '(x: int, y: numbers.Integral) -> None'
+
+ # Generic types with concrete parameters
+ sig = inspect.signature(f1)
+ assert stringify_signature(sig) == '(x: list[int]) -> typing.List[int]'
+
+ # TypeVars and generic types with TypeVars
+ sig = inspect.signature(f2)
+ assert stringify_signature(sig) == ('(x: typing.List[tests.typing_test_data.T],'
+ ' y: typing.List[tests.typing_test_data.T_co],'
+ ' z: tests.typing_test_data.T'
+ ') -> typing.List[tests.typing_test_data.T_contra]')
+
+ # Union types
+ sig = inspect.signature(f3)
+ assert stringify_signature(sig) == '(x: str | numbers.Integral) -> None'
+
+ # Quoted annotations
+ sig = inspect.signature(f4)
+ assert stringify_signature(sig) == '(x: str, y: str) -> None'
+
+ # Keyword-only arguments
+ sig = inspect.signature(f5)
+ assert stringify_signature(sig) == '(x: int, *, y: str, z: str) -> None'
+
+ # Keyword-only arguments with varargs
+ sig = inspect.signature(f6)
+ assert stringify_signature(sig) == '(x: int, *args, y: str, z: str) -> None'
+
+ # Space around '=' for defaults
+ sig = inspect.signature(f7)
+ if sys.version_info[:2] <= (3, 10):
+ assert stringify_signature(sig) == '(x: int | None = None, y: dict = {}) -> None'
+ else:
+ assert stringify_signature(sig) == '(x: int = None, y: dict = {}) -> None'
+
+ # Callable types
+ sig = inspect.signature(f8)
+ assert stringify_signature(sig) == '(x: typing.Callable[[int, str], int]) -> None'
+
+ sig = inspect.signature(f9)
+ assert stringify_signature(sig) == '(x: typing.Callable) -> None'
+
+ # Tuple types
+ sig = inspect.signature(f10)
+ assert stringify_signature(sig) == '(x: typing.Tuple[int, str], y: typing.Tuple[int, ...]) -> None'
+
+ # Instance annotations
+ sig = inspect.signature(f11)
+ assert stringify_signature(sig) == '(x: CustomAnnotation, y: 123) -> None'
+
+ # tuple with more than two items
+ sig = inspect.signature(f12)
+ assert stringify_signature(sig) == '() -> typing.Tuple[int, str, int]'
+
+ # optional
+ sig = inspect.signature(f13)
+ assert stringify_signature(sig) == '() -> str | None'
+
+ # optional union
+ sig = inspect.signature(f20)
+ assert stringify_signature(sig) in ('() -> int | str | None',
+ '() -> str | int | None')
+
+ # Any
+ sig = inspect.signature(f14)
+ assert stringify_signature(sig) == '() -> typing.Any'
+
+ # ForwardRef
+ sig = inspect.signature(f15)
+ assert stringify_signature(sig) == '(x: Unknown, y: int) -> typing.Any'
+
+ # keyword only arguments (1)
+ sig = inspect.signature(f16)
+ assert stringify_signature(sig) == '(arg1, arg2, *, arg3=None, arg4=None)'
+
+ # keyword only arguments (2)
+ sig = inspect.signature(f17)
+ assert stringify_signature(sig) == '(*, arg3, arg4)'
+
+ sig = inspect.signature(f18)
+ assert stringify_signature(sig) == ('(self, arg1: int | typing.Tuple = 10) -> '
+ 'typing.List[typing.Dict]')
+
+ # annotations for variadic and keyword parameters
+ sig = inspect.signature(f19)
+ assert stringify_signature(sig) == '(*args: int, **kwargs: str)'
+
+ # default value is inspect.Signature.empty
+ sig = inspect.signature(f21)
+ assert stringify_signature(sig) == "(arg1='whatever', arg2)"
+
+ # type hints by string
+ sig = inspect.signature(Node.children)
+ assert stringify_signature(sig) == '(self) -> typing.List[tests.typing_test_data.Node]'
+
+ sig = inspect.signature(Node.__init__)
+ assert stringify_signature(sig) == '(self, parent: tests.typing_test_data.Node | None) -> None'
+
+ # show_annotation is False
+ sig = inspect.signature(f7)
+ assert stringify_signature(sig, show_annotation=False) == '(x=None, y={})'
+
+ # show_return_annotation is False
+ sig = inspect.signature(f7)
+ if sys.version_info[:2] <= (3, 10):
+ assert stringify_signature(sig, show_return_annotation=False) == '(x: int | None = None, y: dict = {})'
+ else:
+ assert stringify_signature(sig, show_return_annotation=False) == '(x: int = None, y: dict = {})'
+
+ # unqualified_typehints is True
+ sig = inspect.signature(f7)
+ if sys.version_info[:2] <= (3, 10):
+ assert stringify_signature(sig, unqualified_typehints=True) == '(x: int | None = None, y: dict = {}) -> None'
+ else:
+ assert stringify_signature(sig, unqualified_typehints=True) == '(x: int = None, y: dict = {}) -> None'
+
+ # case: separator at head
+ sig = inspect.signature(f22)
+ assert stringify_signature(sig) == '(*, a, b)'
+
+ # case: separator in the middle
+ sig = inspect.signature(f23)
+ assert stringify_signature(sig) == '(a, b, /, c, d)'
+
+ sig = inspect.signature(f24)
+ assert stringify_signature(sig) == '(a, /, *, b)'
+
+ # case: separator at tail
+ sig = inspect.signature(f25)
+ assert stringify_signature(sig) == '(a, b, /)'
+
+
+def test_signature_from_str_basic():
+ signature = '(a, b, *args, c=0, d="blah", **kwargs)'
+ sig = inspect.signature_from_str(signature)
+ assert list(sig.parameters.keys()) == ['a', 'b', 'args', 'c', 'd', 'kwargs']
+ assert sig.parameters['a'].name == 'a'
+ assert sig.parameters['a'].kind == Parameter.POSITIONAL_OR_KEYWORD
+ assert sig.parameters['a'].default == Parameter.empty
+ assert sig.parameters['a'].annotation == Parameter.empty
+ assert sig.parameters['b'].name == 'b'
+ assert sig.parameters['b'].kind == Parameter.POSITIONAL_OR_KEYWORD
+ assert sig.parameters['b'].default == Parameter.empty
+ assert sig.parameters['b'].annotation == Parameter.empty
+ assert sig.parameters['args'].name == 'args'
+ assert sig.parameters['args'].kind == Parameter.VAR_POSITIONAL
+ assert sig.parameters['args'].default == Parameter.empty
+ assert sig.parameters['args'].annotation == Parameter.empty
+ assert sig.parameters['c'].name == 'c'
+ assert sig.parameters['c'].kind == Parameter.KEYWORD_ONLY
+ assert sig.parameters['c'].default == '0'
+ assert sig.parameters['c'].annotation == Parameter.empty
+ assert sig.parameters['d'].name == 'd'
+ assert sig.parameters['d'].kind == Parameter.KEYWORD_ONLY
+ assert sig.parameters['d'].default == "'blah'"
+ assert sig.parameters['d'].annotation == Parameter.empty
+ assert sig.parameters['kwargs'].name == 'kwargs'
+ assert sig.parameters['kwargs'].kind == Parameter.VAR_KEYWORD
+ assert sig.parameters['kwargs'].default == Parameter.empty
+ assert sig.parameters['kwargs'].annotation == Parameter.empty
+ assert sig.return_annotation == Parameter.empty
+
+
+def test_signature_from_str_default_values():
+ signature = ('(a=0, b=0.0, c="str", d=b"bytes", e=..., f=True, '
+ 'g=[1, 2, 3], h={"a": 1}, i={1, 2, 3}, '
+ 'j=lambda x, y: None, k=None, l=object(), m=foo.bar.CONSTANT)')
+ sig = inspect.signature_from_str(signature)
+ assert sig.parameters['a'].default == '0'
+ assert sig.parameters['b'].default == '0.0'
+ assert sig.parameters['c'].default == "'str'"
+ assert sig.parameters['d'].default == "b'bytes'"
+ assert sig.parameters['e'].default == '...'
+ assert sig.parameters['f'].default == 'True'
+ assert sig.parameters['g'].default == '[1, 2, 3]'
+ assert sig.parameters['h'].default == "{'a': 1}"
+ assert sig.parameters['i'].default == '{1, 2, 3}'
+ assert sig.parameters['j'].default == 'lambda x, y: ...'
+ assert sig.parameters['k'].default == 'None'
+ assert sig.parameters['l'].default == 'object()'
+ assert sig.parameters['m'].default == 'foo.bar.CONSTANT'
+
+
+def test_signature_from_str_annotations():
+ signature = '(a: int, *args: bytes, b: str = "blah", **kwargs: float) -> None'
+ sig = inspect.signature_from_str(signature)
+ assert list(sig.parameters.keys()) == ['a', 'args', 'b', 'kwargs']
+ assert sig.parameters['a'].annotation == "int"
+ assert sig.parameters['args'].annotation == "bytes"
+ assert sig.parameters['b'].annotation == "str"
+ assert sig.parameters['kwargs'].annotation == "float"
+ assert sig.return_annotation == 'None'
+
+
+def test_signature_from_str_complex_annotations():
+ sig = inspect.signature_from_str('() -> Tuple[str, int, ...]')
+ assert sig.return_annotation == 'Tuple[str, int, ...]'
+
+ sig = inspect.signature_from_str('() -> Callable[[int, int], int]')
+ assert sig.return_annotation == 'Callable[[int, int], int]'
+
+
+def test_signature_from_str_kwonly_args():
+ sig = inspect.signature_from_str('(a, *, b)')
+ assert list(sig.parameters.keys()) == ['a', 'b']
+ assert sig.parameters['a'].kind == Parameter.POSITIONAL_OR_KEYWORD
+ assert sig.parameters['a'].default == Parameter.empty
+ assert sig.parameters['b'].kind == Parameter.KEYWORD_ONLY
+ assert sig.parameters['b'].default == Parameter.empty
+
+
+def test_signature_from_str_positionaly_only_args():
+ sig = inspect.signature_from_str('(a, b=0, /, c=1)')
+ assert list(sig.parameters.keys()) == ['a', 'b', 'c']
+ assert sig.parameters['a'].kind == Parameter.POSITIONAL_ONLY
+ assert sig.parameters['a'].default == Parameter.empty
+ assert sig.parameters['b'].kind == Parameter.POSITIONAL_ONLY
+ assert sig.parameters['b'].default == '0'
+ assert sig.parameters['c'].kind == Parameter.POSITIONAL_OR_KEYWORD
+ assert sig.parameters['c'].default == '1'
+
+
+def test_signature_from_str_invalid():
+ with pytest.raises(SyntaxError):
+ inspect.signature_from_str('')
+
+
+def test_signature_from_ast():
+ signature = 'def func(a, b, *args, c=0, d="blah", **kwargs): pass'
+ tree = ast.parse(signature)
+ sig = inspect.signature_from_ast(tree.body[0])
+ assert list(sig.parameters.keys()) == ['a', 'b', 'args', 'c', 'd', 'kwargs']
+ assert sig.parameters['a'].name == 'a'
+ assert sig.parameters['a'].kind == Parameter.POSITIONAL_OR_KEYWORD
+ assert sig.parameters['a'].default == Parameter.empty
+ assert sig.parameters['a'].annotation == Parameter.empty
+ assert sig.parameters['b'].name == 'b'
+ assert sig.parameters['b'].kind == Parameter.POSITIONAL_OR_KEYWORD
+ assert sig.parameters['b'].default == Parameter.empty
+ assert sig.parameters['b'].annotation == Parameter.empty
+ assert sig.parameters['args'].name == 'args'
+ assert sig.parameters['args'].kind == Parameter.VAR_POSITIONAL
+ assert sig.parameters['args'].default == Parameter.empty
+ assert sig.parameters['args'].annotation == Parameter.empty
+ assert sig.parameters['c'].name == 'c'
+ assert sig.parameters['c'].kind == Parameter.KEYWORD_ONLY
+ assert sig.parameters['c'].default == '0'
+ assert sig.parameters['c'].annotation == Parameter.empty
+ assert sig.parameters['d'].name == 'd'
+ assert sig.parameters['d'].kind == Parameter.KEYWORD_ONLY
+ assert sig.parameters['d'].default == "'blah'"
+ assert sig.parameters['d'].annotation == Parameter.empty
+ assert sig.parameters['kwargs'].name == 'kwargs'
+ assert sig.parameters['kwargs'].kind == Parameter.VAR_KEYWORD
+ assert sig.parameters['kwargs'].default == Parameter.empty
+ assert sig.parameters['kwargs'].annotation == Parameter.empty
+ assert sig.return_annotation == Parameter.empty
+
+
+def test_safe_getattr_with_default():
+ class Foo:
+ def __getattr__(self, item):
+ raise Exception
+
+ obj = Foo()
+
+ result = inspect.safe_getattr(obj, 'bar', 'baz')
+
+ assert result == 'baz'
+
+
+def test_safe_getattr_with_exception():
+ class Foo:
+ def __getattr__(self, item):
+ raise Exception
+
+ obj = Foo()
+
+ with pytest.raises(AttributeError, match='bar'):
+ inspect.safe_getattr(obj, 'bar')
+
+
+def test_safe_getattr_with_property_exception():
+ class Foo:
+ @property
+ def bar(self):
+ raise Exception
+
+ obj = Foo()
+
+ with pytest.raises(AttributeError, match='bar'):
+ inspect.safe_getattr(obj, 'bar')
+
+
+def test_safe_getattr_with___dict___override():
+ class Foo:
+ @property
+ def __dict__(self):
+ raise Exception
+
+ obj = Foo()
+
+ with pytest.raises(AttributeError, match='bar'):
+ inspect.safe_getattr(obj, 'bar')
+
+
+def test_dictionary_sorting():
+ dictionary = {"c": 3, "a": 1, "d": 2, "b": 4}
+ description = inspect.object_description(dictionary)
+ assert description == "{'a': 1, 'b': 4, 'c': 3, 'd': 2}"
+
+
+def test_set_sorting():
+ set_ = set("gfedcba")
+ description = inspect.object_description(set_)
+ assert description == "{'a', 'b', 'c', 'd', 'e', 'f', 'g'}"
+
+
+def test_set_sorting_enum():
+ class MyEnum(enum.Enum):
+ a = 1
+ b = 2
+ c = 3
+
+ set_ = set(MyEnum)
+ description = inspect.object_description(set_)
+ assert description == "{MyEnum.a, MyEnum.b, MyEnum.c}"
+
+
+def test_set_sorting_fallback():
+ set_ = {None, 1}
+ description = inspect.object_description(set_)
+ assert description == "{1, None}"
+
+
+def test_deterministic_nested_collection_descriptions():
+ # sortable
+ assert inspect.object_description([{1, 2, 3, 10}]) == "[{1, 2, 3, 10}]"
+ assert inspect.object_description(({1, 2, 3, 10},)) == "({1, 2, 3, 10},)"
+ # non-sortable (elements of varying datatype)
+ assert inspect.object_description([{None, 1}]) == "[{1, None}]"
+ assert inspect.object_description(({None, 1},)) == "({1, None},)"
+ assert inspect.object_description([{None, 1, 'A'}]) == "[{'A', 1, None}]"
+ assert inspect.object_description(({None, 1, 'A'},)) == "({'A', 1, None},)"
+
+
+def test_frozenset_sorting():
+ frozenset_ = frozenset("gfedcba")
+ description = inspect.object_description(frozenset_)
+ assert description == "frozenset({'a', 'b', 'c', 'd', 'e', 'f', 'g'})"
+
+
+def test_frozenset_sorting_fallback():
+ frozenset_ = frozenset((None, 1))
+ description = inspect.object_description(frozenset_)
+ assert description == "frozenset({1, None})"
+
+
+def test_nested_tuple_sorting():
+ tuple_ = ({"c", "b", "a"},) # nb. trailing comma
+ description = inspect.object_description(tuple_)
+ assert description == "({'a', 'b', 'c'},)"
+
+ tuple_ = ({"c", "b", "a"}, {"f", "e", "d"})
+ description = inspect.object_description(tuple_)
+ assert description == "({'a', 'b', 'c'}, {'d', 'e', 'f'})"
+
+
+def test_recursive_collection_description():
+ dict_a_, dict_b_ = {"a": 1}, {"b": 2}
+ dict_a_["link"], dict_b_["link"] = dict_b_, dict_a_
+ description_a, description_b = (
+ inspect.object_description(dict_a_),
+ inspect.object_description(dict_b_),
+ )
+ assert description_a == "{'a': 1, 'link': {'b': 2, 'link': dict(...)}}"
+ assert description_b == "{'b': 2, 'link': {'a': 1, 'link': dict(...)}}"
+
+ list_c_, list_d_ = [1, 2, 3, 4], [5, 6, 7, 8]
+ list_c_.append(list_d_)
+ list_d_.append(list_c_)
+ description_c, description_d = (
+ inspect.object_description(list_c_),
+ inspect.object_description(list_d_),
+ )
+
+ assert description_c == "[1, 2, 3, 4, [5, 6, 7, 8, list(...)]]"
+ assert description_d == "[5, 6, 7, 8, [1, 2, 3, 4, list(...)]]"
+
+
+def test_dict_customtype():
+ class CustomType:
+ def __init__(self, value):
+ self._value = value
+
+ def __repr__(self):
+ return "<CustomType(%r)>" % self._value
+
+ dictionary = {CustomType(2): 2, CustomType(1): 1}
+ description = inspect.object_description(dictionary)
+ # Type is unsortable, just check that it does not crash
+ assert "<CustomType(2)>: 2" in description
+
+
+def test_object_description_enum():
+ class MyEnum(enum.Enum):
+ FOO = 1
+ BAR = 2
+
+ assert inspect.object_description(MyEnum.FOO) == "MyEnum.FOO"
+
+
+def test_getslots():
+ class Foo:
+ pass
+
+ class Bar:
+ __slots__ = ['attr']
+
+ class Baz:
+ __slots__ = {'attr': 'docstring'}
+
+ class Qux:
+ __slots__ = 'attr'
+
+ assert inspect.getslots(Foo) is None
+ assert inspect.getslots(Bar) == {'attr': None}
+ assert inspect.getslots(Baz) == {'attr': 'docstring'}
+ assert inspect.getslots(Qux) == {'attr': None}
+
+ with pytest.raises(TypeError):
+ inspect.getslots(Bar())
+
+
+def test_isclassmethod():
+ assert inspect.isclassmethod(Base.classmeth) is True
+ assert inspect.isclassmethod(Base.meth) is False
+ assert inspect.isclassmethod(Inherited.classmeth) is True
+ assert inspect.isclassmethod(Inherited.meth) is False
+
+
+def test_isstaticmethod():
+ assert inspect.isstaticmethod(Base.staticmeth, Base, 'staticmeth') is True
+ assert inspect.isstaticmethod(Base.meth, Base, 'meth') is False
+ assert inspect.isstaticmethod(Inherited.staticmeth, Inherited, 'staticmeth') is True
+ assert inspect.isstaticmethod(Inherited.meth, Inherited, 'meth') is False
+
+
+def test_iscoroutinefunction():
+ assert inspect.iscoroutinefunction(func) is False # function
+ assert inspect.iscoroutinefunction(coroutinefunc) is True # coroutine
+ assert inspect.iscoroutinefunction(partial_coroutinefunc) is True # partial-ed coroutine
+ assert inspect.iscoroutinefunction(Base.meth) is False # method
+ assert inspect.iscoroutinefunction(Base.coroutinemeth) is True # coroutine-method
+ assert inspect.iscoroutinefunction(Base.__dict__["coroutineclassmeth"]) is True # coroutine classmethod
+
+ # partial-ed coroutine-method
+ partial_coroutinemeth = Base.__dict__['partial_coroutinemeth']
+ assert inspect.iscoroutinefunction(partial_coroutinemeth) is True
+
+
+def test_iscoroutinefunction_wrapped():
+ # function wrapping a callable obj
+ assert inspect.isfunction(_decorator(coroutinefunc)) is True
+
+
+def test_isfunction():
+ assert inspect.isfunction(func) is True # function
+ assert inspect.isfunction(partial_func) is True # partial-ed function
+ assert inspect.isfunction(Base.meth) is True # method of class
+ assert inspect.isfunction(Base.partialmeth) is True # partial-ed method of class
+ assert inspect.isfunction(Base().meth) is False # method of instance
+ assert inspect.isfunction(builtin_func) is False # builtin function
+ assert inspect.isfunction(partial_builtin_func) is False # partial-ed builtin function
+
+
+def test_isfunction_wrapped():
+ # function wrapping a callable obj
+ assert inspect.isfunction(_decorator(_Callable())) is True
+
+
+def test_isbuiltin():
+ assert inspect.isbuiltin(builtin_func) is True # builtin function
+ assert inspect.isbuiltin(partial_builtin_func) is True # partial-ed builtin function
+ assert inspect.isbuiltin(func) is False # function
+ assert inspect.isbuiltin(partial_func) is False # partial-ed function
+ assert inspect.isbuiltin(Base.meth) is False # method of class
+ assert inspect.isbuiltin(Base().meth) is False # method of instance
+
+
+def test_isdescriptor():
+ assert inspect.isdescriptor(Base.prop) is True # property of class
+ assert inspect.isdescriptor(Base().prop) is False # property of instance
+ assert inspect.isdescriptor(Base.meth) is True # method of class
+ assert inspect.isdescriptor(Base().meth) is True # method of instance
+ assert inspect.isdescriptor(func) is True # function
+
+
+def test_isattributedescriptor():
+ assert inspect.isattributedescriptor(Base.prop) is True # property
+ assert inspect.isattributedescriptor(Base.meth) is False # method
+ assert inspect.isattributedescriptor(Base.staticmeth) is False # staticmethod
+ assert inspect.isattributedescriptor(Base.classmeth) is False # classmetho
+ assert inspect.isattributedescriptor(Descriptor) is False # custom descriptor class
+ assert inspect.isattributedescriptor(str.join) is False # MethodDescriptorType
+ assert inspect.isattributedescriptor(object.__init__) is False # WrapperDescriptorType
+ assert inspect.isattributedescriptor(dict.__dict__['fromkeys']) is False # ClassMethodDescriptorType
+ assert inspect.isattributedescriptor(types.FrameType.f_locals) is True # GetSetDescriptorType
+ assert inspect.isattributedescriptor(datetime.timedelta.days) is True # MemberDescriptorType
+
+ try:
+ # _testcapi module cannot be importable in some distro
+ # refs: https://github.com/sphinx-doc/sphinx/issues/9868
+ import _testcapi
+
+ testinstancemethod = _testcapi.instancemethod(str.__repr__)
+ assert inspect.isattributedescriptor(testinstancemethod) is False # instancemethod (C-API)
+ except ImportError:
+ pass
+
+
+def test_isproperty():
+ assert inspect.isproperty(Base.prop) is True # property of class
+ assert inspect.isproperty(Base().prop) is False # property of instance
+ assert inspect.isproperty(Base.meth) is False # method of class
+ assert inspect.isproperty(Base().meth) is False # method of instance
+ assert inspect.isproperty(func) is False # function
+
+
+def test_isgenericalias():
+ #: A list of int
+ T = List[int] # NoQA: UP006
+ S = list[Union[str, None]]
+
+ C = Callable[[int], None] # a generic alias not having a doccomment
+
+ assert inspect.isgenericalias(C) is True
+ assert inspect.isgenericalias(Callable) is True
+ assert inspect.isgenericalias(T) is True
+ assert inspect.isgenericalias(List) is True # NoQA: UP006
+ assert inspect.isgenericalias(S) is True
+ assert inspect.isgenericalias(list) is False
+ assert inspect.isgenericalias([]) is False
+ assert inspect.isgenericalias(object()) is False
+ assert inspect.isgenericalias(Base) is False
+
+
+def test_unpartial():
+ def func1(a, b, c):
+ pass
+
+ func2 = functools.partial(func1, 1)
+ func2.__doc__ = "func2"
+ func3 = functools.partial(func2, 2) # nested partial object
+
+ assert inspect.unpartial(func2) is func1
+ assert inspect.unpartial(func3) is func1
+
+
+def test_getdoc_inherited_classmethod():
+ class Foo:
+ @classmethod
+ def meth(self):
+ """
+ docstring
+ indented text
+ """
+
+ class Bar(Foo):
+ @classmethod
+ def meth(self):
+ # inherited classmethod
+ pass
+
+ assert inspect.getdoc(Bar.meth, getattr, False, Bar, "meth") is None
+ assert inspect.getdoc(Bar.meth, getattr, True, Bar, "meth") == Foo.meth.__doc__
+
+
+def test_getdoc_inherited_decorated_method():
+ class Foo:
+ def meth(self):
+ """
+ docstring
+ indented text
+ """
+
+ class Bar(Foo):
+ @functools.lru_cache # noqa: B019
+ def meth(self):
+ # inherited and decorated method
+ pass
+
+ assert inspect.getdoc(Bar.meth, getattr, False, Bar, "meth") is None
+ assert inspect.getdoc(Bar.meth, getattr, True, Bar, "meth") == Foo.meth.__doc__
+
+
+def test_is_builtin_class_method():
+ class MyInt(int):
+ def my_method(self):
+ pass
+
+ assert inspect.is_builtin_class_method(MyInt, 'to_bytes')
+ assert inspect.is_builtin_class_method(MyInt, '__init__')
+ assert not inspect.is_builtin_class_method(MyInt, 'my_method')
+ assert not inspect.is_builtin_class_method(MyInt, 'does_not_exist')
+ assert not inspect.is_builtin_class_method(4, 'still does not crash')
+
+ class ObjectWithMroAttr:
+ def __init__(self, mro_attr):
+ self.__mro__ = mro_attr
+
+ assert not inspect.is_builtin_class_method(ObjectWithMroAttr([1, 2, 3]), 'still does not crash')
diff --git a/tests/test_util_inventory.py b/tests/test_util_inventory.py
new file mode 100644
index 0000000..2c20763
--- /dev/null
+++ b/tests/test_util_inventory.py
@@ -0,0 +1,116 @@
+"""Test inventory util functions."""
+import os
+import posixpath
+import zlib
+from io import BytesIO
+
+from sphinx.testing.util import SphinxTestApp
+from sphinx.util.inventory import InventoryFile
+
+inventory_v1 = b'''\
+# Sphinx inventory version 1
+# Project: foo
+# Version: 1.0
+module mod foo.html
+module.cls class foo.html
+'''
+
+inventory_v2 = b'''\
+# Sphinx inventory version 2
+# Project: foo
+# Version: 2.0
+# The remainder of this file is compressed with zlib.
+''' + zlib.compress(b'''\
+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#$ -
+module1.Foo.bar py:method 1 index.html#foo.Bar.baz -
+CFunc c:function 2 cfunc.html#CFunc -
+std cpp:type 1 index.html#std -
+std::uint8_t cpp:type 1 index.html#std_uint8_t -
+foo::Bar cpp:class 1 index.html#cpp_foo_bar -
+foo::Bar::baz cpp:function 1 index.html#cpp_foo_bar_baz -
+foons cpp:type 1 index.html#foons -
+foons::bartype cpp:type 1 index.html#foons_bartype -
+a term std:term -1 glossary.html#term-a-term -
+ls.-l std:cmdoption 1 index.html#cmdoption-ls-l -
+docname std:doc -1 docname.html -
+foo js:module 1 index.html#foo -
+foo.bar js:class 1 index.html#foo.bar -
+foo.bar.baz js:method 1 index.html#foo.bar.baz -
+foo.bar.qux js:data 1 index.html#foo.bar.qux -
+a term including:colon std:term -1 glossary.html#term-a-term-including-colon -
+''')
+
+inventory_v2_not_having_version = b'''\
+# Sphinx inventory version 2
+# Project: foo
+# Version:
+# The remainder of this file is compressed with zlib.
+''' + zlib.compress(b'''\
+module1 py:module 0 foo.html#module-module1 Long Module desc
+''')
+
+
+def test_read_inventory_v1():
+ f = BytesIO(inventory_v1)
+ invdata = InventoryFile.load(f, '/util', posixpath.join)
+ assert invdata['py:module']['module'] == \
+ ('foo', '1.0', '/util/foo.html#module-module', '-')
+ assert invdata['py:class']['module.cls'] == \
+ ('foo', '1.0', '/util/foo.html#module.cls', '-')
+
+
+def test_read_inventory_v2():
+ f = BytesIO(inventory_v2)
+ invdata = InventoryFile.load(f, '/util', posixpath.join)
+
+ assert len(invdata['py:module']) == 2
+ assert invdata['py:module']['module1'] == \
+ ('foo', '2.0', '/util/foo.html#module-module1', 'Long Module desc')
+ assert invdata['py:module']['module2'] == \
+ ('foo', '2.0', '/util/foo.html#module-module2', '-')
+ assert invdata['py:function']['module1.func'][2] == \
+ '/util/sub/foo.html#module1.func'
+ assert invdata['c:function']['CFunc'][2] == '/util/cfunc.html#CFunc'
+ assert invdata['std:term']['a term'][2] == \
+ '/util/glossary.html#term-a-term'
+ assert invdata['std:term']['a term including:colon'][2] == \
+ '/util/glossary.html#term-a-term-including-colon'
+
+
+def test_read_inventory_v2_not_having_version():
+ f = BytesIO(inventory_v2_not_having_version)
+ invdata = InventoryFile.load(f, '/util', posixpath.join)
+ assert invdata['py:module']['module1'] == \
+ ('foo', '', '/util/foo.html#module-module1', 'Long Module desc')
+
+
+def _write_appconfig(dir, language, prefix=None):
+ prefix = prefix or language
+ os.makedirs(dir / prefix, exist_ok=True)
+ (dir / prefix / 'conf.py').write_text(f'language = "{language}"', encoding='utf8')
+ (dir / prefix / 'index.rst').write_text('index.rst', encoding='utf8')
+ assert sorted(os.listdir(dir / prefix)) == ['conf.py', 'index.rst']
+ assert (dir / prefix / 'index.rst').exists()
+ return dir / prefix
+
+
+def _build_inventory(srcdir):
+ app = SphinxTestApp(srcdir=srcdir)
+ app.build()
+ app.cleanup()
+ return (app.outdir / 'objects.inv')
+
+
+def test_inventory_localization(tmp_path):
+ # Build an app using Estonian (EE) locale
+ srcdir_et = _write_appconfig(tmp_path, "et")
+ inventory_et = _build_inventory(srcdir_et)
+
+ # Build the same app using English (US) locale
+ srcdir_en = _write_appconfig(tmp_path, "en")
+ inventory_en = _build_inventory(srcdir_en)
+
+ # Ensure that the inventory contents differ
+ assert inventory_et.read_bytes() != inventory_en.read_bytes()
diff --git a/tests/test_util_logging.py b/tests/test_util_logging.py
new file mode 100644
index 0000000..4d506a8
--- /dev/null
+++ b/tests/test_util_logging.py
@@ -0,0 +1,398 @@
+"""Test logging util."""
+
+import codecs
+import os
+import os.path
+
+import pytest
+from docutils import nodes
+
+from sphinx.errors import SphinxWarning
+from sphinx.testing.util import strip_escseq
+from sphinx.util import logging, osutil
+from sphinx.util.console import colorize
+from sphinx.util.logging import is_suppressed_warning, prefixed_warnings
+from sphinx.util.parallel import ParallelTasks
+
+
+def test_info_and_warning(app, status, warning):
+ app.verbosity = 2
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.debug('message1')
+ logger.info('message2')
+ logger.warning('message3')
+ logger.critical('message4')
+ logger.error('message5')
+
+ assert 'message1' in status.getvalue()
+ assert 'message2' in status.getvalue()
+ assert 'message3' not in status.getvalue()
+ assert 'message4' not in status.getvalue()
+ assert 'message5' not in status.getvalue()
+
+ assert 'message1' not in warning.getvalue()
+ assert 'message2' not in warning.getvalue()
+ assert 'WARNING: message3' in warning.getvalue()
+ assert 'CRITICAL: message4' in warning.getvalue()
+ assert 'ERROR: message5' in warning.getvalue()
+
+
+def test_Exception(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.info(Exception)
+ assert "<class 'Exception'>" in status.getvalue()
+
+
+def test_verbosity_filter(app, status, warning):
+ # verbosity = 0: INFO
+ app.verbosity = 0
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.info('message1')
+ logger.verbose('message2')
+ logger.debug('message3')
+
+ assert 'message1' in status.getvalue()
+ assert 'message2' not in status.getvalue()
+ assert 'message3' not in status.getvalue()
+ assert 'message4' not in status.getvalue()
+
+ # verbosity = 1: VERBOSE
+ app.verbosity = 1
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.info('message1')
+ logger.verbose('message2')
+ logger.debug('message3')
+
+ assert 'message1' in status.getvalue()
+ assert 'message2' in status.getvalue()
+ assert 'message3' not in status.getvalue()
+ assert 'message4' not in status.getvalue()
+
+ # verbosity = 2: DEBUG
+ app.verbosity = 2
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.info('message1')
+ logger.verbose('message2')
+ logger.debug('message3')
+
+ assert 'message1' in status.getvalue()
+ assert 'message2' in status.getvalue()
+ assert 'message3' in status.getvalue()
+ assert 'message4' not in status.getvalue()
+
+
+def test_nonl_info_log(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.info('message1', nonl=True)
+ logger.info('message2')
+ logger.info('message3')
+
+ assert 'message1message2\nmessage3' in status.getvalue()
+
+
+def test_once_warning_log(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.warning('message: %d', 1, once=True)
+ logger.warning('message: %d', 1, once=True)
+ logger.warning('message: %d', 2, once=True)
+
+ assert 'WARNING: message: 1\nWARNING: message: 2\n' in strip_escseq(warning.getvalue())
+
+
+def test_is_suppressed_warning():
+ suppress_warnings = ["ref", "files.*", "rest.duplicated_labels"]
+
+ assert is_suppressed_warning(None, None, suppress_warnings) is False
+ assert is_suppressed_warning("ref", None, suppress_warnings) is True
+ assert is_suppressed_warning("ref", "numref", suppress_warnings) is True
+ assert is_suppressed_warning("ref", "option", suppress_warnings) is True
+ assert is_suppressed_warning("files", "image", suppress_warnings) is True
+ assert is_suppressed_warning("files", "stylesheet", suppress_warnings) is True
+ assert is_suppressed_warning("rest", None, suppress_warnings) is False
+ assert is_suppressed_warning("rest", "syntax", suppress_warnings) is False
+ assert is_suppressed_warning("rest", "duplicated_labels", suppress_warnings) is True
+
+
+def test_suppress_warnings(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ app._warncount = 0 # force reset
+
+ app.config.suppress_warnings = []
+ warning.truncate(0)
+ logger.warning('message0', type='test')
+ logger.warning('message1', type='test', subtype='logging')
+ logger.warning('message2', type='test', subtype='crash')
+ logger.warning('message3', type='actual', subtype='logging')
+ assert 'message0' in warning.getvalue()
+ assert 'message1' in warning.getvalue()
+ assert 'message2' in warning.getvalue()
+ assert 'message3' in warning.getvalue()
+ assert app._warncount == 4
+
+ app.config.suppress_warnings = ['test']
+ warning.truncate(0)
+ logger.warning('message0', type='test')
+ logger.warning('message1', type='test', subtype='logging')
+ logger.warning('message2', type='test', subtype='crash')
+ logger.warning('message3', type='actual', subtype='logging')
+ assert 'message0' not in warning.getvalue()
+ assert 'message1' not in warning.getvalue()
+ assert 'message2' not in warning.getvalue()
+ assert 'message3' in warning.getvalue()
+ assert app._warncount == 5
+
+ app.config.suppress_warnings = ['test.logging']
+ warning.truncate(0)
+ logger.warning('message0', type='test')
+ logger.warning('message1', type='test', subtype='logging')
+ logger.warning('message2', type='test', subtype='crash')
+ logger.warning('message3', type='actual', subtype='logging')
+ assert 'message0' in warning.getvalue()
+ assert 'message1' not in warning.getvalue()
+ assert 'message2' in warning.getvalue()
+ assert 'message3' in warning.getvalue()
+ assert app._warncount == 8
+
+
+def test_warningiserror(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ # if False, warning is not error
+ app.warningiserror = False
+ logger.warning('message')
+
+ # if True, warning raises SphinxWarning exception
+ app.warningiserror = True
+ with pytest.raises(SphinxWarning):
+ logger.warning('message: %s', 'arg')
+
+ # message contains format string (refs: #4070)
+ with pytest.raises(SphinxWarning):
+ logger.warning('%s')
+
+
+def test_info_location(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.info('message1', location='index')
+ assert 'index.txt: message1' in status.getvalue()
+
+ logger.info('message2', location=('index', 10))
+ assert 'index.txt:10: message2' in status.getvalue()
+
+ logger.info('message3', location=None)
+ assert '\nmessage3' in status.getvalue()
+
+ node = nodes.Node()
+ node.source, node.line = ('index.txt', 10)
+ logger.info('message4', location=node)
+ assert 'index.txt:10: message4' in status.getvalue()
+
+ node.source, node.line = ('index.txt', None)
+ logger.info('message5', location=node)
+ assert 'index.txt:: message5' in status.getvalue()
+
+ node.source, node.line = (None, 10)
+ logger.info('message6', location=node)
+ assert '<unknown>:10: message6' in status.getvalue()
+
+ node.source, node.line = (None, None)
+ logger.info('message7', location=node)
+ assert '\nmessage7' in status.getvalue()
+
+
+def test_warning_location(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.warning('message1', location='index')
+ assert 'index.txt: WARNING: message1' in warning.getvalue()
+
+ logger.warning('message2', location=('index', 10))
+ assert 'index.txt:10: WARNING: message2' in warning.getvalue()
+
+ logger.warning('message3', location=None)
+ assert colorize('red', 'WARNING: message3') in warning.getvalue()
+
+ node = nodes.Node()
+ node.source, node.line = ('index.txt', 10)
+ logger.warning('message4', location=node)
+ assert 'index.txt:10: WARNING: message4' in warning.getvalue()
+
+ node.source, node.line = ('index.txt', None)
+ logger.warning('message5', location=node)
+ assert 'index.txt:: WARNING: message5' in warning.getvalue()
+
+ node.source, node.line = (None, 10)
+ logger.warning('message6', location=node)
+ assert '<unknown>:10: WARNING: message6' in warning.getvalue()
+
+ node.source, node.line = (None, None)
+ logger.warning('message7', location=node)
+ assert colorize('red', 'WARNING: message7') in warning.getvalue()
+
+
+def test_suppress_logging(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.warning('message1')
+ with logging.suppress_logging():
+ logger.warning('message2')
+ assert 'WARNING: message1' in warning.getvalue()
+ assert 'WARNING: message2' not in warning.getvalue()
+
+ assert 'WARNING: message1' in warning.getvalue()
+ assert 'WARNING: message2' not in warning.getvalue()
+
+
+def test_pending_warnings(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.warning('message1')
+ with logging.pending_warnings():
+ # not logged yet (buffered) in here
+ logger.warning('message2')
+ logger.warning('message3')
+ assert 'WARNING: message1' in warning.getvalue()
+ assert 'WARNING: message2' not in warning.getvalue()
+ assert 'WARNING: message3' not in warning.getvalue()
+
+ # actually logged as ordered
+ assert 'WARNING: message2\nWARNING: message3' in strip_escseq(warning.getvalue())
+
+
+def test_colored_logs(app, status, warning):
+ app.verbosity = 2
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ # default colors
+ logger.debug('message1')
+ logger.verbose('message2')
+ logger.info('message3')
+ logger.warning('message4')
+ logger.critical('message5')
+ logger.error('message6')
+
+ assert colorize('darkgray', 'message1') in status.getvalue()
+ assert 'message2\n' in status.getvalue() # not colored
+ assert 'message3\n' in status.getvalue() # not colored
+ assert colorize('red', 'WARNING: message4') in warning.getvalue()
+ assert 'CRITICAL: message5\n' in warning.getvalue() # not colored
+ assert colorize('darkred', 'ERROR: message6') in warning.getvalue()
+
+ # color specification
+ logger.debug('message7', color='white')
+ logger.info('message8', color='red')
+ assert colorize('white', 'message7') in status.getvalue()
+ assert colorize('red', 'message8') in status.getvalue()
+
+
+@pytest.mark.xfail(os.name != 'posix',
+ reason="Parallel mode does not work on Windows")
+def test_logging_in_ParallelTasks(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ def child_process():
+ logger.info('message1')
+ logger.warning('message2', location='index')
+
+ tasks = ParallelTasks(1)
+ tasks.add_task(child_process)
+ tasks.join()
+ assert 'message1' in status.getvalue()
+ assert 'index.txt: WARNING: message2' in warning.getvalue()
+
+
+def test_output_with_unencodable_char(app, status, warning):
+ class StreamWriter(codecs.StreamWriter):
+ def write(self, object):
+ self.stream.write(object.encode('cp1252').decode('cp1252'))
+
+ logging.setup(app, StreamWriter(status), warning)
+ logger = logging.getLogger(__name__)
+
+ # info with UnicodeEncodeError
+ status.truncate(0)
+ status.seek(0)
+ logger.info("unicode \u206d...")
+ assert status.getvalue() == "unicode ?...\n"
+
+
+def test_skip_warningiserror(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ app.warningiserror = True
+ with logging.skip_warningiserror():
+ logger.warning('message')
+
+ # if False, warning raises SphinxWarning exception
+ with logging.skip_warningiserror(False): # NoQA: SIM117
+ with pytest.raises(SphinxWarning):
+ logger.warning('message')
+
+ # It also works during pending_warnings.
+ with logging.pending_warnings(): # NoQA: SIM117
+ with logging.skip_warningiserror():
+ logger.warning('message')
+
+ with pytest.raises(SphinxWarning): # NoQA: PT012,SIM117
+ with logging.pending_warnings():
+ with logging.skip_warningiserror(False):
+ logger.warning('message')
+
+
+def test_prefixed_warnings(app, status, warning):
+ logging.setup(app, status, warning)
+ logger = logging.getLogger(__name__)
+
+ logger.warning('message1')
+ with prefixed_warnings('PREFIX:'):
+ logger.warning('message2')
+ with prefixed_warnings('Another PREFIX:'):
+ logger.warning('message3')
+ logger.warning('message4')
+ logger.warning('message5')
+
+ assert 'WARNING: message1' in warning.getvalue()
+ assert 'WARNING: PREFIX: message2' in warning.getvalue()
+ assert 'WARNING: Another PREFIX: message3' in warning.getvalue()
+ assert 'WARNING: PREFIX: message4' in warning.getvalue()
+ assert 'WARNING: message5' in warning.getvalue()
+
+
+def test_get_node_location_abspath():
+ # Ensure that node locations are reported as an absolute path,
+ # even if the source attribute is a relative path.
+
+ relative_filename = os.path.join('relative', 'path.txt')
+ absolute_filename = osutil.abspath(relative_filename)
+
+ n = nodes.Node()
+ n.source = relative_filename
+
+ location = logging.get_node_location(n)
+
+ assert location == absolute_filename + ':'
diff --git a/tests/test_util_matching.py b/tests/test_util_matching.py
new file mode 100644
index 0000000..7d865ba
--- /dev/null
+++ b/tests/test_util_matching.py
@@ -0,0 +1,174 @@
+"""Tests sphinx.util.matching functions."""
+from sphinx.util.matching import Matcher, compile_matchers, get_matching_files
+
+
+def test_compile_matchers():
+ # exact matching
+ pat = compile_matchers(['hello.py']).pop()
+ assert pat('hello.py')
+ assert not pat('hello-py')
+ assert not pat('subdir/hello.py')
+
+ # wild card (*)
+ pat = compile_matchers(['hello.*']).pop()
+ assert pat('hello.py')
+ assert pat('hello.rst')
+
+ pat = compile_matchers(['*.py']).pop()
+ assert pat('hello.py')
+ assert pat('world.py')
+ assert not pat('subdir/hello.py')
+
+ # wild card (**)
+ pat = compile_matchers(['hello.**']).pop()
+ assert pat('hello.py')
+ assert pat('hello.rst')
+ assert pat('hello.py/world.py')
+
+ pat = compile_matchers(['**.py']).pop()
+ assert pat('hello.py')
+ assert pat('world.py')
+ assert pat('subdir/hello.py')
+
+ pat = compile_matchers(['**/hello.py']).pop()
+ assert not pat('hello.py')
+ assert pat('subdir/hello.py')
+ assert pat('subdir/subdir/hello.py')
+
+ # wild card (?)
+ pat = compile_matchers(['hello.?']).pop()
+ assert pat('hello.c')
+ assert not pat('hello.py')
+
+ # pattern ([...])
+ pat = compile_matchers(['hello[12\\].py']).pop()
+ assert pat('hello1.py')
+ assert pat('hello2.py')
+ assert pat('hello\\.py')
+ assert not pat('hello3.py')
+
+ pat = compile_matchers(['hello[^12].py']).pop() # "^" is not negative identifier
+ assert pat('hello1.py')
+ assert pat('hello2.py')
+ assert pat('hello^.py')
+ assert not pat('hello3.py')
+
+ # negative pattern ([!...])
+ pat = compile_matchers(['hello[!12].py']).pop()
+ assert not pat('hello1.py')
+ assert not pat('hello2.py')
+ assert not pat('hello/.py') # negative pattern does not match to "/"
+ assert pat('hello3.py')
+
+ # non patterns
+ pat = compile_matchers(['hello[.py']).pop()
+ assert pat('hello[.py')
+ assert not pat('hello.py')
+
+ pat = compile_matchers(['hello[].py']).pop()
+ assert pat('hello[].py')
+ assert not pat('hello.py')
+
+ pat = compile_matchers(['hello[!].py']).pop()
+ assert pat('hello[!].py')
+ assert not pat('hello.py')
+
+
+def test_Matcher():
+ matcher = Matcher(['hello.py', '**/world.py'])
+ assert matcher('hello.py')
+ assert not matcher('subdir/hello.py')
+ assert matcher('world.py')
+ assert matcher('subdir/world.py')
+
+
+def test_get_matching_files_all(rootdir):
+ files = get_matching_files(rootdir / "test-root")
+ assert sorted(files) == [
+ 'Makefile', '_templates/contentssb.html', '_templates/customsb.html',
+ '_templates/layout.html', 'autodoc.txt', 'autodoc_target.py', 'bom.txt', 'conf.py',
+ 'extapi.txt', 'extensions.txt', 'file_with_special_#_chars.xyz', 'footnote.txt',
+ 'images.txt', 'img.foo.png', 'img.gif', 'img.pdf', 'img.png', 'includes.txt',
+ 'index.txt', 'lists.txt', 'literal.inc', 'literal_orig.inc', 'markup.txt', 'math.txt',
+ 'objects.txt', 'otherext.foo', 'parsermod.py', 'quotes.inc', 'rimg.png',
+ 'special/api.h', 'special/code.py', 'subdir/excluded.txt', 'subdir/images.txt',
+ 'subdir/img.png', 'subdir/include.inc', 'subdir/includes.txt', 'subdir/simg.png',
+ 'svgimg.pdf', 'svgimg.svg', 'tabs.inc', 'test.inc', 'wrongenc.inc',
+ ]
+
+
+def test_get_matching_files_all_exclude_single(rootdir):
+ files = get_matching_files(rootdir / "test-root", exclude_patterns=["**.html"])
+ assert sorted(files) == [
+ 'Makefile', 'autodoc.txt', 'autodoc_target.py', 'bom.txt', 'conf.py',
+ 'extapi.txt', 'extensions.txt', 'file_with_special_#_chars.xyz', 'footnote.txt',
+ 'images.txt', 'img.foo.png', 'img.gif', 'img.pdf', 'img.png', 'includes.txt',
+ 'index.txt', 'lists.txt', 'literal.inc', 'literal_orig.inc', 'markup.txt', 'math.txt',
+ 'objects.txt', 'otherext.foo', 'parsermod.py', 'quotes.inc', 'rimg.png',
+ 'special/api.h', 'special/code.py', 'subdir/excluded.txt', 'subdir/images.txt',
+ 'subdir/img.png', 'subdir/include.inc', 'subdir/includes.txt', 'subdir/simg.png',
+ 'svgimg.pdf', 'svgimg.svg', 'tabs.inc', 'test.inc', 'wrongenc.inc',
+ ]
+
+
+def test_get_matching_files_all_exclude_multiple(rootdir):
+ files = get_matching_files(rootdir / "test-root", exclude_patterns=["**.html", "**.inc"])
+ assert sorted(files) == [
+ 'Makefile', 'autodoc.txt', 'autodoc_target.py', 'bom.txt', 'conf.py',
+ 'extapi.txt', 'extensions.txt', 'file_with_special_#_chars.xyz', 'footnote.txt',
+ 'images.txt', 'img.foo.png', 'img.gif', 'img.pdf', 'img.png', 'includes.txt',
+ 'index.txt', 'lists.txt', 'markup.txt', 'math.txt', 'objects.txt', 'otherext.foo',
+ 'parsermod.py', 'rimg.png', 'special/api.h', 'special/code.py', 'subdir/excluded.txt',
+ 'subdir/images.txt', 'subdir/img.png', 'subdir/includes.txt', 'subdir/simg.png',
+ 'svgimg.pdf', 'svgimg.svg',
+ ]
+
+
+def test_get_matching_files_all_exclude_nonexistent(rootdir):
+ files = get_matching_files(rootdir / "test-root", exclude_patterns=["halibut/**"])
+ assert sorted(files) == [
+ 'Makefile', '_templates/contentssb.html', '_templates/customsb.html',
+ '_templates/layout.html', 'autodoc.txt', 'autodoc_target.py', 'bom.txt', 'conf.py',
+ 'extapi.txt', 'extensions.txt', 'file_with_special_#_chars.xyz', 'footnote.txt',
+ 'images.txt', 'img.foo.png', 'img.gif', 'img.pdf', 'img.png', 'includes.txt',
+ 'index.txt', 'lists.txt', 'literal.inc', 'literal_orig.inc', 'markup.txt', 'math.txt',
+ 'objects.txt', 'otherext.foo', 'parsermod.py', 'quotes.inc', 'rimg.png',
+ 'special/api.h', 'special/code.py', 'subdir/excluded.txt', 'subdir/images.txt',
+ 'subdir/img.png', 'subdir/include.inc', 'subdir/includes.txt', 'subdir/simg.png',
+ 'svgimg.pdf', 'svgimg.svg', 'tabs.inc', 'test.inc', 'wrongenc.inc',
+ ]
+
+
+def test_get_matching_files_all_include_single(rootdir):
+ files = get_matching_files(rootdir / "test-root", include_patterns=["subdir/**"])
+ assert sorted(files) == [
+ 'subdir/excluded.txt', 'subdir/images.txt', 'subdir/img.png', 'subdir/include.inc',
+ 'subdir/includes.txt', 'subdir/simg.png',
+ ]
+
+
+def test_get_matching_files_all_include_multiple(rootdir):
+ files = get_matching_files(rootdir / "test-root", include_patterns=["special/**", "subdir/**"])
+ assert sorted(files) == [
+ 'special/api.h', 'special/code.py', 'subdir/excluded.txt', 'subdir/images.txt',
+ 'subdir/img.png', 'subdir/include.inc', 'subdir/includes.txt', 'subdir/simg.png',
+ ]
+
+
+def test_get_matching_files_all_include_nonexistent(rootdir):
+ files = get_matching_files(rootdir / "test-root", include_patterns=["halibut/**"])
+ assert sorted(files) == []
+
+
+def test_get_matching_files_all_include_prefix(rootdir):
+ files = get_matching_files(rootdir / "test-root", include_patterns=["autodoc*"])
+ assert sorted(files) == [
+ 'autodoc.txt', 'autodoc_target.py',
+ ]
+
+
+def test_get_matching_files_all_include_question_mark(rootdir):
+ files = get_matching_files(rootdir / "test-root", include_patterns=["img.???"])
+ assert sorted(files) == [
+ 'img.gif', 'img.pdf', 'img.png',
+ ]
diff --git a/tests/test_util_nodes.py b/tests/test_util_nodes.py
new file mode 100644
index 0000000..92e4dc1
--- /dev/null
+++ b/tests/test_util_nodes.py
@@ -0,0 +1,254 @@
+"""Tests uti.nodes functions."""
+from __future__ import annotations
+
+import warnings
+from textwrap import dedent
+from typing import Any
+
+import pytest
+from docutils import frontend, nodes
+from docutils.parsers import rst
+from docutils.utils import new_document
+
+from sphinx.transforms import ApplySourceWorkaround
+from sphinx.util.nodes import (
+ NodeMatcher,
+ apply_source_workaround,
+ clean_astext,
+ extract_messages,
+ make_id,
+ split_explicit_title,
+)
+
+
+def _transform(doctree):
+ ApplySourceWorkaround(doctree).apply()
+
+
+def create_new_document():
+ with warnings.catch_warnings():
+ warnings.filterwarnings('ignore', category=DeprecationWarning)
+ # DeprecationWarning: The frontend.OptionParser class will be replaced
+ # by a subclass of argparse.ArgumentParser in Docutils 0.21 or later.
+ settings = frontend.OptionParser(
+ components=(rst.Parser,)).get_default_values()
+ settings.id_prefix = 'id'
+ document = new_document('dummy.txt', settings)
+ return document
+
+
+def _get_doctree(text):
+ document = create_new_document()
+ rst.Parser().parse(text, document)
+ _transform(document)
+ return document
+
+
+def assert_node_count(messages, node_type, expect_count):
+ count = 0
+ node_list = [node for node, msg in messages]
+ for node in node_list:
+ if isinstance(node, node_type):
+ count += 1
+
+ assert count == expect_count, (
+ "Count of %r in the %r is %d instead of %d"
+ % (node_type, node_list, count, expect_count))
+
+
+def test_NodeMatcher():
+ doctree = nodes.document(None, None)
+ doctree += nodes.paragraph('', 'Hello')
+ doctree += nodes.paragraph('', 'Sphinx', block=1)
+ doctree += nodes.paragraph('', 'World', block=2)
+ doctree += nodes.literal_block('', 'blah blah blah', block=3)
+
+ # search by node class
+ matcher = NodeMatcher(nodes.paragraph)
+ assert len(list(doctree.findall(matcher))) == 3
+
+ # search by multiple node classes
+ matcher = NodeMatcher(nodes.paragraph, nodes.literal_block)
+ assert len(list(doctree.findall(matcher))) == 4
+
+ # search by node attribute
+ matcher = NodeMatcher(block=1)
+ assert len(list(doctree.findall(matcher))) == 1
+
+ # search by node attribute (Any)
+ matcher = NodeMatcher(block=Any)
+ assert len(list(doctree.findall(matcher))) == 3
+
+ # search by both class and attribute
+ matcher = NodeMatcher(nodes.paragraph, block=Any)
+ assert len(list(doctree.findall(matcher))) == 2
+
+ # mismatched
+ matcher = NodeMatcher(nodes.title)
+ assert len(list(doctree.findall(matcher))) == 0
+
+ # search with Any does not match to Text node
+ matcher = NodeMatcher(blah=Any)
+ assert len(list(doctree.findall(matcher))) == 0
+
+
+@pytest.mark.parametrize(
+ ('rst', 'node_cls', 'count'),
+ [
+ (
+ """
+ .. admonition:: admonition title
+
+ admonition body
+ """,
+ nodes.title, 1,
+ ),
+ (
+ """
+ .. figure:: foo.jpg
+
+ this is title
+ """,
+ nodes.caption, 1,
+ ),
+ (
+ """
+ .. rubric:: spam
+ """,
+ nodes.rubric, 1,
+ ),
+ (
+ """
+ | spam
+ | egg
+ """,
+ nodes.line, 2,
+ ),
+ (
+ """
+ section
+ =======
+
+ +----------------+
+ | | **Title 1** |
+ | | Message 1 |
+ +----------------+
+ """,
+ nodes.line, 2,
+ ),
+ (
+ """
+ * | **Title 1**
+ | Message 1
+ """,
+ nodes.line, 2,
+
+ ),
+ ],
+)
+def test_extract_messages(rst, node_cls, count):
+ msg = extract_messages(_get_doctree(dedent(rst)))
+ assert_node_count(msg, node_cls, count)
+
+
+def test_extract_messages_without_rawsource():
+ """
+ Check node.rawsource is fall-backed by using node.astext() value.
+
+ `extract_message` which is used from Sphinx i18n feature drop ``not node.rawsource``
+ nodes. So, all nodes which want to translate must have ``rawsource`` value.
+ However, sometimes node.rawsource is not set.
+
+ For example: recommonmark-0.2.0 doesn't set rawsource to `paragraph` node.
+
+ refs #1994: Fall back to node's astext() during i18n message extraction.
+ """
+ p = nodes.paragraph()
+ p.append(nodes.Text('test'))
+ p.append(nodes.Text('sentence'))
+ assert not p.rawsource # target node must not have rawsource value
+ document = create_new_document()
+ document.append(p)
+ _transform(document)
+ assert_node_count(extract_messages(document), nodes.TextElement, 1)
+ assert [m for n, m in extract_messages(document)][0], 'text sentence'
+
+
+def test_clean_astext():
+ node = nodes.paragraph(text='hello world')
+ assert clean_astext(node) == 'hello world'
+
+ node = nodes.image(alt='hello world')
+ assert clean_astext(node) == ''
+
+ node = nodes.paragraph(text='hello world')
+ node += nodes.raw('', 'raw text', format='html')
+ assert clean_astext(node) == 'hello world'
+
+
+@pytest.mark.parametrize(
+ ('prefix', 'term', 'expected'),
+ [
+ ('', '', 'id0'),
+ ('term', '', 'term-0'),
+ ('term', 'Sphinx', 'term-Sphinx'),
+ ('', 'io.StringIO', 'io.StringIO'), # contains a dot
+ ('', 'sphinx.setup_command', 'sphinx.setup_command'), # contains a dot & underscore
+ ('', '_io.StringIO', 'io.StringIO'), # starts with underscore
+ ('', 'sï½ï½ˆï½‰ï½Žï½˜', 'sphinx'), # alphabets in unicode fullwidth characters
+ ('', '悠好', 'id0'), # multibytes text (in Chinese)
+ ('', 'Hello=悠好=ã“ã‚“ã«ã¡ã¯', 'Hello'), # alphabets and multibytes text
+ ('', 'fünf', 'funf'), # latin1 (umlaut)
+ ('', '0sphinx', 'sphinx'), # starts with number
+ ('', 'sphinx-', 'sphinx'), # ends with hyphen
+ ])
+def test_make_id(app, prefix, term, expected):
+ document = create_new_document()
+ assert make_id(app.env, document, prefix, term) == expected
+
+
+def test_make_id_already_registered(app):
+ document = create_new_document()
+ document.ids['term-Sphinx'] = True # register "term-Sphinx" manually
+ assert make_id(app.env, document, 'term', 'Sphinx') == 'term-0'
+
+
+def test_make_id_sequential(app):
+ document = create_new_document()
+ document.ids['term-0'] = True
+ assert make_id(app.env, document, 'term') == 'term-1'
+
+
+@pytest.mark.parametrize(
+ ('title', 'expected'),
+ [
+ # implicit
+ ('hello', (False, 'hello', 'hello')),
+ # explicit
+ ('hello <world>', (True, 'hello', 'world')),
+ # explicit (title having angle brackets)
+ ('hello <world> <sphinx>', (True, 'hello <world>', 'sphinx')),
+ ],
+)
+def test_split_explicit_target(title, expected):
+ assert expected == split_explicit_title(title)
+
+
+def test_apply_source_workaround_literal_block_no_source():
+ """Regression test for #11091.
+
+ Test that apply_source_workaround doesn't raise.
+ """
+ literal_block = nodes.literal_block('', '')
+ list_item = nodes.list_item('', literal_block)
+ bullet_list = nodes.bullet_list('', list_item)
+
+ assert literal_block.source is None
+ assert list_item.source is None
+ assert bullet_list.source is None
+
+ apply_source_workaround(literal_block)
+
+ assert literal_block.source is None
+ assert list_item.source is None
+ assert bullet_list.source is None
diff --git a/tests/test_util_rst.py b/tests/test_util_rst.py
new file mode 100644
index 0000000..d50c90c
--- /dev/null
+++ b/tests/test_util_rst.py
@@ -0,0 +1,164 @@
+"""Tests sphinx.util.rst functions."""
+
+from docutils.statemachine import StringList
+from jinja2 import Environment
+
+from sphinx.util.rst import append_epilog, escape, heading, prepend_prolog, textwidth
+
+
+def test_escape():
+ assert escape(':ref:`id`') == r'\:ref\:\`id\`'
+ assert escape('footnote [#]_') == r'footnote \[\#\]\_'
+ assert escape('sphinx.application') == r'sphinx.application'
+ assert escape('.. toctree::') == r'\.. toctree\:\:'
+
+
+def test_append_epilog(app):
+ epilog = 'this is rst_epilog\ngood-bye reST!'
+ content = StringList(['hello Sphinx world',
+ 'Sphinx is a document generator'],
+ 'dummy.rst')
+ append_epilog(content, epilog)
+
+ assert list(content.xitems()) == [('dummy.rst', 0, 'hello Sphinx world'),
+ ('dummy.rst', 1, 'Sphinx is a document generator'),
+ ('dummy.rst', 2, ''),
+ ('<rst_epilog>', 0, 'this is rst_epilog'),
+ ('<rst_epilog>', 1, 'good-bye reST!')]
+
+
+def test_prepend_prolog(app):
+ prolog = 'this is rst_prolog\nhello reST!'
+ content = StringList([':title: test of SphinxFileInput',
+ ':author: Sphinx team',
+ '',
+ 'hello Sphinx world',
+ 'Sphinx is a document generator'],
+ 'dummy.rst')
+ prepend_prolog(content, prolog)
+
+ assert list(content.xitems()) == [('dummy.rst', 0, ':title: test of SphinxFileInput'),
+ ('dummy.rst', 1, ':author: Sphinx team'),
+ ('<generated>', 0, ''),
+ ('<rst_prolog>', 0, 'this is rst_prolog'),
+ ('<rst_prolog>', 1, 'hello reST!'),
+ ('<generated>', 0, ''),
+ ('dummy.rst', 2, ''),
+ ('dummy.rst', 3, 'hello Sphinx world'),
+ ('dummy.rst', 4, 'Sphinx is a document generator')]
+
+
+def test_prepend_prolog_with_CR(app):
+ # prolog having CR at tail
+ prolog = 'this is rst_prolog\nhello reST!\n'
+ content = StringList(['hello Sphinx world',
+ 'Sphinx is a document generator'],
+ 'dummy.rst')
+ prepend_prolog(content, prolog)
+
+ assert list(content.xitems()) == [('<rst_prolog>', 0, 'this is rst_prolog'),
+ ('<rst_prolog>', 1, 'hello reST!'),
+ ('<generated>', 0, ''),
+ ('dummy.rst', 0, 'hello Sphinx world'),
+ ('dummy.rst', 1, 'Sphinx is a document generator')]
+
+
+def test_prepend_prolog_without_CR(app):
+ # prolog not having CR at tail
+ prolog = 'this is rst_prolog\nhello reST!'
+ content = StringList(['hello Sphinx world',
+ 'Sphinx is a document generator'],
+ 'dummy.rst')
+ prepend_prolog(content, prolog)
+
+ assert list(content.xitems()) == [('<rst_prolog>', 0, 'this is rst_prolog'),
+ ('<rst_prolog>', 1, 'hello reST!'),
+ ('<generated>', 0, ''),
+ ('dummy.rst', 0, 'hello Sphinx world'),
+ ('dummy.rst', 1, 'Sphinx is a document generator')]
+
+
+def test_prepend_prolog_with_roles_in_sections(app):
+ prolog = 'this is rst_prolog\nhello reST!'
+ content = StringList([':title: test of SphinxFileInput',
+ ':author: Sphinx team',
+ '', # this newline is required
+ ':mod:`foo`',
+ '----------',
+ '',
+ 'hello'],
+ 'dummy.rst')
+ prepend_prolog(content, prolog)
+
+ assert list(content.xitems()) == [('dummy.rst', 0, ':title: test of SphinxFileInput'),
+ ('dummy.rst', 1, ':author: Sphinx team'),
+ ('<generated>', 0, ''),
+ ('<rst_prolog>', 0, 'this is rst_prolog'),
+ ('<rst_prolog>', 1, 'hello reST!'),
+ ('<generated>', 0, ''),
+ ('dummy.rst', 2, ''),
+ ('dummy.rst', 3, ':mod:`foo`'),
+ ('dummy.rst', 4, '----------'),
+ ('dummy.rst', 5, ''),
+ ('dummy.rst', 6, 'hello')]
+
+
+def test_prepend_prolog_with_roles_in_sections_with_newline(app):
+ # prologue with trailing line break
+ prolog = 'this is rst_prolog\nhello reST!\n'
+ content = StringList([':mod:`foo`', '-' * 10, '', 'hello'], 'dummy.rst')
+ prepend_prolog(content, prolog)
+
+ assert list(content.xitems()) == [('<rst_prolog>', 0, 'this is rst_prolog'),
+ ('<rst_prolog>', 1, 'hello reST!'),
+ ('<generated>', 0, ''),
+ ('dummy.rst', 0, ':mod:`foo`'),
+ ('dummy.rst', 1, '----------'),
+ ('dummy.rst', 2, ''),
+ ('dummy.rst', 3, 'hello')]
+
+
+def test_prepend_prolog_with_roles_in_sections_without_newline(app):
+ # prologue with no trailing line break
+ prolog = 'this is rst_prolog\nhello reST!'
+ content = StringList([':mod:`foo`', '-' * 10, '', 'hello'], 'dummy.rst')
+ prepend_prolog(content, prolog)
+
+ assert list(content.xitems()) == [('<rst_prolog>', 0, 'this is rst_prolog'),
+ ('<rst_prolog>', 1, 'hello reST!'),
+ ('<generated>', 0, ''),
+ ('dummy.rst', 0, ':mod:`foo`'),
+ ('dummy.rst', 1, '----------'),
+ ('dummy.rst', 2, ''),
+ ('dummy.rst', 3, 'hello')]
+
+
+def test_textwidth():
+ assert textwidth('Hello') == 5
+ assert textwidth('руÑÑкий Ñзык') == 12
+ assert textwidth('руÑÑкий Ñзык', 'WFA') == 23 # Cyrillic are ambiguous chars
+
+
+def test_heading():
+ env = Environment()
+ env.extend(language=None)
+
+ assert heading(env, 'Hello') == ('Hello\n'
+ '=====')
+ assert heading(env, 'Hello', 1) == ('Hello\n'
+ '=====')
+ assert heading(env, 'Hello', 2) == ('Hello\n'
+ '-----')
+ assert heading(env, 'Hello', 3) == ('Hello\n'
+ '~~~~~')
+ assert heading(env, 'руÑÑкий Ñзык', 1) == (
+ 'руÑÑкий Ñзык\n'
+ '============'
+ )
+
+ # language=ja: ambiguous
+ env.language = 'ja'
+ assert heading(env, 'руÑÑкий Ñзык', 1) == (
+ 'руÑÑкий Ñзык\n'
+ '======================='
+ )
diff --git a/tests/test_util_template.py b/tests/test_util_template.py
new file mode 100644
index 0000000..4601179
--- /dev/null
+++ b/tests/test_util_template.py
@@ -0,0 +1,29 @@
+"""Tests sphinx.util.template functions."""
+
+from sphinx.util.template import ReSTRenderer
+
+
+def test_ReSTRenderer_escape():
+ r = ReSTRenderer()
+ template = '{{ "*hello*" | e }}'
+ assert r.render_string(template, {}) == r'\*hello\*'
+
+
+def test_ReSTRenderer_heading():
+ r = ReSTRenderer()
+
+ template = '{{ "hello" | heading }}'
+ assert r.render_string(template, {}) == 'hello\n====='
+
+ template = '{{ "hello" | heading(1) }}'
+ assert r.render_string(template, {}) == 'hello\n====='
+
+ template = '{{ "руÑÑкий Ñзык" | heading(2) }}'
+ assert r.render_string(template, {}) == ('руÑÑкий Ñзык\n'
+ '------------')
+
+ # language: ja
+ r.env.language = 'ja'
+ template = '{{ "руÑÑкий Ñзык" | heading }}'
+ assert r.render_string(template, {}) == ('руÑÑкий Ñзык\n'
+ '=======================')
diff --git a/tests/test_util_typing.py b/tests/test_util_typing.py
new file mode 100644
index 0000000..d79852e
--- /dev/null
+++ b/tests/test_util_typing.py
@@ -0,0 +1,536 @@
+"""Tests util.typing functions."""
+
+import sys
+from enum import Enum
+from numbers import Integral
+from struct import Struct
+from types import TracebackType
+from typing import (
+ Any,
+ Callable,
+ Dict,
+ Generator,
+ List,
+ NewType,
+ Optional,
+ Tuple,
+ TypeVar,
+ Union,
+)
+
+import pytest
+
+from sphinx.ext.autodoc import mock
+from sphinx.util.typing import INVALID_BUILTIN_CLASSES, restify, stringify_annotation
+
+
+class MyClass1:
+ pass
+
+
+class MyClass2(MyClass1):
+ __qualname__ = '<MyClass2>'
+
+
+class MyEnum(Enum):
+ a = 1
+
+
+T = TypeVar('T')
+MyInt = NewType('MyInt', int)
+
+
+class MyList(List[T]):
+ pass
+
+
+class BrokenType:
+ __args__ = int
+
+
+def test_restify():
+ assert restify(int) == ":py:class:`int`"
+ assert restify(int, "smart") == ":py:class:`int`"
+
+ assert restify(str) == ":py:class:`str`"
+ assert restify(str, "smart") == ":py:class:`str`"
+
+ assert restify(None) == ":py:obj:`None`"
+ assert restify(None, "smart") == ":py:obj:`None`"
+
+ assert restify(Integral) == ":py:class:`numbers.Integral`"
+ assert restify(Integral, "smart") == ":py:class:`~numbers.Integral`"
+
+ assert restify(Struct) == ":py:class:`struct.Struct`"
+ assert restify(Struct, "smart") == ":py:class:`~struct.Struct`"
+
+ assert restify(TracebackType) == ":py:class:`types.TracebackType`"
+ assert restify(TracebackType, "smart") == ":py:class:`~types.TracebackType`"
+
+ assert restify(Any) == ":py:obj:`~typing.Any`"
+ assert restify(Any, "smart") == ":py:obj:`~typing.Any`"
+
+ assert restify('str') == "str"
+ assert restify('str', "smart") == "str"
+
+
+def test_is_invalid_builtin_class():
+ # if these tests start failing, it means that the __module__
+ # of one of these classes has changed, and INVALID_BUILTIN_CLASSES
+ # in sphinx.util.typing needs to be updated.
+ assert INVALID_BUILTIN_CLASSES.keys() == {Struct, TracebackType}
+ assert Struct.__module__ == '_struct'
+ assert TracebackType.__module__ == 'builtins'
+
+
+def test_restify_type_hints_containers():
+ assert restify(List) == ":py:class:`~typing.List`"
+ assert restify(Dict) == ":py:class:`~typing.Dict`"
+ assert restify(List[int]) == ":py:class:`~typing.List`\\ [:py:class:`int`]"
+ assert restify(List[str]) == ":py:class:`~typing.List`\\ [:py:class:`str`]"
+ assert restify(Dict[str, float]) == (":py:class:`~typing.Dict`\\ "
+ "[:py:class:`str`, :py:class:`float`]")
+ assert restify(Tuple[str, str, str]) == (":py:class:`~typing.Tuple`\\ "
+ "[:py:class:`str`, :py:class:`str`, "
+ ":py:class:`str`]")
+ assert restify(Tuple[str, ...]) == ":py:class:`~typing.Tuple`\\ [:py:class:`str`, ...]"
+
+ if sys.version_info[:2] <= (3, 10):
+ assert restify(Tuple[()]) == ":py:class:`~typing.Tuple`\\ [()]"
+ else:
+ assert restify(Tuple[()]) == ":py:class:`~typing.Tuple`"
+
+ assert restify(List[Dict[str, Tuple]]) == (":py:class:`~typing.List`\\ "
+ "[:py:class:`~typing.Dict`\\ "
+ "[:py:class:`str`, :py:class:`~typing.Tuple`]]")
+ assert restify(MyList[Tuple[int, int]]) == (":py:class:`tests.test_util_typing.MyList`\\ "
+ "[:py:class:`~typing.Tuple`\\ "
+ "[:py:class:`int`, :py:class:`int`]]")
+ assert restify(Generator[None, None, None]) == (":py:class:`~typing.Generator`\\ "
+ "[:py:obj:`None`, :py:obj:`None`, "
+ ":py:obj:`None`]")
+
+
+def test_restify_type_hints_Callable():
+ assert restify(Callable) == ":py:class:`~typing.Callable`"
+
+ assert restify(Callable[[str], int]) == (":py:class:`~typing.Callable`\\ "
+ "[[:py:class:`str`], :py:class:`int`]")
+ assert restify(Callable[..., int]) == (":py:class:`~typing.Callable`\\ "
+ "[[...], :py:class:`int`]")
+
+
+def test_restify_type_hints_Union():
+ assert restify(Optional[int]) == ":py:obj:`~typing.Optional`\\ [:py:class:`int`]"
+ assert restify(Union[str, None]) == ":py:obj:`~typing.Optional`\\ [:py:class:`str`]"
+ assert restify(Union[int, str]) == (":py:obj:`~typing.Union`\\ "
+ "[:py:class:`int`, :py:class:`str`]")
+ assert restify(Union[int, Integral]) == (":py:obj:`~typing.Union`\\ "
+ "[:py:class:`int`, :py:class:`numbers.Integral`]")
+ assert restify(Union[int, Integral], "smart") == (":py:obj:`~typing.Union`\\ "
+ "[:py:class:`int`,"
+ " :py:class:`~numbers.Integral`]")
+
+ assert (restify(Union[MyClass1, MyClass2]) ==
+ (":py:obj:`~typing.Union`\\ "
+ "[:py:class:`tests.test_util_typing.MyClass1`, "
+ ":py:class:`tests.test_util_typing.<MyClass2>`]"))
+ assert (restify(Union[MyClass1, MyClass2], "smart") ==
+ (":py:obj:`~typing.Union`\\ "
+ "[:py:class:`~tests.test_util_typing.MyClass1`,"
+ " :py:class:`~tests.test_util_typing.<MyClass2>`]"))
+
+
+def test_restify_type_hints_typevars():
+ T = TypeVar('T')
+ T_co = TypeVar('T_co', covariant=True)
+ T_contra = TypeVar('T_contra', contravariant=True)
+
+ assert restify(T) == ":py:obj:`tests.test_util_typing.T`"
+ assert restify(T, "smart") == ":py:obj:`~tests.test_util_typing.T`"
+
+ assert restify(T_co) == ":py:obj:`tests.test_util_typing.T_co`"
+ assert restify(T_co, "smart") == ":py:obj:`~tests.test_util_typing.T_co`"
+
+ assert restify(T_contra) == ":py:obj:`tests.test_util_typing.T_contra`"
+ assert restify(T_contra, "smart") == ":py:obj:`~tests.test_util_typing.T_contra`"
+
+ assert restify(List[T]) == ":py:class:`~typing.List`\\ [:py:obj:`tests.test_util_typing.T`]"
+ assert restify(List[T], "smart") == ":py:class:`~typing.List`\\ [:py:obj:`~tests.test_util_typing.T`]"
+
+ assert restify(list[T]) == ":py:class:`list`\\ [:py:obj:`tests.test_util_typing.T`]"
+ assert restify(list[T], "smart") == ":py:class:`list`\\ [:py:obj:`~tests.test_util_typing.T`]"
+
+ if sys.version_info[:2] >= (3, 10):
+ assert restify(MyInt) == ":py:class:`tests.test_util_typing.MyInt`"
+ assert restify(MyInt, "smart") == ":py:class:`~tests.test_util_typing.MyInt`"
+ else:
+ assert restify(MyInt) == ":py:class:`MyInt`"
+ assert restify(MyInt, "smart") == ":py:class:`MyInt`"
+
+
+def test_restify_type_hints_custom_class():
+ assert restify(MyClass1) == ":py:class:`tests.test_util_typing.MyClass1`"
+ assert restify(MyClass1, "smart") == ":py:class:`~tests.test_util_typing.MyClass1`"
+
+ assert restify(MyClass2) == ":py:class:`tests.test_util_typing.<MyClass2>`"
+ assert restify(MyClass2, "smart") == ":py:class:`~tests.test_util_typing.<MyClass2>`"
+
+
+def test_restify_type_hints_alias():
+ MyStr = str
+ MyTypingTuple = Tuple[str, str]
+ MyTuple = tuple[str, str]
+ assert restify(MyStr) == ":py:class:`str`"
+ assert restify(MyTypingTuple) == ":py:class:`~typing.Tuple`\\ [:py:class:`str`, :py:class:`str`]"
+ assert restify(MyTuple) == ":py:class:`tuple`\\ [:py:class:`str`, :py:class:`str`]"
+
+
+def test_restify_type_ForwardRef():
+ from typing import ForwardRef # type: ignore[attr-defined]
+ assert restify(ForwardRef("MyInt")) == ":py:class:`MyInt`"
+
+ assert restify(list[ForwardRef("MyInt")]) == ":py:class:`list`\\ [:py:class:`MyInt`]"
+
+ assert restify(Tuple[dict[ForwardRef("MyInt"), str], list[List[int]]]) == ":py:class:`~typing.Tuple`\\ [:py:class:`dict`\\ [:py:class:`MyInt`, :py:class:`str`], :py:class:`list`\\ [:py:class:`~typing.List`\\ [:py:class:`int`]]]" # type: ignore[attr-defined]
+
+
+def test_restify_type_Literal():
+ from typing import Literal # type: ignore[attr-defined]
+ assert restify(Literal[1, "2", "\r"]) == ":py:obj:`~typing.Literal`\\ [1, '2', '\\r']"
+
+ assert restify(Literal[MyEnum.a], 'fully-qualified-except-typing') == ':py:obj:`~typing.Literal`\\ [:py:attr:`tests.test_util_typing.MyEnum.a`]'
+ assert restify(Literal[MyEnum.a], 'smart') == ':py:obj:`~typing.Literal`\\ [:py:attr:`~tests.test_util_typing.MyEnum.a`]'
+
+
+def test_restify_pep_585():
+ assert restify(list[str]) == ":py:class:`list`\\ [:py:class:`str`]" # type: ignore[attr-defined]
+ assert restify(dict[str, str]) == (":py:class:`dict`\\ " # type: ignore[attr-defined]
+ "[:py:class:`str`, :py:class:`str`]")
+ assert restify(tuple[str, ...]) == ":py:class:`tuple`\\ [:py:class:`str`, ...]"
+ assert restify(tuple[str, str, str]) == (":py:class:`tuple`\\ "
+ "[:py:class:`str`, :py:class:`str`, "
+ ":py:class:`str`]")
+ assert restify(dict[str, tuple[int, ...]]) == (":py:class:`dict`\\ " # type: ignore[attr-defined]
+ "[:py:class:`str`, :py:class:`tuple`\\ "
+ "[:py:class:`int`, ...]]")
+
+ assert restify(tuple[()]) == ":py:class:`tuple`\\ [()]"
+
+ # Mix old typing with PEP 585
+ assert restify(List[dict[str, Tuple[str, ...]]]) == (":py:class:`~typing.List`\\ "
+ "[:py:class:`dict`\\ "
+ "[:py:class:`str`, :py:class:`~typing.Tuple`\\ "
+ "[:py:class:`str`, ...]]]")
+ assert restify(tuple[MyList[list[int]], int]) == (":py:class:`tuple`\\ ["
+ ":py:class:`tests.test_util_typing.MyList`\\ "
+ "[:py:class:`list`\\ [:py:class:`int`]], "
+ ":py:class:`int`]")
+
+
+@pytest.mark.skipif(sys.version_info[:2] <= (3, 9), reason='python 3.10+ is required.')
+def test_restify_type_union_operator():
+ assert restify(int | None) == ":py:class:`int` | :py:obj:`None`" # type: ignore[attr-defined]
+ assert restify(int | str) == ":py:class:`int` | :py:class:`str`" # type: ignore[attr-defined]
+ assert restify(int | str | None) == (":py:class:`int` | :py:class:`str` | " # type: ignore[attr-defined]
+ ":py:obj:`None`")
+
+
+def test_restify_broken_type_hints():
+ assert restify(BrokenType) == ':py:class:`tests.test_util_typing.BrokenType`'
+ assert restify(BrokenType, "smart") == ':py:class:`~tests.test_util_typing.BrokenType`'
+
+
+def test_restify_mock():
+ with mock(['unknown']):
+ import unknown
+ assert restify(unknown) == ':py:class:`unknown`'
+ assert restify(unknown.secret.Class) == ':py:class:`unknown.secret.Class`'
+ assert restify(unknown.secret.Class, "smart") == ':py:class:`~unknown.secret.Class`'
+
+
+def test_stringify_annotation():
+ assert stringify_annotation(int, 'fully-qualified-except-typing') == "int"
+ assert stringify_annotation(int, "smart") == "int"
+
+ assert stringify_annotation(str, 'fully-qualified-except-typing') == "str"
+ assert stringify_annotation(str, "smart") == "str"
+
+ assert stringify_annotation(None, 'fully-qualified-except-typing') == "None"
+ assert stringify_annotation(None, "smart") == "None"
+
+ assert stringify_annotation(Integral, 'fully-qualified-except-typing') == "numbers.Integral"
+ assert stringify_annotation(Integral, "smart") == "~numbers.Integral"
+
+ assert stringify_annotation(Struct, 'fully-qualified-except-typing') == "struct.Struct"
+ assert stringify_annotation(Struct, "smart") == "~struct.Struct"
+
+ assert stringify_annotation(TracebackType, 'fully-qualified-except-typing') == "types.TracebackType"
+ assert stringify_annotation(TracebackType, "smart") == "~types.TracebackType"
+
+ assert stringify_annotation(Any, 'fully-qualified-except-typing') == "Any"
+ assert stringify_annotation(Any, "fully-qualified") == "typing.Any"
+ assert stringify_annotation(Any, "smart") == "~typing.Any"
+
+
+def test_stringify_type_hints_containers():
+ assert stringify_annotation(List, 'fully-qualified-except-typing') == "List"
+ assert stringify_annotation(List, "fully-qualified") == "typing.List"
+ assert stringify_annotation(List, "smart") == "~typing.List"
+
+ assert stringify_annotation(Dict, 'fully-qualified-except-typing') == "Dict"
+ assert stringify_annotation(Dict, "fully-qualified") == "typing.Dict"
+ assert stringify_annotation(Dict, "smart") == "~typing.Dict"
+
+ assert stringify_annotation(List[int], 'fully-qualified-except-typing') == "List[int]"
+ assert stringify_annotation(List[int], "fully-qualified") == "typing.List[int]"
+ assert stringify_annotation(List[int], "smart") == "~typing.List[int]"
+
+ assert stringify_annotation(List[str], 'fully-qualified-except-typing') == "List[str]"
+ assert stringify_annotation(List[str], "fully-qualified") == "typing.List[str]"
+ assert stringify_annotation(List[str], "smart") == "~typing.List[str]"
+
+ assert stringify_annotation(Dict[str, float], 'fully-qualified-except-typing') == "Dict[str, float]"
+ assert stringify_annotation(Dict[str, float], "fully-qualified") == "typing.Dict[str, float]"
+ assert stringify_annotation(Dict[str, float], "smart") == "~typing.Dict[str, float]"
+
+ assert stringify_annotation(Tuple[str, str, str], 'fully-qualified-except-typing') == "Tuple[str, str, str]"
+ assert stringify_annotation(Tuple[str, str, str], "fully-qualified") == "typing.Tuple[str, str, str]"
+ assert stringify_annotation(Tuple[str, str, str], "smart") == "~typing.Tuple[str, str, str]"
+
+ assert stringify_annotation(Tuple[str, ...], 'fully-qualified-except-typing') == "Tuple[str, ...]"
+ assert stringify_annotation(Tuple[str, ...], "fully-qualified") == "typing.Tuple[str, ...]"
+ assert stringify_annotation(Tuple[str, ...], "smart") == "~typing.Tuple[str, ...]"
+
+ if sys.version_info[:2] <= (3, 10):
+ assert stringify_annotation(Tuple[()], 'fully-qualified-except-typing') == "Tuple[()]"
+ assert stringify_annotation(Tuple[()], "fully-qualified") == "typing.Tuple[()]"
+ assert stringify_annotation(Tuple[()], "smart") == "~typing.Tuple[()]"
+ else:
+ assert stringify_annotation(Tuple[()], 'fully-qualified-except-typing') == "Tuple"
+ assert stringify_annotation(Tuple[()], "fully-qualified") == "typing.Tuple"
+ assert stringify_annotation(Tuple[()], "smart") == "~typing.Tuple"
+
+ assert stringify_annotation(List[Dict[str, Tuple]], 'fully-qualified-except-typing') == "List[Dict[str, Tuple]]"
+ assert stringify_annotation(List[Dict[str, Tuple]], "fully-qualified") == "typing.List[typing.Dict[str, typing.Tuple]]"
+ assert stringify_annotation(List[Dict[str, Tuple]], "smart") == "~typing.List[~typing.Dict[str, ~typing.Tuple]]"
+
+ assert stringify_annotation(MyList[Tuple[int, int]], 'fully-qualified-except-typing') == "tests.test_util_typing.MyList[Tuple[int, int]]"
+ assert stringify_annotation(MyList[Tuple[int, int]], "fully-qualified") == "tests.test_util_typing.MyList[typing.Tuple[int, int]]"
+ assert stringify_annotation(MyList[Tuple[int, int]], "smart") == "~tests.test_util_typing.MyList[~typing.Tuple[int, int]]"
+
+ assert stringify_annotation(Generator[None, None, None], 'fully-qualified-except-typing') == "Generator[None, None, None]"
+ assert stringify_annotation(Generator[None, None, None], "fully-qualified") == "typing.Generator[None, None, None]"
+ assert stringify_annotation(Generator[None, None, None], "smart") == "~typing.Generator[None, None, None]"
+
+
+def test_stringify_type_hints_pep_585():
+ assert stringify_annotation(list[int], 'fully-qualified-except-typing') == "list[int]"
+ assert stringify_annotation(list[int], "smart") == "list[int]"
+
+ assert stringify_annotation(list[str], 'fully-qualified-except-typing') == "list[str]"
+ assert stringify_annotation(list[str], "smart") == "list[str]"
+
+ assert stringify_annotation(dict[str, float], 'fully-qualified-except-typing') == "dict[str, float]"
+ assert stringify_annotation(dict[str, float], "smart") == "dict[str, float]"
+
+ assert stringify_annotation(tuple[str, str, str], 'fully-qualified-except-typing') == "tuple[str, str, str]"
+ assert stringify_annotation(tuple[str, str, str], "smart") == "tuple[str, str, str]"
+
+ assert stringify_annotation(tuple[str, ...], 'fully-qualified-except-typing') == "tuple[str, ...]"
+ assert stringify_annotation(tuple[str, ...], "smart") == "tuple[str, ...]"
+
+ assert stringify_annotation(tuple[()], 'fully-qualified-except-typing') == "tuple[()]"
+ assert stringify_annotation(tuple[()], "smart") == "tuple[()]"
+
+ assert stringify_annotation(list[dict[str, tuple]], 'fully-qualified-except-typing') == "list[dict[str, tuple]]"
+ assert stringify_annotation(list[dict[str, tuple]], "smart") == "list[dict[str, tuple]]"
+
+ assert stringify_annotation(MyList[tuple[int, int]], 'fully-qualified-except-typing') == "tests.test_util_typing.MyList[tuple[int, int]]"
+ assert stringify_annotation(MyList[tuple[int, int]], "fully-qualified") == "tests.test_util_typing.MyList[tuple[int, int]]"
+ assert stringify_annotation(MyList[tuple[int, int]], "smart") == "~tests.test_util_typing.MyList[tuple[int, int]]"
+
+ assert stringify_annotation(type[int], 'fully-qualified-except-typing') == "type[int]"
+ assert stringify_annotation(type[int], "smart") == "type[int]"
+
+ # Mix typing and pep 585
+ assert stringify_annotation(tuple[List[dict[int, str]], str, ...], 'fully-qualified-except-typing') == "tuple[List[dict[int, str]], str, ...]"
+ assert stringify_annotation(tuple[List[dict[int, str]], str, ...], "smart") == "tuple[~typing.List[dict[int, str]], str, ...]"
+
+
+def test_stringify_Annotated():
+ from typing import Annotated # type: ignore[attr-defined]
+ assert stringify_annotation(Annotated[str, "foo", "bar"], 'fully-qualified-except-typing') == "str"
+ assert stringify_annotation(Annotated[str, "foo", "bar"], "smart") == "str"
+
+
+def test_stringify_type_hints_string():
+ assert stringify_annotation("int", 'fully-qualified-except-typing') == "int"
+ assert stringify_annotation("int", 'fully-qualified') == "int"
+ assert stringify_annotation("int", "smart") == "int"
+
+ assert stringify_annotation("str", 'fully-qualified-except-typing') == "str"
+ assert stringify_annotation("str", 'fully-qualified') == "str"
+ assert stringify_annotation("str", "smart") == "str"
+
+ assert stringify_annotation(List["int"], 'fully-qualified-except-typing') == "List[int]"
+ assert stringify_annotation(List["int"], 'fully-qualified') == "typing.List[int]"
+ assert stringify_annotation(List["int"], "smart") == "~typing.List[int]"
+
+ assert stringify_annotation(list["int"], 'fully-qualified-except-typing') == "list[int]"
+ assert stringify_annotation(list["int"], 'fully-qualified') == "list[int]"
+ assert stringify_annotation(list["int"], "smart") == "list[int]"
+
+ assert stringify_annotation("Tuple[str]", 'fully-qualified-except-typing') == "Tuple[str]"
+ assert stringify_annotation("Tuple[str]", 'fully-qualified') == "Tuple[str]"
+ assert stringify_annotation("Tuple[str]", "smart") == "Tuple[str]"
+
+ assert stringify_annotation("tuple[str]", 'fully-qualified-except-typing') == "tuple[str]"
+ assert stringify_annotation("tuple[str]", 'fully-qualified') == "tuple[str]"
+ assert stringify_annotation("tuple[str]", "smart") == "tuple[str]"
+
+ assert stringify_annotation("unknown", 'fully-qualified-except-typing') == "unknown"
+ assert stringify_annotation("unknown", 'fully-qualified') == "unknown"
+ assert stringify_annotation("unknown", "smart") == "unknown"
+
+
+def test_stringify_type_hints_Callable():
+ assert stringify_annotation(Callable, 'fully-qualified-except-typing') == "Callable"
+ assert stringify_annotation(Callable, "fully-qualified") == "typing.Callable"
+ assert stringify_annotation(Callable, "smart") == "~typing.Callable"
+
+ assert stringify_annotation(Callable[[str], int], 'fully-qualified-except-typing') == "Callable[[str], int]"
+ assert stringify_annotation(Callable[[str], int], "fully-qualified") == "typing.Callable[[str], int]"
+ assert stringify_annotation(Callable[[str], int], "smart") == "~typing.Callable[[str], int]"
+
+ assert stringify_annotation(Callable[..., int], 'fully-qualified-except-typing') == "Callable[[...], int]"
+ assert stringify_annotation(Callable[..., int], "fully-qualified") == "typing.Callable[[...], int]"
+ assert stringify_annotation(Callable[..., int], "smart") == "~typing.Callable[[...], int]"
+
+
+def test_stringify_type_hints_Union():
+ assert stringify_annotation(Optional[int], 'fully-qualified-except-typing') == "int | None"
+ assert stringify_annotation(Optional[int], "fully-qualified") == "int | None"
+ assert stringify_annotation(Optional[int], "smart") == "int | None"
+
+ assert stringify_annotation(Union[str, None], 'fully-qualified-except-typing') == "str | None"
+ assert stringify_annotation(Union[str, None], "fully-qualified") == "str | None"
+ assert stringify_annotation(Union[str, None], "smart") == "str | None"
+
+ assert stringify_annotation(Union[int, str], 'fully-qualified-except-typing') == "int | str"
+ assert stringify_annotation(Union[int, str], "fully-qualified") == "int | str"
+ assert stringify_annotation(Union[int, str], "smart") == "int | str"
+
+ assert stringify_annotation(Union[int, Integral], 'fully-qualified-except-typing') == "int | numbers.Integral"
+ assert stringify_annotation(Union[int, Integral], "fully-qualified") == "int | numbers.Integral"
+ assert stringify_annotation(Union[int, Integral], "smart") == "int | ~numbers.Integral"
+
+ assert (stringify_annotation(Union[MyClass1, MyClass2], 'fully-qualified-except-typing') ==
+ "tests.test_util_typing.MyClass1 | tests.test_util_typing.<MyClass2>")
+ assert (stringify_annotation(Union[MyClass1, MyClass2], "fully-qualified") ==
+ "tests.test_util_typing.MyClass1 | tests.test_util_typing.<MyClass2>")
+ assert (stringify_annotation(Union[MyClass1, MyClass2], "smart") ==
+ "~tests.test_util_typing.MyClass1 | ~tests.test_util_typing.<MyClass2>")
+
+
+def test_stringify_type_hints_typevars():
+ T = TypeVar('T')
+ T_co = TypeVar('T_co', covariant=True)
+ T_contra = TypeVar('T_contra', contravariant=True)
+
+ assert stringify_annotation(T, 'fully-qualified-except-typing') == "tests.test_util_typing.T"
+ assert stringify_annotation(T, "smart") == "~tests.test_util_typing.T"
+
+ assert stringify_annotation(T_co, 'fully-qualified-except-typing') == "tests.test_util_typing.T_co"
+ assert stringify_annotation(T_co, "smart") == "~tests.test_util_typing.T_co"
+
+ assert stringify_annotation(T_contra, 'fully-qualified-except-typing') == "tests.test_util_typing.T_contra"
+ assert stringify_annotation(T_contra, "smart") == "~tests.test_util_typing.T_contra"
+
+ assert stringify_annotation(List[T], 'fully-qualified-except-typing') == "List[tests.test_util_typing.T]"
+ assert stringify_annotation(List[T], "smart") == "~typing.List[~tests.test_util_typing.T]"
+
+ assert stringify_annotation(list[T], 'fully-qualified-except-typing') == "list[tests.test_util_typing.T]"
+ assert stringify_annotation(list[T], "smart") == "list[~tests.test_util_typing.T]"
+
+ if sys.version_info[:2] >= (3, 10):
+ assert stringify_annotation(MyInt, 'fully-qualified-except-typing') == "tests.test_util_typing.MyInt"
+ assert stringify_annotation(MyInt, "smart") == "~tests.test_util_typing.MyInt"
+ else:
+ assert stringify_annotation(MyInt, 'fully-qualified-except-typing') == "MyInt"
+ assert stringify_annotation(MyInt, "smart") == "MyInt"
+
+
+def test_stringify_type_hints_custom_class():
+ assert stringify_annotation(MyClass1, 'fully-qualified-except-typing') == "tests.test_util_typing.MyClass1"
+ assert stringify_annotation(MyClass1, "smart") == "~tests.test_util_typing.MyClass1"
+
+ assert stringify_annotation(MyClass2, 'fully-qualified-except-typing') == "tests.test_util_typing.<MyClass2>"
+ assert stringify_annotation(MyClass2, "smart") == "~tests.test_util_typing.<MyClass2>"
+
+
+def test_stringify_type_hints_alias():
+ MyStr = str
+ MyTuple = Tuple[str, str]
+
+ assert stringify_annotation(MyStr, 'fully-qualified-except-typing') == "str"
+ assert stringify_annotation(MyStr, "smart") == "str"
+
+ assert stringify_annotation(MyTuple) == "Tuple[str, str]" # type: ignore[attr-defined]
+ assert stringify_annotation(MyTuple, "smart") == "~typing.Tuple[str, str]" # type: ignore[attr-defined]
+
+
+def test_stringify_type_Literal():
+ from typing import Literal # type: ignore[attr-defined]
+ assert stringify_annotation(Literal[1, "2", "\r"], 'fully-qualified-except-typing') == "Literal[1, '2', '\\r']"
+ assert stringify_annotation(Literal[1, "2", "\r"], "fully-qualified") == "typing.Literal[1, '2', '\\r']"
+ assert stringify_annotation(Literal[1, "2", "\r"], "smart") == "~typing.Literal[1, '2', '\\r']"
+
+ assert stringify_annotation(Literal[MyEnum.a], 'fully-qualified-except-typing') == 'Literal[tests.test_util_typing.MyEnum.a]'
+ assert stringify_annotation(Literal[MyEnum.a], 'fully-qualified') == 'typing.Literal[tests.test_util_typing.MyEnum.a]'
+ assert stringify_annotation(Literal[MyEnum.a], 'smart') == '~typing.Literal[MyEnum.a]'
+
+
+@pytest.mark.skipif(sys.version_info[:2] <= (3, 9), reason='python 3.10+ is required.')
+def test_stringify_type_union_operator():
+ assert stringify_annotation(int | None) == "int | None" # type: ignore[attr-defined]
+ assert stringify_annotation(int | None, "smart") == "int | None" # type: ignore[attr-defined]
+
+ assert stringify_annotation(int | str) == "int | str" # type: ignore[attr-defined]
+ assert stringify_annotation(int | str, "smart") == "int | str" # type: ignore[attr-defined]
+
+ assert stringify_annotation(int | str | None) == "int | str | None" # type: ignore[attr-defined]
+ assert stringify_annotation(int | str | None, "smart") == "int | str | None" # type: ignore[attr-defined]
+
+ assert stringify_annotation(int | tuple[dict[str, int | None], list[int | str]] | None) == "int | tuple[dict[str, int | None], list[int | str]] | None" # type: ignore[attr-defined]
+ assert stringify_annotation(int | tuple[dict[str, int | None], list[int | str]] | None, "smart") == "int | tuple[dict[str, int | None], list[int | str]] | None" # type: ignore[attr-defined]
+
+ assert stringify_annotation(int | Struct) == "int | struct.Struct" # type: ignore[attr-defined]
+ assert stringify_annotation(int | Struct, "smart") == "int | ~struct.Struct" # type: ignore[attr-defined]
+
+
+def test_stringify_broken_type_hints():
+ assert stringify_annotation(BrokenType, 'fully-qualified-except-typing') == 'tests.test_util_typing.BrokenType'
+ assert stringify_annotation(BrokenType, "smart") == '~tests.test_util_typing.BrokenType'
+
+
+def test_stringify_mock():
+ with mock(['unknown']):
+ import unknown
+ assert stringify_annotation(unknown, 'fully-qualified-except-typing') == 'unknown'
+ assert stringify_annotation(unknown.secret.Class, 'fully-qualified-except-typing') == 'unknown.secret.Class'
+ assert stringify_annotation(unknown.secret.Class, "smart") == 'unknown.secret.Class'
+
+
+def test_stringify_type_ForwardRef():
+ from typing import ForwardRef # type: ignore[attr-defined]
+
+ assert stringify_annotation(ForwardRef("MyInt")) == "MyInt"
+ assert stringify_annotation(ForwardRef("MyInt"), 'smart') == "MyInt"
+
+ assert stringify_annotation(list[ForwardRef("MyInt")]) == "list[MyInt]"
+ assert stringify_annotation(list[ForwardRef("MyInt")], 'smart') == "list[MyInt]"
+
+ assert stringify_annotation(Tuple[dict[ForwardRef("MyInt"), str], list[List[int]]]) == "Tuple[dict[MyInt, str], list[List[int]]]" # type: ignore[attr-defined]
+ assert stringify_annotation(Tuple[dict[ForwardRef("MyInt"), str], list[List[int]]], 'fully-qualified-except-typing') == "Tuple[dict[MyInt, str], list[List[int]]]" # type: ignore[attr-defined]
+ assert stringify_annotation(Tuple[dict[ForwardRef("MyInt"), str], list[List[int]]], 'smart') == "~typing.Tuple[dict[MyInt, str], list[~typing.List[int]]]" # type: ignore[attr-defined]
diff --git a/tests/test_versioning.py b/tests/test_versioning.py
new file mode 100644
index 0000000..ae159df
--- /dev/null
+++ b/tests/test_versioning.py
@@ -0,0 +1,120 @@
+"""Test the versioning implementation."""
+
+import pickle
+import shutil
+
+import pytest
+
+from sphinx.testing.util import SphinxTestApp
+from sphinx.versioning import add_uids, get_ratio, merge_doctrees
+
+app = original = original_uids = None
+
+
+@pytest.fixture(scope='module', autouse=True)
+def _setup_module(rootdir, sphinx_test_tempdir):
+ global app, original, original_uids
+ srcdir = sphinx_test_tempdir / 'test-versioning'
+ if not srcdir.exists():
+ shutil.copytree(rootdir / 'test-versioning', srcdir)
+ app = SphinxTestApp(srcdir=srcdir)
+ app.builder.env.app = app
+ app.connect('doctree-resolved', on_doctree_resolved)
+ app.build()
+ original = doctrees['original']
+ original_uids = [n.uid for n in add_uids(original, is_paragraph)]
+ yield
+ app.cleanup()
+
+
+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
+ loaded = pickle.loads(pickle.dumps(copy, pickle.HIGHEST_PROTOCOL))
+ assert all(getattr(n, 'uid', False) for n in loaded.findall(is_paragraph))
+
+
+def test_modified():
+ modified = doctrees['modified']
+ new_nodes = list(merge_doctrees(original, modified, is_paragraph))
+ uids = [n.uid for n in modified.findall(is_paragraph)]
+ assert not new_nodes
+ assert original_uids == uids
+
+
+def test_added():
+ added = doctrees['added']
+ new_nodes = list(merge_doctrees(original, added, is_paragraph))
+ uids = [n.uid for n in added.findall(is_paragraph)]
+ assert len(new_nodes) == 1
+ assert original_uids == uids[:-1]
+
+
+def test_deleted():
+ deleted = doctrees['deleted']
+ new_nodes = list(merge_doctrees(original, deleted, is_paragraph))
+ uids = [n.uid for n in deleted.findall(is_paragraph)]
+ assert not new_nodes
+ assert original_uids[::2] == uids
+
+
+def test_deleted_end():
+ deleted_end = doctrees['deleted_end']
+ new_nodes = list(merge_doctrees(original, deleted_end, is_paragraph))
+ uids = [n.uid for n in deleted_end.findall(is_paragraph)]
+ assert not new_nodes
+ assert original_uids[:-1] == uids
+
+
+def test_insert():
+ insert = doctrees['insert']
+ new_nodes = list(merge_doctrees(original, insert, is_paragraph))
+ uids = [n.uid for n in insert.findall(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['insert_beginning']
+ new_nodes = list(merge_doctrees(original, insert_beginning, is_paragraph))
+ uids = [n.uid for n in insert_beginning.findall(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['insert_similar']
+ new_nodes = list(merge_doctrees(original, insert_similar, is_paragraph))
+ uids = [n.uid for n in insert_similar.findall(is_paragraph)]
+ assert len(new_nodes) == 1
+ assert new_nodes[0].rawsource == 'Anyway I need more'
+ assert original_uids[0] == uids[0]
+ assert original_uids[1:] == uids[2:]
diff --git a/tests/test_writer_latex.py b/tests/test_writer_latex.py
new file mode 100644
index 0000000..a0ab3ee
--- /dev/null
+++ b/tests/test_writer_latex.py
@@ -0,0 +1,28 @@
+"""Test the LaTeX writer"""
+
+import pytest
+
+from sphinx.writers.latex import rstdim_to_latexdim
+
+
+def test_rstdim_to_latexdim():
+ # Length units docutils supported
+ # https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#length-units
+ assert rstdim_to_latexdim('160em') == '160em'
+ assert rstdim_to_latexdim('160px') == '160\\sphinxpxdimen'
+ assert rstdim_to_latexdim('160in') == '160in'
+ assert rstdim_to_latexdim('160cm') == '160cm'
+ assert rstdim_to_latexdim('160mm') == '160mm'
+ assert rstdim_to_latexdim('160pt') == '160bp'
+ assert rstdim_to_latexdim('160pc') == '160pc'
+ assert rstdim_to_latexdim('30%') == '0.300\\linewidth'
+ assert rstdim_to_latexdim('160') == '160\\sphinxpxdimen'
+
+ # float values
+ assert rstdim_to_latexdim('160.0em') == '160.0em'
+ assert rstdim_to_latexdim('.5em') == '.5em'
+
+ # unknown values (it might be generated by 3rd party extension)
+ with pytest.raises(ValueError, match='could not convert string to float: '):
+ rstdim_to_latexdim('unknown')
+ assert rstdim_to_latexdim('160.0unknown') == '160.0unknown'
diff --git a/tests/typing_test_data.py b/tests/typing_test_data.py
new file mode 100644
index 0000000..8a7ebc4
--- /dev/null
+++ b/tests/typing_test_data.py
@@ -0,0 +1,129 @@
+from inspect import Signature
+from numbers import Integral
+from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, Union
+
+
+def f0(x: int, y: Integral) -> None:
+ pass
+
+
+def f1(x: list[int]) -> List[int]:
+ pass
+
+
+T = TypeVar('T')
+T_co = TypeVar('T_co', covariant=True)
+T_contra = TypeVar('T_contra', contravariant=True)
+
+
+def f2(x: List[T], y: List[T_co], z: T) -> List[T_contra]:
+ pass
+
+
+def f3(x: Union[str, Integral]) -> None:
+ pass
+
+
+MyStr = str
+
+
+def f4(x: 'MyStr', y: MyStr) -> None:
+ pass
+
+
+def f5(x: int, *, y: str, z: str) -> None:
+ pass
+
+
+def f6(x: int, *args, y: str, z: str) -> None:
+ pass
+
+
+def f7(x: int = None, y: dict = {}) -> None: # NoQA: B006
+ pass
+
+
+def f8(x: Callable[[int, str], int]) -> None:
+ # See https://github.com/ambv/typehinting/issues/149 for Callable[..., int]
+ pass
+
+
+def f9(x: Callable) -> None:
+ pass
+
+
+def f10(x: Tuple[int, str], y: Tuple[int, ...]) -> None:
+ pass
+
+
+class CustomAnnotation:
+ def __repr__(self):
+ return 'CustomAnnotation'
+
+
+def f11(x: CustomAnnotation(), y: 123) -> None:
+ pass
+
+
+def f12() -> Tuple[int, str, int]:
+ pass
+
+
+def f13() -> Optional[str]:
+ pass
+
+
+def f14() -> Any:
+ pass
+
+
+def f15(x: "Unknown", y: "int") -> Any: # noqa: F821 # type: ignore[attr-defined]
+ pass
+
+
+def f16(arg1, arg2, *, arg3=None, arg4=None):
+ pass
+
+
+def f17(*, arg3, arg4):
+ pass
+
+
+def f18(self, arg1: Union[int, Tuple] = 10) -> List[Dict]:
+ pass
+
+
+def f19(*args: int, **kwargs: str):
+ pass
+
+
+def f20() -> Optional[Union[int, str]]:
+ pass
+
+
+def f21(arg1='whatever', arg2=Signature.empty):
+ pass
+
+
+def f22(*, a, b):
+ pass
+
+
+def f23(a, b, /, c, d):
+ pass
+
+
+def f24(a, /, *, b):
+ pass
+
+
+def f25(a, b, /):
+ pass
+
+
+class Node:
+ def __init__(self, parent: Optional['Node']) -> None:
+ pass
+
+ def children(self) -> List['Node']:
+ pass
diff --git a/tests/utils.py b/tests/utils.py
new file mode 100644
index 0000000..32636b7
--- /dev/null
+++ b/tests/utils.py
@@ -0,0 +1,55 @@
+import contextlib
+import http.server
+import pathlib
+import threading
+from ssl import PROTOCOL_TLS_SERVER, SSLContext
+
+import filelock
+
+# Generated with:
+# $ openssl req -new -x509 -days 3650 -nodes -out cert.pem \
+# -keyout cert.pem -addext "subjectAltName = DNS:localhost"
+TESTS_ROOT = pathlib.Path(__file__).parent
+CERT_FILE = str(TESTS_ROOT / "certs" / "cert.pem")
+
+# File lock for tests
+LOCK_PATH = str(TESTS_ROOT / 'test-server.lock')
+
+
+class HttpServerThread(threading.Thread):
+ def __init__(self, handler, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.server = http.server.ThreadingHTTPServer(("localhost", 7777), handler)
+
+ def run(self):
+ self.server.serve_forever(poll_interval=0.001)
+
+ def terminate(self):
+ self.server.shutdown()
+ self.server.server_close()
+ self.join()
+
+
+class HttpsServerThread(HttpServerThread):
+ def __init__(self, handler, *args, **kwargs):
+ super().__init__(handler, *args, **kwargs)
+ sslcontext = SSLContext(PROTOCOL_TLS_SERVER)
+ sslcontext.load_cert_chain(CERT_FILE)
+ self.server.socket = sslcontext.wrap_socket(self.server.socket, server_side=True)
+
+
+def create_server(thread_class):
+ def server(handler):
+ lock = filelock.FileLock(LOCK_PATH)
+ with lock:
+ server_thread = thread_class(handler, daemon=True)
+ server_thread.start()
+ try:
+ yield server_thread
+ finally:
+ server_thread.terminate()
+ return contextlib.contextmanager(server)
+
+
+http_server = create_server(HttpServerThread)
+https_server = create_server(HttpsServerThread)
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..fb7e344
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,55 @@
+[tox]
+minversion = 2.4.0
+envlist = py{39,310,311,312,313}
+isolated_build = True
+
+[testenv]
+usedevelop = True
+passenv =
+ https_proxy
+ http_proxy
+ no_proxy
+ COLORTERM
+ PERL
+ PERL5LIB
+ PYTEST_ADDOPTS
+ DO_EPUBCHECK
+ EPUBCHECK_PATH
+ TERM
+description =
+ py{39,310,311,312,313}: Run unit tests against {envname}.
+extras =
+ test
+setenv =
+ PYTHONWARNINGS = error
+ PYTEST_ADDOPTS = {env:PYTEST_ADDOPTS:} --color yes
+commands=
+ python -X dev -X warn_default_encoding -m pytest --durations 25 {posargs}
+
+[testenv:docs]
+basepython = python3
+description =
+ Build documentation.
+extras =
+ docs
+commands =
+ sphinx-build -M html ./doc ./build/sphinx -W --keep-going
+
+[testenv:docs-live]
+basepython = python3
+description =
+ Build documentation.
+extras =
+ docs
+deps =
+ sphinx-autobuild
+commands =
+ sphinx-autobuild ./doc ./build/sphinx/
+
+[testenv:bindep]
+description =
+ Install binary dependencies.
+deps =
+ bindep
+commands =
+ bindep test
diff --git a/utils/CHANGES_template b/utils/CHANGES_template
new file mode 100644
index 0000000..a655c46
--- /dev/null
+++ b/utils/CHANGES_template
@@ -0,0 +1,20 @@
+Release x.y.z (in development)
+==============================
+
+Dependencies
+------------
+
+Incompatible changes
+--------------------
+
+Deprecated
+----------
+
+Features added
+--------------
+
+Bugs fixed
+----------
+
+Testing
+-------
diff --git a/utils/__init__.py b/utils/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/utils/__init__.py
diff --git a/utils/babel_runner.py b/utils/babel_runner.py
new file mode 100644
index 0000000..dfb58db
--- /dev/null
+++ b/utils/babel_runner.py
@@ -0,0 +1,250 @@
+"""Run babel for translations.
+
+Usage:
+
+babel_runner.py extract
+ Extract messages from the source code and update the ".pot" template file.
+
+babel_runner.py update
+ Update all language catalogues in "sphinx/locale/<language>/LC_MESSAGES"
+ with the current messages in the template file.
+
+babel_runner.py compile
+ Compile the ".po" catalogue files to ".mo" and ".js" files.
+"""
+
+import json
+import logging
+import os
+import sys
+import tempfile
+
+from babel.messages.catalog import Catalog
+from babel.messages.extract import (
+ DEFAULT_KEYWORDS,
+ extract,
+ extract_javascript,
+ extract_python,
+)
+from babel.messages.mofile import write_mo
+from babel.messages.pofile import read_po, write_po
+from babel.util import pathmatch
+from jinja2.ext import babel_extract as extract_jinja2
+
+ROOT = os.path.realpath(os.path.join(os.path.abspath(__file__), "..", ".."))
+TEX_DELIMITERS = {
+ 'variable_start_string': '<%=',
+ 'variable_end_string': '%>',
+ 'block_start_string': '<%',
+ 'block_end_string': '%>',
+}
+METHOD_MAP = [
+ # Extraction from Python source files
+ ('**.py', extract_python),
+ # Extraction from Jinja2 template files
+ ('**/templates/latex/**.tex_t', extract_jinja2),
+ ('**/templates/latex/**.sty_t', extract_jinja2),
+ # Extraction from Jinja2 HTML templates
+ ('**/themes/**.html', extract_jinja2),
+ # Extraction from Jinja2 XML templates
+ ('**/themes/**.xml', extract_jinja2),
+ # Extraction from JavaScript files
+ ('**.js', extract_javascript),
+ ('**.js_t', extract_javascript),
+]
+OPTIONS_MAP = {
+ # Extraction from Python source files
+ '**.py': {
+ 'encoding': 'utf-8',
+ },
+ # Extraction from Jinja2 template files
+ '**/templates/latex/**.tex_t': TEX_DELIMITERS.copy(),
+ '**/templates/latex/**.sty_t': TEX_DELIMITERS.copy(),
+ # Extraction from Jinja2 HTML templates
+ '**/themes/**.html': {
+ 'encoding': 'utf-8',
+ 'ignore_tags': 'script,style',
+ 'include_attrs': 'alt title summary',
+ },
+}
+KEYWORDS = {**DEFAULT_KEYWORDS, '_': None, '__': None}
+
+
+def run_extract():
+ """Message extraction function."""
+ log = _get_logger()
+
+ with open('sphinx/__init__.py', encoding='utf-8') as f:
+ for line in f.read().splitlines():
+ if line.startswith('__version__ = '):
+ # remove prefix; strip whitespace; remove quotation marks
+ sphinx_version = line[14:].strip()[1:-1]
+ break
+
+ input_path = 'sphinx'
+ catalogue = Catalog(project='Sphinx', version=sphinx_version, charset='utf-8')
+
+ base = os.path.abspath(input_path)
+ for root, dirnames, filenames in os.walk(base):
+ relative_root = os.path.relpath(root, base) if root != base else ''
+ dirnames.sort()
+ for filename in sorted(filenames):
+ relative_name = os.path.join(relative_root, filename)
+ for pattern, method in METHOD_MAP:
+ if not pathmatch(pattern, relative_name):
+ continue
+
+ options = {}
+ for opt_pattern, opt_dict in OPTIONS_MAP.items():
+ if pathmatch(opt_pattern, relative_name):
+ options = opt_dict
+ with open(os.path.join(root, filename), 'rb') as fileobj:
+ for lineno, message, comments, context in extract(
+ method, fileobj, KEYWORDS, options=options,
+ ):
+ filepath = os.path.join(input_path, relative_name)
+ catalogue.add(
+ message, None, [(filepath, lineno)],
+ auto_comments=comments, context=context,
+ )
+ break
+
+ output_file = os.path.join('sphinx', 'locale', 'sphinx.pot')
+ log.info('writing PO template file to %s', output_file)
+ with open(output_file, 'wb') as outfile:
+ write_po(outfile, catalogue)
+
+
+def run_update():
+ """Catalog merging command."""
+
+ log = _get_logger()
+
+ domain = 'sphinx'
+ locale_dir = os.path.join('sphinx', 'locale')
+ template_file = os.path.join(locale_dir, 'sphinx.pot')
+
+ with open(template_file, encoding='utf-8') as infile:
+ template = read_po(infile)
+
+ for locale in os.listdir(locale_dir):
+ filename = os.path.join(locale_dir, locale, 'LC_MESSAGES', f'{domain}.po')
+ if not os.path.exists(filename):
+ continue
+
+ log.info('updating catalog %s based on %s', filename, template_file)
+ with open(filename, encoding='utf-8') as infile:
+ catalog = read_po(infile, locale=locale, domain=domain)
+
+ catalog.update(template)
+ tmp_name = os.path.join(
+ os.path.dirname(filename), tempfile.gettempprefix() + os.path.basename(filename),
+ )
+ try:
+ with open(tmp_name, 'wb') as tmpfile:
+ write_po(tmpfile, catalog)
+ except Exception:
+ os.remove(tmp_name)
+ raise
+
+ os.replace(tmp_name, filename)
+
+
+def run_compile():
+ """
+ Catalog compilation command.
+
+ An extended command that writes all message strings that occur in
+ JavaScript files to a JavaScript file along with the .mo file.
+
+ Unfortunately, babel's setup command isn't built very extensible, so
+ most of the run() code is duplicated here.
+ """
+
+ log = _get_logger()
+
+ directory = os.path.join('sphinx', 'locale')
+ total_errors = 0
+
+ for locale in os.listdir(directory):
+ po_file = os.path.join(directory, locale, 'LC_MESSAGES', 'sphinx.po')
+ if not os.path.exists(po_file):
+ continue
+
+ with open(po_file, encoding='utf-8') as infile:
+ catalog = read_po(infile, locale)
+
+ if catalog.fuzzy:
+ log.info('catalog %s is marked as fuzzy, skipping', po_file)
+ continue
+
+ for message, errors in catalog.check():
+ for error in errors:
+ total_errors += 1
+ log.error('error: %s:%d: %s\nerror: in message string: %s',
+ po_file, message.lineno, error, message.string)
+
+ mo_file = os.path.join(directory, locale, 'LC_MESSAGES', 'sphinx.mo')
+ log.info('compiling catalog %s to %s', po_file, mo_file)
+ with open(mo_file, 'wb') as outfile:
+ write_mo(outfile, catalog, use_fuzzy=False)
+
+ js_file = os.path.join(directory, locale, 'LC_MESSAGES', 'sphinx.js')
+ log.info('writing JavaScript strings in catalog %s to %s', po_file, js_file)
+ js_catalogue = {}
+ for message in catalog:
+ if any(
+ x[0].endswith(('.js', '.js.jinja', '.js_t', '.html'))
+ for x in message.locations
+ ):
+ msgid = message.id
+ if isinstance(msgid, (list, tuple)):
+ msgid = msgid[0]
+ js_catalogue[msgid] = message.string
+
+ obj = json.dumps({
+ 'messages': js_catalogue,
+ 'plural_expr': catalog.plural_expr,
+ 'locale': str(catalog.locale),
+ }, sort_keys=True, indent=4)
+ with open(js_file, 'wb') as outfile:
+ # to ensure lines end with ``\n`` rather than ``\r\n``:
+ outfile.write(f'Documentation.addTranslations({obj});'.encode())
+
+ if total_errors > 0:
+ log.error('%d errors encountered.', total_errors)
+ print("Compiling failed.", file=sys.stderr)
+ raise SystemExit(2)
+
+
+def _get_logger():
+ log = logging.getLogger('babel')
+ log.setLevel(logging.INFO)
+ handler = logging.StreamHandler()
+ handler.setFormatter(logging.Formatter('%(message)s'))
+ log.addHandler(handler)
+ return log
+
+
+if __name__ == '__main__':
+ try:
+ action = sys.argv[1].lower()
+ except IndexError:
+ print(__doc__, file=sys.stderr)
+ raise SystemExit(2) from None
+
+ os.chdir(ROOT)
+ if action == "extract":
+ raise SystemExit(run_extract())
+ if action == "update":
+ raise SystemExit(run_update())
+ if action == "compile":
+ raise SystemExit(run_compile())
+ if action == "all":
+ exit_code = run_extract()
+ if exit_code:
+ raise SystemExit(exit_code)
+ exit_code = run_update()
+ if exit_code:
+ raise SystemExit(exit_code)
+ raise SystemExit(run_compile())
diff --git a/utils/bump_docker.py b/utils/bump_docker.py
new file mode 100644
index 0000000..ec4a1c7
--- /dev/null
+++ b/utils/bump_docker.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+
+"""Usage: bump_docker.py [VERSION]"""
+
+import re
+import subprocess
+import sys
+from pathlib import Path
+
+VERSION_PATTERN = r'\d+\.\d+\.\d+'
+
+if not sys.argv[1:] or re.match(VERSION_PATTERN, sys.argv[1]) is None:
+ print(__doc__)
+ raise SystemExit(1)
+
+VERSION = sys.argv[1]
+
+PROJECTS_ROOT = Path(__file__).resolve().parents[2]
+DOCKER_ROOT = PROJECTS_ROOT / 'sphinx-docker-images'
+DOCKERFILE_BASE = DOCKER_ROOT / 'base' / 'Dockerfile'
+DOCKERFILE_LATEXPDF = DOCKER_ROOT / 'latexpdf' / 'Dockerfile'
+
+OPENCONTAINERS_VERSION_PREFIX = 'LABEL org.opencontainers.image.version'
+SPHINX_VERSION_PREFIX = 'Sphinx=='
+
+for file in DOCKERFILE_BASE, DOCKERFILE_LATEXPDF:
+ content = file.read_text(encoding='utf-8')
+ content = re.sub(rf'{re.escape(OPENCONTAINERS_VERSION_PREFIX)} = "{VERSION_PATTERN}"',
+ rf'{OPENCONTAINERS_VERSION_PREFIX} = "{VERSION}"',
+ content)
+ content = re.sub(rf'{re.escape(SPHINX_VERSION_PREFIX)}{VERSION_PATTERN}',
+ rf'{SPHINX_VERSION_PREFIX}{VERSION}',
+ content)
+ file.write_text(content, encoding='utf-8')
+
+
+def git(*args):
+ ret = subprocess.run(('git', *args),
+ capture_output=True,
+ cwd=DOCKER_ROOT,
+ check=True,
+ text=True,
+ encoding='utf-8')
+ print(ret.stdout)
+ print(ret.stderr, file=sys.stderr)
+
+
+git('checkout', 'master')
+git('commit', '-am', f'Bump to {VERSION}')
+git('tag', VERSION, '-m', f'Sphinx {VERSION}')
+git('push', 'upstream', 'master')
+git('push', 'upstream', VERSION)
diff --git a/utils/bump_version.py b/utils/bump_version.py
new file mode 100755
index 0000000..6e50755
--- /dev/null
+++ b/utils/bump_version.py
@@ -0,0 +1,183 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import re
+import sys
+import time
+from contextlib import contextmanager
+
+script_dir = os.path.dirname(__file__)
+package_dir = os.path.abspath(os.path.join(script_dir, '..'))
+
+RELEASE_TYPE = {'a': 'alpha', 'b': 'beta'}
+
+
+def stringify_version(version_info, in_develop=True):
+ version = '.'.join(str(v) for v in version_info[:3])
+ if not in_develop and version_info[3] != 'final':
+ version += version_info[3][0] + str(version_info[4])
+
+ return version
+
+
+def bump_version(path, version_info, in_develop=True):
+ version = stringify_version(version_info, in_develop)
+
+ with open(path, encoding='utf-8') as f:
+ lines = f.read().splitlines()
+
+ for i, line in enumerate(lines):
+ if line.startswith('__version__ = '):
+ lines[i] = f"__version__ = '{version}'"
+ continue
+ if line.startswith('version_info = '):
+ lines[i] = f'version_info = {version_info}'
+ continue
+ if line.startswith('_in_development = '):
+ lines[i] = f'_in_development = {in_develop}'
+ continue
+
+ with open(path, 'w', encoding='utf-8') as f:
+ f.write('\n'.join(lines) + '\n')
+
+
+def parse_version(version):
+ matched = re.search(r'^(\d+)\.(\d+)$', version)
+ if matched:
+ major, minor = matched.groups()
+ return (int(major), int(minor), 0, 'final', 0)
+
+ matched = re.search(r'^(\d+)\.(\d+)\.(\d+)$', version)
+ if matched:
+ major, minor, rev = matched.groups()
+ return (int(major), int(minor), int(rev), 'final', 0)
+
+ matched = re.search(r'^(\d+)\.(\d+)\s*(a|b|alpha|beta)(\d+)$', version)
+ if matched:
+ major, minor, typ, relver = matched.groups()
+ release = RELEASE_TYPE.get(typ, typ)
+ return (int(major), int(minor), 0, release, int(relver))
+
+ matched = re.search(r'^(\d+)\.(\d+)\.(\d+)\s*(a|b|alpha|beta)(\d+)$', version)
+ if matched:
+ major, minor, rev, typ, relver = matched.groups()
+ release = RELEASE_TYPE.get(typ, typ)
+ return (int(major), int(minor), int(rev), release, int(relver))
+
+ raise RuntimeError('Unknown version: %s' % version)
+
+
+class Skip(Exception):
+ pass
+
+
+@contextmanager
+def processing(message):
+ try:
+ print(message + ' ... ', end='')
+ yield
+ except Skip as exc:
+ print('skip: %s' % exc)
+ except Exception:
+ print('error')
+ raise
+ else:
+ print('done')
+
+
+class Changes:
+ def __init__(self, path):
+ self.path = path
+ self.fetch_version()
+
+ def fetch_version(self):
+ with open(self.path, encoding='utf-8') as f:
+ version = f.readline().strip()
+ matched = re.search(r'^Release (.*) \((.*)\)$', version)
+ if matched is None:
+ raise RuntimeError('Unknown CHANGES format: %s' % version)
+
+ self.version, self.release_date = matched.groups()
+ self.version_info = parse_version(self.version)
+ if self.release_date == 'in development':
+ self.in_development = True
+ else:
+ self.in_development = False
+
+ def finalize_release_date(self):
+ release_date = time.strftime('%b %d, %Y')
+ heading = f'Release {self.version} (released {release_date})'
+
+ with open(self.path, 'r+', encoding='utf-8') as f:
+ f.readline() # skip first two lines
+ f.readline()
+ body = f.read()
+
+ f.seek(0)
+ f.truncate(0)
+ f.write(heading + '\n')
+ f.write('=' * len(heading) + '\n')
+ f.write(self.filter_empty_sections(body))
+
+ def add_release(self, version_info):
+ if version_info[-2:] in (('beta', 0), ('final', 0)):
+ version = stringify_version(version_info)
+ else:
+ reltype = version_info[3]
+ version = (f'{stringify_version(version_info)} '
+ f'{RELEASE_TYPE.get(reltype, reltype)}{version_info[4] or ""}')
+ heading = 'Release %s (in development)' % version
+
+ with open(os.path.join(script_dir, 'CHANGES_template'), encoding='utf-8') as f:
+ f.readline() # skip first two lines
+ f.readline()
+ tmpl = f.read()
+
+ with open(self.path, 'r+', encoding='utf-8') as f:
+ body = f.read()
+
+ f.seek(0)
+ f.truncate(0)
+ f.write(heading + '\n')
+ f.write('=' * len(heading) + '\n')
+ f.write(tmpl)
+ f.write('\n')
+ f.write(body)
+
+ def filter_empty_sections(self, body):
+ return re.sub('^\n.+\n-{3,}\n+(?=\n.+\n[-=]{3,}\n)', '', body, flags=re.M)
+
+
+def parse_options(argv):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('version', help='A version number (cf. 1.6b0)')
+ parser.add_argument('--in-develop', action='store_true')
+ options = parser.parse_args(argv)
+ options.version = parse_version(options.version)
+ return options
+
+
+def main():
+ options = parse_options(sys.argv[1:])
+
+ with processing("Rewriting sphinx/__init__.py"):
+ bump_version(os.path.join(package_dir, 'sphinx/__init__.py'),
+ options.version, options.in_develop)
+
+ with processing('Rewriting CHANGES'):
+ changes = Changes(os.path.join(package_dir, 'CHANGES'))
+ if changes.version_info == options.version:
+ if changes.in_development:
+ changes.finalize_release_date()
+ else:
+ reason = 'version not changed'
+ raise Skip(reason)
+ else:
+ if changes.in_development:
+ print('WARNING: last version is not released yet: %s' % changes.version)
+ changes.add_release(options.version)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/utils/release-checklist b/utils/release-checklist
new file mode 100644
index 0000000..5aabbce
--- /dev/null
+++ b/utils/release-checklist
@@ -0,0 +1,70 @@
+Release checklist
+=================
+
+A stable release is a release where the minor or micro version parts are
+incremented.
+A major release is a release where the major version part is incremented.
+
+Checks
+------
+
+* open "https://github.com/sphinx-doc/sphinx/actions?query=branch:master" and all tests has passed
+* Run ``git fetch; git status`` and check that nothing has changed
+
+Bump version
+------------
+
+for stable and major releases
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* ``python utils/bump_version.py X.Y.Z``
+* Check diff by ``git diff``
+* ``git commit -am 'Bump to X.Y.Z final'``
+* ``git tag vX.Y.Z -m "Sphinx X.Y.Z"``
+
+for beta releases
+~~~~~~~~~~~~~~~~~
+
+* ``python utils/bump_version.py X.Y.0bN``
+* Check diff by ``git diff``
+* ``git commit -am 'Bump to X.Y.0 betaN'``
+* ``git tag vX.Y.0b1 -m "Sphinx X.Y.0bN"``
+
+Build Sphinx
+------------
+
+* ``make clean``
+* ``python -m build .``
+* ``twine upload dist/Sphinx-*``
+* open https://pypi.org/project/Sphinx/ and check for any obvious errors
+
+for stable and major releases
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* ``sh utils/bump_docker.sh X.Y.Z``
+
+Bump to next development version
+--------------------------------
+
+for stable and major releases
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* ``python utils/bump_version.py --in-develop X.Y.Z+1b0`` (ex. 1.5.3b0)
+
+for beta releases
+~~~~~~~~~~~~~~~~~
+
+* ``python utils/bump_version.py --in-develop X.Y.0bN+1`` (ex. 1.6.0b2)
+
+Commit version bump
+-------------------
+
+* Check diff by ``git diff``
+* ``git commit -am 'Bump version'``
+* ``git push origin master --tags``
+
+Final steps
+-----------
+
+* Add new version/milestone to tracker categories
+* Write announcement and send to sphinx-dev, sphinx-users and python-announce